2

我试图了解在使用库时自动设置语言环境并可能动态更改它的最佳实践。

在 jquery globalize 中启动和运行的要求,或者至少据我所知是:

  1. 包括所需的 JavaScript 文件
  2. 加载 CLDR 数据
  3. 设置语言环境

步骤#1超出了这个问题的范围;假设它是前进的先决条件。

第 2 步被记录为纯 JavaScript 看起来像这样,在一个示例中,它们称为“动态”加载:

$.when(
  $.get( "cldr/main/en/ca-gregorian.json" ),
  $.get( "cldr/supplemental/likelySubtags.json" ),
  $.get( "cldr/supplemental/timeData.json" ),
  $.get( "cldr/supplemental/weekData.json" )
).then(function() {

  // Normalize $.get results, we only need the JSON, not the request statuses.
  return [].slice.apply( arguments, [ 0 ] ).map(function( result ) {
      return result[ 0 ];
  });

}).then( Globalize.load ).then(function() {

  // Your code goes here.

});

如果我正确理解代码,它会使用一系列承诺:获取 JSON,对其进行规范化,然后通过 Globalize.load 运行它,然后执行“您的代码”。

但是,从我通常使用的词的意义上说,这不是动态的。它不响应用户输入或状态更改。您在前面说明“加载英文日历信息”。

还需要其他模块。我不相信 globalize 会“知道”您的语言目录结构,这意味着您还需要加载所有这些其他文件,并将它们以Globalize.load(JSON)一种或另一种方式传递。

然后,虽然文档有点杂乱无章,但我相信您需要设置语言环境,这将是第 3 步。

Globalize.locale( "en" )

所以最后,关于问题:

  1. 为了设置语言环境,您需要了解一种文化。从用户代理字符串或类似的字符串中提取它是一种好习惯吗?如果我没有提供检测到的语言环境,我应该手动回退到给定的语言吗?

换句话说,globalize 中是否有内置功能来处理抓取浏览器或系统文化并尝试自动使用它,还是我总是需要显式调用Globalize.locale()

  1. 我只能设置加载相应 CLDR JSON 的文化。那么在语言更改或加载时,我是否需要调用一组与示例“加载”脚本类似的调用?我不怀疑Globalize.locale(newLocale)除非加载 JSON,否则简单地调用会做任何事情。像这样的东西?:

    function changeLocale(locale) { // "validLocales" 未在此示例中显示,但可以将其想象为我在分发中明确提供 CLDR 的语言环境数组 if(validLocales.indexOf(locale) !== -1) {
    $.when( $.get( "cldr/main/" + locale + "/ca-gregorian.json" ), ).then(function() { // 标准化函数 }).then(Globalize.load).then (function(){ // 其余的东西 function(s) }); } else { // 处理无效的语言环境 }

?

这就是文档中看起来...清晰的...,但它没有像这样明确记录,所以我不确定我是否错过了我不需要的默认行为代码(因为它们已经是固有的)。

  1. 为了允许 Web 应用程序的消费者(部署它的 Web 管理员)可扩展的全球化,这是否是文档问题?“你不能只切换到‘fr’,你需要下载CLDR文件,把它们放在X目录下,然后更新‘validLocales’可配置参数,然后修改初始化脚本设置一个新的默认值?这一切似乎都相当很期待有人部署我的应用程序来承担,而不是“添加一个带有 ISO 国家代码的新语言文件,例如 fr.json”。
4

1 回答 1

1

我个人推荐使用 Globalize 构建应用程序的方式是使用 webpack 和 npm 的应用程序示例

现在,更直接地回答您的问题...

  1. 为了设置语言环境,您需要了解一种文化。从用户代理字符串或类似的字符串中提取它是一种好习惯吗?如果我没有提供检测到的语言环境,我应该手动回退到给定的语言吗?

换句话说,globalize 中是否有内置功能来处理抓取浏览器或系统文化并尝试自动使用它,还是我总是需要显式调用 Globalize.locale()?

Globalize 对应用程序应该如何做没有意见。某些应用程序可能会更好地允许其用户选择站点语言。某些应用程序可能会更好地使用用户代理信息 ( https://stackoverflow.com/a/674570/798133 )。全球化应该允许这两种用法。

  1. 我只能设置加载相应 CLDR JSON 的文化。那么在语言更改或加载时,我是否需要调用一组与示例“加载”脚本类似的调用?我不怀疑简单地调用 Globalize.locale(newLocale) 会做任何事情,除非 JSON 被加载。像这样的东西?:

    function changeLocale(locale) { // "validLocales" 未在此示例中显示,但可以将其想象为我在分发中明确提供 CLDR 的语言环境数组 if(validLocales.indexOf(locale) !== -1) { $.when( $.get( "cldr/main/" + locale + "/ca-gregorian.json" ), ).then(function() { // 标准化函数 }).then(Globalize.load).then (function(){ // 其余的东西 function(s) }); } else { // 处理无效的语言环境 } ?

这就是文档中看起来...清晰的...,但它没有像这样明确记录,所以我不确定我是否错过了我不需要的默认行为代码(因为它们已经是固有的)。

你是对的。Globalize.locale(<locale>)除非预先加载了正确的数据(通过使用Globalize.load()加载数据本身或使用预编译的格式化程序和解析器以获得最佳性能),否则不会做任何事情。所以,是的,应用程序开发人员必须处理这个问题。

我之前提到的使用 webpack 和 npm的应用程序示例负责加载数据并自动生成用于生产的最佳捆绑包。显然,Globalize 允许其他几种安排或用法。如果您有任何其他/更具体的问题,请告诉我。

为了允许 Web 应用程序的消费者(部署它的 Web 管理员)可扩展的全球化,这是否是文档问题?“你不能只切换到‘fr’,你需要下载CLDR文件,把它们放在X目录下,然后更新‘validLocales’可配置参数,然后修改初始化脚本设置一个新的默认值?这一切似乎都相当很期待有人部署我的应用程序来承担,而不是“添加一个带有 ISO 国家代码的新语言文件,例如 fr.json”。

绝对地。我相信我们可以对文档和展示我们使用 Globalize 的 Web 应用程序最佳实践的示例做更多的改进。使用 webpack 和 npm 的应用程序示例是我们最近进行的更新,我相信这与您的问题非常相关。只要让我知道任何问题。

于 2015-09-10T15:16:25.617 回答