我目前正在研究我的Angular应用程序的i18n。我使用AOT编译与xlf文件来创建预编译的应用程序,如here所述。在构建中,我提供了一个特定于语言的基础href(使用--base-href
parm)。例如,这意味着,我最终使用以下网址路径使用两种特定于语言的应用:
现在,我想在我的应用中提供指向相应备用语言的链接,方法是在活动网址中将en
替换为de
。我使用了路由器注入,所以我可以访问它的url属性,但是这个属性没有给我完整的URL ,包括base-href。
如何从Angular应用程序中找到基本网址?
或者,有没有办法找出应用程序的语言?我能以某种方式从xliff文件中访问目标语言属性吗?
答案 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”这样需要略微增强的正则表达式的东西不起作用。我还没有找到一种方法来识别当前正在运行的应用程序的语言。