利用 mod-i18n 幫 Ruby on Rails 作 i18n

目前的 Rails 本身並沒有設計所謂「正規」的 i18n 的方式,所以蠻多 Rails users 都寫了一些 plugins 來作 i18n, l10n, m17n 或是 g11n。在我實驗了幾個 plugins 之後,我自己是比較喜歡 mod-i18n 這個 plugin。這個 plugins 是改自 Localization 這個 plugin 的。

會喜歡 mod-i18n 的理由很簡單:

  1. 只要利用 *.yml 檔案就可以作語言檔,非常簡單
  2. 只要改兩行 code 就能讓你的 Rails app 能夠依據瀏覽器的語系來處理顯示的語言

要安裝這個 plugin,請在你的 Rails app 目錄下,輸入下列指令:
[code]
script/plugin install http://mod-i18n.googlecode.com/svn/trunk
[/code]
安裝好了之後,先把 mod-i18n 的目錄修改一下:
[code]
mv vendor/plugins/trunk vendor/plugins/mod-i18n
[/code]
然後再修改 $RAILS_APP/vendor/plugins/mod-i18n/lib/i18n.rb 然後把 lang_filter 這個 method 修改成這樣:
[code lang="ruby"]
def lang_filter
usr_lang = self.request.parameters[PARAMETER_LANG]
usr_lang ||= self.request.env['HTTP_ACCEPT_LANGUAGE'].gsub(/,.*/, '')
I18n.lang = I18n.lang?(usr_lang) ? usr_lang : :default
end
[/code]
然後,再到 $RAILS_APP/config/ 目錄下建立一個 lang 的目錄,然後在 $RAILS_APP/config/lang/ 下產生一個 zh-tw.yml 檔案,檔案內容比方說:
[code]
hello, world: 哈囉, 世界
[/code]
這樣,你就可以在 controller 中使用 _('hello, world') ,在 rhtml 中使用 <%=_ 'hello, world' %> 來輸出 hello, world 的字串,如果你的瀏覽器支援 zh-tw 的語系,那便會輸出 哈囉, 世界 了!

如果你的瀏覽器預設是使用 zh-tw 的語系,但想要換成別的語系,那就在網址列最後加上 ?lang=en-us (比方說是 en-us 語系) ,多送(可以用 GET 也可以用 POST 的方式)一個 lang 的參數,讓你的程式轉換語系。

另外,如果你要用 session 或是 cookie 的方式儲存使用者希望看到的語系(比方說我愛用英文版瀏覽器,但要看正體中文),那只要:
[code lang="ruby"]
I18n.lang = 'zh-tw'
[/code]
就可以馬上切換語系了 🙂