根据浏览器语言设置angular LOCALE_ID
Set angular LOCALE_ID according to browser language
我正在尝试在我的多语言应用程序中使用 Kendo 组件。要正确设置日期格式,Kendo 需要设置 Angular 中的 LOCALE_ID
。我不确定如何以干净的方式完成它。
目前,我正在使用 HTTP_ACCEPT_LANGUAGE
查找我应该以哪种语言为我的应用程序提供服务。
我在 nginx.conf:
中这样做
# Parse AcceptLanguage header
# en,es,pl,fr
# en,es;q=0.8,pl;q=0.7,fr;q=0.6
set $first_language $http_accept_language;
if ($http_accept_language ~* '^(.+?),') {
set $first_language ;
}
set $language_suffix 'en';
if ($first_language ~* 'fr') {
set $language_suffix 'fr';
}
root /usr/share/nginx/html/$language_suffix;
这行得通。使用了正确的 .xlf 文件,消息显示为已翻译。
现在,我需要设置 LOCALE_ID
让我的 Kendo 组件以正确的格式呈现日期。我试图通过获取浏览器当前语言来设置它。以下是我尝试实现的方法:
app.module.ts
...
import { LOCALE_ID, NgModule } from '@angular/core';
import { LocaleService } from './shared/service/locale.service';
...
@NgModule({
declarations: [
...
],
imports: [
...
],
providers: [
...
{
provide: LOCALE_ID,
deps: [LocaleService],
useValue: (localeService) => localeService.getLanguage()
}
],
})
locale.service.ts
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class LocaleService {
constructor() { }
getLanguage() {
// return navigator.language || navigator.userLanguage
return 'fr-FR';
}
}
我从 Kendo 组件收到此错误消息。
ERROR TypeError: value.replace is not a function
at CldrIntlService.set [as localeId] (cldr-intl.service.js:38)
at new CldrIntlService (cldr-intl.service.js:24)
at _createClass (core.js:19829)
at _createProviderInstance (core.js:19801)
at resolveNgModuleDep (core.js:19765)
at NgModuleRef_.push../node_modules/@angular/core/fesm5/core.js.NgModuleRef_.get (core.js:20473)
at resolveDep (core.js:20844)
at createClass (core.js:20724)
at createDirectiveInstance (core.js:20595)
at createViewNodes (core.js:21821)
如果我这样设置,它会起作用:
{ provide: LOCALE_ID, useValue: 'fr-FR' }
我是初学者,仍在努力寻找解决方法 Angular。我错过了什么?这是实现该目标的正确方法吗?
我的灵感来自:
-
-
也许您应该使用 FactoryProvider 来实例化您的可注射物并 return 语言环境值,例如:
providers: [
{
provide: LOCALE_ID,
useFactory: (localeService: LocaleService) => {
console.log('locale ID', localeService.language);
return localeService.language;
},
deps: [LocaleService]
}
],
见
以下对我有用(代码添加到 app.module
的 providers
列表中):
{
provide: LOCALE_ID,
useValue: navigator.language,
},
我也在导入和注册受支持的语言环境,不确定是否有必要:
import { registerLocaleData } from '@angular/common'
import localeEnAu from '@angular/common/locales/en-AU'
...
registerLocaleData(localeEnAu)
...
我正在尝试在我的多语言应用程序中使用 Kendo 组件。要正确设置日期格式,Kendo 需要设置 Angular 中的 LOCALE_ID
。我不确定如何以干净的方式完成它。
目前,我正在使用 HTTP_ACCEPT_LANGUAGE
查找我应该以哪种语言为我的应用程序提供服务。
我在 nginx.conf:
# Parse AcceptLanguage header
# en,es,pl,fr
# en,es;q=0.8,pl;q=0.7,fr;q=0.6
set $first_language $http_accept_language;
if ($http_accept_language ~* '^(.+?),') {
set $first_language ;
}
set $language_suffix 'en';
if ($first_language ~* 'fr') {
set $language_suffix 'fr';
}
root /usr/share/nginx/html/$language_suffix;
这行得通。使用了正确的 .xlf 文件,消息显示为已翻译。
现在,我需要设置 LOCALE_ID
让我的 Kendo 组件以正确的格式呈现日期。我试图通过获取浏览器当前语言来设置它。以下是我尝试实现的方法:
app.module.ts
...
import { LOCALE_ID, NgModule } from '@angular/core';
import { LocaleService } from './shared/service/locale.service';
...
@NgModule({
declarations: [
...
],
imports: [
...
],
providers: [
...
{
provide: LOCALE_ID,
deps: [LocaleService],
useValue: (localeService) => localeService.getLanguage()
}
],
})
locale.service.ts
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class LocaleService {
constructor() { }
getLanguage() {
// return navigator.language || navigator.userLanguage
return 'fr-FR';
}
}
我从 Kendo 组件收到此错误消息。
ERROR TypeError: value.replace is not a function
at CldrIntlService.set [as localeId] (cldr-intl.service.js:38)
at new CldrIntlService (cldr-intl.service.js:24)
at _createClass (core.js:19829)
at _createProviderInstance (core.js:19801)
at resolveNgModuleDep (core.js:19765)
at NgModuleRef_.push../node_modules/@angular/core/fesm5/core.js.NgModuleRef_.get (core.js:20473)
at resolveDep (core.js:20844)
at createClass (core.js:20724)
at createDirectiveInstance (core.js:20595)
at createViewNodes (core.js:21821)
如果我这样设置,它会起作用:
{ provide: LOCALE_ID, useValue: 'fr-FR' }
我是初学者,仍在努力寻找解决方法 Angular。我错过了什么?这是实现该目标的正确方法吗?
我的灵感来自:
-
-
也许您应该使用 FactoryProvider 来实例化您的可注射物并 return 语言环境值,例如:
providers: [
{
provide: LOCALE_ID,
useFactory: (localeService: LocaleService) => {
console.log('locale ID', localeService.language);
return localeService.language;
},
deps: [LocaleService]
}
],
见
以下对我有用(代码添加到 app.module
的 providers
列表中):
{
provide: LOCALE_ID,
useValue: navigator.language,
},
我也在导入和注册受支持的语言环境,不确定是否有必要:
import { registerLocaleData } from '@angular/common'
import localeEnAu from '@angular/common/locales/en-AU'
...
registerLocaleData(localeEnAu)
...