【发布时间】:2018-11-26 15:17:08
【问题描述】:
通过此链接,我尝试在我的 Angular 6 应用程序中实现 i18 国际化,以便在我的 html 模板中用英语和意大利语翻译一些文本和日期时间。
https://next.angular.io/guide/i18n
我知道这个功能分为三个阶段:
-
定义翻译文本。没问题,我创建了一个文件夹 src/locale 文件夹,其中包含 2 个文件 messages.en.xlf(和 message.it.xlf);这是一个 en 版本的示例。
你好 i18n! (zh-CN) 此示例的介绍标题 用户欢迎 -
用适当的标签将此文本链接到 html 页面,这里也没有问题,我的 app.translations.html 中有我的示例标签。
你好 i18n!
现在,我阅读了在启动期间本地化应用程序的方式(3.阶段)(在 Angular.json 文件中进行一些编辑并使用配置选项启动 ng serve);但是,我会以编程方式更改应用程序的语言,而不是这样做。换句话说,我想要一个命令,例如
SwitchAppLanguage('en')
例如,用户可以通过按钮自行更改,或者应用程序可以读取浏览器默认语言来执行此操作。我该怎么做?
编辑
我尝试以这种方式编辑我的 angular.json 文件
"configurations": {
"production": {
"i18nFile": "src/locale/messages.it.xlf",
"i18nFormat": "xlf",
"i18nLocale": "it",
(...)
而且,在ng build 和ng serve 之后,我希望看到意大利语文本,但它没有发生(并且应用程序启动并正确运行)。我做错了什么?
【问题讨论】:
-
没有这样的东西。该应用程序在构建时本地化。如果您需要两种语言,则需要构建两次,并从您的 Web 服务器提供两个不同的应用程序。要更改语言,您需要加载其他应用程序。
-
不可能定义2种语言并告诉Angular“切换到这种语言”吗?我好像很奇怪,你确定吗?在这种情况下,用户在应用使用过程中无法选择语言,对吗?
-
是的,我确定。是,对的。它写在您链接到的页面中,逐字逐句:当您使用 AOT 编译器进行国际化时,您必须为每种语言预先构建一个单独的应用程序包,并根据服务器端语言检测或 url 参数提供适当的包.
-
一旦 Ivy 出现,您将能够拥有一个适用于所有语言的应用程序,但您仍需要重新加载应用程序以切换语言。可以使用 ngx-translate,它有这个功能(但效率较低,还有其他限制)
-
window.location.href = urlOfTheOtherApp;.
标签: angular internationalization