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 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