提交 2b8eb540 编写于 作者: S Santiago Pastorino 提交者: José Valim

Revert "translation method for arrays on TranslationHelper module returns an...

Revert "translation method for arrays on TranslationHelper module returns an array where values for keys of the form (.|_)html keys are html_safe"

This reverts commit 05c95b5c.
Signed-off-by: NJosé Valim <jose.valim@gmail.com>
上级 8e583b69
......@@ -3,7 +3,7 @@
module ActionView
module Helpers
module TranslationHelper
# Delegates to I18n#translate but also performs three additional functions. First, it'll catch MissingTranslationData exceptions
# Delegates to I18n#translate but also performs three additional functions. First, it'll catch MissingTranslationData exceptions
# and turn them into inline spans that contains the missing key, such that you can see in a view what is missing where.
#
# Second, it'll scope the key by the current partial if the key starts with a period. So if you call translate(".foo") from the
......@@ -11,19 +11,20 @@ module TranslationHelper
# to translate many keys within the same partials and gives you a simple framework for scoping them consistently. If you don't
# prepend the key with a period, nothing is converted.
#
# Third, it’ll mark the translation as safe HTML if the key has the suffix "_html" or the last element of the key is the word
# "html". For example, calling translate("footer_html") or translate("footer.html") will return a safe HTML string that won’t
# be escaped by other HTML helper methods. This naming convention helps to identify translations that include HTML tags so that
# Third, it’ll mark the translation as safe HTML if the key has the suffix "_html" or the last element of the key is the word
# "html". For example, calling translate("footer_html") or translate("footer.html") will return a safe HTML string that won’t
# be escaped by other HTML helper methods. This naming convention helps to identify translations that include HTML tags so that
# you know what kind of output to expect when you call translate in a template.
def translate(keys, options = {})
options[:raise] = true
are_keys_a_string = keys.is_a?(String)
keys = scope_keys_by_partial(keys)
translations = I18n.translate(keys, options)
translations = html_safe_translation_keys(keys, Array.wrap(translations))
are_keys_a_string ? translations.first : translations
def translate(key, options = {})
options[:raise] = true
translation = I18n.translate(scope_key_by_partial(key), options)
translation = (translation.respond_to?(:join) ? translation.join : translation)
if html_safe_translation_key?(key)
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')
......@@ -37,24 +38,23 @@ def localize(*args)
alias :l :localize
private
def scope_keys_by_partial(keys)
Array.wrap(keys).map do |key|
if key.to_s.first == "."
unless @_virtual_path
raise "Cannot use t(#{key.inspect}) shortcut because path is not available"
end
@_virtual_path.gsub(%r{/_?}, ".") + key
def scope_key_by_partial(key)
strkey = key.respond_to?(:join) ? key.join : key.to_s
if strkey.first == "."
if @_virtual_path
@_virtual_path.gsub(%r{/_?}, ".") + strkey
else
key
raise "Cannot use t(#{key.inspect}) shortcut because path is not available"
end
else
key
end
end
def html_safe_translation_keys(keys, translations)
keys.zip(translations).map do |key, translation|
key =~ /(\b|_|\.)html$/ ? translation.html_safe : translation
end
def html_safe_translation_key?(key)
key = key.is_a?(Array) ? key.last : key.to_s
key =~ /(\b|_|\.)html$/
end
end
end
......
<% translation = t(['foo', 'bar', 'baz_html']) %><%= translation.first %>, <%= translation.second %>, <%= translation.third %>
\ No newline at end of file
<%= t(['foo', 'bar', 'html']) %>
\ No newline at end of file
<%= t(['.foo', '.bar']).join(", ") %>
\ No newline at end of file
<%= t(['.foo', '.bar']) %>
\ No newline at end of file
......@@ -7,12 +7,12 @@ class TranslationHelperTest < ActiveSupport::TestCase
attr_reader :request
def setup
end
def test_delegates_to_i18n_setting_the_raise_option
I18n.expects(:translate).with([:foo], :locale => 'en', :raise => true).returns([""])
I18n.expects(:translate).with(:foo, :locale => 'en', :raise => true).returns("")
translate :foo, :locale => 'en'
end
def test_returns_missing_translation_message_wrapped_into_span
expected = '<span class="translation_missing">en, foo</span>'
assert_equal expected, translate(:foo)
......@@ -20,14 +20,13 @@ def test_returns_missing_translation_message_wrapped_into_span
def test_translation_of_an_array
I18n.expects(:translate).with(["foo", "bar"], :raise => true).returns(["foo", "bar"])
assert_equal ["foo", "bar"], translate(["foo", "bar"])
assert_equal "foobar", translate(["foo", "bar"])
end
def test_translation_of_an_array_with_html
translate_expected = ['<a href="#">foo</a>', '<a href="#">bar</a>', '<a href="#">baz</a>']
I18n.expects(:translate).with(["foo", "bar", "baz_html"], :raise => true).returns(translate_expected)
expected = '<a href="#">foo</a><a href="#">bar</a>'
I18n.expects(:translate).with(["foo", "bar", "html"], :raise => true).returns(['<a href="#">foo</a>', '<a href="#">bar</a>'])
@view = ActionView::Base.new(ActionController::Base.view_paths, {})
expected = '&lt;a href=&quot;#&quot;&gt;foo&lt;/a&gt;, &lt;a href=&quot;#&quot;&gt;bar&lt;/a&gt;, <a href="#">baz</a>'
assert_equal expected, @view.render(:file => "test/array_translation")
end
......@@ -36,31 +35,31 @@ def test_delegates_localize_to_i18n
I18n.expects(:localize).with(@time)
localize @time
end
def test_scoping_by_partial
I18n.expects(:translate).with(["test.translation.helper"], :raise => true).returns(["helper"])
I18n.expects(:translate).with("test.translation.helper", :raise => true).returns("helper")
@view = ActionView::Base.new(ActionController::Base.view_paths, {})
assert_equal "helper", @view.render(:file => "test/translation")
end
def test_scoping_by_partial_of_an_array
I18n.expects(:translate).with(["test.scoped_array_translation.foo", "test.scoped_array_translation.bar"], :raise => true).returns(["foo", "bar"])
I18n.expects(:translate).with("test.scoped_array_translation.foo.bar", :raise => true).returns(["foo", "bar"])
@view = ActionView::Base.new(ActionController::Base.view_paths, {})
assert_equal "foo, bar", @view.render(:file => "test/scoped_array_translation")
assert_equal "foobar", @view.render(:file => "test/scoped_array_translation")
end
def test_translate_does_not_mark_plain_text_as_safe_html
I18n.expects(:translate).with(["hello"], :raise => true).returns(["Hello World"])
I18n.expects(:translate).with("hello", :raise => true).returns("Hello World")
assert_equal false, translate("hello").html_safe?
end
def test_translate_marks_translations_named_html_as_safe_html
I18n.expects(:translate).with(["html"], :raise => true).returns(["<a>Hello World</a>"])
I18n.expects(:translate).with("html", :raise => true).returns("<a>Hello World</a>")
assert translate("html").html_safe?
end
def test_translate_marks_translations_with_a_html_suffix_as_safe_html
I18n.expects(:translate).with(["hello_html"], :raise => true).returns(["<a>Hello World</a>"])
I18n.expects(:translate).with("hello_html", :raise => true).returns("<a>Hello World</a>")
assert translate("hello_html").html_safe?
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册