我写了一个小库来保存模型属性中的翻译内容。您所要做的就是将以下内容添加到模型中:
class Page < ActiveRecord::Base
i18n_attributes :title, :content
end
按照惯例,数据被写入真实属性i18n_title和i18n_content作为哈希(或Postgres的hstore哈希)。许多getter和setter使您可以访问“本地化的虚拟属性”:
page = Page.new
page.title_en = 'Hello'
page.title_es = 'Hola'
page.i18n_title # => { en: "Hello", es: "Hola" }
I18n.locale = :es
page.title # => "Hola"
page.title_en # => "Hello"
您也可以在表单中使用这些虚拟属性,但有一个缺点:表单生成器使用I18n来获取标签并转换属性验证错误。如果您在表单中使用activerecord.attributes.page.title_en
,它当然会查找title_en
等密钥。
为locales/en.yml
等文件中的每个available_locale复制相同的翻译非常麻烦:
activerecord:
attributes:
page:
title_en: "Title"
title_es: "Title"
...
我想要做的是在Rails加载启动过程中的所有语言环境后执行一些代码,然后克隆这些键的翻译。有没有办法做到这一点?也许是从YAML文件加载翻译后调用的钩子? (当我的lib加载时,翻译尚未加载。)
或者您是否看到了另一种解决此问题的方法? (我试图别名I18n.translate,但我担心这可能会在将来引起严重的麻烦。)
感谢您的提示!
答案 0 :(得分:3)
虽然你放弃了这种做法,但请让我分享一下我的想法:
我认为将其他语言环境字符串添加到特定本地化的翻译文件中并不是很有用。由于config/locales/$locale.yml
通常以
$locale:
...
英语本地化文件中不需要activerecord.attributes.page.title_es
。我只需将其es.yml
作为activerecord.attributes.page.title
。
我的意思是:这不是单独本地化文件的全部目的吗? (或者从开发人员/翻译人员的角度来看:我应该在哪个文件中搜索.title_es
,en.yml
,es.yml
或两者?)