Как избежать, чтобы Globalize3 возвращал резервные переводы для атрибута в конкретный контекст?
Я работаю над интернационализацией / локализацией веб-сайта с использованием Globalize3 и easy_globalize_accesors и сейчас адаптирую формы для управления полями с возможными переводами. Предположим, у меня есть класс с именем Role:
class Role
translates :name, :fallbacks_for_empty_translations => true
# rest of class definition
Я сделал это, потому что хочу показать перевод по умолчанию, если в текущей локали перевода нет или он пуст, и это работает как ожидалось.
Но в моей форме я хочу противоположного: я хотел бы, чтобы каждый вход, который ссылается на другую локаль, отличную от локали по умолчанию, не показывал никакого значения, если в таблице role_translations нет значения для этого атрибута. Вот как я создал входы:
<%= textfield 'role', "name_#{locale}", :class => ... %>
В настоящее время со мной происходит следующее: если я создал новую роль с переводом только для локали по умолчанию, когда я хочу отредактировать роль, чтобы добавить переводы в другие локали, каждый вход показывает значение перевода по умолчанию.
заранее спасибо
3 ответа
Вы можете реализовать этот метод в своей модели:
def read_translated_attribute(name)
globalize.stash.contains?(Globalize.locale, name) ? globalize.stash.read(Globalize.locale, name) : translation_for(Globalize.locale).send(name)
end
Тогда вам просто нужно явно указать входные значения в вашей форме, например так:
<%= text_field 'role', "name_#{locale}", :value => @role.read_translated_attribute(:name), :class => ... %>
Вы могли бы использовать
<%= text_field 'role', "name_#{locale}", :value => @role.name_translations[locale], :class => ... %>
Глобализация создает def globalize_fallbacks(locale)
метод, который возвращает запасные локали. К сожалению, нет простого способа настроить его, чтобы он не возвращался.
Что вы можете сделать, так это переопределить метод globalize_fallbacks, чтобы он возвращал любые локали, которые вы хотите использовать в качестве запасного. Поскольку вы на самом деле хотите отключить запасные варианты, этот метод будет
def globalize_fallbacks(locale)
[locale]
end
Таким образом, вы можете переопределить метод перед отображением формы, а затем восстановить ее. Это было бы что-то вроде
<% Model.send :define_method, :globalize_fallbacks do |locale|
[locale] # You only want this locale to be used
end %>
<%= render_form %>
<% Model.send :define_method, :globalize_fallbacks do |locale|
Globalize.fallbacks(locale) # This is globalize default behaviour
end %>
Это выглядит как грязный взлом, но это решение:)