输入信件格式
格式 ICU 带有数字、日期、复数的信件字符串,并选择占位符创建本地化信件.
概览
目标
此软件包旨在为您提供一个管理和格式化您的 JavaScript app 的字符串消息的方式, 供使用您的应用程序的人使用 。 您可以在浏览器和服务器上通过Node.js使用此软件包.
执行的依据是: 草人提案,但有些地方在执行上存在分歧.
说明: IntlMessageFormat API可能更改以保持与 ECMA-402 的同步, 但此软件包将随同 铸造。 。 。 .
如何运作
将信件作为 String 信件,或一个 预分解 AST 对象.
var msg = new IntlMessageFormat(message, locales, [formats]);
字符串 message 被解析,然后在内部以编译的形式存储,该编译的形式将优化用于 format() 用于向用户显示格式化字符串的方法.
var output = msg.format(values);
常用用法示例
一个很常见的例子是将数字带有复数标签的信息格式化. 通过这个软件包,您可以确保字符串对一个人的地盘进行适当的格式化,例如:
var MESSAGES = {
'en-US': {
NUM_PHOTOS: 'You have {numPhotos, plural, ' +
'=0 {no photos.}' +
'=1 {one photo.}' +
'other {# photos.}}'
},
'es-MX': {
NUM_PHOTOS: 'Usted {numPhotos, plural, ' +
'=0 {no tiene fotos.}' +
'=1 {tiene una foto.}' +
'other {tiene # fotos.}}'
}
};
var output;
var enNumPhotos = new IntlMessageFormat(MESSAGES['en-US'].NUM_PHOTOS, 'en-US');
output = enNumPhotos.format({numPhotos: 1000});
console.log(output); // => "You have 1,000 photos."
var esNumPhotos = new IntlMessageFormat(MESSAGES['es-MX'].NUM_PHOTOS, 'es-MX');
output = esNumPhotos.format({numPhotos: 1000});
console.log(output); // => "Usted tiene 1,000 fotos."
信件语法
这个软件包使用的电文语法不是专有的,事实上它是一种通用的标准电文语法,在编程语言之间工作,也是专业翻译所熟悉的. 此软件包使用 ICU 信件语法 为所有人服务 语言 它们有定义的复数化规则.
特征
-
支助 复数, (中文(简体) ), 选择,以及 选择顺序 消息参数.
-
使用
Intl.NumberFormat财务报告和审定财务报表Intl.DateTimeFormat分别是:. -
优化重复呼叫
IntlMessageFormat实例format()方法. -
支持定义自定义格式样式/选项.
-
支持消息语法字符的逃避序列,例如:
"\\{foo\\}"将输出 :"{foo}"在格式化的产出中,而不是将其解释为一种foo参数.
使用量
Intl 依赖性
这个套装假设: Intl 全球对象存在于运行时. Intl 在所有现代浏览器中都有存在 并且有工作正在发生 整合 Intl 输入节点.js。 。 。 .
幸运的是,这是 Itl.js (英语) 混合剂! 如果您想要支持运行时间, 您需要有条件地加载多填充 Intl 尚未内置.
正在装入 Intl.js 浏览器中的多填充
如果浏览器还没有 Intl API 内置, Intl. js Polyfill 需要加载到页面上, 以及任何需要支持的地块的地块数据 :
<script src="intl/Intl.min.js"></script>
<script src="intl/locale-data/jsonp/en-US.js"></script>
注意:现代浏览器已经拥有了 Intl API 内置, 这样您可以有条件地装入 Intl.js Polyfill, 通过检查 window.Intl。 。 。 .
在节点装入 Intl.js 的多填充
如果运行时间已不存在,则有条件地需要Intl.js Polyfill. 从零点点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点零点.
if (!global.Intl) {
require('intl');
}
注意: 当在Node.js中使用Intl.js Polyfill时,它会自动加载所有被支持的地块的地块数据.
在浏览器中装入信息格式
<script src="intl-messageformat/intl-messageformat.min.js"></script>
默认情况下, Intl Message Format 有英语语言数据的船只(en) 内置至图书馆运行时间. 当您需要将数据格式化到另一个地方时,请输入其数据;例如,法语:
<script src="intl-messageformat/locale-data/fr.js"></script>
注:本套件所支持的所有200+语言都使用其root BCP 47语言标记;即第一个连字符前的部分(如果有的话).
在节点.js中装入内置信件格式
简单 require() 此软件包 :
var IntlMessageFormat = require('intl-messageformat');
注:在Node.js中,所有200+语言的数据与库一起被加载.
公共 API
IntlMessageFormat 构造器
要创建格式化信件,请使用 IntlMessageFormat 建筑师。 构造器需要三个参数:
-
消息 - 说吧 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得怎么样 - 作为格式化模式的字符串消息(或预分解AST).
-
语言 - 说吧 {String } 字符串 [ ] - 带有BCP 47语言标记的字符串,或此类字符串的数组。 如果您不提供地语, 默认地语将被使用 。 当提供一系列的地块时,检查每个项及其祖先地块,并返回第一个有已注册地块数据的地块. 见: 本地分辨率 更多细节.
-
[格式] - 说吧 {对象} - 有用户定义的格式样式选项的可选对象.
var msg = new IntlMessageFormat('My name is {name}.', 'en-US');
本地分辨率
IntlMessageFormat 使用类似于内置的本地解析过程 Intl APIs ,用于根据 locales 值传递给构造器。 该决议进程的结果可通过呼叫 resolvedOptions() 原型方法.
以下是抽象的步骤 IntlMessageFormat 解决本地值 :
-
如果没有加载额外的地籍数据, 地籍将 永远 决 议
"en"。 。 。 . -
如果缺少叶片地块的数据
"fr-FR"但这里 实值 其祖先之一的数据,"fr"在这种情况下,它的祖先将被使用. -
如果有指定地块的数据,那么该地块就会被解决;即,,
var mf = new IntlMessageFormat('', 'en-US'); assert(mf.resolvedOptions().locale === 'en-US'); // true -
已解决的地方现已正常化;例如,
"en-us"决心:"en-US"。 。 。 .
注意: 当提供数组时 locales,在找到匹配之前,该数组中的每个项目都会发生上述步骤.
resolvedOptions() 方法
此方法返回对象, 包含实例创建过程中解决的选项值 。 目前只包含 locale 属性; 示例如下:
var msg = new IntlMessageFormat('', 'en-us');
console.log(msg.resolvedOptions().locale); // => "en-US"
通知指定的地块如何是所有小写值 : "en-us",但决定并正常化为: "en-US"。 。 。 .
format(values) 方法
一旦创建了信件,则通过调用 format() 方法并传递一组 values数字 :
var output = msg.format({name: "Eric"});
console.log(output); // => "My name is Eric."
注:一个数值 必须 用于为实例构建的每条消息模式中的参数提供.
用户定义格式
定义自定义格式样式是有用的,您需要为基础格式提供一组选项;例如,以美元输出数字:
var msg = new IntlMessageFormat('The price is: {price, number, USD}', 'en-US', {
number: {
USD: {
style : 'currency',
currency: 'USD'
}
}
});
var output = msg.format({price: 100});
console.log(output); // => "The price is: $100.00"
在这个例子中,我们正在定义 USD 数字格式样式,该样式将传递给下面 Intl.NumberFormat 作为选择.
实例
多标签
此示例显示如何使用 ICU 信件语法 以定义带有复数标签的信息;例如, "You have 10 photos"数字 :
You have {numPhotos, plural,
=0 {no photos.}
=1 {one photo.}
other {# photos.}
}
var MESSAGES = {
photos: '...', // String from code block above.
...
};
var msg = new IntlMessageFormat(MESSAGES.photos, 'en-US');
console.log(msg.format({numPhotos: 0})); // => "You have no photos."
console.log(msg.format({numPhotos: 1})); // => "You have one photo."
console.log(msg.format({numPhotos: 1000})); // => "You have 1,000 photos."
注:何时 numPhotos 曾经 1000,数字格式化为正确的千位分隔符.
许可证
这个软件可以在雅虎下自由使用! BSD许可证. 见 自由文件 许可证文本和版权信息.