r18n-core 0.2.3 → 0.3
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.
- data/README.rdoc +157 -35
- data/base/cs.yml +34 -0
- data/base/de.yml +24 -0
- data/base/en.yml +24 -0
- data/base/fr.yml +24 -0
- data/base/pl.yml +24 -0
- data/base/ru.yml +30 -0
- data/lib/r18n-core/filters.rb +245 -0
- data/lib/r18n-core/i18n.rb +57 -40
- data/lib/r18n-core/locale.rb +116 -19
- data/lib/r18n-core/translated.rb +186 -0
- data/lib/r18n-core/translation.rb +33 -73
- data/lib/r18n-core/unsupported_locale.rb +27 -9
- data/lib/r18n-core/utils.rb +49 -0
- data/lib/r18n-core/version.rb +1 -1
- data/lib/r18n-core.rb +3 -15
- data/locales/cs.rb +23 -0
- data/locales/cs.yml +26 -0
- data/locales/de.yml +3 -8
- data/locales/en-us.rb +8 -0
- data/locales/en-us.yml +9 -0
- data/locales/en.rb +26 -0
- data/locales/en.yml +3 -8
- data/locales/eo.yml +3 -8
- data/locales/fr.rb +14 -0
- data/locales/fr.yml +3 -8
- data/locales/kk.yml +3 -8
- data/locales/pl.yml +4 -11
- data/locales/ru.yml +3 -8
- data/spec/filters_spec.rb +167 -0
- data/spec/i18n_spec.rb +61 -16
- data/spec/locale_spec.rb +46 -19
- data/spec/locales/cs_spec.rb +22 -0
- data/spec/locales/en-us_spec.rb +14 -0
- data/spec/locales/en_spec.rb +14 -0
- data/spec/locales/fr_spec.rb +10 -0
- data/spec/locales/pl_spec.rb +17 -17
- data/spec/locales/ru_spec.rb +2 -2
- data/spec/r18n_spec.rb +7 -3
- data/spec/spec_helper.rb +2 -0
- data/spec/translated_spec.rb +108 -0
- data/spec/translation_spec.rb +24 -56
- data/spec/translations/extension/{no_TR.yml → no-tr.yml} +0 -0
- data/spec/translations/general/en.yml +15 -2
- data/spec/translations/general/{no_LC.yml → no-lc.yml} +0 -0
- metadata +46 -31
- data/locales/en_US.yml +0 -14
@@ -0,0 +1,167 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
3
|
+
|
4
|
+
describe R18n::Filters do
|
5
|
+
before do
|
6
|
+
@system = R18n::Filters.defined.values
|
7
|
+
@enabled = R18n::Filters.defined.values.reject { |i| !i.enabled? }
|
8
|
+
@i18n = R18n::I18n.new('en', DIR)
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
R18n::Filters.defined.values.each do |filter|
|
13
|
+
next if @system.include? filter
|
14
|
+
R18n::Filters.delete(filter)
|
15
|
+
end
|
16
|
+
|
17
|
+
@enabled.each { |i| R18n::Filters.on(i) unless i.enabled? }
|
18
|
+
(@system - @enabled).each { |i| R18n::Filters.off(i) if i.enabled? }
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should add new filter" do
|
22
|
+
filter = R18n::Filters.add('my', :my_filter) { |i, config| i }
|
23
|
+
|
24
|
+
filter.should be_a(R18n::Filters::Filter)
|
25
|
+
filter.name.should == :my_filter
|
26
|
+
filter.type.should == 'my'
|
27
|
+
filter.should be_enabled
|
28
|
+
|
29
|
+
R18n::Filters.defined.should have_key(:my_filter)
|
30
|
+
@i18n.my_filter.should == 'value'
|
31
|
+
@i18n.my_tree_filter.should == {'name' => 'value'}
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should use cascade filters" do
|
35
|
+
filter = R18n::Filters.add('my', :one) { |i, config| i + '1' }
|
36
|
+
filter = R18n::Filters.add('my', :two) { |i, config| i + '2' }
|
37
|
+
filter = R18n::Filters.add('my', :three, 0) { |i, config| i + '3' }
|
38
|
+
@i18n.my_filter.should == 'value312'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should return name for nameless filter" do
|
42
|
+
R18n::Filters.instance_variable_set(:@last_auto_name, 0)
|
43
|
+
|
44
|
+
R18n::Filters.add('some').name.should == 1
|
45
|
+
R18n::Filters.add('some').name.should == 2
|
46
|
+
|
47
|
+
R18n::Filters.add('some', 3)
|
48
|
+
R18n::Filters.add('some').name.should == 4
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should delete filter by name" do
|
52
|
+
R18n::Filters.add('my', :my_filter) { '1' }
|
53
|
+
@i18n.my_filter.should == '1'
|
54
|
+
|
55
|
+
R18n::Filters.delete(:my_filter)
|
56
|
+
R18n::Filters.defined.should_not have_key(:my_filter)
|
57
|
+
@i18n.my_filter.should == 'value'
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should delete filter by object" do
|
61
|
+
filter = R18n::Filters.add('my') { '1' }
|
62
|
+
@i18n.my_filter.should == '1'
|
63
|
+
|
64
|
+
R18n::Filters.delete(filter)
|
65
|
+
R18n::Filters.defined.should_not have_key(filter.name)
|
66
|
+
@i18n.my_filter.should == 'value'
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should use global filters" do
|
70
|
+
R18n::Filters.add(String) { |result, config, a, b| result + a + b }
|
71
|
+
R18n::Filters.add(String) { |result, config| result + '!' }
|
72
|
+
|
73
|
+
@i18n.one('1', '2').should == 'One12!'
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should turn off filter" do
|
77
|
+
filter = R18n::Filters.add('my', :one) { |i, config| i + '1' }
|
78
|
+
filter = R18n::Filters.add('my', :two) { |i, config| i + '2' }
|
79
|
+
|
80
|
+
R18n::Filters.off(:one)
|
81
|
+
R18n::Filters.defined[:one].should_not be_enabled
|
82
|
+
@i18n.my_filter.should == 'value2'
|
83
|
+
|
84
|
+
R18n::Filters.on(:one)
|
85
|
+
R18n::Filters.defined[:one].should be_enabled
|
86
|
+
@i18n.my_filter.should == 'value12'
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should send config to filter" do
|
90
|
+
R18n::Filters.add('my') do |i, config|
|
91
|
+
config.secret_value = 1
|
92
|
+
config
|
93
|
+
end
|
94
|
+
@i18n.my_filter.locale.should == @i18n.locale
|
95
|
+
@i18n.my_filter.path.should == 'my_filter'
|
96
|
+
@i18n.my_filter.secret_value.should == 1
|
97
|
+
@i18n.my_filter.unknown_value.should be_nil
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should use one config for cascade filters" do
|
101
|
+
R18n::Filters.add('my') { |content, config| config.new_secret ? 2 : 1 }
|
102
|
+
@i18n.my_filter.should == 1
|
103
|
+
|
104
|
+
R18n::Filters.add('my', nil, 0) do |content, config|
|
105
|
+
config.new_secret = true
|
106
|
+
content
|
107
|
+
end
|
108
|
+
@i18n.my_filter.should == 2
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should send parameters to filter" do
|
112
|
+
R18n::Filters.add('my') { |i, config, a, b| "#{i}#{a}#{b}" }
|
113
|
+
@i18n['my_filter', 1, 2].should == 'value12'
|
114
|
+
@i18n.my_filter(1, 2).should == 'value12'
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should call proc from translation" do
|
118
|
+
@i18n.sum(2, 3).should == 5
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should pluralize translation" do
|
122
|
+
@i18n.comments(0, 'article').should == 'no comments for article'
|
123
|
+
@i18n.comments(1, 'article').should == 'one comment for article'
|
124
|
+
@i18n.comments(5, 'article').should == '5 comments for article'
|
125
|
+
|
126
|
+
@i18n.files(0).should == '0 files'
|
127
|
+
@i18n.files(-5.5).should == '−5.5 files'
|
128
|
+
@i18n.files(5000).should == '5,000 files'
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should pluralize translation without locale" do
|
132
|
+
i18n = R18n::I18n.new('no-LC', DIR)
|
133
|
+
i18n.entries(1).should == 'ONE'
|
134
|
+
i18n.entries(5).should == 'N'
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should can use params in translation" do
|
138
|
+
@i18n.params(-1, 2).should == 'Is −1 between −1 and 2?'
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should have filter for escape HTML" do
|
142
|
+
@i18n.html.should == '<script>true && false</script>'
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should have disabled global filter for escape HTML" do
|
146
|
+
@i18n.greater.should == '1 < 2 is true'
|
147
|
+
|
148
|
+
R18n::Filters.on(:global_escape_html)
|
149
|
+
@i18n.greater.should == '1 < 2 is true'
|
150
|
+
@i18n.html.should == '<script>true && false</script>'
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should have filter to disable global HTML escape" do
|
154
|
+
@i18n.no_escape.should == '<b>Warning</b>'
|
155
|
+
R18n::Filters.on(:global_escape_html)
|
156
|
+
@i18n.no_escape.should == '<b>Warning</b>'
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should have Markdown filter" do
|
160
|
+
@i18n.markdown.should == '<p><strong>Hi!</strong></p>'
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should have Textile filter" do
|
164
|
+
@i18n.textile.should == '<p><em>Hi!</em></p>'
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
data/spec/i18n_spec.rb
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
3
3
|
|
4
4
|
describe R18n::I18n do
|
5
|
+
after do
|
6
|
+
R18n::I18n.default = 'en'
|
7
|
+
end
|
5
8
|
|
6
9
|
it "should parse HTTP_ACCEPT_LANGUAGE" do
|
7
10
|
R18n::I18n.parse_http(nil).should == []
|
@@ -19,14 +22,16 @@ describe R18n::I18n do
|
|
19
22
|
i18n = R18n::I18n.new('en', DIR)
|
20
23
|
i18n.locales.should == [R18n::Locale.load('en')]
|
21
24
|
|
22
|
-
i18n = R18n::I18n.new(['ru', '
|
25
|
+
i18n = R18n::I18n.new(['ru', 'no-LC'], DIR)
|
23
26
|
i18n.locales.should == [R18n::Locale.load('ru'),
|
24
|
-
R18n::UnsupportedLocale.new('
|
27
|
+
R18n::UnsupportedLocale.new('no-LC'),
|
28
|
+
R18n::UnsupportedLocale.new('no'),
|
29
|
+
R18n::UnsupportedLocale.new('en')]
|
25
30
|
end
|
26
31
|
|
27
32
|
it "should return translations dir" do
|
28
33
|
i18n = R18n::I18n.new('en', DIR)
|
29
|
-
i18n.
|
34
|
+
i18n.translation_dirs.expand_path.to_s.should == DIR.expand_path.to_s
|
30
35
|
end
|
31
36
|
|
32
37
|
it "should load translations" do
|
@@ -37,15 +42,13 @@ describe R18n::I18n do
|
|
37
42
|
end
|
38
43
|
|
39
44
|
it "should load default translation" do
|
40
|
-
R18n::I18n.
|
41
|
-
|
42
|
-
i18n = R18n::I18n.new('no_LC', DIR)
|
45
|
+
i18n = R18n::I18n.new('no-LC', DIR)
|
43
46
|
i18n.one.should == 'ONE'
|
44
47
|
i18n.two.should == 'Two'
|
45
48
|
end
|
46
49
|
|
47
50
|
it "should load sublocales for first locale" do
|
48
|
-
R18n::I18n.default = '
|
51
|
+
R18n::I18n.default = 'no-TR'
|
49
52
|
|
50
53
|
i18n = R18n::I18n.new('ru', DIR)
|
51
54
|
i18n.one.should == 'Один'
|
@@ -54,32 +57,74 @@ describe R18n::I18n do
|
|
54
57
|
|
55
58
|
it "should return available translations" do
|
56
59
|
i18n = R18n::I18n.new('en', DIR)
|
57
|
-
i18n.translations.should == {
|
58
|
-
|
60
|
+
i18n.translations.should == { 'no-lc' => 'no-lc', 'ru' => 'Русский',
|
61
|
+
'en' => 'English' }
|
59
62
|
end
|
60
63
|
|
61
64
|
it "should return first locale with locale file" do
|
62
|
-
i18n = R18n::I18n.new(['
|
63
|
-
i18n.locale.should == R18n::Locale.load('
|
65
|
+
i18n = R18n::I18n.new(['no-LC', 'ru', 'en'], DIR)
|
66
|
+
i18n.locale.should == R18n::Locale.load('no-LC')
|
67
|
+
i18n.locale.base.should == R18n::Locale.load('ru')
|
64
68
|
end
|
65
69
|
|
66
70
|
it "should localize objects" do
|
67
|
-
i18n = R18n::I18n.new('ru'
|
71
|
+
i18n = R18n::I18n.new('ru')
|
68
72
|
|
69
73
|
i18n.l(-123456789).should == '−123 456 789'
|
70
74
|
i18n.l(-12345.67).should == '−12 345,67'
|
71
75
|
|
72
76
|
time = Time.at(0).utc
|
73
|
-
i18n.l(time).should =~ /^Чтв, 01 янв 1970, 00:00:00 (GMT|UTC)$/
|
74
|
-
i18n.l(time, :time).should == '00:00'
|
75
77
|
i18n.l(time, '%A').should == 'Четверг'
|
78
|
+
i18n.l(time, :month).should == 'Январь'
|
79
|
+
i18n.l(time, :standard).should == '01.01.1970 00:00'
|
80
|
+
i18n.l(time, :full).should == ' 1 января 1970 00:00'
|
76
81
|
|
77
82
|
i18n.l(Date.new(0)).should == '01.01.0000'
|
78
83
|
end
|
79
84
|
|
80
|
-
it "should
|
85
|
+
it "should localize date for human" do
|
81
86
|
i18n = R18n::I18n.new('ru')
|
82
|
-
|
87
|
+
|
88
|
+
i18n.l(Date.today + 2, :human).should == 'через 2 дня'
|
89
|
+
i18n.l(Date.today + 1, :human).should == 'завтра'
|
90
|
+
i18n.l(Date.today, :human).should == 'сегодня'
|
91
|
+
i18n.l(Date.today - 1, :human).should == 'вчера'
|
92
|
+
i18n.l(Date.today - 3, :human).should == '3 дня назад'
|
93
|
+
|
94
|
+
y2000 = Date.parse('2000-01-08')
|
95
|
+
i18n.l(y2000, :human, Date.parse('2000-01-01')).should == ' 8 января'
|
96
|
+
i18n.l(y2000, :human, Date.parse('1999-01-01')).should == ' 8 января 2000'
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should localize times for human" do
|
100
|
+
i18n = R18n::I18n.new('ru')
|
101
|
+
minute = 60
|
102
|
+
hour = 60 * minute
|
103
|
+
day = 24 * hour
|
104
|
+
zero = Time.at(0).utc
|
105
|
+
|
106
|
+
i18n.l( zero + 7 * day, :human, zero).should == ' 8 января 00:00'
|
107
|
+
i18n.l( zero + 50 * hour, :human, zero).should == 'через 2 дня 02:00'
|
108
|
+
i18n.l( zero + 25 * hour, :human, zero).should == 'завтра 01:00'
|
109
|
+
i18n.l( zero + 70 * minute, :human, zero).should == 'через 1 час'
|
110
|
+
i18n.l( zero + 38 * minute, :human, zero).should == 'через 38 минут'
|
111
|
+
i18n.l( zero + 5, :human, zero).should == 'сейчас'
|
112
|
+
i18n.l( zero - 15, :human, zero).should == 'сейчас'
|
113
|
+
i18n.l( zero - minute, :human, zero).should == '1 минуту назад'
|
114
|
+
i18n.l( zero - 2 * hour, :human, zero).should == '2 часа назад'
|
115
|
+
i18n.l( zero - 13 * hour, :human, zero).should == 'вчера 11:00'
|
116
|
+
i18n.l( zero - 50 * hour, :human, zero).should == '3 дня назад 22:00'
|
117
|
+
i18n.l( zero - 9 * day, :human, zero).should == '23 декабря 1969 00:00'
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should use standard formatter by default" do
|
121
|
+
R18n::I18n.new('ru').l(Time.at(0).utc).should == '01.01.1970 00:00'
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should raise error on unknown formatter" do
|
125
|
+
lambda {
|
126
|
+
R18n::I18n.new('ru').l(Time.at(0).utc, :unknown)
|
127
|
+
}.should raise_error(ArgumentError, /formatter/)
|
83
128
|
end
|
84
129
|
|
85
130
|
end
|
data/spec/locale_spec.rb
CHANGED
@@ -1,33 +1,38 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require File.join(File.dirname(__FILE__),
|
2
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
3
3
|
|
4
4
|
describe R18n::Locale do
|
5
5
|
|
6
6
|
it "should check is locale exists" do
|
7
7
|
R18n::Locale.exists?('ru').should be_true
|
8
|
-
R18n::Locale.exists?('
|
8
|
+
R18n::Locale.exists?('no-LC').should be_false
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should load locale" do
|
12
12
|
locale = R18n::Locale.load('ru')
|
13
|
-
locale
|
14
|
-
locale
|
13
|
+
locale.code.should == 'ru'
|
14
|
+
locale.title.should == 'Русский'
|
15
|
+
locale.ltr?.should be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should load locale by Symbol" do
|
19
|
+
R18n::Locale.load(:ru).should == R18n::Locale.load('ru')
|
15
20
|
end
|
16
21
|
|
17
22
|
it "should use locale's class" do
|
18
23
|
ru = R18n::Locale.load('ru')
|
19
24
|
ru.class.should == R18n::Locales::Ru
|
20
25
|
|
21
|
-
|
22
|
-
|
26
|
+
eo = R18n::Locale.load('eo')
|
27
|
+
eo.class.should == R18n::Locale
|
23
28
|
end
|
24
29
|
|
25
30
|
it "should include locale by +include+ option" do
|
26
|
-
|
31
|
+
enUS = R18n::Locale.load('en-US')
|
27
32
|
en = R18n::Locale.load('en')
|
28
|
-
|
29
|
-
en
|
30
|
-
|
33
|
+
enUS.title.should == 'English (US)'
|
34
|
+
en.title.should == 'English'
|
35
|
+
enUS['week'].should == en['week']
|
31
36
|
end
|
32
37
|
|
33
38
|
it "should be equal to another locale with same code" do
|
@@ -55,12 +60,23 @@ describe R18n::Locale do
|
|
55
60
|
end
|
56
61
|
|
57
62
|
it "should use UnsupportedLocale if locale file isn't exists" do
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
63
|
+
supported = R18n::Locale.load('en')
|
64
|
+
supported.should be_supported
|
65
|
+
|
66
|
+
unsupported = R18n::Locale.load('no-LC')
|
67
|
+
unsupported.should_not be_supported
|
68
|
+
unsupported.should be_a(R18n::UnsupportedLocale)
|
69
|
+
|
70
|
+
unsupported.code.should == 'no-LC'
|
71
|
+
unsupported.title.should == 'no-LC'
|
72
|
+
unsupported.ltr?.should be_true
|
73
|
+
|
74
|
+
unsupported['code'].should == 'no-LC'
|
75
|
+
unsupported['title'].should == 'no-LC'
|
76
|
+
unsupported['direction'].should == 'ltr'
|
77
|
+
|
78
|
+
unsupported.pluralize(5).should == 'n'
|
79
|
+
unsupported.inspect.should == 'Unsupported locale no-LC'
|
64
80
|
end
|
65
81
|
|
66
82
|
it "should format number in local traditions" do
|
@@ -80,14 +96,25 @@ describe R18n::Locale do
|
|
80
96
|
locale.strftime(time, '%a %A').should == 'Чтв Четверг'
|
81
97
|
locale.strftime(time, '%b %B').should == 'янв января'
|
82
98
|
locale.strftime(time, '%H:%M%p').should == '00:00 утра'
|
83
|
-
|
84
|
-
locale.strftime(time, :month).should == 'Январь'
|
85
|
-
locale.strftime(time, :datetime).should =~ /^Чтв, 01 янв 1970, 00:00:00 (GMT|UTC)$/
|
86
99
|
end
|
87
100
|
|
88
101
|
it "should delete slashed from locale for security reasons" do
|
89
102
|
locale = R18n::Locale.load('../spec/translations/general/en')
|
90
103
|
locale.should be_a(R18n::UnsupportedLocale)
|
91
104
|
end
|
105
|
+
|
106
|
+
it "should ignore code case in locales" do
|
107
|
+
upcase = R18n::Locale.load('RU')
|
108
|
+
downcase = R18n::Locale.load('ru')
|
109
|
+
upcase.should == downcase
|
110
|
+
upcase.code.should == 'ru'
|
111
|
+
downcase.code.should == 'ru'
|
112
|
+
|
113
|
+
upcase = R18n::Locale.load('no-LC')
|
114
|
+
downcase = R18n::Locale.load('no-lc')
|
115
|
+
upcase.should == downcase
|
116
|
+
upcase.code.should == 'no-LC'
|
117
|
+
downcase.code.should == 'no-lc'
|
118
|
+
end
|
92
119
|
|
93
120
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'locales', 'cs')
|
3
|
+
|
4
|
+
describe R18n::Locales::Cs do
|
5
|
+
it "should use Czech pluralization" do
|
6
|
+
ru = R18n::Locale.load 'cs'
|
7
|
+
ru.pluralize(0).should == 0
|
8
|
+
ru.pluralize(1).should == 1
|
9
|
+
ru.pluralize(2).should == 2
|
10
|
+
ru.pluralize(3).should == 2
|
11
|
+
ru.pluralize(4).should == 2
|
12
|
+
ru.pluralize(5).should == 'n'
|
13
|
+
ru.pluralize(21).should == 'n'
|
14
|
+
ru.pluralize(11).should == 'n'
|
15
|
+
ru.pluralize(12).should == 'n'
|
16
|
+
ru.pluralize(22).should == 'n'
|
17
|
+
ru.pluralize(57).should == 'n'
|
18
|
+
ru.pluralize(101).should == 'n'
|
19
|
+
ru.pluralize(102).should == 'n'
|
20
|
+
ru.pluralize(111).should == 'n'
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'locales', 'en-us')
|
3
|
+
|
4
|
+
describe R18n::Locales::EnUs do
|
5
|
+
it "should format American English date" do
|
6
|
+
enUS = R18n::I18n.new('en-US')
|
7
|
+
enUS.l(Date.parse('2009-05-01'), :full).should == 'May 1st, 2009'
|
8
|
+
enUS.l(Date.parse('2009-05-02'), :full).should == 'May 2nd, 2009'
|
9
|
+
enUS.l(Date.parse('2009-05-03'), :full).should == 'May 3rd, 2009'
|
10
|
+
enUS.l(Date.parse('2009-05-04'), :full).should == 'May 4th, 2009'
|
11
|
+
enUS.l(Date.parse('2009-05-11'), :full).should == 'May 11th, 2009'
|
12
|
+
enUS.l(Date.parse('2009-05-21'), :full).should == 'May 21st, 2009'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'locales', 'en')
|
3
|
+
|
4
|
+
describe R18n::Locales::En do
|
5
|
+
it "should format English date" do
|
6
|
+
en = R18n::I18n.new('en')
|
7
|
+
en.l(Date.parse('2009-05-01'), :full).should == '1st of May, 2009'
|
8
|
+
en.l(Date.parse('2009-05-02'), :full).should == '2nd of May, 2009'
|
9
|
+
en.l(Date.parse('2009-05-03'), :full).should == '3rd of May, 2009'
|
10
|
+
en.l(Date.parse('2009-05-04'), :full).should == '4th of May, 2009'
|
11
|
+
en.l(Date.parse('2009-05-11'), :full).should == '11th of May, 2009'
|
12
|
+
en.l(Date.parse('2009-05-21'), :full).should == '21st of May, 2009'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'locales', 'fr')
|
3
|
+
|
4
|
+
describe R18n::Locales::Fr do
|
5
|
+
it "should format French date" do
|
6
|
+
fr = R18n::I18n.new('fr')
|
7
|
+
fr.l(Date.parse('2009-07-01'), :full).should == '1er juillet 2009'
|
8
|
+
fr.l(Date.parse('2009-07-02'), :full).should == ' 2 juillet 2009'
|
9
|
+
end
|
10
|
+
end
|
data/spec/locales/pl_spec.rb
CHANGED
@@ -1,25 +1,25 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),
|
2
|
-
require File.join(File.dirname(__FILE__),
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'locales', 'pl')
|
3
3
|
|
4
4
|
describe R18n::Locales::Pl do
|
5
5
|
it "should use Polish pluralization" do
|
6
|
-
|
7
|
-
|
6
|
+
pl = R18n::Locale.load 'pl'
|
7
|
+
pl.pluralize(0).should == 0
|
8
8
|
|
9
|
-
|
10
|
-
ru.pluralize(21).should == 'n'
|
11
|
-
ru.pluralize(101).should == 'n'
|
9
|
+
pl.pluralize(1).should == 1
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
pl.pluralize(2).should == 2
|
12
|
+
pl.pluralize(4).should == 2
|
13
|
+
pl.pluralize(22).should == 2
|
14
|
+
pl.pluralize(102).should == 2
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
pl.pluralize(5).should == 'n'
|
17
|
+
pl.pluralize(11).should == 'n'
|
18
|
+
pl.pluralize(12).should == 'n'
|
19
|
+
pl.pluralize(21).should == 'n'
|
20
|
+
pl.pluralize(57).should == 'n'
|
21
|
+
pl.pluralize(101).should == 'n'
|
22
|
+
pl.pluralize(111).should == 'n'
|
23
|
+
pl.pluralize(112).should == 'n'
|
24
24
|
end
|
25
25
|
end
|
data/spec/locales/ru_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),
|
2
|
-
require File.join(File.dirname(__FILE__),
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'locales', 'ru')
|
3
3
|
|
4
4
|
describe R18n::Locales::Ru do
|
5
5
|
it "should use Russian pluralization" do
|
data/spec/r18n_spec.rb
CHANGED
@@ -22,13 +22,17 @@ describe R18n do
|
|
22
22
|
:c => 2 }
|
23
23
|
end
|
24
24
|
|
25
|
+
it "should convert Time to Date" do
|
26
|
+
R18n::Utils.to_date(Time.now).should == Date.today
|
27
|
+
end
|
28
|
+
|
25
29
|
it "should set untranslated format" do
|
26
|
-
|
30
|
+
i18n = R18n::I18n.new('en', DIR)
|
27
31
|
R18n.untranslated = nil
|
28
|
-
|
32
|
+
i18n.in.not.to_s.should be_nil
|
29
33
|
|
30
34
|
R18n.untranslated = '%1 %2[%3]'
|
31
|
-
|
35
|
+
i18n.in.not.to_s.should == 'in.not in.[not]'
|
32
36
|
end
|
33
37
|
|
34
38
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,108 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'r18n-core', 'translated')
|
4
|
+
|
5
|
+
describe R18n::Translated do
|
6
|
+
before do
|
7
|
+
@user_class = Class.new do
|
8
|
+
include R18n::Translated
|
9
|
+
attr_accessor :name_ru, :name_en
|
10
|
+
end
|
11
|
+
R18n.set(R18n::I18n.new('en'))
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should save methods map" do
|
15
|
+
@user_class.translation :name, :methods => { :ru => :name_ru }
|
16
|
+
@user_class.unlocalized_getters(:name).should == { 'ru' => 'name_ru' }
|
17
|
+
@user_class.unlocalized_setters(:name).should == { 'ru' => 'name_ru=' }
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should autodetect methods map" do
|
21
|
+
@user_class.translation :name
|
22
|
+
@user_class.unlocalized_getters(:name).should == {
|
23
|
+
'en' => 'name_en', 'ru' => 'name_ru' }
|
24
|
+
@user_class.unlocalized_setters(:name).should == {
|
25
|
+
'en' => 'name_en=', 'ru' => 'name_ru=' }
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should translate methods" do
|
29
|
+
@user_class.translation :name
|
30
|
+
user = @user_class.new
|
31
|
+
|
32
|
+
user.name.should be_nil
|
33
|
+
user.name = 'John'
|
34
|
+
user.name.should == 'John'
|
35
|
+
|
36
|
+
R18n.set(R18n::I18n.new('ru'))
|
37
|
+
user.name.should == 'John'
|
38
|
+
user.name = 'Джон'
|
39
|
+
user.name.should == 'Джон'
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should return TranslatedString" do
|
43
|
+
class ::SomeTranslatedClass
|
44
|
+
include R18n::Translated
|
45
|
+
def name_en; 'John'; end
|
46
|
+
translation :name
|
47
|
+
end
|
48
|
+
obj = ::SomeTranslatedClass.new
|
49
|
+
|
50
|
+
obj.name.should be_a(R18n::TranslatedString)
|
51
|
+
obj.name.locale.should == R18n::Locale.load('en')
|
52
|
+
obj.name.path.should == 'SomeTranslatedClass#name'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should search translation by locales priority" do
|
56
|
+
@user_class.translation :name
|
57
|
+
user = @user_class.new
|
58
|
+
|
59
|
+
R18n.set(R18n::I18n.new(['no-LC', 'ru', 'en']))
|
60
|
+
user.name_ru = 'Иван'
|
61
|
+
user.name.locale.should == R18n::Locale.load('ru')
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should use default locale" do
|
65
|
+
@user_class.translation :name
|
66
|
+
user = @user_class.new
|
67
|
+
|
68
|
+
R18n.set(R18n::I18n.new('no-LC'))
|
69
|
+
user.name_en = 'John'
|
70
|
+
user.name.locale.should == R18n::Locale.load('en')
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should use filters" do
|
74
|
+
@user_class.class_eval do
|
75
|
+
def age_en; {1 => '%1 year', 'n' => '%1 years'} end
|
76
|
+
translation :age, :type => 'pl', :no_params => true
|
77
|
+
end
|
78
|
+
user = @user_class.new
|
79
|
+
|
80
|
+
user.age(20).should == '20 years'
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should send params to method if user want it" do
|
84
|
+
@user_class.class_eval do
|
85
|
+
def no_params_en(*params) params.join(' '); end
|
86
|
+
def params_en(*params) params.join(' '); end
|
87
|
+
translations [:no_params, {:no_params => true}], :params
|
88
|
+
end
|
89
|
+
user = @user_class.new
|
90
|
+
|
91
|
+
user.no_params(1, 2).should == ''
|
92
|
+
user.params(1, 2).should == '1 2'
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should return Untranslated when can't find translation" do
|
96
|
+
class ::SomeUntranslatedClass
|
97
|
+
include R18n::Translated
|
98
|
+
|
99
|
+
translation :no
|
100
|
+
end
|
101
|
+
obj = ::SomeUntranslatedClass.new
|
102
|
+
|
103
|
+
obj.no.should be_a(R18n::Untranslated)
|
104
|
+
obj.no.translated_path.should == 'SomeUntranslatedClass#'
|
105
|
+
obj.no.untranslated_path.should == 'no'
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|