【发布时间】:2020-01-03 03:43:45
【问题描述】:
我有一个已经构建好的 Angular 6 应用程序。现在我们计划将其支持为多种语言。我能够创建多个 xlf 文件并将目标字符串替换为语言。我的语言环境文件包含三个文件,例如 messages.en.xlf、messages.es.xlf 和 messages.fr.xlf,分别用于英语、西班牙语和法语。
根据浏览器的语言,应用程序应选择所需的语言文件。如果浏览器设置为法语,它应该会自动获取 messages.fr.xlf 并以法语显示应用程序。
最初我的构建命令将是ng build --prod --output-hashing all,但随着本地化更改,我需要使用--aot=false 和--build-optimizer=false,我的应用程序的性能和加载时间变得更糟。
ng build --prod --output-hashing all --aot=false --build-optimizer=false
我的 main.ts 文件如下:
declare const require;
var userLang;
window.addEventListener('languagechange', function () {
// callLangugae();
location.reload(true);
});
function callLangugae() {
userLang = navigator.language;
userLang = userLang.split("-")[0];
switch (userLang) {
case 'es': {
registerLocaleData(localeEs);
break;
}
case 'fr': {
registerLocaleData(localeFr);
break;
}
case 'en': {
registerLocaleData(localeEn);
break;
}
default: {
userLang = 'en';
registerLocaleData(localeEn);
break;
}
}
}
callLangugae();
const translations = require(`raw-loader!./locale/messages.${userLang}.xlf`);
platformBrowserDynamic().bootstrapModule(AppModule, {
providers: [
{ provide: TRANSLATIONS, useValue: translations },
{ provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }
]
})
.catch(err => console.log(err));
我想知道是否有一种正确的方法可以根据浏览器的语言加载 xlf 文件,而不会出现性能问题并且不会使 AOT 为假。
【问题讨论】:
-
如果您使用内置的 i18n 进行翻译,通常最好为每种语言创建 1 个包集。或者,您可以使用@ngx-translate,它可以动态切换语言,甚至无需重新加载窗口。
-
我们只需要创建 1 个构建包。我们不能为每种语言创建一个。我见过 ngx-translate 但我想知道是否有内置的角度来做到这一点
-
I am wondering is there a proper way to load the xlf file based on the language of the browser without the performance problems and with out making aot false.← 您必须选择具有每种语言不同应用程序文件的 aot 或 jit,它可以在运行时引导语言环境。如果使用内置的 i18n 翻译,则没有混合方法。 -
就我个人而言,我更喜欢使用
@ngx-translate,尤其是当您有多种翻译或语言数量会增加时。这将允许您使用 AOT 进行编译并支持组件中文本的动态替换(即翻译)。 -
到目前为止没有人提供答案的原因与动机无关(即添加赏金),这个问题无法回答,因为您想要的解决方案不存在。您必须在浏览器中的动态翻译加载和以 JIT 运行 Angular、为每个翻译创建包并作为 AOT 运行或使用像
@ngx-translate这样的库之间进行选择。
标签: angular angular-cli angular-i18n angular-cli-v8