02 基于umi搭建React快速开发框架(国际化)

前言

之前写过一篇关于React的国际化文章,主要是用react-intl库,雅虎开源的。react-intl是用高阶组件包装一层来做国际化。
基于组件化会有一些问题,比如在一些工具方法中需要国际化,就需要自己去实现了。在umi-react快速开发框架我们采用
react-intl-universal库来实现,不仅支持组件化调用,也支持动态调用,实现国际化。

react-intl-universal 用法

  1. 安装
    npm install react-intl-universal --save
  2. 初始化
    在以下示例中,我们intl使用app locale data(locales)初始化并确定动态使用哪个区域设置(currentLocale).
    然后intl.get(...)用来获取国际化的消息

      import intl from 'react-intl-universal';
      const locales = {
        "en-US": require('./locales/en-US.js'),
        "zh-CN": require('./locales/zh-CN.js'),
      };
    
      class App extends Component {
    
        state = {initDone: false}
    
        componentDidMount() {
          this.loadLocales();
        }
    
        loadLocales() {
          // init method will load CLDR locale data according to currentLocale
          // react-intl-universal is singleton, so you should init it only once in your app
          intl.init({
            currentLocale: 'en-US', // TODO: determine locale here
            locales,
          })
          .then(() => {
            // After loading CLDR locale data, start to render
          this.setState({initDone: true});
          });
        }
    
        render() {
          return (
            this.state.initDone &&
            <div>
              {intl.get('SIMPLE')}
            </div>
          );
        }
    
      }
  3. 调用
    • HTML Message (HTML 消息)

      locale data:

      { "TIP": "This is <span style='color:red'>HTML</span>" }

      js code:

      intl.getHTML('TIP');
    • Default Message (设置默认消息)
      js code:

      intl.get('not-exist-key').defaultMessage('default message') 

      也可以用简写设置默认值

      intl.get('not-exist-key').d('default message')

      getHTML 也支持默认值

      intl.getHTML('not-exist-key').d(<div>hello</div>)
    • Message With Variables (消息添加变量)

      locale data:

      { "HELLO": "Hello, {name}. Welcome to {where}!" }

      js code:

      intl.get('HELLO', {name:'Tony', where:'Alibaba'})

在umi-react项目中加入国际化

  1. 在根目录新建locales文件夹, 添加locale描述文件
    en_US.js 文件

      export default {
        user: {
          login: {
            loginBtn: 'login',
            placeholderName: 'Please input user name',
            placeholderPws: 'Please input password',
            forgetPwd: 'Forget password',
            remember: 'Remember me',
          },
          logout: 'logout'
        }
      }

    zh_CN.JS 文件

      export default {
        user: {
          login: {
            loginBtn: '登录',
            placeholderName: '请输入用户名',
            placeholderPws: '请输入密码',
            forgetPwd: '忘记密码',
            remember: '记住我',
          },
          logout: '退出登录'
        }
      }
  2. 在global modle中添加初始化state和Effect(changeLocale)和reducers(setLocale)
      import intl from 'react-intl-universal';
      import locales from '../locales';
      import storage from 'utils/localStorage';
    
      const defaultState = {
        currLocale: storage.get('locale') || 'zh_CN',
        localeLoad: false,
      }
    
      export default {
        namespace: 'global',
    
        state: defaultState,
    
        effects: {
          *changeLocale({ payload }, { call, put }) {
            const params = {
              currentLocale: payload,
              locales
            };
            // 初始化国际化
            yield intl.init(params);
    
            yield put({
              type: 'setLocale',
              payload: {
                currLocale: payload,
                localeLoad: true,
              }
            });
            // 把当前国际化持久化到 localstorage 中
            storage.add('locale', payload);
          },
        },
    
        reducers: {
          setLocale(state, { payload }) {
            return {
              ...state,
              ...payload,
            };
          },
        },
      };
    
  3. 在layouts index.js 中掉用changeLocale初始化国际化和antd组件国际化
    import React, { Component } from 'react'
    import BaseLayout from './baseLayout';
    import { LocaleProvider } from 'antd';
    import { connect } from 'dva';
    import zh_CN from 'antd/lib/locale-provider/zh_CN';
    import en_US from 'antd/lib/locale-provider/en_US';
    import { init } from './init';
    
    @connect(({global}) => {
      return {
        currLocale: global.currLocale,
        localeLoad: global.localeLoad,
      }
    })
    class Index extends Component {
      constructor() {
        super();
        init();
        this.state = {
          initDone: false,
        }
      }
    
      componentDidMount() {
        const {dispatch, currLocale} = this.props;
        // 更改国际化
        dispatch({
          type: 'global/changeLocale',
          payload: currLocale,
        });
      }
      /**
      * 初始intl国际化和antd组件国际化
      */
      renderBody = () => {
        const {location: {pathname}, children, currLocale, localeLoad } = this.props;
        if (pathname === '/login') {
          return localeLoad && <React.Fragment>
            {children}
          </React.Fragment>;
        }
        return (
          localeLoad && (<LocaleProvider locale={ currLocale === 'zh_CN' ? zh_CN : en_US }>
            <BaseLayout {...this.props} />
          </LocaleProvider>)
        );
      }
    
      render() {
        return (
          <React.Fragment>
            {this.renderBody()}
          </React.Fragment>
        )
      }
    }
    
    export default Index;
  4. 在 src/baseLayout/header.js 添加更改国际化的 select
    import React, { Component } from 'react';
    import { Avatar, Dropdown, Menu, Icon, Select } from 'antd';
    import { connect } from 'dva';
    import intl from 'react-intl-universal';
    import styles from './baseLayout.less';
    
    const Option = Select.Option;
    
    @connect(({user}) => {
      return {
        user: user.user
      }
    })
    class Header extends Component {
      /**
      * 切换语言
      */
      onLocaleChange = (value) => {
        this.props.dispatch({
          type: 'global/changeLocale',
          payload: value,
        })
      }
    
      render() {
        const {currLocale, user} = this.props;
        return (
          <div className={styles.header}>
            <div className={styles.headerButton}>
              <Select
                defaultValue={currLocale}
                style={{ width: 100 }}
                onChange={this.onLocaleChange}>
                <Option value='zh_CN'>中文</Option>
                <Option value='en_US'>English</Option>
              </Select>
            </div>
          </div>
        )
      }
    }
    
    export default Header;
    
  5. 到此我们的系统国际化就可以用了。我们把登陆页面国际化完善起来。这要调用intl.get方法
    import intl from 'react-intl-universal';
    @connect(({user}) => ({
      loginErr: user.loginErr,
    }))
    @Form.create()
    class Login extends React.Component {
      render() {
        const { loginErr, form:{ getFieldDecorator } } = this.props;
        const intlLogin = intl.get('user.login.loginBtn');
        const intlUsername = intl.get('user.login.placeholderName');
        const intlPwd = intl.get('user.login.placeholderPws');
        const intlforgetPwd = intl.get('user.login.forgetPwd');
        const intlRemember = intl.get('user.login.remember');
        return (
          <div className={styles.login}>
            { loginErr && <Alert style={{ marginBottom: '20px' }} message='用户名密码错误' type='error' showIcon />}
            <Form onSubmit={this.handleSubmit} className='login-form'>
              <FormItem>
                {getFieldDecorator('name', {
                  rules: [
                    FormValid.require(intlUsername),
                  ],
                })(
                  <Input
                    prefix={<Icon type='user' style={{ color: 'rgba(0,0,0,.25)' }} />}
                    placeholder={intlUsername}
                  />
                )}
              </FormItem>
              <FormItem>
                {getFieldDecorator('password', {
                  rules: [
                    FormValid.require(intlPwd),
                  ],
                })(
                  <Input
                    prefix={<Icon type='lock' style={{ color: 'rgba(0,0,0,.25)' }} />}
                    type='password'
                    placeholder={intlPwd}
                  />
                )}
              </FormItem>
              <FormItem>
                {getFieldDecorator('remember', {
                  valuePropName: 'checked',
                  initialValue: true,
                })(
                  <Checkbox>{intlRemember}</Checkbox>
                )}
                <a className='login-form-forgot' href=''>{intlforgetPwd}</a>
                <Button type='primary' htmlType='submit' className='login-form-button'>
                  {intlLogin}
                </Button>
              </FormItem>
            </Form>
          </div>
        );
      }
    }
    export default Login;



结束语

国际化已经完成, 代码已放到github上,大家可以自行查看umi-react。如果觉得不错,请 start 一下
我建了一个QQ群,大家加进来,可以一起交流。群号 787846148

原文地址:https://www.cnblogs.com/qiaojie/p/9673609.html

时间: 2024-10-16 08:12:36

02 基于umi搭建React快速开发框架(国际化)的相关文章

基于SpringBoot+Mybatis+AntDesign快速开发平台,Jeecg-Boot 1.1 版本发布

Jeecg-Boot 1.1 版本发布,初成长稳定版本 导读     平台首页UI升级,精美的首页支持多模式 提供4套代码生成器模板(支持单表.一对多) 集成Excel简易工具类,支持单表.一对多导入导出 代码生成器,生成代码自带Excel导入导出,表单提供弹出风格和抽屉表单选择 系统权限大升级,支持按钮权限,数据权限(可控制不同人看不同数据) 数据日志记录功能,可记录数据变更日志,对比版本功能 查询过滤器开发完成,根据页面配置自动生成查询条件,支持多种匹配规则 Online在线报表配置功能完成

windows下如何快速搭建web.py开发框架

在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方便和顺手,就是web.py.它由一名黑客所创建,但是不幸的是这位创建者于2013年自杀了.据说现在由另外一个人在维护和更新.现在就来了解一下windows下如何搭建web.py开发环境. 一.安装web.py 在 https://github.com/webpy/webpy上下载web.py安装包.

CRL快速开发框架系列教程二(基于Lambda表达式查询)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

C# 快速开发框架搭建—开发工具介绍

C# 快速开发框架搭建-开发工具介绍 一.VS2013,SQL SERVER R22008 以上两种工具如有不会者自行百度学习下. 二.动软代码生成器 对于经典的三层架构框架来说,使用动软代码生成器会起到事半功倍的效果.链接(http://www.maticsoft.com/download.aspx) 三.如何使用 1.打开工具,点击如下图的连接SQL Server数据库服务器 2.如图,填写好数据库相关配置,点击连接测试,可以看到你的数据库出现在了下拉列表中,点击选择你的数据库,点击下一步:

基于 Koa.js 平台的 Node.js web 快速开发框架KoaHub.js demo 可安装

KoaHub.js demo KoaHub.js KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async & Await)等特性,借助 Babel 编译,可稳定运行在 Node.js 环境上. github地址:http://github.com/einsqing/koahubjs demo 下载安装 //下载 git clone https://github.

基于 spring boot 和 spring mvc 的快速开发框架 summer-boot

summer-boot 详细介绍此项目目的在于提供一个简化.简洁.迅速的开发架构. 它是基于spring boot和spring mvc高度封装的快速开发框架,数据库操作工具summerDao是基于jdbcTemplate高度封装简化.拥有超级简单实用的ORM功能.和ibatis一样强大但更简单.无需映射配置的dao工具,视图层采用的是Rythm(最简洁的java模板引擎.可以用它来做web项目.微服务.socket服务,且同一套代码同时兼容这三种方式. 它的优点如下:基本建立在spring一套

基于EasyUi的快速开发框架

先看图,下边这个简单的增.删.改.查,如果自己写代码实现,这两个页需要多少行代码? 如果再有类似的增.删.改.查,又需要多少行代码? 我最近搞的这个快速开发框架中,代码行数不超过100. 两页的代码如下: 1,列表页: @{ ViewBag.Title = "**** - 部门管理"; ViewBag.MenuType = "Manage"; ViewBag.MenuName = "部门管理"; } @section HeadContent{ }

基于代码生成器的快速开发框架,spring mvc html5 bootstrap java框架,jeeplus框架源码下载

开源网址:http://www.jeeplus.org JeePlus是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务逻辑.既能快速提高开发效率,帮助公司节省人力成本,同时不失灵活性. JeePlus快速开发宗旨是:简单功能由代码生成器生成使用,复杂业务采用表单自定义,只需要写极少代码,即可实现复杂的业务逻辑. JeePlus采用了目前极为流行的扁平化响应式的设计风格,可以完美兼容电脑,pad,手机等多个平台.前端UI采用INSPINA实现

[Web 前端] webstorm 快速搭建react项目

cp from : https://blog.csdn.net/qq_39207948/article/details/79467144 前端新手如何安装webstorm ,初步搭建react项目 下载安装webstorm:配置成功: 配置成功后就可以开启webstorm项目了.(存微信收藏..) 1:在webstorm下配置node环境: 2:完成之后: React官方脚手架地址: https://github.com/facebook/create-react-app 在终端下安装执行npm