499 - 《React 国际化方案》

发布于 2024年12月18日

前几天看群里有同学在问,正好 tnf 也需要一套国际化方案,做了下调研。

1、现在 Umi 的国际化方案。基于 react-intl,按需加载 intl 作为补丁。react-intl 由 Yahoo 研发。是 Format.js 生态的一部分。

先在 locales 里定义语言,可以用 .ts 也可以用 .json 。

// src/locales/zh-CN.ts
export default {
  welcome: '欢迎光临 Umi 的世界!',
};

然后使用时用 FormattedMessage 渲染。

import { FormattedMessage } from 'umi';
<FormattedMessage id="welcome" />

也可以拿到 intl 然后去 formatMessage。不推荐,它脱离了 React 的生命周期,可能导致切换语言时无法触发 DOM 的 re-render 。

import { useIntl } from 'umi';
const intl = useIntl();
intl.formatMessage({ id: 'welcome' });

支持动态插值,比如 Hello {name}<FormattedMessage id="welcome" values={{name: 'fooo'}} />

支持切换。

import { setLocale } from 'umi';
setLocale('en-US');
// 切换但不刷新
setLocale('en-US', false);
// 切换到默认语言
setLocale();

支持通过配置实现路由 title 的国际化。

2、react-i18next,基于 i18next。周下载 300W+,是 react-intl 的 2-3 倍。

相比 react-intl,react-i18next 的优点是:

1)生态好,大型应用用 react-i18next 更合适
2)国际化文件支持按需加载,性能上会更好
3)SSR 友好
4)TypeScript 支持友好(?)
5)通过 Trans 组件

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。