Go Revel - i18n(國際化)

##Messages `Messages`信息是對內容提供翻譯的外部文本片斷。revel提供了組織每一種語言文本片斷的message文件、自動區域查找、基於cookie覆蓋的消息嵌套和參數。 術語表: Locale: 語言和區域的組合,表示一個用戶首選語言, 例如 en-US Language: 一個區域的語言部分, 例如 en. 預期爲 ISO 639-1 編碼 Region: 地區, 例如. US. 地區預期爲 ISO 3166-1 alpha-2 編碼 ##示例程序 revel處理message文件和國際化和其餘的web框架差很少,在`revel/samples/i18n`示例中能夠了解詳盡的使用方法。 ##Message文件 `Messages`被定義在message文件,這些文件的message文本將被用於渲染模板(或程序中其餘所指望的地方)。 建立一個新的meesage文件,須要記住一下幾點: 一、全部message文件應當存儲在程序根目錄下的`meesages`目錄中 二、文件擴展名必須是當前語言的 ISO 639-1 編碼 三、message文件應當是`UTF-8`編碼. 雖然這不是強制要求,但這是最佳實踐 四、沒一個message文件其實是`goconfig`格式的文件,它支持`goconfig`的全部功能 ##組織Message文件 Message文件對名稱沒有任何限制,只要具備有效的擴展名。每一種語言也沒有限定Message文件的數量。在程序啓動時,revel會解析`messages`目錄中全部的文件,並按它們的語言分別合併到一塊兒。這意味着能夠按本身想要的方式來組織message文件。 例如,按傳統的方式每一種語言定義單獨的message文件: /app /messages messages.en messages.fr ... 或者另外一種方法,同一種語言按類型建立多個不一樣的message文件: /app /messages labels.en warnings.en labels.fr warnings.fr ... 注意,在同一語言中定義相同鍵的多個message,這樣雖然在技術上是可行的,但會帶來不可預知的行爲。在同一種語言使用多個message文件時,注意保持鍵的惟一,省得被後面同名key的值覆蓋。 ##Message鍵值對 message文件本質上是一個`goconfig`文件,這意味着它必須嚴格的遵照鍵值對格式: key=value 例如: greeting=Hello greeting.name=Rob greeting.suffix=, welcome to Revel! ##分段 一個 `goconfig`文件能夠備份爲若干段,默認段老是存在幷包含沒有被定義進任何分段的鍵值對。例如: key=value [SECTION] key2=value2 Message文件的全部message應被定義進默認分段,除非他們屬於這個語言的某個特定`Region`地區。 ##地區 特定區域的message應以相同的名稱定義在不一樣的分段中。假如,要對全部英語用戶說"你好",英國用戶應爲"Hey",美國用戶應爲"Howdy",爲了作到這點,咱們定義以下message文件: greeting=Hello [GB] greeting=Hey [US] greeting=Howdy 若是用戶已經定義了本身的首選語言,revel會自動的使用相應語言來「問好」。 只有在特定狀況下,用戶的區域被明肯定義爲`en-GB`或`en-US`,問候消息纔會使用特定的message解決。 若是一個Meesage定義在一個無效的分段裏,雖然技術上可行,可是它們永遠不會被使用。 ##引用和參數 **引用** Meesage文件中的message,能夠引用其餘message。這使得用戶能夠從一個或多個Message組成一個單一的message。引用其餘message的語法爲`%(key)s`。例如: greeting=Hello greeting.name=Rob greeting.suffix=, welcome to Revel! greeting.full=%(greeting)s %(greeting.name)s%(greeting.suffix)s 注:goconfig文件支持引用,因爲message文件支持合併,因此能夠從其餘相同語言的message文件進行引用。 **參數** Message支持一個或多個參數。參數使用go `fmt`包中一樣的規則解析。例如: greeting.name_arg=Hello %s! 參數按照給定的順序來解析。 ##解析客戶端語言環境 爲了弄清楚客戶端的首選語言,revel會在如下地方尋找: 一、語言cookie revel會在沒一個請求的cookie中尋找程序配置的i18n字段(`i18n.cookie`),若是找到,那麼這個字段的值就被認爲是客戶端當前的語言環境。 二、`Accept-Language`請求頭 revel會自動解析每一個請求頭中的`Accept-Language`, 每一個`Accept-Language`都會被保存在`Request`實例中,用於在之後的各類message函數中肯定當前語言環境。 三、默認語言 當上面全部的方法都沒有正確查找到客戶端的語言環境時,revel會將程序配置文件中定義的`i18n.default_language`值做爲默認語言。 當請求的message沒法獲得時,會返回一個包含原始信息的特定字符串。 注:每次請求的`Accept-Language`請求頭都會被解析並存儲在`Request`實例中,即便cookie中已經定義了語言。在這種狀況下,它的值雖然不會被message解析函數使用,但咱們仍然能夠在程序中使用它。 **獲取當前的語言環境** 程序能夠經過`Request.Locale`從當前的請求中獲取被設置的語言環境。 例如: func (c App) Index() revel.Result { currentLocale := c.Request.Locale c.Render(currentLocale) } 在模板中,能夠從傳入的`renderArgs`對象獲取當前語言環境:

Current preferred locale: {{.currentLocale}}web

##解析`Accept-Language`HTTP頭 若是程序要訪問`Accept-Language`HTTP請求頭,能夠經過controller的`Request`實例來得到。`AcceptLanguages`是一個`AcceptLanguage`的切片對象,包含了從相應的頭字段中解析出來的值,按其含義的標識價值來排序。 func (c App) Index() revel.Result { // 得到 AcceptLanguages的字符串表示 c.RenderArgs["acceptLanguageHeaderParsed"] = c.Request.AcceptLanguages.String() // 得到最有價值的 AcceptLanguage 實例 c.RenderArgs["acceptLanguageHeaderMostQualified"] = c.Request.AcceptLanguages[0] c.Render() } ##解析Message Message能夠從任意一個controller或view視圖模板解析。 **Controller** 任何控制器都有`Message(message string, args ...interface{})`方法來說message解析爲當前語言。如: func (c App) Index() revel.Result { c.RenderArgs["controllerGreeting"] = c.Message("greeting") c.Render() } **模板** 在模板中,可使用模板函數`msg`來說message解析爲當前語言:

Greetings without arguments: {{msg . "greeting"}}cookie

Greetings: {{msg . "greeting.full.name" "Tommy Lee Jones"}}app

注:模板函數`msg`的簽名爲 `msg . "message name" "argument" "argument"`,若是沒有參數,則不會解析任何message。 ##配置 文件 屬性 描述 app.conf i18n.cookie cookie中語言字段的名稱. 應當加上revel前綴避免衝突. app.conf i18n.default_language 在沒有任何首選語言的狀況下所使用的默認語言.
相關文章
相關標籤/搜索