• 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

  • 相关阅读:
    《剑指offer》Q01-12 (牛客10.11)
    北京,我来了
    pods的好处
    iOS那些你从未使用过的属性方法
    重构一个运行超过10年的老项目
    C#泛型
    认真思考创建对象的几种方式
    2014年终总结
    前端优化:AMDclean去除requirejs
    webstorm常用快捷键及插件
  • 原文地址:https://www.cnblogs.com/qiaojie/p/6411199.html
Copyright © 2020-2023  润新知