---
order: 30
title:
  en-US: I18n
  zh-CN: 国际化
type: Advance
---

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

## 两种方案

### Angular 内置

Angular [文档](https://angular.io/guide/i18n)（[中文版](https://angular.cn/guide/i18n)）有完整的描述，**注意**需要为每一种语言构建和部署单独的应用程序版本。

### @ngx-translate/core

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

## 如何配置

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

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

### Angular

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

```ts
import { registerLocaleData } from '@angular/common';
import zh from '@angular/common/locales/zh';
registerLocaleData(zh);
```

### ng-zorro-antd

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

```ts
import { NZ_I18N, en_US } from 'ng-zorro-antd/i18n';
@NgModule({
  ...
  imports     : [ NgZorroAntdModule ],
  providers   : [ { provide: NZ_I18N, useValue: en_US } ]
})
export class AppModule { }
```

当然，也可以使用运行时更改：

```ts
import { en_US, NzI18nService } from 'ng-zorro-antd/i18n';
...
constructor(private nzI18nService:NzI18nService) {
}

switchLanguage() {
  this.nzI18nService.setLocale(en_US);
}
```

### @ohayo

@ohayo 国际化默认是中文版，例如默认为英文版本：

```ts
import { OHAYO_LOCALE, en_US } from '@ohayo/theme';
@NgModule({
  ...
  providers   : [ { provide: OHAYO_LOCALE, useValue: en_US } ]
})
export class AppModule { }
```

当然，也可以使用运行时更改：

```ts
import { en_US, OhayoLocaleService } from '@ohayo/theme';
...
constructor(private ohayoLocaleService: OhayoLocaleService) {
}

switchLanguage() {
  this.ohayoLocaleService.setLocale(en_US);
}
```

## OHAYO_I18N_TOKEN

`@ohayo/*` 类库有许多带有 _i18n_ 字样的数据接口属性（例如：`page-header`、`st` 列描述、`Menu` 菜单数据等等），当你希望这些组件的数据接口能动态根据 Key 值按当前语言自动切换时，你还需要对 `OHAYO_I18N_TOKEN` 定义一个自实现服务接口（例如：[I18NService](https://github.com/ohayojp/ohayojp/blob/master/src/app/core/i18n/i18n.service.ts)），并在根模块下注册。

```ts
import { OHAYO_I18N_TOKEN } from '@ohayo/theme';
import { I18NService } from '@core';

@NgModule({
  ...
  providers: [
    { provide: OHAYO_I18N_TOKEN, useClass: I18NService, multi: false }
  ]
})
export class AppModule {}
```

### i18n管道

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

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

## 如何添加

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

## 如何删除

示例代码涉及内容包括：

- `src/app/core/i18n` 目录
- `app.module.ts` 对 `TranslateModule` 相关声明
- 替换掉默认布局可能出现的 I18n 的 Pipe 使用 `| translate` 或 `| i18n`
- 移除 `@ngx-translate/core`、`@ngx-translate/http-loader` 包体

## 默认语言

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

```ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-i18n-test',
  template: `
  <h2>angular</h2>
  <p>Date: {{now | date}}</p>
  <h2>ng-zorro-antd</h2>
  <nz-transfer [nzDataSource]="[]"></nz-transfer>
  <h2>@ohayo</h2>
  <div style="width: 200px">
    <tag-select>
      <nz-tag>1</nz-tag>
    </tag-select>
  </div>`,
})
export class I18nTestComponent {
  now = new Date();
}
```

### 示例

为了使语言统一性，ohayojp 提供一个在 `AppModule` 根模块里简单的统一配置方式。

#### 中文版

```ts
// #region i18n
import { default as ngLang } from '@angular/common/locales/zh';
import { NZ_I18N, zh_CN as zorroLang } from 'ng-zorro-antd/i18n';
import { OHAYO_LOCALE, zh_CN as ohayoLang } from '@ohayo/theme';
const LANG = {
  abbr: 'zh',
  ng: ngLang,
  zorro: zorroLang,
  ohayo: ohayoLang,
};
// register angular
import { registerLocaleData } from '@angular/common';
registerLocaleData(LANG.ng, LANG.abbr);
const LANG_PROVIDES = [
  { provide: LOCALE_ID, useValue: LANG.abbr },
  { provide: NZ_I18N, useValue: LANG.zorro },
  { provide: OHAYO_LOCALE, useValue: LANG.ohayo },
];
// #endregion

@NgModule({
  providers: [...LANG_PROVIDES],
})
export class AppModule {}
```

#### 英文版

```ts
// #region i18n
import { default as ngLang } from '@angular/common/locales/en';
import { NZ_I18N, en_US as zorroLang } from 'ng-zorro-antd/i18n';
import { OHAYO_LOCALE, en_US as ohayoLang } from '@ohayo/theme';
const LANG = {
  abbr: 'en',
  ng: ngLang,
  zorro: zorroLang,
  ohayo: ohayoLang,
};
// register angular
import { registerLocaleData } from '@angular/common';
registerLocaleData(LANG.ng, LANG.abbr);
const LANG_PROVIDES = [
  { provide: LOCALE_ID, useValue: LANG.abbr },
  { provide: NZ_I18N, useValue: LANG.zorro },
  { provide: OHAYO_LOCALE, useValue: LANG.ohayo },
];
// #endregion

@NgModule({
  providers: [...LANG_PROVIDES],
})
export class AppModule {}
```

### 命令行

使用 [defaultLanguage](/cli/plugin/zh#defaultLanguage) 插件可以快速切换默认语言环境。
