модуль ActionView::Helpers::TranslationHelper
Публичные методы экземпляра
# File actionview/lib/action_view/helpers/translation_helper.rb, line 119 def localize(*args) I18n.localize(*args) end
Делегирует к I18n.localize без дополнительных функций.
См. www.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
if options.has_key?(:default)
remaining_defaults = Array.wrap(options.delete(:default)).compact
options[:default] = remaining_defaults unless remaining_defaults.first.kind_of?(Symbol)
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))
if translation.respond_to?(:map)
translation.map { |element| element.respond_to?(:html_safe) ? element.html_safe : element }
else
translation.respond_to?(:html_safe) ? translation.html_safe : translation
end
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('.')}"
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 сообщения будут отображаться как inline-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–2019 David Heinemeier Hansson
Licensed under the MIT License.