r18n-core 4.0.0 → 5.0.1
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.
- 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
|