Как избежать, чтобы 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 %>

Это выглядит как грязный взлом, но это решение:)

Другие вопросы по тегам