September 15, 2006


[Rails 筆記] Rails Localization以文找文

Rails app 怎麼做 localization ? 好問題! 已經有人 port UNIX 上的 gettext 到 ruby 上,並有文件介紹如何與 Rails app 整合。

[安裝]
確認你有安裝 gettext,在 Ubuntu 上請用以下命令安裝:

% apt-get install gettext

安裝 libgettext-ruby1.8:

% gem install gettext

或者

% apt-get install
libgettext-ruby1.8

[建立環境]
舉例來說,如果我的 Rails app 目錄位於 /var/rails/sandbox/ 路徑下,先在該目錄下建立 po 檔案夾,裡頭包含各個你要 localize 的語言子目錄,如下:

% ls -l po
drwxr-xr-x 2 root root 4096 2006-09-15 20:21 en
drwxr-xr-x 2 root root 4096 2006-09-15 21:21 ja
drwxr-xr-x 2 root root 4096 2006-09-15 20:21 zh_CN
drwxr-xr-x 2 root root 4096 2006-09-15 21:04 zh_TW

編寫 Rakefile,如下:
require(File.join(File.dirname(__FILE__), 'config', 'boot'))

require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'

require 'tasks/rails'
require 'gettext/utils'

desc "Update pot/po files"
task :updatepo do
MY_APP_TEXT_DOMAIN = "sandbox" #sandbox 是我的 Textdomain, 你應該改成你自己的
MY_APP_VERSION = "sandbox 0.0.9"
GetText.update_pofiles(MY_APP_TEXT_DOMAIN,
Dir.glob("{app,lib}/**/*.{rb,rhtml}"),
MY_APP_VERSION)
end

desc "Create mo-files"
task :makemo do
GetText.create_mofiles(true, "po", "locale")
end

[攥寫你的程式碼]
你想要做 localize 的地方可以利用 _() 或者 N_() 函式包裝起來,如下:

<%= _("This string should be localized") %>


<%= N_("This string should be localized") %>


設定 application.rb,如下:
require 'gettext/rails'
class ApplicationController < ActionController::Base
GetText.locale = "zh_TW"
init_gettext "sandbox"
在這裡我先暫時將 locale 強制設定成 zh_TW 做測試,事實上,你可以透過幾種方法來改變語言(如果不直接設定 GetText.locale= 的話):
  • QUERY_STRING 中的 lang 參數設定。
  • Cookie 中的 lang 參數設定。
  • HTTP_ACCEPT_LANGUAGE 中的值。
  • 你也可以透過 config/routes.rb 讓某路徑對應到特定語言中,例如 /login/zh_TW/hello/ 可以對應到 zh_TW 語言中。
ActionController::Routing::Routes.draw do |map|
map.connect ':controller/:lang/:action/:id'
end

[建立 po 跟 mo 檔]
回到你的 Rails Root 路徑下,執行以下命令產生 pot 檔。

% rake updatepo

執行完後你會在 po/ 目錄下找到一份 pot 檔,檔名是你取的 Textdomain,將這份 pot 檔案翻譯後並改名成附檔名為 .po 的檔案,並放到該語言的目錄下,例如你翻譯成中文後,可以放到 zh_TW 目錄下。

翻譯完後,執行:

% rake makemo

你會發現在你 Rails app ROOT 目錄下會多個檔案夾 - locale ,在裡頭你會發現 zh_TW/LC_MESSAGES/sandbox.mo ,這就是產生的 mo 檔,有用過 gettext 的人,相信對這些流程應該不陌生。
執行你的 Rails app 後,你就可以發現你的字串都被置換了。


[參考資源]






Posted by at 天空部落 │21:54 │回應(1)引用(33)Programming
相關閱讀

引用URL

http://blog.yam.com/syshen/trackback/6447407
回應文章
你寫的比我的仔細太多了,如果 Ruby-Gettext zh_TW 翻譯部份有不好的地方還請告知。

http://blog.extremepattern.com/articles/2006/08/18/ruby-gettext-and-zh_tw
Posted by linexp at 2006-09-22 08:58:24