2012-05-14 3 views
0

Я написал небольшую библиотеку для хранения переведенных материалов в атрибутах модели. Все, что вам нужно сделать, это добавить следующее к модели:Крючок в Rails 'I18n

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

По соглашению, данные записываются в реальных атрибутов i18n_title и i18n_content как хэш (или hstore хэш для Postgres). И ряд добытчиков и сеттера дают вам доступ к «локализованным виртуальным атрибутам»:

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 в форме.

Было бы очень громоздким повторить тот же перевод для каждого available_locale в файлах locales/en.yml и т.д.:

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

То, что я хотел бы сделать, это выполнить некоторый код после того, как Rails загрузил все локали в багажнике а затем клонировать переводы для этих ключей. Есть ли способ сделать это? Может быть, крючок, который вызывается после переводов, был загружен из файлов YAML? (Перевод еще не загружен, когда мои библиотеки загружаются.)

Или вы видите другой способ решения этой проблемы? (Я пытался переименовать I18n.translate, но я боюсь, что это может вызвать серьезную головную боль в будущем.)

Спасибо за ваши подсказки!

+0

Я отбросил этот подход, поэтому вопрос больше не уместен - по крайней мере, не для меня , – svoop

ответ

3

Хотя вы уронили этот подход, пожалуйста, позвольте мне поделиться своими мыслями:

Я не думаю, что это невероятно полезно добавить другие строки локали в файл перевода для конкретной локализации. Так как config/locales/$locale.yml обычно начинается (по крайней мере в моем случае) с

$locale: 
    ... 

нет необходимости activerecord.attributes.page.title_es в файле английской локализации. Я бы просто положил его в es.yml как activerecord.attributes.page.title.

Я имею в виду: не все ли целые отдельные файлы локализации? (Или с точки зрения разработчика/переводчика: в каком файле следует искать .title_es, в en.yml, es.yml или оба?)