使用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方法



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值