r18n-core 4.0.0 → 5.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog.md +398 -0
- data/README.md +23 -13
- data/lib/r18n-core.rb +10 -25
- data/lib/r18n-core/filter_list.rb +6 -3
- data/lib/r18n-core/filters.rb +21 -22
- data/lib/r18n-core/i18n.rb +9 -16
- data/lib/r18n-core/locale.rb +20 -21
- data/lib/r18n-core/locales/cy.rb +1 -1
- data/lib/r18n-core/locales/en-au.rb +1 -1
- data/lib/r18n-core/locales/en-gb.rb +1 -1
- data/lib/r18n-core/locales/en-us.rb +1 -1
- data/lib/r18n-core/locales/en.rb +2 -2
- data/lib/r18n-core/locales/es-cl.rb +1 -1
- data/lib/r18n-core/locales/es-us.rb +1 -1
- data/lib/r18n-core/locales/es.rb +2 -0
- data/lib/r18n-core/locales/fi.rb +2 -2
- data/lib/r18n-core/locales/fr.rb +3 -3
- data/lib/r18n-core/locales/it.rb +3 -3
- data/lib/r18n-core/locales/pt.rb +2 -0
- data/lib/r18n-core/locales/zh-cn.rb +1 -1
- data/lib/r18n-core/locales/zh-tw.rb +1 -1
- data/lib/r18n-core/locales/zh.rb +2 -0
- data/lib/r18n-core/translated.rb +4 -4
- data/lib/r18n-core/translated_string.rb +1 -6
- data/lib/r18n-core/translation.rb +1 -1
- data/lib/r18n-core/unsupported_locale.rb +2 -0
- data/lib/r18n-core/utils.rb +1 -1
- data/lib/r18n-core/version.rb +1 -1
- metadata +198 -89
- data/.rspec +0 -1
- data/Rakefile +0 -13
- data/r18n-core.gemspec +0 -29
- data/spec/filters_spec.rb +0 -327
- data/spec/i18n_spec.rb +0 -274
- data/spec/locale_spec.rb +0 -251
- data/spec/locales/af_spec.rb +0 -9
- data/spec/locales/cs_spec.rb +0 -23
- data/spec/locales/en-us_spec.rb +0 -28
- data/spec/locales/en_spec.rb +0 -13
- data/spec/locales/es-us_spec.rb +0 -11
- data/spec/locales/fa_spec.rb +0 -10
- data/spec/locales/fi_spec.rb +0 -9
- data/spec/locales/fr_spec.rb +0 -9
- data/spec/locales/hu_spec.rb +0 -19
- data/spec/locales/id_spec.rb +0 -23
- data/spec/locales/it_spec.rb +0 -10
- data/spec/locales/no_spec.rb +0 -9
- data/spec/locales/pl_spec.rb +0 -23
- data/spec/locales/ru_spec.rb +0 -23
- data/spec/locales/sk_spec.rb +0 -23
- data/spec/locales/th_spec.rb +0 -9
- data/spec/locales/vi_spec.rb +0 -9
- data/spec/r18n_spec.rb +0 -192
- data/spec/spec_helper.rb +0 -38
- data/spec/translated_spec.rb +0 -225
- data/spec/translation_spec.rb +0 -189
- data/spec/translations/extension/deep/en.yml +0 -1
- data/spec/translations/extension/en.yml +0 -2
- data/spec/translations/extension/notransl.yml +0 -1
- data/spec/translations/general/en.yml +0 -52
- data/spec/translations/general/nolocale.yml +0 -6
- data/spec/translations/general/ru.yml +0 -7
- data/spec/translations/two/en.yml +0 -2
- data/spec/translations/two/fr.yml +0 -0
- data/spec/translations/with_regions/en-US.yml +0 -0
- data/spec/translations/yaml/en-GB.yml +0 -1
- data/spec/translations/yaml/en-us.yml +0 -1
- data/spec/translations/yaml/en.yaml +0 -1
- data/spec/yaml_loader_spec.rb +0 -63
data/spec/translation_spec.rb
DELETED
@@ -1,189 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe R18n::Translation do
|
4
|
-
it "returns unstranslated string if translation isn't found" do
|
5
|
-
i18n = R18n::I18n.new('en', DIR)
|
6
|
-
expect(i18n.not.exists).to be_kind_of(R18n::Untranslated)
|
7
|
-
expect(i18n.not.exists).not_to be_translated
|
8
|
-
expect(i18n.not.exists | 'default').to eq('default')
|
9
|
-
expect(i18n.not.exists.locale).to eq(R18n.locale('en'))
|
10
|
-
|
11
|
-
expect(i18n.not.exists).to eq(i18n.not.exists)
|
12
|
-
expect(i18n.not.exists).not_to eq(i18n.not.exists2)
|
13
|
-
|
14
|
-
expect(i18n.in | 'default').to eq('default')
|
15
|
-
|
16
|
-
expect(i18n.one).to be_translated
|
17
|
-
expect(i18n.one | 'default').to eq('One')
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'returns strings which can be used as normal strings' do
|
21
|
-
i18n = R18n::I18n.new('en', DIR)
|
22
|
-
expect(i18n.not.exists).not_to be_translated
|
23
|
-
expect(i18n.not.exists.to_s).to be_kind_of(String)
|
24
|
-
expect(i18n.not.exists.to_s.split.first).to be_kind_of(String)
|
25
|
-
expect(i18n.not.exists.to_s.split.first.to_s).to be_kind_of(String)
|
26
|
-
|
27
|
-
expect(i18n.one).to be_translated
|
28
|
-
expect(i18n.one.to_s).to be_kind_of(String)
|
29
|
-
expect(i18n.one.to_s.split.first).to be_kind_of(String)
|
30
|
-
expect(i18n.one.to_s.split.first.to_s).to be_kind_of(String)
|
31
|
-
expect(i18n.one.split.first).to be_kind_of(String)
|
32
|
-
expect(i18n.one.split.first.to_s).to be_kind_of(String)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'returns strings compatible with activesupport json encoding' do
|
36
|
-
require 'active_support'
|
37
|
-
|
38
|
-
i18n = R18n::I18n.new('en', DIR)
|
39
|
-
json = ActiveSupport::JSON.encode(one: i18n.one)
|
40
|
-
|
41
|
-
expect(json).to eq('{"one":"One"}')
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'returns strings by Boolean keys (true, false)' do
|
45
|
-
i18n = R18n::I18n.new('en', DIR)
|
46
|
-
|
47
|
-
expect(i18n.boolean[true]).to eq('Boolean is true')
|
48
|
-
expect(i18n.boolean[false]).to eq('Boolean is false')
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'returns html escaped string if html_safe is defined' do
|
52
|
-
klass = Class.new(R18n::TranslatedString) do
|
53
|
-
def html_safe
|
54
|
-
'2'
|
55
|
-
end
|
56
|
-
end
|
57
|
-
str = klass.new('1', nil, nil)
|
58
|
-
|
59
|
-
expect(str).to be_html_safe
|
60
|
-
expect(str.html_safe).to eq('2')
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'returns unescaped string if html_safe is not defined' do
|
64
|
-
klass = Class.new(R18n::TranslatedString) do
|
65
|
-
undef_method :html_safe if method_defined?(:html_safe)
|
66
|
-
end
|
67
|
-
str = klass.new('a & b', nil, nil)
|
68
|
-
|
69
|
-
expect(str).not_to be_html_safe
|
70
|
-
expect(str.to_s).to eq('a & b')
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'loads use hierarchical translations' do
|
74
|
-
i18n = R18n::I18n.new(%w[ru en], DIR)
|
75
|
-
expect(i18n.in.another.level).to eq('Иерархический')
|
76
|
-
expect(i18n[:in][:another][:level]).to eq('Иерархический')
|
77
|
-
expect(i18n['in']['another']['level']).to eq('Иерархический')
|
78
|
-
expect(i18n.only.english).to eq('Only in English')
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'saves path for translation' do
|
82
|
-
i18n = R18n::I18n.new('en', DIR)
|
83
|
-
|
84
|
-
expect(i18n.in.another.level.path).to eq('in.another.level')
|
85
|
-
|
86
|
-
expect(i18n.in.another.not.exists.path).to eq('in.another.not.exists')
|
87
|
-
expect(i18n.in.another.not.exists.untranslated_path).to eq('not.exists')
|
88
|
-
expect(i18n.in.another.not.exists.translated_path).to eq('in.another.')
|
89
|
-
|
90
|
-
expect(i18n.not.untranslated_path).to eq('not')
|
91
|
-
expect(i18n.not.translated_path).to eq('')
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'returns translation keys' do
|
95
|
-
i18n = R18n::I18n.new('en', [DIR, TWO])
|
96
|
-
expect(i18n.in.translation_keys).to match_array(%w[another two])
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'returns string with locale info' do
|
100
|
-
i18n = R18n::I18n.new(%w[nolocale en], DIR)
|
101
|
-
expect(i18n.one.locale).to eq(R18n::UnsupportedLocale.new('nolocale'))
|
102
|
-
expect(i18n.two.locale).to eq(R18n.locale('en'))
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'filters typed data' do
|
106
|
-
en = R18n.locale('en')
|
107
|
-
translation = R18n::Translation.new(
|
108
|
-
en, '', locale: en, translations: {
|
109
|
-
'count' => R18n::Typed.new('pl', 1 => 'one', 'n' => 'many')
|
110
|
-
}
|
111
|
-
)
|
112
|
-
|
113
|
-
expect(translation.count(1)).to eq('one')
|
114
|
-
expect(translation.count(5)).to eq('many')
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'returns hash of translations' do
|
118
|
-
i18n = R18n::I18n.new('en', DIR)
|
119
|
-
expect(i18n.in.to_hash).to eq(
|
120
|
-
'another' => { 'level' => 'Hierarchical' }
|
121
|
-
)
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'returns untranslated, when we go deeper string' do
|
125
|
-
en = R18n.locale('en')
|
126
|
-
translation = R18n::Translation.new(
|
127
|
-
en, '', locale: en, translations: { 'a' => 'A' }
|
128
|
-
)
|
129
|
-
|
130
|
-
expect(translation.a.no_tr).to be_kind_of(R18n::Untranslated)
|
131
|
-
expect(translation.a.no_tr.translated_path).to eq('a.')
|
132
|
-
expect(translation.a.no_tr.untranslated_path).to eq('no_tr')
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'inspects translation' do
|
136
|
-
en = R18n.locale('en')
|
137
|
-
|
138
|
-
translation = R18n::Translation.new(
|
139
|
-
en, 'a', locale: en, translations: { 'a' => 'A' }
|
140
|
-
)
|
141
|
-
expect(translation.inspect).to eq('Translation `a` for en {"a"=>"A"}')
|
142
|
-
|
143
|
-
translation = R18n::Translation.new(
|
144
|
-
en, '', locale: en, translations: { 'a' => 'A' }
|
145
|
-
)
|
146
|
-
expect(translation.inspect).to eq('Translation root for en {"a"=>"A"}')
|
147
|
-
|
148
|
-
translation = R18n::Translation.new(en, '')
|
149
|
-
expect(translation.inspect).to eq('Translation root for en {}')
|
150
|
-
end
|
151
|
-
|
152
|
-
describe '#dig' do
|
153
|
-
subject { R18n::I18n.new('en', DIR).in.dig(*keys) }
|
154
|
-
|
155
|
-
context 'with existing keys' do
|
156
|
-
let(:keys) { %w[another level] }
|
157
|
-
|
158
|
-
it { is_expected.to be_translated }
|
159
|
-
end
|
160
|
-
|
161
|
-
context 'with non-existing keys' do
|
162
|
-
let(:keys) { %w[non-existing level] }
|
163
|
-
|
164
|
-
it { is_expected.not_to be_translated }
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
context '`itself` key' do
|
169
|
-
subject { R18n::I18n.new('en', DIR).page.itself.not_found }
|
170
|
-
|
171
|
-
it { is_expected.to be_translated }
|
172
|
-
it { is_expected.to eq 'Not found' }
|
173
|
-
end
|
174
|
-
|
175
|
-
it 'handles #to_ary' do
|
176
|
-
i18n = R18n::I18n.new('en', DIR)
|
177
|
-
expect([i18n.one, i18n.two].flatten).to eq [i18n.one, i18n.two]
|
178
|
-
end
|
179
|
-
|
180
|
-
it 'handles #to_hash' do
|
181
|
-
i18n = R18n::I18n.new('en', DIR)
|
182
|
-
|
183
|
-
def foo(*args, **opts)
|
184
|
-
[args, opts]
|
185
|
-
end
|
186
|
-
|
187
|
-
expect(foo(i18n.one)).to eq [[i18n.one], {}]
|
188
|
-
end
|
189
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
deep: Deep one
|
@@ -1 +0,0 @@
|
|
1
|
-
ext: NO
|
@@ -1,52 +0,0 @@
|
|
1
|
-
one: One
|
2
|
-
two: Two
|
3
|
-
|
4
|
-
params: Is %1 between %1 and %2?
|
5
|
-
|
6
|
-
in:
|
7
|
-
another:
|
8
|
-
level: Hierarchical
|
9
|
-
|
10
|
-
only:
|
11
|
-
english: Only in English
|
12
|
-
|
13
|
-
comments: !!pl
|
14
|
-
0: "no comments for %2"
|
15
|
-
1: "one comment for %2"
|
16
|
-
n: "%1 comments for %2"
|
17
|
-
|
18
|
-
files: !!pl
|
19
|
-
1: "1 file"
|
20
|
-
n: "%1 files"
|
21
|
-
|
22
|
-
your_filter: !!your another
|
23
|
-
my_filter: !!my value
|
24
|
-
my_tree_filter: !!my
|
25
|
-
name: value
|
26
|
-
|
27
|
-
html: !!escape
|
28
|
-
<script>true && false</script>
|
29
|
-
greater: 1 < 2 is %1
|
30
|
-
no_escape: !!html
|
31
|
-
<b>Warning</b>
|
32
|
-
escape_params: <b>%1</b>
|
33
|
-
|
34
|
-
markdown:
|
35
|
-
simple: !!markdown "**Hi!**"
|
36
|
-
html: !!markdown "**Hi!** <br />"
|
37
|
-
|
38
|
-
textile:
|
39
|
-
simple: !!textile _Hi!_
|
40
|
-
html: !!textile _Hi!_<br />
|
41
|
-
|
42
|
-
echo: Value is %{value}
|
43
|
-
echo2: Value2 is {{value}}
|
44
|
-
|
45
|
-
boolean:
|
46
|
-
true: Boolean is true
|
47
|
-
false: Boolean is false
|
48
|
-
|
49
|
-
page:
|
50
|
-
header: Title
|
51
|
-
itself:
|
52
|
-
not_found: Not found
|
File without changes
|
File without changes
|
@@ -1 +0,0 @@
|
|
1
|
-
one: British One
|
@@ -1 +0,0 @@
|
|
1
|
-
one: American One
|
@@ -1 +0,0 @@
|
|
1
|
-
one: One
|
data/spec/yaml_loader_spec.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe R18n::Loader::YAML do
|
4
|
-
before :all do
|
5
|
-
R18n::Filters.add('my', :my) { |i| i }
|
6
|
-
end
|
7
|
-
|
8
|
-
after :all do
|
9
|
-
R18n::Filters.delete(:my)
|
10
|
-
end
|
11
|
-
|
12
|
-
before do
|
13
|
-
@loader = R18n::Loader::YAML.new(DIR)
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'returns dir with translations' do
|
17
|
-
expect(@loader.dir).to eq(DIR)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'equals to another YAML loader with same dir' do
|
21
|
-
expect(@loader).to eq(R18n::Loader::YAML.new(DIR))
|
22
|
-
expect(@loader).not_to eq(Class.new(R18n::Loader::YAML).new(DIR))
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'returns all available translations' do
|
26
|
-
expect(@loader.available).to match_array([
|
27
|
-
R18n.locale('ru'),
|
28
|
-
R18n.locale('en'),
|
29
|
-
R18n.locale('nolocale')
|
30
|
-
])
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'loads translation' do
|
34
|
-
expect(@loader.load(R18n.locale('ru'))).to eq(
|
35
|
-
'one' => 'Один',
|
36
|
-
'in' => { 'another' => { 'level' => 'Иерархический' } },
|
37
|
-
'typed' => R18n::Typed.new('my', 'value')
|
38
|
-
)
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'returns hash by dir' do
|
42
|
-
expect(@loader.hash).to eq(R18n::Loader::YAML.new(DIR).hash)
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'loads in dir recursively' do
|
46
|
-
loader = R18n::Loader::YAML.new(TRANSLATIONS)
|
47
|
-
expect(loader.available).to match_array([
|
48
|
-
R18n.locale('ru'),
|
49
|
-
R18n.locale('en'),
|
50
|
-
R18n.locale('en-us'),
|
51
|
-
R18n.locale('en-gb'),
|
52
|
-
R18n.locale('fr'),
|
53
|
-
R18n.locale('notransl'),
|
54
|
-
R18n.locale('nolocale')
|
55
|
-
])
|
56
|
-
|
57
|
-
translation = loader.load(R18n.locale('en'))
|
58
|
-
expect(translation['two']).to eq('Two')
|
59
|
-
expect(translation['in']['two']).to eq('Two')
|
60
|
-
expect(translation['ext']).to eq('Extension')
|
61
|
-
expect(translation['deep']).to eq('Deep one')
|
62
|
-
end
|
63
|
-
end
|