讓 Ruby on Rails 軟件國際化

, , , , at February 20th, 2007 by 小影

作為 Web 的 Framework ,國際化 (Internationalization, i18n) 是不可以不考慮的問題。可是 Ruby on Rails 仍未有如 Java Resource Bundle 的在語言層次上支援i18n。如果想要 i18n 又不想自行編寫程,可用的方案有 Ruby 的 Gettext 或 Rails 的 Globalize。兩者都是很強大的plugin,它們甚至支援 data model 層面的i18n。

可是在我的工作中我可不需要這等威力強大的工具,我只想為我簡單的軟件的輸出加入多語言的功能。我發現 th0fu 在 他的 blog mir.aculo.us 中發表了一個非常簡單但功能強大的 Localization 方案,它的優點包括:

  • 細小,只用一頁程式就為 Rails 加入 l10n 支援。
  • 簡單,它的做法是 extend 了 Object ,為它加入新的方法。使用它作l10n很簡單,只需要設定了語言,再把原本的字串 “blah”改為用 _(“blah”) 或 (在rhtml中) <%=_ “blah” %> 表達就行了。

他的概念很接近我想要的東西,在他的基礎上,我加入了以下改動:

  • 原本每種語言的翻譯也要用ruby寫一個翻譯檔,改為使用yml儲存資料
  • 利用 route 和 filter 功入動態切換語言的功能

安裝方法很簡單:
1. 把 i18n.rb 放到 /PROJECT/lib/ 下
{[.i18n /enzymes/chili-js.php]}

2. 在 /PROJECT/config/environment.rb 中加入一句:I18n.load ,這讓 I18n 讀取 yml 翻譯檔。
{[.environment /enzymes/chili-js.php]}

3. 在 /PROJECT/app/controllers/application.rb 中加入一句:before_filter I18nFilter 。目的是在處理 request 前先查看 request 的 language 再決定 i18n 的輸出。
{[.ApplicationController /enzymes/chili-js.php]}

4. 在 /PROJECT/config/lang/ 下加入yml翻譯檔。格式是基本的yaml,key: value,很易明白吧?

{[.zh-TW_yml]}

5. 在 /PROJECT/config/routes.rb 把原本的default route 更改,目的是在網址中加入語言的選項。你可以自行設定 url 的格式,只要把 lang 放到 path 下就行了。

{[.route_rb /enzymes/chili-js.php]}

6. 在 Application 中把所有字串也轉為以下格式:

{[.code_rb /enzymes/chili-js.php]}

重新啟動server後,原本的網址 http://host/PATH 要改為 http://host/LANG/URL。例如輸入 http://server/zh-TW/admin 和 http://server/en-US/admin 就可以看見兩種語言的網頁了 (如果沒有設定某個語言,或者某個語言下沒有翻譯,i18n 會自動輸出原本的 key。方便起見通常我都會以英文作 key,那就讓系統自動輸出英語了。)。

未來研究:這樣作究竟會不會有 threading 的問題?如果同時有人要求英文和中文的網頁後果會如何?對 Ruby 和 Rails的認識不足不能解答。不過現在我的 project 看不到這個問題就暫時不想了。

Edited 26 Feb 2007: Upload the project to Google Code (only 52 lines of code XD)

相關文章

  1. 3 Responses to “讓 Ruby on Rails 軟件國際化”

  2. By Takol on Jun 15, 2007 | Reply

    我依照您的方案內容,略微簡化修改成另外一個 MultiLingual,請參考 我的網頁說明

    謝謝

  1. 2 Trackback(s)

  2. Feb 20, 2007: reality » Blog Archive » 我的軟件
  3. Jun 6, 2007: reality » Blog Archive » Rails plugin: i18n

Post a Comment