i18n-tasks 0.3.10 → 0.3.11
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/CHANGES.md +6 -2
- data/README.md +54 -37
- data/lib/i18n/tasks/data/locale_tree.rb +1 -1
- data/lib/i18n/tasks/missing_keys.rb +4 -2
- data/lib/i18n/tasks/plural_keys.rb +3 -3
- data/lib/i18n/tasks/unused_keys.rb +2 -2
- data/lib/i18n/tasks/version.rb +1 -1
- data/spec/fixtures/app/views/index.html.slim +2 -0
- data/spec/i18n_tasks_spec.rb +7 -2
- data/spec/plural_keys_spec.rb +1 -1
- data/spec/support/i18n_tasks_output_matcher.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84ba1f92ba2da94773501e168515c76c3c6c21ab
|
4
|
+
data.tar.gz: 5d72ea2de6df682ab6f57b8f76d051f6d8b0f3e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46efbb3c38b02738ee34069bc4d9384603485f5f0aeba4227139596ce7bd383cb5c9b9b2f98ddadacd9c1c28bec47170e137f02856d2b4de56a7d724ab853a76
|
7
|
+
data.tar.gz: a8b7a4968b32960205152674040c913e4032d999ee90f2b48e789593c1f81cfef3264c5f747d34608246548dd9fbbaafb94e7b01f8b825849515f7cf802956b7
|
data/CHANGES.md
CHANGED
@@ -1,12 +1,16 @@
|
|
1
|
-
## 0.3.
|
1
|
+
## 0.3.11
|
2
2
|
|
3
|
-
*
|
3
|
+
* Improve plural key handling
|
4
4
|
|
5
5
|
## 0.3.10
|
6
6
|
|
7
7
|
* New (de)serialization options in config
|
8
8
|
* `add-missing` placeholder argument can now use %{base_value}.
|
9
9
|
|
10
|
+
## 0.3.9
|
11
|
+
|
12
|
+
* Fix regression: Remove ActiveSupport::HashWithIndifferentAccess from locale data output
|
13
|
+
|
10
14
|
## 0.3.8
|
11
15
|
|
12
16
|
* Fix activesupport ~3.x compatibility issue (#45).
|
data/README.md
CHANGED
@@ -49,6 +49,8 @@ Available commands:
|
|
49
49
|
See `<command> --help` for more information on a specific command.
|
50
50
|
```
|
51
51
|
|
52
|
+
#### Add missing keys
|
53
|
+
|
52
54
|
You can add missing values, generated from the key (for base locale) or copied from the base locale (for other locales).
|
53
55
|
To add missing values to the base locale only:
|
54
56
|
|
@@ -59,6 +61,8 @@ i18n-tasks add-missing base
|
|
59
61
|
i18n-tasks add-missing -p 'PLEASE-TRANSLATE %{base_value}' fr
|
60
62
|
```
|
61
63
|
|
64
|
+
#### Google Translate missing keys
|
65
|
+
|
62
66
|
Translate missing values with Google Translate ([more below on the API key](#translation-config)).
|
63
67
|
|
64
68
|
```bash
|
@@ -67,37 +71,38 @@ i18n-tasks translate-missing
|
|
67
71
|
i18n-tasks translate-missing --from base es fr
|
68
72
|
```
|
69
73
|
|
70
|
-
Sort the keys and write them to their respective files with `normalize`.
|
71
|
-
This always happens on `add-missing` and `translate-missing`.
|
74
|
+
Sort the keys and write them to their respective files with `i18n-tasks normalize`.
|
75
|
+
This always happens on `i18n-tasks add-missing` and `i18n-tasks translate-missing`.
|
72
76
|
|
73
77
|
```bash
|
74
78
|
i18n-tasks normalize
|
75
79
|
```
|
76
80
|
|
77
|
-
|
81
|
+
#### Find usages
|
82
|
+
|
83
|
+
See where the keys are used with `i18n-tasks find`:
|
78
84
|
|
79
85
|
```bash
|
80
|
-
|
81
|
-
i18n-tasks find
|
82
|
-
# Filter by a key pattern
|
86
|
+
i18n-tasks find common.help
|
83
87
|
i18n-tasks find 'auth.*'
|
84
88
|
i18n-tasks find '{number,currency}.format.*'
|
85
89
|
```
|
86
90
|
|
87
91
|
![i18n-screenshot][screenshot-find]
|
88
92
|
|
89
|
-
|
93
|
+
#### Features
|
90
94
|
|
91
|
-
|
95
|
+
Relative keys (`t '.title'`) and plural keys (`key.{one,many,other,...}`) are fully supported.
|
96
|
+
Scope argument is supported, but only when it is the first keyword argument ([improvements welcome](/lib/i18n/tasks/scanners/pattern_with_scope_scanner.rb)):
|
92
97
|
|
93
|
-
```ruby
|
94
|
-
# this is supported
|
95
|
-
t :invalid, scope: [:auth, :password], attempts: 5
|
96
|
-
# but not this
|
97
|
-
t :invalid, attempts: 5, scope: [:auth, :password]
|
98
|
-
```
|
98
|
+
```ruby
|
99
|
+
# this is supported
|
100
|
+
t :invalid, scope: [:auth, :password], attempts: 5
|
101
|
+
# but not this
|
102
|
+
t :invalid, attempts: 5, scope: [:auth, :password]
|
103
|
+
```
|
99
104
|
|
100
|
-
Unused report will detect
|
105
|
+
Unused report will detect certain dynamic key forms and not report them, e.g.:
|
101
106
|
|
102
107
|
```ruby
|
103
108
|
t 'category.' + category.key # all 'category.*' keys are considered used
|
@@ -128,27 +133,38 @@ The default data adapter supports YAML and JSON files.
|
|
128
133
|
|
129
134
|
```yaml
|
130
135
|
# config/i18n-tasks.yml
|
131
|
-
# i18n data storage
|
132
136
|
data:
|
133
|
-
#
|
134
|
-
|
137
|
+
# configure YAML / JSON serializer options
|
138
|
+
# passed directly to load / dump / parse / serialize.
|
139
|
+
yaml:
|
140
|
+
write:
|
141
|
+
# do not wrap lines at 80 characters (override default)
|
142
|
+
line_width: -1
|
143
|
+
```
|
144
|
+
|
145
|
+
#### Multiple locale files
|
146
|
+
|
147
|
+
Use `data.read` and `data.write` options to work with locale data spread over multiple files.
|
148
|
+
|
149
|
+
```
|
150
|
+
# config/i18n-tasks.yml
|
151
|
+
data:
|
135
152
|
# a list of file globs to read from per-locale
|
136
|
-
read:
|
137
|
-
#
|
138
|
-
- 'config/locales/%{locale}.yml'
|
139
|
-
# to also read from namespaced files, e.g. simple_form.en.yml:
|
153
|
+
read:
|
154
|
+
# read from namespaced files, e.g. simple_form.en.yml
|
140
155
|
- 'config/locales/*.%{locale}.yml'
|
156
|
+
# read from a gem (config is parsed with ERB first, then YAML)
|
157
|
+
- "<%= %x[bundle show vagrant].chomp %>/templates/locales/%{locale}.yml"
|
158
|
+
# default
|
159
|
+
- 'config/locales/%{locale}.yml'
|
141
160
|
# a list of {key pattern => file} routes, matched top to bottom
|
142
161
|
write:
|
143
|
-
#
|
144
|
-
- ['
|
145
|
-
#
|
146
|
-
- 'config/locales
|
147
|
-
|
148
|
-
|
149
|
-
write:
|
150
|
-
# do not wrap lines at 80 characters (default)
|
151
|
-
line_width: -1
|
162
|
+
# write models.* and views.* keys to the respective files
|
163
|
+
- ['{models,views}.*', 'config/locales/\1.%{locale}.yml']
|
164
|
+
# or, write every top-level key namespace to its own file
|
165
|
+
- ['{:}.*', 'config/locales/\1.%{locale}.yml']
|
166
|
+
# default, sugar for ['*', path]
|
167
|
+
- 'config/locales/%{locale}.yml'
|
152
168
|
```
|
153
169
|
|
154
170
|
#### Key pattern syntax
|
@@ -159,16 +175,16 @@ data:
|
|
159
175
|
| `:` | matches a single key |
|
160
176
|
| `{a, b.c}` | match any in set, can use `:` and `*`, match is captured |
|
161
177
|
|
162
|
-
|
178
|
+
#### Custom adapters
|
179
|
+
|
180
|
+
If you store data somewhere but in the filesystem, e.g. in the database or mongodb, you can implement a custom adapter.
|
181
|
+
Implement [a handful of methods][adapter-example], then set `data.adapter` to the class name; the rest of the `data` config is passed to the initializer.
|
163
182
|
|
164
183
|
```yaml
|
165
184
|
# config/i18n-tasks.yml
|
166
185
|
data:
|
167
|
-
|
168
|
-
|
169
|
-
- ['{sorcery,simple_form}.*', 'config/locales/\1.%{locale}.yml']
|
170
|
-
# write every key namespace to its own file:
|
171
|
-
- ['{:}.*', 'config/locales/\1.%{locale}.yml']
|
186
|
+
# file_system is the default adapter, you can provide a custom class name here:
|
187
|
+
adapter: file_system
|
172
188
|
```
|
173
189
|
|
174
190
|
### Usage search
|
@@ -308,3 +324,4 @@ This was originally developed for [Zuigo](http://zuigo.com/), a platform to orga
|
|
308
324
|
[badge-code-climate]: http://img.shields.io/codeclimate/github/glebm/i18n-tasks.svg
|
309
325
|
[i18n-gem]: https://github.com/svenfuchs/i18n "svenfuchs/i18n on Github"
|
310
326
|
[screenshot-find]: https://raw.github.com/glebm/i18n-tasks/master/doc/img/i18n-usages.png "i18n-tasks find output screenshot"
|
327
|
+
[adapter-example]: https://github.com/glebm/i18n-tasks/blob/master/lib/i18n/tasks/data/file_system_base.rb
|
@@ -42,8 +42,10 @@ module I18n::Tasks
|
|
42
42
|
@keys_missing_from_locale ||= {}
|
43
43
|
@keys_missing_from_locale[locale] ||= begin
|
44
44
|
keys = data[base_locale].traverse_map_if { |key, base_value|
|
45
|
-
|
46
|
-
|
45
|
+
next if ignore_key?(key, :missing)
|
46
|
+
key = depluralize_key(key, locale)
|
47
|
+
key if !key_value?(key, locale)
|
48
|
+
}.uniq
|
47
49
|
KeyGroup.new keys, type: :missing_from_locale, locale: locale
|
48
50
|
end
|
49
51
|
end
|
@@ -4,11 +4,11 @@ module I18n::Tasks::PluralKeys
|
|
4
4
|
# @param [String] key i18n key
|
5
5
|
# @param [String] locale to pull key data from
|
6
6
|
# @return the base form if the key is a specific plural form (e.g. apple for apple.many), and the key as passed otherwise
|
7
|
-
def depluralize_key(locale = base_locale
|
7
|
+
def depluralize_key(key, locale = base_locale)
|
8
8
|
return key if key !~ PLURAL_KEY_RE || t(key, locale).is_a?(Hash)
|
9
9
|
parent_key = key.split('.')[0..-2] * '.'
|
10
|
-
plural_versions = t(parent_key, locale)
|
11
|
-
if plural_versions.is_a?(Hash) && plural_versions.all? { |k, v| ".#{k}" =~ PLURAL_KEY_RE
|
10
|
+
plural_versions = t(parent_key, locale) || (locale != base_locale && t(parent_key, base_locale))
|
11
|
+
if plural_versions.is_a?(Hash) && plural_versions.all? { |k, v| !v.is_a?(Hash) && ".#{k}" =~ PLURAL_KEY_RE }
|
12
12
|
parent_key
|
13
13
|
else
|
14
14
|
key
|
@@ -10,7 +10,7 @@ module I18n
|
|
10
10
|
@unused_keys[locale] ||= begin
|
11
11
|
keys = data[locale].traverse_map_if { |key, value|
|
12
12
|
next if used_in_expr?(key) || ignore_key?(key, :unused)
|
13
|
-
key = depluralize_key(
|
13
|
+
key = depluralize_key(key, locale)
|
14
14
|
[key, value] unless used_key?(key)
|
15
15
|
}.uniq
|
16
16
|
KeyGroup.new keys, locale: locale, type: :unused
|
@@ -22,7 +22,7 @@ module I18n
|
|
22
22
|
unused = unused_keys
|
23
23
|
locales.each do |locale|
|
24
24
|
used_key_values = data[locale].traverse_map_if { |key, value|
|
25
|
-
[key, value] unless unused.include?(depluralize_key(
|
25
|
+
[key, value] unless unused.include?(depluralize_key(key, locale))
|
26
26
|
}
|
27
27
|
data[locale] = used_key_values
|
28
28
|
end
|
data/lib/i18n/tasks/version.rb
CHANGED
@@ -12,6 +12,8 @@ p = t 'ignore_eq_base_all.a'
|
|
12
12
|
p = t 'ignore_eq_base_es.a'
|
13
13
|
p = t 'numeric.a'
|
14
14
|
p = t 'plural.a', count: 2
|
15
|
+
p = t 'missing_in_es_plural_1.a', count: 2
|
16
|
+
p = t 'missing_in_es_plural_2.a', count: 2
|
15
17
|
p = t 'devise.a'
|
16
18
|
p = t :missing_symbol_key
|
17
19
|
p #{t :"missing_symbol.key_two"} #{t :'missing_symbol.key_three'}
|
data/spec/i18n_tasks_spec.rb
CHANGED
@@ -11,7 +11,8 @@ describe 'i18n-tasks' do
|
|
11
11
|
%w( en.used_but_missing.key en.relative.index.missing
|
12
12
|
es.missing_in_es.a es.blank_in_es.a es.same_in_es.a
|
13
13
|
en.hash.pattern_missing.a en.hash.pattern_missing.b
|
14
|
-
en.missing_symbol_key en.missing_symbol.key_two en.missing_symbol.key_three
|
14
|
+
en.missing_symbol_key en.missing_symbol.key_two en.missing_symbol.key_three
|
15
|
+
es.missing_in_es_plural_1.a es.missing_in_es_plural_2.a)
|
15
16
|
}
|
16
17
|
it 'detects missing or identical' do
|
17
18
|
capture_stderr do
|
@@ -93,6 +94,7 @@ describe 'i18n-tasks' do
|
|
93
94
|
run_cmd :add_missing, locales: 'es'
|
94
95
|
in_test_app_dir {
|
95
96
|
expect(YAML.load_file('config/locales/es.yml')['es']['missing_in_es']['a']).to eq 'EN_TEXT'
|
97
|
+
expect(YAML.load_file('config/locales/es.yml')['es']['missing_in_es_plural_1']['a']['one']).to eq 'EN_TEXT'
|
96
98
|
}
|
97
99
|
end
|
98
100
|
|
@@ -155,6 +157,8 @@ TXT
|
|
155
157
|
'unused' => {'a' => v, 'numeric' => v_num, 'plural' => {'one' => v, 'other' => v}},
|
156
158
|
'ignore_unused' => {'a' => v},
|
157
159
|
'missing_in_es' => {'a' => v},
|
160
|
+
'missing_in_es_plural_1' => { 'a' => {'one' => v, 'other' => v}},
|
161
|
+
'missing_in_es_plural_2' => { 'a' => {'one' => v, 'other' => v}},
|
158
162
|
'same_in_es' => {'a' => v},
|
159
163
|
'ignore_eq_base_all' => {'a' => v},
|
160
164
|
'ignore_eq_base_es' => {'a' => v},
|
@@ -179,7 +183,8 @@ TXT
|
|
179
183
|
}
|
180
184
|
|
181
185
|
en_data = gen_data.('EN_TEXT')
|
182
|
-
es_data = gen_data.('ES_TEXT').except(
|
186
|
+
es_data = gen_data.('ES_TEXT').except(
|
187
|
+
'missing_in_es', 'missing_in_es_plural_1', 'missing_in_es_plural_2')
|
183
188
|
es_data['same_in_es']['a'] = 'EN_TEXT'
|
184
189
|
es_data['blank_in_es']['a'] = ''
|
185
190
|
es_data['ignore_eq_base_all']['a'] = 'EN_TEXT'
|
data/spec/plural_keys_spec.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: i18n-tasks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- glebm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: erubis
|