num2words 0.1.0 → 0.1.3

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.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/CHANGELOG.md +71 -0
  4. data/Gemfile +1 -0
  5. data/README.md +105 -82
  6. data/bin/console +1 -1
  7. data/config/locales/ar.yml +36 -0
  8. data/config/locales/be.yml +31 -0
  9. data/config/locales/bg.yml +31 -0
  10. data/config/locales/bn.yml +26 -0
  11. data/config/locales/cs.yml +31 -0
  12. data/config/locales/da.yml +31 -0
  13. data/config/locales/de.yml +31 -0
  14. data/config/locales/el.yml +36 -0
  15. data/config/locales/en.yml +41 -0
  16. data/config/locales/es.yml +31 -0
  17. data/config/locales/et.yml +26 -0
  18. data/config/locales/fa.yml +31 -0
  19. data/config/locales/fi.yml +26 -0
  20. data/config/locales/fr.yml +31 -0
  21. data/config/locales/gu.yml +26 -0
  22. data/config/locales/he.yml +36 -0
  23. data/config/locales/hi.yml +31 -0
  24. data/config/locales/hr.yml +31 -0
  25. data/config/locales/hu.yml +31 -0
  26. data/config/locales/id.yml +31 -0
  27. data/config/locales/it.yml +31 -0
  28. data/config/locales/ja.yml +31 -0
  29. data/config/locales/kn.yml +26 -0
  30. data/config/locales/ko.yml +31 -0
  31. data/config/locales/kz.yml +36 -0
  32. data/config/locales/lt.yml +26 -0
  33. data/config/locales/lv.yml +26 -0
  34. data/config/locales/ml.yml +26 -0
  35. data/config/locales/mr.yml +26 -0
  36. data/config/locales/ms.yml +26 -0
  37. data/config/locales/nb.yml +36 -0
  38. data/config/locales/nl.yml +31 -0
  39. data/config/locales/pa.yml +26 -0
  40. data/config/locales/pl.yml +31 -0
  41. data/config/locales/pt.yml +31 -0
  42. data/config/locales/ro.yml +31 -0
  43. data/config/locales/ru.yml +36 -0
  44. data/config/locales/sk.yml +26 -0
  45. data/config/locales/sl.yml +26 -0
  46. data/config/locales/sr.yml +31 -0
  47. data/config/locales/sv.yml +33 -0
  48. data/config/locales/sw.yml +26 -0
  49. data/config/locales/ta.yml +26 -0
  50. data/config/locales/te.yml +26 -0
  51. data/config/locales/th.yml +31 -0
  52. data/config/locales/tr.yml +31 -0
  53. data/config/locales/uk.yml +31 -0
  54. data/config/locales/ur.yml +26 -0
  55. data/config/locales/vi.yml +31 -0
  56. data/config/locales/zh.yml +21 -0
  57. data/lib/num2words/converter.rb +97 -59
  58. data/lib/num2words/core_ext.rb +10 -6
  59. data/lib/num2words/i18n.rb +30 -0
  60. data/lib/num2words/locales/ar.rb +19 -0
  61. data/lib/num2words/locales/be.rb +19 -0
  62. data/lib/num2words/locales/bg.rb +19 -0
  63. data/lib/num2words/locales/bn.rb +19 -0
  64. data/lib/num2words/locales/cs.rb +19 -0
  65. data/lib/num2words/locales/da.rb +19 -0
  66. data/lib/num2words/locales/de.rb +19 -0
  67. data/lib/num2words/locales/el.rb +19 -0
  68. data/lib/num2words/locales/en.rb +22 -0
  69. data/lib/num2words/locales/es.rb +19 -0
  70. data/lib/num2words/locales/et.rb +19 -0
  71. data/lib/num2words/locales/fa.rb +19 -0
  72. data/lib/num2words/locales/fi.rb +19 -0
  73. data/lib/num2words/locales/fr.rb +19 -0
  74. data/lib/num2words/locales/gu.rb +19 -0
  75. data/lib/num2words/locales/he.rb +19 -0
  76. data/lib/num2words/locales/hi.rb +19 -0
  77. data/lib/num2words/locales/hr.rb +19 -0
  78. data/lib/num2words/locales/hu.rb +19 -0
  79. data/lib/num2words/locales/id.rb +19 -0
  80. data/lib/num2words/locales/it.rb +19 -0
  81. data/lib/num2words/locales/ja.rb +19 -0
  82. data/lib/num2words/locales/kn.rb +19 -0
  83. data/lib/num2words/locales/ko.rb +19 -0
  84. data/lib/num2words/locales/kz.rb +19 -0
  85. data/lib/num2words/locales/lt.rb +19 -0
  86. data/lib/num2words/locales/lv.rb +19 -0
  87. data/lib/num2words/locales/ml.rb +19 -0
  88. data/lib/num2words/locales/mr.rb +19 -0
  89. data/lib/num2words/locales/ms.rb +19 -0
  90. data/lib/num2words/locales/nl.rb +19 -0
  91. data/lib/num2words/locales/no.rb +19 -0
  92. data/lib/num2words/locales/pa.rb +19 -0
  93. data/lib/num2words/locales/pl.rb +19 -0
  94. data/lib/num2words/locales/pt.rb +19 -0
  95. data/lib/num2words/locales/ro.rb +19 -0
  96. data/lib/num2words/locales/ru.rb +22 -0
  97. data/lib/num2words/locales/sk.rb +19 -0
  98. data/lib/num2words/locales/sl.rb +19 -0
  99. data/lib/num2words/locales/sr.rb +19 -0
  100. data/lib/num2words/locales/sv.rb +19 -0
  101. data/lib/num2words/locales/sw.rb +19 -0
  102. data/lib/num2words/locales/ta.rb +19 -0
  103. data/lib/num2words/locales/te.rb +19 -0
  104. data/lib/num2words/locales/th.rb +19 -0
  105. data/lib/num2words/locales/tr.rb +19 -0
  106. data/lib/num2words/locales/uk.rb +19 -0
  107. data/lib/num2words/locales/ur.rb +19 -0
  108. data/lib/num2words/locales/vi.rb +19 -0
  109. data/lib/num2words/locales/zh.rb +19 -0
  110. data/lib/num2words/locales.rb +33 -0
  111. data/lib/num2words/version.rb +1 -1
  112. data/lib/num2words.rb +6 -4
  113. data/num2words.gemspec +2 -0
  114. metadata +120 -3
@@ -0,0 +1,26 @@
1
+ ur:
2
+ num2words:
3
+ ones_masc: ["صفر", "ایک", "دو", "تین", "چار", "پانچ", "چھ", "سات", "آٹھ", "نو"]
4
+ ones_fem: ["صفر", "ایک", "دو", "تین", "چار", "پانچ", "چھ", "سات", "آٹھ", "نو"]
5
+ teens: ["دس", "گیارہ", "بارہ", "تیرہ", "چودہ", "پندرہ", "سولہ", "سترہ", "اٹھارہ", "انیس"]
6
+ tens: ["", "", "بییس", "تیس", "چالیس", "پچاس", "ساٹھ", "ستر", "اسی", "نوے"]
7
+ hundreds: ["", "سو", "دو سو", "تین سو", "چار سو", "پانچ سو", "چھ سو", "سات سو", "آٹھ سو", "نو سو"]
8
+
9
+ scales:
10
+ - ["", "", ""]
11
+ - ["ہزار", "ہزار", "ہزار"]
12
+ - ["لاکھ", "لاکھ", "لاکھ"]
13
+ - ["کروڑ", "کروڑ", "کروڑ"]
14
+ - ["ٹریلین", "ٹریلین", "ٹریلین"]
15
+
16
+ currencies:
17
+ PKR:
18
+ name: ["روپیہ", "روپے", "روپے"]
19
+ fractional:
20
+ name: ["پیسہ", "پیسے", "پیسے"]
21
+ feminine: false
22
+ USD:
23
+ name: ["ڈالر", "ڈالر", "ڈالر"]
24
+ fractional:
25
+ name: ["سینٹ", "سینٹ", "سینٹ"]
26
+ feminine: false
@@ -0,0 +1,31 @@
1
+ vi:
2
+ num2words:
3
+ ones_masc: ["không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"]
4
+ ones_fem: ["không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"]
5
+ teens: ["mười", "mười một", "mười hai", "mười ba", "mười bốn", "mười lăm", "mười sáu", "mười bảy", "mười tám", "mười chín"]
6
+ tens: ["", "", "hai mươi", "ba mươi", "bốn mươi", "năm mươi", "sáu mươi", "bảy mươi", "tám mươi", "chín mươi"]
7
+ hundreds: ["", "một trăm", "hai trăm", "ba trăm", "bốn trăm", "năm trăm", "sáu trăm", "bảy trăm", "tám trăm", "chín trăm"]
8
+
9
+ scales:
10
+ - ["", "", ""]
11
+ - ["nghìn", "nghìn", "nghìn"]
12
+ - ["triệu", "triệu", "triệu"]
13
+ - ["tỷ", "tỷ", "tỷ"]
14
+ - ["nghìn tỷ", "nghìn tỷ", "nghìn tỷ"]
15
+
16
+ currencies:
17
+ VND:
18
+ name: ["đồng", "đồng", "đồng"]
19
+ fractional:
20
+ name: ["hào", "hào", "hào"]
21
+ feminine: false
22
+ USD:
23
+ name: ["đô la", "đô la", "đô la"]
24
+ fractional:
25
+ name: ["xu", "xu", "xu"]
26
+ feminine: false
27
+ EUR:
28
+ name: ["euro", "euro", "euro"]
29
+ fractional:
30
+ name: ["xu", "xu", "xu"]
31
+ feminine: false
@@ -0,0 +1,21 @@
1
+ zh:
2
+ num2words:
3
+ ones_masc: ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
4
+ ones_fem: ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
5
+ teens: ["十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九"]
6
+ tens: ["", "十", "二十", "三十", "四十", "五十", "六十", "七十", "八十", "九十"]
7
+ hundreds: ["", "一百", "二百", "三百", "四百", "五百", "六百", "七百", "八百", "九百"]
8
+
9
+ scales:
10
+ - ["", "", ""] # 10^0
11
+ - ["千", "千", "千"] # 10^3
12
+ - ["万", "万", "万"] # 10^4
13
+ - ["亿", "亿", "亿"] # 10^8
14
+ - ["兆", "兆", "兆"] # 10^12
15
+
16
+ currencies:
17
+ CNY:
18
+ name: ["元", "元", "元"]
19
+ fractional:
20
+ name: ["角", "分", "分"]
21
+ feminine: false
@@ -2,97 +2,135 @@
2
2
 
3
3
  module Num2words
4
4
  class Converter
5
- ONES_MASC = %w[ноль один два три четыре пять шесть семь восемь девять].freeze
6
- ONES_FEM = %w[ноль одна две три четыре пять шесть семь восемь девять].freeze
5
+ class << self
6
+ def to_words(number, *args, **opts)
7
+ locale = args.first.is_a?(Symbol) ? args.first : opts[:locale] || I18n.default_locale
8
+ feminine = opts[:feminine] || false
9
+ style = opts[:style] || :fraction
10
+ word_case = opts[:word_case] || :downcase
11
+ locale_data = Locales[locale]
12
+
13
+ result = if number.is_a?(Float)
14
+ to_words_fractional(number, locale, feminine, locale_data, style: style)
15
+ else
16
+ to_words_integer(number, locale, feminine, locale_data)
17
+ end
18
+
19
+ apply_case(result, word_case)
20
+ end
21
+
22
+ def to_currency(amount, *args, **opts)
23
+ locale = args.first.is_a?(Symbol) ? args.first : opts[:locale] || I18n.default_locale
24
+ word_case = opts[:word_case] || :downcase
25
+ locale_data = Locales[locale]
7
26
 
8
- TEENS = %w[десять одиннадцать двенадцать тринадцать четырнадцать пятнадцать
9
- шестнадцать семнадцать восемнадцать девятнадцать].freeze
27
+ major_str, minor_str = sprintf('%.2f', amount).split('.')
28
+ major_value = major_str.to_i
29
+ minor_value = minor_str.to_i
10
30
 
11
- TENS = [nil, nil, "двадцать", "тридцать", "сорок", "пятьдесят",
12
- "шестьдесят", "семьдесят", "восемьдесят", "девяносто"].freeze
31
+ major_words = to_words(major_value, locale: locale)
32
+ major_name = pluralize(major_value, *locale_data::MAJOR_UNIT)
13
33
 
14
- HUNDREDS = [nil, "сто", "двести", "триста", "четыреста", "пятьсот",
15
- "шестьсот", "семьсот", "восемьсот", "девятьсот"].freeze
34
+ minor_words = to_words(minor_value, locale: locale, feminine: true)
35
+ minor_name = pluralize(minor_value, *locale_data::MINOR_UNIT)
16
36
 
17
- # формы: [one, few, many]
18
- SCALES = [
19
- ["", "", ""], # 10^0 (единицы)
20
- %w[тысяча тысячи тысяч], # 10^3
21
- %w[миллион миллиона миллионов], # 10^6
22
- %w[миллиард миллиарда миллиардов], # 10^9
23
- %w[триллион триллиона триллионов] # 10^12
24
- ].freeze
37
+ result = [major_words, major_name, minor_words, minor_name].join(" ")
38
+ apply_case(result, word_case)
39
+ end
25
40
 
26
- RUB = %w[рубль рубля рублей].freeze
27
- KOP = %w[копейка копейки копеек].freeze
41
+ private
28
42
 
29
- class << self
30
- def pluralize(n, one, few, many)
31
- return many if (11..14).include?(n % 100)
32
- case n % 10
33
- when 1 then one
43
+ def pluralize(number, singular, few, plural)
44
+ return plural if (11..14).include?(number % 100)
45
+
46
+ case number % 10
47
+ when 1 then singular
34
48
  when 2..4 then few
35
- else many
49
+ else plural
36
50
  end
37
51
  end
38
52
 
39
53
  # n — 0..999, scale_idx — индекс разряда (0 — единицы, 1 — тысячи, ...)
40
54
  # feminine: true — использовать женский род для единиц (нужно для тысяч/копеек)
41
- def triple_to_words(n, scale_idx, feminine: false)
55
+ def triple_to_words(n, scale_idx, local_data, feminine: false)
42
56
  return [] if n.zero?
43
-
44
57
  words = []
45
- words << HUNDREDS[n / 100] if n >= 100
46
58
 
59
+ words << local_data::HUNDREDS[n / 100] if n >= 100
47
60
  rest = n % 100
61
+
48
62
  if rest.between?(10, 19)
49
- words << TEENS[rest - 10]
63
+ words << local_data::TEENS[rest - 10]
50
64
  else
51
- words << TENS[rest / 10] if rest >= 20
65
+ words << local_data::TENS[rest / 10] if rest >= 20
52
66
  ones = rest % 10
53
- if ones.positive?
54
- words << (feminine ? ONES_FEM[ones] : ONES_MASC[ones])
55
- end
67
+ words << (feminine ? local_data::ONES_FEM[ones] : local_data::ONES_MASC[ones]) if ones.positive?
56
68
  end
57
69
 
58
- # добавляем наименование разряда (кроме единиц)
59
- words << pluralize(n, *SCALES[scale_idx]) unless scale_idx.zero?
70
+ words << pluralize(n, *local_data::SCALES[scale_idx]) unless scale_idx.zero?
60
71
  words.compact
61
72
  end
62
73
 
63
- # number целое число (0..10^12-1)
64
- def to_words(number, feminine: false)
65
- number = Integer(number)
66
- return (feminine ? ONES_FEM[0] : ONES_MASC[0]) if number.zero?
74
+ def to_words_fractional(number, locale, feminine, locale_data, style: :fraction)
75
+ minus_word = locale_data::GRAMMAR[:minus] || "minus"
76
+ conjunction_word = locale_data::GRAMMAR[:conjunction] || "and"
77
+ default_fraction = locale_data::GRAMMAR[:default_fraction] || "parts"
78
+ fractions_data = locale_data::FRACTIONS || {}
67
79
 
68
- groups = number.to_s
69
- .chars.reverse.each_slice(3).map(&:reverse)
70
- .map(&:join).map!(&:to_i).reverse
80
+ sign_word = number.negative? ? minus_word : ""
71
81
 
72
- words = []
73
- groups.each_with_index do |grp, idx|
74
- scale_idx = groups.size - idx - 1
75
- fem = (scale_idx == 1) || feminine # тысячи — жен. род
76
- words.concat triple_to_words(grp, scale_idx, feminine: fem)
82
+ integer_string, fraction_string = number.abs.to_s.split('.', 2)
83
+ integer_value = integer_string.to_i
84
+
85
+ return to_words_integer(integer_value, locale, feminine, locale_data) if fraction_string.to_i.zero?
86
+
87
+ fraction_string = fraction_string.sub(/0+\z/, "")
88
+ numerator = fraction_string.to_i
89
+ denominator = 10 ** fraction_string.length
90
+
91
+ integer_words = to_words_integer(integer_value, locale, feminine, locale_data)
92
+
93
+ if locale.to_sym == :en && style == :decimal
94
+ fraction_digits = fraction_string.chars.map { |d| to_words_integer(d.to_i, locale, feminine, locale_data) }
95
+ full_string = [sign_word, integer_words, "point", fraction_digits.join(" ")].reject(&:empty?).join(" ")
96
+ return full_string
77
97
  end
78
- words.join(" ")
98
+
99
+ numerator_words = to_words_integer(numerator, locale, (locale.to_sym == :ru ? true : feminine), locale_data)
100
+
101
+ denom_forms = fractions_data[denominator] || fractions_data[denominator.to_s] # массив склонений
102
+ denominator_words = denom_forms.is_a?(Array) ? pluralize(numerator, *denom_forms) : default_fraction
103
+
104
+ [sign_word, integer_words, conjunction_word, numerator_words, denominator_words].reject(&:empty?).join(" ")
79
105
  end
80
106
 
81
- # amount может быть String, Integer, Float, BigDecimal
82
- def to_currency(amount)
83
- str = amount.to_s
84
- rub_str, kop_str = str.split(".")
85
- rub = Integer(rub_str)
86
- # всегда 2 знака для копеек; обрезаем лишние, дополняем недостающие
87
- kop = (kop_str || "0")[0, 2].ljust(2, "0").to_i
107
+ def to_words_integer(number, locale, feminine, locale_data)
108
+ integer_value = Integer(number)
109
+
110
+ return (feminine ? locale_data::ONES_FEM[0] : locale_data::ONES_MASC[0]) if integer_value.zero?
88
111
 
89
- rub_words = to_words(rub)
90
- rub_name = pluralize(rub, *RUB)
112
+ groups = integer_value.to_s
113
+ .chars.reverse.each_slice(3).map(&:reverse)
114
+ .map(&:join).map!(&:to_i).reverse
91
115
 
92
- kop_words = to_words(kop, feminine: true)
93
- kop_name = pluralize(kop, *KOP)
116
+ words = []
117
+ groups.each_with_index do |group_value, index|
118
+ scale_index = groups.size - index - 1
119
+ group_feminine = (scale_index == 1) || feminine
120
+ words.concat triple_to_words(group_value, scale_index, locale_data, feminine: group_feminine)
121
+ end
122
+
123
+ words.join(" ")
124
+ end
94
125
 
95
- "#{rub_words} #{rub_name} #{kop_words} #{kop_name}"
126
+ def apply_case(text, word_case)
127
+ case word_case
128
+ when :upper then text.upcase
129
+ when :capitalize then text.capitalize
130
+ when :title then text.split.map(&:capitalize).join(" ")
131
+ when :downcase then text.downcase
132
+ else text
133
+ end
96
134
  end
97
135
  end
98
136
  end
@@ -1,17 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Integer
4
- def to_words(feminine: false)
5
- Num2words::Converter.to_words(self, feminine: feminine)
4
+ def to_words(*args, **opts)
5
+ Num2words::Converter.to_words(self, *args, **opts)
6
6
  end
7
7
 
8
- def to_currency
9
- Num2words::Converter.to_currency(self)
8
+ def to_currency(*args, **opts)
9
+ Num2words::Converter.to_currency(self, *args, **opts)
10
10
  end
11
11
  end
12
12
 
13
13
  class Float
14
- def to_currency
15
- Num2words::Converter.to_currency(self)
14
+ def to_words(*args, **opts)
15
+ Num2words::Converter.to_words(self, *args, **opts)
16
+ end
17
+
18
+ def to_currency(*args, **opts)
19
+ Num2words::Converter.to_currency(self, *args, **opts)
16
20
  end
17
21
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "i18n"
4
+
5
+ module Num2words
6
+ module I18nSetup
7
+ def self.load!
8
+ locales_path = File.expand_path("../../config/locales/*.yml", __dir__)
9
+ files = Dir[locales_path]
10
+
11
+ if files.empty?
12
+ raise "Num2words: не найдены файлы локалей в #{locales_path}"
13
+ end
14
+
15
+ I18n.load_path += files
16
+ I18n.available_locales = files.map { |file| File.basename(file, ".*") }.map(&:to_sym)
17
+ I18n.default_locale = :ru
18
+ I18n.enforce_available_locales = true
19
+
20
+ # Проверяем, что ключи реально доступны
21
+ I18n.available_locales.each do |loc|
22
+ unless I18n.exists?("num2words.ones_masc", locale: loc)
23
+ raise "Num2words: отсутствуют ключи для локали #{loc} в locales/#{loc}.yml"
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ Num2words::I18nSetup.load!
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module AR
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :ar)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :ar)
8
+ TEENS = I18n.t("num2words.teens", locale: :ar)
9
+ TENS = I18n.t("num2words.tens", locale: :ar)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :ar)
11
+ SCALES = I18n.t("num2words.scales", locale: :ar)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.SAR.name", locale: :ar)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.SAR.fractional.name", locale: :ar)
15
+ end
16
+
17
+ register :ar, AR
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module BE
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :be)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :be)
8
+ TEENS = I18n.t("num2words.teens", locale: :be)
9
+ TENS = I18n.t("num2words.tens", locale: :be)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :be)
11
+ SCALES = I18n.t("num2words.scales", locale: :be)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.BYN.name", locale: :be)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.BYN.fractional.name", locale: :be)
15
+ end
16
+
17
+ register :be, BE
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module BG
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :bg)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :bg)
8
+ TEENS = I18n.t("num2words.teens", locale: :bg)
9
+ TENS = I18n.t("num2words.tens", locale: :bg)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :bg)
11
+ SCALES = I18n.t("num2words.scales", locale: :bg)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.BGN.name", locale: :bg)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.BGN.fractional.name", locale: :bg)
15
+ end
16
+
17
+ register :bg, BG
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module BN
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :bn)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :bn)
8
+ TEENS = I18n.t("num2words.teens", locale: :bn)
9
+ TENS = I18n.t("num2words.tens", locale: :bn)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :bn)
11
+ SCALES = I18n.t("num2words.scales", locale: :bn)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.BDT.name", locale: :bn)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.BDT.fractional.name", locale: :bn)
15
+ end
16
+
17
+ register :bn, BN
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module CS
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :cs)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :cs)
8
+ TEENS = I18n.t("num2words.teens", locale: :cs)
9
+ TENS = I18n.t("num2words.tens", locale: :cs)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :cs)
11
+ SCALES = I18n.t("num2words.scales", locale: :cs)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.CZK.name", locale: :cs)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.CZK.fractional.name", locale: :cs)
15
+ end
16
+
17
+ register :cs, CS
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module DA
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :da)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :da)
8
+ TEENS = I18n.t("num2words.teens", locale: :da)
9
+ TENS = I18n.t("num2words.tens", locale: :da)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :da)
11
+ SCALES = I18n.t("num2words.scales", locale: :da)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.DKK.name", locale: :da)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.DKK.fractional.name", locale: :da)
15
+ end
16
+
17
+ register :da, DA
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module DE
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :de)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :de)
8
+ TEENS = I18n.t("num2words.teens", locale: :de)
9
+ TENS = I18n.t("num2words.tens", locale: :de)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :de)
11
+ SCALES = I18n.t("num2words.scales", locale: :de)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.EUR.name", locale: :de)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.EUR.fractional.name", locale: :de)
15
+ end
16
+
17
+ register :de, DE
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module EL
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :el)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :el)
8
+ TEENS = I18n.t("num2words.teens", locale: :el)
9
+ TENS = I18n.t("num2words.tens", locale: :el)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :el)
11
+ SCALES = I18n.t("num2words.scales", locale: :el)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.EUR.name", locale: :el)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.EUR.fractional.name", locale: :el)
15
+ end
16
+
17
+ register :el, EL
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module EN
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :en)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :en)
8
+ TEENS = I18n.t("num2words.teens", locale: :en)
9
+ TENS = I18n.t("num2words.tens", locale: :en)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :en)
11
+ SCALES = I18n.t("num2words.scales", locale: :en)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.USD.name", locale: :en)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.USD.fractional.name", locale: :en)
15
+
16
+ FRACTIONS = I18n.t("num2words.fractions", locale: :en)
17
+ GRAMMAR = I18n.t("num2words.grammar", locale: :en)
18
+ end
19
+
20
+ register :en, EN
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module ES
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :es)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :es)
8
+ TEENS = I18n.t("num2words.teens", locale: :es)
9
+ TENS = I18n.t("num2words.tens", locale: :es)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :es)
11
+ SCALES = I18n.t("num2words.scales", locale: :es)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.EUR.name", locale: :es)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.EUR.fractional.name", locale: :es)
15
+ end
16
+
17
+ register :es, ES
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module ET
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :et)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :et)
8
+ TEENS = I18n.t("num2words.teens", locale: :et)
9
+ TENS = I18n.t("num2words.tens", locale: :et)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :et)
11
+ SCALES = I18n.t("num2words.scales", locale: :et)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.EUR.name", locale: :et)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.EUR.fractional.name", locale: :et)
15
+ end
16
+
17
+ register :et, ET
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module FA
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :fa)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :fa)
8
+ TEENS = I18n.t("num2words.teens", locale: :fa)
9
+ TENS = I18n.t("num2words.tens", locale: :fa)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :fa)
11
+ SCALES = I18n.t("num2words.scales", locale: :fa)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.IRR.name", locale: :fa)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.IRR.fractional.name", locale: :fa)
15
+ end
16
+
17
+ register :fa, FA
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module FI
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :fi)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :fi)
8
+ TEENS = I18n.t("num2words.teens", locale: :fi)
9
+ TENS = I18n.t("num2words.tens", locale: :fi)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :fi)
11
+ SCALES = I18n.t("num2words.scales", locale: :fi)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.EUR.name", locale: :fi)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.EUR.fractional.name", locale: :fi)
15
+ end
16
+
17
+ register :fi, FI
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module FR
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :fr)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :fr)
8
+ TEENS = I18n.t("num2words.teens", locale: :fr)
9
+ TENS = I18n.t("num2words.tens", locale: :fr)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :fr)
11
+ SCALES = I18n.t("num2words.scales", locale: :fr)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.EUR.name", locale: :fr)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.EUR.fractional.name", locale: :fr)
15
+ end
16
+
17
+ register :fr, FR
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Num2words
4
+ module Locales
5
+ module GU
6
+ ONES_MASC = I18n.t("num2words.ones_masc", locale: :gu)
7
+ ONES_FEM = I18n.t("num2words.ones_fem", locale: :gu)
8
+ TEENS = I18n.t("num2words.teens", locale: :gu)
9
+ TENS = I18n.t("num2words.tens", locale: :gu)
10
+ HUNDREDS = I18n.t("num2words.hundreds", locale: :gu)
11
+ SCALES = I18n.t("num2words.scales", locale: :gu)
12
+
13
+ MAJOR_UNIT = I18n.t("num2words.currencies.INR.name", locale: :gu)
14
+ MINOR_UNIT = I18n.t("num2words.currencies.INR.fractional.name", locale: :gu)
15
+ end
16
+
17
+ register :gu, GU
18
+ end
19
+ end