我正在致力于Angular应用程序的国际化,需要动态检测用户为应用程序主动 选择的语言环境(用户必须主动切换语言环境才能显示该网站)以其首选语言)。
在我的根模块中,我为TRANSLATIONS
指定了以下提供程序,其中所需的xlf文件(翻译文件)是使用取决于我的LOCALE_ID
值的工厂动态确定的:>
... imports go here
export function selectedLocaleFactory(): string {
return LocaleService.getCurrentLanguage();
}
providers:
[
LocaleService,
{
provide: TRANSLATIONS,
useFactory: (locale) => {
locale = locale || 'en'; // default to english if no locale provided
return require(`raw-loader!../locale/messages.${locale}.xlf`);
},
deps: [LOCALE_ID]
},
{
provide: LOCALE_ID,
useFactory: selectedLocaleFactory
}
]
如您所见,在TRANSLATIONS
提供程序中,我正在根据LOCALE_ID
的值确定要使用的翻译文件。
LOCALE_ID
是通过使用另一个工厂(selectedLocaleFactory
)确定的,该工厂仅尝试使用getCurrentLanguage
中的方法LocalService
返回LOCALE_ID值。我不确定这是否是从我的服务中获取价值的正确/最佳方法-我的意思是selectedLocaleFactory
并不是真正的“工厂”,并且服务旨在注入。
无论如何,我在app.module.ts
中遇到此编译错误:
Property 'getCurrentLanguage' does not exist on type 'typeof LocaleService'.
以下是我的LocalService
的摘录:
@Injectable()
export class LocaleService {
private currLanguage: string;
constructor( private router: Router ) {
// this.currLanguage is set here - based on the URL being accessed by the user
}
getCurrentLanguage() {
return this.currLanguage;
}
如果我将LocaleService
内的getCurrentLanguage设为静态方法,则仍然无法访问:
static getCurrentLanguage() {
return this.currLanguage;
}
更新:
我意识到我需要实例化服务以访问适当的方法:
export function selectedLocaleFactory(): string {
var localeService = new LocaleService(null);
return localeService.getCurrentLanguage();
}
我的LocaleService
具有Router
依赖性,因此我将其设置为null。仍然感觉像我在尝试以错误的方式执行此操作。我的LocaleService
实际上应该是单身人士,我担心使用当前方法可能会遇到问题(例如,阴影问题)。我可以从根模块内的服务访问属性吗?
@Thierry Templier在这里的回答-What is the best way to declare a global variable in Angular 2 / Typescript建议引导服务以访问其变量之一,但是这种方法给我一个错误,说我不能将服务用作入口点。 / p>