5

我正在使用 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 => ... %> 

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

4

3 回答 3

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 => ... %>
于 2013-11-13T02:40:51.813 回答
3

你可以使用

<%= text_field 'role', "name_#{locale}", :value => @role.name_translations[locale], :class => ... %>
于 2015-03-26T13:33:08.953 回答
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 %>

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

于 2013-11-12T15:19:42.147 回答