Revel使用文本文件提供國際化翻譯支持。Revel 支持語言翻譯文件化, 自動區(qū)域查詢, cookie重寫、嵌套的消息與參數(shù)。
en-US
。en
。 語言標(biāo)識符請參考 ISO 639-1 codes。US
。 區(qū)域標(biāo)識符請參考 ISO 3166-1 alpha-2 codes。Revel 處理消息文件和國際化的方法與其他框架類似。如果你想立馬上手, 可以參考示例程序 revel/samples/i18n
,里面包含所有的基礎(chǔ)知識。
國際化消息在消息文件中定義。這些消息在渲染視圖模板(或程序的其他地方)時使用。當(dāng)創(chuàng)建新的消息文件時,需要遵循幾個規(guī)則:
messages
目錄中。消息文件的文件名??沒有任何限制; 只要擴(kuò)展名合法就行。每種語言的文件數(shù)量也沒有限制。當(dāng)應(yīng)用程序啟動時,Revel會解析messages
語言目錄中所有的擴(kuò)展名合法的消息文件,并根據(jù)語言將它們合并。這意味著你可以自由組織你的消息文件。
例如,您可能希望采取傳統(tǒng)的方法,在一個文件中定義所有的:
/app
/messages
messages.en
messages.fr
...
或者是為每種語言創(chuàng)建多個文件,并根據(jù)分類組織他們:
/app
/messages
labels.en
warnings.en
labels.fr
warnings.fr
...
重要注意事項(xiàng): 在同一語言的多個文件中,雖然技術(shù)上可以定義相同的消息key,但是這將導(dǎo)致不可預(yù)知的行為。當(dāng)每種語言定義了多個文件時,請注意保持您的key唯一,這樣文件合并后,key將不會被覆蓋!
消息文件是一個 goconfig 文件。這意味著,消息應(yīng)按照key-value格式定義:
key=value
舉個栗子:
greeting=Hello
greeting.name=Rob
greeting.suffix=, welcome to Revel!
goconfig 文件被分成多個 sections. 默認(rèn)的段 總是存在, 并且包含未指定段時定義的消息。例如:
key=value
[SECTION]
key2=value2
key=value
消息消息被隱式放置在默認(rèn)段中,因?yàn)樗鼪]有定義在一個指定的段中。
消息文件的所有消息應(yīng)在定義默認(rèn)的段中,除非它們是用于某個特定區(qū)域(見Regions獲取更多消息)。
注意: 段是 goconfig 功能.
特定區(qū)域的消息應(yīng)當(dāng)在相同的段中定義。Region-specific messages should be defined in sections with the same name. 例如,假設(shè)我們要對所有講英語的用戶顯示 "Hello"
, 對英國用戶顯示 "Hey"
,對講美國用戶顯示 "Howdy"
。 為了做到這一點(diǎn),我們可以定義下面的消息文件 greeting.en
:
greeting=Hello
[GB]
greeting=Hey
[US]
greeting=Howdy
對于定義了英語 (en
) 作為他們的首選語言時,Revel 會將greeting
解析成 Hello
。只有在用戶的區(qū)域被明確定義的情況下,比如en-GB
或 en-US
,Revel 才會用對應(yīng)段中的消息去解析 greeting
。
重要提示: 如果定義了一個不合法的區(qū)域,技術(shù)上是允許的,但是它們永遠(yuǎn)不會被解析。
文件中的消息也可以引用其他消息。這使得用戶可以從一個或多個其它的消息組成一個單一的消息。引用消息的語法是 %(key)s
. 例如:
greeting=Hello
greeting.name=Rob
greeting.suffix=, welcome to Revel!
greeting.full=%(greeting)s %(greeting.name)s%(greeting.suffix)s
注意:
消息支持一個或多個參數(shù)。在消息中參數(shù)使用與 fmt
包相同的規(guī)則去解析。 例如:
greeting.name_arg=Hello %s!
參數(shù)按照給定的順序進(jìn)行解析,參考 解析消息.
為了找出用戶喜歡的語言環(huán)境,Revel會在以下地方查找一個可用的語言環(huán)境:
語言 cookie
對于每次請求,框架會查找應(yīng)用程序配置 (i18n.cookie
)。如果找到了,它的值被假定為當(dāng)前的語言環(huán)境。當(dāng)一個cookie已經(jīng)發(fā)現(xiàn),所有其他解析方法將被跳過。
Accept-Language
HTTP 頭
對于每次請求,Revel 會自動解析 HTTP 頭信息的 Accept-Language
。其中的每個語言環(huán)境根據(jù) HTTP 規(guī)范在當(dāng)前Request
實(shí)例中獲取和存儲。此信息用來為稍后的消息解析函數(shù)確定當(dāng)前語言環(huán)境。
更多信息請參考 Parsed Accept-Language HTTP header.
默認(rèn)語言
當(dāng)以上所有方法都沒有找到可用的客戶端語言環(huán)境時,框架將使用配置文件中定義的默認(rèn)語言i18n.default_language
。
如果有的消息解析失敗,則返回一個包含原始消息名的特殊格式的字符串。
注意: Accept-Language
頭信息 總是 被解析并保存到當(dāng)前 Request
中, 即使它已經(jīng)存在。在這種情況下,頭信息中的值即使從未被消息解析功能使用,但是仍可以在需要他們的時候使用。
應(yīng)用程序可以從Request
內(nèi)部使用 Request.Locale
屬性訪問當(dāng)前語言環(huán)境。例如:
func (c App) Index() revel.Result {
currentLocale := c.Request.Locale
c.Render(currentLocale)
}
在模板中, 就可以從 renderArgs
中的 currentLocale
變量中訪問當(dāng)前語言環(huán)境。 例如:
<p>Current preferred locale: {{.currentLocale}}</p>
如果程序需要訪問 Accept-Language
HTTP 頭信息, 可以從 Controller
實(shí)例的 Request
中獲取。 AcceptLanguages
字段(AcceptLanguage
實(shí)例的切片)包含所有從各自的頭信息中解析的值, 最合適的值是切片中的第一個。例如:
func (c App) Index() revel.Result {
// 獲取所有解析到的AcceptLanguage的字符串表示形式
c.RenderArgs["acceptLanguageHeaderParsed"] = c.Request.AcceptLanguages.String()
// 返回最合適AcceptLanguage實(shí)例
c.RenderArgs["acceptLanguageHeaderMostQualified"] = c.Request.AcceptLanguages[0]
c.Render()
}
更多信息請參考 HTTP 規(guī)范.
消息可以在 控制器 或 模板中解析。
控制器中使用 Message(message string, args ...interface{})
函數(shù)使用當(dāng)前語言環(huán)境解析消息:
func (c App) Index() revel.Result {
c.RenderArgs["controllerGreeting"] = c.Message("greeting")
c.Render()
}
在模板中使用 模板函數(shù) msg
解析當(dāng)前語言環(huán)境的消息。例如:
<p>Greetings without arguments: {{msg . "greeting"}}</p>
<p>Greetings: {{msg . "greeting.full.name" "Tommy Lee Jones"}}</p>
注意: msg
函數(shù)的簽名是 msg . "message name" "argument" "argument"
. 如果沒有參數(shù), 可以忽略。
文件 | 選項(xiàng) | 描述 |
---|---|---|
app.conf | i18n.cookie | 語言cookie的名稱。應(yīng)使用Revel cookie的前綴,以避免cookie名稱沖突。 |
app.conf | i18n.default_language | 默認(rèn)的語言環(huán)境,在沒有首選區(qū)域的情況下使用。 |
更多建議: