国际化在 JavaScript 中是如何工作的?

IT技术 javascript internationalization
2021-01-21 22:20:34

我想知道如何在 JavaScript 中处理国际化。我用谷歌搜索但我没有得到令人信服的答案:

  • JavaScript 是否具有对国际化的本机支持?
  • JavaScript 中的 i18n 是什么?
  • 如何处理日历、货币、日期等?

我已经阅读了JavaScript 中的国际化

4个回答

传统浏览器中的本地化支持很差。最初,这是由于ECMAScript语言规范中的短语如下所示:

Number.prototype.toLocaleString()
生成一个字符串值,该值表示根据主机环境当前语言环境的约定格式化的 Number 值。这个函数是依赖于实现的,允许但不鼓励它返回与toString相同的东西

规范中定义的每个本地化方法都被定义为“依赖于实现”,这导致了很多不一致。在这种情况下,Chrome Opera 和 Safari 将返回与.toString(). Firefox 和 IE 将返回区域设置格式的字符串,IE 甚至包含千位分隔符(非常适合货币字符串)。Chrome 最近更新为返回以千位分隔的字符串,但没有固定的小数点。

对于现代环境ECMAScript 国际化 API 规范是一个补充 ECMAScript 语言规范的新标准,为字符串比较、数字格式以及日期和时间格式提供了更好的支持;它还修复了语言规范中的相应功能。可以在此处找到介绍实现可用于:

  • 铬 24
  • 火狐 29
  • 浏览器 11
  • 歌剧15

还有一个兼容性实现Intl.js,它将在尚不存在的环境中提供 API。

确定用户的首选语言仍然是一个问题,因为没有获取当前语言的规范。每个浏览器都实现了一种获取语言字符串的方法,但这可以基于用户的操作系统语言或仅基于浏览器的语言:

// navigator.userLanguage for IE, navigator.language for others
var lang = navigator.language || navigator.userLanguage;

一个很好的解决方法是将 Accept-Language 标头从服务器转储到客户端。如果格式化为 JavaScript,则可以将其传递给 Internationalization API 构造函数,该构造函数将自动选择最佳(或第一个支持的)语言环境。

总之,你必须自己投入大量的工作,或者使用框架/库,因为你不能依赖浏览器来为你做。

用于本地化的各种库和插件:

  • 其他:

随意添加/编辑。

感谢您的出色汇编。从积极的方面来说,看起来 Mozilla 可能很快会发布一个现代的 toLocaleString()——可能是 FF28:bugzilla.mozilla.org/show_bug.cgi? id= 769871
2021-03-27 22:20:34
i18next.com现在带有建立在顶级locize.com上的翻译管理- 如果您需要解决完整的翻译过程,这可能是一个巨大的胜利 - 不仅仅是为 i18n 检测您的代码。加上有一个很好的上下文编辑器功能......
2021-04-03 22:20:34
感谢所有做出贡献的人;我从来没有想过我可以通过阅读我的旧答案学到一些东西。我很高兴在那里看到 Internationalization API 规范的更新,这真的很棒,我刚在 Chrome 中试驾了它。
2021-04-10 22:20:34

Mozilla 最近发布了很棒的 L20n 或本地化 2.0。用他们自己的话说 L20n 是

一种开源的、特定于本地化的脚本语言,用于处理自然语言的性别、复数、变形和大多数其他古怪元素。

他们的 js 实现位于github L20n 存储库中。

我已经开始了一个需要本地化的项目,我们也决定使用 L20n ;)。因此,我为 RequireJS编写了 L20n 插件的第一个版本(github.com/fernandogmar/L20n-RequireJS),以防您使用 RequireJS 我希望它对您也有用。任何建议将受到欢迎。
2021-03-13 22:20:34
现在不推荐用于projectfluent.org
2021-04-12 22:20:34

其中一些是本地的,其余的可以通过图书馆获得。

例如Datejs是一个很好的国际日期库。

其余的只是语言翻译,而 JavaScript 本身就与 Unicode 兼容(以及所有主要浏览器)。

您还可以尝试另一个库 - https://github.com/wikimedia/jquery.i18n

除了参数替换和多个复数形式之外,它还支持性别,这是某些语言需要的自定义语法规则的一个相当独特的功能。