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

时间:2013-11-05 20:20:29

标签: ruby-on-rails internationalization fallback 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 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

您可以使用

<%= text_field 'role', "name_#{locale}", :value => @role.name_translations[locale], :class => ... %>

答案 2 :(得分:0)

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

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