Удалить html-теги из отсутствующих сообщений перевода I18n

Рассмотрим следующий код в представлении:

<%= link_to 'Delete!', item ,  :confirm => t('action.item.confirm_deletion'), :method => :delete %>

Обычно это будет выглядеть так:

<a href="/items/123" data-confirm="Confirm deletion?" data-method="delete" rel="nofollow">Delete!</a>

Но если перевод для action.item.confirm_deletion по какой-то причине отсутствует (неполный yml-файл, опечатки и т. д.), получается:

<a href="/items/123" data-confirm="<span class="translation_missing" title="translation missing: sv.action.item.confirm_deletion">Confirm Deletion</span>" data-method="delete" rel="nofollow">Delete!</a>

который является недопустимым html, и пользователь увидит неработающие html-теги на главной странице. В некоторых случаях это также может быть угрозой безопасности.

Я знаю, что мог бы применить некоторое экранирование при каждом вызове функции I18n.t, но это кажется излишне повторяющимся для задачи.

Итак, мой вопрос: есть ли способ сделать так, чтобы сообщения «отсутствовал перевод» не содержали html-код.


person foolo    schedule 07.08.2012    source источник
comment
Не слишком хорошо и отвечаю, так как это вызов per-t(): t('action.item.confirm_deletion', :default => 'Are you sure you want to delete this thing?')   -  person Zabba    schedule 07.08.2012
comment
Спасибо, в любом случае! Всегда хорошо знать такую ​​возможность.   -  person foolo    schedule 07.08.2012


Ответы (2)


Есть несколько решений для вас.

Вы можете присвоить методу перевода свой собственный псевдоним и вызвать с пользовательским значением :default (я бы предпочел такой способ):

module ActionView
  module Helpers
    module TranslationHelper
      alias_method :translate_without_default :translate

      def translate(key, options = {})
        options.merge!(:default => "translation missing: #{key}") unless options.key?(:default)
        translate_without_default(key, options)
      end
    end
  end
end

Или вы можете перезаписать значение по умолчанию:

module I18n
  class MissingTranslation
    def html_message
      "translation missing: #{keys.join('.')}"
    end
  end
end
person KARASZI István    schedule 07.08.2012
comment
Спасибо! Согласно вашему второму совету, я написал версию в виде простого текста, заменив пустые кавычки на %(отсутствует перевод: #{keys.join('.')}) - person foolo; 07.08.2012
comment
Перезапись значения по умолчанию не работает на рельсах 4.2! - person ProGM; 29.12.2015

В rails 4.2 вам нужно переопределить помощника translate в представлении:

https://github.com/rails/rails/blob/v4.2.5/actionview/lib/action_view/helpers/translation_helper.rb#L78

В rails 5 вы можете установить в своем application.rb:

config.action_view.debug_missing_translation = false
person ProGM    schedule 29.12.2015