Как сделать перевод с рельсов 3 I18n автоматически безопасным?

Я использую рельсы 3. Есть ли какой-нибудь простой способ заставить I18n соблюдать 'html safness' строки, используемой при интерполяции, и сделать всю переведенную строку html безопасной по умолчанию? Так что, если у меня есть это en.yml:

en:
  user_with_name: 'User with name <em>%{name}</em>'

и я использую t('user_with_name', :name => @user.name)Я получаю имя пользователя html, но <em> а также </em> осталось как есть?

3 ответа

Решение

Старый вопрос, но если кто-то хочет этого добиться, вот патч обезьяны, который я придумал:

module ActionView
  module Helpers
    module TranslationHelper
      private
      def html_safe_translation_key?(key)
        true
      end
    end
  end
end

Поместите это в инициализаторы и все! Работает с Rails 3.2.6. Только текст в файлах локализации помечается как безопасный, а не параметры интерполяции.

http://guides.rubyonrails.org/i18n.html

Официальное руководство по Rails гласит, что вы можете беспрепятственно использовать интерполированные переменные, поскольку они html экранируются автоматически, если вы специально не объявите их как String.html_safe.

Из руководства:

Интерполяция ускользает по мере необходимости, хотя. Например, учитывая:

en:
  welcome_html: "<b>Welcome %{username}!</b>"

Вы можете безопасно передать имя пользователя, установленное пользователем:

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

Безопасные строки, с другой стороны, дословно интерполируются.

Изменить имя с user_with_name в user_with_name_htmlтогда рельсы узнают, что вы включили html в текст.

Другие вопросы по тегам