使用 angular ngx-translate 翻译 json 个数组

Translate json arrays with angular ngx-translate

我有一段很长的文本要在 Ionic 4 应用程序中翻译。我正在使用 angular ngx-translate (@ngx-translate v11.0.1).

为了提高可读性,我希望翻译成多行而不是一行。

我已经更改了我的 i18n json,从此 (en-US.json):

  "common-questions-content" : "<b>Question 1?</b> Answer 1 <br> <b>Question 2?</b> Answer 2 <b>Question 3?</b> Answer 3",

为此:

  "common-questions-content" : [
    "<b>Question 1?</b> Answer 1 <br>",
    "<b>Question 2?</b> Answer 2 <br>",
    "<b>Question 3?</b> Answer 3"
  ],

没想到这有效!但是,它在数组的每个值之间放置逗号

我在 app.component.ts 中加载翻译服务:

import {TranslateService} from '@ngx-translate/core';
...
private translateService: TranslateService,
...    
this.translateService.use('en-US');

最后我在我的 html 页面中使用了它:

{{ 'common_questions' | translate }}

是否可以更改此行为并只显示所有不带逗号的文本?

我建议您每个语句只有一个输入,并且没有 html 标签翻译,例如 :

在你的 en.JSON 中:

"QUESTION_1":"blabla",
"QUESTION_2":"blabla",
"QUESTION_3":"blabla",
"ANSWER_1":"blabla",
"ANSWER_2":"blabla",
"ANSWER_3":"blabla",

然后在您的组件中,创建两个 class 数组类型的属性,如下所示:

public questions : string[];
pulbic answers : string[];
constructor (private translate: TranslateService) {
  translate.get(["QUESTION_1", "QUESTION_2", "QUESTION_3"]).subscribe(
      values => {
        this.questions = Object.keys(values).map(key => values[key]);
      }
   );
   translate.get(["ANSWER_1", "ANSWER_2", "ANSWER_3"]).subscribe(
      values => {
        this.answers = Object.keys(values).map(key => values[key]);
      }
   );
}

然后在您的 html 显示中,自定义、添加点击事件或您需要的任何内容:

<ion-grid>
   <ion-row>
      <ion-col col-6>
         <ion-grid>
           <ion-row *ngFor="let q of questions"><b>{{q}}</b></ion-row>
         </ion-grid>
      </ion-col>
      <ion-col col-6> 
         <ion-grid>
           <ion-row *ngFor="let a of answers">{{a}}</ion-row>
         </ion-grid>
      </ion-col>
   </ion-row>
</ion-grid>

这是基本的 html 实施,但您会看到还有多少潜力供您使用。你可以定义点击事件、动画、颜色、选择的项目等等..

更清洁的解决方案:

  • 避免创建无人订阅,
  • 可跨不同组件重复使用

是创建自定义管道:

import { Pipe, PipeTransform } from '@angular/core';
import { TranslatePipe } from '@ngx-translate/core';

@Pipe({
  name: 'translateList',
})
export class TranslateListPipe extends TranslatePipe implements PipeTransform {
  transform(key: any, length: number): any[] {
    return [...Array(length).keys()].map((i) => super.transform(`${key}.${i}`));
  }
}

并在 NgFor 的帮助下在任何模板中像这样使用它:

<div *ngFor="let item of 'TRANSLATION_KEY' | translateList:2">{{ item }}</div>

其中 TRANSLATION_KEY 是包含 2 个字符串的数组的键:

"TRANSLATION_KEY": ["hello", "world"]

此自定义管道扩展了 ngx-translate 自己的 TranslatePipe 并在后台使用 super.transform(...) 调用,因此所有翻译繁重工作仍由 ngx-translate 处理。