这是一个老问题,但也许其他人会偶然发现它。:)
我知道Angular有内置的i18n机制,但出于几个原因,我们不想使用它们。主要是因为我们已经在另一个产品中拥有数千个翻译短语映射,并且我们希望重复使用所有这些内容。所以我们将现有的映射转换为json格式,然后在我们的angular项目中:
- 创建一个服务(例如I18nService),其中包含一个函数:
export class I18nService {
phraseMap: Map<string, string>;
translatePage(elements: QueryList<ElementRef>, renderer: Renderer2) {
elements.forEach((el: ElementRef) => {
let key:string = el.nativeElement.innerText;
let phrase = this.phraseMap.get(key);
if (phrase) {
renderer.setProperty(el.nativeElement, 'innerText', phrase);
}
}
}
this.phraseMap 是一个包含键值对的 Map<string, string>,例如 key: "PH_HELLO",value: "Bonjour"
在你的组件模板中,使用模板变量(我使用了 #i18n,但可以是任何名称)来装饰你的元素,并用短语键替换文本,例如:
<span #i18n>PH_HELLO</span>
<div #i18n>PH_LOGOUT</div>
在你的组件类中,使用 ViewChildren 收集所有适当的元素。注入你的服务和 Angular Renderer2,并实现 AfterViewInit:
export class MyComponent implements AfterViewInit {
@ViewChildren('i18n', {read:ElementRef}) i18nElements: QueryList<ElementRef>;
constructor(
private i18nService: I18nService,
private renderer: Renderer2
) {}
ngAfterViewInit() {
this.i18nService.translatePage(this.i18nElements, this.renderer);
}