這篇文章主要介紹了JavaScript面對國際化編程時的一些建議,包括時區與語言編碼等一些值得注意的問題,需要的朋友可以參考下
什么是國際化?
國際化(Internationalization的縮寫是i18n——i,中間18個字符,n)是將軟件處理的能讓來自各種地方使用各種語言的用戶更簡單使用的一個過程。假定某個用戶來自某個地方說某種語言,他可能不經意間就得到一些錯誤提示。尤其是你甚至都沒有做這種假設。
?
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 28 29 30 function formatDate(d) { // Everyone uses month/date/year...right? var month = d.getMonth() + 1; var date = d.getDate(); var year = d.getFullYear(); return month + "/" + date + "/" + year; } function formatMoney(amount) { // All money is dollars with two fractional digits...right? return "$" + amount.toFixed(2); } function sortNames(names) { function sortAlphabetically(a, b) { var left = a.toLowerCase(), right = b.toLowerCase(); if (left > right) return 1; if (left === right) return 0; return -1; } // Names always sort alphabetically...right? names.sort(sortAlphabetically); }JavaScript過去的i18n支持太糟糕
傳統JS的i18n程序使用toLocaleString()方法進行格式化。結果字符串包含實現自身提供的所有細節:沒有辦法自己選擇(你確實需要那種date格式的weekday嗎?year是無關緊要的嗎?)。即使包含對應的細節,格式也可能是錯的,比如本期望是百分比但得到的是數字。而且你還不能選擇一個區域設置(locale)。
對于排序,JS提供了基本沒用的基于區域設置(locale-sensitive)的文本比較函數。localeCompare()確實存在,但是其接口根本不適合sort。而且還不允許選擇區域設置,或者排序方式。
這些限制太糟了(當我認識到時,我非常吃驚!),因為需要i18n支持(通常是金融站點用于顯示貨幣)的嚴謹web應用會把數據打包,發給服務器,服務器進行操作,然后發回客戶端。數據往返服務器僅僅為了處理貨幣的數量。Yeesh。
新的JS國際化API
新的ECMAScript國際化API大大提升了JS的i18n能力。 它提供了大家所能想到的格式化date、數字,文本排序的方式。區域設置是可選的,如果請求的區域設置不支持可以回退。格式化請求可以指定具體要包含的組件。支持自定義的百分比、有效數字、貨幣格式。開放了大量排序選項用于文本排序。如果你關心性能,首要的操作是選擇一個區域設置,然后處理選項參數,現在這個操作只會處理一次,而不是之前每次區域設置相關的操作執行時都會被執行一遍。
新聞熱點
疑難解答