locale.json 将所有语言的翻译,都保存到同一个 JSON 文件中

  • 把不同语言的区域码设置为第一层的 key 值
  • 第二层则为具体页面占位符的 key 值
    1. {
    2. "en-us": {
    3. "intl.appName": "React App Pro",
    4. "intl.dashboard": "Dashboard",
    5. "intl.analysis": "Analysis",
    6. },
    7. "zh-cn": {
    8. "intl.appName": "React 中后台应用",
    9. "intl.dashboard": "仪表盘",
    10. "intl.analysis": "分析页",
    11. }
    12. }

多语言版本切换

在同一个应用中,支持用户切换不同的语言版本

  • 在运行时会用到所有不同的语言
  • 将所有语言的翻译,都存在同一个 JSON 文件中
  • 将不同的翻译分别存在各自的语言文件中
    • 例如 en-us.json, zh-cn.json
    • 统一管理不同平台之间语言文件的 key 值

en-us.json

  1. {
  2. "appName": "React App Pro",
  3. "siderMenu_dashboard": "Dashboard",
  4. "siderMenu_analysis": "Analysis",
  5. }

zh-cn.json

  1. {
  2. "appName": "React 中后台应用",
  3. "siderMenu_dashboard": "仪表盘",
  4. "siderMenu_analysis": "分析页",
  5. }

不要把所有的语言翻译都存在一个文件中,会导致 JSON文件太大
JSON文件拆分

自动加载多语言

  1. module.exports = {
  2. 'en-US': {
  3. locale: 'en-us',
  4. },
  5. 'zh-CN': {
  6. locale: 'zh-cn',
  7. },
  8. localhost: {
  9. locale: 'zh-cn',
  10. },
  11. };

多语言版本构建

将同一个应用打包成不同语言的版本,分别发布到不同的生产环境中,但在应用内部不支持多语言切换。

  • 将不同的翻译分别存在各自的语言文件中。
  • 首先将语言文件 import 到 webpack.config.js 中,
  • 然后通过 webpack 提供的 webpack.DefinePlugin 注入到应用的一个全局常量
  1. const localeMessages = require('./src/i18n/locale.json');
  2. new webpack.DefinePlugin({
  3. 'process.env.BUILD_LOCALE_MESSAGES': JSON.stringify(localeMessages),
  4. })

构建多个不同语言版本,引入一个应用构建时的配置文件,称为 buildConfig.js

  1. module.exports = {
  2. 'PROD-US': {
  3. locale: 'en-us',
  4. },
  5. 'PROD-CN': {
  6. locale: 'zh-cn',
  7. },
  8. localhost: {
  9. locale: 'zh-cn',
  10. },
  11. };

并在 package.json 中分别配置不同语言版本的构建命令

  1. "scripts": {
  2. "build:PROD-US": "cross-env NODE_ENV=production BUILD_DOMAIN=PROD-US webpack -p --progress --colors",
  3. "build:PROD-CN": "cross-env NODE_ENV=production BUILD_DOMAIN=PROD-CN webpack -p --progress --colors",
  4. }

在 webpack 的配置中读取到当前要构建的目标版本语言,然后再据此去匹配相应的语言文件,如 en-us.json

  1. const BUILD_DOMAIN = process.env.BUILD_DOMAIN || 'localhost';
  2. const config = buildConfig[BUILD_DOMAIN];
  3. const localeMessages = require(`./src/locales/${config.locale}.json`);
  4. new webpack.DefinePlugin({
  5. 'process.env.BUILD_LOCALE_MESSAGES': JSON.stringify(localeMessages),
  6. })