Angular 国际化

什么是国际化?

国际化,通常被称作 i18n,是指设计和开发软件产品,使其能够轻松地适应不同的语言、地区和文化的过程。

在项目中,本地化过程包含以下两个步骤:

  • 提取出用于翻译的文本
  • 将文本翻译成各个区域的语言

准备工作

  1. 运行 ng version, 检查 Angular Cli 版本号,建议不要低于 16.0.0
  2. 运行 ng new my-app,初始化项目,或者使用现有项目。

开始

添加本地化包

ng add @angular/localize

设置源区域 ID

关于区域设置 ID 请参阅 [Unicode 语言和区域设置标识符]

// angular.json
{
  // 注意:my-app 是你自己的项目名
  "my-app": {
    "i18n": {
      "sourceLocale": "zh"
    }
  }
}

标记文本

angular 组件中有两处地方可标记文本:

1、在组件模板中

<!-- 标记元素标签中的文本 -->
<h1 i18n>Hello i18n!</h1>

<!-- 标记无元素标签的文本 -->
<ng-container i18n>Hello i18n!</ng-container>

<!-- 标记元素属性中的文本 -->
<img i18n-title title="Angular logo" />

2、在组件代码中

// 一般文本
const name = $localize`Jony`;

// 含有变量
const text = $localize`Hello i18n! ${name}`;

提取源语言文件

运行命令 ng extract-i18n 创建一个源语言文件。

可以自定义位置、格式和文件名称:

命令选项 描述
--format 设置输出文件的格式(可选:xlf/xlf2/xmb/json/arb)
--out-file 设置输出文件的名称
--output-path 设置输出目录的路径

本文创建一个 messages.xlf 文件放在 src/locale 目录下:

ng extract-i18n --format xlf2 --out-file messages.xlf --output-path src/locale

翻译源文件

复制一份文件并重命名

# locale 为目标语言,例如:messages.en.xlf
messages.xlf --> messages.{locale}.xlf

source 标签中的内容翻译成相应地区的语言,并放置在新增的 target 标签中

<!-- messages.en.xlf -->
<trans-unit id="1954851963553192813" datatype="html">
  <source>内容区</source>
  <target>Content</target>
  <context-group purpose="location">
    <context context-type="sourcefile">src/app/container/container.component.html</context>
    <context context-type="linenumber">7,8</context>
  </context-group>
</trans-unit>

配置翻译文件路径

{
  "i18n": {
    "sourceLocale": "zh",
    "locales": {
      "en": {
        "translation": "src/locale/messages.en.xlf"
      }
    }
  }
}

到这一步为止就已经完成了!

测试

本地验证

angular.json 中添加如下配置:

{
  "architect": {
    "build": {
      "configurations": {
        "en": {
          "localize": ["en"]
        }
      }
    },
    "serve": {
      "configurations": {
        "en": {
          "buildTarget": "my-app:build:en"
        }
      }
    }
  }
}

package.json 中添加运行命令

{
  "scripts": {
    "start:en": "ng serve --configuration=en"
  }
}

最后运行 npm run start:en 就可以在本地验证当前语言是否正确了。

生产环境

配置了多语言之后,通过 npm run build 打包出来的 dist 结构如下:

└─ dist
│  └─ my-app
│  │  ├─ zh
│  │  ├─ en
│  │  └─ fr

它给每一种语言都打包了一份文件,通过 nginx 配置每一种语言对应的文件路径,
例如 /zh --> /dist/my-app/zh/index.html,切换语言的时候只需要更改 url 上的路由即可。

server {
  listen 80;
  server_name localhost;
  root /www/data/my-app;

  location ~ ^/(zh|en|fr) {
    try_files $uri /$1/index.html?$args;
  }
}