翻譯 Firefox OS Apps (下集)

作者:
瀏覽:421

可於此觀看上集

L10n 指令碼

Firefox OS 大多數的預設 Apps,均使用類似下列指令碼的標籤而載入 L10n.js 函式庫:


 

若要在自己的 Apps 中使用此函式庫,則必須將 l10n.js 檔案複製到本端專案並更改來源屬性。

載入完畢後,L10n.js 函式庫隨即具備「navigator.mozL10n」物件,讓用戶端順利進行翻譯作業。

mozL10n 最常用的函式與屬性另列於下。

 

get 函式

「get」函式可針對目前語言而取得已翻譯的字串。此函式將使用 1 組鍵值參數與 1 組選填的 args 參數。鍵值參數將指定語系檔所定義的鍵值。

navigator.mozL10n.get("mylabel")

針對內含參數的字串,則 args 參數可傳送 1 組 JSON 格式的參數。

//properties file
welcome = Welcome {{user}}!

//JavaScript
alert( navigator.mozL10n.get(“welcome”,  { user: "Martin" }));

localize 函式

「localize」函式可添加翻譯屬性,以動態方式建立內容。此函式將使用 id 參數、元素參數、選填的 args 參數。元素參數將指定應翻譯的元素。id 參數則指定 L10n-based 的屬性 id,以利指派至元素。選填的 args 參數則可建立 data-l10n-args 屬性並設定其 JSON 值。

var button2 = document.querySelector("#button2");
if (button2) { 
    button2.onclick = function () {
        var myElement = document.createElement('span');
        var lblTxt =document.createTextNode("My Label");
        myElement.appendChild( lblTxt );
        navigator.mozL10n.localize(myElement, 'label3'{ arg: "myarg" });
        document.body.appendChild(myElement);
    }
};

如此將形成下列 HTML:

 My Label

另可立刻翻譯其他文字。

ready 函式

在目前文件翻譯完畢之後,可用「ready」函式定義回呼 (Callback)。

var button1 = document.querySelector("#button1");
if (button1) { 
    button1.onclick = function () {                
        navigator.mozL10n.language.code = "fr";
        navigator.mozL10n.ready( function() {
            alert(navigator.mozL10n.get("button1"));
        });        
    }
};

language 屬性

「language」屬性包含 1 組語言代碼所用的 Getter 與 Setter,且同樣有 1 組 Getter 可支援由右至左 (阿拉伯文與希伯來文) 與由左至右的語言。

var mycode = navigator.mozL10n.language.code;
navigator.mozL10n.language.code = "fr";
navigator.mozL10n.language.direction //returns rtl or ltr

L10n_Date 指令碼

針對日期與時間的調整,Gaia 應用程式則透過 l10n_date.js 函式庫而延伸了 L10n.js 的功能。就 l10n.js 函式庫來說,其建置的某些功能並無法相容於所有瀏覽器。你同樣可到 Gaia 的原始碼中找到此函式庫,並使用本文 L10n.js 段落所提過的相同屬性結構。只要是使用此函式庫的 Gaia Apps,均必須透過共享的語系檔集合與 date.ini 檔案,才能匯入特定語言的語系檔。Gaia 的原始碼也提供此 date.ini 檔案;另可至 https://github.com/mozilla-b2g/gaia/tree/master/shared/locales/date directory 找到特定語言的語系檔。針對一個禮拜是以哪天起算、簡短日期的格式、各月份的名稱等,均是透過這些語系檔所定義。若要在自己的 Apps 中使用這些函式庫,則需將所有檔案複製到特定專案中。而 ini 與指令碼檔案均以類似方式載入到 L10n.js 函式庫。


若使用的函式為 L10n_date 函式庫的格式,語系檔中的字串即可使用標準的 C++ 日期/時間格式程式碼。若以此為範例來檢查 Gaia Clock App 的語系檔,則該檔案在 en-US 語言中,應包含下列 dateFormat 的輸入項。

dateFormat = %A, %B %e

若使用 L10n_Date 函式庫中的 formatLocale 函式,就會回傳:
“Full Weekday Name” “Full Month Name” “Day of the Month” (Thursday January 29)。此語系檔的法文版本將以下列順序定義相同的鍵值:

dateFormat = %A %e %B

如此將產生:
“Full Weekday Name” “Day of the Month” “Full Month” (jeudi 25 janvier)。

 

只要納入 L10n_Date 函式庫,mozL10n 物件 (navigator.mozL10n.DateTimeFormat()) 即可使用新的函式。一旦將此物件實體化 (Instantiated) 之後,就有多個可翻譯日期的函式。最好用的函式如下:

localeFormat 函式

「localeFormat」函式將使用 1 組日期物件參數與 1 組格式參數,且將回傳符合指定格式的日期。此函式應搭配 L10N.js 的 get 函式,形成翻譯日期的格式。

button3.onclick = function () {
    navigator.mozL10n.language.code = "fr";
    navigator.mozL10n.ready( function() {
        var d = new Date();
        var f = new navigator.mozL10n.DateTimeFormat();
        var format = navigator.mozL10n.get('dateFormat');
        var formatted = f.localeFormat(d, format);
        alert( formatted );
    });    
}

 

localeDateString、localeTimeString、localeString 函式

這 3 組函式屬於 localeFormat 函式的變化。localeFormat 函式將根據日期語系檔中的下列鍵值,進而回傳既定的日期格式:

//en-US
//localeString returns
dateTimeFormat_%c = %a %b %e %Y %I:%M:%S %p
//localeDateString returns
dateTimeFormat_%x = %m/%d/%Y
//localeTimeString rerturns
dateTimeFormat_%X = %I:%M:%S %p

fromNow 函式

「fromNow」函式將使用 1 組日期/時間參數,並回傳 1 組特定語言格式的字串,藉以呈現「目前的日期/時間」與「參數所傳入的日期/時間」的時間差。而此字串將使用日期語系檔中定義的格式。例如:

//Executed on 7/25/2013 12:11:00
var d = new Date("July 25, 2013 11:13:00");
var f = new navigator.mozL10n.DateTimeFormat();
alert( f.fromNow(d));

若是 en-US 語言,將會發出「58 Minutes Ago」的警示。字串另將依照日期語系檔中的「minutes-ago-long」格式而定。

minutes-ago-long={[ plural(value) ]}
minutes-ago-long[zero] = just now
minutes-ago-long[one] = a minute ago
minutes-ago-long[two] = {{value}} minutes ago
minutes-ago-long[few] = {{value}} minutes ago
minutes-ago-long[many] = {{value}} minutes ago
minutes-ago-long[other] = {{value}} minutes ago

 

 快來加入我們!

若要進一步了解翻譯實例,可參閱 Mozilla 開發者社群網站 (Mozilla Developer Network,MDN) 中的《Creating localizable web applications》一文。

在你翻譯自己的 Firefox OS Apps 之後,會不會想協助 Firefox OS 的翻譯呢?快從這裡取得相關的貢獻資訊

 

原文鏈結:https://hacks.mozilla.org/2013/08/localizing-firefox-os-apps/