i18n-js 4.0.1 → 4.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fb5f60568907f90a59b7d19a6b2f61cf9a3fff95ea419b1b8b31deab16529dc6
4
- data.tar.gz: ca65b2bf6717b93218092e8c994cdbac8af6bc69fddab421ebef976c87dc5503
3
+ metadata.gz: 60f1ad0e9477d8e6570573f64ac2a55136653da8e4791c6fc32e69c9547e197b
4
+ data.tar.gz: d46a3d8b8a25020635d9c108b2cb2caf3a256e419112a21a0d986f94e1e19c37
5
5
  SHA512:
6
- metadata.gz: 3e33c8605b5197cbdc6a8f30ef1cb7e5f911f84dd177d488489fcfc82e5dd2b8fb3e387b0fe89683c3e71c6025ff7b47685163317540c4e2c5c756936660be55
7
- data.tar.gz: b4367db58b89392c42c94121ccdde7179e1ea455de6c20685ded2c034304ce4c8c44cbfa1a4967610443e4f91116058ee86bc14d2e913a2c6006ee648c189dd9
6
+ metadata.gz: a1d63d094866a836a69a9b3fc8f2989608a1b794daf5d5c82062e17b3bcb07ab7fb0ec8f2c05aa27a2585236cff33d974c313ca81be96de129340ecce8f78490
7
+ data.tar.gz: 7ec126b41663f765a421950c1ddcb215d460681355088fc77731673c44f3baf590cc58c6e5841bc9dda6f58732249488cdad3b020287b57d7d1de70cf8e95716
@@ -9,12 +9,15 @@ on:
9
9
 
10
10
  jobs:
11
11
  build:
12
- name: Tests with Ruby ${{ matrix.ruby }} and ${{ matrix.gemfile }}
12
+ name:
13
+ Tests with Ruby ${{ matrix.ruby }}, Node ${{ matrix.node }} and ${{
14
+ matrix.gemfile }}
13
15
  runs-on: "ubuntu-latest"
14
16
  strategy:
15
17
  fail-fast: false
16
18
  matrix:
17
19
  ruby: ["2.7", "3.0", "3.1"]
20
+ node: ["16", "18"]
18
21
  gemfile:
19
22
  - Gemfile
20
23
  if: |
@@ -32,6 +35,23 @@ jobs:
32
35
  ${{ runner.os }}-${{ matrix.ruby }}-gems-${{
33
36
  hashFiles(matrix.gemfile) }}
34
37
 
38
+ - uses: actions/cache@v3
39
+ id: npm-cache
40
+ with:
41
+ path: vendor/bundle
42
+ key: >
43
+ ${{ runner.os }}-${{ matrix.node }}-npm-${{
44
+ hashFiles('package.json') }}
45
+
46
+ - name: Set up Node
47
+ uses: actions/setup-node@v2-beta
48
+ with:
49
+ node-version: ${{ matrix.node }}
50
+
51
+ - name: Install npm dependencies
52
+ run: |
53
+ yarn install
54
+
35
55
  - name: Set up Ruby
36
56
  uses: ruby/setup-ruby@v1
37
57
  with:
@@ -49,4 +69,5 @@ jobs:
49
69
  env:
50
70
  BUNDLE_GEMFILE: ${{ matrix.gemfile }}
51
71
  run: |
72
+ yarn compile
52
73
  bundle exec rake
data/.gitignore CHANGED
@@ -9,3 +9,5 @@
9
9
  /vendor/
10
10
  *.log
11
11
  *.lock
12
+ /lib/**/*.js
13
+ /test/output
data/.rubocop.yml CHANGED
@@ -14,3 +14,6 @@ Naming/FileName:
14
14
  Exclude:
15
15
  - lib/i18n-js.rb
16
16
  - lib/guard/i18n-js.rb
17
+
18
+ Style/PerlBackrefs:
19
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -11,13 +11,25 @@ Prefix your message with one of the following:
11
11
  - [Security] in case of vulnerabilities.
12
12
  -->
13
13
 
14
- ## v4.0.1
14
+ ## v4.1.0 - Dec 09, 2022
15
+
16
+ - [Added] Parse configuration files as erb.
17
+ - [Changed] `I18n.listen(run_on_start:)` was added to control if files should be
18
+ exported during `I18n.listen`'s boot. The default value is `true`.
19
+ - [Added] Now it's possible to transform translations before exporting them
20
+ using a stable plugin api.
21
+ - [Deprecated] The `i18n check` has been deprecated. Use
22
+ `i18n lint:translations` instead.
23
+ - [Added] Use `i18n lint:scripts` to lint JavaScript/TypeScript.
24
+ - [Fixed] Expand paths passed to `I18nJS.listen(locales_dir:)`.
25
+
26
+ ## v4.0.1 - Aug 25, 2022
15
27
 
16
28
  - [Fixed] Shell out export to avoid handling I18n reloading heuristics.
17
29
  - [Changed] `I18nJS.listen` now accepts a directories list to watch.
18
30
  - [Changed] `I18nJS.listen` now accepts
19
31
  [listen](https://rubygems.org/gems/listen) options via `:options`.
20
32
 
21
- ## Jul 29, 2022
33
+ ## v4.0.0 - Jul 29, 2022
22
34
 
23
35
  - Official release of i18n-js v4.0.0.
@@ -135,7 +135,7 @@ not even using it on my projects) or eRb files.
135
135
 
136
136
  ### Upgrading the configuration file
137
137
 
138
- The configuration file loaded from `config/i18nyml` has changed. Given the v3
138
+ The configuration file loaded from `config/i18n.yml` has changed. Given the v3
139
139
  configuration below
140
140
 
141
141
  ```yaml
data/README.md CHANGED
@@ -76,6 +76,22 @@ The output path can use the following placeholders:
76
76
  - `:locale`: the language that's being exported.
77
77
  - `:digest`: the MD5 hex digest of the exported file.
78
78
 
79
+ The config file is processed as erb, so you can have dynamic content on it if
80
+ you want. The following example shows how to use groups from a variable.
81
+
82
+ ```yml
83
+ ---
84
+ <% group = "{en,pt}" %>
85
+
86
+ translations:
87
+ - file: app/frontend/translations.json
88
+ patterns:
89
+ - "<%= group %>.*"
90
+ - "!<%= group %>.activerecord"
91
+ - "!<%= group %>.errors"
92
+ - "!<%= group %>.number.nth"
93
+ ```
94
+
79
95
  The Ruby API:
80
96
 
81
97
  ```ruby
@@ -96,7 +112,9 @@ Commands:
96
112
  - init: Initialize a project
97
113
  - export: Export translations as JSON files
98
114
  - version: Show package version
99
- - check: Check for missing translations
115
+ - plugins: List plugins that will be activated
116
+ - lint:translations: Check for missing translations
117
+ - lint:scripts: Lint files using TypeScript
100
118
 
101
119
  Run `i18n COMMAND --help` for more information on specific commands.
102
120
  ```
@@ -105,14 +123,126 @@ By default, `i18n` will use `config/i18n.yml` and `config/environment.rb` as the
105
123
  configuration files. If you don't have these files, then you'll need to specify
106
124
  both `--config` and `--require`.
107
125
 
126
+ ### Plugins
127
+
128
+ #### Built-in plugins:
129
+
130
+ ##### `embed_fallback_translations`:
131
+
132
+ Embed fallback translations inferred from the default locale. This can be useful
133
+ in cases where you have multiple large translation files and don't want to load
134
+ the default locale together with the target locale.
135
+
136
+ To use it, add the following to your configuration file:
137
+
138
+ ```yaml
139
+ embed_fallback_translations:
140
+ enabled: true
141
+ ```
142
+
143
+ #### Plugin API
144
+
145
+ You can transform the exported translations by adding plugins. A plugin must
146
+ inherit from `I18nJS::Plugin` and can have 3 class methods. The following
147
+ example shows how the built-in `embed_fallback_translations` plugin is
148
+ implemented.
149
+
150
+ ```ruby
151
+ # frozen_string_literal: true
152
+
153
+ module I18nJS
154
+ require "i18n-js/plugin"
155
+
156
+ class EmbedFallbackTranslationsPlugin < I18nJS::Plugin
157
+ CONFIG_KEY = :embed_fallback_translations
158
+
159
+ # This method must set up the basic plugin configuration, like adding the
160
+ # config's root key in case your plugin accepts configuration (defined via
161
+ # the config file).
162
+ #
163
+ # If you don't add this key, the linter will prevent non-default keys from
164
+ # being added to the configuration file.
165
+ def self.setup
166
+ I18nJS::Schema.root_keys << CONFIG_KEY
167
+ end
168
+
169
+ # In case your plugin accepts configuration, this is where you must validate
170
+ # the configuration, making sure only valid keys and type is provided.
171
+ # If the configuration contains invalid data, then you must raise an
172
+ # exception using something like
173
+ # `raise I18nJS::Schema::InvalidError, error_message`.
174
+ def self.validate_schema(config:)
175
+ return unless config.key?(CONFIG_KEY)
176
+
177
+ plugin_config = config[CONFIG_KEY]
178
+ valid_keys = %i[enabled]
179
+ schema = I18nJS::Schema.new(config)
180
+
181
+ schema.expect_required_keys(valid_keys, plugin_config)
182
+ schema.reject_extraneous_keys(valid_keys, plugin_config)
183
+ schema.expect_enabled_config(CONFIG_KEY, plugin_config[:enabled])
184
+ end
185
+
186
+ # This method is responsible for transforming the translations. The
187
+ # translations you'll receive may be already be filtered by other plugins
188
+ # and by the default filtering itself. If you need to access the original
189
+ # translations, use `I18nJS.translations`.
190
+ #
191
+ # Make sure you always check whether your plugin is active before
192
+ # transforming translations; otherwise, opting out transformation won't be
193
+ # possible.
194
+ def self.transform(translations:, config:)
195
+ return translations unless config.dig(CONFIG_KEY, :enabled)
196
+
197
+ translations_glob = Glob.new(translations)
198
+ translations_glob << "*"
199
+
200
+ mapping = translations.keys.each_with_object({}) do |locale, buffer|
201
+ buffer[locale] = Glob.new(translations[locale]).tap do |glob|
202
+ glob << "*"
203
+ end
204
+ end
205
+
206
+ default_locale = I18n.default_locale
207
+ default_locale_glob = mapping.delete(default_locale)
208
+ default_locale_paths = default_locale_glob.paths
209
+
210
+ mapping.each do |locale, glob|
211
+ missing_keys = default_locale_paths - glob.paths
212
+
213
+ missing_keys.each do |key|
214
+ components = key.split(".").map(&:to_sym)
215
+ fallback_translation = translations.dig(default_locale, *components)
216
+
217
+ next unless fallback_translation
218
+
219
+ translations_glob.set([locale, key].join("."), fallback_translation)
220
+ end
221
+ end
222
+
223
+ translations_glob.to_h
224
+ end
225
+ end
226
+
227
+ I18nJS.register_plugin(EmbedFallbackTranslationsPlugin)
228
+ end
229
+ ```
230
+
231
+ To distribute this plugin, you need to create a gem package that matches the
232
+ pattern `i18n-js/*_plugin.rb`. You can test whether your plugin will be found by
233
+ installing your gem, opening a iRB session and running
234
+ `Gem.find_files("i18n-js/*_plugin.rb")`. If your plugin is not listed, then you
235
+ need to double check your gem load path and see why the file is not being
236
+ loaded.
237
+
108
238
  ### Listing missing translations
109
239
 
110
- To list missing and extraneous translations, you can use `i18n check`. This
111
- command will load your translations similarly to how `i18n export` does, but
112
- will output the list of keys that don't have a matching translation against the
113
- default locale. Here's an example:
240
+ To list missing and extraneous translations, you can use
241
+ `i18n lint:translations`. This command will load your translations similarly to
242
+ how `i18n export` does, but will output the list of keys that don't have a
243
+ matching translation against the default locale. Here's an example:
114
244
 
115
- ![`i18n check` command in action](https://github.com/fnando/i18n-js/raw/main/images/i18njs-check.gif)
245
+ ![`i18n lint:translations` command in action](https://github.com/fnando/i18n-js/raw/main/images/i18njs-check.gif)
116
246
 
117
247
  This command will exist with status 1 whenever there are missing translations.
118
248
  This way you can use it as a CI linting.
@@ -133,7 +263,7 @@ translations:
133
263
  patterns:
134
264
  - "*"
135
265
 
136
- check:
266
+ lint_translations:
137
267
  ignore:
138
268
  - en.mailer.login.subject
139
269
  - en.mailer.login.body
@@ -145,6 +275,82 @@ check:
145
275
  > accepts the full translation scope, rather than accepting a pattern like
146
276
  > `pt.ignored.scope.*`.
147
277
 
278
+ ### Linting your JavaScript/TypeScript files
279
+
280
+ To lint your script files and check for missing translations (which can signal
281
+ that you're either using wrong scopes or forgot to add the translation), use
282
+ `i18n lint:scripts`. This command will parse your JavaScript/TypeScript files
283
+ and extract all scopes being used. This command requires a Node.js runtime. You
284
+ can either specify one via `--node-path`, or let the plugin infer a binary from
285
+ your `$PATH`.
286
+
287
+ The comparison will be made against the export JSON files, which means it'll
288
+ consider transformations performed by plugins (e.g. the output files may be
289
+ affected by `embed_fallback_translations` plugin).
290
+
291
+ The translations that will be extract must be called as one of the following
292
+ ways:
293
+
294
+ - `i18n.t(scope, options)`
295
+ - `i18n.translate(scope, options)`
296
+ - `t(scope, options)`
297
+
298
+ Notice that only literal strings can be used, as in `i18n.t("message")`. If
299
+ you're using dynamic scoping through variables (e.g.
300
+ `const scope = "message"; i18n.t(scope)`), they will be skipped.
301
+
302
+ ```console
303
+ $ i18n lint:scripts --config test/config/lint.yml --require test/config/require.rb
304
+ => Config file: "test/config/lint.yml"
305
+ => Require file: "test/config/require.rb"
306
+ => Node: "/Users/fnando/.asdf/shims/node"
307
+ => Available locales: [:en, :es, :pt]
308
+ => Patterns: ["!(node_modules)/**/*.js", "!(node_modules)/**/*.ts", "!(node_modules)/**/*.jsx", "!(node_modules)/**/*.tsx"]
309
+ => 9 translations, 11 missing, 4 ignored
310
+ - test/scripts/lint/file.js:1:1: en.js.missing
311
+ - test/scripts/lint/file.js:1:1: es.js.missing
312
+ - test/scripts/lint/file.js:1:1: pt.js.missing
313
+ - test/scripts/lint/file.js:2:8: en.base.js.missing
314
+ - test/scripts/lint/file.js:2:8: es.base.js.missing
315
+ - test/scripts/lint/file.js:2:8: pt.base.js.missing
316
+ - test/scripts/lint/file.js:4:8: en.js.missing
317
+ - test/scripts/lint/file.js:4:8: es.js.missing
318
+ - test/scripts/lint/file.js:4:8: pt.js.missing
319
+ - test/scripts/lint/file.js:6:1: en.another_ignore_scope
320
+ - test/scripts/lint/file.js:6:1: es.another_ignore_scope
321
+ ```
322
+
323
+ This command will list all locales and their missing translations. Avoid listing
324
+ a particular translation, you can set `lint.ignore` on your config file.
325
+
326
+ ```yaml
327
+ ---
328
+ translations:
329
+ - file: app/frontend/translations.json
330
+ patterns:
331
+ - "*"
332
+
333
+ lint_scripts:
334
+ ignore:
335
+ - ignore_scope # will ignore this scope on all languages
336
+ - pt.another_ignore_scope # will ignore this scope only on `pt`
337
+ ```
338
+
339
+ You can also set the patterns that will be looked up. By default, it scans all
340
+ JavaScript and TypeScript files that don't live on `node_modules`.
341
+
342
+ ```yaml
343
+ ---
344
+ translations:
345
+ - file: app/frontend/translations.json
346
+ patterns:
347
+ - "*"
348
+
349
+ lint:
350
+ patterns:
351
+ - "app/assets/**/*.ts"
352
+ ```
353
+
148
354
  ## Automatically export translations
149
355
 
150
356
  ### Using [watchman](https://facebook.github.io/watchman/)
@@ -230,7 +436,10 @@ The code above will watch for changes based on `config/i18n.yml` and
230
436
 
231
437
  - `config_file` - i18n-js configuration file
232
438
  - `locales_dir` - one or multiple directories to watch for locales changes
233
- - `options` - passed directly to [listen](https://github.com/guard/listen/#options)
439
+ - `options` - passed directly to
440
+ [listen](https://github.com/guard/listen/#options)
441
+ - `run_on_start` - export files on start. Defaults to `true`. When disabled,
442
+ files will be exported only when there are file changes.
234
443
 
235
444
  Example:
236
445
 
@@ -238,7 +447,8 @@ Example:
238
447
  I18nJS.listen(
239
448
  config_file: "config/i18n.yml",
240
449
  locales_dir: ["config/locales", "app/views"],
241
- options: {only: %r{.yml$}
450
+ options: {only: %r{.yml$}},
451
+ run_on_start: false
242
452
  )
243
453
  ```
244
454
 
data/bin/pack ADDED
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "optparse"
5
+ require_relative "../lib/i18n-js/version"
6
+
7
+ def write_file(path, contents)
8
+ File.open(File.expand_path(path), "w") do |io|
9
+ io << contents
10
+ end
11
+ end
12
+
13
+ changelog_path = "./CHANGELOG.md"
14
+ version_path = "./lib/i18n-js/version.rb"
15
+
16
+ version = nil
17
+ segments = I18nJS::VERSION.split(".")
18
+ major, minor, patch = *segments.take(3).map(&:to_i)
19
+ pre = segments[4].to_s
20
+ pre_version = pre.gsub(/[^\d]/m, "").to_i
21
+ date = Time.now.strftime("%b %d, %Y")
22
+ release = false
23
+ alpha = false
24
+
25
+ OptionParser.new do |opts|
26
+ opts.on("--major") do
27
+ version = "#{major + 1}.0.0"
28
+ end
29
+
30
+ opts.on("--minor") do
31
+ version = "#{major}.#{minor + 1}.0"
32
+ end
33
+
34
+ opts.on("--patch") do
35
+ version = "#{major}.#{minor}.#{patch + 1}"
36
+ end
37
+
38
+ opts.on("--alpha") do
39
+ alpha = true
40
+ end
41
+
42
+ opts.on("--release") do
43
+ release = true
44
+ end
45
+ end.parse!
46
+
47
+ version = "#{version}.alpha#{pre_version + 1}" if alpha
48
+
49
+ unless version
50
+ puts "ERROR: You need to use either one of: --major, --minor, --patch"
51
+ exit 1
52
+ end
53
+
54
+ puts "=> Current version: #{I18nJS::VERSION}"
55
+ puts "=> Next version: #{version}"
56
+
57
+ system "yarn", "install"
58
+ system "yarn", "compile"
59
+
60
+ write_file changelog_path,
61
+ File.read(changelog_path)
62
+ .gsub("Unreleased", "v#{version} - #{date}")
63
+
64
+ puts "=> Updated #{changelog_path}"
65
+
66
+ write_file version_path,
67
+ File.read(version_path)
68
+ .gsub(/VERSION = ".*?"/, %[VERSION = "#{version}"])
69
+
70
+ puts "=> Updated #{version_path}"
71
+
72
+ if release
73
+ system "git", "add", changelog_path, version_path
74
+ system "git", "commit", "-m", "Bump up version (v#{version})"
75
+ system "git", "tag", "v#{version}"
76
+ end
77
+
78
+ system "rake", "build"
79
+ system "git", "checkout", changelog_path, version_path unless release
data/i18n-js.gemspec CHANGED
@@ -31,16 +31,19 @@ Gem::Specification.new do |spec|
31
31
  .reject {|f| f.match(%r{^(test|spec|features|images)/}) }
32
32
  end
33
33
 
34
+ spec.files << "lib/i18n-js/lint.js"
35
+
34
36
  spec.bindir = "exe"
35
37
  spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
36
38
  spec.require_paths = ["lib"]
37
39
 
38
- spec.add_dependency "glob"
40
+ spec.add_dependency "glob", ">= 0.4.0"
39
41
  spec.add_dependency "i18n"
40
42
 
41
43
  spec.add_development_dependency "activesupport"
42
44
  spec.add_development_dependency "minitest"
43
45
  spec.add_development_dependency "minitest-utils"
46
+ spec.add_development_dependency "mocha"
44
47
  spec.add_development_dependency "pry-meta"
45
48
  spec.add_development_dependency "rake"
46
49
  spec.add_development_dependency "rubocop"
@@ -1,156 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "benchmark"
4
-
5
3
  module I18nJS
6
4
  class CLI
7
- class CheckCommand < Command
5
+ class CheckCommand < LintTranslationsCommand
8
6
  command_name "check"
9
- description "Check for missing translations"
10
-
11
- parse do |opts|
12
- opts.banner = "Usage: i18n #{name} [options]"
13
-
14
- opts.on(
15
- "-cCONFIG_FILE",
16
- "--config=CONFIG_FILE",
17
- "The configuration file that will be used"
18
- ) do |config_file|
19
- options[:config_file] = config_file
20
- end
21
-
22
- opts.on(
23
- "-rREQUIRE_FILE",
24
- "--require=REQUIRE_FILE",
25
- "A Ruby file that must be loaded"
26
- ) do |require_file|
27
- options[:require_file] = require_file
28
- end
29
-
30
- opts.on(
31
- "--[no-]color",
32
- "Force colored output"
33
- ) do |colored|
34
- options[:colored] = colored
35
- end
36
-
37
- opts.on("-h", "--help", "Prints this help") do
38
- ui.exit_with opts.to_s
39
- end
40
- end
41
-
42
- command do
43
- set_defaults!
44
- ui.colored = options[:colored]
45
-
46
- unless options[:config_file]
47
- ui.fail_with("=> ERROR: you need to specify the config file")
48
- end
49
-
50
- ui.stdout_print("=> Config file:", options[:config_file].inspect)
51
- config_file = File.expand_path(options[:config_file])
52
-
53
- if options[:require_file]
54
- ui.stdout_print("=> Require file:", options[:require_file].inspect)
55
- require_file = File.expand_path(options[:require_file])
56
- end
57
-
58
- unless File.file?(config_file)
59
- ui.fail_with(
60
- "=> ERROR: config file doesn't exist at",
61
- config_file.inspect
62
- )
63
- end
64
-
65
- if require_file && !File.file?(require_file)
66
- ui.fail_with(
67
- "=> ERROR: require file doesn't exist at",
68
- require_file.inspect
69
- )
70
- end
71
-
72
- config = Glob::SymbolizeKeys.call(YAML.load_file(config_file))
73
- Schema.validate!(config)
74
-
75
- load_require_file!(require_file) if require_file
76
-
77
- default_locale = I18n.default_locale
78
- available_locales = I18n.available_locales
79
- ignored_keys = config.dig(:check, :ignore) || []
80
-
81
- mapping = available_locales.each_with_object({}) do |locale, buffer|
82
- buffer[locale] =
83
- Glob::Map.call(Glob.filter(I18nJS.translations, ["#{locale}.*"]))
84
- .map {|key| key.gsub(/^.*?\./, "") }
85
- end
86
-
87
- default_locale_keys = mapping.delete(default_locale)
88
-
89
- if ignored_keys.any?
90
- ui.stdout_print "=> Check #{options[:config_file].inspect} for " \
91
- "ignored keys."
92
- end
93
-
94
- ui.stdout_print "=> #{default_locale}: #{default_locale_keys.size} " \
95
- "translations"
96
-
97
- total_missing_count = 0
98
-
99
- mapping.each do |locale, partial_keys|
100
- ignored_count = 0
101
-
102
- # Compute list of filtered keys (i.e. keys not ignored)
103
- filtered_keys = partial_keys.reject do |key|
104
- key = "#{locale}.#{key}"
105
-
106
- ignored = ignored_keys.include?(key)
107
- ignored_count += 1 if ignored
108
- ignored
109
- end
110
-
111
- extraneous = (partial_keys - default_locale_keys).reject do |key|
112
- key = "#{locale}.#{key}"
113
- ignored = ignored_keys.include?(key)
114
- ignored_count += 1 if ignored
115
- ignored
116
- end
117
-
118
- missing = (default_locale_keys - (filtered_keys - extraneous))
119
- .reject {|key| ignored_keys.include?("#{locale}.#{key}") }
120
-
121
- ignored_count += extraneous.size
122
- total_missing_count += missing.size
123
-
124
- ui.stdout_print "=> #{locale}: #{missing.size} missing, " \
125
- "#{extraneous.size} extraneous, " \
126
- "#{ignored_count} ignored"
127
-
128
- all_keys = (default_locale_keys + extraneous + missing).uniq.sort
129
-
130
- all_keys.each do |key|
131
- next if ignored_keys.include?("#{locale}.#{key}")
132
-
133
- label = if extraneous.include?(key)
134
- ui.yellow("extraneous")
135
- elsif missing.include?(key)
136
- ui.red("missing")
137
- else
138
- next
139
- end
140
-
141
- ui.stdout_print(" - #{locale}.#{key} (#{label})")
142
- end
143
- end
144
-
145
- exit(1) if total_missing_count.nonzero?
146
- end
147
-
148
- private def set_defaults!
149
- config_file = "./config/i18n.yml"
150
- require_file = "./config/environment.rb"
7
+ description "Check for missing translations based on the default " \
8
+ "locale (DEPRECATED: Use `i18n lint:translations` instead)"
151
9
 
152
- options[:config_file] ||= config_file if File.file?(config_file)
153
- options[:require_file] ||= require_file if File.file?(require_file)
10
+ def command
11
+ ui.stderr_print "=> WARNING: `i18n check` has been deprecated in " \
12
+ "favor of `i18n lint:translations`"
13
+ super
154
14
  end
155
15
  end
156
16
  end
@@ -39,6 +39,16 @@ module I18nJS
39
39
  @options ||= {}
40
40
  end
41
41
 
42
+ private def load_config_file(config_file)
43
+ config = Glob::SymbolizeKeys.call(YAML.load_file(config_file))
44
+
45
+ if config.key?(:check)
46
+ config[:lint_translations] ||= config.delete(:check)
47
+ end
48
+
49
+ config
50
+ end
51
+
42
52
  private def load_require_file!(require_file)
43
53
  require_without_warnings(require_file)
44
54
  rescue Exception => error # rubocop:disable Lint/RescueException