diff --git a/README.md b/README.md index b9aa862..3e45c47 100644 --- a/README.md +++ b/README.md @@ -305,6 +305,61 @@ en: => "70.5%" ``` +#### Multiple objects and multiple locales + +The `localize` method supports batch operations with multiple objects and multiple locales, similar to the `translate` method. + +**Multiple objects** + +```ruby +# Multiple dates +dates = [Date.new(2023, 12, 25), Date.new(2024, 1, 1)] +>> L(dates) +=> ["Monday 25, December, 2023", "Monday 01, January, 2024"] + +# Multiple numbers +>> L([1000, 2500.75, 999.99]) +=> ["1,000", "2,500.75", "999.99"] + +# Mixed objects with formatting options +>> L([1000, 2000], as: :currency) +=> ["1,000 $", "2,000 $"] + +# Multiple dates with custom format +>> L([Date.new(2023, 6, 15), Date.new(2023, 12, 31)], format: :short) +=> ["15 Jun, 23", "31 Dec, 23"] +``` + +**Multiple locales** + +```ruby +# Localize number across different locales +>> L(1234.56, locale: [:en, :es, :fr]) +=> ["1,234.56", "1.234,56", "1 234,56"] + +# Localize date across different locales +date = Date.new(2023, 8, 15) +>> L(date, locale: [:en, :es, :de]) +=> ["Tuesday 15, August, 2023", "martes 15, agosto, 2023", "Dienstag 15, August, 2023"] + +# Currency formatting across locales +>> L(999.99, as: :currency, locale: [:en, :es, :de]) +=> ["999.99 $", "999,99 €", "999,99 €"] +``` + +**Combining multiple objects and locales** + +```ruby +# Multiple numbers with multiple locales +>> L([1000, 2000], locale: [:en, :es]) +=> [["1,000", "2,000"], ["1.000", "2.000"]] + +# Multiple dates with multiple locales and format +dates = [Date.new(2023, 1, 1), Date.new(2023, 12, 31)] +>> L(dates, locale: [:en, :fr], format: :short) +=> [["01 Jan, 23", "31 Dec, 23"], ["01 janv., 23", "31 déc., 23"]] +``` + ## Development Feedback, bug reports, ideas, and enhancements are welcome! diff --git a/lib/mini_i18n/localization.rb b/lib/mini_i18n/localization.rb index 399916b..0681037 100644 --- a/lib/mini_i18n/localization.rb +++ b/lib/mini_i18n/localization.rb @@ -8,6 +8,9 @@ module Localization DAYS_MONTHS_REGEX = /%[aAbB]/ def localize(object, options = {}) + return multiple_localize(object, options) if object.is_a?(Array) + return multiple_locales_localize(object, options) if options[:locale].is_a?(Array) + case object when Numeric localize_number(object, options) @@ -70,5 +73,17 @@ def localize_string(string, options) object && localize(object, options) end + + def multiple_localize(objects, options) + objects.map do |obj| + localize(obj, options) + end + end + + def multiple_locales_localize(object, options) + options[:locale].map do |_locale| + localize(object, options.merge(locale: _locale)) + end + end end end \ No newline at end of file diff --git a/spec/localization_spec.rb b/spec/localization_spec.rb index 1a53e3d..b16655b 100644 --- a/spec/localization_spec.rb +++ b/spec/localization_spec.rb @@ -46,4 +46,62 @@ expect(MiniI18n.l(125.5, as: :distance)).to eq 'Distance -> 125.5 miles' end end + + describe 'multiple objects' do + let(:date) { Date.new(2018, 8, 7) } + let(:number) { 1234.56 } + + it 'localizes multiple objects with same options' do + result = MiniI18n.l([date, number]) + expect(result).to eq ['Tuesday 07, August, 2018', '1,234.56'] + end + + it 'localizes multiple objects with specific locale' do + result = MiniI18n.l([number, 9000], locale: :es) + expect(result).to eq ['1.234,56', '9.000'] + end + + it 'localizes multiple objects with different formats' do + result = MiniI18n.l([date, time], format: :short) + expect(result).to eq ['07 Aug 18', '07 Aug 18 - 22:30'] + end + + it 'localizes multiple objects with as option' do + result = MiniI18n.l([1000, 2000], as: :currency) + expect(result).to eq ['1,000 $', '2,000 $'] + end + end + + describe 'multiple locales' do + let(:number) { 1234.56 } + + it 'localizes same object for multiple locales' do + result = MiniI18n.l(number, locale: [:en, :es]) + expect(result).to eq ['1,234.56', '1.234,56'] + end + + it 'localizes date for multiple locales' do + date = Date.new(2018, 8, 7) + result = MiniI18n.l(date, locale: [:en, :es]) + expect(result).to eq ['Tuesday 07, August, 2018', '7/8/2018'] + end + + it 'localizes time for multiple locales' do + result = MiniI18n.l(time, locale: [:en, :es]) + expect(result).to eq ['Tue 07, August, 2018 - 22:30', 'mar 7 de agosto de 2018 - 22:30'] + end + + it 'localizes number with currency for multiple locales' do + result = MiniI18n.l(1000, as: :currency, locale: [:en, :es]) + expect(result).to eq ['1,000 $', '1.000 €'] + end + + it 'localizes with format for multiple locales' do + date = Date.new(2018, 8, 7) + result = MiniI18n.l(date, format: :short, locale: [:en, :es]) + expect(result).to eq ['07 Aug 18', '7 ago 18'] + end + end + + end