0

我写了一个小库来保存模型属性中的翻译内容。您所要做的就是将以下内容添加到模型中:

class Page < ActiveRecord::Base
  i18n_attributes :title, :content
end

按照惯例,数据作为散列(或 Postgres 的 hstore 散列)写入真实属性 i18n_title 和 i18n_content。许多 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_entitle_en在表单中使用的键。

locales/en.yml为etc 文件中的每个 available_locale 复制相同的翻译会非常麻烦:

activerecord:
  attributes:
    page:
      title_en: "Title"
      title_es: "Title"
      ...

我想做的是在 Rails 在启动过程中加载所有语言环境之后执行一些代码,然后克隆这些键的翻译。有没有办法做到这一点?也许是在从 YAML 文件加载翻译后调用的钩子?(当我的库加载时,翻译尚未加载。)

或者您是否看到了解决此问题的另一种方法?(我尝试为 I18n.translate 起别名,但我担心这可能会在未来引起严重的头痛。)

感谢您的提示!

4

1 回答 1

3

尽管您放弃了这种方法,但请让我分享一下我的想法:

我认为将其他语言环境字符串添加到翻译文件中以进行特定本地化并不是非常有用的。因为 aconfig/locales/$locale.yml通常开始(至少在我的情况下)

$locale:
  ...

不需要activerecord.attributes.page.title_es在英文本地化文件中。我只是把它es.yml作为activerecord.attributes.page.title.

我的意思是:这不是单独的本地化文件的全部目的吗?(或者从开发人员/翻译人员的角度来看:我应该在哪个文件中搜索、.title_esin或两者都搜索?)en.ymles.yml

于 2012-09-28T15:05:33.063 回答