我有一个翻译JSON文件,我想在另一种翻译的值内翻译另一种翻译。
{
"COMPANY_NAME": "Apple",
"WELCOME_TEXT": "{{ COMPANY_NAME }} welcomes you to California!"
}
在Angular 9中,我看不到如何使用ngx-translate
来做到这一点?有人可以给我一个指针吗?
答案 0 :(得分:1)
我设法通过实现以下自定义TranslateCompiler
来实现这一目标:
我的app.module.ts
:
// ...
imports: [
TranslateModule.forRoot({
compiler: { provide: TranslateCompiler, useClass: CustomTranslationCompiler }
})
]
/// ...
我的CustomTranslationCompiler.ts
:
import { TranslateCompiler } from '@ngx-translate/core';
export class CustomTranslationCompiler implements TranslateCompiler {
/**
* This function is needed to implement the interface, but doesn't
* actually seem to be used anywhere
*
* @param value The translation value
* @param lang The current language
*/
public compile(value: string, lang: string): string | Function {
return value;
}
/**
* Look at every translation and pre-translate any nested translation keys within them
*
* @param translations All of the translations for the app to be compiled
* @param lang The current language
*/
public compileTranslations(translations: any, lang: string): any {
for (const key in translations) {
if (translations.hasOwnProperty(key)) {
translations[key] = this.translateNestedTranslation(translations[key], translations);
}
}
return translations;
}
/**
* Use a regex to search for and replace translations inside translations
* with their translated value
*
* @param value The translation value
* @param translations All of the translations for the app
*/
private translateNestedTranslation(value: string, translations: Object): string {
const searchRegex = /{{\s([A-Z_:]*)\s?}}/g;
const replaceRegex = /({{\s?[A-Z_:]*\s?}})/g;
const matches = searchRegex.exec(value);
if (matches && matches.length > 0) {
const searchKey = matches[1];
if (translations.hasOwnProperty(searchKey)) {
// Replace the full translate syntax with the translated value
value = value.replace(replaceRegex, translations[searchKey]);
} else {
// If we can't find the value, display only the missing key instead of the full translate syntax
value = value.replace(replaceRegex, searchKey);
console.error(`Error: Unable to find translation '${searchKey}'!`)
}
}
return value;
}
}
一些注意事项:
compile()
方法。我的翻译作为一个对象而来,所以也许这就是为什么... 答案 1 :(得分:0)
我创建并使用了这个 decorator,它启用了参数化翻译键! https://github.com/mustafah/translations#-parameterized-translations