这个polyfill 似乎是目前最好的方法:
https://github.com/ngx-translate/i18n-polyfill https://github.com/ngx-translate/i18n-polyfill
它允许您将要翻译的任何内容包装在i18n()
函数(这个 API 很可能会在 Angular 的未来版本中保留 - 请参阅本答案底部的我的注释)。
该polyfill主要由负责i18n的Angular团队成员Olivier Combe编写:
对于 Angular 5,安装时需要 0.2.0 版本:
npm install @ngx-translate/[email protected] /cdn-cgi/l/email-protection --save
对于 Angular 6,获取最新版本 - 当前为 1.0.0:
npm install @ngx-translate/[email protected] /cdn-cgi/l/email-protection --save
我让 Polyfill 工作了适用于 JIT 和 AOT 编译,对于 Angular 5(它也适用于 Angular 6)。以下是翻译为单一语言所需执行的操作(这是实现此功能的好方法 - 然后您可以稍后使用多种语言,我将在下面进一步解释):
应用程序模块.ts
将以下导入添加到根 Angular 模块:
import { TRANSLATIONS, TRANSLATIONS_FORMAT } from '@angular/core';
import { I18n } from '@ngx-translate/i18n-polyfill';
添加以下常量,并在根模块中指定提供程序:
// add this after import + export statements
// you need to specify the location for your translations file
// this is the translations file that will be used for translations in .ts files
const translations = require(`raw-loader!../locale/messages.fr.xlf`);
@NgModule({ ....
providers:
[
I18n,
{provide: TRANSLATIONS, useValue: translations},
{provide: TRANSLATIONS_FORMAT, useValue: 'xlf'},
...
使用AOT编译的注意事项:如果您使用 AOT 编译
翻译您的模板,.ts 文件中消息的翻译
仍将在运行时使用 JIT 编译完成(这就是为什么你
需要参考TRANSLATIONS
and TRANSLATIONS_FORMAT
而不是仅仅
在构建脚本中指定这些)。
*.ts
在要提供翻译的 .ts 文件中,添加以下内容:
import { I18n } from '@ngx-translate/i18n-polyfill';
constructor(private i18n: I18n) {
console.log(i18n("This is a test {{myVar}} !", {myVar: "^_^"}));
}
这表明您甚至可以在要翻译的消息中包含插值。
您可以使用 i18n 定义(即使用指定翻译“源”id、含义、描述),如下所示:
this.i18n({value: 'Some message', id: 'Some message id', meaning: 'Meaning of some message', description: 'Description of some message'})
您仍然需要提取消息,并且可以使用 ngx-extractor 工具来执行此操作。当您安装 polyfill 时,它已包含在内,并且我在下面添加了一个有关其在 npm 脚本中使用的示例。另请参阅自述文件填充页面 https://github.com/ngx-translate/i18n-polyfill%20%22%22.
多种语言
为了支持多种语言之间的切换,您需要一个工厂提供商来进行翻译。 readme 中有详细信息填充页面 https://github.com/ngx-translate/i18n-polyfill。您的根模块中需要类似的内容(或者对于 AOT 编译,请将返回值替换为localeFactory
使用一个函数来检测当前正在运行的应用程序的哪种 AOT 编译语言变体):
export function localeFactory(): string {
return (window.clientInformation && window.clientInformation.language) || window.navigator.language;
}
providers:
[
{
provide: TRANSLATIONS,
useFactory: (locale) => {
locale = locale || 'en'; // default to english if no locale provided
return require(`raw-loader!../locale/messages.${locale}.xlf`);
},
deps: [LOCALE_ID]
},
{
provide: LOCALE_ID,
useFactory: localeFactory
},
消息提取和 xliffmerge
所有这一切都兼容合并 https://github.com/martinroob/ngx-i18nsupport/wiki/Tutorial-for-using-xliffmerge-with-angular-cli,这是一个很好的工具,可以自动合并任何new您添加的翻译,不会覆盖现有翻译。 Xliffmerge 还可以使用 Google 翻译自动执行翻译(您需要 Google 翻译 API 密钥)。为此,我按以下顺序进行提取和合并/翻译,before我进行实际的 AOT 构建:
"extract-i18n-template-messages": "ng xi18n --outputPath=src/locale --i18n-format=xlf",
"extract-i18n-ts-messages": "ngx-extractor --input=\"src/**/*.ts\" --format=xlf --out-file=src/locale/messages.xlf",
"generate-new-translations": "xliffmerge --profile xliffmerge.json en fr es de zh"
网站特定语言版本的 AOT 构建如下所示:
"build:fr": "ng build --aot --output-path=dist/fr --base-href /fr/ --i18nFile=src/locale/messages.fr.xlf --i18nFormat=xlf --locale=fr",
该polyfill的当前状态:
这主要是由负责 i18n 的 Angular 团队成员 Olivier Combe 编写的。在此阶段,这是一个“推测性”polyfill,用于翻译 .ts 文件中的变量或字符串。它很可能会被 Angular 内置的 API 所取代,这将非常相似,因此以后的升级应该是可以合理管理的。以下是来自 Github 页面的免责声明:
这个库是一个推测性的polyfill,这意味着它应该
替换将来即将推出的 API。
如果 API 不同,如果可能且必要,将提供迁移工具。
关于即将推出的 Angular 6 小版本中对代码中变量/字符串翻译的支持进行了一些讨论。
以下是 Olivier Combe 的引言(今年 3 月),摘自 Github 上的以下讨论:
https://github.com/angular/angular/issues/11405 https://github.com/angular/angular/issues/11405
运行时 i18n 的第一个 PR 已合并到 master 中,同时
我们将使用一个 hello world 演示应用程序来测试功能。有用
在运行时,并且理论上支持代码翻译,即使有
目前还没有任何服务。目前它的支持非常少(静态
字符串),我们正在努力添加新功能(我将制作
下周进行提取工作,然后是带有占位符的动态字符串
和变量)。之后我们将提供代码翻译服务。
一旦新功能完成,它就会合并到主功能中,您
不必等待新专业。