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

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

<br/><br/>

一般在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的好处有:
- 通用型工具:可以适用于任何框架
目录
相关文章
|
20天前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
52 9
|
2月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
2月前
|
移动开发 前端开发 JavaScript
React DnD:实现拖拽功能的终极方案?
本文首发于微信公众号“前端徐徐”,介绍了一个强大的 React 拖拽库——React DnD。React DnD 帮助开发者轻松创建复杂的拖拽界面,适用于 Trello 风格的应用、列表重排序、可拖拽的 UI 组件等场景。文章详细介绍了 React DnD 的基本信息、主要特点、使用场景及快速上手指南。
75 3
React DnD:实现拖拽功能的终极方案?
|
24天前
|
前端开发 数据可视化 搜索推荐
深入剖析极态云优雅的前端框架设计方案(上)
最近在体验极态云,这款低代码软件开发产品,发现其前端框架设计方案很优雅很强大! 在接下来的学习过程中,我将持续输出自己对极态云前端框架设计方案的深入理解,包括具体的使用技巧、优势分析以及可能的应用场景等方面的内容,希望能为大家提供有价值的参考。
|
2月前
|
前端开发 数据管理 编译器
引领前端未来:React 19的重大更新与实战指南🚀
React 19 即将发布,带来一系列革命性的新功能,旨在简化开发过程并显著提升性能。本文介绍了 React 19 的核心功能,如自动优化重新渲染的 React 编译器、加速初始加载的服务器组件、简化表单处理的 Actions、无缝集成的 Web 组件,以及文档元数据的直接管理。这些新功能通过自动化、优化和增强用户体验,帮助开发者构建更高效的 Web 应用程序。
125 1
引领前端未来:React 19的重大更新与实战指南🚀
|
25天前
|
前端开发 JavaScript Android开发
前端框架趋势:React Native在跨平台开发中的优势与挑战
【10月更文挑战第27天】React Native 是跨平台开发领域的佼佼者,凭借其独特的跨平台能力和高效的开发体验,成为许多开发者的首选。本文探讨了 React Native 的优势与挑战,包括跨平台开发能力、原生组件渲染、性能优化及调试复杂性等问题,并通过代码示例展示了其实际应用。
52 2
|
27天前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略
|
27天前
|
前端开发 JavaScript 开发者
“揭秘React Hooks的神秘面纱:如何掌握这些改变游戏规则的超能力以打造无敌前端应用”
【10月更文挑战第25天】React Hooks 自 2018 年推出以来,已成为 React 功能组件的重要组成部分。本文全面解析了 React Hooks 的核心概念,包括 `useState` 和 `useEffect` 的使用方法,并提供了最佳实践,如避免过度使用 Hooks、保持 Hooks 调用顺序一致、使用 `useReducer` 管理复杂状态逻辑、自定义 Hooks 封装复用逻辑等,帮助开发者更高效地使用 Hooks,构建健壮且易于维护的 React 应用。
31 2
|
27天前
|
前端开发 JavaScript 数据管理
React与Vue:两大前端框架的较量与选择策略
【10月更文挑战第23天】React与Vue:两大前端框架的较量与选择策略
|
2月前
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
下一篇
无影云桌面