num2words 0.1.6 → 0.3.0

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 (111) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +65 -0
  3. data/README.md +145 -135
  4. data/bin/console +2 -14
  5. data/config/locales/ar.yml +5 -1
  6. data/config/locales/be.yml +4 -0
  7. data/config/locales/bg.yml +4 -0
  8. data/config/locales/bn.yml +4 -0
  9. data/config/locales/cs.yml +6 -2
  10. data/config/locales/da.yml +4 -0
  11. data/config/locales/de.yml +8 -4
  12. data/config/locales/el.yml +4 -0
  13. data/config/locales/en.yml +4 -0
  14. data/config/locales/es.yml +4 -0
  15. data/config/locales/et.yml +9 -5
  16. data/config/locales/fa.yml +15 -11
  17. data/config/locales/fi.yml +8 -4
  18. data/config/locales/fr.yml +4 -0
  19. data/config/locales/gu.yml +4 -0
  20. data/config/locales/he.yml +6 -2
  21. data/config/locales/hi.yml +4 -0
  22. data/config/locales/hr.yml +8 -4
  23. data/config/locales/hu.yml +6 -2
  24. data/config/locales/id.yml +4 -0
  25. data/config/locales/it.yml +4 -0
  26. data/config/locales/ja.yml +10 -5
  27. data/config/locales/kn.yml +186 -10
  28. data/config/locales/ko.yml +184 -13
  29. data/config/locales/kz.yml +183 -17
  30. data/config/locales/lt.yml +184 -8
  31. data/config/locales/lv.yml +188 -12
  32. data/config/locales/ml.yml +189 -13
  33. data/config/locales/mr.yml +184 -8
  34. data/config/locales/ms.yml +184 -8
  35. data/config/locales/nb.yml +183 -17
  36. data/config/locales/nl.yml +184 -13
  37. data/config/locales/pa.yml +189 -13
  38. data/config/locales/pl.yml +184 -13
  39. data/config/locales/pt.yml +184 -13
  40. data/config/locales/ro.yml +183 -12
  41. data/config/locales/ru.yml +8 -0
  42. data/config/locales/sk.yml +184 -8
  43. data/config/locales/sl.yml +185 -9
  44. data/config/locales/sr.yml +186 -15
  45. data/config/locales/sv.yml +182 -13
  46. data/config/locales/sw.yml +184 -8
  47. data/config/locales/ta.yml +184 -8
  48. data/config/locales/te.yml +185 -9
  49. data/config/locales/th.yml +183 -12
  50. data/config/locales/tr.yml +183 -12
  51. data/config/locales/uk.yml +189 -18
  52. data/config/locales/ur.yml +187 -11
  53. data/config/locales/vi.yml +183 -12
  54. data/config/locales/zh.yml +191 -9
  55. data/exe/num2words-console +7 -0
  56. data/lib/num2words/console.rb +16 -0
  57. data/lib/num2words/converter.rb +195 -47
  58. data/lib/num2words/locales/ar.rb +130 -0
  59. data/lib/num2words/locales/be.rb +101 -0
  60. data/lib/num2words/locales/bg.rb +127 -0
  61. data/lib/num2words/locales/bn.rb +112 -0
  62. data/lib/num2words/locales/cs.rb +106 -0
  63. data/lib/num2words/locales/da.rb +97 -0
  64. data/lib/num2words/locales/de.rb +119 -0
  65. data/lib/num2words/locales/el.rb +143 -0
  66. data/lib/num2words/locales/en.rb +90 -0
  67. data/lib/num2words/locales/es.rb +185 -0
  68. data/lib/num2words/locales/et.rb +104 -0
  69. data/lib/num2words/locales/fa.rb +104 -0
  70. data/lib/num2words/locales/fi.rb +104 -0
  71. data/lib/num2words/locales/fr.rb +121 -0
  72. data/lib/num2words/locales/gu.rb +112 -0
  73. data/lib/num2words/locales/he.rb +130 -0
  74. data/lib/num2words/locales/hi.rb +112 -0
  75. data/lib/num2words/locales/hr.rb +117 -0
  76. data/lib/num2words/locales/hu.rb +111 -0
  77. data/lib/num2words/locales/id.rb +104 -0
  78. data/lib/num2words/locales/it.rb +142 -0
  79. data/lib/num2words/locales/ja.rb +126 -0
  80. data/lib/num2words/locales/kn.rb +122 -2
  81. data/lib/num2words/locales/ko.rb +158 -2
  82. data/lib/num2words/locales/kz.rb +137 -2
  83. data/lib/num2words/locales/lt.rb +146 -2
  84. data/lib/num2words/locales/lv.rb +148 -2
  85. data/lib/num2words/locales/ml.rb +142 -2
  86. data/lib/num2words/locales/mr.rb +142 -2
  87. data/lib/num2words/locales/ms.rb +134 -2
  88. data/lib/num2words/locales/nb.rb +153 -0
  89. data/lib/num2words/locales/nl.rb +142 -2
  90. data/lib/num2words/locales/pa.rb +122 -2
  91. data/lib/num2words/locales/pl.rb +149 -2
  92. data/lib/num2words/locales/pt.rb +164 -2
  93. data/lib/num2words/locales/ro.rb +165 -2
  94. data/lib/num2words/locales/ru.rb +100 -0
  95. data/lib/num2words/locales/sk.rb +124 -2
  96. data/lib/num2words/locales/sl.rb +154 -2
  97. data/lib/num2words/locales/sr.rb +141 -3
  98. data/lib/num2words/locales/sv.rb +141 -2
  99. data/lib/num2words/locales/sw.rb +133 -2
  100. data/lib/num2words/locales/ta.rb +142 -2
  101. data/lib/num2words/locales/te.rb +142 -2
  102. data/lib/num2words/locales/th.rb +133 -2
  103. data/lib/num2words/locales/tr.rb +141 -2
  104. data/lib/num2words/locales/uk.rb +134 -2
  105. data/lib/num2words/locales/ur.rb +130 -2
  106. data/lib/num2words/locales/vi.rb +142 -2
  107. data/lib/num2words/locales/zh.rb +172 -2
  108. data/lib/num2words/version.rb +1 -1
  109. data/num2words.gemspec +3 -3
  110. metadata +13 -10
  111. data/lib/num2words/locales/no.rb +0 -19
@@ -10,8 +10,148 @@ module Num2words
10
10
  HUNDREDS = I18n.t("num2words.hundreds", locale: :ta)
11
11
  SCALES = I18n.t("num2words.scales", locale: :ta)
12
12
 
13
- MAJOR_UNIT = I18n.t("num2words.currencies.INR.name", locale: :ta)
14
- MINOR_UNIT = I18n.t("num2words.currencies.INR.fractional.name", locale: :ta)
13
+ FRACTIONS = I18n.t("num2words.fractions", locale: :ta)
14
+ GRAMMAR = I18n.t("num2words.grammar", locale: :ta)
15
+
16
+ DATE = I18n.t("num2words.date", locale: :ta)
17
+ DATE_TEMPLATE = I18n.t("num2words.date.template", locale: :ta)
18
+ TIME = I18n.t("num2words.time", locale: :ta)
19
+ TIME_TEMPLATE = I18n.t("num2words.time.template", locale: :ta)
20
+ DATETIME_TEMPLATE = I18n.t("num2words.datetime.template", locale: :ta)
21
+
22
+ ORDINALS = I18n.t("num2words.numbers.ordinals", locale: :ta)
23
+
24
+ UNDER_HUNDRED = [
25
+ "பூஜ்ஜியம்", "ஒன்று", "இரண்டு", "மூன்று", "நான்கு", "ஐந்து", "ஆறு", "ஏழு", "எட்டு", "ஒன்பது",
26
+ "பத்து", "பதினொன்று", "பன்னிரண்டு", "பதிமூன்று", "பதிநான்கு", "பதினைந்து", "பதினாறு", "பதினேழு", "பதினெட்டு", "பத்தொன்பது",
27
+ "இருபது", "இருபத்தொன்று", "இருபத்திரண்டு", "இருபத்துமூன்று", "இருபத்துநான்கு", "இருபத்தைந்து", "இருபத்தாறு", "இருபத்தேழு", "இருபத்தெட்டு", "இருபத்தொன்பது",
28
+ "முப்பது", "முப்பத்தொன்று", "முப்பத்திரண்டு", "முப்பத்துமூன்று", "முப்பத்துநான்கு", "முப்பத்தைந்து", "முப்பத்தாறு", "முப்பத்தேழு", "முப்பத்தெட்டு", "முப்பத்தொன்பது",
29
+ "நாற்பது", "நாற்பத்தொன்று", "நாற்பத்திரண்டு", "நாற்பத்துமூன்று", "நாற்பத்துநான்கு", "நாற்பத்தைந்து", "நாற்பத்தாறு", "நாற்பத்தேழு", "நாற்பத்தெட்டு", "நாற்பத்தொன்பது",
30
+ "ஐம்பது", "ஐம்பத்தொன்று", "ஐம்பத்திரண்டு", "ஐம்பத்துமூன்று", "ஐம்பத்துநான்கு", "ஐம்பத்தைந்து", "ஐம்பத்தாறு", "ஐம்பத்தேழு", "ஐம்பத்தெட்டு", "ஐம்பத்தொன்பது",
31
+ "அறுபது", "அறுபத்தொன்று", "அறுபத்திரண்டு", "அறுபத்துமூன்று", "அறுபத்துநான்கு", "அறுபத்தைந்து", "அறுபத்தாறு", "அறுபத்தேழு", "அறுபத்தெட்டு", "அறுபத்தொன்பது",
32
+ "எழுபது", "எழுபத்தொன்று", "எழுபத்திரண்டு", "எழுபத்துமூன்று", "எழுபத்துநான்கு", "எழுபத்தைந்து", "எழுபத்தாறு", "எழுபத்தேழு", "எழுபத்தெட்டு", "எழுபத்தொன்பது",
33
+ "எண்பது", "எண்பத்தொன்று", "எண்பத்திரண்டு", "எண்பத்துமூன்று", "எண்பத்துநான்கு", "எண்பத்தைந்து", "எண்பத்தாறு", "எண்பத்தேழு", "எண்பத்தெட்டு", "எண்பத்தொன்பது",
34
+ "தொண்ணூறு", "தொண்ணூற்றொன்று", "தொண்ணூற்றிரண்டு", "தொண்ணூற்றுமூன்று", "தொண்ணூற்றுநான்கு", "தொண்ணூற்றைந்து", "தொண்ணூற்றாறு", "தொண்ணூற்றேழு", "தொண்ணூற்றெட்டு", "தொண்ணூற்றொன்பது"
35
+ ].freeze
36
+
37
+ INDIAN_SCALES = [
38
+ [1_000_000_000, "நூறு கோடி"],
39
+ [10_000_000, "கோடி"],
40
+ [100_000, "லட்சம்"],
41
+ [1_000, "ஆயிரம்"]
42
+ ].freeze
43
+
44
+ module_function
45
+
46
+ def integer_to_words(number, feminine: false)
47
+ cardinal(number)
48
+ end
49
+
50
+ def triple_to_words(number, scale_idx, feminine: false)
51
+ return [] if number.zero?
52
+
53
+ words = [under_thousand(number)]
54
+ words << SCALES[scale_idx][0] unless scale_idx.zero?
55
+ words
56
+ end
57
+
58
+ def minus_word
59
+ GRAMMAR[:minus]
60
+ end
61
+
62
+ def fraction_joiner(joiner)
63
+ joiner.to_sym == :and ? "மற்றும்" : GRAMMAR[:conjunction]
64
+ end
65
+
66
+ def default_fraction_word
67
+ GRAMMAR[:default_fraction]
68
+ end
69
+
70
+ def fraction_numerator_feminine?
71
+ false
72
+ end
73
+
74
+ def decimal_separator_word
75
+ "தசமம்"
76
+ end
77
+
78
+ def decimal_fraction_words(fraction_string)
79
+ fraction_string.chars.map { |digit| cardinal(digit.to_i) }.join(" ")
80
+ end
81
+
82
+ def date_day(day, format:, date_case:)
83
+ ordinal(day, :default)
84
+ end
85
+
86
+ def date_year(year, format:)
87
+ cardinal(year)
88
+ end
89
+
90
+ def time_unit_feminine?(_unit)
91
+ false
92
+ end
93
+
94
+ def time_number_words(number, unit:)
95
+ cardinal(number)
96
+ end
97
+
98
+ def currency_major_feminine?(_currency)
99
+ false
100
+ end
101
+
102
+ def currency_minor_feminine?(_currency)
103
+ false
104
+ end
105
+
106
+ def currency_number_words(number, _currency, unit:)
107
+ cardinal(number)
108
+ end
109
+
110
+ def ordinal(value, format, gender: :masculine)
111
+ ordinals = ORDINALS[format] || ORDINALS[:default] || ORDINALS[:nominative]
112
+ gender_data = ordinals[gender] || ordinals[:masculine]
113
+
114
+ return gender_data[value - 1] if value.between?(1, gender_data.length)
115
+
116
+ cardinal(value)
117
+ end
118
+
119
+ def cardinal(number)
120
+ integer_value = Integer(number)
121
+ negative = integer_value.negative?
122
+ integer_value = integer_value.abs
123
+
124
+ return UNDER_HUNDRED[0] if integer_value.zero?
125
+
126
+ remainder = integer_value
127
+ words = []
128
+
129
+ INDIAN_SCALES.each do |value, label|
130
+ next if remainder < value
131
+
132
+ group_value = remainder / value
133
+ remainder %= value
134
+ words << [cardinal(group_value), label].join(" ")
135
+ end
136
+
137
+ words << under_thousand(remainder) if remainder.positive?
138
+ words.unshift(minus_word) if negative
139
+ words.join(" ")
140
+ end
141
+
142
+ def under_thousand(number)
143
+ return UNDER_HUNDRED[number] if number < 100
144
+
145
+ hundreds = number / 100
146
+ rest = number % 100
147
+ words = [HUNDREDS[hundreds]]
148
+ words << UNDER_HUNDRED[rest] if rest.positive?
149
+ words.join(" ")
150
+ end
151
+
152
+ def pluralize(_number, singular, _few, _plural)
153
+ singular
154
+ end
15
155
  end
16
156
 
17
157
  register :ta, TA
@@ -10,8 +10,148 @@ module Num2words
10
10
  HUNDREDS = I18n.t("num2words.hundreds", locale: :te)
11
11
  SCALES = I18n.t("num2words.scales", locale: :te)
12
12
 
13
- MAJOR_UNIT = I18n.t("num2words.currencies.INR.name", locale: :te)
14
- MINOR_UNIT = I18n.t("num2words.currencies.INR.fractional.name", locale: :te)
13
+ FRACTIONS = I18n.t("num2words.fractions", locale: :te)
14
+ GRAMMAR = I18n.t("num2words.grammar", locale: :te)
15
+
16
+ DATE = I18n.t("num2words.date", locale: :te)
17
+ DATE_TEMPLATE = I18n.t("num2words.date.template", locale: :te)
18
+ TIME = I18n.t("num2words.time", locale: :te)
19
+ TIME_TEMPLATE = I18n.t("num2words.time.template", locale: :te)
20
+ DATETIME_TEMPLATE = I18n.t("num2words.datetime.template", locale: :te)
21
+
22
+ ORDINALS = I18n.t("num2words.numbers.ordinals", locale: :te)
23
+
24
+ UNDER_HUNDRED = [
25
+ "సున్నా", "ఒకటి", "రెండు", "మూడు", "నాలుగు", "ఐదు", "ఆరు", "ఏడు", "ఎనిమిది", "తొమ్మిది",
26
+ "పది", "పదకొండు", "పన్నెండు", "పదమూడు", "పద్నాలుగు", "పదిహేను", "పదహారు", "పదిహేడు", "పద్దెనిమిది", "పంతొమ్మిది",
27
+ "ఇరవై", "ఇరవై ఒకటి", "ఇరవై రెండు", "ఇరవై మూడు", "ఇరవై నాలుగు", "ఇరవై ఐదు", "ఇరవై ఆరు", "ఇరవై ఏడు", "ఇరవై ఎనిమిది", "ఇరవై తొమ్మిది",
28
+ "ముప్పై", "ముప్పై ఒకటి", "ముప్పై రెండు", "ముప్పై మూడు", "ముప్పై నాలుగు", "ముప్పై ఐదు", "ముప్పై ఆరు", "ముప్పై ఏడు", "ముప్పై ఎనిమిది", "ముప్పై తొమ్మిది",
29
+ "నలభై", "నలభై ఒకటి", "నలభై రెండు", "నలభై మూడు", "నలభై నాలుగు", "నలభై ఐదు", "నలభై ఆరు", "నలభై ఏడు", "నలభై ఎనిమిది", "నలభై తొమ్మిది",
30
+ "యాభై", "యాభై ఒకటి", "యాభై రెండు", "యాభై మూడు", "యాభై నాలుగు", "యాభై ఐదు", "యాభై ఆరు", "యాభై ఏడు", "యాభై ఎనిమిది", "యాభై తొమ్మిది",
31
+ "అరవై", "అరవై ఒకటి", "అరవై రెండు", "అరవై మూడు", "అరవై నాలుగు", "అరవై ఐదు", "అరవై ఆరు", "అరవై ఏడు", "అరవై ఎనిమిది", "అరవై తొమ్మిది",
32
+ "డెబ్బై", "డెబ్బై ఒకటి", "డెబ్బై రెండు", "డెబ్బై మూడు", "డెబ్బై నాలుగు", "డెబ్బై ఐదు", "డెబ్బై ఆరు", "డెబ్బై ఏడు", "డెబ్బై ఎనిమిది", "డెబ్బై తొమ్మిది",
33
+ "ఎనభై", "ఎనభై ఒకటి", "ఎనభై రెండు", "ఎనభై మూడు", "ఎనభై నాలుగు", "ఎనభై ఐదు", "ఎనభై ఆరు", "ఎనభై ఏడు", "ఎనభై ఎనిమిది", "ఎనభై తొమ్మిది",
34
+ "తొంభై", "తొంభై ఒకటి", "తొంభై రెండు", "తొంభై మూడు", "తొంభై నాలుగు", "తొంభై ఐదు", "తొంభై ఆరు", "తొంభై ఏడు", "తొంభై ఎనిమిది", "తొంభై తొమ్మిది"
35
+ ].freeze
36
+
37
+ INDIAN_SCALES = [
38
+ [1_000_000_000, "వంద కోట్లు"],
39
+ [10_000_000, "కోటి"],
40
+ [100_000, "లక్ష"],
41
+ [1_000, "వెయ్యి"]
42
+ ].freeze
43
+
44
+ module_function
45
+
46
+ def integer_to_words(number, feminine: false)
47
+ cardinal(number)
48
+ end
49
+
50
+ def triple_to_words(number, scale_idx, feminine: false)
51
+ return [] if number.zero?
52
+
53
+ words = [under_thousand(number)]
54
+ words << SCALES[scale_idx][0] unless scale_idx.zero?
55
+ words
56
+ end
57
+
58
+ def minus_word
59
+ GRAMMAR[:minus]
60
+ end
61
+
62
+ def fraction_joiner(joiner)
63
+ joiner.to_sym == :and ? "మరియు" : GRAMMAR[:conjunction]
64
+ end
65
+
66
+ def default_fraction_word
67
+ GRAMMAR[:default_fraction]
68
+ end
69
+
70
+ def fraction_numerator_feminine?
71
+ false
72
+ end
73
+
74
+ def decimal_separator_word
75
+ "దశాంశం"
76
+ end
77
+
78
+ def decimal_fraction_words(fraction_string)
79
+ fraction_string.chars.map { |digit| cardinal(digit.to_i) }.join(" ")
80
+ end
81
+
82
+ def date_day(day, format:, date_case:)
83
+ ordinal(day, :default)
84
+ end
85
+
86
+ def date_year(year, format:)
87
+ cardinal(year)
88
+ end
89
+
90
+ def time_unit_feminine?(_unit)
91
+ false
92
+ end
93
+
94
+ def time_number_words(number, unit:)
95
+ cardinal(number)
96
+ end
97
+
98
+ def currency_major_feminine?(_currency)
99
+ false
100
+ end
101
+
102
+ def currency_minor_feminine?(_currency)
103
+ false
104
+ end
105
+
106
+ def currency_number_words(number, _currency, unit:)
107
+ cardinal(number)
108
+ end
109
+
110
+ def ordinal(value, format, gender: :masculine)
111
+ ordinals = ORDINALS[format] || ORDINALS[:default] || ORDINALS[:nominative]
112
+ gender_data = ordinals[gender] || ordinals[:masculine]
113
+
114
+ return gender_data[value - 1] if value.between?(1, gender_data.length)
115
+
116
+ cardinal(value)
117
+ end
118
+
119
+ def cardinal(number)
120
+ integer_value = Integer(number)
121
+ negative = integer_value.negative?
122
+ integer_value = integer_value.abs
123
+
124
+ return UNDER_HUNDRED[0] if integer_value.zero?
125
+
126
+ remainder = integer_value
127
+ words = []
128
+
129
+ INDIAN_SCALES.each do |value, label|
130
+ next if remainder < value
131
+
132
+ group_value = remainder / value
133
+ remainder %= value
134
+ words << [cardinal(group_value), label].join(" ")
135
+ end
136
+
137
+ words << under_thousand(remainder) if remainder.positive?
138
+ words.unshift(minus_word) if negative
139
+ words.join(" ")
140
+ end
141
+
142
+ def under_thousand(number)
143
+ return UNDER_HUNDRED[number] if number < 100
144
+
145
+ hundreds = number / 100
146
+ rest = number % 100
147
+ words = [HUNDREDS[hundreds]]
148
+ words << UNDER_HUNDRED[rest] if rest.positive?
149
+ words.join(" ")
150
+ end
151
+
152
+ def pluralize(number, singular, _few, plural)
153
+ number.abs == 1 ? singular : plural
154
+ end
15
155
  end
16
156
 
17
157
  register :te, TE
@@ -10,8 +10,139 @@ module Num2words
10
10
  HUNDREDS = I18n.t("num2words.hundreds", locale: :th)
11
11
  SCALES = I18n.t("num2words.scales", locale: :th)
12
12
 
13
- MAJOR_UNIT = I18n.t("num2words.currencies.THB.name", locale: :th)
14
- MINOR_UNIT = I18n.t("num2words.currencies.THB.fractional.name", locale: :th)
13
+ FRACTIONS = I18n.t("num2words.fractions", locale: :th)
14
+ GRAMMAR = I18n.t("num2words.grammar", locale: :th)
15
+
16
+ DATE = I18n.t("num2words.date", locale: :th)
17
+ DATE_TEMPLATE = I18n.t("num2words.date.template", locale: :th)
18
+ TIME = I18n.t("num2words.time", locale: :th)
19
+ TIME_TEMPLATE = I18n.t("num2words.time.template", locale: :th)
20
+ DATETIME_TEMPLATE = I18n.t("num2words.datetime.template", locale: :th)
21
+
22
+ ORDINALS = I18n.t("num2words.numbers.ordinals", locale: :th)
23
+
24
+ module_function
25
+
26
+ def integer_to_words(number, feminine: false)
27
+ cardinal(number)
28
+ end
29
+
30
+ def triple_to_words(number, scale_idx, feminine: false)
31
+ return [] if number.zero?
32
+
33
+ words = [under_thousand(number)]
34
+ words << SCALES[scale_idx][0] unless scale_idx.zero?
35
+ words
36
+ end
37
+
38
+ def minus_word
39
+ GRAMMAR[:minus]
40
+ end
41
+
42
+ def fraction_joiner(joiner)
43
+ joiner.to_sym == :and ? "และ" : GRAMMAR[:conjunction]
44
+ end
45
+
46
+ def default_fraction_word
47
+ GRAMMAR[:default_fraction]
48
+ end
49
+
50
+ def fraction_numerator_feminine?
51
+ false
52
+ end
53
+
54
+ def decimal_separator_word
55
+ GRAMMAR[:conjunction]
56
+ end
57
+
58
+ def decimal_fraction_words(fraction_string)
59
+ fraction_string.chars.map { |digit| cardinal(digit.to_i) }.join(" ")
60
+ end
61
+
62
+ def date_day(day, format:, date_case:)
63
+ ordinal(day, :nominative)
64
+ end
65
+
66
+ def date_year(year, format:)
67
+ cardinal(year)
68
+ end
69
+
70
+ def time_unit_feminine?(_unit)
71
+ false
72
+ end
73
+
74
+ def time_number_words(number, unit:)
75
+ cardinal(number)
76
+ end
77
+
78
+ def currency_major_feminine?(_currency)
79
+ false
80
+ end
81
+
82
+ def currency_minor_feminine?(_currency)
83
+ false
84
+ end
85
+
86
+ def currency_number_words(number, _currency, unit:)
87
+ cardinal(number)
88
+ end
89
+
90
+ def ordinal(value, format, gender: :masculine)
91
+ ordinals = ORDINALS[format] || ORDINALS[:default] || ORDINALS[:nominative]
92
+ gender_data = ordinals[gender] || ordinals[:masculine]
93
+
94
+ return gender_data[value - 1] if value.between?(1, gender_data.length)
95
+
96
+ "ที่#{cardinal(value)}"
97
+ end
98
+
99
+ def cardinal(number)
100
+ integer_value = Integer(number)
101
+ negative = integer_value.negative?
102
+ integer_value = integer_value.abs
103
+
104
+ return ONES_MASC[0] if integer_value.zero?
105
+
106
+ groups = integer_value.to_s
107
+ .chars.reverse.each_slice(3).map(&:reverse)
108
+ .map(&:join).map!(&:to_i).reverse
109
+
110
+ words = []
111
+ groups.each_with_index do |group_value, index|
112
+ next if group_value.zero?
113
+
114
+ scale_idx = groups.size - index - 1
115
+ words.concat triple_to_words(group_value, scale_idx)
116
+ end
117
+
118
+ words.unshift(minus_word) if negative
119
+ words.join(" ")
120
+ end
121
+
122
+ def under_thousand(number)
123
+ return under_hundred(number) if number < 100
124
+
125
+ hundreds = number / 100
126
+ rest = number % 100
127
+ words = [HUNDREDS[hundreds]]
128
+ words << under_hundred(rest) if rest.positive?
129
+ words.join
130
+ end
131
+
132
+ def under_hundred(number)
133
+ return ONES_MASC[number] if number < 10
134
+ return TEENS[number - 10] if number < 20
135
+
136
+ tens = number / 10
137
+ ones = number % 10
138
+ words = [TENS[tens]]
139
+ words << (ones == 1 ? "เอ็ด" : ONES_MASC[ones]) if ones.positive?
140
+ words.join
141
+ end
142
+
143
+ def pluralize(_number, singular, _few, _plural)
144
+ singular
145
+ end
15
146
  end
16
147
 
17
148
  register :th, TH
@@ -10,8 +10,147 @@ module Num2words
10
10
  HUNDREDS = I18n.t("num2words.hundreds", locale: :tr)
11
11
  SCALES = I18n.t("num2words.scales", locale: :tr)
12
12
 
13
- MAJOR_UNIT = I18n.t("num2words.currencies.TRY.name", locale: :tr)
14
- MINOR_UNIT = I18n.t("num2words.currencies.TRY.fractional.name", locale: :tr)
13
+ FRACTIONS = I18n.t("num2words.fractions", locale: :tr)
14
+ GRAMMAR = I18n.t("num2words.grammar", locale: :tr)
15
+
16
+ DATE = I18n.t("num2words.date", locale: :tr)
17
+ DATE_TEMPLATE = I18n.t("num2words.date.template", locale: :tr)
18
+ TIME = I18n.t("num2words.time", locale: :tr)
19
+ TIME_TEMPLATE = I18n.t("num2words.time.template", locale: :tr)
20
+ DATETIME_TEMPLATE = I18n.t("num2words.datetime.template", locale: :tr)
21
+
22
+ ORDINALS = I18n.t("num2words.numbers.ordinals", locale: :tr)
23
+
24
+ module_function
25
+
26
+ def integer_to_words(number, feminine: false)
27
+ cardinal(number)
28
+ end
29
+
30
+ def triple_to_words(number, scale_idx, feminine: false)
31
+ return [] if number.zero?
32
+
33
+ words = []
34
+ number_words = scale_number_words(number, scale_idx)
35
+ words << number_words unless number_words.empty?
36
+ words << SCALES[scale_idx][0] unless scale_idx.zero?
37
+ words
38
+ end
39
+
40
+ def minus_word
41
+ GRAMMAR[:minus]
42
+ end
43
+
44
+ def fraction_joiner(joiner)
45
+ joiner.to_sym == :and ? "ve" : GRAMMAR[:conjunction]
46
+ end
47
+
48
+ def default_fraction_word
49
+ GRAMMAR[:default_fraction]
50
+ end
51
+
52
+ def fraction_numerator_feminine?
53
+ false
54
+ end
55
+
56
+ def decimal_separator_word
57
+ "virgül"
58
+ end
59
+
60
+ def decimal_fraction_words(fraction_string)
61
+ fraction_string.chars.map { |digit| cardinal(digit.to_i) }.join(" ")
62
+ end
63
+
64
+ def date_day(day, format:, date_case:)
65
+ ordinal(day, :nominative)
66
+ end
67
+
68
+ def date_year(year, format:)
69
+ cardinal(year)
70
+ end
71
+
72
+ def time_unit_feminine?(_unit)
73
+ false
74
+ end
75
+
76
+ def time_number_words(number, unit:)
77
+ cardinal(number)
78
+ end
79
+
80
+ def currency_major_feminine?(_currency)
81
+ false
82
+ end
83
+
84
+ def currency_minor_feminine?(_currency)
85
+ false
86
+ end
87
+
88
+ def currency_number_words(number, _currency, unit:)
89
+ cardinal(number)
90
+ end
91
+
92
+ def ordinal(value, format, gender: :masculine)
93
+ ordinals = ORDINALS[format] || ORDINALS[:default] || ORDINALS[:nominative]
94
+ gender_data = ordinals[gender] || ordinals[:masculine]
95
+
96
+ return gender_data[value - 1] if value.between?(1, gender_data.length)
97
+
98
+ cardinal(value)
99
+ end
100
+
101
+ def cardinal(number)
102
+ integer_value = Integer(number)
103
+ negative = integer_value.negative?
104
+ integer_value = integer_value.abs
105
+
106
+ return ONES_MASC[0] if integer_value.zero?
107
+
108
+ groups = integer_value.to_s
109
+ .chars.reverse.each_slice(3).map(&:reverse)
110
+ .map(&:join).map!(&:to_i).reverse
111
+
112
+ words = []
113
+ groups.each_with_index do |group_value, index|
114
+ next if group_value.zero?
115
+
116
+ scale_idx = groups.size - index - 1
117
+ words.concat triple_to_words(group_value, scale_idx)
118
+ end
119
+
120
+ words.unshift(minus_word) if negative
121
+ words.join(" ")
122
+ end
123
+
124
+ def scale_number_words(number, scale_idx)
125
+ return "" if scale_idx == 1 && number == 1
126
+
127
+ under_thousand(number)
128
+ end
129
+
130
+ def under_thousand(number)
131
+ return under_hundred(number) if number < 100
132
+
133
+ hundreds = number / 100
134
+ rest = number % 100
135
+ words = [HUNDREDS[hundreds]]
136
+ words << under_hundred(rest) if rest.positive?
137
+ words.join(" ")
138
+ end
139
+
140
+ def under_hundred(number)
141
+ return ONES_MASC[number] if number < 10
142
+ return TEENS[number - 10] if number < 20
143
+
144
+ tens = number / 10
145
+ ones = number % 10
146
+ words = [TENS[tens]]
147
+ words << ONES_MASC[ones] if ones.positive?
148
+ words.join(" ")
149
+ end
150
+
151
+ def pluralize(_number, singular, _few, _plural)
152
+ singular
153
+ end
15
154
  end
16
155
 
17
156
  register :tr, TR