国际化

Angular 国际化常见有 Angular 内置和基于 @ngx-translate/core (请参考官网了解更多实现细节)两种不同国际化方案。

两种方案

Angular 内置

Angular 文档中文版)有完整的描述,注意需要为每一种语言构建和部署单独的应用程序版本。

@ngx-translate/core

@ngx-translate/core 是社区版本的 Angular 国际化,相比较 Angular 内置它是动态性,无须针对不同语言构建和部署单独版本,并且大部分情况下可以立即呈现。

如何配置

不管你选择哪一种国际化方案,最终选择的都只对你业务范围有效。

脚手架是由 ng-zorro-antd@delon/* 类库两个重要部分组件,而这两个类库有自己的国际化配置,当进行国际化时需要对这些类库进行相同语言的配置。

Angular

Angular 配置主要是针对货币、日期格式等,例如中文版本:

  1. import { registerLocaleData } from '@angular/common';
  2. import zh from '@angular/common/locales/zh';
  3. registerLocaleData(zh);

ng-zorro-antd

NG-ZORRO 国际化默认是中文版,例如默认为英文版本:

  1. import { NZ_I18N, en_US } from 'ng-zorro-antd/i18n';
  2. @NgModule({
  3. ...
  4. imports : [ NgZorroAntdModule ],
  5. providers : [ { provide: NZ_I18N, useValue: en_US } ]
  6. })
  7. export class AppModule { }

当然,也可以使用运行时更改:

  1. import { en_US, NzI18nService } from 'ng-zorro-antd/i18n';
  2. ...
  3. constructor(private nzI18nService:NzI18nService) {
  4. }
  5. switchLanguage() {
  6. this.nzI18nService.setLocale(en_US);
  7. }

@delon

@delon 国际化默认是中文版,例如默认为英文版本:

  1. import { DELON_LOCALE, en_US } from '@delon/theme';
  2. @NgModule({
  3. ...
  4. providers : [ { provide: DELON_LOCALE, useValue: en_US } ]
  5. })
  6. export class AppModule { }

当然,也可以使用运行时更改:

  1. import { en_US, DelonLocaleService } from '@delon/theme';
  2. ...
  3. constructor(private delonLocaleService: DelonLocaleService) {
  4. }
  5. switchLanguage() {
  6. this.delonLocaleService.setLocale(en_US);
  7. }

ALAIN_I18N_TOKEN

@delon/* 类库有许多带有 i18n 字样的数据接口属性(例如:page-headerst 列描述、Menu 菜单数据等等),当你希望这些组件的数据接口能动态根据 Key 值按当前语言自动切换时,你还需要对 ALAIN_I18N_TOKEN 定义一个自实现服务接口(例如:I18NService),并在根模块下注册。

  1. import { ALAIN_I18N_TOKEN } from '@delon/theme';
  2. import { I18NService } from '@core';
  3. @NgModule({
  4. ...
  5. providers: [
  6. { provide: ALAIN_I18N_TOKEN, useClass: I18NService, multi: false }
  7. ]
  8. })
  9. export class AppModule {}

i18n管道

为了不受第三方各自管道的命名方式,脚手架包含一个 i18n 的管道,它相当于直接调用 ALAIN_I18N_TOKENfanyi 方法。

他和 @ngx-translate| translate 有所不同,它会监听语言的变化并自动更新。而 | i18n 不会监听语言变更通知所以会有更好的性能,当你明确在切换语言后会重新渲染 Angular 项目时 | i18n 会更适合。

如何添加

创建脚手架命令行 ng add ng-alain 时允许指定 --i18n 表示是否包含国际化示例代码(采用 @ngx-translate/core 方式)。

如何删除

示例代码涉及内容包括:

  • src/app/core/i18n 目录

  • app.module.tsTranslateModule 相关声明

  • 替换掉默认布局可能出现的 I18n 的 Pipe 使用 | translate| i18n

  • 移除 @ngx-translate/core@ngx-translate/http-loader 包体

默认语言

不管是否需要国际化,由于 Angularng-zorro-antd@delon/* 等类库的默认语言都不同,因此还需要确保这些类库的默认语言是同一类型。一个简单的示例办法可以了解各类库当前语言情况:

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-i18n-test',
  4. template: `
  5. <h2>angular</h2>
  6. <p>Date: {{now | date}}</p>
  7. <h2>ng-zorro-antd</h2>
  8. <nz-transfer [nzDataSource]="[]"></nz-transfer>
  9. <h2>@delon</h2>
  10. <div style="width: 200px">
  11. <tag-select>
  12. <nz-tag>1</nz-tag>
  13. </tag-select>
  14. </div>`,
  15. })
  16. export class I18nTestComponent {
  17. now = new Date();
  18. }

示例

为了使语言统一性,NG-ALAIN 提供一个在 AppModule 根模块里简单的统一配置方式。

中文版

  1. // #region i18n
  2. import { default as ngLang } from '@angular/common/locales/zh';
  3. import { NZ_I18N, zh_CN as zorroLang } from 'ng-zorro-antd/i18n';
  4. import { DELON_LOCALE, zh_CN as delonLang } from '@delon/theme';
  5. const LANG = {
  6. abbr: 'zh',
  7. ng: ngLang,
  8. zorro: zorroLang,
  9. delon: delonLang,
  10. };
  11. // register angular
  12. import { registerLocaleData } from '@angular/common';
  13. registerLocaleData(LANG.ng, LANG.abbr);
  14. const LANG_PROVIDES = [
  15. { provide: LOCALE_ID, useValue: LANG.abbr },
  16. { provide: NZ_I18N, useValue: LANG.zorro },
  17. { provide: DELON_LOCALE, useValue: LANG.delon },
  18. ];
  19. // #endregion
  20. @NgModule({
  21. providers: [...LANG_PROVIDES],
  22. })
  23. export class AppModule {}

英文版

  1. // #region i18n
  2. import { default as ngLang } from '@angular/common/locales/en';
  3. import { NZ_I18N, en_US as zorroLang } from 'ng-zorro-antd/i18n';
  4. import { DELON_LOCALE, en_US as delonLang } from '@delon/theme';
  5. const LANG = {
  6. abbr: 'en',
  7. ng: ngLang,
  8. zorro: zorroLang,
  9. delon: delonLang,
  10. };
  11. // register angular
  12. import { registerLocaleData } from '@angular/common';
  13. registerLocaleData(LANG.ng, LANG.abbr);
  14. const LANG_PROVIDES = [
  15. { provide: LOCALE_ID, useValue: LANG.abbr },
  16. { provide: NZ_I18N, useValue: LANG.zorro },
  17. { provide: DELON_LOCALE, useValue: LANG.delon },
  18. ];
  19. // #endregion
  20. @NgModule({
  21. providers: [...LANG_PROVIDES],
  22. })
  23. export class AppModule {}

命令行

使用 defaultLanguage 插件可以快速切换默认语言环境。