From 10e990fc548dfec37ff82aa4901e675957ab2b16 Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Tue, 18 Nov 2008 02:16:08 +0900 Subject: [PATCH] Change Array#to_sentence I18n options to pass comma and space character from outside. --- .../active_support/core_ext/array/conversions.rb | 19 +++++++++-------- activesupport/lib/active_support/locale/en-US.yml | 5 ++- activesupport/test/core_ext/array_ext_test.rb | 19 +++++++++-------- activesupport/test/i18n_test.rb | 21 ++++++++++++++----- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/activesupport/lib/active_support/core_ext/array/conversions.rb b/activesupport/lib/active_support/core_ext/array/conversions.rb index cf3e03f..9dde1c0 100644 --- a/activesupport/lib/active_support/core_ext/array/conversions.rb +++ b/activesupport/lib/active_support/core_ext/array/conversions.rb @@ -5,15 +5,16 @@ module ActiveSupport #:nodoc: module Array #:nodoc: module Conversions # Converts the array to a comma-separated sentence where the last element is joined by the connector word. Options: - # * :connector - The word used to join the last element in arrays with two or more elements (default: "and") - # * :skip_last_comma - Set to true to return "a, b and c" instead of "a, b, and c". + # * :words_connector - The sign or word used to join the elements in arrays with two or more elements (default: ", ") + # * :two_words_connector - The sign or word used to join the elements in arrays with two elements (default: " and ") + # * :last_word_connector - The sign or word used to join the last element in arrays with three or more elements (default: ", and ") def to_sentence(options = {}) - options.assert_valid_keys(:connector, :skip_last_comma, :locale) + options.assert_valid_keys(:words_connector, :two_words_connector, :last_word_connector, :locale) - default = I18n.translate(:'support.array.sentence_connector', :locale => options[:locale]) - default_skip_last_comma = I18n.translate(:'support.array.skip_last_comma', :locale => options[:locale]) - options.reverse_merge! :connector => default, :skip_last_comma => default_skip_last_comma - options[:connector] = "#{options[:connector]} " unless options[:connector].nil? || options[:connector].strip == '' + default_words_connector = I18n.translate(:'support.array.words_connector', :locale => options[:locale]) + default_two_words_connector = I18n.translate(:'support.array.two_words_connector', :locale => options[:locale]) + default_last_word_connector = I18n.translate(:'support.array.last_word_connector', :locale => options[:locale]) + options.reverse_merge! :words_connector => default_words_connector, :two_words_connector => default_two_words_connector, :last_word_connector => default_last_word_connector case length when 0 @@ -21,9 +22,9 @@ module ActiveSupport #:nodoc: when 1 self[0].to_s when 2 - "#{self[0]} #{options[:connector]}#{self[1]}" + "#{self[0]}#{options[:two_words_connector]}#{self[1]}" else - "#{self[0...-1].join(', ')}#{options[:skip_last_comma] ? '' : ','} #{options[:connector]}#{self[-1]}" + "#{self[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{self[-1]}" end end diff --git a/activesupport/lib/active_support/locale/en-US.yml b/activesupport/lib/active_support/locale/en-US.yml index c31694b..af54ee9 100644 --- a/activesupport/lib/active_support/locale/en-US.yml +++ b/activesupport/lib/active_support/locale/en-US.yml @@ -28,5 +28,6 @@ en-US: # Used in array.to_sentence. support: array: - sentence_connector: "and" - skip_last_comma: false + words_connector: ", " + two_words_connector: " and " + last_word_connector: ", and " diff --git a/activesupport/test/core_ext/array_ext_test.rb b/activesupport/test/core_ext/array_ext_test.rb index 62a1f61..9c6532d 100644 --- a/activesupport/test/core_ext/array_ext_test.rb +++ b/activesupport/test/core_ext/array_ext_test.rb @@ -59,21 +59,22 @@ class ArrayExtToSentenceTests < Test::Unit::TestCase assert_equal "one, two, and three", ['one', 'two', 'three'].to_sentence end - def test_to_sentence_with_connector - assert_equal "one, two, and also three", ['one', 'two', 'three'].to_sentence(:connector => 'and also') - assert_equal "one, two, three", ['one', 'two', 'three'].to_sentence(:connector => '') - assert_equal "one, two, three", ['one', 'two', 'three'].to_sentence(:connector => nil) - assert_equal "one, two, three", ['one', 'two', 'three'].to_sentence(:connector => ' ') - assert_equal "one, two, and three", ['one', 'two', 'three'].to_sentence(:connector => 'and ') + def test_to_sentence_with_words_connector + assert_equal "one two, and three", ['one', 'two', 'three'].to_sentence(:words_connector => ' ') + assert_equal "one & two, and three", ['one', 'two', 'three'].to_sentence(:words_connector => ' & ') + assert_equal "onetwo, and three", ['one', 'two', 'three'].to_sentence(:words_connector => nil) end - def test_to_sentence_with_skip_last_comma - assert_equal "one, two, and three", ['one', 'two', 'three'].to_sentence(:skip_last_comma => false) + def test_to_sentence_with_last_word_connector + assert_equal "one, two, and also three", ['one', 'two', 'three'].to_sentence(:last_word_connector => ', and also ') + assert_equal "one, twothree", ['one', 'two', 'three'].to_sentence(:last_word_connector => nil) + assert_equal "one, two three", ['one', 'two', 'three'].to_sentence(:last_word_connector => ' ') + assert_equal "one, two and three", ['one', 'two', 'three'].to_sentence(:last_word_connector => ' and ') end def test_two_elements assert_equal "one and two", ['one', 'two'].to_sentence - assert_equal "one two", ['one', 'two'].to_sentence(:connector => '') + assert_equal "one two", ['one', 'two'].to_sentence(:two_words_connector => ' ') end def test_one_element diff --git a/activesupport/test/i18n_test.rb b/activesupport/test/i18n_test.rb index db5bd5e..80053e6 100644 --- a/activesupport/test/i18n_test.rb +++ b/activesupport/test/i18n_test.rb @@ -73,19 +73,28 @@ class I18nTest < Test::Unit::TestCase assert_equal 'pm', I18n.translate(:'time.pm') end - def test_sentence_connector - assert_equal 'and', I18n.translate(:'support.array.sentence_connector') + def test_words_connector + assert_equal ', ', I18n.translate(:'support.array.words_connector') end - def test_skip_last_comma - assert_equal false, I18n.translate(:'support.array.skip_last_comma') + def test_two_words_connector + assert_equal ' and ', I18n.translate(:'support.array.two_words_connector') + end + + def test_last_word_connector + assert_equal ', and ', I18n.translate(:'support.array.last_word_connector') end def test_to_sentence + default_two_words_connector = I18n.translate(:'support.array.two_words_connector') + default_last_word_connector = I18n.translate(:'support.array.last_word_connector') assert_equal 'a, b, and c', %w[a b c].to_sentence - I18n.backend.store_translations 'en-US', :support => { :array => { :skip_last_comma => true } } + I18n.backend.store_translations 'en-US', :support => { :array => { :two_words_connector => ' & ' } } + assert_equal 'a & b', %w[a b].to_sentence + I18n.backend.store_translations 'en-US', :support => { :array => { :last_word_connector => ' and ' } } assert_equal 'a, b and c', %w[a b c].to_sentence ensure - I18n.backend.store_translations 'en-US', :support => { :array => { :skip_last_comma => false } } + I18n.backend.store_translations 'en-US', :support => { :array => { :two_words_connector => default_two_words_connector } } + I18n.backend.store_translations 'en-US', :support => { :array => { :last_word_connector => default_last_word_connector } } end end -- 1.6.0.4