根据浏览器语言设置角度LOCALE_ID

问题描述 投票:2回答:2

我正在尝试在多语言应用程序中使用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 $1;
  }

  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。我错过了什么?那是实现这一目标的正确方法吗?

我从以下方面启发了自己:-How to set locale in DatePipe in Angular 2?-Browser language detection

angular kendo-ui localization kendo-ui-angular2
2个回答
1
投票

也许您应该使用FactoryProvider来实例化您的可注射对象并返回语言环境值,例如:

providers: [
    {
      provide: LOCALE_ID,
      useFactory: (localeService: LocaleService) => {
        console.log('locale ID', localeService.language);
        return localeService.language;
      },
      deps: [LocaleService]
    }
  ],

请参见this related question


0
投票

以下内容对我有用(代码已添加到providersapp.module列表中:]

    {
        provide: LOCALE_ID,
        useValue: navigator.language,
    },

我也在导入和注册支持的语言环境,不确定是否有必要:

import { registerLocaleData } from '@angular/common'    
import localeEnAu from '@angular/common/locales/en-AU'
...
registerLocaleData(localeEnAu)
...
© www.soinside.com 2019 - 2024. All rights reserved.