提交 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 @@ ...@@ -3,7 +3,7 @@
module ActionView module ActionView
module Helpers module Helpers
module TranslationHelper 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. # 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 # 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 ...@@ -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 # 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. # 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 # 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 # "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 # 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. # you know what kind of output to expect when you call translate in a template.
def translate(keys, options = {}) def translate(key, options = {})
options[:raise] = true options[:raise] = true
are_keys_a_string = keys.is_a?(String) translation = I18n.translate(scope_key_by_partial(key), options)
keys = scope_keys_by_partial(keys) translation = (translation.respond_to?(:join) ? translation.join : translation)
if html_safe_translation_key?(key)
translations = I18n.translate(keys, options) translation.html_safe
translations = html_safe_translation_keys(keys, Array.wrap(translations)) else
are_keys_a_string ? translations.first : translations translation
end
rescue I18n::MissingTranslationData => e rescue I18n::MissingTranslationData => e
keys = I18n.normalize_keys(e.locale, e.key, e.options[:scope]) keys = I18n.normalize_keys(e.locale, e.key, e.options[:scope])
content_tag('span', keys.join(', '), :class => 'translation_missing') content_tag('span', keys.join(', '), :class => 'translation_missing')
...@@ -37,24 +38,23 @@ def localize(*args) ...@@ -37,24 +38,23 @@ def localize(*args)
alias :l :localize alias :l :localize
private private
def scope_keys_by_partial(keys) def scope_key_by_partial(key)
Array.wrap(keys).map do |key| strkey = key.respond_to?(:join) ? key.join : key.to_s
if key.to_s.first == "." if strkey.first == "."
unless @_virtual_path if @_virtual_path
raise "Cannot use t(#{key.inspect}) shortcut because path is not available" @_virtual_path.gsub(%r{/_?}, ".") + strkey
end
@_virtual_path.gsub(%r{/_?}, ".") + key
else else
key raise "Cannot use t(#{key.inspect}) shortcut because path is not available"
end end
else
key
end end
end end
def html_safe_translation_keys(keys, translations) def html_safe_translation_key?(key)
keys.zip(translations).map do |key, translation| key = key.is_a?(Array) ? key.last : key.to_s
key =~ /(\b|_|\.)html$/ ? translation.html_safe : translation key =~ /(\b|_|\.)html$/
end
end end
end end
end end
......
<% translation = t(['foo', 'bar', 'baz_html']) %><%= translation.first %>, <%= translation.second %>, <%= translation.third %> <%= t(['foo', 'bar', 'html']) %>
\ No newline at end of file \ No newline at end of file
<%= t(['.foo', '.bar']).join(", ") %> <%= t(['.foo', '.bar']) %>
\ No newline at end of file \ No newline at end of file
...@@ -7,12 +7,12 @@ class TranslationHelperTest < ActiveSupport::TestCase ...@@ -7,12 +7,12 @@ class TranslationHelperTest < ActiveSupport::TestCase
attr_reader :request attr_reader :request
def setup def setup
end end
def test_delegates_to_i18n_setting_the_raise_option 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' translate :foo, :locale => 'en'
end end
def test_returns_missing_translation_message_wrapped_into_span def test_returns_missing_translation_message_wrapped_into_span
expected = '<span class="translation_missing">en, foo</span>' expected = '<span class="translation_missing">en, foo</span>'
assert_equal expected, translate(:foo) assert_equal expected, translate(:foo)
...@@ -20,14 +20,13 @@ def test_returns_missing_translation_message_wrapped_into_span ...@@ -20,14 +20,13 @@ def test_returns_missing_translation_message_wrapped_into_span
def test_translation_of_an_array def test_translation_of_an_array
I18n.expects(:translate).with(["foo", "bar"], :raise => true).returns(["foo", "bar"]) 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 end
def test_translation_of_an_array_with_html def test_translation_of_an_array_with_html
translate_expected = ['<a href="#">foo</a>', '<a href="#">bar</a>', '<a href="#">baz</a>'] expected = '<a href="#">foo</a><a href="#">bar</a>'
I18n.expects(:translate).with(["foo", "bar", "baz_html"], :raise => true).returns(translate_expected) 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, {}) @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") assert_equal expected, @view.render(:file => "test/array_translation")
end end
...@@ -36,31 +35,31 @@ def test_delegates_localize_to_i18n ...@@ -36,31 +35,31 @@ def test_delegates_localize_to_i18n
I18n.expects(:localize).with(@time) I18n.expects(:localize).with(@time)
localize @time localize @time
end end
def test_scoping_by_partial 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, {}) @view = ActionView::Base.new(ActionController::Base.view_paths, {})
assert_equal "helper", @view.render(:file => "test/translation") assert_equal "helper", @view.render(:file => "test/translation")
end end
def test_scoping_by_partial_of_an_array 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, {}) @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 end
def test_translate_does_not_mark_plain_text_as_safe_html 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? assert_equal false, translate("hello").html_safe?
end end
def test_translate_marks_translations_named_html_as_safe_html 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? assert translate("html").html_safe?
end end
def test_translate_marks_translations_with_a_html_suffix_as_safe_html 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? assert translate("hello_html").html_safe?
end end
end end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册