如何使轨道3 I18n翻译自动安全?

tig*_*tig 6 automation internationalization html-safe ruby-on-rails-3

我使用rails 3.有没有简单的方法告诉I18n尊重插值中使用的字符串'html safness'并默认使所有翻译的字符串html安全?所以,如果我有这个en.yml:

en:
  user_with_name: 'User with name <em>%{name}</em>'
Run Code Online (Sandbox Code Playgroud)

我使用t('user_with_name', :name => @user.name),我得到用户名html转义,但<em></em>保持原样?

onu*_*kan 6

http://guides.rubyonrails.org/i18n.html#using-safe-html-translations

官方Rails指南说你可以毫无顾虑地使用插值变量,因为它们是自动转义的html,除非你明确声明它们是String.html_safe.

从指南:

尽管如此,插值可以逃脱.例如,给定:

en:
  welcome_html: "<b>Welcome %{username}!</b>"
Run Code Online (Sandbox Code Playgroud)

您可以安全地传递用户设置的用户名:

<%# This is safe, it is going to be escaped if needed. %>
<%= t('welcome_html', username: @current_user.username %>
Run Code Online (Sandbox Code Playgroud)

另一方面,安全字符串是逐字插入的.


小智 5

将名称从更改user_with_nameuser_with_name_html,然后rails将知道您已在文本中包含html.

  • 我知道这种方式,但这是一个非常糟糕的方式:1)它没有消毒插值参数,所以我应该这样做,或者我可以进入警告2)我需要添加这个前缀3)因为我是写所有xxx.ymls,比我知道那里有什么,所以为什么要使用前缀?4)我想让它自动运行! (2认同)

Ant*_*rto 2

老问题,但如果有人想实现这一点,这是我想出的猴子补丁:

module ActionView
  module Helpers
    module TranslationHelper
      private
      def html_safe_translation_key?(key)
        true
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

将其放入初始值设定项中即可!适用于 Rails 3.2.6。仅将本地化文件中的文本标记为安全,而不将插值参数标记为安全。