модуль ActionView::Helpers::TranslationHelper
Публичные методы экземпляра
# File actionview/lib/action_view/helpers/translation_helper.rb, line 117 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 59
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('.')}"
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, чтобы вы знали, какой результат ожидать при вызове перевода в шаблоне, и переводчики знают, какие ключи могут содержать HTML-значения.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.