JavaScript 国际化 API

我很高兴地宣布,自 r197261 起,WebKit 已完全支持 JavaScript 的 ECMA-402 国际化 API。

此前,国际化功能只能通过数兆字节的库实现。现在,它已内置于浏览器中,节省了时间和带宽。

什么是国际化?

国际化使数据呈现适应用户的语言和国家/地区。

考虑以下锻炼摘要

您骑行了 1.2 小时,于 2016 年 9 月 25 日下午 2:45 开始。

您可能认为这份摘要适用于任何说英语的人。但在美国以外的地区,它可能不适用。

在英国,最佳文本是

您骑行了 1.2 小时,于 2016 年 9 月 25 日 14:45 开始。

在南非,最佳文本是

您骑行了 1,2 小时,于 2016 年 9 月 25 日下午 2:45 开始。

这些细节因语言而异,有时甚至在使用相同语言的国家/地区之间也有所不同。

如果我们提前准备好所有内容,可以手动进行预翻译。但我们将动态生成锻炼数据,因此我们需要一个 API 来即时更改数据呈现。JavaScript 国际化 API 解决了这一需求。

我们将语言和国家/地区的组合(例如“英式英语”)称为“区域设置”(locale)。

根据区域设置改变呈现方式的数据类型包括时间、日期、数字、货币和按字母顺序排列的词语。

国际化实践

国际化 API 包含两部分:便利函数和显式构造函数。便利函数封装了显式构造函数,自动处理一些细节。

便利函数适用于可能需要国际化的常见数据类型

String.prototype.localeCompare()

Number.prototype.toLocaleString()

Date.prototype.toLocaleString()
Date.prototype.toLocaleDateString()
Date.prototype.toLocaleTimeString()

您可以使用 Date.prototype.toLocaleTimeString 便利函数生成上述时间的区域设置感知变体

var date = new Date(2016, 9, 25, 14, 45);
var timeString = date.toLocaleTimeString(); // "14:45:00" in the UK

通过更多选项,您可以实现上述精确显示,并移除秒字段

var date = new Date(2016, 9, 25, 14, 45);
var timeString = date.toLocaleTimeString(
    undefined, { hour: "2-digit", minute:"2-digit" }); // "14:45" in the UK

显式构造函数提供了一种持久引用一组国际化规则的方式

Intl.Collator
Intl.NumberFormat
Intl.DateTimeFormat

如果我们计划显示大量日期,我们会保存一个日期格式化器并重复使用它

var formatter = Intl.DateTimeFormat(
    undefined, { hour: "2-digit", minute:"2-digit" }); // Persistent formatter

var date = new Date(2016, 9, 25, 14, 45);
var timeString = formatter.format(date); // "14:45" in the UK

区域设置代码

默认情况下,上述 API 会根据系统偏好设置遵守用户的区域设置。

您可能更喜欢指定区域设置。例如,如果您提供了特定于区域设置的网页内容变体,您会希望您的数据呈现方式与之匹配。

如果覆盖默认设置,我们可以指定小时计数在南非的变体

var hours = 1.2;
hours.toLocaleString("en-za"); // "1,2"

字符串代码“en-za”指定“南非英语”。此代码是 IETF BCP-47 标签。上述每个 API 都接受一个可选的区域设置标签作为第一个参数。

资源

ECMA-402 规范可在网上查阅。您还可以关注规范的未来发展