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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +65 -0
- data/README.md +145 -135
- data/bin/console +2 -14
- data/config/locales/ar.yml +5 -1
- data/config/locales/be.yml +4 -0
- data/config/locales/bg.yml +4 -0
- data/config/locales/bn.yml +4 -0
- data/config/locales/cs.yml +6 -2
- data/config/locales/da.yml +4 -0
- data/config/locales/de.yml +8 -4
- data/config/locales/el.yml +4 -0
- data/config/locales/en.yml +4 -0
- data/config/locales/es.yml +4 -0
- data/config/locales/et.yml +9 -5
- data/config/locales/fa.yml +15 -11
- data/config/locales/fi.yml +8 -4
- data/config/locales/fr.yml +4 -0
- data/config/locales/gu.yml +4 -0
- data/config/locales/he.yml +6 -2
- data/config/locales/hi.yml +4 -0
- data/config/locales/hr.yml +8 -4
- data/config/locales/hu.yml +6 -2
- data/config/locales/id.yml +4 -0
- data/config/locales/it.yml +4 -0
- data/config/locales/ja.yml +10 -5
- data/config/locales/kn.yml +186 -10
- data/config/locales/ko.yml +184 -13
- data/config/locales/kz.yml +183 -17
- data/config/locales/lt.yml +184 -8
- data/config/locales/lv.yml +188 -12
- data/config/locales/ml.yml +189 -13
- data/config/locales/mr.yml +184 -8
- data/config/locales/ms.yml +184 -8
- data/config/locales/nb.yml +183 -17
- data/config/locales/nl.yml +184 -13
- data/config/locales/pa.yml +189 -13
- data/config/locales/pl.yml +184 -13
- data/config/locales/pt.yml +184 -13
- data/config/locales/ro.yml +183 -12
- data/config/locales/ru.yml +8 -0
- data/config/locales/sk.yml +184 -8
- data/config/locales/sl.yml +185 -9
- data/config/locales/sr.yml +186 -15
- data/config/locales/sv.yml +182 -13
- data/config/locales/sw.yml +184 -8
- data/config/locales/ta.yml +184 -8
- data/config/locales/te.yml +185 -9
- data/config/locales/th.yml +183 -12
- data/config/locales/tr.yml +183 -12
- data/config/locales/uk.yml +189 -18
- data/config/locales/ur.yml +187 -11
- data/config/locales/vi.yml +183 -12
- data/config/locales/zh.yml +191 -9
- data/exe/num2words-console +7 -0
- data/lib/num2words/console.rb +16 -0
- data/lib/num2words/converter.rb +195 -47
- data/lib/num2words/locales/ar.rb +130 -0
- data/lib/num2words/locales/be.rb +101 -0
- data/lib/num2words/locales/bg.rb +127 -0
- data/lib/num2words/locales/bn.rb +112 -0
- data/lib/num2words/locales/cs.rb +106 -0
- data/lib/num2words/locales/da.rb +97 -0
- data/lib/num2words/locales/de.rb +119 -0
- data/lib/num2words/locales/el.rb +143 -0
- data/lib/num2words/locales/en.rb +90 -0
- data/lib/num2words/locales/es.rb +185 -0
- data/lib/num2words/locales/et.rb +104 -0
- data/lib/num2words/locales/fa.rb +104 -0
- data/lib/num2words/locales/fi.rb +104 -0
- data/lib/num2words/locales/fr.rb +121 -0
- data/lib/num2words/locales/gu.rb +112 -0
- data/lib/num2words/locales/he.rb +130 -0
- data/lib/num2words/locales/hi.rb +112 -0
- data/lib/num2words/locales/hr.rb +117 -0
- data/lib/num2words/locales/hu.rb +111 -0
- data/lib/num2words/locales/id.rb +104 -0
- data/lib/num2words/locales/it.rb +142 -0
- data/lib/num2words/locales/ja.rb +126 -0
- data/lib/num2words/locales/kn.rb +122 -2
- data/lib/num2words/locales/ko.rb +158 -2
- data/lib/num2words/locales/kz.rb +137 -2
- data/lib/num2words/locales/lt.rb +146 -2
- data/lib/num2words/locales/lv.rb +148 -2
- data/lib/num2words/locales/ml.rb +142 -2
- data/lib/num2words/locales/mr.rb +142 -2
- data/lib/num2words/locales/ms.rb +134 -2
- data/lib/num2words/locales/nb.rb +153 -0
- data/lib/num2words/locales/nl.rb +142 -2
- data/lib/num2words/locales/pa.rb +122 -2
- data/lib/num2words/locales/pl.rb +149 -2
- data/lib/num2words/locales/pt.rb +164 -2
- data/lib/num2words/locales/ro.rb +165 -2
- data/lib/num2words/locales/ru.rb +100 -0
- data/lib/num2words/locales/sk.rb +124 -2
- data/lib/num2words/locales/sl.rb +154 -2
- data/lib/num2words/locales/sr.rb +141 -3
- data/lib/num2words/locales/sv.rb +141 -2
- data/lib/num2words/locales/sw.rb +133 -2
- data/lib/num2words/locales/ta.rb +142 -2
- data/lib/num2words/locales/te.rb +142 -2
- data/lib/num2words/locales/th.rb +133 -2
- data/lib/num2words/locales/tr.rb +141 -2
- data/lib/num2words/locales/uk.rb +134 -2
- data/lib/num2words/locales/ur.rb +130 -2
- data/lib/num2words/locales/vi.rb +142 -2
- data/lib/num2words/locales/zh.rb +172 -2
- data/lib/num2words/version.rb +1 -1
- data/num2words.gemspec +3 -3
- metadata +13 -10
- data/lib/num2words/locales/no.rb +0 -19
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 82267cd5645c3767f5b34c5c7c54d6f997ee26f19425b86937ee021f747f19f4
|
|
4
|
+
data.tar.gz: 33da5152ce64b117d4d9e59f2f33a63331b037cea6562f3c6fafc77d6b9f9f71
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9808bb66c09d3acecb944d1c1b37a3af17e46f758f6f500d5f618eecca798b3bf1e5b8bff415e23f9eb0d47804b672c1b509de2d89e77861dbc2fec2e88a8775
|
|
7
|
+
data.tar.gz: fac35c5117774db5619fc82d4153f8ce0495dcb13e27fdba3b4726e211f6a155788f4b1a035987f4a083ec7035ea0b6429bb8d3549d03c8c64906d1325731f81
|
data/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,71 @@
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## [0.3.0] - 2026-06-27
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- Полная актуализация всех локалей до единого набора возможностей: числа, дроби, даты, время, дата-время и валюты.
|
|
18
|
+
- Единый каталог из 32 валют для каждой локали:
|
|
19
|
+
`BDT`, `BGN`, `BRL`, `BYN`, `CNY`, `CZK`, `DKK`, `EUR`, `GBP`, `HUF`, `IDR`, `ILS`, `INR`, `IRR`, `JPY`, `KES`, `KRW`, `KZT`, `MYR`, `NOK`, `PKR`, `PLN`, `RON`, `RSD`, `RUB`, `SAR`, `SEK`, `THB`, `TRY`, `UAH`, `USD`, `VND`.
|
|
20
|
+
- Отдельные specs для локалей с проверками чисел, дробей, валют, дат и времени.
|
|
21
|
+
- Проверка `currency_catalog_spec.rb`, которая гарантирует одинаковый и уникальный набор валют во всех актуализированных локалях.
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- Языковые правила и грамматические особенности перенесены в модули `Num2words::Locales::XX`.
|
|
25
|
+
- `Converter` оставлен для общего поведения и делегирует языковые различия локалям через locale hooks.
|
|
26
|
+
- README актуализирован под текущий набор возможностей и локалей.
|
|
27
|
+
- Описание gemspec обновлено: поддержка больше не ограничивается первичной русской локалью.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
- Устранены legacy-локали без `GRAMMAR`.
|
|
31
|
+
- Все локали теперь проходят smoke coverage без pending.
|
|
32
|
+
- Исправлены и унифицированы данные валют, дат, времени и дробей в локалях.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## [0.2.0] - 2026-05-31
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
- Поддержка строковых дробей с точкой и запятой:
|
|
40
|
+
```ruby
|
|
41
|
+
Num2words.to_words("3.5", :ru)
|
|
42
|
+
Num2words.to_words("3,5", :ru)
|
|
43
|
+
```
|
|
44
|
+
- Опция `joiner: :and` для разговорного соединителя в дробях:
|
|
45
|
+
```ruby
|
|
46
|
+
Num2words.to_words(0.5, :ru, joiner: :and)
|
|
47
|
+
# => "ноль и пять десятых"
|
|
48
|
+
```
|
|
49
|
+
- Опция `date_case: :genitive` для дат в контексте "когда?":
|
|
50
|
+
```ruby
|
|
51
|
+
Num2words.to_words("2024-08-21", :ru, date_case: :genitive)
|
|
52
|
+
# => "двадцать первого августа две тысячи двадцать четвёртого года"
|
|
53
|
+
```
|
|
54
|
+
- Опция `minor:` для управления выводом младшей денежной единицы:
|
|
55
|
+
- `:always` — всегда выводить копейки/центы;
|
|
56
|
+
- `:nonzero` — выводить только ненулевую младшую единицу;
|
|
57
|
+
- `:never` — не выводить младшую единицу.
|
|
58
|
+
- Поддержка строковых сумм и `BigDecimal` в `to_currency`:
|
|
59
|
+
```ruby
|
|
60
|
+
Num2words.to_currency("21,05", :ru)
|
|
61
|
+
Num2words.to_currency(BigDecimal("21.05"), :ru)
|
|
62
|
+
```
|
|
63
|
+
- Команда `num2words-console` для быстрого запуска интерактивной консоли после установки гема.
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
- Русские даты по умолчанию выводят день в именительном падеже:
|
|
67
|
+
```ruby
|
|
68
|
+
Num2words.to_words("2024-08-21", :ru)
|
|
69
|
+
# => "двадцать первое августа две тысячи двадцать четвёртого года"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Fixed
|
|
73
|
+
- `DateTime` теперь корректно определяется как дата и время, а не только как дата.
|
|
74
|
+
- Добавлена валидация опций `joiner`, `date_case` и `minor`.
|
|
75
|
+
|
|
76
|
+
### Planned
|
|
12
77
|
- Добавление новых локалей (планируется расширение поддерживаемых языков).
|
|
13
78
|
- Оптимизация производительности при больших числах.
|
|
14
79
|
- Улучшения документации.
|
data/README.md
CHANGED
|
@@ -1,29 +1,24 @@
|
|
|
1
1
|
# num2words [](https://badge.fury.io/rb/num2words)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Ruby-гем для преобразования чисел, дробей, денежных сумм, дат и времени в слова с учетом локальной грамматики.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
- Поддержка **чисел, времени, дат и валют**:
|
|
10
|
-
- `Integer` → `123.to_words(:ru)` → `"сто двадцать три"`
|
|
11
|
-
- `Float` → `12.5.to_words(:en)` → `"twelve and five tenths"`
|
|
12
|
-
- `Time / DateTime` → `"2024-08-21 14:35:42".to_words(:ru, :time)` → `"четырнадцать часов тридцать пять минут сорок две секунды"`
|
|
13
|
-
- `Float.to_currency` → `12.5.to_currency(:ru)` → `"двенадцать рублей пятьдесят копеек"`
|
|
14
|
-
- Кастомизация вывода:
|
|
15
|
-
- Краткая форма (`short: true`) → `"четырнадцать часов тридцать пять минут"`
|
|
16
|
-
- Форматы времени (`:hours_only`, `:hours_minutes`, `:hours_minutes_seconds`)
|
|
17
|
-
- Выбор локали: `:ru`, `:en` (из коробки), легко расширить YAML-файлами
|
|
18
|
-
- Расширение **Integer**, **Float**, **Date**, **Time**, **DateTime** удобными методами.
|
|
19
|
-
- Локали инициализируются только при обращении к ним (`lazy loading`) через `lib/num2words/locales.rb`.
|
|
20
|
-
- Унифицированный `Converter`, делегирующий работу нужной локали.
|
|
21
|
-
- Настраиваемые правила разрядов чисел и валют через I18n YAML.
|
|
7
|
+
## Возможности
|
|
22
8
|
|
|
9
|
+
- Числа: `Integer`, `Float`, числовые строки с точкой или запятой.
|
|
10
|
+
- Дроби: формальный стиль через `целых`/локальный аналог и разговорный `joiner: :and`.
|
|
11
|
+
- Decimal style: чтение дробной части по цифрам через `style: :decimal`.
|
|
12
|
+
- Валюты: единый каталог из 32 валют для каждой локали.
|
|
13
|
+
- Опции валют: `minor: :always | :nonzero | :never`.
|
|
14
|
+
- Даты, время и дата-время.
|
|
15
|
+
- Регистры вывода: `word_case: :upper | :downcase | :capitalize | :title`.
|
|
16
|
+
- Удобные методы для `Integer`, `Float`, `String`, `Date`, `Time`, `DateTime`.
|
|
17
|
+
- Интерактивная консоль `num2words-console`.
|
|
23
18
|
|
|
24
19
|
---
|
|
25
20
|
|
|
26
|
-
##
|
|
21
|
+
## Установка
|
|
27
22
|
|
|
28
23
|
Добавьте в `Gemfile`:
|
|
29
24
|
|
|
@@ -39,183 +34,198 @@ gem install num2words
|
|
|
39
34
|
|
|
40
35
|
---
|
|
41
36
|
|
|
42
|
-
##
|
|
37
|
+
## Быстрый старт
|
|
43
38
|
|
|
44
39
|
```ruby
|
|
45
40
|
require "num2words"
|
|
46
41
|
```
|
|
47
42
|
|
|
48
|
-
###
|
|
43
|
+
### Числа
|
|
44
|
+
|
|
49
45
|
```ruby
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
46
|
+
123.to_words(:ru)
|
|
47
|
+
# => "сто двадцать три"
|
|
48
|
+
|
|
49
|
+
123.to_words(:en)
|
|
50
|
+
# => "one hundred twenty three"
|
|
53
51
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
52
|
+
"45,67".to_words(:ru)
|
|
53
|
+
# => "сорок пять целых шестьдесят семь сотых"
|
|
54
|
+
|
|
55
|
+
45.67.to_words(:ru, joiner: :and)
|
|
56
|
+
# => "сорок пять и шестьдесят семь сотых"
|
|
57
|
+
|
|
58
|
+
12.12.to_words(:en, style: :decimal)
|
|
59
|
+
# => "twelve point one two"
|
|
57
60
|
```
|
|
58
61
|
|
|
59
|
-
|
|
62
|
+
Универсальный вызов без core extensions:
|
|
63
|
+
|
|
60
64
|
```ruby
|
|
61
|
-
|
|
62
|
-
|
|
65
|
+
Num2words.to_words("3,5", :ru)
|
|
66
|
+
# => "три целых пять десятых"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Валюта
|
|
70
|
+
|
|
71
|
+
```ruby
|
|
72
|
+
21.05.to_currency(:ru)
|
|
73
|
+
# => "двадцать один рубль пять копеек"
|
|
74
|
+
|
|
75
|
+
"21,05".to_currency(:ru)
|
|
76
|
+
# => "двадцать один рубль пять копеек"
|
|
77
|
+
|
|
78
|
+
Num2words.to_currency(BigDecimal("21.05"), :ru)
|
|
79
|
+
# => "двадцать один рубль пять копеек"
|
|
80
|
+
|
|
81
|
+
12.50.to_currency(:ru, code: :USD)
|
|
82
|
+
# => "двенадцать долларов пятьдесят центов"
|
|
83
|
+
|
|
84
|
+
1.to_currency(:ru, minor: :nonzero)
|
|
85
|
+
# => "один рубль"
|
|
86
|
+
|
|
87
|
+
1.25.to_currency(:ru, minor: :never)
|
|
88
|
+
# => "один рубль"
|
|
63
89
|
```
|
|
64
90
|
|
|
65
|
-
|
|
91
|
+
Поддерживаемые значения `minor:`:
|
|
92
|
+
|
|
93
|
+
- `:always` — всегда выводить младшую денежную единицу.
|
|
94
|
+
- `:nonzero` — выводить младшую единицу только когда она ненулевая.
|
|
95
|
+
- `:never` — не выводить младшую единицу.
|
|
96
|
+
|
|
97
|
+
### Дата
|
|
98
|
+
|
|
66
99
|
```ruby
|
|
67
|
-
"2024-08-21".to_words(:ru
|
|
68
|
-
# => "двадцать первое августа две тысячи двадцать
|
|
100
|
+
"2024-08-21".to_words(:ru)
|
|
101
|
+
# => "двадцать первое августа две тысячи двадцать четвёртого года"
|
|
102
|
+
|
|
103
|
+
"2024-08-21".to_words(:ru, date_case: :genitive)
|
|
104
|
+
# => "двадцать первого августа две тысячи двадцать четвёртого года"
|
|
69
105
|
|
|
70
|
-
"2024-08-21".to_words(:en
|
|
106
|
+
"2024-08-21".to_words(:en)
|
|
71
107
|
# => "the twenty-first of August, two thousand twenty four"
|
|
72
108
|
```
|
|
73
109
|
|
|
74
|
-
###
|
|
110
|
+
### Время
|
|
111
|
+
|
|
75
112
|
```ruby
|
|
76
|
-
"14:35:42".to_words(:ru
|
|
113
|
+
"14:35:42".to_words(:ru)
|
|
77
114
|
# => "четырнадцать часов тридцать пять минут сорок две секунды"
|
|
78
115
|
|
|
79
|
-
"14:35:42".to_words(:ru,
|
|
116
|
+
"14:35:42".to_words(:ru, short: true)
|
|
80
117
|
# => "четырнадцать часов тридцать пять минут"
|
|
81
118
|
|
|
82
|
-
"14:35:42".to_words(:en
|
|
119
|
+
"14:35:42".to_words(:en)
|
|
83
120
|
# => "fourteen hours thirty five minutes forty two seconds"
|
|
84
121
|
```
|
|
85
122
|
|
|
86
|
-
###
|
|
123
|
+
### Дата и время
|
|
87
124
|
|
|
88
125
|
```ruby
|
|
89
126
|
"2024-08-21 14:35:42".to_words(:ru)
|
|
90
|
-
# =>
|
|
127
|
+
# => "двадцать первое августа две тысячи двадцать четвёртого года, четырнадцать часов тридцать пять минут сорок две секунды"
|
|
91
128
|
|
|
92
129
|
"2024-08-21 14:35:42".to_words(:en)
|
|
93
|
-
# => "the twenty-first of August, two thousand twenty four at fourteen hours thirty five minutes forty two seconds"
|
|
130
|
+
# => "the twenty-first of August, two thousand twenty four at fourteen hours thirty five minutes forty two seconds"
|
|
94
131
|
```
|
|
95
132
|
|
|
96
|
-
|
|
133
|
+
---
|
|
97
134
|
|
|
98
|
-
|
|
99
|
-
- `:date, :time, :datetime` — формат преобразования для строк.
|
|
100
|
-
- `short: true` — краткая форма для даты/времени.
|
|
101
|
-
- `Num2words.to_words(number, locale: :en)` — универсальный способ вызова без расширения базовых классов.
|
|
102
|
-
- `Num2words.to_currency(number)` — преобразование число в валюту.
|
|
135
|
+
## Опции
|
|
103
136
|
|
|
104
|
-
|
|
137
|
+
- `locale: :ru` или второй аргумент `:ru` — выбор локали.
|
|
138
|
+
- `style: :fraction | :decimal` — стиль дробной части.
|
|
139
|
+
- `joiner: :default | :and` — формальный или разговорный соединитель дробей.
|
|
140
|
+
- `date_case: :default | :genitive` — падеж дня для дат, если локаль это поддерживает.
|
|
141
|
+
- `short: true` — краткая форма времени или даты/времени.
|
|
142
|
+
- `word_case: :default | :upper | :downcase | :capitalize | :title` — регистр результата.
|
|
143
|
+
- `minor: :always | :nonzero | :never` — вывод младшей денежной единицы.
|
|
144
|
+
- `code: :USD` — выбор валюты для `to_currency`.
|
|
105
145
|
|
|
106
|
-
|
|
107
|
-
Это удобно при работе с разными числами и языками.
|
|
146
|
+
---
|
|
108
147
|
|
|
109
|
-
|
|
148
|
+
## Консоль
|
|
149
|
+
|
|
150
|
+
Запуск из репозитория:
|
|
110
151
|
|
|
111
152
|
```bash
|
|
112
153
|
bin/console
|
|
113
154
|
```
|
|
114
155
|
|
|
115
|
-
|
|
156
|
+
Запуск после установки гема:
|
|
116
157
|
|
|
117
158
|
```bash
|
|
118
|
-
|
|
119
|
-
Попробуйте: Num2words.to_words(2025)
|
|
120
|
-
-----------------------------------------------------
|
|
159
|
+
num2words-console
|
|
121
160
|
```
|
|
122
161
|
|
|
123
|
-
|
|
162
|
+
В консоли доступны обычные вызовы:
|
|
163
|
+
|
|
164
|
+
```ruby
|
|
165
|
+
Num2words.to_words(2025, :ru)
|
|
166
|
+
Num2words.to_currency("12.50", :en, code: :EUR)
|
|
167
|
+
"2024-08-21 14:35:42".to_words(:fr)
|
|
168
|
+
```
|
|
124
169
|
|
|
125
170
|
---
|
|
126
171
|
|
|
127
|
-
##
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
| Вьетнамский | vi | VND (₫) | vi.yml |
|
|
161
|
-
| Индонезийский | id | IDR (Rp) | id.yml |
|
|
162
|
-
| Персидский | fa | IRR (﷼) | fa.yml |
|
|
163
|
-
| Сербский | sr | RSD (дин) | sr.yml |
|
|
164
|
-
| Хорватский | hr | EUR (€) | hr.yml |
|
|
165
|
-
| Словацкий | sk | EUR (€) | sk.yml |
|
|
166
|
-
| Словенский | sl | EUR (€) | sl.yml |
|
|
167
|
-
| Литовский | lt | EUR (€) | lt.yml |
|
|
168
|
-
| Латышский | lv | EUR (€) | lv.yml |
|
|
169
|
-
| Эстонский | et | EUR (€) | et.yml |
|
|
170
|
-
| Малайский | ms | MYR (RM) | ms.yml |
|
|
171
|
-
| Бенгальский | bn | BDT (৳) | bn.yml |
|
|
172
|
-
| Урду | ur | PKR (₨) | ur.yml |
|
|
173
|
-
| Тамильский | ta | INR (₹) | ta.yml |
|
|
174
|
-
| Телугу | te | INR (₹) | te.yml |
|
|
175
|
-
| Малаялам | ml | INR (₹) | ml.yml |
|
|
176
|
-
| Каннада | kn | INR (₹) | kn.yml |
|
|
177
|
-
| Маратхи | mr | INR (₹) | mr.yml |
|
|
178
|
-
| Гуджарати | gu | INR (₹) | gu.yml |
|
|
179
|
-
| Панджаби | pa | INR (₹) | pa.yml |
|
|
180
|
-
| Суахили | sw | KES (Sh) | sw.yml |
|
|
181
|
-
|
|
182
|
-
Можно легко добавить новые:
|
|
183
|
-
|
|
184
|
-
- YAML-файл: `config/locales/xx.yml`
|
|
185
|
-
- Обёртка: `lib/num2words/locales/xx.rb`
|
|
186
|
-
|
|
187
|
-
### 🌍 Поддержка локалей (ru / en)
|
|
188
|
-
|
|
189
|
-
| Возможность | ru | en |
|
|
190
|
-
| ----------------------------- | --------- | ---------- |
|
|
191
|
-
| 🔢 Числа (Integer) | ✔ | ✔ |
|
|
192
|
-
| 🔢 Числа (Float) | ✔ | ✔ |
|
|
193
|
-
| 💰 Валюта | ✔ (рубли) | ✔ (rubles) |
|
|
194
|
-
| 💰 Валюта (short) | ✖ | ✖ |
|
|
195
|
-
| 💱 Выбор валюты (USD/EUR/…) | ✖ | ✖ |
|
|
196
|
-
| 📅 Дата | ✔ | ✔ |
|
|
197
|
-
| ⏰ Время | ✔ | ✔ |
|
|
198
|
-
| 🕓 Дата и время | ✔ | ✔ |
|
|
199
|
-
| 📝 Краткая форма даты/времени | ✔ | ✔ |
|
|
172
|
+
## Локали
|
|
173
|
+
|
|
174
|
+
Все локали поддерживают общий набор возможностей: числа, дроби, даты, время, дату-время и валюты. Грамматика и правила чтения чисел вынесены в соответствующие `Num2words::Locales::XX` модули.
|
|
175
|
+
|
|
176
|
+
Поддерживаемые локали:
|
|
177
|
+
|
|
178
|
+
```text
|
|
179
|
+
ar be bg bn cs da de el en es et fa fi fr gu he hi hr hu id it ja kn ko
|
|
180
|
+
kz lt lv ml mr ms nb nl pa pl pt ro ru sk sl sr sv sw ta te th tr uk ur
|
|
181
|
+
vi zh
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Всего: 50 локалей.
|
|
185
|
+
|
|
186
|
+
### Валюты
|
|
187
|
+
|
|
188
|
+
Каждая локаль содержит одинаковый каталог из 32 валют:
|
|
189
|
+
|
|
190
|
+
```text
|
|
191
|
+
BDT BGN BRL BYN CNY CZK DKK EUR GBP HUF IDR ILS INR IRR JPY KES KRW
|
|
192
|
+
KZT MYR NOK PKR PLN RON RSD RUB SAR SEK THB TRY UAH USD VND
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Добавление локали
|
|
198
|
+
|
|
199
|
+
Новая локаль состоит из двух файлов:
|
|
200
|
+
|
|
201
|
+
- `config/locales/xx.yml` — данные: числа, даты, время, валюты, грамматика.
|
|
202
|
+
- `lib/num2words/locales/xx.rb` — языковые правила и hooks для converter.
|
|
203
|
+
|
|
204
|
+
После добавления локали стоит покрыть ее отдельным spec и добавить в `spec/currency_catalog_spec.rb`.
|
|
200
205
|
|
|
201
206
|
---
|
|
202
207
|
|
|
203
|
-
##
|
|
208
|
+
## Тестирование
|
|
204
209
|
|
|
205
210
|
```bash
|
|
206
211
|
bundle exec rspec
|
|
207
212
|
```
|
|
208
213
|
|
|
209
|
-
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Roadmap
|
|
210
217
|
|
|
211
|
-
- [x]
|
|
212
|
-
- [x]
|
|
213
|
-
- [x]
|
|
214
|
-
- [
|
|
215
|
-
- [
|
|
218
|
+
- [x] Поддержка чисел для всех локалей.
|
|
219
|
+
- [x] Поддержка дробей для всех локалей.
|
|
220
|
+
- [x] Поддержка дат и времени для всех локалей.
|
|
221
|
+
- [x] Единый каталог из 32 валют для всех локалей.
|
|
222
|
+
- [x] Интерактивная консоль.
|
|
223
|
+
- [ ] Дополнительная экспертная вычитка грамматики носителями языка.
|
|
224
|
+
- [ ] Расширение списка валют.
|
|
225
|
+
- [ ] Настраиваемые форматы валютного вывода.
|
|
216
226
|
|
|
217
227
|
---
|
|
218
228
|
|
|
219
|
-
##
|
|
229
|
+
## Лицензия
|
|
220
230
|
|
|
221
231
|
[MIT](LICENSE)
|
data/bin/console
CHANGED
|
@@ -3,18 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
require "bundler/setup"
|
|
5
5
|
require "num2words"
|
|
6
|
+
require "num2words/console"
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
# with your gem easier. You can also use a different console, if you like.
|
|
9
|
-
|
|
10
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
|
11
|
-
# require "pry"
|
|
12
|
-
# Pry.start
|
|
13
|
-
|
|
14
|
-
# Красивое приветствие
|
|
15
|
-
puts "👋 Добро пожаловать в консоль num2words!"
|
|
16
|
-
puts "Можете использовать: Num2words.to_words(#{Time.now.year})"
|
|
17
|
-
puts "-------------------------------------------------------------"
|
|
18
|
-
|
|
19
|
-
require "irb"
|
|
20
|
-
IRB.start(__FILE__)
|
|
8
|
+
Num2words::Console.start
|
data/config/locales/ar.yml
CHANGED
|
@@ -18,7 +18,7 @@ ar:
|
|
|
18
18
|
conjunction: "فاصلة"
|
|
19
19
|
default_fraction: "كسور"
|
|
20
20
|
fractions:
|
|
21
|
-
10: ["عُشر", "
|
|
21
|
+
10: ["عُشر", "عُشران", "أعشار"]
|
|
22
22
|
100: ["مِئويّة", "مِئويّتان", "مِئويّات"]
|
|
23
23
|
1000: ["ألفيّة", "ألفيّتان", "ألفيّات"]
|
|
24
24
|
10000: ["عُشر الألف", "أعشار الألف", "أعشار الألف"]
|
|
@@ -89,6 +89,10 @@ ar:
|
|
|
89
89
|
major_unit: [ "جنيه إسترليني", "جنيهان إسترلينيان", "جنيهات إسترلينية" ]
|
|
90
90
|
minor_unit: [ "بنس", "بنسان", "بنسات" ]
|
|
91
91
|
symbol: "£"
|
|
92
|
+
BRL:
|
|
93
|
+
major_unit: [ "ريال برازيلي", "ريالان برازيليان", "ريالات برازيلية" ]
|
|
94
|
+
minor_unit: [ "سنتافو", "سنتافوان", "سنتافوات" ]
|
|
95
|
+
symbol: "R$"
|
|
92
96
|
CNY:
|
|
93
97
|
major_unit: [ "يوان", "يوانان", "يوان" ]
|
|
94
98
|
minor_unit: [ "فن", "فنان", "فنات" ]
|
data/config/locales/be.yml
CHANGED
|
@@ -88,6 +88,10 @@ be:
|
|
|
88
88
|
major_unit: [ "фунт", "фунты", "фунтаў" ]
|
|
89
89
|
minor_unit: [ "пенс", "пенсы", "пенсаў" ]
|
|
90
90
|
symbol: "£"
|
|
91
|
+
BRL:
|
|
92
|
+
major_unit: [ "бразільскі рэал", "бразільскія рэалы", "бразільскіх рэалаў" ]
|
|
93
|
+
minor_unit: [ "сентава", "сентава", "сентава" ]
|
|
94
|
+
symbol: "R$"
|
|
91
95
|
CNY:
|
|
92
96
|
major_unit: [ "юань", "юані", "юаняў" ]
|
|
93
97
|
minor_unit: [ "фэнь", "фэні", "фэняў" ]
|
data/config/locales/bg.yml
CHANGED
|
@@ -88,6 +88,10 @@ bg:
|
|
|
88
88
|
major_unit: [ "паунд", "паунда", "паунди" ]
|
|
89
89
|
minor_unit: [ "пенс", "пенса", "пенсове" ]
|
|
90
90
|
symbol: "£"
|
|
91
|
+
BRL:
|
|
92
|
+
major_unit: [ "бразилски реал", "бразилски реала", "бразилски реала" ]
|
|
93
|
+
minor_unit: [ "сентаво", "сентаво", "сентаво" ]
|
|
94
|
+
symbol: "R$"
|
|
91
95
|
CNY:
|
|
92
96
|
major_unit: [ "юан", "юана", "юани" ]
|
|
93
97
|
minor_unit: [ "фен", "фена", "фени" ]
|
data/config/locales/bn.yml
CHANGED
|
@@ -89,6 +89,10 @@ bn:
|
|
|
89
89
|
major_unit: [ "পাউন্ড", "পাউন্ড", "পাউন্ড" ]
|
|
90
90
|
minor_unit: [ "পেন্স", "পেন্স", "পেন্স" ]
|
|
91
91
|
symbol: "£"
|
|
92
|
+
BRL:
|
|
93
|
+
major_unit: [ "ব্রাজিলীয় রিয়াল", "ব্রাজিলীয় রিয়াল", "ব্রাজিলীয় রিয়াল" ]
|
|
94
|
+
minor_unit: [ "সেন্টাভো", "সেন্টাভো", "সেন্টাভো" ]
|
|
95
|
+
symbol: "R$"
|
|
92
96
|
CNY:
|
|
93
97
|
major_unit: [ "ইউয়ান", "ইউয়ান", "ইউয়ান" ]
|
|
94
98
|
minor_unit: [ "ফেন", "ফেন", "ফেন" ]
|
data/config/locales/cs.yml
CHANGED
|
@@ -53,8 +53,8 @@ cs:
|
|
|
53
53
|
template: "%{date}, %{time}"
|
|
54
54
|
date:
|
|
55
55
|
template:
|
|
56
|
-
default: "%{day}
|
|
57
|
-
nominative: "%{day}
|
|
56
|
+
default: "%{day} %{month} %{year}"
|
|
57
|
+
nominative: "%{day} %{month} %{year}"
|
|
58
58
|
months:
|
|
59
59
|
default: ["ledna", "února", "března", "dubna", "května", "června", "července", "srpna", "září", "října", "listopadu", "prosince"]
|
|
60
60
|
nominative: ["leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec"]
|
|
@@ -88,6 +88,10 @@ cs:
|
|
|
88
88
|
major_unit: [ "libra", "libry", "liber" ]
|
|
89
89
|
minor_unit: [ "pence", "pence", "pencí" ]
|
|
90
90
|
symbol: "£"
|
|
91
|
+
BRL:
|
|
92
|
+
major_unit: [ "brazilský real", "brazilské realy", "brazilských realů" ]
|
|
93
|
+
minor_unit: [ "centavo", "centava", "centav" ]
|
|
94
|
+
symbol: "R$"
|
|
91
95
|
CNY:
|
|
92
96
|
major_unit: [ "juan", "juanu", "juanů" ]
|
|
93
97
|
minor_unit: [ "fen", "fenu", "fenů" ]
|
data/config/locales/da.yml
CHANGED
|
@@ -88,6 +88,10 @@ da:
|
|
|
88
88
|
major_unit: [ "pund", "pund", "pund" ]
|
|
89
89
|
minor_unit: [ "penny", "pence", "pence" ]
|
|
90
90
|
symbol: "£"
|
|
91
|
+
BRL:
|
|
92
|
+
major_unit: [ "brasiliansk real", "brasilianske real", "brasilianske real" ]
|
|
93
|
+
minor_unit: [ "centavo", "centavo", "centavo" ]
|
|
94
|
+
symbol: "R$"
|
|
91
95
|
CNY:
|
|
92
96
|
major_unit: [ "yuan", "yuan", "yuan" ]
|
|
93
97
|
minor_unit: [ "fen", "fen", "fen" ]
|
data/config/locales/de.yml
CHANGED
|
@@ -53,16 +53,16 @@ de:
|
|
|
53
53
|
template: "%{date}, %{time}"
|
|
54
54
|
date:
|
|
55
55
|
template:
|
|
56
|
-
default: "%{day}
|
|
57
|
-
nominative: "%{day}
|
|
56
|
+
default: "%{day} %{month} %{year}"
|
|
57
|
+
nominative: "%{day} %{month} %{year}"
|
|
58
58
|
months:
|
|
59
59
|
default: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]
|
|
60
60
|
nominative: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]
|
|
61
61
|
time:
|
|
62
62
|
template:
|
|
63
63
|
hours_only: "%{hours}"
|
|
64
|
-
hours_minutes: "%{hours}
|
|
65
|
-
hours_minutes_seconds: "%{hours}
|
|
64
|
+
hours_minutes: "%{hours} %{minutes}"
|
|
65
|
+
hours_minutes_seconds: "%{hours} %{minutes} %{seconds}"
|
|
66
66
|
words:
|
|
67
67
|
hour: ["Stunde", "Stunden", "Stunden"]
|
|
68
68
|
minute: ["Minute", "Minuten", "Minuten"]
|
|
@@ -84,6 +84,10 @@ de:
|
|
|
84
84
|
major_unit: [ "Pfund", "Pfund", "Pfund" ]
|
|
85
85
|
minor_unit: [ "Penny", "Pence", "Pence" ]
|
|
86
86
|
symbol: "£"
|
|
87
|
+
BRL:
|
|
88
|
+
major_unit: [ "brasilianischer Real", "brasilianische Real", "brasilianische Real" ]
|
|
89
|
+
minor_unit: [ "Centavo", "Centavo", "Centavo" ]
|
|
90
|
+
symbol: "R$"
|
|
87
91
|
JPY:
|
|
88
92
|
major_unit: [ "Yen", "Yen", "Yen" ]
|
|
89
93
|
minor_unit: [ "Sen", "Sen", "Sen" ]
|
data/config/locales/el.yml
CHANGED
|
@@ -84,6 +84,10 @@ el:
|
|
|
84
84
|
major_unit: [ "λίρα", "λίρες", "λιρών" ]
|
|
85
85
|
minor_unit: [ "πένι", "πένι", "πενών" ]
|
|
86
86
|
symbol: "£"
|
|
87
|
+
BRL:
|
|
88
|
+
major_unit: [ "βραζιλιάνικο ρεάλ", "βραζιλιάνικα ρεάλ", "βραζιλιάνικων ρεάλ" ]
|
|
89
|
+
minor_unit: [ "σεντάβο", "σεντάβο", "σεντάβο" ]
|
|
90
|
+
symbol: "R$"
|
|
87
91
|
JPY:
|
|
88
92
|
major_unit: [ "γιεν", "γιεν", "γιεν" ]
|
|
89
93
|
minor_unit: [ "σεν", "σεν", "σεν" ]
|
data/config/locales/en.yml
CHANGED
|
@@ -68,6 +68,10 @@ en:
|
|
|
68
68
|
major_unit: ["pound", "pounds", "pounds"]
|
|
69
69
|
minor_unit: ["penny", "pence", "pence"]
|
|
70
70
|
symbol: "£"
|
|
71
|
+
BRL:
|
|
72
|
+
major_unit: ["Brazilian real", "Brazilian reals", "Brazilian reals"]
|
|
73
|
+
minor_unit: ["centavo", "centavos", "centavos"]
|
|
74
|
+
symbol: "R$"
|
|
71
75
|
RUB:
|
|
72
76
|
major_unit: ["ruble", "rubles", "rubles"]
|
|
73
77
|
minor_unit: ["kopek", "kopeks", "kopeks"]
|
data/config/locales/es.yml
CHANGED
|
@@ -84,6 +84,10 @@ es:
|
|
|
84
84
|
major_unit: [ "libra", "libras", "libras" ]
|
|
85
85
|
minor_unit: [ "penique", "peniques", "peniques" ]
|
|
86
86
|
symbol: "£"
|
|
87
|
+
BRL:
|
|
88
|
+
major_unit: [ "real brasileño", "reales brasileños", "reales brasileños" ]
|
|
89
|
+
minor_unit: [ "centavo", "centavos", "centavos" ]
|
|
90
|
+
symbol: "R$"
|
|
87
91
|
RUB:
|
|
88
92
|
major_unit: [ "rublo", "rublos", "rublos" ]
|
|
89
93
|
minor_unit: [ "kopek", "kopeks", "kopeks" ]
|