我正在使用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 => ... %>
目前,我发生的情况是,如果我创建了一个只有默认语言环境翻译的新角色,当我想编辑角色以将翻译添加到其他语言环境时,每个输入都会显示默认翻译的值。
提前致谢
答案 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 %>
感觉有点肮脏的黑客,但这是一个解决方案:)