目录
  1. 1. 创建一个 angular 项目,并编写英文版注册页面
    1. 1.1. 1、创建项目
    2. 1.2. 2、编写页面
      1. 1.2.1. 2.1、在 app.module.ts 引入 angular material 模块
      2. 1.2.2. 2.2 在 app 目录下,创建一个注册的组件
      3. 1.2.3. 2.3 添加代码:
      4. 1.2.4. 2.4 将注册页面显示出来
  2. 2. 修改注册页面为简体中文版本
    1. 2.1. 1、组件模板中标记需要翻译的静态文本信息
    2. 2.2. 2、创建翻译源文件
    3. 2.3. 3、翻译文本节点
    4. 2.4. 4、修改 angular.json 配置文件
      1. 2.4.1. 4.1、添加编译配置
      2. 2.4.2. 4.2、添加测试运行配置
    5. 2.5. 5、测试运行,查看效果
  3. 3. 小结
Angular i18n使用说明

angular 项目,在实际使用开发时,难免会遇到需要使用多国语言的需求,也就是 angular 的国际化 i18n 的需求。

那么如何做到呢?

本文主要通过对一个常见的注册页面,实现多国语言版本的切换,来说明 angular i18n 的用法。代码已放到github

创建一个 angular 项目,并编写英文版注册页面

1、创建项目

创建就是直接终端输入ng new angular-i18n-demo即可。
因为只是说明 i18n 的使用,不会过多复杂,不需要其他的模块例如 router、service 等。

目前前端开发,不使用一些样式(说白了就是 UI 组件)就很累,所以创建好 angular 项目之后,添加 angular material,使得注册页面稍微好看一点。
在 angular 项目根目录终端输入ng add @angular/material即可。

2、编写页面

不需要实现注册功能,构建一个注册页面就好了。因为已经使用了 angular material,就稍微用几个模块。

2.1、在 app.module.ts 引入 angular material 模块

在 app.module.ts 的@NgModule 装饰器下的 imports 属性中,添加以下内容:

BrowserAnimationsModule,
MatToolbarModule,
MatCardModule,
MatInputModule,
MatButtonModule,
MatIconModule

然后逐一导入,在顶部应该会有:

import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import {
   MatInputModule,
   MatCardModule,
   MatToolbarModule,
   MatButtonModule,
   MatIconModule
} from '@angular/material';

2.2 在 app 目录下,创建一个注册的组件

如下图:

新建注册组件

我这个是直接使用指令ng g component register生成,angular-cli 工具的操作,它会直接把这个组件也添加到模块文件:

自动添加到app.module.ts文件

2.3 添加代码:

修改register.component.html代码如下:

<div class='my-div'>
  <mat-toolbar>
    <mat-icon>create</mat-icon>&nbsp;&nbsp; Registration
  </mat-toolbar>
  <mat-card>
    <mat-card-content>
      <form>
        <div class="word-align">First Name</div> &nbsp;&nbsp;&nbsp;
        <mat-form-field>
          <input matInput placeholder="First name" name="fname" required>
        </mat-form-field>
        <br />
        <div class="word-align">Last Name</div> &nbsp;&nbsp;&nbsp;
        <mat-form-field>
          <input matInput placeholder="Last Name" name="lname" required>
        </mat-form-field>
        <br />
        <div class="word-align">Address</div> &nbsp;&nbsp;&nbsp;
        <mat-form-field>
          <input matInput placeholder="Address" name="address" required>
        </mat-form-field>
        <br />
        <div class="word-align">Email</div> &nbsp;&nbsp;&nbsp;
        <mat-form-field>
          <input matInput placeholder="Email" name="email">
        </mat-form-field>
        <br />
        <div class="word-align">Password</div> &nbsp;&nbsp;&nbsp;
        <mat-form-field>
          <input matInput placeholder="Password" name="password">
        </mat-form-field>
        <br />
        <div class="word-align">Confirm Password</div> &nbsp;&nbsp;&nbsp;
        <mat-form-field>
          <input matInput placeholder="Confirm Password" name="confirmPassword">
        </mat-form-field>
        <br />
      </form>
    </mat-card-content>
    <mat-card-actions>
      <button mat-raised-button (click)="register()" color="primary">REGISTER</button>
    </mat-card-actions>
  </mat-card>

修改register.component.scss代码如下:

// div居中
.my-div {
  width: 40%;
  margin-left: 30%;
}

// 设定form中label等宽
.word-align {
  display: inline-block;
  text-align: justify;
  text-justify: distribute-all-lines; /*ie6-8*/
  text-align-last: justify; /* ie9*/
  -moz-text-align-last: justify; /*ff*/
  -webkit-text-align-last: justify; /*chrome 20+*/
  width: 70px;
  margin-right: 0px;
}

因为我们不会去实现注册功能,所以在register.component.ts中,只需要添加一个空白注册函数就好了:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-register',
  templateUrl: './register.component.html',
  styleUrls: ['./register.component.scss']
})
export class RegisterComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }

  register() { } // 新建一个空白注册函数
}

2.4 将注册页面显示出来

现在运行这个 angular 项目,首页看到的还是默认的界面。
删除 app.component.html 原本的所有东西,添加一句各个注册组件的 selector:

<app-register></app-register>

我用ng server -o --port 1234启动,在浏览器中应该看到如下画面:

默认的注册画面

到这里,常规的注册页面就完成了,是个英文版本,i18n 准备工作就好了,下面开始实现变简体中文。

修改注册页面为简体中文版本

在 angular 官方文档中,我们可以看到i18n 模板翻译分为 4 个阶段,主要就是

  1. 在组件模板中标记需要翻译的静态文本信息。
  2. 创建翻译文件:使用 Angular CLI 的 xi18n 命令,把标记过的文本提取到一个符合行业标准的翻译源文件中。
  3. 编辑所生成的翻译文件:把提取出的文本翻译成目标语言。
  4. 把翻译完成的文件合并回应用

一步一步来。

1、组件模板中标记需要翻译的静态文本信息

常规的标签直接在标签中添加 i18n 关键字即可,如下图:

i18n翻译常规标签

要翻译的内容的元素标签中其他内容时,可以使用 ng-container 将文本包裹起来,示例如下:

i18n翻译标签内文本

如果是要翻译某个标签的属性值,则需要添加 i18n-<属性名>标签,示例如下:

i18n翻译标签内属性

更多用法参看 angular 官网i18n 模板翻译

2、创建翻译源文件

将模板做好标记后,使用指令ng xi18n --output-path <path>,生成翻译源文件,<path>则是文件位置。

此外还有属性:

  • –i18nFormat:明确指定想用的格式(默认 XLIFF 1.2)
  • –out-file: 为提取工具生成的翻译源文件改名(默认为 messages )
  • –i18n-locale:指定应用的基本地区(对 angular 没有,但可能对其他需求有用)
  • 等等

我的指令是ng xi18n --output-path src/locale --out-file register.zh-Hans.xlf,生成的翻译源文件如下图:

生成的翻译源文件

3、翻译文本节点

打开生成的翻译源文件,找到文中的标签,可以看到里面有一个标签,这标签里面的文字,就是需要多国语言需要翻译的文字。

现在要做的就是,复制标签这一行,放到原本这一行下面,并把它的标签名名为 target,并把它的内容改为需要翻译的语言文字。

例如,我现在要做的是把英文翻译成简体中文,那么修改示例如下:

修改翻译源文件

注意所有的标签都添加对应的标签。

特别注意:

  • 翻译源文件里面有很多的 id,而且还特别长.
  • 这是因为在“1、组件模板中标记需要翻译的静态文本信息”时,没有给每一个标记 i18n 的地方添加 id,所以工具自动生成了随机 id。
  • 这个 id 最好不要修改,一旦修改可能在文字替换时就对应不上。
  • 如果模板文件有修改,则可能需要重新再生成一份翻译源文件,因为这些随机 id 可能已经变了。

当然,如果不嫌麻烦,可以给每个模板文件有标记 i18n 的地方,都给他添加 id,那么生成的翻译源文件的 id 就不会变。

模板中添加 id 使用示例:

 <div class="word-align" i18n="@@firstName">First Name</div> &nbsp;&nbsp;&nbsp;

(因为工具会生成随机 id,且如果需要翻译的文字太多,逐一设置 id 比较麻烦,所以我没有这样设 id)

4、修改 angular.json 配置文件

4.1、添加编译配置

打开 angular.json 文件,找到属性 projects–>{angular-i18n-demo(angular 项目名)}–>architect–>build–>configurations;在 production 同级属性,添加对不同语言的编译配置,如下图:

添加i8n多国语言编译配置

配置内容简单说明:

  • 使用 AOT 方式编译
  • 文件输出路径
  • i18n 文件位置
  • i18n 使用的格式
  • i18n 的位置
  • 如果翻译有缺失报警告
  • 添加基本路径

最后一条需要多说一点,就是翻译后,例如英文版本编译后访问的地址是http://localhost:4200/register,如果要看到中文版,则需要访问http://localhost:4200/register/zh-Hans

4.2、添加测试运行配置

同样在 angular.json 文件,就在添加编译配置的父级 build 下一个属性 server,在 server–>configurations 属性,在 production 同级属性,添加以下内容:

添加测试运行配置

注意:ng serve 运行时只能一次运行一种语言的翻译,无法同时加载多种语言。

5、测试运行,查看效果

到这里,我们就有了一个简体中文版本的注册页面可以看了。
启动项目,在项目根目录启动终端输入

ng serve --configuration=zh-Hans -o --port 1234

项目启动成功,则可以看到简体中文版注册页面了,如下图:

简体中文版注册页面

注意看 url,之前的英文版是直接的http://localhost:1234,现在简体中文版是http://localhost:1234/zh-Hans

如果觉得每次测试运行查看修改输入文字太长,可以修改 package.json 文件,在 script 属性下,新加一句

"zh-Hans": "ng serve --configuration=zh-Hans -o --port 1234"

就可以使用npm run zh-Hans启动了。

后续将 angular 项目便已打包部署到服务器例如 nginx,则可以设计点击按钮切换 url,切换语言,
就和 MDN 一样效果。

例如https://developer.mozilla.org/en-US/docs/Glossary/JavaScript是英文,
直接修改 url 为https://developer.mozilla.org/zh-CN/docs/Glossary/JavaScript就变成简体了。

小结

到这里,angular i18n 多国语言使用说明就基本完了,更多的细节可以去 angular 官方国际化 i18n升华。

总结一下基本步骤:

  1. 准备好需要翻译的页面模板;
  2. 根据需要翻译的页面模板,创建对应的翻译源文件;
  3. 修改翻译源文件,添加标签即内容;
  4. 修改 angular 项目的配置;
  5. 运行查看结果。

源代码已放到github,已经整理添加了中文繁体、中文简体、英语、百度翻译版本日语,可参考配置 angular i18n 多国语言。

文章作者: SWM Lee
文章链接: http://swmlee.gitee.io/2019/12/18/TechnicalEssays/angular-i18n-demo/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SWM博客

评论