美文网首页
组件之路---国际化

组件之路---国际化

作者: hsay | 来源:发表于2018-01-24 09:32 被阅读0次

虽然本文的题目叫“组件之路---国际化”,但是本文并不是讲国际化方案的,本文的重点是基于antd国际化组件的实现,去分析一类问题的解决思路。


LocaleProvider国际化

antd实现国际化的组件是LocaleProvider,即将需要国际化的组件作为LocaleProvider的子组件使用:

<LocaleProvider>
    <A   />
    <B   />
<LocaleProvider>

这里组件A与组件B是在需要的时候进行国际化转换的组件。

这里考虑LocaleProvider与A B组件该如何实现呢?
首先看一个应用方面的需求,如下图所示:

Locale.gif

页面中罗列了若干种需要进行国际化的组件,我们选择在中英文两种语言下切换,所有的组件都需要完成更新。

设计思路

1:每个需要国际化的组件都应该有其自身的文案,该文案的组织应该与该组件在同一个目录下:

 ComponentA-|
              index.js
              Locale-|
                       zh_CN.js
                       zh_TW.js
                       en_US.js
                       ...
                       
ComponentB-|
              index.js
              Locale-|
                       zh_CN.js
                       zh_TW.js
                       en_US.js
                       ...
                      

2:将这些分散的组件文案统一管理。

//index.js

var zh_CN1 = require("ComponentA/Locale/zh_CN");
var zh_CN2 = require("ComponentB/Locale/zh_CN");

export default  {
    ComponentA:zh_CN1,
    ComponentB:zh_CN2,
}

3:容器组件统一在文案中获取数据

var zh_CN = require("./index");

再根据需求将其传给不同的组件

<A  locale={zh_CN['ComponentA']} />
<B  locale={zh_CN['ComponentB']} />

在逻辑和功能上以上步骤是没有问题的,但是这里我们需要考虑一点就是通过这种参数传递的方式,最好的情况是组件A B就是需要国际化的组件,但是如果需要组件化的组件嵌套在其他组件之内呢?是否需要将参数层层传递呢?

这其实是一个很常见的问题,react中有context的概念可以帮助我们解决这个问题,antd的LocaleProvider其实就是基于context提供文案信息的。

基于context的实现

LocaleProvider作为容器组件,为其他所有子组件提供统一的数据,LocaleProvider需定义childContextTypes以及getChildContext。

  static childContextTypes = {
    antLocale: PropTypes.object,
  };

  getChildContext() {
    return {
      antLocale: {
        ...this.props.locale,
        exist: true,
      },
    };
  }

需要国际化的子组件定义contextTypes,然后通过this.context在组件内部使用传入的文案信息。

  static contextTypes = {
    antLocale: PropTypes.object,
  };
  const { antLocale } = this.context;

总结

react 中虽然提供了context这样的方式,但是官方并不推荐直接使用,除非你很清楚的知道你在干什么的情况下。如果你的应用中出现了若干只能通过变量提升或者context的方式传递数据才能解决问题的话,你就需要考虑是否需要引入数据流管理工具了。

相关文章

  • 组件之路---国际化

    虽然本文的题目叫“组件之路---国际化”,但是本文并不是讲国际化方案的,本文的重点是基于antd国际化组件的实现,...

  • 基于session的国际化实现方式

    基于session的国际化实现方式 原理:使用spring的session bean保存相应的国际化组件。 配置文...

  • 基于请求URL的国际化实现方式

    基于请求URL的国际化实现方式 原理:使用spring的request bean保存相应的国际化组件,这样保证同一...

  • iOS组件化文章汇总

    iOS应用架构谈 组件化方案 APP组件化之路 我所理解的组件化之路 iOS 组件化方案探索 围观神仙打架,反革命...

  • 组件分享之后端组件——国际化组件go-i18n

    组件分享之后端组件——国际化组件go-i18n 背景 近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常...

  • iOS组件化方案实战

    目录 简述 为什么要项目组件化 组件化架构思路 业务模块解耦 组件化实施流程解耦主题国际化切换PrefixHead...

  • 学习笔记 - iOS 组件化方案

    一、蘑菇街 App 的组件化之路 二、iOS应用架构谈 组件化方案 三、蘑菇街 App 的组件化之路·续 四、iO...

  • iOS 组件化

    参考:蘑菇街 App 的组件化之路蘑菇街 App 的组件化之路·续 iOS应用架构谈 组件化方案在现有工程中实施基...

  • vue项目中如何刷新当前路由

    最近在项目中使用iview框架,用到了里面的select组件,发现这个组件在做国际化的时候,select选中的内容...

  • react native 多语言国际化组件react-nativ

    react native 多语言国际化组件react-native-i18n https://www.jiansh...

网友评论

      本文标题:组件之路---国际化

      本文链接:https://www.haomeiwen.com/subject/kdmsaxtx.html