使用GetText實現RoR應用的中文化「轉」

1. 安裝ruby GetText
gem install gettext

2. 修改config/environment.rb文件,加入代碼:
require ’gettext/rails’ 

3.在ApplicationController的類聲明後加入對init_gettext的調用。參數是一個字符串,一般取項目名稱(後面要用到的po和mo文件的文件名)。如:
class ApplicationController < ActionController::Base
  init_gettext "depot"
end

4.新建lib/tasks/gettext.rake文件,代碼如下:
desc "Update pot/po files."
task :updatepo do
  require 'gettext/utils'
  GetText.update_pofiles("depot", Dir.glob("{app,lib,bin}/**/*.{rb,rhtml}"), "depot 1.0.0")
end

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

5. 修改rb和rhtml文件,用“_()”調用代替裸字符串。無論是在rb還是rhtml文件中,都通過“_()”函數得到多語言化的字符串。
_()函數的參數可以是任意的英文句子
model中validation的錯誤信息:
ruby 代碼
  1. validates_presence_of :title:message => N_(“can’t be empty!”)   
注:這裏要用"N_()",而不是"_()"
作爲主語的屬性名稱不用寫,gettext會自動將屬性名加在開頭。否則,可以用"%{fn}”代入屬性名。GetText會查詢數據庫,自動產生屬性名稱的字符串,產生規則是:"類名|屬性名"。如果屬性名是由下劃線分隔的多個單詞,則將下劃線替換爲空格,第一個單詞的首字母大寫,其餘單詞全部小寫。
例如User類的name屬性,對應的是"User|Name","created_at”屬性對應"User|Created at"。

在錯誤信息中還可以用"%d"代表validates_*中的某些參數,如:
ruby 代碼
  1. alidates_length_of :description:minimum => 10, :message => N_(“%{fn} is too short (min is %d characters)”)    

6.在項目的根目錄下創建目錄"po”,然後在"po"目錄下爲沒一種語言創建一個目錄(中文一般用"zh")。如果選擇語言的過程完全由應用自己控制的話,目錄名不遵循標準也沒有關係。

7.執行rake任務,生成pot和po文件。
rake updatepo
GetText會檢查項目load路徑中的所有的rb和rhtml文件,蒐集調用"_()"或"N_()"的所有地方的參數,生成後綴爲pot的文件,存放在po目錄下,以及後綴爲"po"的文件,在每一種語言的目錄下各放一份。pot和po文件的文件名前綴就是前面調用"init_gettext"時的參數。所以如果在application.rb中寫"init_gettext ‘depot’”的話,生成的文件就是"depot.pot”和"depot.po"。

8.翻譯po文件。可使用poedit

9.執行rake任務,生成mo文件。
rake makemo
該任務會在項目的根目錄下生成locale目錄(locale\zh\LC_MESSAGES\depot.mo)。mo文件是二進制文件,是GetText在運行時真正要用的。

10.設置語言。
request參數lang
http://localhost:3000/admin/?lang=zh

Cookie lang的值
class ApplicationController < ActionController::Base
  before_init_gettext :default_locale
  def default_locale
    if (cookies["lang"].nil? or cookies["lang"].empty?)
      set_locale "zh"
    else
      set_locale cookies["lang"]
    end
  end 
  init_gettext "depot"
end

設置GetText.locale
class ApplicationController < ActionController::Base
  GetText.locale = "zh"
  init_gettext "depot"
end

在view中使用set_locale方法



發佈了7 篇原創文章 · 獲贊 0 · 訪問量 1754
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章