2008/08/12

XUL 利用 stringbundle 有效的設定訊息

在開發 XUL 應用程式時,一定會用到不少訊息,為了要做到多國語言化,也就是 i18n, 當然要把訊息抽離放在 locale/ 目錄下,底下就簡介其中的操作邏輯:

首先,看看在 locale/ 下的 *.properties 檔,以 .properties 的命名規則是extension 樣版精靈產生的,裡頭就是放一堆訊息定義字串,其範例為:

helloMessage=Hello World!
helloMessageTitle=Hello
prefMessage=Int Pref Value: %d
extensions.svgeditor.description=svg editor to create 3D model for virtual reality

注意到最後一條,依 Javascript 的語法來看,似乎是 extensions 物件下 svgeditor.description 屬性,事實上這一點在 defaults/preferences/svgeditor.js 中可以看到最後一行:
pref("extensions.svgeditor@wade.cc.chen.description", "chrome://svgeditor/locale/svgeditor.properties");

不過這用法似乎不怎麼方便,我們來看看其他地方怎麼引用這 properties 檔所定義的 helloMessageTitle 就可以知道些實作技巧:

請參考 overlay.js 有底下二行:

.this.strings = document.getElementById("svgeditor-strings");
.this.strings.getString("helloMessageTitle")

其中 svgeditor-strings 定義在 firefoxOverlay.xul:

<stringbundleset id="stringbundleset">
<stringbundle id="svgeditor-strings" src="chrome://svgeditor/locale/svgeditor.properties"/>
</stringbundleset>

也就是,透過 把整個 properties bundle 進 svgeditor-strings 元素中

不過呢,每次都像上面那樣用也頂麻煩的,可以增加一個函數如下,用起來會方便許多:

function getStr(id, args)
{
if (args && (args instanceof Array) && args.length > 0)
return document.getElementById("locale-strings").getFormattedString(id, args);

return document.getElementById("locale-strings").getString(id);
}
例如直接用 getStr("extensions.svgeditor.description") 即可,不必再宣告半天


細心的您也許有發現到 getFormattedString(),這個在 properties 檔中,等號右方的值若出現 %S(大寫的 S)的話,會被後面的 args 陣列取代,也就是第一個 %S 由 args 陣列第一個元素取代,第二個 %S 由 args 陣列第二個元素取代,依此類推。

0 意見: