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

В настоящее время со мной происходит следующее: если я создал новую роль с переводом только для языкового стандарта по умолчанию, когда я хочу отредактировать роль, чтобы добавить переводы на другие языковые стандарты, каждый ввод показывает мне значение перевода по умолчанию.
заранее спасибо


person Rene Hernandez    schedule 05.11.2013    source источник


Ответы (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 => ... %>
person rabusmar    schedule 13.11.2013

Вы могли бы использовать

<%= text_field 'role', "name_#{locale}", :value => @role.name_translations[locale], :class => ... %>
person Rune Schjellerup Philosof    schedule 26.03.2015

Globalize создает 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 %>

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

person Brenes    schedule 12.11.2013
comment
define_method во время выполнения плохо влияет на счетчик глобального кэша метода. По сути, вызов define_method заставляет заново искать каждый метод, чтобы увидеть, где он должен быть определен. Плохо для производительности! - person jakeonrails; 03.02.2015
comment