module ActionView::Helpers::TranslationHelper
def html_safe_translation_key?(key)
def html_safe_translation_key?(key) key.to_s =~ /(\b|_|\.)html$/ end
def localize(*args)
def localize(*args) I18n.localize(*args) end
def scope_key_by_partial(key)
def scope_key_by_partial(key) if key.to_s.first == "." if @_virtual_path @_virtual_path.gsub(%r{/_?}, ".") + key.to_s else raise "Cannot use t(#{key.inspect}) shortcut because path is not available" end else key end end
def translate(key, options = {})
naming convention helps to identify translations that include HTML tags so that
a safe HTML string that won't be escaped by other HTML helper methods. This
calling translate("footer_html") or translate("footer.html") will return
"_html" or the last element of the key is the word "html". For example,
Third, it'll mark the translation as safe HTML if the key has the suffix
nothing is converted.
for scoping them consistently. If you don't prepend the key with a period,
to translate many keys within the same partials and gives you a simple framework
I18n.translate("people.index.foo"). This makes it less repetitive
people/index.html.erb template, you'll actually be calling
with a period. So if you call translate(".foo") from the
Second, it'll scope the key by the current partial if the key starts
view what is missing where.
inline spans that contains the missing key, such that you can see in a
First, it'll catch MissingTranslationData exceptions and turn them into
Delegates to I18n#translate but also performs three additional functions.
def translate(key, options = {}) translation = I18n.translate(scope_key_by_partial(key), options.merge!(:raise => true)) if html_safe_translation_key?(key) && translation.respond_to?(:html_safe) translation.html_safe else translation end rescue I18n::MissingTranslationData => e keys = I18n.normalize_keys(e.locale, e.key, e.options[:scope]) content_tag('span', keys.join(', '), :class => 'translation_missing') end