angular - ngx-translate - 在 TypeScript 文件中翻译没有组件的键
问题描述
我将 Angular 与 @ngx-translate 模块一起使用。我有以下文件(只是声明了一些常量):
// some.module.ts
const const1 = [
{
url: 'google.com',
},
{
url: 'google.de',
},
{
url: 'google.at',
},
];
const someOtherConst = [
{
text: 'please.translate.me', // <== Should be translated
},
];
基本上我想翻译text
常量里面键的值someOtherConstant
,但我不知道怎么做。
- 我不能使用 Angular Dependency Injection,因为我没有任何组件可以使用。
- 我也不能创建一个新的实例,
TranslationService
因为它需要一些我不应该(甚至可以)自己提供的参数。
这似乎是一个如此简单的任务,但我似乎无法弄清楚如何。
解决方案
你不能以你想要的方式去做。拥有翻译服务的全部意义在于您还可以动态切换语言,这样您就不能用翻译填充常量值。您需要在使用常量的地方应用翻译。最后,您可能希望在某处显示这些值。
如果要在组件中显示值,可以将常量公开为属性,然后在模板中进行转换。
一个简单的组件:
@Component({
selector: 'app-root',
templateUrl: 'app.component.html'
})
export class AppComponent {
public get textToTranslate() {
return someOtherConst[0].text;
}
}
翻译它的组件模板:
<h3>{{ textToTranslate | translate }}</h3>
如果您需要在代码中进行翻译,则需要在服务或组件中进行翻译,您可以在其中注入TranslateService
并使用任何方法来获得翻译,具体取决于您的需要。
这是一项服务,提供了三种可能的翻译方式:
@Injectable()
export class ServiceWithTranslations {
constructor(public translateService: TranslateService) {
// get text with current language
this.translateService.get(someOtherConst[0].text).subscribe((translatedText => {
console.log(translatedText);
}));
// gets translation and emits new value if language changes
this.translateService.stream(someOtherConst[0].text).subscribe((translatedText => {
console.log(translatedText);
}));
// gets translation with current language you need to be sure translations are already loaded so it is not reccomended
const translatedText = this.translate.instant(someOtherConst[0].text);
console.log(translatedText);
}
}
我认为您想要的最接近的选择是创建一个准备翻译的服务,然后将此服务注入您需要翻译的组件或服务中。
以下是此类服务的基本示例:
@Injectable()
export class TranslationsService {
public translatedConsts = [];
constructor(private translateService: TranslateService) {
for (const textEntry of someOtherConst) {
const translatedConst = {
text: ''
};
this.translateService.stream(textEntry.text).subscribe((translatedText) => {
translatedConst.text = translatedText
});
this.translatedConsts.push(translatedConst);
}
}
}
推荐阅读
- spi - OpenMV 和 CC3220SX SPI 集成
- email - Zurb 电子邮件基金会 - html 编译文件太大(npm run build)
- rust-cargo - 构建 libsodium 时如何在 Linux 上解决此构建错误
- javascript - 网页跟踪历史记录中的后退按钮是否正确?
- amazon-web-services - AWS-CDK 如何使用细粒度断言测试道具
- javascript - 从 jQuery 函数更新和重新渲染 ACF 古腾堡块
- sql - Postgres 按修剪均值分组
- batch-file - 将 bat 文件中启动的程序置于前台
- ios - 无法创建 IXPlaceholder Xcode 12.5
- vue.js - 如何使用数据创建 BrowserWindow,并在 vue 应用程序中获取该数据?