Как сделать перевод с рельсов 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 в текст.