如何在翻译开始之前将i18n密钥从父级传递到子级?

时间:2018-10-19 11:11:53

标签: angular internationalization translation angular-i18n angular-dynamic-components

我正在使用输入字段组件,可以使用表单将其嵌入到不同的父组件中。

在输入的子组件中,我有一个使用插值的i18n转换键作为变量,我想根据客户的选择从父组件动态生成该键。

input.component.ts

<div i18n="{{labelTextKey}}">{{labelText}}</div>
<div>
    <input matInput [required]="required" 
                    [name]="name"
                    [(ngModel)]="value" 
                    [type]="type">
</div>

form.component.ts

<app-input [labelText]="'Second name'"
           [labelTextKey]="'@@LabelSecondName'"
           [name]="'secondName'"
           [ngModel] = "secondName"
           [type] = "'text'"
</app-input>

问题在于,在运行应用程序时,转换发生在键被传递给子组件中的变量之前,因此键/ id没有@@LabelSecondName的转换。

因此,labelText保留原始语言。我得到的不是翻译,而是随机生成的一种数字,由于 XLF (2.0版)文件中不存在作为键的那些数字,因此文本/标签不进行翻译。

  

错误消息:Missing translation for message "8901569964118207331"

这种行为在某种程度上是预料之中的,因为变量labelTextKey没有获得值:@@LabelSecondName是及时传递的。

一直在搜索,但无法找到正确的解决方案。这个question似乎更接近我,但情况并不完全相同,也没有答案。

1 个答案:

答案 0 :(得分:1)

问题已解决。解决方案:

在子组件中不需要i18​​n标记,只需在父组件中使用它,如下所示:

Seq[(Integer, Integer)]((null, 1), (2, null), (null, 3)).toDF("a", "b")
// org.apache.spark.sql.DataFrame = [a: int, b: int]

因此,整个代码将显示为。:

<app-input i18n-labelText="@@LabelSecondName" labelText="Second name"></app-input>