如何将 i18n 与作为 Angular 对象的组件输入一起使用?

atc*_*way 6 internationalization angular-cli angular-i18n angular

有一种情况在子组件上定义输入,如下所示:

interface MyValues {
   text: string;
   path: string;
   someOtherValue: string;
}

@Input() myValues: MyValues;
Run Code Online (Sandbox Code Playgroud)

我需要myValues通过如下输入从父组件传递给子组件:

<my-child-component [myValues]="myValues" />
Run Code Online (Sandbox Code Playgroud)

由于它不是简单的数据类型输入,因此我无法使用此处Angular 文档中推荐的 i18n 属性样式。这是一个具有多个值的对象,因此在传递给子组件时无法对其进行翻译(除非我遗漏了某些东西)。

在子组件中,有一些代码如下:

<span *ngFor="let myValue of myValues">
   <a>{{myValue.Text}}</a>
</span>
Run Code Online (Sandbox Code Playgroud)

通常我想做的是为需要翻译的锚点分配一个 id,如下所示:

<a i18n="@@myChildComponent_text">{{myValue.Text}}</a>
Run Code Online (Sandbox Code Playgroud)

这样做的问题是它会在名为的翻译文件中创建一个字段,@@myChildComponent_text以进行翻译。但是,传递给这个子组件的这个对象在里面的值是动态的myValues,因此字面翻译将根据传入的内容而变化。

我的问题是,在将对象传递给子组件上的输入时,我如何仍然利用i18nAngular 国际化能力和@@id自定义 id,该对象将在其中具有需要转换的不同物理值?

KLT*_*LTR 0

您应该使用ngx-translate https://github.com/ngx-translate/core

定义翻译:导入 TranslateModule 后您可以将翻译放入将使用 TranslateHttpLoader 导入的 json 文件中。以下翻译应存储在en.json中。

{
    "HELLO": "hello {{value}}"
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用setTranslation手动定义翻译。

translate.setTranslation('en', {
    HELLO: 'hello {{value}}'
});
Run Code Online (Sandbox Code Playgroud)

TranslateParser理解嵌套的 JSON对象。这意味着您可以得到如下所示的翻译:

{
    "HOME": {
        "HELLO": "hello {{value}}"
    }
}
Run Code Online (Sandbox Code Playgroud)

使用服务管道指令:您可以使用 TranslateService TranslatePipeTranslateDirective获取翻译值。

使用该服务,它看起来像这样:

translate.get('HELLO', {value: 'world'}).subscribe((res: string) => {
    console.log(res);
    //=> 'hello world'
});
Run Code Online (Sandbox Code Playgroud)

这是使用管道的方法

<div>{{ 'HELLO' | translate:param }}</div>
Run Code Online (Sandbox Code Playgroud)

在你的组件中定义参数如下:

param = {value: 'world'};
Run Code Online (Sandbox Code Playgroud)

这是使用该指令的方式:

<div [translate]="'HELLO'" [translateParams]="{value: 'world'}"></div>
Run Code Online (Sandbox Code Playgroud)

或者使用元素的内容作为键甚至更简单:

<div translate [translateParams]="{value: 'world'}">HELLO</div>
Run Code Online (Sandbox Code Playgroud)

  • 很抱歉,但我的问题是告诉某人“使用另一个库”并不一定能解决问题。如果答案是“由于 x、y 和 z(事实),您需要的实现无法完成”,那么这是可以接受的。然而,如果发帖者深入某个特定的库/实现寻求帮助并且答案是“只需使用不同的库”,那就行不通。如果你想改进为什么 Angular i18n 实现会或不会工作的答案,我会很乐意删除反对票(我对此感到很难过,因为我知道你花了时间) (3认同)