Angular 2 i18n为翻译提供不可用的控制台消息

时间:2016-10-13 01:09:20

标签: javascript angular internationalization translation

我所知道的i18n的早期Angular文档是Stephen Fluin的示例代码。 https://github.com/StephenFluin/i18n-sample/commit/e2cb2006c614fce0f6d623def5f13174583233d3

我试图密切关注它。 Atom-typescript没有错误,但是我为每个元素都获得了不可用的控制台消息,如下所示<和>删除 -

zone.js:355未处理的承诺拒绝:模板解析错误:

md-grid-tile [错误 - >]按钮id =“terms”md-button aria-label =“TERMS”i18n =“服务条款按钮”TERMS / button / md“):AppComponent @ 63 :19 消息不可用于消息id =“8476fc13627507c3d0ec6b85dae533f0c5e44eef”(“ - label =”TERMS“i18n =”服务条款按钮“TERMS / button / md-grid-tile

我的相关代码是:

的package.json 与显示的相同,除了我不包括@ angular / tsc-wrapped,因为这里似乎没必要。

component.html - 我的HTML示例如下:

<h4 id="motto" i18n="our motto stating the value of using this site">MOTTO</h4>
<md-grid-tile><button id="terms" md-button aria-label="TERMS" i18n="button for Terms of Service">TERMS</button></md-grid-tile>

main.ts 我遗漏了生产环境线&amp; polyfills

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { TRANSLATIONS, TRANSLATIONS_FORMAT, LOCALE_ID } from '@angular/core';
import { AppModule } from './app.module';
import { TRANSLATION } from './components/navigation/language/messages.en';

platformBrowserDynamic().bootstrapModule(
  AppModule,
  {providers: [
  { provide: TRANSLATIONS, useValue:TRANSLATION },
  { provide:TRANSLATIONS_FORMAT, useValue:'xlf' },
  { provide:LOCALE_ID, useValue:'en' }
]});

messages.en.ts 重复元素的示例如下:

export const TRANSLATION = `
<?xml version='1.0' encoding='utf-8'?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
 <file source-language="en" datatype="plaintext" original="ng2.template">
  <body>
   <trans-unit id="motto" datatype="html" approved="yes">
   <source>MOTTO</source> <target state="translated">Find a home, save time</target>
   <note priority="1" from="description">our motto stating the value of using this site</note>
   </trans-unit>
   <trans-unit id="terms" datatype="html" approved="yes">
   <source>TERMS</source> <target state="translated">Terms of Service</target>
   <note priority="1" from="description">button for Terms of Service</note>
   </trans-unit>

messages.en.xlf 重复元素的再次示例

<?xml version='1.0' encoding='utf-8'?>
 <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
  <file source-language="en" datatype="plaintext" original="ng2.template">
   <body>
    <trans-unit id="motto" datatype="html" approved="yes">
    <source>MOTTO</source> <target state="translated">Find a home, save time</target>
    <note priority="1" from="description">our motto stating the value of using this site</note>
    </trans-unit>

messages.xlf 再次举例说明重复元素

<?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="motto" datatype="html">
   <source>MOTTO</source>
   <target/>
   <note priority="1" from="description">our motto stating the value of using this site</note>
 </trans-unit>

Stephen的代码有40位十六进制数字用于转换单元ID。我不知道它们是如何产生的。我的代码有id =“motto”之类的东西。我的控制台消息包含40位十六进制数字,但每次尝试时它们似乎都会改变。这部分是一个谜。

这是非常流行的,没有真正的文档,但有谁知道如何解决这个问题?我出城直到10/17,但是当我回来时,我会热切地尝试好主意。

1 个答案:

答案 0 :(得分:0)

事实证明,上面引用的Stephen Fluin的帖子中的文件是由Angular翻译过程生成的。不要尝试复制,修改和粘贴 - 就像我上面所做的那样!经过大量的搜索,我发现在Angular2的devdocs的Cookbook部分中,这个过程设置了描述。 http://devdocs.io/angular~2_typescript/cookbook/i18n

这是一个复杂的(对我来说,无论如何),代码和翻译文件的多步骤设置。但它的确有效。您可以选择及时的jiT或提前AoT翻译。这也是做出决定的多步骤研究。目前,谷歌建议使用jiT进行开发(虽然绘制页面的速度较慢)和AoT用于生产。 AoT目前设置起来非常复杂。谷歌表示他们正在努力使其更简单。希望能为您节省一些时间。