我想用 angular2 构建一个 web 应用程序并将其与 webpack 捆绑在一起。提供多种语言的最佳方式是什么:
i18n 插件:https ://github.com/webpack/i18n-webpack-plugin
或者
我想用 angular2 构建一个 web 应用程序并将其与 webpack 捆绑在一起。提供多种语言的最佳方式是什么:
i18n 插件:https ://github.com/webpack/i18n-webpack-plugin
或者
我使用说明书让它与 webpack 一起工作。xliff 文件必须像这样转换为 ts:
export const TRANSLATION_SV = `<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="ng2.template">
<body>
<trans-unit id="a73e2898b9e1126ed19dbabe4b5c3715a84db61a" datatype="html">
<source>Category</source>
<target>Kategori</target>
</trans-unit>
</body>
</file>
</xliff>`;
然后在 main.ts 中必须添加它
import { TRANSLATIONS, TRANSLATIONS_FORMAT, LOCALE_ID } from '@angular/core';
import { TRANSLATION_SV } from './locale/messages.sv';
并插入到引导步骤:
platformBrowserDynamic().bootstrapModule(AppModule, {
providers: [
{provide: TRANSLATIONS, useValue: TRANSLATION_SV},
{provide: TRANSLATIONS_FORMAT, useValue: "xlf"},
{provide: LOCALE_ID, useValue:'sv'}
];
});
如果您正在使用angular-cli
,您可以按照以下步骤操作:
请注意,您的应用程序必须是AOT 兼容的,因此您应该能够使用
--aot
switch 构建它:ng build --aot
ng xi18n
使用给定翻译文件位置的命令提取消息:
ng xi18n --output-path src/i18n
你会得到src/i18n/messages.xlf
文件。复制此文件并将消息翻译成您需要的语言:
src/i18n/messages.en.xlf
src/i18n/messages.pl.xlf
使用命令服务/构建您的应用程序ng serve / ng build
(相应地更改语言环境):
ng serve --i18n-file=src/i18n/messages.en.xlf --locale=en --i18n-format=xlf --aot
如果有人仍然想知道如何使用 webpack 加载器使用 angular 2 本地化,我已经修改了提供的 angular 2 食谱;
首先 创建 i18n.provider.ts
import { TRANSLATIONS, TRANSLATIONS_FORMAT, LOCALE_ID } from '@angular/core';
import { Observable } from "rxjs/Rx";
export function getTranslationProviders(): Promise<Object[]> {
// Get the locale id from the global
const locale = document['locale'] as string;
// return no providers if fail to get translation file for locale
const noProviders: Object[] = [];
// No locale or U.S. English: no translation providers
if (!locale || locale === 'en') {
return Promise.resolve(noProviders);
}
// Ex: 'locale/messages.fr.xlf`
const translationFile = `./src/app/localezation/messages.${locale}.xlf`;
var provider = getTranslationsWithSystemJs(translationFile)
.then((translations: string) => [
{ provide: TRANSLATIONS, useValue: translations },
{ provide: TRANSLATIONS_FORMAT, useValue: 'xlf' },
{ provide: LOCALE_ID, useValue: locale }
])
.catch(() => noProviders); // ignore if file not found
debugger;
return provider;
}
declare var System: any;
function getTranslationsWithSystemJs(file: string) {
// changes Start here
var text = "";
var fileRequest = new XMLHttpRequest();
fileRequest.open("GET", file, false);
fileRequest.onerror = function (err) {
console.log(err);
}
fileRequest.onreadystatechange = function () {
if (fileRequest.readyState === 4) {
if (fileRequest.status === 200 || fileRequest.status == 0) {
text = fileRequest.responseText;
}
}
}
fileRequest.send()
var observable = Observable.of(text);
var prom = observable.toPromise();
return prom;
}
注意变化是:
main.ts 文件中的第二个 更改引导程序,与角度食谱中提到的相同
getTranslationProviders().then(providers => {
const options = { providers };
platformBrowserDynamic().bootstrapModule(AppModule, options);
});
Angular 2 最终版本具有 i18n 原生支持https://angular.io/docs/ts/latest/cookbook/i18n.html
检查另一个答案https://stackoverflow.com/a/39004058/1267942示例和一些有关使用的详细信息。
ng2-translate与本机实现相比过于冗长。ng2-translate的作者也是angular 2 i18n 文档的重要贡献者
@M.Nour Berro 答案的略微修改版本。
我进行了此更改,因为不推荐使用同步 xhr,并且以后可能会删除支持。
function getTranslations(filePath: string): Promise<string> {
var text = '';
return new Promise<string> ((resolve, reject) => {
const fileRequest = new XMLHttpRequest();
fileRequest.open('GET', filePath, true);
fileRequest.onerror = function (err) {
console.log(err);
reject(err);
};
fileRequest.onreadystatechange = function () {
if (fileRequest.readyState === 4) {
if (fileRequest.status === 200 || fileRequest.status === 0) {
text = fileRequest.responseText;
resolve(text);
}
}
};
fileRequest.send();
});
}