r18n-core 0.2.3 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|