使用 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
处理。
我有一段很长的文本要在 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
处理。