如何在Angular中提供备用的i18n语言链接并进行编译?

时间:2017-05-24 12:25:28

标签: angular internationalization angular2-aot xliff

我目前正在研究我的Angular应用程序的i18n。我使用AOT编译与xlf文件来创建预编译的应用程序,如here所述。在构建中,我提供了一个特定于语言的基础href(使用--base-href parm)。例如,这意味着,我最终使用以下网址路径使用两种特定于语言的应用:

  • / APP_PATH / EN /...
  • / APP_PATH /解/...

现在,我想在我的应用中提供指向相应备用语言的链接,方法是在活动网址中将en替换为de。我使用了路由器注入,所以我可以访问它的url属性,但是这个属性没有给我完整的URL ,包括base-href。

如何从Angular应用程序中找到基本网址?

或者,有没有办法找出应用程序的语言?我能以某种方式从xliff文件中访问目标语言属性吗?

2 个答案:

答案 0 :(得分:3)

在为各种语言编译应用程序时,您需要在ng构建过程中设置区域设置:

./node_modules/.bin/ngc --i18nFile=./locale/messages.es.xlf --locale=es --i18nFormat=xlf

您可以通过将其注入组件来访问此区域设置:

import { Inject, LOCALE_ID } from '@angular/core';
...
constructor(@Inject(LOCALE_ID) locale: string, ...

然后,您可以使用区域设置字符串来确定当前语言。在上面的示例中,语言环境设置为“es”

希望这有帮助

答案 1 :(得分:0)

首先,让Angular注入Router和Location对象(不确定为什么需要Router):

constructor(private router: Router, private location: Location) {}

然后,确定基本路径(base href):

let fullpath = this.location.prepareExternalUrl(this.location.path());
let basepath = fullpath.substr(0, fullpath.lastIndexOf(this.location.path().substr(1)));

最后,您可以创建备用语言网址列表(在urls中):

const languages = ["en", "de", "fr", "it"];  // List of available languages 
let urls = [];
for (let lang of languages) {
  let url = basepath.replace(/\/(..)\/$/, "/" + lang + "/") + this.location.path().substr(1);
  if (url !== fullpath) {
    urls.push(url);
  }
}

请注意,basepath.replace假设斜杠之间有两个字符的语言代码。这对于像“en-us”这样需要略微增强的正则表达式的东西不起作用。我还没有找到一种方法来识别当前正在运行的应用程序的语言。