i18n-tasks 0.9.27 → 0.9.28
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 +1 -1
- data/config/locales/ru.yml +4 -0
- data/i18n-tasks.gemspec +1 -0
- data/lib/i18n/tasks.rb +6 -0
- data/lib/i18n/tasks/data/file_formats.rb +2 -0
- data/lib/i18n/tasks/missing_keys.rb +28 -7
- data/lib/i18n/tasks/plural_keys.rb +19 -0
- data/lib/i18n/tasks/reports/terminal.rb +2 -5
- data/lib/i18n/tasks/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: daf654e97c52cba1413c10e69c12510ed9ce438e2fabf089bdb05b38ac944c5c
|
|
4
|
+
data.tar.gz: 7d3d264ca3a630497da4c7c5fc48907cf22c55bd0f16ac51bffed22febb540f4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2fd90385cd85755fcb9ef3f53a1a21f09a6ac217d8f9153871ade1cd38a155dbd2eb585a2ac0b059938b07b50578949c2291012fb97b4c1169a470b1ee59d84c
|
|
7
|
+
data.tar.gz: de5ee6c4256599189f4934b97595364d39b242e4645ac017c59ea2f2a172296628340b53bbcd2b54df0657bbddd92fe0e8bee69f980e915b1a286a025eff8b78
|
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.28'
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
Copy the default [configuration file](#configuration):
|
data/config/locales/ru.yml
CHANGED
|
@@ -69,6 +69,8 @@ ru:
|
|
|
69
69
|
invalid_format: 'Неизвестный формат %{invalid}. Форматы: %{valid}.'
|
|
70
70
|
invalid_locale: Неверный язык %{invalid}
|
|
71
71
|
invalid_missing_type:
|
|
72
|
+
few: 'Неизвестные типы: %{invalid}. Типы: %{valid}.'
|
|
73
|
+
many: 'Неизвестные типы: %{invalid}. Типы: %{valid}.'
|
|
72
74
|
one: 'Неизвестный тип %{invalid}. Типы: %{valid}.'
|
|
73
75
|
other: 'Неизвестные типы: %{invalid}. Типы: %{valid}.'
|
|
74
76
|
pass_forest: Передайте дерево
|
|
@@ -108,6 +110,8 @@ ru:
|
|
|
108
110
|
none: Всё переведено.
|
|
109
111
|
remove_unused:
|
|
110
112
|
confirm:
|
|
113
|
+
few: Переводы (%{count}) будут удалены из %{locales}.
|
|
114
|
+
many: Переводы (%{count}) будут удалены из %{locales}.
|
|
111
115
|
one: "%{count} перевод будут удалён из %{locales}."
|
|
112
116
|
other: Переводы (%{count}) будут удалены из %{locales}.
|
|
113
117
|
noop: Нет неиспользуемых ключей
|
data/i18n-tasks.gemspec
CHANGED
|
@@ -39,6 +39,7 @@ TEXT
|
|
|
39
39
|
s.add_dependency 'highline', '>= 2.0.0'
|
|
40
40
|
s.add_dependency 'i18n'
|
|
41
41
|
s.add_dependency 'parser', '>= 2.2.3.0'
|
|
42
|
+
s.add_dependency 'rails-i18n'
|
|
42
43
|
s.add_dependency 'rainbow', '>= 2.2.2', '< 4.0'
|
|
43
44
|
s.add_dependency 'terminal-table', '>= 1.5.1'
|
|
44
45
|
s.add_development_dependency 'axlsx', '~> 2.0'
|
data/lib/i18n/tasks.rb
CHANGED
|
@@ -64,6 +64,12 @@ require 'i18n/tasks/base_task'
|
|
|
64
64
|
|
|
65
65
|
# Add internal locale data to i18n gem load path
|
|
66
66
|
require 'i18n'
|
|
67
|
+
|
|
67
68
|
Dir[File.join(I18n::Tasks.gem_path, 'config', 'locales', '*.yml')].each do |locale_file|
|
|
68
69
|
I18n.config.load_path << locale_file
|
|
69
70
|
end
|
|
71
|
+
|
|
72
|
+
# Load pluralization data
|
|
73
|
+
require 'rails-i18n'
|
|
74
|
+
I18n.enforce_available_locales = false
|
|
75
|
+
RailsI18n::Railtie.add('rails/pluralization/*.rb')
|
|
@@ -2,21 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
require 'set'
|
|
4
4
|
module I18n::Tasks
|
|
5
|
-
module MissingKeys
|
|
6
|
-
MISSING_TYPES =
|
|
7
|
-
used
|
|
8
|
-
diff
|
|
9
|
-
|
|
5
|
+
module MissingKeys # rubocop:disable Metrics/ModuleLength
|
|
6
|
+
MISSING_TYPES = %w[
|
|
7
|
+
used
|
|
8
|
+
diff
|
|
9
|
+
plural
|
|
10
|
+
].freeze
|
|
10
11
|
|
|
11
12
|
def self.missing_keys_types
|
|
12
|
-
@missing_keys_types ||= MISSING_TYPES
|
|
13
|
+
@missing_keys_types ||= MISSING_TYPES
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def missing_keys_types
|
|
16
17
|
MissingKeys.missing_keys_types
|
|
17
18
|
end
|
|
18
19
|
|
|
19
|
-
# @param types [:used, :diff] all if `nil`.
|
|
20
|
+
# @param types [:used, :diff, :plural] all if `nil`.
|
|
20
21
|
# @return [Siblings]
|
|
21
22
|
def missing_keys(locales: nil, types: nil, base_locale: nil)
|
|
22
23
|
locales ||= self.locales
|
|
@@ -55,6 +56,26 @@ module I18n::Tasks
|
|
|
55
56
|
end
|
|
56
57
|
end
|
|
57
58
|
|
|
59
|
+
def missing_plural_forest(locales, _base = base_locale)
|
|
60
|
+
locales.each_with_object(empty_forest) do |locale, forest|
|
|
61
|
+
next unless I18n.exists?(:'i18n.plural.keys', locale)
|
|
62
|
+
required_keys = Set.new(I18n.t(:'i18n.plural.keys', locale: locale, resolve: false))
|
|
63
|
+
tree = empty_forest
|
|
64
|
+
plural_nodes data[locale] do |node|
|
|
65
|
+
children = node.children
|
|
66
|
+
present_keys = Set.new(children.map { |c| c.key.to_sym })
|
|
67
|
+
next if present_keys.superset?(required_keys)
|
|
68
|
+
tree[node.full_key] = node.derive(
|
|
69
|
+
value: children.to_hash,
|
|
70
|
+
children: nil,
|
|
71
|
+
data: node.data.merge(missing_keys: (required_keys - present_keys).to_a)
|
|
72
|
+
)
|
|
73
|
+
end
|
|
74
|
+
tree.set_root_key!(locale, type: :missing_plural)
|
|
75
|
+
forest.merge!(tree)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
58
79
|
# keys present in compared_to, but not in locale
|
|
59
80
|
def missing_diff_tree(locale, compared_to = base_locale)
|
|
60
81
|
data[compared_to].select_keys do |key, _node|
|
|
@@ -31,10 +31,29 @@ module I18n::Tasks::PluralKeys
|
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
+
# @param [::I18n::Tasks::Data::Tree::Traversal] tree
|
|
35
|
+
# @yieldparam node [::I18n::Tasks::Data::Tree::Node] plural node
|
|
36
|
+
def plural_nodes(tree)
|
|
37
|
+
return to_enum(:plural_nodes, tree) unless block_given?
|
|
38
|
+
visited = Set.new
|
|
39
|
+
tree.leaves do |node|
|
|
40
|
+
parent = node.parent
|
|
41
|
+
next if !parent || visited.include?(parent)
|
|
42
|
+
yield parent if plural_forms?(parent.children)
|
|
43
|
+
visited.add(parent)
|
|
44
|
+
end
|
|
45
|
+
self
|
|
46
|
+
end
|
|
47
|
+
|
|
34
48
|
def plural_forms?(s)
|
|
49
|
+
return false if non_plural_other?(s)
|
|
35
50
|
s.present? && s.all? { |node| node.leaf? && plural_suffix?(node.key) }
|
|
36
51
|
end
|
|
37
52
|
|
|
53
|
+
def non_plural_other?(s)
|
|
54
|
+
s.size == 1 && s.first.leaf? && (!s.first.value.is_a?(String) || !s.first.value.include?('%{count}'))
|
|
55
|
+
end
|
|
56
|
+
|
|
38
57
|
def plural_suffix?(key)
|
|
39
58
|
PLURAL_KEY_SUFFIXES.include?(key)
|
|
40
59
|
end
|
|
@@ -34,11 +34,6 @@ module I18n
|
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
def icon(type)
|
|
38
|
-
glyph = missing_type_info(type)[:glyph]
|
|
39
|
-
{ missing_used: Rainbow(glyph).red, missing_diff: Rainbow(glyph).yellow }[type]
|
|
40
|
-
end
|
|
41
|
-
|
|
42
37
|
def used_keys(used_tree = task.used_tree)
|
|
43
38
|
# For the used tree we may have usage nodes that are not leaves as references.
|
|
44
39
|
keys_nodes = used_tree.nodes.select { |node| node.data[:occurrences].present? }.map do |node|
|
|
@@ -114,6 +109,8 @@ module I18n
|
|
|
114
109
|
def missing_key_info(leaf)
|
|
115
110
|
if leaf[:type] == :missing_used
|
|
116
111
|
first_occurrence leaf
|
|
112
|
+
elsif leaf[:type] == :missing_plural
|
|
113
|
+
leaf[:data][:missing_keys].join(', ')
|
|
117
114
|
else
|
|
118
115
|
"#{Rainbow(leaf[:data][:missing_diff_locale]).cyan} "\
|
|
119
116
|
"#{format_value(leaf[:value].is_a?(String) ? leaf[:value].strip : leaf[:value])}"
|
data/lib/i18n/tasks/version.rb
CHANGED
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.9.
|
|
4
|
+
version: 0.9.28
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- glebm
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-10-
|
|
11
|
+
date: 2018-10-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -94,6 +94,20 @@ dependencies:
|
|
|
94
94
|
- - ">="
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
96
|
version: 2.2.3.0
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: rails-i18n
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - ">="
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
104
|
+
type: :runtime
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ">="
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
97
111
|
- !ruby/object:Gem::Dependency
|
|
98
112
|
name: rainbow
|
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|