i18n-tasks 0.3.11 → 0.4.0.beta1
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/.jrubyrc +2 -0
- data/.travis.yml +5 -2
- data/CHANGES.md +8 -0
- data/Gemfile +1 -9
- data/README.md +36 -3
- data/Rakefile +6 -0
- data/bin/i18n-tasks +3 -1
- data/config/locales/en.yml +4 -0
- data/config/locales/es.yml +1 -0
- data/i18n-tasks.gemspec +2 -2
- data/lib/i18n/tasks.rb +9 -5
- data/lib/i18n/tasks/base_task.rb +2 -4
- data/lib/i18n/tasks/commands.rb +9 -0
- data/lib/i18n/tasks/data.rb +77 -60
- data/lib/i18n/tasks/data/file_formats.rb +3 -0
- data/lib/i18n/tasks/data/file_system_base.rb +53 -30
- data/lib/i18n/tasks/data/router/conservative_router.rb +51 -0
- data/lib/i18n/tasks/data/router/pattern_router.rb +57 -0
- data/lib/i18n/tasks/data/tree/node.rb +199 -0
- data/lib/i18n/tasks/data/tree/nodes.rb +85 -0
- data/lib/i18n/tasks/data/tree/siblings.rb +131 -0
- data/lib/i18n/tasks/data/tree/traversal.rb +81 -0
- data/lib/i18n/tasks/file_structure.rb +18 -0
- data/lib/i18n/tasks/missing_keys.rb +7 -7
- data/lib/i18n/tasks/plural_keys.rb +5 -5
- data/lib/i18n/tasks/unused_keys.rb +5 -6
- data/lib/i18n/tasks/version.rb +1 -1
- data/spec/conservative_router_spec.rb +50 -0
- data/spec/file_system_data_spec.rb +5 -4
- data/spec/google_translate_spec.rb +2 -2
- data/spec/i18n_tasks_spec.rb +1 -1
- data/spec/locale_tree/siblings_spec.rb +29 -0
- data/spec/plural_keys_spec.rb +3 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/support/trees.rb +5 -0
- metadata +25 -11
- data/lib/i18n/tasks/data/locale_tree.rb +0 -86
- data/lib/i18n/tasks/data/router.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 328ef834a8ef2756aa154f9e4eb5207df02486d4
|
4
|
+
data.tar.gz: d3d0d63e4fb566037f64606cdfd2a140928492c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ea465b2b3799df29d77c5db1c7fdbb5deb824b838399f663ef82411f62dee84f14fef9e34498b958e06e53deacd91bbf53252933f9792ef4ad2f0cd3b2c0a5f
|
7
|
+
data.tar.gz: f0e8d5a760021dd976741f28f06bc5aa2e4fcdc2158573b2eeb9795f8984f6c15c39a46a717f7de44a4bcd8757e858541b74a08230c9433534eb148922d831b2
|
data/.jrubyrc
ADDED
data/.travis.yml
CHANGED
data/CHANGES.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## 0.4.0 (not yet released)
|
2
|
+
|
3
|
+
* In addition to pattern router, a new conservative router that keeps the keys in place. (See [#57](https://github.com/glebm/i18n-tasks/issues/57))
|
4
|
+
* `i18n-tasks irb` for debugging
|
5
|
+
* This release is a major refactoring to use real trees internally (as opposed to nested hashes).
|
6
|
+
Real trees allow for much easier [traversal](/lib/i18n/tasks/data/tree/traversal.rb).
|
7
|
+
With these trees, information can be associated with each node, which allows for things like the conservative router.
|
8
|
+
|
1
9
|
## 0.3.11
|
2
10
|
|
3
11
|
* Improve plural key handling
|
data/Gemfile
CHANGED
@@ -3,15 +3,7 @@ source 'https://rubygems.org'
|
|
3
3
|
# Specify your gem's dependencies in i18n-tasks.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
platform :rbx do
|
7
|
-
gem 'rubysl', '~> 2.0'
|
8
|
-
gem 'rubysl-mutex_m', '~> 2.0'
|
9
|
-
gem 'psych'
|
10
|
-
group :development do
|
11
|
-
gem 'racc'
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
6
|
group :development do
|
16
7
|
gem 'coveralls', require: false
|
8
|
+
gem 'byebug', platform: :mri, require: false
|
17
9
|
end
|
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.3.
|
21
|
+
gem 'i18n-tasks', '~> 0.3.11'
|
22
22
|
```
|
23
23
|
|
24
24
|
i18n-tasks does not load or execute any of the application's code but performs static-only analysic.
|
@@ -45,6 +45,7 @@ Available commands:
|
|
45
45
|
remove-unused remove unused keys
|
46
46
|
config display i18n-tasks configuration
|
47
47
|
xlsx-report save missing and unused translations to an Excel file
|
48
|
+
irb irb session within i18n-tasks context
|
48
49
|
|
49
50
|
See `<command> --help` for more information on a specific command.
|
50
51
|
```
|
@@ -90,6 +91,13 @@ i18n-tasks find '{number,currency}.format.*'
|
|
90
91
|
|
91
92
|
![i18n-screenshot][screenshot-find]
|
92
93
|
|
94
|
+
### Find / remove unused keys
|
95
|
+
|
96
|
+
```bash
|
97
|
+
i18n-tasks unused
|
98
|
+
i18n-tasks remove-unused
|
99
|
+
```
|
100
|
+
|
93
101
|
#### Features
|
94
102
|
|
95
103
|
Relative keys (`t '.title'`) and plural keys (`key.{one,many,other,...}`) are fully supported.
|
@@ -144,12 +152,13 @@ data:
|
|
144
152
|
|
145
153
|
#### Multiple locale files
|
146
154
|
|
147
|
-
Use `data
|
155
|
+
Use `data` options to work with locale data spread over multiple files.
|
156
|
+
|
157
|
+
`data.read` accepts a list of file globs to read from per-locale:
|
148
158
|
|
149
159
|
```
|
150
160
|
# config/i18n-tasks.yml
|
151
161
|
data:
|
152
|
-
# a list of file globs to read from per-locale
|
153
162
|
read:
|
154
163
|
# read from namespaced files, e.g. simple_form.en.yml
|
155
164
|
- 'config/locales/*.%{locale}.yml'
|
@@ -157,6 +166,18 @@ data:
|
|
157
166
|
- "<%= %x[bundle show vagrant].chomp %>/templates/locales/%{locale}.yml"
|
158
167
|
# default
|
159
168
|
- 'config/locales/%{locale}.yml'
|
169
|
+
```
|
170
|
+
|
171
|
+
For writing to locale files i18n-tasks provides 2 options.
|
172
|
+
|
173
|
+
##### Pattern router
|
174
|
+
|
175
|
+
Pattern router organizes keys based on a list of key patterns, as in the example below:
|
176
|
+
|
177
|
+
```
|
178
|
+
data:
|
179
|
+
# pattern_router is default
|
180
|
+
router: pattern_router
|
160
181
|
# a list of {key pattern => file} routes, matched top to bottom
|
161
182
|
write:
|
162
183
|
# write models.* and views.* keys to the respective files
|
@@ -167,6 +188,18 @@ data:
|
|
167
188
|
- 'config/locales/%{locale}.yml'
|
168
189
|
```
|
169
190
|
|
191
|
+
##### Conservative router (v0.4.0+)
|
192
|
+
|
193
|
+
Conservative router keeps the keys where they are found, or infers the path from base locale.
|
194
|
+
If the key is completely new, conservative router will fall back to the pattern router behaviour.
|
195
|
+
|
196
|
+
```
|
197
|
+
data:
|
198
|
+
router: conservative_router
|
199
|
+
write:
|
200
|
+
- 'config/locales/%{locale}.yml'
|
201
|
+
```
|
202
|
+
|
170
203
|
#### Key pattern syntax
|
171
204
|
|
172
205
|
| syntax | description |
|
data/Rakefile
CHANGED
data/bin/i18n-tasks
CHANGED
@@ -11,7 +11,9 @@ err = proc { |message, exit_code|
|
|
11
11
|
|
12
12
|
command = nil
|
13
13
|
begin
|
14
|
-
|
14
|
+
args = ARGV.dup
|
15
|
+
args = ['--help'] if args.empty?
|
16
|
+
slop = Slop.parse(args, help: true) do
|
15
17
|
on('-v', '--version', 'Print the version') {
|
16
18
|
puts I18n::Tasks::VERSION
|
17
19
|
exit
|
@@ -0,0 +1 @@
|
|
1
|
+
--- {}
|
data/i18n-tasks.gemspec
CHANGED
@@ -29,11 +29,11 @@ It can also can pre-fill missing keys, including from Google Translate, and it c
|
|
29
29
|
|
30
30
|
s.add_dependency 'erubis'
|
31
31
|
s.add_dependency 'activesupport'
|
32
|
-
s.add_dependency 'easy_translate', '>= 0.
|
32
|
+
s.add_dependency 'easy_translate', '>= 0.5.0'
|
33
33
|
s.add_dependency 'term-ansicolor'
|
34
34
|
s.add_dependency 'terminal-table'
|
35
35
|
s.add_dependency 'highline'
|
36
|
-
s.add_dependency 'slop', '>= 3.
|
36
|
+
s.add_dependency 'slop', '>= 3.5.0'
|
37
37
|
s.add_development_dependency 'axlsx', '~> 2.0'
|
38
38
|
s.add_development_dependency 'bundler', '~> 1.3'
|
39
39
|
s.add_development_dependency 'rake'
|
data/lib/i18n/tasks.rb
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# define all the modules to be able to use ::
|
2
|
+
module I18n
|
3
|
+
module Tasks
|
4
|
+
module Data
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
|
1
10
|
require 'active_support/core_ext/hash'
|
2
11
|
require 'active_support/core_ext/string'
|
3
12
|
require 'active_support/core_ext/module/delegation'
|
@@ -11,8 +20,3 @@ require 'i18n/tasks/key'
|
|
11
20
|
require 'i18n/tasks/key_group'
|
12
21
|
require 'i18n/tasks/base_task'
|
13
22
|
|
14
|
-
module I18n
|
15
|
-
module Tasks
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
data/lib/i18n/tasks/base_task.rb
CHANGED
@@ -8,6 +8,7 @@ require 'i18n/tasks/missing_keys'
|
|
8
8
|
require 'i18n/tasks/unused_keys'
|
9
9
|
require 'i18n/tasks/google_translation'
|
10
10
|
require 'i18n/tasks/fill_tasks'
|
11
|
+
require 'i18n/tasks/file_structure'
|
11
12
|
require 'i18n/tasks/data'
|
12
13
|
require 'i18n/tasks/configuration'
|
13
14
|
|
@@ -24,15 +25,12 @@ module I18n
|
|
24
25
|
include GoogleTranslation
|
25
26
|
include Logging
|
26
27
|
include Configuration
|
28
|
+
include FileStructure
|
27
29
|
include Data
|
28
30
|
|
29
31
|
def initialize(config = {})
|
30
32
|
self.config = config || {}
|
31
33
|
end
|
32
|
-
|
33
|
-
def in_task(&block)
|
34
|
-
instance_exec(&block)
|
35
|
-
end
|
36
34
|
end
|
37
35
|
end
|
38
36
|
end
|
data/lib/i18n/tasks/commands.rb
CHANGED
@@ -117,6 +117,15 @@ module I18n::Tasks
|
|
117
117
|
spreadsheet_report.save_report opt[:path]
|
118
118
|
end
|
119
119
|
|
120
|
+
desc 'irb session within i18n-tasks context'
|
121
|
+
cmd :irb do
|
122
|
+
require 'irb'
|
123
|
+
IRB.setup nil
|
124
|
+
IRB.conf[:MAIN_CONTEXT] = IRB::Irb.new.context
|
125
|
+
require 'irb/ext/multi-irb'
|
126
|
+
IRB.irb nil, i18n_task
|
127
|
+
end
|
128
|
+
|
120
129
|
protected
|
121
130
|
|
122
131
|
def terminal_report
|
data/lib/i18n/tasks/data.rb
CHANGED
@@ -1,78 +1,95 @@
|
|
1
1
|
require 'i18n/tasks/data/file_system'
|
2
2
|
|
3
|
-
module I18n::Tasks
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
@
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
adapter =
|
3
|
+
module I18n::Tasks
|
4
|
+
module Data
|
5
|
+
|
6
|
+
# I18n data provider
|
7
|
+
# @see I18n::Tasks::Data::FileSystem
|
8
|
+
def data
|
9
|
+
@data ||= begin
|
10
|
+
conf = (config[:data] || {}).with_indifferent_access
|
11
|
+
adapter = (conf[:adapter].presence || conf[:class].presence || :file_system).to_s
|
12
|
+
if adapter !~ /[A-Z]/
|
13
|
+
adapter = "I18n::Tasks::Data::#{adapter.camelize}"
|
14
|
+
end
|
15
|
+
adapter.constantize.new(conf.except(:adapter, :class).merge(base_locale: base_locale))
|
12
16
|
end
|
13
|
-
adapter.constantize.new(conf.except(:adapter, :class))
|
14
17
|
end
|
15
|
-
end
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
19
|
+
def t(key, locale = base_locale)
|
20
|
+
data.t(key, locale)
|
21
|
+
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
23
|
+
def tree(locale)
|
24
|
+
data[locale][locale].children
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
27
|
+
def node(key, locale = base_locale)
|
28
|
+
data[locale]["#{locale}.#{key}"]
|
29
|
+
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
from = self.locales unless from
|
34
|
-
Array(from).each do |target_locale|
|
35
|
-
# the store itself handles normalization
|
36
|
-
data[target_locale] = data[target_locale]
|
31
|
+
def build_tree(hash)
|
32
|
+
I18n::Tasks::Data::Tree::Siblings.from_nested_hash(hash)
|
37
33
|
end
|
38
|
-
end
|
39
34
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
# @option opts [String] :locale
|
44
|
-
def update_data(opts = {})
|
45
|
-
if opts.key?(:locales)
|
46
|
-
locales = (Array(opts[:locales]).presence || self.locales).map(&:to_s)
|
47
|
-
# make sure base_locale always comes first if present
|
48
|
-
locales = [base_locale] + (locales - [base_locale]) if locales.include?(base_locale)
|
49
|
-
opts = opts.except(:locales)
|
50
|
-
locales.each { |locale| update_locale_data(locale, opts.merge(locale: locale)) }
|
51
|
-
else
|
52
|
-
update_locale_data(opts[:locale] || base_locale, opts)
|
35
|
+
def t_proc(locale = base_locale)
|
36
|
+
@t_proc ||= {}
|
37
|
+
@t_proc[locale] ||= proc { |key| t(key, locale) }
|
53
38
|
end
|
54
|
-
end
|
55
39
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
def update_locale_data(locale, opts = {})
|
61
|
-
keys = opts[:keys]
|
62
|
-
keys = keys.call(locale) if keys.respond_to?(:call)
|
63
|
-
return if keys.empty?
|
40
|
+
# whether the value for key exists in locale (defaults: base_locale)
|
41
|
+
def key_value?(key, locale = base_locale)
|
42
|
+
!t(key, locale).nil?
|
43
|
+
end
|
64
44
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
45
|
+
# write to store, normalizing all data
|
46
|
+
def normalize_store!(from = nil)
|
47
|
+
from = self.locales unless from
|
48
|
+
Array(from).each do |target_locale|
|
49
|
+
# the store itself handles normalization
|
50
|
+
data[target_locale] = data[target_locale]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# if :locales option present, call update_locale_data for each locale
|
55
|
+
# otherwise, call update_locale_data for :locale option or base locale
|
56
|
+
# @option opts [Array] :locales
|
57
|
+
# @option opts [String] :locale
|
58
|
+
def update_data(opts = {})
|
59
|
+
if opts.key?(:locales)
|
60
|
+
locales = (Array(opts[:locales]).presence || self.locales).map(&:to_s)
|
61
|
+
# make sure base_locale always comes first if present
|
62
|
+
locales = [base_locale] + (locales - [base_locale]) if locales.include?(base_locale)
|
63
|
+
opts = opts.except(:locales)
|
64
|
+
locales.each { |locale| update_locale_data(locale, opts.merge(locale: locale)) }
|
71
65
|
else
|
72
|
-
[
|
66
|
+
update_locale_data(opts[:locale] || base_locale, opts)
|
73
67
|
end
|
74
68
|
end
|
75
|
-
data[locale] += keys.map(&:to_s).zip(values)
|
76
|
-
end
|
77
69
|
|
70
|
+
# @param locale
|
71
|
+
# @option opts [Array|Proc] :keys keys to update, if proc call with locale
|
72
|
+
# @option opts [String|Proc] value, if proc call with each key
|
73
|
+
# @option opts [String|Proc] values, if proc call with all the keys
|
74
|
+
def update_locale_data(locale, opts = {})
|
75
|
+
locale = locale.to_s
|
76
|
+
keys = opts[:keys]
|
77
|
+
keys = keys.call(locale) if keys.respond_to?(:call)
|
78
|
+
return if keys.empty?
|
79
|
+
|
80
|
+
values = opts[:values]
|
81
|
+
values = values.call(keys, locale) if values.respond_to?(:call)
|
82
|
+
values ||= begin
|
83
|
+
value = opts[:value] or raise 'pass value or values'
|
84
|
+
if value.respond_to?(:call)
|
85
|
+
keys.map { |key| value.call(key, locale) }
|
86
|
+
else
|
87
|
+
[value] * keys.size
|
88
|
+
end
|
89
|
+
end
|
90
|
+
data[locale] = tree(locale).merge!(
|
91
|
+
Tree::Siblings.from_flat_pairs keys.map(&:to_s).zip(values)
|
92
|
+
).parent
|
93
|
+
end
|
94
|
+
end
|
78
95
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
1
3
|
module I18n
|
2
4
|
module Tasks
|
3
5
|
module Data
|
@@ -19,6 +21,7 @@ module I18n
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def write_tree(path, tree)
|
24
|
+
::FileUtils.mkpath(File.dirname path)
|
22
25
|
::File.open(path, 'w') { |f|
|
23
26
|
adapter_name, adapter_pattern, adapter = adapter_for(path)
|
24
27
|
adapter_options = (config[adapter_name] || {})[:write]
|
@@ -1,12 +1,12 @@
|
|
1
|
-
require 'i18n/tasks/data/
|
2
|
-
require 'i18n/tasks/data/router'
|
1
|
+
require 'i18n/tasks/data/tree/node'
|
2
|
+
require 'i18n/tasks/data/router/pattern_router'
|
3
|
+
require 'i18n/tasks/data/router/conservative_router'
|
3
4
|
require 'i18n/tasks/data/file_formats'
|
4
5
|
require 'i18n/tasks/key_pattern_matching'
|
5
6
|
|
6
7
|
module I18n::Tasks
|
7
8
|
module Data
|
8
9
|
class FileSystemBase
|
9
|
-
include ::I18n::Tasks::Data::Router
|
10
10
|
include ::I18n::Tasks::Data::FileFormats
|
11
11
|
|
12
12
|
attr_reader :config
|
@@ -20,48 +20,32 @@ module I18n::Tasks
|
|
20
20
|
self.config = config
|
21
21
|
end
|
22
22
|
|
23
|
-
def t(key, locale)
|
24
|
-
get(locale).t(key)
|
25
|
-
end
|
26
|
-
|
27
|
-
def config=(config)
|
28
|
-
@config = DEFAULTS.deep_merge((config || {}).with_indifferent_access)
|
29
|
-
@config[:write] = compile_routes @config[:write]
|
30
|
-
reload
|
31
|
-
end
|
32
|
-
|
33
23
|
# get locale tree
|
34
24
|
def get(locale)
|
35
|
-
locale
|
36
|
-
@
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
load_file locale_file
|
41
|
-
end.inject({}) do |hash, locale_data|
|
42
|
-
hash.deep_merge! locale_data || {}
|
43
|
-
hash
|
44
|
-
end[locale.to_s] || {}
|
45
|
-
LocaleTree.new locale, hash.to_hash
|
46
|
-
end
|
25
|
+
locale = locale.to_s
|
26
|
+
@trees ||= {}
|
27
|
+
@trees[locale] ||= Tree::Siblings[locale => {}].merge!(
|
28
|
+
read_locale locale
|
29
|
+
)
|
47
30
|
end
|
48
31
|
|
49
32
|
alias [] get
|
50
33
|
|
51
34
|
# set locale tree
|
52
|
-
def set(locale,
|
35
|
+
def set(locale, tree)
|
53
36
|
locale = locale.to_s
|
54
|
-
|
55
|
-
write_tree path,
|
37
|
+
router.route locale, tree do |path, tree_slice|
|
38
|
+
write_tree path, tree_slice
|
56
39
|
end
|
57
|
-
@
|
40
|
+
@trees.delete(locale) if @trees
|
41
|
+
@available_locales = nil
|
58
42
|
end
|
59
43
|
|
60
44
|
alias []= set
|
61
45
|
|
62
46
|
# @return self
|
63
47
|
def reload
|
64
|
-
@
|
48
|
+
@trees = nil
|
65
49
|
@available_locales = nil
|
66
50
|
self
|
67
51
|
end
|
@@ -85,6 +69,45 @@ module I18n::Tasks
|
|
85
69
|
locales
|
86
70
|
end
|
87
71
|
end
|
72
|
+
|
73
|
+
def t(key, locale)
|
74
|
+
tree = self[locale.to_s]
|
75
|
+
return unless tree
|
76
|
+
tree[locale][key].try(:hash_or_value)
|
77
|
+
end
|
78
|
+
|
79
|
+
def config=(config)
|
80
|
+
@config = DEFAULTS.deep_merge((config || {}).with_indifferent_access)
|
81
|
+
reload
|
82
|
+
end
|
83
|
+
|
84
|
+
protected
|
85
|
+
|
86
|
+
def read_locale(locale)
|
87
|
+
Array(config[:read]).map do |path|
|
88
|
+
Dir.glob path % {locale: locale}
|
89
|
+
end.reduce(:+).map do |path|
|
90
|
+
[path.freeze, load_file(path) || {}]
|
91
|
+
end.map do |path, data|
|
92
|
+
Data::Tree::Siblings.from_nested_hash(data).tap do |s|
|
93
|
+
s.leaves { |x| x.data[:path] = path }
|
94
|
+
end
|
95
|
+
end.reduce(:merge!) || Tree::Siblings.null
|
96
|
+
end
|
97
|
+
|
98
|
+
def base_locale
|
99
|
+
config[:base_locale]
|
100
|
+
end
|
101
|
+
|
102
|
+
def router
|
103
|
+
@router ||= begin
|
104
|
+
name = @config[:router].presence || 'pattern_router'
|
105
|
+
if name[0] != name[0].upcase
|
106
|
+
name = "I18n::Tasks::Data::Router::#{name.classify}"
|
107
|
+
end
|
108
|
+
name.constantize.new(self, @config)
|
109
|
+
end
|
110
|
+
end
|
88
111
|
end
|
89
112
|
end
|
90
113
|
end
|