i18n-tasks 0.9.27 → 0.9.28

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3259a9c8894c28f8372fefdd509e2dc8240d40d8ead58b284fc9887f9c30d2c4
4
- data.tar.gz: cd9003f49d146342de7466f42478f2bddd94cfcb108752d1a2fb8109900a3abe
3
+ metadata.gz: daf654e97c52cba1413c10e69c12510ed9ce438e2fabf089bdb05b38ac944c5c
4
+ data.tar.gz: 7d3d264ca3a630497da4c7c5fc48907cf22c55bd0f16ac51bffed22febb540f4
5
5
  SHA512:
6
- metadata.gz: 4a05cf473e34cc265fd70ad193aa849698dafca63b6d76542170d6d119b9d4c453ae06cd1b23d2c9ce3b6943e0d3e14865bb62ffe4cc3c2ab591e432530a2a28
7
- data.tar.gz: 6d9fe81237a10d0fec00ab1bb588d45beb3085ef8342dd644bcc059547b079971aad039d1f17203d16439eece482ca83904f29fdf6e99d6cabe7481667b336a9
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.27'
25
+ gem 'i18n-tasks', '~> 0.9.28'
26
26
  ```
27
27
 
28
28
  Copy the default [configuration file](#configuration):
@@ -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: Нет неиспользуемых ключей
@@ -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'
@@ -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')
@@ -38,6 +38,8 @@ module I18n
38
38
  # @return [Hash]
39
39
  def load_file(path)
40
40
  adapter_parse read_file(path), self.class.adapter_name_for_path(path)
41
+ rescue CommandError => e
42
+ raise(e.class, "#{e.message} (file: #{path})")
41
43
  end
42
44
 
43
45
  # @return [String]
@@ -2,21 +2,22 @@
2
2
 
3
3
  require 'set'
4
4
  module I18n::Tasks
5
- module MissingKeys
6
- MISSING_TYPES = {
7
- used: { glyph: '✗', summary: 'used in code but missing from base locale' },
8
- diff: { glyph: '∅', summary: 'translated in one locale but not in the other' }
9
- }.freeze
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.keys
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])}"
@@ -2,6 +2,6 @@
2
2
 
3
3
  module I18n
4
4
  module Tasks
5
- VERSION = '0.9.27'
5
+ VERSION = '0.9.28'
6
6
  end
7
7
  end
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.27
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-23 00:00:00.000000000 Z
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