在Rails翻译文件中使用HTML

51

我在我的Rails应用程序中有一些翻译(config/locale/[en|de].yml),我使用以下方式在视图中使用:<%=t "teasers.welcome" %>。例如:

teasers:
    welcome: "<strong>Welcome</strong> to the Website ..."

在Rails 2.3.8中,这个功能可以正常工作,但在Rails 3中,HTML被转义并翻译为&lt;。我该如何防止这种翻译并在我的翻译文件中使用HTML,就像在Rails 2.3.8中一样?
2个回答

115

除了使用raw之外,还有另一种未记录(但官方支持)的方法来实现此目的。所有以_html结尾的键都会自动呈现为未转义的形式。

将键重命名为

teasers:
    welcome: "<strong>Welcome</strong> to the Website ..."
teasers:
    welcome_html: "<strong>Welcome</strong> to the Website ..."

15
确实有记录,这里是链接:http://guides.rubyonrails.org/i18n.html#using-safe-html-translations。 - ramontiveros
不适用于属性错误信息 - Aaron Breckenridge

47

我想这是因为做

<%= t("blah") %>

在Rails 2.x中,现在相当于执行以下操作:
<%=h t("blah") %>

当您使用Rails 3时。

发布说明中:

启用默认开启的XSS转义 以保护Rails。

为了修复此问题,再次引用发布说明:

您不再需要调用h(string)来转义HTML输出,所有视图模板都默认开启。如果您想要未转义的字符串,请调用raw(string)。

所以只需替换

<%= t("blah") %>

通过

<%= raw t("blah") %>

14
传统的做法是使用以“_html”结尾的键。 - Simone Carletti
4
如果您将动态数据添加到翻译中,例如使用<%= raw t "welcome", name:user.name %>,请务必小心。如果用户将“name”值设置为某些JavaScript代码,则可能出现XSS攻击。 - Yoko

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