设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

介绍JavaScript国际化API

2014-12-17 11:02| 发布者: joejoe0332| 查看: 3213| 评论: 0|原作者: douxingxiang, 开源中国七里香, daxiang|来自: oschina

摘要: Firefox 29 是在半年之前发布的,所以这篇文章有点过时了。这里我先停一会,讨论一下该桌面版附带的国际化API(已经通过所有得测试)。 大多数的实现是由Norbert Lindenberg 所写,由我审查和维护。(不久Makoto Kat ...


数字格式化

选项

  数字格式化的主要选项属性有:

  • style
    "currency", "percent", or "decimal" (默认值).

  • currency
    3字母货币代码,如USD、CHF。需要style是"currency", 不然没有意义

  • currencyDisplay
    "code", "symbol", or "name", 默认为"symbol".  "code"使用格式字符串的3字母货币代码。"symbol"使用货币符号,如$或£。"name"通常使用某些正式拼写版本的货币。(Firefox 目前仅支持"symbol", 这个问题不就就修复)

  • minimumIntegerDigits
    范围1到21(包含)的整数,默认为1。结果字符串的整数部分如果没有这么长,它前面会用0来填充。  (若这个值为2,那么3的格式化形式为“03”。)

  • minimumFractionDigits, maximumFractionDigits
    0-20(包含)的整数。结果字符串至少minimumFractionDigits, 至多maximumFractionDigits个有效数字。如果style是"currency",默认最小值跟货币有关(通常是2,很少0或者3),不然就是0。默认最大值,百分比是0,数字是3,货币的最大值跟货币有关。

  • minimumSignificantDigits, maximumSignificantDigits
    1-21(包含)的整数。如果有,它们将会覆盖上文关于整数/分数的对数字的控制,而由它们以及数字的要求长度,共同确定格式化的数字字符串中最小/最大有效数字的值。 (注意对10的倍数,有效数字可能不准确,如100,它的1,2,3位有效数字。)

  • useGrouping
    布尔值(默认true)决定格式化字符串是否包含分组分隔符(如,英语的千分隔符“,”)。

  NumberFormat还识别难懂的、大多数可忽略的localeMatcher属性。


区域化选项

  在Unicode扩展中,使用nu关键字可以使DateTimeFormat支持自定义数字系统,NumberFormat也是这样。 例如,在中国,中文的语言标签是zh-CN。 汉语十进制数字系统对应的值是hanidec。 为了格式化这些系统的数字,我们在这些语言标签上添加一些Unicode扩展:zh-CN-u-nu-hanidec。

  关于不同数字系统标识的完整信息,见NumberFormat详细说明文档


示例

  NumberFormat对象有一个 format方法,这一点和 DateTimeFormat相同。 format方法是一个有界函数,它有时可以独立于 NumberFormat使用。


  下面是在当前Firefox环境下为特定用途创建NumberFormat选项的例子。首先,我们来格式化中国大陆中文的货币格式,特别是使用汉字数字(而不是更普遍的拉丁数字)。选择"currency" style, 然后使用renminbi(yuan)的货币代码,数字分组默认,小数部分数字采用通常做法。

1
2
3
4
var tibetanRMBInChina =
  new Intl.NumberFormat("zh-CN-u-nu-hanidec",
                        { style: "currency", currency: "CNY" }); 
print(tibetanRMBInChina.format(1314.25)); // ¥ 一,三一四.二五


  或者我们来格式化美国的天然气价格,千分位有个古怪的9,用在美国英语中。

1
2
3
4
5
var gasPrice =
  new Intl.NumberFormat("en-US",
                        { style: "currency", currency: "USD",
                          minimumFractionDigits: 3 }); 
print(gasPrice.format(5.259)); // $5.259


  或者我们尝试埃及的阿拉伯语中的百分比。确定百分比有至少2个有效数字。(注意这个以及其他RTL例子可能在RTL上下文出现的顺序不一样,如٤٣٫٨٠٪ 而不是٤٣٫٨٠٪,RTL/right to left,从右到左的)

1
2
3
4
5
var arabicPercent =
  new Intl.NumberFormat("ar-EG",
                        { style: "percent",
                          minimumFractionDigits: 2 }).format; 
print(arabicPercent(0.438)); // ٤٣٫٨٠٪


  或者假设我们格式化阿富汗波斯语,我们期望至少2位的整数部分,至多2位的小数部分。

1
2
3
4
5
var persianDecimal =
  new Intl.NumberFormat("fa-AF",
                        { minimumIntegerDigits: 2,
                          maximumFractionDigits: 2 }); 
print(persianDecimal.format(3.1416)); // ۰۳٫۱۴


  最后,我们格式化巴林的阿拉伯语中的巴林第纳尔的数量。不同于大部分货币,巴林第纳尔等于1000费尔,因此我们需要三位小数位。(再次注意,不要太过相信表面的阅读顺序)?

1
2
3
4
var bahrainiDinars =
  new Intl.NumberFormat("ar-BH",
                        { style: "currency", currency: "BHD" }); 
print(bahrainiDinars.format(3.17)); // د.ب.‏ ٣٫١٧٠

整理

选项

下面是整理的主要选项属性:

  • usage
    "sort" or "search" (默认"sort"), 指定整理器(collator)的目的。(查找整理器可能比排序整理器更多考虑字符串是否相等。)

  • sensitivity/敏感性
    "base", "accent", "case", or "variant"。这个选项影响整理器对基本字符相同但是重音/变音不同的字符的敏感性。(基本字符与区域设置有关:“a”和“ä”在德语中基本字符相同,但是瑞典语中是不同的。)  "base"敏感性只考虑基本字符,忽略各种变体(如德语中“a”, “A”,和“ä”被认为是相同的)。 "accent"敏感性考虑基本字符和重音,但是忽略大小写(如德语中的“a和“A”是相同的,“ä”与两者不同)。"case"考虑基本字符和大小写,而忽略重音(如德语中的“a”和“ä”相同,而与“A”不同)。"variant"考虑基本字符、重音、大小写(如德语的“a”, “ä”和“A”均不同)。如果usage是"sort",默认"variant"; 否则与区域设置有关。

  • numeric
    默认false的布尔值,决定字符串中的数字是否被当做数字参与比较。如当做数字的排序结果可能是"F-4 Phantom II", "F-14 Tomcat", "F-35 Lightning II"; 不当做数字的结果"F-14 Tomcat", "F-35 Lightning II", "F-4 Phantom II".

  • caseFirst
    "upper", "lower", or "false" (默认)。决定比较时是否考虑大小写:"upper"把大写放在前面("B", "a", "c"), "lower"把小写放前面("a", "c", "B"), "false"完全忽略大小写("a", "B", "c")。 (注意,目前Firefox完全忽略这个属性)

  • ignorePunctuation
    默认false的布尔值。决定比较时是否忽略标点(如"biweekly"和"bi-weekly"是否相等)。

localeMatcher属性你可以忽略了。


区域相关选项

  区域的Unicode扩展部分指定的整理器主要选项是co,它选择排序操作的方式:电话本(phonebk), 字典 (dict), 还有其他

  另外,kn和kf这两个key可以选择拷贝选项对象的numeric和caseFirst属性。但是并不保证可用于语言标签,而且选项比语言标签的组件更清晰。所以最好在选项内部进行调整。

  key-value对(paris)嵌入到Unicode的方式跟DateTimeFormat和NumberFormat相同; 想知道如何在语言标签中指定它们,可以查看对应的章节。


举例

  整理器Collator对象有个比较函数属性。这个函数接受2个参数x和y, 如果x<y返回负值,x>y返回正值,x==y返回0。对于格式化函数,比较是个有界函数(bound function),可以抽取出来做其他用途。

  我们尝试来给德国德语的姓氏进行排序。德语中实际上有2种排序方式,电话本和字典。电话本排序强调读音,比如“ä”, “ö”等近似被扩展成“ae”, “oe”等。

1
2
3
4
5
6
7
var names =
  ["Hochberg""Hönigswald""Holzman"]; 
var germanPhonebook = new Intl.Collator("de-DE-u-co-phonebk"); 
 
//就像对["Hochberg", "Hoenigswald", "Holzman"]排序
//   Hochberg, Hönigswald, Holzman
print(names.sort(germanPhonebook.compare).join(", "));

有些德语单词使用变音符进行词形变化,所以在字典中排序会忽略变音符(除了两个单词仅仅变音符不同:schonschön)。

1
2
3
4
5
var germanDictionary = new Intl.Collator("de-DE-u-co-dict"); 
 
//就像对["Hochberg", "Hoenigswald", "Holzman"]排序
//   Hochberg, Hönigswald, Holzman
print(names.sort(germanDictionary.compare).join(", "));

  或者我们来对美国英语的Firefox的版本进行排序,这些字符串故意打错(大小写不同,随机重音,变音标记,额外的连字符)。我们希望根据版本号进行排序,所以要做numeric排序,这样字符串中的数字才会作为数字参与比较,而不是逐字符的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var firefoxen =
  ["FireFøx 3.6",
   "Fire-fox 1.0",
   "Firefox 29",
   "FÍrefox 3.5",
   "Fírefox 18"]; 
var usVersion =
  new Intl.Collator("en-US",
                    { sensitivity: "base",
                      numeric: true,
                      ignorePunctuation: true }); 
 
// Fire-fox 1.0, FÍrefox 3.5, FireFøx 3.6, Fírefox 18, Firefox 29
print(firefoxen.sort(usVersion.compare).join(", "));

  最后,我们来做跟区域有关的字符串查找,查找忽略大小写和重音,并用于美国英语。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Comparisons work with both composed and decomposed forms.
var decoratedBrowsers =
  [
   "A\u0362maya",  // A͢maya
   "CH\u035Brôme"// CH͛rôme
   "FirefÓx",
   "sAfàri",
   "o\u0323pERA",  // ọpERA
   "I\u0352E",     // I͒E
  ]; 
var fuzzySearch =
  new Intl.Collator("en-US",
                    { usage: "search", sensitivity: "base" }); 
function findBrowser(browser)
{
  function cmp(other)
  {
    return fuzzySearch.compare(browser, other) === 0;
  }
  return cmp; 
}  
print(decoratedBrowsers.findIndex(findBrowser("Firêfox"))); // 2 
print(decoratedBrowsers.findIndex(findBrowser("Safåri")));  // 3 
print(decoratedBrowsers.findIndex(findBrowser("Ãmaya")));   // 0 
print(decoratedBrowsers.findIndex(findBrowser("Øpera")));   // 4 
print(decoratedBrowsers.findIndex(findBrowser("Chromè")));  // 1 
print(decoratedBrowsers.findIndex(findBrowser("IË")));      // 5


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部