diff --git a/lib/i18n.rb b/lib/i18n.rb index 3ce75181..418bd0fc 100755 --- a/lib/i18n.rb +++ b/lib/i18n.rb @@ -141,7 +141,7 @@ def reload! # always return the same translations/values per unique combination of argument # values. def translate(*args) - options = args.last.is_a?(Hash) ? args.pop : {} + options = args.last.is_a?(Hash) ? args.pop.dup : {} key = args.shift backend = config.backend locale = options.delete(:locale) || config.locale @@ -219,7 +219,7 @@ def translate!(key, options={}) # I18n.transliterate("Jürgen", :locale => :en) # => "Jurgen" # I18n.transliterate("Jürgen", :locale => :de) # => "Juergen" def transliterate(*args) - options = args.pop if args.last.is_a?(Hash) + options = args.pop.dup if args.last.is_a?(Hash) key = args.shift locale = options && options.delete(:locale) || config.locale handling = options && (options.delete(:throw) && :throw || options.delete(:raise) && :raise) @@ -230,7 +230,8 @@ def transliterate(*args) end # Localizes certain objects, such as dates and numbers to local formatting. - def localize(object, options = {}) + def localize(object, options = nil) + options = options ? options.dup : {} locale = options.delete(:locale) || config.locale format = options.delete(:format) || :default config.backend.localize(locale, object, format, options) diff --git a/lib/i18n/tests/localization/date.rb b/lib/i18n/tests/localization/date.rb index a866f90c..a7234752 100644 --- a/lib/i18n/tests/localization/date.rb +++ b/lib/i18n/tests/localization/date.rb @@ -44,6 +44,13 @@ def setup assert_nothing_raised { I18n.l(@date, :format => '%x') } end + test "localize Date: does not modify the options hash" do + options = { :format => '%b', :locale => :de } + assert_equal 'Mar', I18n.l(@date, options) + assert_equal({ :format => '%b', :locale => :de }, options) + assert_nothing_raised { I18n.l(@date, options.freeze) } + end + test "localize Date: given nil it raises I18n::ArgumentError" do assert_raise(I18n::ArgumentError) { I18n.l(nil) } end diff --git a/lib/i18n/tests/lookup.rb b/lib/i18n/tests/lookup.rb index 63c21ac8..62c069d1 100644 --- a/lib/i18n/tests/lookup.rb +++ b/lib/i18n/tests/lookup.rb @@ -41,6 +41,13 @@ def setup assert_nothing_raised { I18n.t(:foo, :locale => :xx) } end + test "lookup: does not modify the options hash" do + options = {} + assert_equal "a", I18n.t(:string, options) + assert_equal({}, options) + assert_nothing_raised { I18n.t(:string, options.freeze) } + end + test "lookup: given an array of keys it translates all of them" do assert_equal %w(bar baz), I18n.t([:bar, :baz], :scope => [:foo]) end