модуль ActionView::Helpers::TranslationHelper
Публичные методы экземпляра
# File actionview/lib/action_view/helpers/translation_helper.rb, line 118 def localize(*args) I18n.localize(*args) end
Делегирует к I18n.localize без дополнительной функциональности.
См. rubydoc.info/github/svenfuchs/i18n/master/I18n/Backend/Base:localize для получения дополнительной информации.
# File actionview/lib/action_view/helpers/translation_helper.rb, line 60
def translate(key, options = {})
options = options.dup
has_default = options.has_key?(:default)
remaining_defaults = Array(options.delete(:default)).compact
if has_default && !remaining_defaults.first.kind_of?(Symbol)
options[:default] = remaining_defaults
end
# If the user has explicitly decided to NOT raise errors, pass that option to I18n.
# Otherwise, tell I18n to raise an exception, which we rescue further in this method.
# Note: `raise_error` refers to us re-raising the error in this method. I18n is forced to raise by default.
if options[:raise] == false
raise_error = false
i18n_raise = false
else
raise_error = options[:raise] || ActionView::Base.raise_on_missing_translations
i18n_raise = true
end
if html_safe_translation_key?(key)
html_safe_options = options.dup
options.except(*I18n::RESERVED_KEYS).each do |name, value|
unless name == :count && value.is_a?(Numeric)
html_safe_options[name] = ERB::Util.html_escape(value.to_s)
end
end
translation = I18n.translate(scope_key_by_partial(key), html_safe_options.merge(raise: i18n_raise))
translation.respond_to?(:html_safe) ? translation.html_safe : translation
else
I18n.translate(scope_key_by_partial(key), options.merge(raise: i18n_raise))
end
rescue I18n::MissingTranslationData => e
if remaining_defaults.present?
translate remaining_defaults.shift, options.merge(default: remaining_defaults)
else
raise e if raise_error
keys = I18n.normalize_keys(e.locale, e.key, e.options[:scope])
title = "translation missing: #{keys.join('.')}".dup
interpolations = options.except(:default, :scope)
if interpolations.any?
title << ", " << interpolations.map { |k, v| "#{k}: #{ERB::Util.html_escape(v)}" }.join(", ")
end
return title unless ActionView::Base.debug_missing_translation
content_tag("span", keys.last.to_s.titleize, class: "translation_missing", title: title)
end
end Делегирует к I18n#translate, но также выполняет три дополнительных функции.
Во-первых, он гарантирует, что любые выброшенные MissingTranslation сообщения будут отображаться как встроенные span, которые:
-
Имеют класс
translation-missing -
Содержат отсутствующий ключ в качестве значения атрибута
title -
Имеют титл-версию последнего сегмента ключа в качестве текста
Например, значение, возвращённое для отсутствующего ключа перевода "blog.post.title", будет:
<span class="translation_missing" title="translation missing: en.blog.post.title">Title</span>
Это позволяет представлениям отображать достаточно осмысленные строки, одновременно предоставляя разработчикам возможность найти отсутствующие переводы.
Если вы предпочитаете, чтобы отсутствующие переводы генерировали ошибку, вы можете отказаться от поведения обертки span глобально, установив ActionView::Base.raise_on_missing_translations = true, или индивидуально, передав raise: true в качестве параметра к translate.
Во-вторых, если ключ начинается с точки translate, ключ будет отнесён к текущей части. Вызов translate(".foo") из шаблона people/index.html.erb эквивалентен вызову translate("people.index.foo"). Это уменьшает повторение при переводе множества ключей в одной части и предоставляет соглашение для последовательного определения областей действия ключей.
В-третьих, перевод будет помечен как html_safe, если ключ имеет суффикс «_html» или последним элементом ключа является «html». Вызов translate("footer_html") или translate("footer.html") вернёт строку, безопасную для HTML, которая не будет экранирована другими методами-помощниками HTML. Это соглашение об именовании помогает идентифицировать переводы, включающие теги HTML, чтобы вы знали, какого рода вывод ожидать, когда вы вызываете translate в шаблоне, и переводчики знали, какие ключи могут содержать HTML-значения.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.