ReactJS前端国际化方案 - 你也许不需要用react-intl

[Updated 2017-06-15] 基于这套方案,我们开源了一个库alibaba/react-intl-universal ,可用于React.Compoent和非React.Compoent的国际化。也支持货币、日期、复数等国际化,API更简单,更容易上手。 yahoo/react-intl据悉开发团队很多人离职了,更新维护的比较慢。

一般在ReactJS的国际化都是采用react-intl。使用react-intl最大的好处是它用props的方式注入语言包,也就是可以在不刷新页面的情况下直接更改显示的语言。

  1. 国际化只能用于View层,也就是你有国际化需求的地方,只能是React.Componet的subclass。如果有一些通用型的utility就不能使用。像是一些表单效验的错误提示如下,这样单纯的js是无法使用react-intl的。

    const rules = {
    noSpace(value) {
    if (value.includes(' ') || value.includes('\t')) {
      return '不允许空白或者tab';
    }
    }
    };
    export default rules;
    
  2. react-intl的实现上使用了包装器,也就是你的Componet Class,不再是原本的Class了。比如你想要取组件的instance的时候,需要改成
    this.refs.mycomponent.getWrappedInstance()
    

react-intl有上述2个致命的缺点,但其实我们又不需要在不刷新的情况下更换显示的语言。其实根本不需要使用react-intl。

解法

所以我们改使用另一个库intl-messageformat,它支持变量的取代、复数型态的名词显示。完全遵守ECMA-402 (Internationalization API Specification)标准。这个库无关框架,也是react-intl底层使用的一个库,所以如果你原本是使用react-intl的人,不用担心语言包格式需要改写。

使用方式也很简单。首先定义语言包,例如:

// locale/zh.js
export default ({
   hello: '你好,{name}'
 })
// locale/en.js
export default ({
   hello: 'Hello,{name}'
 })

接著写个简单的业务包装,例如根据自己的业务决定语言的方法。或者想要在遗漏语言key的时候,显示的默认值:

import IntlMessageFormat from 'intl-messageformat';
import zh from '../locale/zh';
import en from '../locale/en';
const MESSAGES = { en, zh };
const LOCALE = 'en'; // -> 这里写上你的决定语言的方法,例如可以从cookie判断语言

class Intl {

  get(key, defaultMessage, options) {
    let msg = MESSAGES[LOCALE][key];
    if (msg == null) {
      if (defaultMessage != null) {
        return defaultMessage;
      }
      return key;
    }
    if (options) {
      msg = new IntlMessageFormat(msg, LOCALE);
      return msg.format(options);
    }
    return msg;

  }
}

export default Intl;

使用的时候,可以在任何js的地方,不局限于View层:

let name = 'Tony';
intl.get('hello', 'Hello', {name})

总结

自己简单包装一下intl-messageformat的好处有:

  • 通用型工具:可以适用于任何框架
  • 无侵入性:你的组件行为不会因而改变。貨幣、日期、複數等國際化
时间: 2024-12-27 13:40:07

ReactJS前端国际化方案 - 你也许不需要用react-intl的相关文章

又是一种用于JavaScript的前端国际化方案

现在 Blessing Skin Server 的 HTML 模板是使用 Laravel 自带的本地化来实现多语言支持的,并且使用了 devitek/yaml-translation 这个包把 Laravel 语言文件从默认的 PHP 数组形式改为 YAML 格式的文件. 不得不说数组形式的语言文件简直反人类好吗,一大堆 => 看的眼晕..YAML 大法好!(ゝ∀・) 回到正题.虽然 HTML 模板里的国际化是解决了,但是整个应用中需要国际化的地方可不止 HTML 模板,同时还有 JavaScr

使用decj简化Web前端开发(三) 声明式国际化

引言 本期将介绍decj的国际化(I18N)支持,包括声明式多语言支持和声明式CSS文件动态按需加载. 声明式CSS文件按需加载 使用decj框架,开发人员只需要在模块定义中声明模块所需的各个CSS文件,即可实现这些CSS在该模块被加载时而被动态加载,而无需事先在页面中添加link标签来引用各个CSS文件. 模块定义的css属性用于声明模块所需的各个CSS文件.该属性值是一个字符串数组,其各个元素为所要加载的CSS文件的URL.如果只需要加载一个CSS文件,css属性的值也可以是一个字符串.如清

[译]Angular vs React:谁更适合前端开发

本文讲的是[译]Angular vs React:谁更适合前端开发, 原文地址:Angular vs. React: Which Is Better for Web Development? 原文作者:Brandon Morelli 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:龙骑将杨影枫 校对者:Larry.薛定谔的猫.逆寒 大家总在写文章争论,Angular 与 React 哪一个才是前端开发的更好选择(译者:在中国还要加上 vue :P).我

JS不完全国际化&本地化手册 之 理论篇_javascript技巧

前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已.趁着这个机会好好学习整理一下,为后面的技术选型做准备.  本篇将阐述国际化和本地化的概念,以及其中一个很重要的概念--Language tag(也叫Language code 或 Culture). 何为国际化?  国际化我认为就是应用支持多语言和文化习俗(数字.货币.日期和字符比较算法等),而本地化则是应用

阿里云前端周刊 - 第 20 期

推荐 1. 阿里电商架构演变之路 https://yq.aliyun.com/articles/161190 首届阿里巴巴中间件技术峰会上,阿里巴巴中间件技术部专家唐三带来"阿里电商架构演变之路"的演讲,本文从阿里业务和技术架构开始引入,分别分享了阿里电商从1.0到4.0架构的演变之路,着重分析了分布式和异地多活的改变之路. 2. WebVR开发教程 - 深度剖析 https://zhuanlan.zhihu.com/p/28324884 最近WebVR API 1.1已经发布,2.0

浅析如何利用angular结合translate为项目实现国际化_AngularJS

前言 利用H5项目第一版本已经上线,话说有了第一期就有了第二期,这不要为第二期做准备了,老大发话第一件事就要利用Angular JS实现项目的国际化以及后续要借助这个框架来实现其他功能,好吧我表示没怎么接触过,这一个礼拜自己也对Angular基本的用法已经有了初步的了解以及熟悉,于是乎就有了这篇文章的产生.其实没我什么事,我也是主动请缨说交给我,因为年底了嘛,也没什么事,不急不忙的,一天也乐得清闲,还不给自己找点事做,而且还能在做的过程中能学到东西,何乐而不为呢!Angular已盛行一时,但请恕

国产web前端框架推荐之-NEJ(网易)

NEC是纯HTML框架,那么这款NEJ就是纯JS框架了 NEJ=Nice Easy Javascript NEJ 是由网易前端组工程师们发起创建的简洁,美观,真正的跨平台web前端开发框架:她遵循的原则是 自由定制.小巧灵活.简洁易用.愉悦编码.快乐开发. 快速下载:http://nej.netease.com/download/nej-1.0.zip 特点 依赖管理:优化开发阶段脚本文件依赖关系管理,所有脚本按需打包发布,上线产品分离依赖因此无任依赖相关开销 平台适配:支持桌面及移动平台.浏览

Hello Web API系列教程:Web API与国际化

软件国际化是在软件设计和文档开发过程中,使得功能和代码设计能处理多种语言和文化习俗,在创建不同语言版本时,不需要重新设计源程序代码的软件工程方法.这在很多成熟的软件开发平台中非常常见.对于.net开发者来说,我们一般可以通过以下两种方式来实现软件的国际化. 语言配置文件 资源文件 在.net平台中,软件的国际化主要依靠工作线程的国际化来完成.在.net框架的的处理线程中,我们通过设置Thread.CurrentCulture属性来实现对日期.时间.数字.货币值.文本的排序顺序,负载约定和字符串比

利用脚本注入漏洞攻击ReactJS应用程序

ReactJS是一款能够帮助开发者构建用户接口的热门JavaScript库.在它的帮助下,开发者可以构建出内容丰富的客户端或Web应用,并且提前加载内容以提供更好的用户体验. 从设计角度来看,只要你能够按照开发标准来使用ReactJS的话,它其实是非常安全的.但是在网络安全领域中,没有任何东西是绝对安全的,而错误的编程实践方式将导致类似脚本注入漏洞之类的问题产生,这些错误的编程方式包括: 1.利用用户提供的对象来创建React组件; 2.利用用户提供的href属性来配置标签,或利用其他可注入的属