【问题标题】:How to correctly polyfill Intl locale data如何正确填充国际语言环境数据
【发布时间】:2017-09-07 20:45:00
【问题描述】:

我对如何从Intl polyfill 实际填充某些通用语言环境数据 (CLDR) 感到有些困惑。

目前我的理解如下(如有错误请指正):

  • 现代浏览器自己传送语言环境数据(不需要任何 polyfill)
  • Intl.min 没有任何语言环境数据
  • Intl.complete 附带来自 intl/locale-data 的所有语言环境数据捆绑

由于我们只需要支持一些语言环境(比如说ende),因此明智的做法是仅捆绑Intl.min 并在需要时动态加载 CLDR(在应用启动时或用户更改语言)。

如何在需要时动态加载 CLDR 以及如何将其添加到 Intl

我已经设置了aurelia-i18ni18next,以便它们仅在需要时使用i18next-xhr-backend 加载我们的自定义翻译。我可以以某种方式挂钩并从 Intl polyfill 加载所需的语言环境吗?

  • 如果是这样,我该怎么做?如何事先检查是否有必要(新浏览器不需要它,它可能已经加载)?
  • 我是否正确假设我不必在加载语言环境后手动添加它,因为它自己会这样做(例如,intl/locale-data/jsonp/en.jsIntlPolyfill.__addLocaleData(...); 开头)?

【问题讨论】:

    标签: javascript internationalization aurelia i18next


    【解决方案1】:

    intl polyfills repo 展示了如何通过 CDN 服务以 described here 仅加载必要的 CLDR 数据

    Aurelia 自己会注意 polyfill 是否为 needed at all,唯一的例外是如果您要分发捆绑的生产版本,您必须确保该文件已包含在捆绑包中。根据您的设置/模块加载程序,这可能会有所不同。

    至于加载额外的语言环境,是的,你是对的,只是要求文件应该修补窗口对象以提供额外的翻译。 为了检查需要哪些,您可以使用数字/日期格式化程序的supportedLocalesOf method

    这样呼唤

    console.log(Intl.NumberFormat.supportedLocalesOf("de-DE"))
    

    如果浏览器具有必要的语言环境,可能会在您的浏览器中显示 ["de-DE"],否则(您可以在节点中尝试)在一个空数组中

    【讨论】:

    • 通过脚本标签从 CDN 预先加载所有 CLDR 是不可行的,因为无论实际使用哪个,这都会在页面开始时静态加载所有内容。我正在分发包含 INTL polyfill 的捆绑生产版本(到目前为止没有问题)。我仍然不知道的是:我在哪里可以“挂钩”以仅在需要时(语言更改等)动态加载 CLDR 数据?
    • 当区域设置发生变化时,Aurelia 会触发 a custom event。在该位置,您可以对缺少的语言环境进行 ajax 请求,只需确保文件已分发但未捆绑。如果您确定需要这些语言环境,请检查supportedLocalesOf 方法的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多