i18n-tasks 0.5.4 → 0.6.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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +9 -0
  3. data/README.md +46 -36
  4. data/Rakefile +2 -2
  5. data/lib/i18n/tasks/base_task.rb +2 -0
  6. data/lib/i18n/tasks/commands.rb +55 -35
  7. data/lib/i18n/tasks/commands_base.rb +36 -9
  8. data/lib/i18n/tasks/configuration.rb +14 -13
  9. data/lib/i18n/tasks/console_context.rb +0 -1
  10. data/lib/i18n/tasks/data.rb +2 -2
  11. data/lib/i18n/tasks/data/adapter/json_adapter.rb +6 -2
  12. data/lib/i18n/tasks/data/file_formats.rb +19 -4
  13. data/lib/i18n/tasks/data/file_system_base.rb +1 -1
  14. data/lib/i18n/tasks/data/tree/node.rb +11 -37
  15. data/lib/i18n/tasks/data/tree/nodes.rb +6 -2
  16. data/lib/i18n/tasks/data/tree/siblings.rb +53 -29
  17. data/lib/i18n/tasks/data/tree/traversal.rb +4 -2
  18. data/lib/i18n/tasks/fill_tasks.rb +5 -2
  19. data/lib/i18n/tasks/ignore_keys.rb +1 -1
  20. data/lib/i18n/tasks/locale_pathname.rb +1 -1
  21. data/lib/i18n/tasks/logging.rb +2 -0
  22. data/lib/i18n/tasks/missing_keys.rb +74 -31
  23. data/lib/i18n/tasks/plural_keys.rb +4 -3
  24. data/lib/i18n/tasks/reports/base.rb +8 -5
  25. data/lib/i18n/tasks/reports/spreadsheet.rb +15 -3
  26. data/lib/i18n/tasks/reports/terminal.rb +62 -23
  27. data/lib/i18n/tasks/scanners/base_scanner.rb +4 -2
  28. data/lib/i18n/tasks/scanners/relative_keys.rb +21 -0
  29. data/lib/i18n/tasks/split_key.rb +39 -0
  30. data/lib/i18n/tasks/used_keys.rb +1 -1
  31. data/lib/i18n/tasks/version.rb +1 -1
  32. data/spec/fixtures/app/views/index.html.slim +2 -0
  33. data/spec/i18n_tasks_spec.rb +19 -5
  34. data/spec/locale_pathname_spec.rb +24 -0
  35. data/spec/locale_tree/siblings_spec.rb +41 -4
  36. data/spec/split_key_spec.rb +27 -0
  37. data/spec/support/i18n_tasks_output_matcher.rb +7 -13
  38. data/spec/support/trees.rb +4 -0
  39. data/templates/config/i18n-tasks.yml +82 -0
  40. data/templates/rspec/i18n_spec.rb +18 -0
  41. metadata +10 -3
  42. data/lib/i18n/tasks/relative_keys.rb +0 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6579b9cbd049e1fa2d48871a7ca13f7fd8ad96a4
4
- data.tar.gz: eaa10ec60b66db271f1c3f25f7369d4c0ba6e36e
3
+ metadata.gz: 03263ddf669098e8580e4656d41e7b15d2ba5721
4
+ data.tar.gz: ae4bcf9dee99a2e6cb19e6ee2d52cc34b281e335
5
5
  SHA512:
6
- metadata.gz: 1119961b325f1bf1f678b42304ed9669f4c8800a865f257a09817ceff1d5bfc69038ebf6ec8932e4833e90fea3b969574b2d3a0315245981a3f230793ae4665c
7
- data.tar.gz: 3c69f7d4e2f8edde4dd4407f6e18085fd4d8318565bc366ec1f39288465f345466fd5da8967f9ed279d35f089f75236710f73f0a45cf41e88d9e6cfaf8eaa909
6
+ metadata.gz: 69aff7e4e6369e2fe1c622255bfda9290a3141eeb28be0fa368af1be3f568e1934d65ee77e66d180025bd2c9279ca4a0aff73e7135fa21b538b1a00941e26540
7
+ data.tar.gz: e21ca15833a7a7822ce166599863e3d6184cdc7a9535740554cf7e7b29a10e7c013cb34a3be4b54d6a8be4a5d53fb18a1038a9d3a2ce4bbeef06664e2d5f8a1e
data/CHANGES.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 0.6.0
2
+
3
+ * New output format options for reports: yaml, json, and inspect.
4
+ * Templates for config and rspec.
5
+ * Keys with values same as base locale have been moved from `missing` into a separate task, `eq-base`.
6
+ * `missing` now also shows keys that are present in some locale but not in base locale.
7
+ * Terminal output: no more Type column in `missing`, first code usage shown for keys missing base value.
8
+ * `relative_roots` configuration key moved to `search.relative_roots`, deprecation warning (removed in the next minor).
9
+
1
10
  ## 0.5.4
2
11
 
3
12
  * ActiveSupport 3 compatibility
data/README.md CHANGED
@@ -18,7 +18,7 @@ i18n-tasks can be used with any project using [i18n][i18n-gem] (default in Rails
18
18
  Add to Gemfile:
19
19
 
20
20
  ```ruby
21
- gem 'i18n-tasks', '~> 0.5.4'
21
+ gem 'i18n-tasks', '~> 0.6.0'
22
22
  ```
23
23
 
24
24
 
@@ -36,14 +36,16 @@ Available commands:
36
36
 
37
37
  missing show missing translations
38
38
  unused show unused translations
39
+ eq-base show translations equal to base value
40
+ find show where the keys are used in the code
39
41
  translate-missing translate missing keys with Google Translate
40
42
  add-missing add missing keys to the locales
41
- find show where the keys are used in the code
42
43
  normalize normalize translation data: sort and move to the right files
43
44
  remove-unused remove unused keys
44
45
  config display i18n-tasks configuration
45
46
  xlsx-report save missing and unused translations to an Excel file
46
- irb irb session within i18n-tasks context
47
+ irb REPL session within i18n-tasks context
48
+ gem-path show path to the gem
47
49
 
48
50
  See `<command> --help` for more information on a specific command.
49
51
  ```
@@ -122,11 +124,10 @@ Translation data storage, key usage search, and other [settings](#configuration)
122
124
  Configuration is read from `config/i18n-tasks.yml` or `config/i18n-tasks.yml.erb`.
123
125
  Inspect configuration with `i18n-tasks config`.
124
126
 
127
+ Install the default config file with:
125
128
 
126
- You can generate a config file with:
127
-
128
- ```ruby
129
- i18n-tasks config > config/i18n-tasks.yml
129
+ ```bash
130
+ cp $(i18n-tasks gem-path)/templates/config/i18n-tasks.yml spec/
130
131
  ```
131
132
 
132
133
  ### Locales
@@ -239,6 +240,12 @@ search:
239
240
  paths:
240
241
  - 'app/'
241
242
  - 'vendor/'
243
+ # paths for relative key resolution:
244
+ relative_roots:
245
+ # default:
246
+ - app/views
247
+ # add a custom one:
248
+ - app/views-mobile
242
249
  # include only files matching this glob pattern (default: blank = include all files)
243
250
  include:
244
251
  - '*.rb'
@@ -254,18 +261,6 @@ search:
254
261
  - "^\\s*[#/](?!\\si18n-tasks-use)"
255
262
  ```
256
263
 
257
- To configure paths for relative key resolution:
258
-
259
- ```yaml
260
- # config/i18n-tasks.yml
261
- # directories containing relative keys
262
- relative_roots:
263
- # default:
264
- - app/views
265
- # add a custom one:
266
- - app/views-mobile
267
- ```
268
-
269
264
  It is also possible to use a custom key usage scanner by setting `search.scanner` to a class name.
270
265
  See this basic [pattern scanner](/lib/i18n/tasks/scanners/pattern_scanner.rb) for reference.
271
266
 
@@ -320,25 +315,12 @@ translation:
320
315
  ## RSpec integration
321
316
 
322
317
  You might want to test for missing and unused translations as part of your test suite.
323
- This is how you can do it with rspec:
324
-
325
- ```ruby
326
- # spec/i18n_spec.rb:
327
- require 'spec_helper'
328
- require 'i18n/tasks'
318
+ Install the spec file:
329
319
 
330
- describe 'I18n' do
331
- let(:i18n) { I18n::Tasks::BaseTask.new }
332
-
333
- it 'does not have missing keys' do
334
- expect(i18n.missing_keys).to be_empty
335
- end
336
-
337
- it 'does not have unused keys' do
338
- expect(i18n.unused_keys).to be_empty
339
- end
340
- end
320
+ ```bash
321
+ cp $(i18n-tasks gem-path)/templates/rspec/i18n_spec.rb spec/
341
322
  ```
323
+
342
324
  ### XLSX
343
325
 
344
326
  Export missing and unused data to XLSX:
@@ -351,6 +333,34 @@ i18n-tasks xlsx-report
351
333
 
352
334
  While i18n-tasks does not provide an HTML version of the report, you can add [one like this](https://gist.github.com/glebm/bdd3ab6d12d915f0c81b).
353
335
 
336
+
337
+ ## Add New Tasks
338
+
339
+ Tasks that come with the gem are defined in [lib/i18n/tasks/commands.rb](lib/i18n/tasks/commands.rb).
340
+
341
+ You can add a new task by re-opening the class and loading it in i18n-tasks.yml:
342
+
343
+ ```ruby
344
+ # lib/i18n/tasks/my_task.rb
345
+ I18n::Tasks::Commands.class_eval do
346
+ desc 'my task'
347
+ cmd :my_task do |opts = {}|
348
+ puts i18n.data[opts[:arguments].try(:first) || base_locale]
349
+ end
350
+ end
351
+ ```
352
+
353
+ ```yaml
354
+ # config/i18n-tasks.yml
355
+ <% require 'i18n/tasks/my_task' %>
356
+ ```
357
+
358
+ Run with:
359
+
360
+ ```console
361
+ $ i18n-tasks my-task
362
+ ```
363
+
354
364
  [MIT license]: /LICENSE.txt
355
365
  [travis]: https://travis-ci.org/glebm/i18n-tasks
356
366
  [badge-travis]: http://img.shields.io/travis/glebm/i18n-tasks.svg
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
- RSpec::Core::RakeTask.new(:spec)
4
- task :default => :spec
3
+ RSpec::Core::RakeTask.new(:rspec)
4
+ task :default => :rspec
5
5
 
6
6
  task :irb do
7
7
  # $: << File.expand_path('lib', __FILE__)
@@ -1,5 +1,6 @@
1
1
  # coding: utf-8
2
2
  require 'i18n/tasks/command_error'
3
+ require 'i18n/tasks/split_key'
3
4
  require 'i18n/tasks/key_pattern_matching'
4
5
  require 'i18n/tasks/logging'
5
6
  require 'i18n/tasks/plural_keys'
@@ -16,6 +17,7 @@ require 'i18n/tasks/configuration'
16
17
  module I18n
17
18
  module Tasks
18
19
  class BaseTask
20
+ include SplitKey
19
21
  include KeyPatternMatching
20
22
  include PluralKeys
21
23
  include UsedKeys
@@ -9,91 +9,116 @@ module I18n::Tasks
9
9
  require 'highline/import'
10
10
 
11
11
  on_locale_opt = { as: Array, delimiter: /[+:,]/, default: 'all', argument: true, optional: false }
12
+ OPT = {
13
+ locale: proc {
14
+ on '-l', :locales=,
15
+ 'Filter by locale(s), comma-separated list (e.g. en,fr) or all (default: all), also accepted as arguments without -l',
16
+ on_locale_opt
17
+ },
18
+ format: proc {
19
+ on '-f', :format=,
20
+ 'Format: terminal-table, terminal-tree, json, yaml. Default: terminal-table.',
21
+ {default: 'terminal-table', argument: true, optional: false}
22
+ }
23
+ }
12
24
  desc 'show missing translations'
13
25
  opts do
14
- on '-l', :locales=, 'Filter by locale (default: all)', on_locale_opt
15
- on '-t', :types=, 'Filter by type (types: missing_from_base, eq_base, missing_from_locale)', as: Array, delimiter: /[+:,]/
26
+ instance_exec &OPT[:locale]
27
+ instance_exec &OPT[:format]
28
+ on '-t', :types=, 'Filter by type (types: used, diff)', as: Array, delimiter: /[+:,]/
16
29
  end
17
30
  cmd :missing do |opt = {}|
18
31
  parse_locales! opt
19
- terminal_report.missing_keys i18n_task.missing_keys(opt)
32
+ print_locale_tree i18n.missing_keys(opt), opt, :missing_keys
20
33
  end
21
34
 
22
35
  desc 'show unused translations'
23
36
  opts do
24
- on '-l', :locales=, 'Filter by locale (default: all)', on_locale_opt
37
+ instance_exec &OPT[:locale]
38
+ instance_exec &OPT[:format]
25
39
  end
26
40
  cmd :unused do |opt = {}|
27
41
  parse_locales! opt
28
- terminal_report.unused_keys i18n_task.unused_keys(opt)
42
+ print_locale_tree i18n.unused_keys(opt), opt, :unused_keys
43
+ end
44
+
45
+ desc 'show translations equal to base value'
46
+ opts do
47
+ instance_exec &OPT[:format]
48
+ end
49
+ cmd :eq_base do |opt = {}|
50
+ parse_locales! opt
51
+ print_locale_tree i18n.eq_base_keys(opt), opt, :eq_base_keys
52
+ end
53
+
54
+ desc 'show where the keys are used in the code'
55
+ opts do
56
+ on '-p', :pattern=, 'Show only keys matching pattern', argument: true, optional: false
57
+ instance_exec &OPT[:format]
58
+ end
59
+ cmd :find do |opt = {}|
60
+ opt[:filter] ||= opt.delete(:pattern) || opt[:arguments].try(:first)
61
+ print_locale_tree i18n.used_tree(key_filter: opt[:filter].presence, source_locations: true), opt, :used_keys
29
62
  end
30
63
 
64
+
31
65
  desc 'translate missing keys with Google Translate'
32
66
  opts do
33
- on '-l', :locales=, 'Locales to translate (default: all)', on_locale_opt
67
+ on '-l', :locales=, 'Locales to translate (comma-separated, default: all)', on_locale_opt
34
68
  on '-f', :from=, 'Locale to translate from (default: base)', default: 'base', argument: true, optional: false
35
69
  end
36
70
  cmd :translate_missing do |opt = {}|
37
71
  opt[:from] = base_locale if opt[:from].blank? || opt[:from] == 'base'
38
72
  parse_locales! opt
39
- i18n_task.fill_missing_google_translate opt
73
+ i18n.fill_missing_google_translate opt
40
74
  end
41
75
 
42
76
  desc 'add missing keys to the locales'
43
77
  opts do
44
- on '-l', :locales=, 'Locales to add keys into (default: all)', on_locale_opt
78
+ on '-l', :locales=, 'Locales to add keys into (comma-separated, default: all)', on_locale_opt
45
79
  on '-p', :placeholder=, 'Value for empty keys (default: base value or key.humanize)', argument: true, optional: false
46
80
  end
47
81
  cmd :add_missing do |opt = {}|
48
82
  parse_locales! opt
49
83
  opt[:value] ||= opt.delete(:placeholder) || proc { |key, locale|
50
84
  # default to base value or key.humanize
51
- locale != base_locale && t(key, base_locale) || key.split('.').last.to_s.humanize
85
+ locale != base_locale && t(key, base_locale) || SplitKey.split_key(key).last.to_s.humanize
52
86
  }
53
87
 
54
88
  v = opt[:value]
55
89
  if v.is_a?(String) && v.include?('%{base_value}')
56
- opt[:value] = proc { |key, locale|
57
- base_value = t(key, base_locale) || ''
90
+ opt[:value] = proc { |key, locale, node|
91
+ base_value = node.value || t(key, base_locale) || ''
58
92
  v % {base_value: base_value}
59
93
  }
60
94
  end
61
95
 
62
- i18n_task.fill_missing_value opt
63
- end
64
-
65
- desc 'show where the keys are used in the code'
66
- opts do
67
- on '-p', :pattern=, 'Show only keys matching pattern', argument: true, optional: false
68
- end
69
- cmd :find do |opt = {}|
70
- opt[:filter] ||= opt.delete(:pattern) || opt[:arguments].try(:first)
71
- terminal_report.used_keys i18n_task.used_tree(key_filter: opt[:filter].presence, source_locations: true)
96
+ i18n.fill_missing_value opt
72
97
  end
73
98
 
74
99
  desc 'normalize translation data: sort and move to the right files'
75
100
  opts do
76
- on '-l', :locales=, 'Locales to normalize (default: all)', on_locale_opt
101
+ on '-l', :locales=, 'Locales to normalize (comma-separated, default: all)', on_locale_opt
77
102
  on '-p', :pattern_router, 'Use pattern router, regardless of config.', argument: false, optional: true
78
103
  end
79
104
  cmd :normalize do |opt = {}|
80
105
  parse_locales! opt
81
- i18n_task.normalize_store! opt[:locales], opt[:pattern_router]
106
+ i18n.normalize_store! opt[:locales], opt[:pattern_router]
82
107
  end
83
108
 
84
109
  desc 'remove unused keys'
85
110
  opts do
86
- on '-l', :locales=, 'Locales to remove unused keys from (default: all)', on_locale_opt
111
+ on '-l', :locales=, 'Locales to remove unused keys from (comma-separated, default: all)', on_locale_opt
87
112
  end
88
113
  cmd :remove_unused do |opt = {}|
89
114
  parse_locales! opt
90
- unused_keys = i18n_task.unused_keys(opt)
115
+ unused_keys = i18n.unused_keys(opt)
91
116
  if unused_keys.present?
92
117
  terminal_report.unused_keys(unused_keys)
93
118
  unless ENV['CONFIRM']
94
119
  exit 1 unless agree(red "#{unused_keys.leaves.count} translations will be removed in #{bold opt[:locales] * ', '}#{red '.'} " + yellow('Continue? (yes/no)') + ' ')
95
120
  end
96
- i18n_task.remove_unused!(opt[:locales])
121
+ i18n.remove_unused!(opt[:locales])
97
122
  $stderr.puts "Removed #{unused_keys.leaves.count} keys"
98
123
  else
99
124
  $stderr.puts bold green 'No unused keys to remove'
@@ -102,7 +127,7 @@ module I18n::Tasks
102
127
 
103
128
  desc 'display i18n-tasks configuration'
104
129
  cmd :config do
105
- cfg = i18n_task.config_for_inspect.to_yaml
130
+ cfg = i18n.config_for_inspect.to_yaml
106
131
  cfg.sub! /\A---\n/, ''
107
132
  cfg.gsub! /^([^\s-].+?:)/, Term::ANSIColor.cyan(Term::ANSIColor.bold('\1'))
108
133
  puts cfg
@@ -129,14 +154,9 @@ module I18n::Tasks
129
154
  ::I18n::Tasks::ConsoleContext.start
130
155
  end
131
156
 
132
- protected
133
-
134
- def terminal_report
135
- @terminal_report ||= I18n::Tasks::Reports::Terminal.new(i18n_task)
136
- end
137
-
138
- def spreadsheet_report
139
- @spreadsheet_report ||= I18n::Tasks::Reports::Spreadsheet.new(i18n_task)
157
+ desc 'show path to the gem'
158
+ cmd :gem_path do
159
+ puts File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..'))
140
160
  end
141
161
  end
142
162
  end
@@ -1,21 +1,22 @@
1
1
  # coding: utf-8
2
2
  require 'ostruct'
3
+ require 'set'
3
4
  module I18n::Tasks
4
5
  class CommandsBase
5
6
  include ::I18n::Tasks::Logging
6
7
 
7
- def initialize(i18n_task = nil)
8
- @i18n_task = i18n_task
8
+ def initialize(i18n = nil)
9
+ @i18n = i18n
9
10
  end
10
11
 
11
12
  def locales_opt(locales)
12
- return i18n_task.locales if locales == ['all'] || locales == 'all'
13
+ return i18n.locales if locales == ['all'] || locales == 'all'
13
14
  if locales.present?
14
15
  locales = Array(locales).map { |v| v.strip.split(/\s*[\+,:]\s*/).compact.presence if v.is_a?(String) }.flatten
15
16
  locales = locales.map(&:presence).compact.map { |v| v == 'base' ? base_locale : v }
16
17
  locales
17
18
  else
18
- i18n_task.locales
19
+ i18n.locales
19
20
  end
20
21
  end
21
22
 
@@ -25,6 +26,32 @@ module I18n::Tasks
25
26
  end
26
27
  end
27
28
 
29
+
30
+ VALID_TREE_FORMATS = %w(terminal-table yaml json inspect)
31
+
32
+ def print_locale_tree(tree, opt, version = :show_tree)
33
+ format = opt[:format] || VALID_TREE_FORMATS.first
34
+ raise CommandError.new("unknown format: #{format}. Valid formats are: #{VALID_TREE_FORMATS * ', '}.") unless VALID_TREE_FORMATS.include?(format)
35
+ case format
36
+ when 'terminal-table'
37
+ terminal_report.send(version, tree)
38
+ when 'inspect'
39
+ puts tree.inspect
40
+ else
41
+ puts i18n.data.adapter_dump tree, i18n.data.adapter_by_name(format)
42
+ end
43
+ end
44
+
45
+ protected
46
+
47
+ def terminal_report
48
+ @terminal_report ||= I18n::Tasks::Reports::Terminal.new(i18n)
49
+ end
50
+
51
+ def spreadsheet_report
52
+ @spreadsheet_report ||= I18n::Tasks::Reports::Spreadsheet.new(i18n)
53
+ end
54
+
28
55
  class << self
29
56
  def cmds
30
57
  @cmds ||= {}.with_indifferent_access
@@ -35,8 +62,8 @@ module I18n::Tasks
35
62
  @next_def = {}
36
63
  define_method name do |*args|
37
64
  begin
38
- coloring_was = Term::ANSIColor.coloring?
39
- Term::ANSIColor.coloring = STDOUT.isatty
65
+ coloring_was = Term::ANSIColor.coloring?
66
+ Term::ANSIColor.coloring = ENV['I18N_TASKS_COLOR'] || STDOUT.isatty
40
67
  instance_exec *args, &block
41
68
  rescue CommandError => e
42
69
  log_error e.message
@@ -65,10 +92,10 @@ module I18n::Tasks
65
92
  self.class.cmds.try(:[], name).try(:desc)
66
93
  end
67
94
 
68
- def i18n_task
69
- @i18n_task ||= I18n::Tasks::BaseTask.new
95
+ def i18n
96
+ @i18n ||= I18n::Tasks::BaseTask.new
70
97
  end
71
98
 
72
- delegate :base_locale, :t, to: :i18n_task
99
+ delegate :base_locale, :t, to: :i18n
73
100
  end
74
101
  end
@@ -13,8 +13,17 @@ module I18n::Tasks::Configuration
13
13
 
14
14
  def file_config
15
15
  file = CONFIG_FILES.detect { |f| File.exists?(f) }
16
- file = YAML.load(Erubis::Eruby.new(File.read(file)).result) if file
17
- {}.with_indifferent_access.merge(file.presence || {})
16
+ config = file && YAML.load(Erubis::Eruby.new(File.read(file)).result)
17
+ if config.present?
18
+ config.with_indifferent_access.tap do |c|
19
+ if c[:relative_roots]
20
+ warn_deprecated 'config/i18n-tasks.yml has relative_roots on top level. Please move relative_roots under search.'
21
+ c[:search][:relative_roots] = c.delete(:relative_roots)
22
+ end
23
+ end
24
+ else
25
+ {}.with_indifferent_access
26
+ end
18
27
  end
19
28
 
20
29
  def config=(conf)
@@ -34,10 +43,6 @@ module I18n::Tasks::Configuration
34
43
  end
35
44
  end
36
45
 
37
- def relative_roots
38
- @config_sections[:relative_roots] ||= config[:relative_roots].presence || %w(app/views)
39
- end
40
-
41
46
  # translation config
42
47
  # @return [Hash{String => String,Hash,Array}]
43
48
  def translation_config
@@ -75,21 +80,18 @@ module I18n::Tasks::Configuration
75
80
  end
76
81
  end
77
82
 
78
- def non_base_locales(from = nil)
79
- from ||= self.locales
80
- Array(from) - [base_locale]
81
- end
82
-
83
83
  # @return [String] default i18n locale
84
84
  def base_locale
85
85
  @config_sections[:base_locale] ||= (config[:base_locale] || 'en').to_s
86
86
  end
87
87
 
88
+
88
89
  def ignore_config(type = nil)
89
90
  key = type ? "ignore_#{type}" : 'ignore'
90
91
  @config_sections[key] ||= config[key]
91
92
  end
92
93
 
94
+ IGNORE_TYPES = [nil, :missing, :unused, :eq_base].freeze
93
95
  # evaluated configuration (as the app sees it)
94
96
  def config_sections
95
97
  # init all sections
@@ -97,9 +99,8 @@ module I18n::Tasks::Configuration
97
99
  locales
98
100
  data_config
99
101
  search_config
100
- relative_roots
101
102
  translation_config
102
- [nil, :missing, :unused, :eq_base].each do |ignore_type|
103
+ IGNORE_TYPES.each do |ignore_type|
103
104
  ignore_config ignore_type
104
105
  end
105
106
  @config_sections