??? 這兩天花了點時間看 Dojo 0.3.1 的新功能, 發現Dojo果然兌現承諾, 在0.3.1加入了一點國際化支持的功能。最主要的是改動是引進了 dojo.locale 屬性和 dojo.i18n 包, 從而于 javascript 實現了Client端的本地 message bundle 機制,從現在起,我們可以在客戶端根據locale裝載JS消息文件了! 完整的示例代碼如下:
<script?type="text/javascript">????????????????????????
????????djConfig?=?{
????????????????isDebug:?true
????????};
</script>
<script?type="text/javascript"?src="../../dojo.js"></script>
<script?type="text/javascript"?src="../_bootstrap.js"></script>
<script?type="text/javascript">
????????dojo.locale?=?"fr";
????????dojo.requireLocalization("g11n.messages","salutations","en");
????????dojo.requireLocalization("g11n.messages","salutations","fr");
????????dojo.requireLocalization("g11n.messages","salutations","zh-cn");
????????dojo.require('dojo.i18n.common');????????
</script>
<script?type="text/javascript">
????????function?init()?{
????????????????var?salutations_default?=?dojo.i18n.getLocalization("g11n.messages",?"salutations");
????????????????dojo.debug("default?language:?"+salutations_default.hello);
????????????????
????????????????var?salutations_zh?=?dojo.i18n.getLocalization("g11n.messages",?"salutations",?"zh-cn");
????????????????dojo.debug("Chinese:?"+salutations_zh.hello);????????????????
????????}
????????dojo.addOnLoad(init);
</script>
?? 首先是 dojo.locale 這個屬性,這個屬性是一個全局,作為用戶默認的locale,如果用戶不明確指定,dojo會根據瀏覽器的locale對這個屬性賦值。和Java不同,目前在dojo中locale并沒有對應對象,只是一個String對象,典型的格式應該是 "zh","zh-cn"。注意后者用的是 "-" ,而不是Java中的 "_"。
? ?
?? 現在來看最讓人心動的 message bundle 機制, 首先分成三步來把message文件組織好:
??????? 1) 要建立一個集中存放message文件的目錄,我建的是 g11n\messages;
??????? 2) 和在java中一樣,為不同的locale建立存放message文件的文件夾,比如我建的是"en","fr","zh-cn"; 這里要注意文件夾的名稱必須要全部小寫,原因是dojo從文件裝載消息會把傳入的locale屬性進行 toLowerCase() 的處理(暈,不知道作者怎么想的)。
??????? 3) 把翻譯完并用native2ascii轉換好的消息文件放入對應的文件夾內。和Java不同的是,dojo用 JSON 格式來組織message文件,所以要把property文件轉換到JSON格式的js文件, 不過這也很容易: 在文件開始的位置加入一個"{", 結尾的地方加入"}", 將所有的 "=" 替換成 ":" , 然后在每一行結尾處加入一個"," ,最后把文件改成js結尾便可以了。一個典型的JSON格式的文件如下(假設文件名叫 salutations.js ) :
{
?hello:?"Hello",
?dojo:?"Dojo",
?hello_dojo:?"%{hello},?%{dojo}!",
?file_not_found:"The?file?you?requested,?%{0},?is?not?found."
}
?
?? 把消息文件放好后,便可以在 dojo 中通過 dojo.requireLocalization() 調用這些文件了,對應的代碼是:
??????
//下載需要的locale的消息文件到客戶端
dojo.requireLocalization("g11n.messages","salutations","en");
dojo.requireLocalization("g11n.messages","salutations","fr");
dojo.requireLocalization("g11n.messages","salutations","zh-cn");
//調用國際化包
dojo.require('dojo.i18n.common');??
?
?? 現在就可以調用指定locale的 message 了!在示例代碼中我舉了兩個簡單的例子:
???
//調用?dojo.locale?指定的locale中對應的消息文件中?hello?那條消息
????var?salutations_default?=?dojo.i18n.getLocalization("g11n.messages",?"salutations");
????dojo.debug("default?language:?"?+?salutations_default.hello);
????//調用"zh-cn"中?hello?那條消息
????var?salutations_zh?=?dojo.i18n.getLocalization("g11n.messages",?"salutations",?"zh-cn");
????dojo.debug("Chinese:?"+salutations_zh.hello);?
?? 怎么樣,非常簡單吧?
??? 除了message bundle, dojo 還聲明要支持其他的一些國際化功能,比如Date,Number,Currency等等,在0.3.1中我只發現Date有一定的實現,但是基本就是對 Javascript Date 對象的幾個locale相關的方法進行了一下封裝,沒有多少實質性的提高,看來dojo在國際化的支持方面還有很長的路要走。無論如何0.3.1中提供的message bundle已經有了一個良好的開端,值得期待。