pepe-i18n 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. data/CHANGELOG.textile +57 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.textile +42 -0
  4. data/Rakefile +21 -0
  5. data/VERSION +1 -0
  6. data/lib/i18n.rb +270 -0
  7. data/lib/i18n/backend/base.rb +251 -0
  8. data/lib/i18n/backend/cache.rb +71 -0
  9. data/lib/i18n/backend/chain.rb +64 -0
  10. data/lib/i18n/backend/fallbacks.rb +53 -0
  11. data/lib/i18n/backend/gettext.rb +65 -0
  12. data/lib/i18n/backend/pluralization.rb +56 -0
  13. data/lib/i18n/backend/simple.rb +23 -0
  14. data/lib/i18n/exceptions.rb +61 -0
  15. data/lib/i18n/gettext.rb +25 -0
  16. data/lib/i18n/helpers/gettext.rb +35 -0
  17. data/lib/i18n/locale/fallbacks.rb +100 -0
  18. data/lib/i18n/locale/tag.rb +27 -0
  19. data/lib/i18n/locale/tag/parents.rb +24 -0
  20. data/lib/i18n/locale/tag/rfc4646.rb +78 -0
  21. data/lib/i18n/locale/tag/simple.rb +44 -0
  22. data/lib/i18n/string.rb +95 -0
  23. data/test/all.rb +5 -0
  24. data/test/api/basics.rb +15 -0
  25. data/test/api/interpolation.rb +85 -0
  26. data/test/api/lambda.rb +52 -0
  27. data/test/api/link.rb +47 -0
  28. data/test/api/localization/date.rb +65 -0
  29. data/test/api/localization/date_time.rb +63 -0
  30. data/test/api/localization/lambda.rb +26 -0
  31. data/test/api/localization/time.rb +63 -0
  32. data/test/api/pluralization.rb +37 -0
  33. data/test/api/translation.rb +51 -0
  34. data/test/backend/cache/cache_test.rb +57 -0
  35. data/test/backend/chain/api_test.rb +80 -0
  36. data/test/backend/chain/chain_test.rb +64 -0
  37. data/test/backend/fallbacks/api_test.rb +79 -0
  38. data/test/backend/fallbacks/fallbacks_test.rb +29 -0
  39. data/test/backend/pluralization/api_test.rb +81 -0
  40. data/test/backend/pluralization/pluralization_test.rb +39 -0
  41. data/test/backend/simple/all.rb +5 -0
  42. data/test/backend/simple/api_test.rb +90 -0
  43. data/test/backend/simple/lookup_test.rb +24 -0
  44. data/test/backend/simple/setup.rb +147 -0
  45. data/test/backend/simple/translations_test.rb +89 -0
  46. data/test/fixtures/locales/de.po +61 -0
  47. data/test/fixtures/locales/en.rb +3 -0
  48. data/test/fixtures/locales/en.yml +3 -0
  49. data/test/fixtures/locales/plurals.rb +112 -0
  50. data/test/gettext/api_test.rb +78 -0
  51. data/test/gettext/backend_test.rb +35 -0
  52. data/test/i18n_exceptions_test.rb +97 -0
  53. data/test/i18n_load_path_test.rb +23 -0
  54. data/test/i18n_test.rb +163 -0
  55. data/test/locale/fallbacks_test.rb +128 -0
  56. data/test/locale/tag/rfc4646_test.rb +147 -0
  57. data/test/locale/tag/simple_test.rb +35 -0
  58. data/test/string_test.rb +94 -0
  59. data/test/test_helper.rb +71 -0
  60. data/test/with_options.rb +34 -0
  61. metadata +151 -0
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ module Tests
4
+ module Backend
5
+ module Api
6
+ module Lambda
7
+ def test_translate_simple_proc
8
+ setup_proc_translations
9
+ assert_equal 'bar=bar, baz=baz, foo=foo', I18n.backend.translate('en', :a_lambda, :foo => 'foo', :bar => 'bar', :baz => 'baz')
10
+ end
11
+
12
+ def test_translate_proc_in_defaults
13
+ setup_proc_translations
14
+ assert_equal 'bar=bar, baz=baz, foo=foo', I18n.backend.translate('en', :does_not_exist, :default => :a_lambda, :foo => 'foo', :bar => 'bar', :baz => 'baz')
15
+ assert_equal 'bar=bar, baz=baz, foo=foo', I18n.backend.translate('en', :does_not_exist, :default => [:does_not_exist_2, :does_not_exist_3, :a_lambda], :foo => 'foo', :bar => 'bar', :baz => 'baz')
16
+ end
17
+
18
+ def test_translate_proc_with_pluralize
19
+ setup_proc_translations
20
+ params = { :zero => 'zero', :one => 'one', :other => 'other' }
21
+ assert_equal 'zero', I18n.backend.translate('en', :lambda_for_pluralize, params.merge(:count => 0))
22
+ assert_equal 'one', I18n.backend.translate('en', :lambda_for_pluralize, params.merge(:count => 1))
23
+ assert_equal 'other', I18n.backend.translate('en', :lambda_for_pluralize, params.merge(:count => 2))
24
+ end
25
+
26
+ def test_translate_proc_with_interpolate
27
+ setup_proc_translations
28
+ assert_equal 'bar baz foo', I18n.backend.translate('en', :lambda_for_interpolate, :foo => 'foo', :bar => 'bar', :baz => 'baz')
29
+ end
30
+
31
+ def test_translate_with_proc_as_default
32
+ expected = 'result from lambda'
33
+ assert_equal expected, I18n.backend.translate(:en, :'does not exist', :default => lambda { |key, values| expected })
34
+ end
35
+
36
+ private
37
+
38
+ def setup_proc_translations
39
+ I18n.backend.store_translations 'en', {
40
+ :a_lambda => lambda { |key, values|
41
+ values.keys.sort_by(&:to_s).collect { |key| "#{key}=#{values[key]}"}.join(', ')
42
+ },
43
+ :lambda_for_pluralize => lambda { |key, values| values },
44
+ :lambda_for_interpolate => lambda { |key, values|
45
+ "{{#{values.keys.sort_by(&:to_s).join('}} {{')}}}"
46
+ }
47
+ }
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
data/test/api/link.rb ADDED
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ module Tests
4
+ module Backend
5
+ module Api
6
+ module Link
7
+ def test_translate_calls_translate_if_resolves_to_a_symbol
8
+ setup_linked_translations
9
+ assert_equal 'foo', I18n.backend.translate('en', :link_to_foo)
10
+ end
11
+
12
+ def test_translate_calls_translate_if_resolves_to_a_symbol2
13
+ setup_linked_translations
14
+ assert_equal('baz', I18n.backend.translate('en', :link_to_baz))
15
+ end
16
+
17
+ def test_translate_calls_translate_if_resolves_to_a_symbol3
18
+ setup_linked_translations
19
+ assert I18n.backend.translate('en', :link_to_bar).key?(:baz)
20
+ end
21
+
22
+ def test_translate_calls_translate_if_resolves_to_a_symbol_with_scope_1
23
+ setup_linked_translations
24
+ assert_equal('baz', I18n.backend.translate('en', :link_to_baz, :scope => :bar))
25
+ end
26
+
27
+ def test_translate_calls_translate_if_resolves_to_a_symbol_with_scope_1
28
+ setup_linked_translations
29
+ assert_equal('buz', I18n.backend.translate('en', :'bar.link_to_buz'))
30
+ end
31
+
32
+ private
33
+
34
+ def setup_linked_translations
35
+ I18n.backend.store_translations 'en', {
36
+ :foo => 'foo',
37
+ :bar => { :baz => 'baz', :link_to_baz => :baz, :link_to_buz => :'boz.buz' },
38
+ :boz => { :buz => 'buz' },
39
+ :link_to_foo => :foo,
40
+ :link_to_bar => :bar,
41
+ :link_to_baz => :'bar.baz'
42
+ }
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,65 @@
1
+ # encoding: utf-8
2
+
3
+ module Tests
4
+ module Backend
5
+ module Api
6
+ module Localization
7
+ module Date
8
+ # TODO should be Mrz, shouldn't it?
9
+ def test_localize_given_the_short_format_it_uses_it
10
+ assert_equal '01. Mar', I18n.backend.localize('de', date, :short)
11
+ end
12
+
13
+ def test_localize_given_the_long_format_it_uses_it
14
+ assert_equal '01. März 2008', I18n.backend.localize('de', date, :long)
15
+ end
16
+
17
+ def test_localize_given_the_default_format_it_uses_it
18
+ assert_equal '01.03.2008', I18n.backend.localize('de', date, :default)
19
+ end
20
+
21
+ def test_localize_given_a_day_name_format_it_returns_a_day_name
22
+ assert_equal 'Samstag', I18n.backend.localize('de', date, '%A')
23
+ end
24
+
25
+ def test_localize_given_an_abbr_day_name_format_it_returns_an_abbrevated_day_name
26
+ assert_equal 'Sa', I18n.backend.localize('de', date, '%a')
27
+ end
28
+
29
+ def test_localize_given_a_month_name_format_it_returns_a_month_name
30
+ assert_equal 'März', I18n.backend.localize('de', date, '%B')
31
+ end
32
+
33
+ # TODO should be Mrz, shouldn't it?
34
+ def test_localize_given_an_abbr_month_name_format_it_returns_an_abbrevated_month_name
35
+ assert_equal 'Mar', I18n.backend.localize('de', date, '%b')
36
+ end
37
+
38
+ def test_localize_given_a_format_specified_as_a_proc
39
+ assert_equal '1ter März 2008', I18n.backend.localize('de', date, :long_ordinalized)
40
+ end
41
+
42
+ def test_localize_given_a_format_specified_as_a_proc_with_additional_options
43
+ assert_equal '1ter März 2008 (MEZ)', I18n.backend.localize('de', date, :long_ordinalized, :timezone => 'MEZ')
44
+ end
45
+
46
+ def test_localize_given_no_format_it_does_not_fail
47
+ assert_nothing_raised{ I18n.backend.localize 'de', date }
48
+ end
49
+
50
+ def test_localize_given_an_unknown_format_it_does_not_fail
51
+ assert_nothing_raised{ I18n.backend.localize 'de', date, '%x' }
52
+ end
53
+
54
+ def test_localize_nil_raises_argument_error
55
+ assert_raises(I18n::ArgumentError) { I18n.backend.localize 'de', nil }
56
+ end
57
+
58
+ def test_localize_object_raises_argument_error
59
+ assert_raises(I18n::ArgumentError) { I18n.backend.localize 'de', Object.new }
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+
3
+ module Tests
4
+ module Backend
5
+ module Api
6
+ module Localization
7
+ module DateTime
8
+ # TODO should be Mrz, shouldn't it?
9
+ def test_localize_given_the_short_format_it_uses_it
10
+ assert_equal '01. Mar 06:00', I18n.backend.localize('de', morning_datetime, :short)
11
+ end
12
+
13
+ def test_localize_given_the_long_format_it_uses_it
14
+ assert_equal '01. März 2008 06:00', I18n.backend.localize('de', morning_datetime, :long)
15
+ end
16
+
17
+ # TODO should be Mrz, shouldn't it?
18
+ def test_localize_given_the_default_format_it_uses_it
19
+ assert_equal 'Sa, 01. Mar 2008 06:00:00 +0000', I18n.backend.localize('de', morning_datetime, :default)
20
+ end
21
+
22
+ def test_localize_given_a_day_name_format_it_returns_the_correct_day_name
23
+ assert_equal 'Samstag', I18n.backend.localize('de', morning_datetime, '%A')
24
+ end
25
+
26
+ def test_localize_given_an_abbr_day_name_format_it_returns_the_correct_abbrevated_day_name
27
+ assert_equal 'Sa', I18n.backend.localize('de', morning_datetime, '%a')
28
+ end
29
+
30
+ def test_localize_given_a_month_name_format_it_returns_the_correct_month_name
31
+ assert_equal 'März', I18n.backend.localize('de', morning_datetime, '%B')
32
+ end
33
+
34
+ # TODO should be Mrz, shouldn't it?
35
+ def test_localize_given_an_abbr_month_name_format_it_returns_the_correct_abbrevated_month_name
36
+ assert_equal 'Mar', I18n.backend.localize('de', morning_datetime, '%b')
37
+ end
38
+
39
+ def test_localize_given_a_meridian_indicator_format_it_returns_the_correct_meridian_indicator
40
+ assert_equal 'am', I18n.backend.localize('de', morning_datetime, '%p')
41
+ assert_equal 'pm', I18n.backend.localize('de', evening_datetime, '%p')
42
+ end
43
+
44
+ def test_localize_given_a_format_specified_as_a_proc
45
+ assert_equal '1ter März 2008, 06:00 Uhr', I18n.backend.localize('de', morning_datetime, :long_ordinalized)
46
+ end
47
+
48
+ def test_localize_given_a_format_specified_as_a_proc_with_additional_options
49
+ assert_equal '1ter März 2008, 06:00 Uhr (MEZ)', I18n.backend.localize('de', morning_datetime, :long_ordinalized, :timezone => 'MEZ')
50
+ end
51
+
52
+ def test_localize_given_no_format_it_does_not_fail
53
+ assert_nothing_raised{ I18n.backend.localize 'de', morning_datetime }
54
+ end
55
+
56
+ def test_localize_given_an_unknown_format_it_does_not_fail
57
+ assert_nothing_raised{ I18n.backend.localize 'de', morning_datetime, '%x' }
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ module Tests
4
+ module Backend
5
+ module Api
6
+ module Localization
7
+ module Lambda
8
+ def test_localize_uses_lambda_day_names
9
+ assert_match /Суббота/, I18n.backend.localize('ru', time, "%A, %d %B")
10
+ assert_match /суббота/, I18n.backend.localize('ru', time, "%d %B (%A)")
11
+ end
12
+
13
+ def test_localize_uses_lambda_month_names
14
+ assert_match /марта/, I18n.backend.localize('ru', time, "%d %B %Y")
15
+ assert_match /Март/, I18n.backend.localize('ru', time, "%B %Y")
16
+ end
17
+
18
+ def test_localize_uses_lambda_abbr_day_names
19
+ assert_match /марта/, I18n.backend.localize('ru', time, "%d %b %Y")
20
+ assert_match /март/, I18n.backend.localize('ru', time, "%b %Y")
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+
3
+ module Tests
4
+ module Backend
5
+ module Api
6
+ module Localization
7
+ module Time
8
+ # TODO should be Mrz, shouldn't it?
9
+ def test_localize_given_the_short_format_it_uses_it
10
+ assert_equal '01. Mar 06:00', I18n.backend.localize('de', morning_time, :short)
11
+ end
12
+
13
+ def test_localize_given_the_long_format_it_uses_it
14
+ assert_equal '01. März 2008 06:00', I18n.backend.localize('de', morning_time, :long)
15
+ end
16
+
17
+ # TODO Seems to break on Windows because ENV['TZ'] is ignored. What's a better way to do this?
18
+ # def test_localize_given_the_default_format_it_uses_it
19
+ # assert_equal 'Sa, 01. Mar 2008 06:00:00 +0000', I18n.backend.localize('de', morning_time, :default)
20
+ # end
21
+
22
+ def test_localize_given_a_day_name_format_it_returns_the_correct_day_name
23
+ assert_equal 'Samstag', I18n.backend.localize('de', morning_time, '%A')
24
+ end
25
+
26
+ def test_localize_given_an_abbr_day_name_format_it_returns_the_correct_abbrevated_day_name
27
+ assert_equal 'Sa', I18n.backend.localize('de', morning_time, '%a')
28
+ end
29
+
30
+ def test_localize_given_a_month_name_format_it_returns_the_correct_month_name
31
+ assert_equal 'März', I18n.backend.localize('de', morning_time, '%B')
32
+ end
33
+
34
+ # TODO should be Mrz, shouldn't it?
35
+ def test_localize_given_an_abbr_month_name_format_it_returns_the_correct_abbrevated_month_name
36
+ assert_equal 'Mar', I18n.backend.localize('de', morning_time, '%b')
37
+ end
38
+
39
+ def test_localize_given_a_meridian_indicator_format_it_returns_the_correct_meridian_indicator
40
+ assert_equal 'am', I18n.backend.localize('de', morning_time, '%p')
41
+ assert_equal 'pm', I18n.backend.localize('de', evening_time, '%p')
42
+ end
43
+
44
+ def test_localize_given_a_format_specified_as_a_proc
45
+ assert_equal '1ter März 2008, 06:00 Uhr', I18n.backend.localize('de', morning_time, :long_ordinalized)
46
+ end
47
+
48
+ def test_localize_given_a_format_specified_as_a_proc_with_additional_options
49
+ assert_equal '1ter März 2008, 06:00 Uhr (MEZ)', I18n.backend.localize('de', morning_time, :long_ordinalized, :timezone => 'MEZ')
50
+ end
51
+
52
+ def test_localize_given_no_format_it_does_not_fail
53
+ assert_nothing_raised{ I18n.backend.localize 'de', morning_time }
54
+ end
55
+
56
+ def test_localize_given_an_unknown_format_it_does_not_fail
57
+ assert_nothing_raised{ I18n.backend.localize 'de', morning_time, '%x' }
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ module Tests
4
+ module Backend
5
+ module Api
6
+ module Pluralization
7
+ def test_pluralize_given_0_returns_zero_string_if_zero_key_given
8
+ assert_equal 'zero', I18n.t(:default => { :zero => 'zero' }, :count => 0)
9
+ end
10
+
11
+ def test_pluralize_given_0_returns_plural_string_if_no_zero_key_given
12
+ assert_equal 'bars', I18n.t(:default => { :other => 'bars' }, :count => 0)
13
+ end
14
+
15
+ def test_pluralize_given_1_returns_singular_string
16
+ assert_equal 'bar', I18n.t(:default => { :one => 'bar' }, :count => 1)
17
+ end
18
+
19
+ def test_pluralize_given_2_returns_plural_string
20
+ assert_equal 'bars', I18n.t(:default => { :other => 'bars' }, :count => 2)
21
+ end
22
+
23
+ def test_pluralize_given_3_returns_plural_string
24
+ assert_equal 'bars', I18n.t(:default => { :other => 'bars' }, :count => 3)
25
+ end
26
+
27
+ def test_pluralize_given_nil_returns_the_given_entry
28
+ assert_equal({ :zero => 'zero' }, I18n.t(:default => { :zero => 'zero' }, :count => nil))
29
+ end
30
+
31
+ def test_interpolate_given_incomplete_pluralization_data_raises_invalid_pluralization_data
32
+ assert_raises(I18n::InvalidPluralizationData){ I18n.t(:default => { :one => 'bar' }, :count => 2) }
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+
3
+ module Tests
4
+ module Backend
5
+ module Api
6
+ module Translation
7
+ def translate(key, options = {})
8
+ I18n.backend.translate('en', key, options)
9
+ end
10
+
11
+ def test_given_no_keys_it_returns_the_default
12
+ assert_equal 'default', translate(nil, :default => 'default')
13
+ end
14
+
15
+ def test_translate_given_a_symbol_as_a_default_translates_the_symbol
16
+ assert_equal 'bar', translate(nil, :default => :'foo.bar')
17
+ end
18
+
19
+ def test_translate_default_with_scope_stays_in_scope_when_looking_up_the_symbol
20
+ assert_equal 'bar', translate(:missing, :default => :bar, :scope => :foo)
21
+ end
22
+
23
+ def test_translate_given_an_array_as_default_uses_the_first_match
24
+ assert_equal 'bar', translate(:does_not_exist, :scope => [:foo], :default => [:does_not_exist_2, :bar])
25
+ end
26
+
27
+ def test_translate_given_an_array_of_inexistent_keys_it_raises_missing_translation_data
28
+ assert_raises I18n::MissingTranslationData do
29
+ translate(:does_not_exist, :scope => [:foo], :default => [:does_not_exist_2, :does_not_exist_3])
30
+ end
31
+ end
32
+
33
+ def test_translate_an_array_of_keys_translates_all_of_them
34
+ assert_equal %w(bar baz), translate([:bar, :baz], :scope => [:foo])
35
+ end
36
+
37
+ def test_translate_with_a_missing_key_and_no_default_raises_missing_translation_data
38
+ assert_raises(I18n::MissingTranslationData) do
39
+ translate(:missing)
40
+ end
41
+ end
42
+
43
+ def test_translate_given_nil_as_a_locale_raises_an_argument_error
44
+ assert_raises(I18n::InvalidLocale) do
45
+ I18n.backend.translate(nil, :bar)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
4
+ require 'i18n/backend/cache'
5
+ require 'activesupport'
6
+
7
+ class I18nCacheBackendTest < Test::Unit::TestCase
8
+ def setup
9
+ super
10
+ I18n.backend.meta_class.send(:include, I18n::Backend::Cache)
11
+ I18n.cache_store = ActiveSupport::Cache.lookup_store(:memory_store)
12
+ end
13
+
14
+ def teardown
15
+ I18n.cache_store = nil
16
+ end
17
+
18
+ def test_uses_cache
19
+ assert I18n.cache_store.is_a?(ActiveSupport::Cache::MemoryStore)
20
+ end
21
+
22
+ define_method :"test translate hits the backend and caches the response" do
23
+ I18n.backend.expects(:lookup).returns('Foo')
24
+ assert_equal 'Foo', I18n.t(:foo)
25
+
26
+ I18n.backend.expects(:lookup).never
27
+ assert_equal 'Foo', I18n.t(:foo)
28
+
29
+ I18n.backend.expects(:lookup).returns('Bar')
30
+ assert_equal 'Bar', I18n.t(:bar)
31
+ end
32
+
33
+ define_method :"test still raises MissingTranslationData but also caches it" do
34
+ I18n.backend.expects(:lookup).returns(nil)
35
+ assert_raises(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) }
36
+ I18n.backend.expects(:lookup).never
37
+ assert_raises(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) }
38
+ end
39
+
40
+ define_method :"test uses 'i18n' as a cache key namespace by default" do
41
+ assert_equal 0, I18n.backend.send(:cache_key, :foo).index('i18n')
42
+ end
43
+
44
+ define_method :"test adds a custom cache key namespace" do
45
+ with_cache_namespace('bar') do
46
+ assert_equal 0, I18n.backend.send(:cache_key, :foo).index('i18n-bar')
47
+ end
48
+ end
49
+
50
+ protected
51
+
52
+ def with_cache_namespace(namespace)
53
+ I18n.cache_namespace = namespace
54
+ yield
55
+ I18n.cache_namespace = nil
56
+ end
57
+ end