2010-06-21 104 views
134

我想知道如何在JavaScript中处理国际化。我GOOGLE了,但我没有得到令人信服的答案:国际化在JavaScript中如何工作?

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

我已阅读Internationalization inside JavaScript

+0

微软最近发布了一个jQuery插件的全球化。详细信息是[here](http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx) – Adeel 2010-06-21 12:51:48

回答

149

传统浏览器对本地化的支持很差。原来,这是由于在ECMAScript语言规范短语是这样的:

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

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

对于现代环境,该ECMAScript Internationalization API spec,一个新的标准,补充了ECMAScript语言规范,提供字符串比较更好的支持,数字格式,日期和时间格式;它还修复了语言规范中的相应功能。介绍可以发现here。实现在可供选择:

  • 铬24
  • 火狐29
  • 的Internet Explorer 11
  • 剧院15

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

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

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

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

总之,你必须自己做很多工作,或使用framework/library,因为你不能依靠浏览器为你做这件事。

各种库和插件本地化:

随时添加/编辑。

+10

感谢所有贡献的人;我从来没有想过我可以通过阅读我的旧答案来学习一些东西。我很高兴看到那里的国际化API规范的更新,这真的很棒,我只是在Chrome中测试它。 – 2013-02-08 17:47:05

+0

感谢您的优秀汇编。从积极的方面来看,Mozilla可能会很快发布一个现代的toLocaleString() - 可能是FF28:https://bugzilla.mozilla.org/show_bug.cgi?id=769871 – 2014-02-04 16:05:04

+0

http://i18next.com现在带有一个建立在顶级http://locize.com上的翻译管理 - 如果您需要解决完整的翻译流程,这可能是一个巨大的胜利 - 而不仅仅是针对i18n的代码。 Plus有一个很好的Incontext编辑器功能... – jamuhl 2017-04-26 22:45:37

0

其中一些是本地的,其余的是通过库可用的。

例如Datejs是一个很好的国际日期库。对于其余的,它只是关于语言翻译,而JavaScript是本地Unicode兼容的(以及所有主流浏览器)。

+2

Datejs已过时。更好地尝试http://momentjs.com/ – jamuhl 2012-08-16 10:37:39

0

您还可以尝试其他库 - https://github.com/wikimedia/jquery.i18n

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

10

Mozilla最近发布了令人敬畏的L20n或本地化2.0。用他们自己的话说,L20n是

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

他们的js实现对github L20n repository.

+0

我已经开始了一个需要本地化的项目,我们也决定使用L20n;)。因此,如果您使用RequireJS,我已经为RequireJS(https://github.com/fernandogmar/L20n-RequireJS)提供了第一个版本的L20n插件,我希望它对您也有用。任何建议都会受到欢迎。 – 2013-07-13 18:43:56