Angular:如何在使用AOT时在运行时获取当前语言环境

Bac*_*tnz 7 internationalization angular

我正在编译我的项目:

ng serve --aot --i18nFile=client/locale/messages.fr.xlf --i18nFormat=xlf --locale=fr
Run Code Online (Sandbox Code Playgroud)

如何在运行时访问区域设置ID?我想根据语言环境显示/隐藏元素.

PS.我确实意识到使用JIT编译我可以简单地这样做:

providers: [ { provide: LOCALE_ID, useValue: 'fr' } ]
Run Code Online (Sandbox Code Playgroud)

但我正在寻找AOT解决方案.我也不想根据主机名或类似的东西来推断语言环境.

Bac*_*tnz 24

只需在构造函数中注入LOCALE_ID,例如

import { LOCALE_ID } from '@angular/core';

...

constructor(
  @Inject(LOCALE_ID) public locale: string
) { }
Run Code Online (Sandbox Code Playgroud)

  • @inorganik您可能会考虑删除您的评论(和答案),因为 LOCALE_ID 提供了OP所要求的内容,而您的则没有。如果用户切换角度应用程序的语言而不切换浏览器区域设置,则 window.navigator 语言将提供错误的答案。您的解决方案还将为使用应用程序不支持的区域设置的用户提供不正确的结果,否则他们更愿意使用与您作为开发人员认为默认的区域设置不同的区域设置(例如,应用程序不支持用户的语言“nl”,用户想要`de`,应用程序默认为`en`) (7认同)
  • 您可能会考虑删除此答案,因为 LOCALE_ID 无法获取用户的区域设置或语言,它是静态的 (6认同)
  • 更好的是说:*"只需在**构造函数中执行此操作**"*. (3认同)
  • 从'@ angular / core'导入{Component,Inject,LOCALE_ID}; (2认同)

ino*_*nik 19

注入令牌LOCALE_ID 提供您用户的语言或区域设置,它是静态的并且默认为'en-US'除非您为其提供不同的值 ( docs ):

providers: [{provide: LOCALE_ID, useValue: 'en-GB' }]
Run Code Online (Sandbox Code Playgroud)

这是获取用户首选语言和区域设置的方法:

  getUsersLocale(defaultValue: string): string {
    if (typeof window === 'undefined' || typeof window.navigator === 'undefined') {
      return defaultValue;
    }
    const wn = window.navigator as any;
    let lang = wn.languages ? wn.languages[0] : defaultValue;
    lang = lang || wn.language || wn.browserLanguage || wn.userLanguage;
    return lang;
  }
Run Code Online (Sandbox Code Playgroud)

  • 这并不能回答问题。问题是如何获取初始化的应用程序 LOCALE_ID 而不是浏览器的默认语言。 (5认同)
  • @inorganik,这意味着他/她不想要主机名或浏览器中的区域设置(“类似的东西”)。该应用程序正在使用他/她想要在运行时访问的特定区域设置 (LOCALE_ID)。您的解决方案不会提供这一点。 (2认同)

Tim*_*nko 10

这个问题在谷歌搜索中非常常见,所以我在这里添加另一个解决方案。如果您使用编译时翻译(Angular 的默认值),那么全局

console.log($localize.locale); // statically replaced to its value by Angular compiler
Run Code Online (Sandbox Code Playgroud)

将返回当前区域设置而不涉及依赖注入器等