如果一個應用程式在設計時,可以在不修改應用程式的情況下,根據不同的使用者直接採用不同的語言、數字格式、日期格式等,這樣的設計考量稱為國 際化(internationalization),簡稱i18n(因為internationalization有18個字母)。
國際化的重要觀念之一是地區(Locale)資訊,地區資訊代表了特定的地理、政治或文化區,地區資訊可由一個語言編碥(Language
code)與可選的區域編碼(Country code)來指定,其中語言編碼是
ISO-639
定義,由兩個小寫字母代表,例如"ca"表示嘉泰羅尼亞文(Catalan),"zh"表示中文(Chinese)。區域編碼則由兩個大寫字母表示,定義
在ISO-3166,
例如IT表示義大利(Italy)、TW表示台灣(Taiwan)。
Rails中地區(Locale)資訊可使用字串設定,若要同時指定語言與區域,慣例上使用-區 隔,例如"zh-TW",應用程式預設的地區設定可用I18n.default_locale取 得,如果沒有作任何設定,預設是"en",可設定 config/application.rb中的config.i18n.default_locale選 項來指定。例如:
config.i18n.default_locale
= "zh-TW"
應用程式採用的地區資訊由I18n.locale決定,預設值與I18n.default_locale相
同,也就是"en"。
地區資訊要搭配翻譯詞彙檔來使用,預設翻譯詞彙檔的載入路徑為config/locales,例如應用程式預設會有個en.yml如下:
- en.yml
# Sample localization file for English. Add more files in this directory for other locales.
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
en:
hello: "Hello world"
舉例來說,如果要在畫面上呈現多國語言,可以如下使用I18n.t方法指定字串或Symbol:
<%=t :hello
%>
如果I18n.locale的值是"en",那麼就會尋找en.yml中hello:的對應伺彙,假設你有個zh-TW.yml:
- zh-TW.yml
zh-TW:
hello: "哈囉!世界!"
如果你設定I18n.locale為"zh-TW", 那麼就會尋找zh-TW.yml中hello:對應詞彙。
其實yml主檔名無關緊要,主要是yml第一層要對應地區設定,才有辦法找到對應詞彙。如果找不到對應詞彙,那就會直接使用指定的Symbol,例如:hello就 顯示Hello,如果是:hello_world就會顯示Hello World,如果想指定沒有對應詞彙時的預設詞彙,可以使用:default:
<%= t :hello,
:default => "Hello!" %>
:default也可以設定尋找順序。例如找不到:hello就尋找:hi,要不然就使用最後指 定的文字:
<%= t :hello, :default => [:hi, "Hello!"] %>
I18n.t方法可以直接指定:locale選項。例如:
<%=t
:hello, :locale => "en" %><br>
<%=t :hello, :locale => "zh-TW"%><br>
<%=t :hello, :locale => "zh-GB" %><br>
如果也存在著"zh-GB"對應翻譯詞彙,這會顯示如下的結果:
如果你如下撰寫:
- en.yml
en:
hello: "Hello %{name}"
那麼I18n.t方法可以直接如下指定%{name}的 文字: