React-intl 实现多语言的示例代码


Posted in Javascript onNovember 03, 2017

最近在项目中添加了语言国际化的功能。

语言国际化,也有人说成是语言本地化,其实就是为Web App添加多语言,我们的项目当前包含了中文版和英文版,按理来说『逐字替换』也不是多大事儿,但是,这么Low的做法,有钱途吗?

一开始的时候,我考虑的是传统的为整个项目添加config文件,根据不同的语言和地区,加载不同的config文件,就能够达到界面语言切换的目的。当然,也正是因为这个想法太过于幼稚,所以才被称为『一开始』的想法。语言的国际化不仅仅是将界面上的UI文字翻译成另一种语言,还包括了日期&时间显示,数字显示(英文环境下每隔3位一个逗号:1,000),量词的显示(一个苹果是apple,两个苹果就应该是apples),甚至还有一个字符串中间插了一个变量的情况("今天午饭吃了{count}个鸡腿")...

所以这并不只是一个简单的字符替换问题,并且,我们要很方便的导出一个目录,放到word或者page当中,给到其他同事对照着进行翻译工作,这个非常重要!!难道你要让产品经理直接在代码里改么?或者你想一个一个搜索替换?不考虑清楚就干的话,相信我,You'll pay for this。

作为一个有追求的代码家,你肯定不希望在index.html当中增加一行<Script>引用吧?另外,UI中的文字全部都是使用图片的那个同学,请起立,滚。如果想要在一个React项目中,优雅的import something from somewhere,然后将界面中的文字用<首字母大写 /> 组件替代,最后通过简单的配置实现语言的国际化,那我们就用React-intl吧。

React 做国际化,我推荐使用 React-intl , 这个库提供了 React 组件和Api两种方式来格式化日期,数字和字符串等。知道这个库了,那让我们开始使用它

组件用法

为了和React 比较融和,我们可以使用组件的方式

1.安装

npm install react-intl --save

2.添加引用

import {IntlProvider, addLocaleData} from 'react-intl';

3.添加 locale 配置文件

zh-CN.js

const zh_CN = { 'intl.hello': "你好", 'intl.name': '我的名字是 {name}' } export default zh_CN;

en-US.js

const en_US = { 'intl.hello': "hello", 'intl.name': 'my name is {name}' } export default en_US;

4.使用<IntlProvider />

这个组件用于设置 i18n 的上下文,它将包装应用程序的根组件,以便整个应用程序将配置在 i18n 的上下文中.
最主要的两个配置项是: loacle 当前的语言环境 messages 当前语言的内容。

我们要动态切换语言,需要动态改这两个配置。

import zhCN from './locale/zh.js';  //导入 i18n 配置文件
import enUS from './locale/en.js';

addLocaleData([...en, ...zh]);

export default class Root extends Component {
  static propTypes = {
    store: PropTypes.object.isRequired,
    history: PropTypes.object.isRequired
  }

  render() {
    const { store , history } = this.props;
    return (
      <IntlProvider locale='zh' messages={zhCN}>
        <Provider store={store}>
          <Router history={history}>
          </Router>
        </Provider>
      </IntlProvider>
    )
  }
}

5.使用<FormattedMessage />

基础用法

<FormattedMessage 
id="intl.hello"

defaultMessage={'hello'}
/>

如果当前语言环境是 中文,它会显示你好 ,如果是英文环境,会显示Hello.

动态传值

<FormattedMessage
  id="intl.name"
  values={{name: <b>{name}</b>}}
/>

我们定义 intl.name 的时候模板里用到了{name} ,这个代表我们可以动态传值,我们可以通过FormattedMessage中的 values 属性传一个JSON对象,这是就会动态显示我们的内容了。

6.其它组件用法

Ract-intl 为我们提供了丰富的组件,可以帮我们很好的处理字符串,时间,日期 ,大家可以自己查看 API,如有不明白的地方,我可以留言。

API用法

有时候我们可能需要在代码中动态做 国际化,这就需要动态API 了。下面我简单介绍下怎么用

1.导入 injectIntl

import { injectIntl, FormattedMessage } from 'react-intl';

2.在组件中注入

export default connect(mapStateToProps,mapActionCreators)(injectIntl(App))

我在项目中用到了Redux,注入的时候应该向上面那样,如果你没有用Redux ,只需要 export defuault injectIntl(App)

3.使用 intl 对象

我们通过第二步的注入,现在在我们在 组件的 props 上会得到一个 intl 对象,它提供的方法和咱们上边介绍的组件基本相对应,这时候我们想要显示字符串,可以使用formatMessage 方法:

const {intl} = this.props;

let tmp = intl.formatMessage({id: 'intl.name'},{name: 'joe'});

formatMessage的第一个参数可以传入Id, 第二个参数传入 values ,更详细的了解,请查看API

结束语

教程的代码,我已放到github 上,大家如果需要,自行查看 React-intl

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
解放web程序员的输入验证
Oct 06 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
Aug 23 Javascript
jQuery中delegate()方法的用法详解
Oct 13 Javascript
原生js实现水平方向无缝滚动
Jan 10 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
JavaScript严格模式下关于this的几种指向详解
Jul 12 Javascript
vue + element-ui的分页问题实现
Dec 17 Javascript
JS基于开关思想实现的数组去重功能【案例】
Feb 18 Javascript
taro开发微信小程序的实践
May 21 Javascript
JavaScript实现PC端四格密码输入框功能
Feb 19 Javascript
JS如何把字符串转换成json
Feb 21 Javascript
Javascript作用域和作用域链原理解析
Mar 03 Javascript
ztree实现左边动态生成树右边为内容详情功能
Nov 03 #Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
Nov 03 #Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
Nov 03 #Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
Nov 03 #Javascript
微信小程序自动客服功能
Nov 02 #Javascript
微信小程序选择图片和放大预览图片功能
Nov 02 #Javascript
微信小程序实现图片放大预览功能
Oct 22 #Javascript
You might like
一个自定义位数的php多用户计数器代码
2007/03/11 PHP
收藏的PHP常用函数 推荐收藏保存
2010/02/21 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
国外PHP程序员的13个好习惯小结
2012/02/20 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
9个比较实用的php代码片段
2016/03/15 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
Js中sort()方法的用法
2006/11/04 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
基于Jquery实现万圣节快乐特效
2015/11/01 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
详解node如何让一个端口同时支持https与http
2017/07/04 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
Python遍历指定文件及文件夹的方法
2015/05/09 Python
Python入门教程之运算符与控制流
2016/08/17 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
2017/10/07 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
pandas多级分组实现排序的方法
2018/04/20 Python
python中sys.argv函数精简概括
2018/07/08 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
为什么说python更适合树莓派编程
2020/07/20 Python
python 两种方法删除空文件夹
2020/09/29 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
四风问题个人剖析材料
2014/10/07 职场文书
庆元旦主持词
2015/07/06 职场文书
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python