Skip to content

Commit

Permalink
fix #158: never modify the given options hash
Browse files Browse the repository at this point in the history
  • Loading branch information
korny committed Oct 26, 2012
1 parent 18ac029 commit 3627280
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 3 deletions.
7 changes: 4 additions & 3 deletions lib/i18n.rb
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down
7 changes: 7 additions & 0 deletions lib/i18n/tests/localization/date.rb
Expand Up @@ -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
Expand Down
7 changes: 7 additions & 0 deletions lib/i18n/tests/lookup.rb
Expand Up @@ -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
Expand Down

0 comments on commit 3627280

Please sign in to comment.