- 入门
介绍 体系结构 升级到 18.0 版本
- 开发
新增页面 新增业务组件 和服务端进行交互 使用第三方类库 构建和发布 升级脚手架 全局配置项 如何开始 服务端渲染(SSR)
- 进阶
主题系统 图表 国际化 用户认证 ACL Mock 缓存 优化 编码规范建议
- 其他
命令行工具 常见问题 模块注册指导原则 贡献指南 更新日志
Angular 国际化提供一种可被提取语言文件的方案,但对于 NG-YUNZAI 而言,这并不是最好的方式;这主要受限于 @Yelon/* 组件库需要提供一套带有动态翻译的服务,因此,NG-YUNZAI 内置一个简易的国际化服务 YUNZAI_I18N_TOKEN
接口。
脚手架是由 ng-zorro-antd
、@yelon/*
类库两个重要部分组件,而这两个类库有自己的国际化配置,当进行国际化时需要对这些类库进行相同语言的配置。
Angular 配置主要是针对货币、日期格式等,例如中文版本:
import { registerLocaleData } from '@angular/common';
import zh from '@angular/common/locales/zh';
registerLocaleData(zh);
NG-ZORRO 国际化默认是中文版,例如默认为英文版本:
import { en_US, provideNzI18n } from 'ng-zorro-antd/i18n';
export const appConfig: ApplicationConfig = {
providers: [provideNzI18n(en_US)]
};
当然,也可以使用运行时更改:
import { en_US, NzI18nService } from 'ng-zorro-antd/i18n';
...
constructor(private nzI18nService:NzI18nService) {
}
switchLanguage() {
this.nzI18nService.setLocale(en_US);
}
@yelon 国际化默认是中文版,例如默认为英文版本:
import { YELON_LOCALE, en_US } from '@yelon/theme';
@NgModule({
...
providers : [ { provide: YELON_LOCALE, useValue: en_US } ]
})
export class AppModule { }
当然,也可以使用运行时更改:
import { en_US, YelonLocaleService } from '@yelon/theme';
...
private readonly i18n = inject(YelonLocaleService);
switchLanguage() {
this.yelonLocaleService.setLocale(en_US);
}
@yelon/*
类库有许多带有 i18n 字样的数据接口属性(例如:page-header
、st
列描述、Menu
菜单数据等等),当你希望这些组件的数据接口能动态根据 Key 值按当前语言自动切换时,你还需要对 YUNZAI_I18N_TOKEN
定义一个自实现服务接口(例如:I18NService),并在 app.config.ts
下注册。
import { I18NService } from '@core';
export const appConfig: ApplicationConfig = {
providers: [
provideYunzai({ config: yunzaiConfig, defaultLang, i18nClass: I18NService }),
]
};
为了不受第三方各自管道的命名方式,脚手架包含一个 i18n
的管道,它相当于直接调用 YUNZAI_I18N_TOKEN
的 fanyi
方法。
| i18n
不会监听语言变更通知所以会有更好的性能,当你明确在切换语言后会重新渲染 Angular 项目时 | i18n
会更适合。
创建脚手架命令行 ng add ng-yunzai
时允许指定 --i18n
表示是否包含国际化示例代码。
示例代码涉及内容包括:
src/app/core/i18n
目录
替换掉默认布局可能出现的 I18n 的 Pipe 使用 | i18n
不管是否需要国际化,由于 Angular
、ng-zorro-antd
、@yelon/*
等类库的默认语言都不同,因此还需要确保这些类库的默认语言是同一类型。一个简单的示例办法可以了解各类库当前语言情况:
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>@yelon</h2>
<div style="width: 200px">
<tag-select>
<nz-tag>1</nz-tag>
</tag-select>
</div>`,
})
export class I18nTestComponent {
now = new Date();
}
为了使语言统一性,NG-YUNZAI 提供一个在 AppModule
根模块里简单的统一配置方式。
import { default as ngLang } from '@angular/common/locales/zh';
import { provideNzI18n, zh_CN as zorroLang } from 'ng-zorro-antd/i18n';
import { YELON_LOCALE, zh_CN as yelonLang } from '@yelon/theme';
import { zhCN as dateLang } from 'date-fns/locale';
import { I18NService } from '@core';
const defaultLang: YunzaiProvideLang = {
abbr: 'zh',
ng: ngLang,
zorro: zorroLang,
date: dateLang,
yelon: yelonLang,
};
export const appConfig: ApplicationConfig = {
providers: [
provideYunzai({ config: yunzaiConfig, defaultLang, i18nClass: I18NService }),
]
};
import { default as ngLang } from '@angular/common/locales/en';
import { provideNzI18n, en_US as zorroLang } from 'ng-zorro-antd/i18n';
import { YELON_LOCALE, en_US as yelonLang } from '@yelon/theme';
import { en_US as dateLang } from 'date-fns/locale';
const LANG = {
abbr: 'en',
ng: ngLang,
zorro: zorroLang,
yelon: yelonLang,
};
const defaultLang: YunzaiProvideLang = {
abbr: 'en',
ng: ngLang,
zorro: zorroLang,
date: dateLang,
yelon: yelonLang,
};
export const appConfig: ApplicationConfig = {
providers: [
provideYunzai({ config: yunzaiConfig, defaultLang, i18nClass: I18NService }),
]
};
使用 defaultLanguage 插件可以快速切换默认语言环境。
若想通过路由的URL来切换国际化,例如:通过访问 /zh
和 /en
来变更语言,则只需要在根路由中使用 yunzaiI18nCanActivate
守卫:
const routes: Route[] = [
{
path: '',
component: LayoutComponent,
canActivateChild: [yunzaiI18nCanActivate],
children: [
{ path: '', redirectTo: 'en', pathMatch: 'full' },
{ path: ':i18n', component: HomeComponent }
]
}
];
其中
:i18n
是参数固定值,可以通过全局配置paramNameOfUrlGuard
来调整。