Rails 3: 在i18n表单助手翻译中使用HTML

10

我正在使用自动表单标签助手创建表单标签,并通过i18n支持进行翻译,但是我想在标签中使用HTML,但我不知道如何使其HTML安全。

例如:

en:
  helpers:
    label:
      product:
        name: 'Your Product Name <small>Try to be creative</small>'

最终结果是:
<label for="product_name">Your Product Name &lt;Try to be creative&gt;</label>

但我希望它是这样的:
<label for="product_name">Your Product Name <small>Try to be creative</small></label>

有没有办法让我指定翻译为html_safe,以便在输出之前不对其进行编码?
此外,如果我完全错误地处理了这个问题,那么这似乎是HTML设置的最语义化的方式,但我愿意听取建议。
谢谢 :)
更新:
<%= form_for @product do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
<% end %>
4个回答

15
在Rails3中,使普通键自动成为HTML安全的方法是在键名后面添加_html或.html。例如,name_html。这只适用于视图中的translate/t方法,而不是I18n.t。然而,在这里,标准表单助手并不尝试使用该版本的键,因此这种方法不起作用。
创建自己的表单构建器是一个好方法。您也可以执行以下操作:
f.label :name, t('helpers.label.product.name_html')

如果这种情况只发生在几个地方。


12
不知道你的实际助手是怎样的,但你可以使用html_safe来轻松实现这一点(前提是标签的值不会被其他用户输入)。
类似于:t("helpers.label.product.name").html_safe 如果这个方法不能工作,请提供您的helper方法的实现,或者只提供输出结果的行。
======更新======
感谢您的更新代码,现在我知道了最好的答案:D
我也不知道你是否真的想要helpers.label.product.name
但我认为还有另一种更好的方式,即定义如下:
en:
  activerecord:
    attributes:
      product:
        labels:
          name: "Your Product Name <small>Try to be creative</small>"

如果您不想构建自己的自定义表单生成器,请使用以下内容:

= f.label :name, Product.human_attribute_name("labels.name").html_safe

实际上,如果您定义自己的表单构建器,轻松重新定义标签方法以自动生成文本。


我正在使用标准的Rails助手:http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-label - Jeremy Baker
你在使用模型吗?能否把你的代码粘贴在这里? - PeterWong
我已经将使用情况添加到原始问题中。我只是使用标准的Rails表单助手来操作一个模型。 - Jeremy Baker

0

我用一个新的函数解决了这个问题,我把它放在了一个帮助文件中:

def labeltext_with_html(model,field)
  I18n.t("helpers.label.#{model}.#{field}").html_safe
end

我这样称呼它:

label(my_model, my_field, labeltext_with_html(my_model, my_field))

只需调整变量以适应您的用例。标签标记可能还需要.html_safe,具体取决于用例。


-8
另一个选项是执行以下操作:
    name: '<span>Your Product Name <small>Try to be creative</small></span>'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接