i18n-tasks 0.9.33 → 1.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +28 -11
- data/config/locales/en.yml +5 -3
- data/config/locales/ru.yml +1 -0
- data/i18n-tasks.gemspec +12 -6
- data/lib/i18n/tasks/base_task.rb +2 -1
- data/lib/i18n/tasks/cli.rb +27 -17
- data/lib/i18n/tasks/command/commander.rb +1 -0
- 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 +4 -3
- 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 +22 -9
- 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/common.rb +5 -0
- data/lib/i18n/tasks/command/options/data.rb +4 -1
- data/lib/i18n/tasks/command/options/locales.rb +5 -5
- data/lib/i18n/tasks/concurrent/cached_value.rb +2 -2
- data/lib/i18n/tasks/configuration.rb +17 -10
- data/lib/i18n/tasks/console_context.rb +1 -1
- data/lib/i18n/tasks/data/adapter/yaml_adapter.rb +9 -2
- data/lib/i18n/tasks/data/file_formats.rb +3 -1
- 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 +3 -1
- data/lib/i18n/tasks/data/tree/node.rb +6 -3
- data/lib/i18n/tasks/data/tree/nodes.rb +6 -7
- data/lib/i18n/tasks/data/tree/siblings.rb +10 -4
- data/lib/i18n/tasks/data/tree/traversal.rb +34 -11
- data/lib/i18n/tasks/html_keys.rb +4 -6
- data/lib/i18n/tasks/ignore_keys.rb +4 -3
- data/lib/i18n/tasks/interpolations.rb +10 -4
- data/lib/i18n/tasks/key_pattern_matching.rb +3 -2
- data/lib/i18n/tasks/locale_pathname.rb +1 -1
- data/lib/i18n/tasks/missing_keys.rb +4 -0
- data/lib/i18n/tasks/plural_keys.rb +5 -6
- data/lib/i18n/tasks/references.rb +4 -2
- data/lib/i18n/tasks/reports/base.rb +4 -3
- data/lib/i18n/tasks/reports/terminal.rb +8 -6
- data/lib/i18n/tasks/scanners/ast_matchers/base_matcher.rb +118 -0
- data/lib/i18n/tasks/scanners/ast_matchers/message_receivers_matcher.rb +91 -0
- data/lib/i18n/tasks/scanners/ast_matchers/rails_model_matcher.rb +69 -0
- data/lib/i18n/tasks/scanners/erb_ast_processor.rb +74 -0
- data/lib/i18n/tasks/scanners/erb_ast_scanner.rb +48 -0
- 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/local_ruby_parser.rb +85 -0
- data/lib/i18n/tasks/scanners/occurrence_from_position.rb +3 -3
- data/lib/i18n/tasks/scanners/pattern_mapper.rb +1 -1
- data/lib/i18n/tasks/scanners/pattern_scanner.rb +8 -5
- data/lib/i18n/tasks/scanners/pattern_with_scope_scanner.rb +4 -2
- data/lib/i18n/tasks/scanners/relative_keys.rb +19 -4
- data/lib/i18n/tasks/scanners/results/occurrence.rb +17 -1
- data/lib/i18n/tasks/scanners/ruby_ast_call_finder.rb +9 -34
- data/lib/i18n/tasks/scanners/ruby_ast_scanner.rb +91 -154
- data/lib/i18n/tasks/scanners/ruby_key_literals.rb +4 -4
- data/lib/i18n/tasks/scanners/scanner_multiplexer.rb +2 -0
- data/lib/i18n/tasks/split_key.rb +3 -1
- 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 +5 -3
- data/lib/i18n/tasks/translators/deepl_translator.rb +10 -2
- 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 +21 -14
- data/lib/i18n/tasks/version.rb +1 -1
- data/lib/i18n/tasks.rb +17 -7
- data/templates/config/i18n-tasks.yml +21 -1
- metadata +44 -15
@@ -9,6 +9,7 @@ module I18n::Tasks::Scanners
|
|
9
9
|
class ScannerMultiplexer < Scanner
|
10
10
|
# @param scanners [Array<Scanner>]
|
11
11
|
def initialize(scanners:)
|
12
|
+
super()
|
12
13
|
@scanners = scanners
|
13
14
|
end
|
14
15
|
|
@@ -25,6 +26,7 @@ module I18n::Tasks::Scanners
|
|
25
26
|
# @return [Array<Array<Results::KeyOccurrences>>]
|
26
27
|
def collect_results
|
27
28
|
return [@scanners[0].keys] if @scanners.length == 1
|
29
|
+
|
28
30
|
Array.new(@scanners.length).tap do |results|
|
29
31
|
results_mutex = Mutex.new
|
30
32
|
@scanners.map.with_index do |scanner, i|
|
data/lib/i18n/tasks/split_key.rb
CHANGED
@@ -15,11 +15,12 @@ module I18n
|
|
15
15
|
parts = []
|
16
16
|
pos = 0
|
17
17
|
return [key] if max == 1
|
18
|
+
|
18
19
|
key_parts(key) do |part|
|
19
20
|
parts << part
|
20
21
|
pos += part.length + 1
|
21
22
|
if parts.length + 1 >= max
|
22
|
-
parts << key[pos
|
23
|
+
parts << key[pos..] unless pos == key.length
|
23
24
|
break
|
24
25
|
end
|
25
26
|
end
|
@@ -36,6 +37,7 @@ module I18n
|
|
36
37
|
# dots inside braces or parenthesis are not split on
|
37
38
|
def key_parts(key, &block)
|
38
39
|
return enum_for(:key_parts, key) unless block
|
40
|
+
|
39
41
|
nesting = PARENS
|
40
42
|
counts = PARENS_ZEROS # dup'd later if key contains parenthesis
|
41
43
|
delim = '.'
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'i18n/tasks/translators/deepl_translator
|
4
|
-
require 'i18n/tasks/translators/google_translator
|
5
|
-
require 'i18n/tasks/translators/yandex_translator
|
3
|
+
require 'i18n/tasks/translators/deepl_translator'
|
4
|
+
require 'i18n/tasks/translators/google_translator'
|
5
|
+
require 'i18n/tasks/translators/yandex_translator'
|
6
6
|
|
7
7
|
module I18n::Tasks
|
8
8
|
module Translation
|
@@ -24,6 +24,7 @@ module I18n::Tasks
|
|
24
24
|
# @return [Array<[String, Object]>] translated list
|
25
25
|
def translate_pairs(list, opts)
|
26
26
|
return [] if list.empty?
|
27
|
+
|
27
28
|
opts = opts.dup
|
28
29
|
key_pos = list.each_with_index.inject({}) { |idx, ((k, _v), i)| idx.update(k => i) }
|
29
30
|
# copy reference keys as is, instead of translating
|
@@ -92,8 +93,8 @@ module I18n::Tasks
|
|
92
93
|
end
|
93
94
|
end
|
94
95
|
|
95
|
-
INTERPOLATION_KEY_RE = /%\{[^}]+}
|
96
|
-
UNTRANSLATABLE_STRING = '
|
96
|
+
INTERPOLATION_KEY_RE = /%\{[^}]+}/.freeze
|
97
|
+
UNTRANSLATABLE_STRING = 'X__'
|
97
98
|
|
98
99
|
# @param [String] value
|
99
100
|
# @return [String] 'hello, %{name}' => 'hello, <round-trippable string>'
|
@@ -110,9 +111,10 @@ module I18n::Tasks
|
|
110
111
|
# @return [String] 'hello, <round-trippable string>' => 'hello, %{name}'
|
111
112
|
def restore_interpolations(untranslated, translated)
|
112
113
|
return translated if untranslated !~ INTERPOLATION_KEY_RE
|
114
|
+
|
113
115
|
values = untranslated.scan(INTERPOLATION_KEY_RE)
|
114
116
|
translated.gsub(/#{Regexp.escape(UNTRANSLATABLE_STRING)}\d+/i) do |m|
|
115
|
-
values[m[UNTRANSLATABLE_STRING.length
|
117
|
+
values[m[UNTRANSLATABLE_STRING.length..].to_i]
|
116
118
|
end
|
117
119
|
rescue StandardError => e
|
118
120
|
raise_interpolation_error(untranslated, translated, e)
|
@@ -48,7 +48,8 @@ module I18n::Tasks::Translators
|
|
48
48
|
# @return [String] 'hello, <i18n>%{name}</i18n>' => 'hello, %{name}'
|
49
49
|
def restore_interpolations(untranslated, translated)
|
50
50
|
return translated if untranslated !~ INTERPOLATION_KEY_RE
|
51
|
-
|
51
|
+
|
52
|
+
translated.gsub(%r{</?i18n>}, '')
|
52
53
|
rescue StandardError => e
|
53
54
|
raise_interpolation_error(untranslated, translated, e)
|
54
55
|
end
|
@@ -66,8 +67,15 @@ module I18n::Tasks::Translators
|
|
66
67
|
|
67
68
|
def configure_api_key!
|
68
69
|
api_key = @i18n_tasks.translation_config[:deepl_api_key]
|
70
|
+
host = @i18n_tasks.translation_config[:deepl_host]
|
71
|
+
version = @i18n_tasks.translation_config[:deepl_version]
|
69
72
|
fail ::I18n::Tasks::CommandError, I18n.t('i18n_tasks.deepl_translate.errors.no_api_key') if api_key.blank?
|
70
|
-
|
73
|
+
|
74
|
+
DeepL.configure do |config|
|
75
|
+
config.auth_key = api_key
|
76
|
+
config.host = host unless host.blank?
|
77
|
+
config.version = version unless version.blank?
|
78
|
+
end
|
71
79
|
end
|
72
80
|
end
|
73
81
|
end
|
@@ -46,6 +46,7 @@ module I18n::Tasks::Translators
|
|
46
46
|
# Convert 'es-ES' to 'es'
|
47
47
|
def to_google_translate_compatible_locale(locale)
|
48
48
|
return locale unless locale.include?('-') && !SUPPORTED_LOCALES_WITH_REGION.include?(locale)
|
49
|
+
|
49
50
|
locale.split('-', 2).first
|
50
51
|
end
|
51
52
|
|
@@ -60,6 +61,7 @@ module I18n::Tasks::Translators
|
|
60
61
|
key ||= translation_config[:api_key]
|
61
62
|
end
|
62
63
|
fail ::I18n::Tasks::CommandError, I18n.t('i18n_tasks.google_translate.errors.no_api_key') if key.blank?
|
64
|
+
|
63
65
|
key
|
64
66
|
end
|
65
67
|
end
|
@@ -43,6 +43,7 @@ module I18n::Tasks::Translators
|
|
43
43
|
# Convert 'es-ES' to 'es'
|
44
44
|
def to_yandex_compatible_locale(locale)
|
45
45
|
return locale unless locale.include?('-')
|
46
|
+
|
46
47
|
locale.split('-', 2).first
|
47
48
|
end
|
48
49
|
|
@@ -54,6 +55,7 @@ module I18n::Tasks::Translators
|
|
54
55
|
@api_key ||= begin
|
55
56
|
key = @i18n_tasks.translation_config[:yandex_api_key]
|
56
57
|
fail ::I18n::Tasks::CommandError, I18n.t('i18n_tasks.yandex_translate.errors.no_api_key') if key.blank?
|
58
|
+
|
57
59
|
key
|
58
60
|
end
|
59
61
|
end
|
data/lib/i18n/tasks/used_keys.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'find'
|
4
4
|
require 'i18n/tasks/scanners/pattern_with_scope_scanner'
|
5
5
|
require 'i18n/tasks/scanners/ruby_ast_scanner'
|
6
|
+
require 'i18n/tasks/scanners/erb_ast_scanner'
|
6
7
|
require 'i18n/tasks/scanners/scanner_multiplexer'
|
7
8
|
require 'i18n/tasks/scanners/files/caching_file_finder_provider'
|
8
9
|
require 'i18n/tasks/scanners/files/caching_file_reader'
|
@@ -16,17 +17,20 @@ module I18n::Tasks
|
|
16
17
|
module UsedKeys # rubocop:disable Metrics/ModuleLength
|
17
18
|
SEARCH_DEFAULTS = {
|
18
19
|
paths: %w[app/].freeze,
|
20
|
+
relative_exclude_method_name_paths: [],
|
19
21
|
relative_roots: %w[app/controllers app/helpers app/mailers app/presenters app/views].freeze,
|
20
22
|
scanners: [
|
21
|
-
['::I18n::Tasks::Scanners::RubyAstScanner', only: %w[*.rb]],
|
22
|
-
['::I18n::Tasks::Scanners::
|
23
|
+
['::I18n::Tasks::Scanners::RubyAstScanner', { only: %w[*.rb] }],
|
24
|
+
['::I18n::Tasks::Scanners::ErbAstScanner', { only: %w[*.erb] }],
|
25
|
+
['::I18n::Tasks::Scanners::PatternWithScopeScanner', { exclude: %w[*.erb *.rb] }]
|
23
26
|
],
|
27
|
+
ast_matchers: [],
|
24
28
|
strict: true
|
25
29
|
}.freeze
|
26
30
|
|
27
|
-
ALWAYS_EXCLUDE = %w[*.jpg *.png *.gif *.svg *.ico *.eot *.otf *.ttf *.woff *.woff2 *.pdf *.css *.sass *.scss *.less
|
31
|
+
ALWAYS_EXCLUDE = %w[*.jpg *.jpeg *.png *.gif *.svg *.ico *.eot *.otf *.ttf *.woff *.woff2 *.pdf *.css *.sass *.scss *.less
|
28
32
|
*.yml *.json *.zip *.tar.gz *.swf *.flv *.mp3 *.wav *.flac *.webm *.mp4 *.ogg *.opus
|
29
|
-
*.webp].freeze
|
33
|
+
*.webp *.map *.xlsx].freeze
|
30
34
|
|
31
35
|
# Find all keys in the source and return a forest with the keys in absolute form and their occurrences.
|
32
36
|
#
|
@@ -56,8 +60,8 @@ module I18n::Tasks
|
|
56
60
|
keys = keys.select { |k| k.key =~ key_filter_re }
|
57
61
|
end
|
58
62
|
Data::Tree::Node.new(
|
59
|
-
key:
|
60
|
-
data:
|
63
|
+
key: 'used',
|
64
|
+
data: { key_filter: key_filter },
|
61
65
|
children: Data::Tree::Siblings.from_key_occurrences(keys)
|
62
66
|
).to_siblings
|
63
67
|
end
|
@@ -73,10 +77,11 @@ module I18n::Tasks
|
|
73
77
|
if args && args[:strict]
|
74
78
|
fail CommandError, 'the strict option is global and cannot be applied on the scanner level'
|
75
79
|
end
|
80
|
+
|
76
81
|
ActiveSupport::Inflector.constantize(class_name).new(
|
77
|
-
config:
|
82
|
+
config: merge_scanner_configs(shared_options, args || {}),
|
78
83
|
file_finder_provider: caching_file_finder_provider,
|
79
|
-
file_reader:
|
84
|
+
file_reader: caching_file_reader
|
80
85
|
)
|
81
86
|
end.tap { |scanners| log_verbose { scanners.map { |s| " #{s.class.name} #{s.config.inspect}" } * "\n" } }
|
82
87
|
)
|
@@ -104,7 +109,7 @@ module I18n::Tasks
|
|
104
109
|
|
105
110
|
def merge_scanner_configs(a, b)
|
106
111
|
a.deep_merge(b).tap do |c|
|
107
|
-
%i[scanners paths relative_roots].each do |key|
|
112
|
+
%i[scanners paths relative_exclude_method_name_paths relative_roots].each do |key|
|
108
113
|
c[key] = a[key] if b[key].blank?
|
109
114
|
end
|
110
115
|
%i[exclude].each do |key|
|
@@ -124,7 +129,7 @@ module I18n::Tasks
|
|
124
129
|
|
125
130
|
# @return [Boolean] whether the key is potentially used in a code expression such as `t("category.#{category_key}")`
|
126
131
|
def used_in_expr?(key)
|
127
|
-
!!(key =~ expr_key_re)
|
132
|
+
!!(key =~ expr_key_re)
|
128
133
|
end
|
129
134
|
|
130
135
|
private
|
@@ -140,12 +145,13 @@ module I18n::Tasks
|
|
140
145
|
def expr_key_re(replacement: ':')
|
141
146
|
@expr_key_re ||= begin
|
142
147
|
# disallow patterns with no keys
|
143
|
-
ignore_pattern_re = /\A[
|
148
|
+
ignore_pattern_re = /\A[.#{replacement}]*\z/
|
144
149
|
patterns = used_in_source_tree(strict: false).key_names.select do |k|
|
145
150
|
k.end_with?('.') || k =~ /\#{/
|
146
151
|
end.map do |k|
|
147
152
|
pattern = "#{replace_key_exp(k, replacement)}#{replacement if k.end_with?('.')}"
|
148
153
|
next if pattern =~ ignore_pattern_re
|
154
|
+
|
149
155
|
pattern
|
150
156
|
end.compact
|
151
157
|
compile_key_pattern "{#{patterns * ','}}"
|
@@ -161,17 +167,18 @@ module I18n::Tasks
|
|
161
167
|
braces = []
|
162
168
|
result = []
|
163
169
|
while (match_until = scanner.scan_until(/(?:#?\{|})/))
|
164
|
-
|
170
|
+
case scanner.matched
|
171
|
+
when '#{'
|
165
172
|
braces << scanner.matched
|
166
173
|
result << match_until[0..-3] if braces.length == 1
|
167
|
-
|
174
|
+
when '}'
|
168
175
|
prev_brace = braces.pop
|
169
176
|
result << replacement if braces.empty? && prev_brace == '#{'
|
170
177
|
else
|
171
178
|
braces << '{'
|
172
179
|
end
|
173
180
|
end
|
174
|
-
result << key[scanner.pos
|
181
|
+
result << key[scanner.pos..] unless scanner.eos?
|
175
182
|
result.join
|
176
183
|
end
|
177
184
|
end
|
data/lib/i18n/tasks/version.rb
CHANGED
data/lib/i18n/tasks.rb
CHANGED
@@ -34,6 +34,17 @@ module I18n
|
|
34
34
|
::I18n::Tasks::Commands.send :include, commands_module
|
35
35
|
self
|
36
36
|
end
|
37
|
+
|
38
|
+
# Add AST-matcher to i18n-tasks
|
39
|
+
#
|
40
|
+
# @param matcher_class_name
|
41
|
+
# @return self
|
42
|
+
def add_ast_matcher(matcher_class_name)
|
43
|
+
matchers = I18n::Tasks::Configuration::DEFAULTS[:search][:ast_matchers]
|
44
|
+
matchers << matcher_class_name
|
45
|
+
matchers.uniq!
|
46
|
+
self
|
47
|
+
end
|
37
48
|
end
|
38
49
|
|
39
50
|
@verbose = !ENV['VERBOSE'].nil?
|
@@ -43,19 +54,18 @@ module I18n
|
|
43
54
|
end
|
44
55
|
end
|
45
56
|
|
57
|
+
# Per https://github.com/rails/rails/commit/0181f0edd57a2149278bd59c3519233ca1e0a413#commitcomment-60940992
|
58
|
+
# 'active_support' must be required first even if we only use parts of it.
|
59
|
+
require 'active_support'
|
60
|
+
|
46
61
|
require 'active_support/inflector'
|
47
62
|
require 'active_support/core_ext/hash'
|
48
63
|
require 'active_support/core_ext/array/access'
|
49
64
|
require 'active_support/core_ext/array/extract_options'
|
50
65
|
require 'active_support/core_ext/module/delegation'
|
51
66
|
require 'active_support/core_ext/object/blank'
|
52
|
-
|
53
|
-
|
54
|
-
require 'active_support/core_ext/object/try'
|
55
|
-
rescue LoadError => _e
|
56
|
-
# activesupport ~> 2.3.2
|
57
|
-
require 'active_support/core_ext/try'
|
58
|
-
end
|
67
|
+
require 'active_support/core_ext/object/try'
|
68
|
+
|
59
69
|
require 'rainbow'
|
60
70
|
require 'erubi'
|
61
71
|
|
@@ -64,12 +64,21 @@ search:
|
|
64
64
|
# - app/presenters
|
65
65
|
# - app/views
|
66
66
|
|
67
|
+
## Directories where method names which should not be part of a relative key resolution.
|
68
|
+
# By default, if a relative translation is used inside a method, the name of the method will be considered part of the resolved key.
|
69
|
+
# Directories listed here will not consider the name of the method part of the resolved key
|
70
|
+
#
|
71
|
+
# relative_exclude_method_name_paths:
|
72
|
+
# -
|
73
|
+
|
67
74
|
## Files or `File.fnmatch` patterns to exclude from search. Some files are always excluded regardless of this setting:
|
68
|
-
##
|
75
|
+
## *.jpg *.jpeg *.png *.gif *.svg *.ico *.eot *.otf *.ttf *.woff *.woff2 *.pdf *.css *.sass *.scss *.less
|
76
|
+
## *.yml *.json *.zip *.tar.gz *.swf *.flv *.mp3 *.wav *.flac *.webm *.mp4 *.ogg *.opus *.webp *.map *.xlsx
|
69
77
|
exclude:
|
70
78
|
- app/assets/images
|
71
79
|
- app/assets/fonts
|
72
80
|
- app/assets/videos
|
81
|
+
- app/assets/builds
|
73
82
|
|
74
83
|
## Alternatively, the only files or `File.fnmatch patterns` to search in `paths`:
|
75
84
|
## If specified, this settings takes priority over `exclude`, but `exclude` still applies.
|
@@ -78,6 +87,15 @@ search:
|
|
78
87
|
## If `strict` is `false`, guess usages such as t("categories.#{category}.title"). The default is `true`.
|
79
88
|
# strict: true
|
80
89
|
|
90
|
+
## Allows adding ast_matchers for finding translations using the AST-scanners
|
91
|
+
## The available matchers are:
|
92
|
+
## - RailsModelMatcher
|
93
|
+
## Matches ActiveRecord translations like
|
94
|
+
## User.human_attribute_name(:email) and User.model_name.human
|
95
|
+
##
|
96
|
+
## To implement your own, please see `I18n::Tasks::Scanners::AstMatchers::BaseMatcher`.
|
97
|
+
<%# I18n::Tasks.add_ast_matcher('I18n::Tasks::Scanners::AstMatchers::RailsModelMatcher') %>
|
98
|
+
|
81
99
|
## Multiple scanners can be used. Their results are merged.
|
82
100
|
## The options specified above are passed down to each scanner. Per-scanner options can be specified as well.
|
83
101
|
## See this example of a custom scanner: https://github.com/glebm/i18n-tasks/wiki/A-custom-scanner-example
|
@@ -90,6 +108,8 @@ search:
|
|
90
108
|
# # DeepL Pro Translate
|
91
109
|
# # Get an API key and subscription at https://www.deepl.com/pro to use DeepL Pro
|
92
110
|
# deepl_api_key: "48E92789-57A3-466A-9959-1A1A1A1A1A1A"
|
111
|
+
# # deepl_host: "https://api.deepl.com"
|
112
|
+
# # deepl_version: "v2"
|
93
113
|
|
94
114
|
## Do not consider these keys missing:
|
95
115
|
# ignore_missing:
|
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.
|
4
|
+
version: 1.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- glebm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -38,6 +38,26 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.1.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: better_html
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
- - "<"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '3.0'
|
51
|
+
type: :runtime
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '1.0'
|
58
|
+
- - "<"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '3.0'
|
41
61
|
- !ruby/object:Gem::Dependency
|
42
62
|
name: erubi
|
43
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,12 +163,15 @@ dependencies:
|
|
143
163
|
- !ruby/object:Gem::Version
|
144
164
|
version: 1.5.1
|
145
165
|
- !ruby/object:Gem::Dependency
|
146
|
-
name:
|
166
|
+
name: bundler
|
147
167
|
requirement: !ruby/object:Gem::Requirement
|
148
168
|
requirements:
|
149
169
|
- - "~>"
|
150
170
|
- !ruby/object:Gem::Version
|
151
171
|
version: '2.0'
|
172
|
+
- - ">="
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: 2.0.1
|
152
175
|
type: :development
|
153
176
|
prerelease: false
|
154
177
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -156,26 +179,23 @@ dependencies:
|
|
156
179
|
- - "~>"
|
157
180
|
- !ruby/object:Gem::Version
|
158
181
|
version: '2.0'
|
182
|
+
- - ">="
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: 2.0.1
|
159
185
|
- !ruby/object:Gem::Dependency
|
160
|
-
name:
|
186
|
+
name: overcommit
|
161
187
|
requirement: !ruby/object:Gem::Requirement
|
162
188
|
requirements:
|
163
189
|
- - "~>"
|
164
190
|
- !ruby/object:Gem::Version
|
165
|
-
version:
|
166
|
-
- - ">="
|
167
|
-
- !ruby/object:Gem::Version
|
168
|
-
version: 2.0.1
|
191
|
+
version: 0.58.0
|
169
192
|
type: :development
|
170
193
|
prerelease: false
|
171
194
|
version_requirements: !ruby/object:Gem::Requirement
|
172
195
|
requirements:
|
173
196
|
- - "~>"
|
174
197
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
176
|
-
- - ">="
|
177
|
-
- !ruby/object:Gem::Version
|
178
|
-
version: 2.0.1
|
198
|
+
version: 0.58.0
|
179
199
|
- !ruby/object:Gem::Dependency
|
180
200
|
name: rake
|
181
201
|
requirement: !ruby/object:Gem::Requirement
|
@@ -210,14 +230,14 @@ dependencies:
|
|
210
230
|
requirements:
|
211
231
|
- - "~>"
|
212
232
|
- !ruby/object:Gem::Version
|
213
|
-
version:
|
233
|
+
version: 1.27.0
|
214
234
|
type: :development
|
215
235
|
prerelease: false
|
216
236
|
version_requirements: !ruby/object:Gem::Requirement
|
217
237
|
requirements:
|
218
238
|
- - "~>"
|
219
239
|
- !ruby/object:Gem::Version
|
220
|
-
version:
|
240
|
+
version: 1.27.0
|
221
241
|
- !ruby/object:Gem::Dependency
|
222
242
|
name: simplecov
|
223
243
|
requirement: !ruby/object:Gem::Requirement
|
@@ -357,12 +377,18 @@ files:
|
|
357
377
|
- lib/i18n/tasks/references.rb
|
358
378
|
- lib/i18n/tasks/reports/base.rb
|
359
379
|
- lib/i18n/tasks/reports/terminal.rb
|
380
|
+
- lib/i18n/tasks/scanners/ast_matchers/base_matcher.rb
|
381
|
+
- lib/i18n/tasks/scanners/ast_matchers/message_receivers_matcher.rb
|
382
|
+
- lib/i18n/tasks/scanners/ast_matchers/rails_model_matcher.rb
|
383
|
+
- lib/i18n/tasks/scanners/erb_ast_processor.rb
|
384
|
+
- lib/i18n/tasks/scanners/erb_ast_scanner.rb
|
360
385
|
- lib/i18n/tasks/scanners/file_scanner.rb
|
361
386
|
- lib/i18n/tasks/scanners/files/caching_file_finder.rb
|
362
387
|
- lib/i18n/tasks/scanners/files/caching_file_finder_provider.rb
|
363
388
|
- lib/i18n/tasks/scanners/files/caching_file_reader.rb
|
364
389
|
- lib/i18n/tasks/scanners/files/file_finder.rb
|
365
390
|
- lib/i18n/tasks/scanners/files/file_reader.rb
|
391
|
+
- lib/i18n/tasks/scanners/local_ruby_parser.rb
|
366
392
|
- lib/i18n/tasks/scanners/occurrence_from_position.rb
|
367
393
|
- lib/i18n/tasks/scanners/pattern_mapper.rb
|
368
394
|
- lib/i18n/tasks/scanners/pattern_scanner.rb
|
@@ -394,11 +420,14 @@ licenses:
|
|
394
420
|
- MIT
|
395
421
|
metadata:
|
396
422
|
issue_tracker: https://github.com/glebm/i18n-tasks
|
423
|
+
rubygems_mfa_required: 'true'
|
397
424
|
post_install_message: |
|
398
425
|
# Install default configuration:
|
399
426
|
cp $(bundle exec i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/
|
400
427
|
# Add an RSpec for missing and unused keys:
|
401
428
|
cp $(bundle exec i18n-tasks gem-path)/templates/rspec/i18n_spec.rb spec/
|
429
|
+
# Or for minitest:
|
430
|
+
cp $(bundle exec i18n-tasks gem-path)/templates/minitest/i18n_test.rb test/
|
402
431
|
rdoc_options: []
|
403
432
|
require_paths:
|
404
433
|
- lib
|
@@ -406,7 +435,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
406
435
|
requirements:
|
407
436
|
- - ">="
|
408
437
|
- !ruby/object:Gem::Version
|
409
|
-
version: '2.
|
438
|
+
version: '2.6'
|
410
439
|
- - "<"
|
411
440
|
- !ruby/object:Gem::Version
|
412
441
|
version: '4.0'
|