i18n-tasks 0.9.33 → 0.9.34
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/README.md +2 -2
- data/i18n-tasks.gemspec +4 -4
- data/lib/i18n/tasks/cli.rb +12 -14
- data/lib/i18n/tasks/command/commands/data.rb +8 -6
- data/lib/i18n/tasks/command/commands/eq_base.rb +2 -2
- data/lib/i18n/tasks/command/commands/health.rb +3 -2
- data/lib/i18n/tasks/command/commands/interpolations.rb +1 -1
- data/lib/i18n/tasks/command/commands/meta.rb +1 -1
- data/lib/i18n/tasks/command/commands/missing.rb +7 -6
- data/lib/i18n/tasks/command/commands/tree.rb +8 -6
- data/lib/i18n/tasks/command/commands/usages.rb +5 -4
- data/lib/i18n/tasks/command/dsl.rb +4 -4
- data/lib/i18n/tasks/command/option_parsers/enum.rb +2 -0
- data/lib/i18n/tasks/command/option_parsers/locale.rb +2 -1
- data/lib/i18n/tasks/command/options/data.rb +1 -0
- data/lib/i18n/tasks/command/options/locales.rb +5 -5
- data/lib/i18n/tasks/concurrent/cached_value.rb +2 -0
- data/lib/i18n/tasks/configuration.rb +4 -4
- data/lib/i18n/tasks/console_context.rb +1 -1
- data/lib/i18n/tasks/data/file_formats.rb +2 -0
- data/lib/i18n/tasks/data/file_system_base.rb +7 -6
- data/lib/i18n/tasks/data/router/conservative_router.rb +2 -1
- data/lib/i18n/tasks/data/router/pattern_router.rb +2 -0
- data/lib/i18n/tasks/data/tree/node.rb +5 -2
- data/lib/i18n/tasks/data/tree/nodes.rb +1 -0
- data/lib/i18n/tasks/data/tree/siblings.rb +9 -2
- data/lib/i18n/tasks/data/tree/traversal.rb +11 -2
- data/lib/i18n/tasks/html_keys.rb +2 -4
- data/lib/i18n/tasks/ignore_keys.rb +4 -3
- data/lib/i18n/tasks/interpolations.rb +4 -2
- data/lib/i18n/tasks/key_pattern_matching.rb +3 -2
- data/lib/i18n/tasks/missing_keys.rb +3 -0
- data/lib/i18n/tasks/plural_keys.rb +6 -1
- data/lib/i18n/tasks/references.rb +2 -0
- data/lib/i18n/tasks/reports/base.rb +3 -2
- data/lib/i18n/tasks/reports/terminal.rb +6 -4
- data/lib/i18n/tasks/scanners/file_scanner.rb +4 -3
- data/lib/i18n/tasks/scanners/files/caching_file_finder.rb +0 -3
- data/lib/i18n/tasks/scanners/files/file_finder.rb +3 -2
- data/lib/i18n/tasks/scanners/occurrence_from_position.rb +3 -3
- data/lib/i18n/tasks/scanners/pattern_scanner.rb +7 -4
- data/lib/i18n/tasks/scanners/pattern_with_scope_scanner.rb +4 -2
- data/lib/i18n/tasks/scanners/relative_keys.rb +1 -0
- data/lib/i18n/tasks/scanners/ruby_ast_scanner.rb +16 -13
- data/lib/i18n/tasks/scanners/ruby_key_literals.rb +3 -3
- data/lib/i18n/tasks/scanners/scanner_multiplexer.rb +2 -0
- data/lib/i18n/tasks/split_key.rb +2 -0
- data/lib/i18n/tasks/string_interpolation.rb +1 -0
- data/lib/i18n/tasks/translation.rb +3 -3
- data/lib/i18n/tasks/translators/base_translator.rb +3 -1
- data/lib/i18n/tasks/translators/deepl_translator.rb +3 -1
- data/lib/i18n/tasks/translators/google_translator.rb +2 -0
- data/lib/i18n/tasks/translators/yandex_translator.rb +2 -0
- data/lib/i18n/tasks/used_keys.rb +13 -10
- data/lib/i18n/tasks/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5477cbdf1fb14c575eaad7221cac570147acfcde877fa5960dcdfd958d76d270
|
|
4
|
+
data.tar.gz: b40dbef296c01aa2c047b8ae2f6ef3567f8643b35895516a8fde281f225e6daa
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f732fc9479ba13cd3acb1c7222401f873ace5a8db1ef248712c1ea4dbdb9d05a7fdc5da5bb3600c7c799c64b7f21b1586518b1feec508a0ad36d211110b07b3e
|
|
7
|
+
data.tar.gz: f05241d9bd75bbecb1cb992882d84c4e9826c00c66b66263e7203603e19c9a188e96ea7f4e4131160e23216265df675f4519d190263cf14de59384bd2e62c88d
|
data/README.md
CHANGED
|
@@ -22,7 +22,7 @@ i18n-tasks can be used with any project using the ruby [i18n gem][i18n-gem] (def
|
|
|
22
22
|
Add i18n-tasks to the Gemfile:
|
|
23
23
|
|
|
24
24
|
```ruby
|
|
25
|
-
gem 'i18n-tasks', '~> 0.9.
|
|
25
|
+
gem 'i18n-tasks', '~> 0.9.34'
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
Copy the default [configuration file](#configuration):
|
|
@@ -385,7 +385,7 @@ See the [config file][config] to find out more.
|
|
|
385
385
|
Where this key is depends on your Google API console:
|
|
386
386
|
|
|
387
387
|
* Old console: API Access -> Simple API Access -> Key for server apps.
|
|
388
|
-
* New console:
|
|
388
|
+
* New console: Nav Menu -> APIs & Services -> Credentials -> Create Credentials -> API Keys -> Restrict Key -> Cloud Translation API
|
|
389
389
|
|
|
390
390
|
In both cases, you may need to create the key if it doesn't exist.
|
|
391
391
|
|
data/i18n-tasks.gemspec
CHANGED
|
@@ -16,16 +16,16 @@ Gem::Specification.new do |s| # rubocop:disable Metrics/BlockLength
|
|
|
16
16
|
|
|
17
17
|
It analyses code statically for key usages, such as `I18n.t('some.key')`, in order to report keys that are missing or unused,
|
|
18
18
|
pre-fill missing keys (optionally from Google Translate), and remove unused keys.
|
|
19
|
-
TEXT
|
|
19
|
+
TEXT
|
|
20
20
|
s.post_install_message = <<~TEXT
|
|
21
21
|
# Install default configuration:
|
|
22
22
|
cp $(bundle exec i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/
|
|
23
23
|
# Add an RSpec for missing and unused keys:
|
|
24
24
|
cp $(bundle exec i18n-tasks gem-path)/templates/rspec/i18n_spec.rb spec/
|
|
25
|
-
TEXT
|
|
25
|
+
TEXT
|
|
26
26
|
s.homepage = 'https://github.com/glebm/i18n-tasks'
|
|
27
27
|
s.metadata = { 'issue_tracker' => 'https://github.com/glebm/i18n-tasks' } if s.respond_to?(:metadata=)
|
|
28
|
-
s.required_ruby_version = '>= 2.
|
|
28
|
+
s.required_ruby_version = '>= 2.5', '< 4.0' if s.respond_to?(:required_ruby_version=)
|
|
29
29
|
|
|
30
30
|
s.files = `git ls-files`.split($/)
|
|
31
31
|
s.files -= s.files.grep(%r{^(doc/|\.|spec/)}) + %w[CHANGES.md config/i18n-tasks.yml Gemfile]
|
|
@@ -46,7 +46,7 @@ TEXT
|
|
|
46
46
|
s.add_development_dependency 'bundler', '~> 2.0', '>= 2.0.1'
|
|
47
47
|
s.add_development_dependency 'rake'
|
|
48
48
|
s.add_development_dependency 'rspec', '~> 3.3'
|
|
49
|
-
s.add_development_dependency 'rubocop', '~>
|
|
49
|
+
s.add_development_dependency 'rubocop', '~> 1.6.1'
|
|
50
50
|
s.add_development_dependency 'simplecov'
|
|
51
51
|
s.add_development_dependency 'yard'
|
|
52
52
|
|
data/lib/i18n/tasks/cli.rb
CHANGED
|
@@ -15,21 +15,19 @@ class I18n::Tasks::CLI
|
|
|
15
15
|
|
|
16
16
|
def start(argv)
|
|
17
17
|
auto_output_coloring do
|
|
18
|
+
exit 1 if run(argv) == :exit1
|
|
19
|
+
rescue OptionParser::ParseError => e
|
|
20
|
+
error e.message, 64
|
|
21
|
+
rescue I18n::Tasks::CommandError => e
|
|
18
22
|
begin
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
rescue I18n::Tasks::CommandError => e
|
|
23
|
-
begin
|
|
24
|
-
error e.message, 78
|
|
25
|
-
ensure
|
|
26
|
-
log_verbose e.backtrace * "\n"
|
|
27
|
-
end
|
|
28
|
-
rescue Errno::EPIPE
|
|
29
|
-
# ignore Errno::EPIPE which is throw when pipe breaks, e.g.:
|
|
30
|
-
# i18n-tasks missing | head
|
|
31
|
-
exit 1
|
|
23
|
+
error e.message, 78
|
|
24
|
+
ensure
|
|
25
|
+
log_verbose e.backtrace * "\n"
|
|
32
26
|
end
|
|
27
|
+
rescue Errno::EPIPE
|
|
28
|
+
# ignore Errno::EPIPE which is throw when pipe breaks, e.g.:
|
|
29
|
+
# i18n-tasks missing | head
|
|
30
|
+
exit 1
|
|
33
31
|
end
|
|
34
32
|
rescue ExecutionError => e
|
|
35
33
|
exit e.exit_code
|
|
@@ -195,7 +193,7 @@ class I18n::Tasks::CLI
|
|
|
195
193
|
end
|
|
196
194
|
end
|
|
197
195
|
|
|
198
|
-
def auto_output_coloring(coloring = ENV['I18N_TASKS_COLOR'] ||
|
|
196
|
+
def auto_output_coloring(coloring = ENV['I18N_TASKS_COLOR'] || $stdout.isatty)
|
|
199
197
|
coloring_was = Rainbow.enabled
|
|
200
198
|
Rainbow.enabled = coloring
|
|
201
199
|
yield
|
|
@@ -12,7 +12,7 @@ module I18n::Tasks
|
|
|
12
12
|
t('i18n_tasks.cmd.args.desc.pattern_router')
|
|
13
13
|
|
|
14
14
|
cmd :normalize,
|
|
15
|
-
pos:
|
|
15
|
+
pos: '[locale ...]',
|
|
16
16
|
desc: t('i18n_tasks.cmd.desc.normalize'),
|
|
17
17
|
args: %i[locales pattern_router]
|
|
18
18
|
|
|
@@ -29,7 +29,7 @@ module I18n::Tasks
|
|
|
29
29
|
def check_normalized(opt)
|
|
30
30
|
non_normalized = i18n.non_normalized_paths locales: opt[:locales]
|
|
31
31
|
terminal_report.check_normalized_results(non_normalized)
|
|
32
|
-
:
|
|
32
|
+
:exit1 unless non_normalized.empty?
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
cmd :mv,
|
|
@@ -37,6 +37,7 @@ module I18n::Tasks
|
|
|
37
37
|
desc: t('i18n_tasks.cmd.desc.mv')
|
|
38
38
|
def mv(opt = {})
|
|
39
39
|
fail CommandError, 'requires FROM_KEY_PATTERN and TO_KEY_PATTERN' if opt[:arguments].size < 2
|
|
40
|
+
|
|
40
41
|
from_pattern = opt[:arguments].shift
|
|
41
42
|
to_pattern = opt[:arguments].shift
|
|
42
43
|
forest = i18n.data_forest
|
|
@@ -50,6 +51,7 @@ module I18n::Tasks
|
|
|
50
51
|
desc: t('i18n_tasks.cmd.desc.rm')
|
|
51
52
|
def rm(opt = {})
|
|
52
53
|
fail CommandError, 'requires KEY_PATTERN' if opt[:arguments].empty?
|
|
54
|
+
|
|
53
55
|
forest = i18n.data_forest
|
|
54
56
|
results = opt[:arguments].each_with_object({}) do |key_pattern, h|
|
|
55
57
|
h.merge! forest.mv_key!(compile_key_pattern(key_pattern), '', root: false)
|
|
@@ -59,7 +61,7 @@ module I18n::Tasks
|
|
|
59
61
|
end
|
|
60
62
|
|
|
61
63
|
cmd :data,
|
|
62
|
-
pos:
|
|
64
|
+
pos: '[locale ...]',
|
|
63
65
|
desc: t('i18n_tasks.cmd.desc.data'),
|
|
64
66
|
args: %i[locales out_format]
|
|
65
67
|
|
|
@@ -68,7 +70,7 @@ module I18n::Tasks
|
|
|
68
70
|
end
|
|
69
71
|
|
|
70
72
|
cmd :data_merge,
|
|
71
|
-
pos:
|
|
73
|
+
pos: '[tree ...]',
|
|
72
74
|
desc: t('i18n_tasks.cmd.desc.data_merge'),
|
|
73
75
|
args: %i[data_format nostdin]
|
|
74
76
|
|
|
@@ -79,7 +81,7 @@ module I18n::Tasks
|
|
|
79
81
|
end
|
|
80
82
|
|
|
81
83
|
cmd :data_write,
|
|
82
|
-
pos:
|
|
84
|
+
pos: '[tree]',
|
|
83
85
|
desc: t('i18n_tasks.cmd.desc.data_write'),
|
|
84
86
|
args: %i[data_format nostdin]
|
|
85
87
|
|
|
@@ -90,7 +92,7 @@ module I18n::Tasks
|
|
|
90
92
|
end
|
|
91
93
|
|
|
92
94
|
cmd :data_remove,
|
|
93
|
-
pos:
|
|
95
|
+
pos: '[tree]',
|
|
94
96
|
desc: t('i18n_tasks.cmd.desc.data_remove'),
|
|
95
97
|
args: %i[data_format nostdin]
|
|
96
98
|
|
|
@@ -7,14 +7,14 @@ module I18n::Tasks
|
|
|
7
7
|
include Command::Collection
|
|
8
8
|
|
|
9
9
|
cmd :eq_base,
|
|
10
|
-
pos:
|
|
10
|
+
pos: '[locale ...]',
|
|
11
11
|
desc: t('i18n_tasks.cmd.desc.eq_base'),
|
|
12
12
|
args: %i[locales out_format]
|
|
13
13
|
|
|
14
14
|
def eq_base(opt = {})
|
|
15
15
|
forest = i18n.eq_base_keys(opt)
|
|
16
16
|
print_forest forest, opt, :eq_base_keys
|
|
17
|
-
:
|
|
17
|
+
:exit1 unless forest.empty?
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -7,7 +7,7 @@ module I18n::Tasks
|
|
|
7
7
|
include Command::Collection
|
|
8
8
|
|
|
9
9
|
cmd :health,
|
|
10
|
-
pos:
|
|
10
|
+
pos: '[locale ...]',
|
|
11
11
|
desc: t('i18n_tasks.cmd.desc.health'),
|
|
12
12
|
args: %i[locales out_format]
|
|
13
13
|
|
|
@@ -15,13 +15,14 @@ module I18n::Tasks
|
|
|
15
15
|
forest = i18n.data_forest(opt[:locales])
|
|
16
16
|
stats = i18n.forest_stats(forest)
|
|
17
17
|
fail CommandError, t('i18n_tasks.health.no_keys_detected') if stats[:key_count].zero?
|
|
18
|
+
|
|
18
19
|
terminal_report.forest_stats forest, stats
|
|
19
20
|
[
|
|
20
21
|
missing(**opt),
|
|
21
22
|
unused(**opt),
|
|
22
23
|
check_consistent_interpolations(**opt),
|
|
23
24
|
check_normalized(**opt)
|
|
24
|
-
].detect { |result| result == :
|
|
25
|
+
].detect { |result| result == :exit1 }
|
|
25
26
|
end
|
|
26
27
|
end
|
|
27
28
|
end
|
|
@@ -14,7 +14,7 @@ module I18n::Tasks
|
|
|
14
14
|
def check_consistent_interpolations(opt = {})
|
|
15
15
|
forest = i18n.inconsistent_interpolations(**opt.slice(:locales, :base_locale))
|
|
16
16
|
print_forest forest, opt, :inconsistent_interpolations
|
|
17
|
-
:
|
|
17
|
+
:exit1 unless forest.empty?
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -23,18 +23,18 @@ module I18n::Tasks
|
|
|
23
23
|
)
|
|
24
24
|
|
|
25
25
|
cmd :missing,
|
|
26
|
-
pos:
|
|
26
|
+
pos: '[locale ...]',
|
|
27
27
|
desc: t('i18n_tasks.cmd.desc.missing'),
|
|
28
28
|
args: %i[locales out_format missing_types]
|
|
29
29
|
|
|
30
30
|
def missing(opt = {})
|
|
31
31
|
forest = i18n.missing_keys(**opt.slice(:locales, :base_locale, :types))
|
|
32
32
|
print_forest forest, opt, :missing_keys
|
|
33
|
-
:
|
|
33
|
+
:exit1 unless forest.empty?
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
cmd :translate_missing,
|
|
37
|
-
pos:
|
|
37
|
+
pos: '[locale ...]',
|
|
38
38
|
desc: t('i18n_tasks.cmd.desc.translate_missing'),
|
|
39
39
|
args: [:locales, :locale_to_translate_from, arg(:out_format).from(1), :translation_backend]
|
|
40
40
|
|
|
@@ -47,13 +47,14 @@ module I18n::Tasks
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
cmd :add_missing,
|
|
50
|
-
pos:
|
|
50
|
+
pos: '[locale ...]',
|
|
51
51
|
desc: t('i18n_tasks.cmd.desc.add_missing'),
|
|
52
52
|
args: [:locales, :out_format, arg(:value) + [{ default: '%{value_or_default_or_human_key}' }],
|
|
53
53
|
['--nil-value', 'Set value to nil. Takes precedence over the value argument.']]
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
# Merge base locale first, as this may affect the value for the other locales
|
|
56
|
+
def add_missing(opt = {})
|
|
57
|
+
[
|
|
57
58
|
[i18n.base_locale] & opt[:locales],
|
|
58
59
|
opt[:locales] - [i18n.base_locale]
|
|
59
60
|
].reject(&:empty?).each_with_object(i18n.empty_forest) do |locales, added|
|
|
@@ -8,7 +8,7 @@ module I18n::Tasks
|
|
|
8
8
|
include I18n::Tasks::KeyPatternMatching
|
|
9
9
|
|
|
10
10
|
cmd :tree_translate,
|
|
11
|
-
pos:
|
|
11
|
+
pos: '[tree (or stdin)]',
|
|
12
12
|
desc: t('i18n_tasks.cmd.desc.tree_translate'),
|
|
13
13
|
args: [:locale_to_translate_from, arg(:data_format).from(1), :translation_backend]
|
|
14
14
|
|
|
@@ -18,7 +18,7 @@ module I18n::Tasks
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
cmd :tree_merge,
|
|
21
|
-
pos:
|
|
21
|
+
pos: '[[tree] [tree] ... (or stdin)]',
|
|
22
22
|
desc: t('i18n_tasks.cmd.desc.tree_merge'),
|
|
23
23
|
args: %i[data_format nostdin]
|
|
24
24
|
|
|
@@ -27,7 +27,7 @@ module I18n::Tasks
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
cmd :tree_filter,
|
|
30
|
-
pos:
|
|
30
|
+
pos: '[pattern] [tree (or stdin)]',
|
|
31
31
|
desc: t('i18n_tasks.cmd.desc.tree_filter'),
|
|
32
32
|
args: %i[data_format pattern]
|
|
33
33
|
|
|
@@ -52,6 +52,7 @@ module I18n::Tasks
|
|
|
52
52
|
args: %i[data_format all_locales]
|
|
53
53
|
def tree_mv(opt = {})
|
|
54
54
|
fail CommandError, 'requires FROM_KEY_PATTERN and TO_KEY_PATTERN' if opt[:arguments].size < 2
|
|
55
|
+
|
|
55
56
|
from_pattern = opt[:arguments].shift
|
|
56
57
|
to_pattern = opt[:arguments].shift
|
|
57
58
|
forest = forest_pos_or_stdin!(opt)
|
|
@@ -60,7 +61,7 @@ module I18n::Tasks
|
|
|
60
61
|
end
|
|
61
62
|
|
|
62
63
|
cmd :tree_subtract,
|
|
63
|
-
pos:
|
|
64
|
+
pos: '[[tree] [tree] ... (or stdin)]',
|
|
64
65
|
desc: t('i18n_tasks.cmd.desc.tree_subtract'),
|
|
65
66
|
args: %i[data_format nostdin]
|
|
66
67
|
|
|
@@ -71,7 +72,7 @@ module I18n::Tasks
|
|
|
71
72
|
end
|
|
72
73
|
|
|
73
74
|
cmd :tree_set_value,
|
|
74
|
-
pos:
|
|
75
|
+
pos: '[VALUE] [tree (or stdin)]',
|
|
75
76
|
desc: t('i18n_tasks.cmd.desc.tree_set_value'),
|
|
76
77
|
args: %i[value data_format nostdin pattern]
|
|
77
78
|
|
|
@@ -80,12 +81,13 @@ module I18n::Tasks
|
|
|
80
81
|
forest = forest_pos_or_stdin!(opt)
|
|
81
82
|
key_pattern = opt[:pattern]
|
|
82
83
|
fail CommandError, 'pass value (-v, --value)' if value.blank?
|
|
84
|
+
|
|
83
85
|
forest.set_each_value!(value, key_pattern)
|
|
84
86
|
print_forest forest, opt
|
|
85
87
|
end
|
|
86
88
|
|
|
87
89
|
cmd :tree_convert,
|
|
88
|
-
pos:
|
|
90
|
+
pos: '[tree (or stdin)]',
|
|
89
91
|
desc: t('i18n_tasks.cmd.desc.tree_convert'),
|
|
90
92
|
args: [arg(:data_format).dup.tap { |a| a[0..1] = ['-f', '--from FORMAT'] },
|
|
91
93
|
arg(:out_format).dup.tap { |a| a[0..1] = ['-t', '--to FORMAT'] }]
|
|
@@ -16,7 +16,7 @@ module I18n::Tasks
|
|
|
16
16
|
t('i18n_tasks.cmd.args.desc.keep_order')
|
|
17
17
|
|
|
18
18
|
cmd :find,
|
|
19
|
-
pos:
|
|
19
|
+
pos: '[pattern]',
|
|
20
20
|
desc: t('i18n_tasks.cmd.desc.find'),
|
|
21
21
|
args: %i[out_format pattern strict]
|
|
22
22
|
|
|
@@ -27,18 +27,18 @@ module I18n::Tasks
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
cmd :unused,
|
|
30
|
-
pos:
|
|
30
|
+
pos: '[locale ...]',
|
|
31
31
|
desc: t('i18n_tasks.cmd.desc.unused'),
|
|
32
32
|
args: %i[locales out_format strict]
|
|
33
33
|
|
|
34
34
|
def unused(opt = {})
|
|
35
35
|
forest = i18n.unused_keys(**opt.slice(:locales, :strict))
|
|
36
36
|
print_forest forest, opt, :unused_keys
|
|
37
|
-
:
|
|
37
|
+
:exit1 unless forest.empty?
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
cmd :remove_unused,
|
|
41
|
-
pos:
|
|
41
|
+
pos: '[locale ...]',
|
|
42
42
|
desc: t('i18n_tasks.cmd.desc.remove_unused'),
|
|
43
43
|
args: %i[locales out_format strict keep_order confirm pattern]
|
|
44
44
|
|
|
@@ -66,6 +66,7 @@ module I18n::Tasks
|
|
|
66
66
|
|
|
67
67
|
def confirm_remove_unused!(unused_keys, opt)
|
|
68
68
|
return if ENV['CONFIRM'] || opt[:confirm]
|
|
69
|
+
|
|
69
70
|
locales = Rainbow(unused_keys.flat_map { |root| root.key.split('+') }.sort.uniq * ', ').bright
|
|
70
71
|
msg = [
|
|
71
72
|
Rainbow(t('i18n_tasks.remove_unused.confirm', count: unused_keys.leaves.count, locales: locales)).red,
|
|
@@ -10,8 +10,8 @@ module I18n::Tasks
|
|
|
10
10
|
end
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def t(*args)
|
|
14
|
-
I18n.t(*args)
|
|
13
|
+
def t(*args, **kwargs)
|
|
14
|
+
I18n.t(*args, **kwargs)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
module ClassMethods
|
|
@@ -42,8 +42,8 @@ module I18n::Tasks
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
# late-bound I18n.t for module bodies
|
|
45
|
-
def t(*args, **
|
|
46
|
-
proc { I18n.t(*args, **
|
|
45
|
+
def t(*args, **kwargs)
|
|
46
|
+
proc { I18n.t(*args, **kwargs) }
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
# if class is a module, merge DSL definitions when it is included
|
|
@@ -16,6 +16,7 @@ module I18n::Tasks
|
|
|
16
16
|
|
|
17
17
|
def call(value, *)
|
|
18
18
|
return @valid.first unless value.present?
|
|
19
|
+
|
|
19
20
|
if @valid.include?(value)
|
|
20
21
|
value
|
|
21
22
|
else
|
|
@@ -37,6 +38,7 @@ module I18n::Tasks
|
|
|
37
38
|
def call(values, *)
|
|
38
39
|
values = Array(values)
|
|
39
40
|
return @valid if values == %w[all]
|
|
41
|
+
|
|
40
42
|
invalid = values - @valid
|
|
41
43
|
if invalid.empty?
|
|
42
44
|
if values.empty?
|
|
@@ -5,12 +5,13 @@ module I18n::Tasks
|
|
|
5
5
|
module OptionParsers
|
|
6
6
|
module Locale
|
|
7
7
|
module Validator
|
|
8
|
-
VALID_LOCALE_RE = /\A\w[\w
|
|
8
|
+
VALID_LOCALE_RE = /\A\w[\w\-.]*\z/i.freeze
|
|
9
9
|
|
|
10
10
|
def validate!(locale)
|
|
11
11
|
if VALID_LOCALE_RE !~ locale
|
|
12
12
|
fail CommandError, I18n.t('i18n_tasks.cmd.errors.invalid_locale', invalid: locale)
|
|
13
13
|
end
|
|
14
|
+
|
|
14
15
|
locale
|
|
15
16
|
end
|
|
16
17
|
end
|
|
@@ -64,6 +64,7 @@ module I18n::Tasks
|
|
|
64
64
|
# @return [I18n::Tasks::Data::Tree::Siblings]
|
|
65
65
|
def parse_forest(src, format)
|
|
66
66
|
fail CommandError, I18n.t('i18n_tasks.cmd.errors.pass_forest') unless src
|
|
67
|
+
|
|
67
68
|
if format == 'keys'
|
|
68
69
|
::I18n::Tasks::Data::Tree::Siblings.from_key_names parse_keys(src)
|
|
69
70
|
else
|
|
@@ -13,22 +13,22 @@ module I18n::Tasks
|
|
|
13
13
|
'--locales en,es,ru',
|
|
14
14
|
Array,
|
|
15
15
|
t('i18n_tasks.cmd.args.desc.locales_filter'),
|
|
16
|
-
parser:
|
|
17
|
-
default:
|
|
16
|
+
parser: OptionParsers::Locale::ListParser,
|
|
17
|
+
default: 'all',
|
|
18
18
|
consume_positional: true
|
|
19
19
|
|
|
20
20
|
arg :locale,
|
|
21
21
|
'-l',
|
|
22
22
|
'--locale en',
|
|
23
23
|
t('i18n_tasks.cmd.args.desc.locale'),
|
|
24
|
-
parser:
|
|
24
|
+
parser: OptionParsers::Locale::Parser,
|
|
25
25
|
default: 'base'
|
|
26
26
|
|
|
27
27
|
arg :locale_to_translate_from,
|
|
28
28
|
'-f',
|
|
29
29
|
'--from en',
|
|
30
30
|
t('i18n_tasks.cmd.args.desc.locale_to_translate_from'),
|
|
31
|
-
parser:
|
|
31
|
+
parser: OptionParsers::Locale::Parser,
|
|
32
32
|
default: 'base'
|
|
33
33
|
|
|
34
34
|
TRANSLATION_BACKENDS = %w[google deepl].freeze
|
|
@@ -36,7 +36,7 @@ module I18n::Tasks
|
|
|
36
36
|
'-b',
|
|
37
37
|
'--backend BACKEND',
|
|
38
38
|
t('i18n_tasks.cmd.args.desc.translation_backend'),
|
|
39
|
-
parser:
|
|
39
|
+
parser: OptionParsers::Locale::Parser,
|
|
40
40
|
default: TRANSLATION_BACKENDS[0]
|
|
41
41
|
end
|
|
42
42
|
end
|