如何避免Globalize3将属性的回退转换返回到特定上下文?

我正在使用Globalize3和easy_globalize_accesors进行网站的国际化/本地化工作,现在我正在调整表单以管理具有可能翻译的字段。 假设我有一个名为Role的类:

class Role translates :name, :fallbacks_for_empty_translations => true # rest of class definition 

我这样做是因为我想显示默认翻译,如果没有翻译或在当前语言环境中为空,这可以按预期工作。
但是,在我的forms中我想要相反:我希望每个输入引用一个不同于默认语言环境的不同语言环境来显示没有值,除非在role_translations表中有该属性的值。 以下是我创建输入的方法:

  ... %> 

目前,我发生的情况是,如果我创建了一个只有默认语言环境翻译的新角色,当我想编辑角色以将翻译添加到其他语言环境时,每个输入都会显示默认翻译的值。
提前致谢

您可以在模型中实现此方法:

  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 => ... %> 

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 %> 

感觉有点肮脏的黑客攻击,但它是一个解决方案:)