Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

i18n: t() handles single keys returning an Array, also

  • Loading branch information...
commit f7e27bd078c9fa25c2786faf1c499c79155bbb3c 1 parent 6a9e188
@jeremy jeremy authored
View
19 actionpack/lib/action_view/helpers/translation_helper.rb
@@ -11,17 +11,22 @@ 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.
def translate(keys, options = {})
- if keys.is_a?(Array)
+ if multiple_keys = keys.is_a?(Array)
ActiveSupport::Deprecation.warn "Giving an array to translate is deprecated, please give a symbol or a string instead", caller
end
options[:raise] = true
- return_first = keys.is_a?(String) || keys.is_a?(Symbol)
keys = scope_keys_by_partial(keys)
translations = I18n.translate(keys, options)
- translations = html_safe_translation_keys(keys, Array.wrap(translations))
- return_first ? translations.first : translations
+ translations = [translations] if !multiple_keys && translations.size > 1

If translations is an empty string "" or "\n", it does not get wrapped in an array and html_safe_translation_keys fails with TypeError: can't convert String into Array!

All my I18n applications now fails everytime there is a translation that returns an empty string.

sorry this is maybe the fault of my i18n backend, it was returning a string instead of an array of translations when calling I18n.translate with an array in parameter.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ translations = html_safe_translation_keys(keys, translations)
+
+ if multiple_keys || translations.size > 1
+ translations
+ else
+ translations.first
+ end
rescue I18n::MissingTranslationData => e
keys = I18n.send(:normalize_translation_keys, e.locale, e.key, e.options[:scope])
content_tag('span', keys.join(', '), :class => 'translation_missing')
@@ -50,7 +55,11 @@ def scope_keys_by_partial(keys)
def html_safe_translation_keys(keys, translations)
keys.zip(translations).map do |key, translation|
- key =~ /(\b|_|\.)html$/ ? translation.html_safe : translation
+ if key =~ /(\b|_|\.)html$/ && translation.respond_to?(:html_safe)
+ translation.html_safe
+ else
+ translation
+ end
end
end
end
View
17 actionpack/test/template/translation_helper_test.rb
@@ -18,6 +18,11 @@ def test_returns_missing_translation_message_wrapped_into_span
assert_equal expected, translate(:foo)
end
+ def test_translation_returning_an_array
+ I18n.expects(:translate).with(["foo"], :raise => true).returns(["foo", "bar"])
+ assert_equal ["foo", "bar"], translate(:foo)
+ end
+
def test_translation_of_an_array
assert_deprecated do
I18n.expects(:translate).with(["foo", "bar"], :raise => true).returns(["foo", "bar"])
@@ -25,6 +30,13 @@ def test_translation_of_an_array
end
end
+ def test_translation_of_an_array_returning_an_array
+ assert_deprecated do
+ I18n.expects(:translate).with(["foo", "bar"], :raise => true).returns(["foo", ["bar", "baz"]])
+ assert_equal ["foo", ["bar", "baz"]], translate(["foo", "bar"])
+ end
+ end
+
def test_translation_of_an_array_with_html
assert_deprecated do
translate_expected = ['<a href="#">foo</a>', '<a href="#">bar</a>', '<a href="#">baz</a>']
@@ -75,4 +87,9 @@ 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>"])
assert translate("hello_html").html_safe?
end
+
+ def test_translation_returning_an_array_ignores_html_suffix
+ I18n.expects(:translate).with(["foo_html"], :raise => true).returns(["foo", "bar"])
+ assert_equal ["foo", "bar"], translate(:foo_html)
+ end
end
Please sign in to comment.
Something went wrong with that request. Please try again.