浅谈Ruby on Rails的国际化
视图、模型与控制器里不应使用语言相关设置与字串。这些文字应搬到在config/locales下的语言文件里。
当ActiveRecord模型的标签需要被翻译时,使用activerecord作用域:
en: activerecord: models: user:Member attributes: user: name:"Fullname"
然后User.model_name.human会返回"Member",而User.human_attribute_name("name")会返回"Fullname"。这些属性的翻译会被视图作为标签使用。
把在视图使用的文字与ActiveRecord的属性翻译分开。把给模型使用的语言文件放在名为models的文件夹,给视图使用的文字放在名为views的文件夹。
当使用额外目录的语言文件组织完成时,为了要载入这些目录,要在application.rb文件里描述这些目录。
#config/application.rb config.i18n.load_path+=Dir[Rails.root.join('config','locales','**','*.{rb,yml}')]
把共享的本土化选项,像是日期或货币格式,放在locales的根目录下。
使用精简形式的I18n方法:I18n.t来取代I18n.translate以及使用I18n.l取代I18n.localize。
使用"懒惰"查询视图中使用的文字。假设我们有以下结构:
en: users: show: title:"Userdetailspage"
users.show.title的数值能这样被app/views/users/show.html.haml查询:
=t'.title'
在控制器与模型使用点分隔的键,来取代指定:scope选项。点分隔的调用更容易阅读及追踪层级。
#这样子调用 I18n.t'activerecord.errors.messages.record_invalid' #而不是这样 I18n.t:record_invalid,:scope=>[:activerecord,:errors,:messages]