-
Notifications
You must be signed in to change notification settings - Fork 269
/
Copy pathplural_keys.rb
61 lines (51 loc) · 1.77 KB
/
plural_keys.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# frozen_string_literal: true
require 'set'
module I18n::Tasks::PluralKeys
# Ref: http://cldr.unicode.org/index/cldr-spec/plural-rules
CLDR_CATEGORY_KEYS = %w[zero one two few many other].freeze
PLURAL_KEY_SUFFIXES = Set.new CLDR_CATEGORY_KEYS
PLURAL_KEY_RE = /\.(?:#{CLDR_CATEGORY_KEYS * '|'})$/.freeze
def collapse_plural_nodes!(tree)
tree.leaves.map(&:parent).compact.uniq.each do |node|
children = node.children
next unless plural_forms?(children)
node.value = children.to_hash
node.children = nil
node.data.merge! children.first.data
end
tree
end
# @param [String] key i18n key
# @param [String] locale to pull key data from
# @return [String] the base form if the key is a specific plural form (e.g. apple for apple.many), the key otherwise.
def depluralize_key(key, locale = base_locale)
return key if key !~ PLURAL_KEY_RE
key_name = last_key_part(key)
parent_key = key[0..- (key_name.length + 2)]
nodes = tree("#{locale}.#{parent_key}").presence || (locale != base_locale && tree("#{base_locale}.#{parent_key}"))
if nodes && plural_forms?(nodes)
parent_key
else
key
end
end
# @param [::I18n::Tasks::Data::Tree::Traversal] tree
# @yieldparam node [::I18n::Tasks::Data::Tree::Node] plural node
def plural_nodes(tree)
return to_enum(:plural_nodes, tree) unless block_given?
visited = Set.new
tree.leaves do |node|
parent = node.parent
next if !parent || visited.include?(parent)
yield parent if plural_forms?(parent.children)
visited.add(parent)
end
self
end
def plural_forms?(s)
s.present? && s.all? { |node| node.leaf? && plural_suffix?(node.key) }
end
def plural_suffix?(key)
PLURAL_KEY_SUFFIXES.include?(key)
end
end