Rails I18n_html后缀规则和从控制器调用的translate-helper



根据ruby文档,translate(或t)帮助程序委托给I18n#translate,但也执行几个附加功能,其中包括:;如果密钥具有后缀_html",则它将把翻译标记为安全HTML;。

我希望它在视图和控制器中都能同样工作,但根据我的经验,它没有:t(:hello_html)在视图中确实能按预期工作(将翻译标记为html_safe),但在从控制器调用时,它没有将结果标记为安全的html。

为了重现这个问题,您可以将hello_html: '<i>Hello world</i>'添加到locales/en.yml中,并将flash.now[:notice] = t(:hello_html)添加到任何控制器的任何方便操作中。对我来说,这导致在一个flash消息区域中出现一个转义的html标记,这对我来说是一个意外的结果

我的问题是:

  1. 有没有其他人经历过或能够重现这个问题
  2. 它是什么:一个rails错误,一个功能,或者只是我项目的独特之处"怪怪的"
  3. 有什么简单的方法解决这个问题吗

(在轨道3.2.11和3.2.13中测试)

考虑到过载的.t方法是在ActionView::Helpers::TranslationHelper中定义的,您对控制器不能使用此功能的看法是正确的。我认为这可能是一个疏忽,而不是一个实际的错误。

在我的脑海中,有两种方法可以在你的项目中绕过这一点:

  1. 在控制器中调用.html_safe(这在快速测试中对我有效)。

    flash[:notice] = t(:hello_html).html_safe

  2. 将翻译密钥作为闪光消息发送,而不是实际消息:

    控制器:

    flash[:translate_notice] = :hello_html

    视图:

    %div= t flash[:translate_notice]

当然,如果需要传递插值YMMV,后一个选项可能会变得有点混乱。

最新更新