russian 0.6.0 → 1.0.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 +7 -0
- data/CHANGELOG.md +203 -0
- data/Gemfile +5 -6
- data/LICENSE +2 -2
- data/README.md +327 -0
- data/Rakefile +15 -8
- data/lib/russian/action_view_ext/helpers/date_helper.rb +136 -101
- data/lib/russian/active_model_ext/custom_error_message.rb +40 -59
- data/lib/russian/locale/actionview.yml +101 -84
- data/lib/russian/locale/activemodel.yml +28 -21
- data/lib/russian/locale/activerecord.yml +57 -52
- data/lib/russian/locale/activesupport.yml +5 -8
- data/lib/russian/locale/datetime.rb +34 -24
- data/lib/russian/locale/datetime.yml +85 -22
- data/lib/russian/locale/pluralization.rb +32 -11
- data/lib/russian/locale/transliterator.rb +10 -9
- data/lib/russian/russian_rails.rb +97 -6
- data/lib/russian/strptime.rb +166 -0
- data/lib/russian/transliteration.rb +87 -53
- data/lib/russian/version.rb +27 -5
- data/lib/russian.rb +378 -78
- data/russian.gemspec +37 -20
- data/sig/russian.rbs +46 -0
- metadata +163 -53
- data/CHANGELOG +0 -132
- data/README.textile +0 -295
- data/TODO +0 -4
- data/spec/fixtures/en.yml +0 -4
- data/spec/fixtures/ru.yml +0 -4
- data/spec/i18n/locale/datetime_spec.rb +0 -99
- data/spec/i18n/locale/pluralization_spec.rb +0 -28
- data/spec/locale_spec.rb +0 -47
- data/spec/russian_spec.rb +0 -118
- data/spec/spec_helper.rb +0 -7
- data/spec/transliteration_spec.rb +0 -51
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 275655e1686deee67f3a2f05fdde45574d5f4de4ca2c5ed73b82c24646c9bb06
|
|
4
|
+
data.tar.gz: 68ecfa62dbe878e0664180920e1c9be94717ca81f69eccd4c4b92b127da90d1a
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: cda3ef8cb0b32229bf808b95c11d9855a5f12032a35bcd63f499cc266dbcbe00a601af9269c696da43ee27a59747cac4a1cc7c9117e4fc9a80b12d6ece687df6
|
|
7
|
+
data.tar.gz: 7d20280acc42facdcc0ec7ad07d660f67f1acb8a79cac78bd02f34ac12c135f8f0e4662116b7c657ae83d43adf0cfd0c3bd8ca618f272341c5ba34f756740115
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
## [1.0.0] "Remastered" - 2026-03-16
|
|
2
|
+
|
|
3
|
+
A remaster of the library, 15 years later.
|
|
4
|
+
|
|
5
|
+
It turned out that the library is still in use, even on recent Ruby versions, despite some of its helpers having been broken for a long time.
|
|
6
|
+
On top of that, I wanted to finally release version 1.0 and close the loop.
|
|
7
|
+
|
|
8
|
+
As a result, the `russian` gem has been largely rewritten while preserving the old API: the `Russian` module methods, and even optional support for the old `strftime` signature.
|
|
9
|
+
The gem now targets modern versions of Ruby (3.2+, 4.0+) and Rails (7.2 and 8.0+).
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
Ремастер библиотеки 15 лет спустя.
|
|
13
|
+
|
|
14
|
+
Выяснилось, что библиотекой пользуются до сих пор, даже на свежих версиях Ruby, несмотря на то, что некоторые хелперы давно перестали работать.
|
|
15
|
+
Кроме того, хотелось бы выпустить версию 1.0 для закрытия гештальта.
|
|
16
|
+
|
|
17
|
+
В итоге, gem russian большей частью переписан, но с сохранением старого API: методов модуля Russian, и даже с опциональной поддержкой старой сигнатуры `strftime`.
|
|
18
|
+
gem предназначен для современных версий Ruby (3.2+, 4.0+) и Rails (7.2 и 8.0+).
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
- The library is now designed for Ruby 3.2, 3.3, 3.4 and 4.0.
|
|
22
|
+
- Support Rails integration for Rails 7.2, 8.0 and 8.1.
|
|
23
|
+
- Added RBS signatures for the public API.
|
|
24
|
+
- Full YARD documentation now available.
|
|
25
|
+
- Refreshed Russian locale data and added missing modern keys.
|
|
26
|
+
- Aligned the Russian currency decimal separator with CLDR and standard Russian numeric formatting by using a comma instead of a period.
|
|
27
|
+
- Fixed `Russian.transliterate` so it preserves newlines instead of dropping them during tokenization [#57].
|
|
28
|
+
- Fixed context-sensitive month-name selection in `strftime` formats with width and flag modifiers such as `%-e`, `%3d`, and `%_3d`. [#41] [#43] [Aleksei Savartsov](https://github.com/asavartsov)
|
|
29
|
+
- Added localized versions of `strptime`: `date_strptime`, `time_strptime`, and `datetime_strptime` helpers, including case-insensitive parsing of Russian month and weekday names.
|
|
30
|
+
- Speedup for transliteration [#42] (inspired by [Igor Bochkariov](https://github.com/ujifgc))
|
|
31
|
+
- Speedup for pluralization.
|
|
32
|
+
- Speedup for date format checks.
|
|
33
|
+
- Bundled locale files are now added to `I18n.load_path` in a deterministic sorted order, which avoids filesystem-dependent ordering issues and helps tools such as `i18n-js`. [#56] [Andrey Novikov](https://github.com/Envek)
|
|
34
|
+
- Cleaned up Russian comparison validation messages (`greater_than`, `greater_than_or_equal_to`, `less_than`, `less_than_or_equal_to`) for more natural wording. [#47] [Valentin Vasilyev](https://github.com/Valve)
|
|
35
|
+
- Migrated to GitHub Actions with Ruby and Rails matrix jobs testing.
|
|
36
|
+
- Converted the main docs to Markdown and updated development tooling (modern RSpec, gemfiles for supported Rails lines).
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
- Теперь библиотека предназначена для Ruby 3.2, 3.3, 3.4 и 4.0.
|
|
40
|
+
- Поддержка интеграции с Rails 7.2, 8.0 и 8.1.
|
|
41
|
+
- Добавлены RBS-сигнатуры для публичного API.
|
|
42
|
+
- Доступна документация к gem в формате YARD.
|
|
43
|
+
- Обновлены русские locale-файлы, добавлены отсутствующие современные ключи.
|
|
44
|
+
- Денежный десятичный разделитель для русской локали приведен в соответствие с CLDR и стандартным числовым форматом: теперь используется запятая вместо точки.
|
|
45
|
+
- Исправлена `Russian.transliterate`: теперь при токенизации не теряются переводы строк [#57].
|
|
46
|
+
- Исправление контекстного выбора формы названия месяца в `strftime`-форматах с модификаторами ширины и флагами вроде `%-e`, `%3d` и `%_3d`. [#41] [#43] [Алексей Саварцов](https://github.com/asavartsov)
|
|
47
|
+
- Добавлены локализованные версии `strptime`: хелперы `date_strptime`, `time_strptime` и `datetime_strptime`, включая case-insensitive разбор русских названий месяцев и дней недели.
|
|
48
|
+
- Ускорение транслитерации [#42] (основано на идее [Игоря Бочкарева](https://github.com/ujifgc))
|
|
49
|
+
- Ускорение плюрализации.
|
|
50
|
+
- Ускорение работы с datetime-форматами.
|
|
51
|
+
- Файлы локали из поставки теперь добавляются в `I18n.load_path` в детерминированном отсортированном порядке: это убирает зависимость от порядка файловой системы и помогает инструментам вроде `i18n-js`. [#56] [Andrey Novikov](https://github.com/Envek)
|
|
52
|
+
- Исправлены формулировки русских сообщений валидации для сравнений (`greater_than`, `greater_than_or_equal_to`, `less_than`, `less_than_or_equal_to`) на более естественные. [#47] [Валентин Васильев](https://github.com/Valve)
|
|
53
|
+
- CI перенесен на GitHub Actions, тестируются все поддерживаемые версии Ruby и Rails.
|
|
54
|
+
- Основная документация переведена в Markdown, обновлены инструменты разработки (современный RSpec, gemfiles для поддерживаемых версий Rails).
|
|
55
|
+
|
|
56
|
+
## [0.6.0] "Haters Gonna Hate" - 2011-10-22
|
|
57
|
+
|
|
58
|
+
- i18n gem is now a dependency (not using vendored gem anymore)
|
|
59
|
+
- I18n::Backend::Advanced custom backend is no longer used. Russian Ruby i18n files are portable for the first time; using Russian language with i18n does not require a custom backend with language-specific hacks anymore. It became possible thanks to lambda translations support in i18n gem (<https://svenfuchs.com/2009/7/12/ruby-i18n-gem-hits-0-2-0>) and inclusion of Pluralization backend. Notice: ff you are using a custom backend, don't forget to include I18n::Backend::Pluralization and I18n::Backend::Transliterator modules
|
|
60
|
+
- Pluralization is now delegated to I18n backend
|
|
61
|
+
- Transliteration is now delegated to I18n backend (using Russian::Transliteration, of course)
|
|
62
|
+
- Minor gem russian version is now bumped to be in sync with minor version of required i18n gem
|
|
63
|
+
- UPGRADING: Rails 2 is no longer supported, use older versions of the gem
|
|
64
|
+
- UPGRADING: gem russian does not force Russian locale anymore, use I18n::locale/default_locale methods or config.i18n.default_locale = :ru in your Rails environment. Methods with forced encoding still can be used as Russian::translate, Russian::localize
|
|
65
|
+
- Locale files and hacks (date helper, custom ActiveModel error message) updated to support Rails 3.0 and 3.1
|
|
66
|
+
- README updated
|
|
67
|
+
- Remove i18n_label plugin (labels i18n is supported in latest Rails releases)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
- gem i18n теперь является зависимостью для gem russian, а не включается в vendor, как раньше
|
|
71
|
+
- Собственный бекенд I18n::Backend::Advanced больше не используется. Русские файлы локали i18n для Ruby наконец-то стали переносимыми и не требуют собственного бекенда и хаков для поддержки языка. Это стало возможным благодаря поддержке lambda-переводов в i18n (<https://svenfuchs.com/2009/7/12/ruby-i18n-gem-hits-0-2-0>) и включению Pluralization бекенда в gem i18n. Обратите внимание: если вы используете собственный бекенд (отличный от стандартного), не забудьте включить модули I18n::Backend::Pluralization и I18n::Backend::Transliterator
|
|
72
|
+
- Механизм плюрализации теперь обеспечивает стандартный бекенд I18n
|
|
73
|
+
- Механизм транслитерации теперь обеспечивает стандартный бекенд I18n (с помощью Russian::Transliteration, конечно)
|
|
74
|
+
- Минорная версия gem russian повышена до текущей минорной версии i18n
|
|
75
|
+
- UPGRADING: Rails 2 больше не поддерживается, используйте старые версии gem'а
|
|
76
|
+
- UPGRADING: gem russian больше не форсирует использование русской локали, используйте методы I18n::locale/default_locale или config.i18n.default_locale = :ru в настройках окружения Rails. Если нужно форсировать русскую локаль, можно по-прежнему пользоваться методами Russian::translate, Russian::localize
|
|
77
|
+
- Обновлены файлы переводов и хаки (выбор месяца в date helper, кастомные сообщения об ошибках ActiveModel) для поддержки Rails 3.0 и 3.1
|
|
78
|
+
- Обновлен и переписан README
|
|
79
|
+
- Удален плагин i18n_label (перевод label уже поддерживается в последних версиях Rails)
|
|
80
|
+
|
|
81
|
+
## [0.2.7] - 2010-05-05
|
|
82
|
+
|
|
83
|
+
- Fix using of standalone/non-standalone month names with %d/%e surroundings.
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
- Улучшено распознавание формы названия месяца с strftime макросами %d/%e.
|
|
87
|
+
|
|
88
|
+
## [0.2.6] - 2010.03.25
|
|
89
|
+
|
|
90
|
+
- Minimum Rails 3.0b support: Added fourth parameter (options) defaulting to nil to Advanced backend localize method for compliance with i18n-0.3 [Nikolay V. Nemshilov](https://github.com/MadRabbit)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
- Минимальная поддержка Rails 3.0b: В метод localize бекенда Advanced добавлен четвертый параметр, для совместимости с i18n-0.3. По умолчанию равен nil. [Николай Немшилов](https://github.com/MadRabbit)
|
|
94
|
+
|
|
95
|
+
## [0.2.5] - 2009-12-23
|
|
96
|
+
|
|
97
|
+
- Added support for multi-char substrings in Russian.transliterate [Alex Fortuna](https://github.com/dadooda)
|
|
98
|
+
- Rails 2.3.5 error messages overloading compatibility (error messages overloading) (thanks Alex Eagle for bugreport)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
- Russian.transliterate: Теперь можно добавлять правила матчинга подстрок из нескольких символов ("Воробьёв", "Алябьев"). [Alex Fortuna](https://github.com/dadooda)
|
|
102
|
+
- Rails 2.3.5: совместимость для перегрузки сообщений об ошибках (багрепорт - Александр Орел)
|
|
103
|
+
|
|
104
|
+
## [0.2.4] - 2009.11.12
|
|
105
|
+
|
|
106
|
+
- Revert nested validation errors patch
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
- Убран патч для вложенных сообщений валидации (не работал с Rails 2.3.3 и ниже)
|
|
110
|
+
|
|
111
|
+
## [0.2.3] - 2009.11.09
|
|
112
|
+
|
|
113
|
+
- Improve ActiveRecord translations [Dmitri Koulikoff](https://github.com/dima4p)
|
|
114
|
+
- Fix nested validation errors with custom error message hack for Rails < 2.3.4 [valodzka](https://github.com/valodzka)
|
|
115
|
+
- Added almost_x_years datetime translation
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
- Улучшен перевод ActiveRecord [Dmitri Koulikoff](https://github.com/dima4p)
|
|
119
|
+
- Исправлена ошибка, возникающая при вложенных сообщениях валидации при использовании хака для Rails < 2.3.4 [valodzka](https://github.com/valodzka)
|
|
120
|
+
- Добавлен перевод для ключа даты/времени almost_x_years
|
|
121
|
+
|
|
122
|
+
## [0.2.2 ]- 2009.09.17
|
|
123
|
+
|
|
124
|
+
- Fix ^-prefixed error messages handling on Rails 2.3.4
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
- Для Rails 2.3.4 исправлена работа сообщений валидаций, начинающихся с "^"
|
|
128
|
+
|
|
129
|
+
## [0.2.1] - 2009.09.05
|
|
130
|
+
|
|
131
|
+
- Rails 2.3.4 compat (ActiveRecord::Error) and deprecation warning (use errors.full_messages.format from now on) [Alexander Semyonov](https://github.com/alsemyonov)/Yaroslav Markin
|
|
132
|
+
- Added a couple of missing translations from Rails 2.3.4
|
|
133
|
+
- transliteration: Ы now transforms to Y [Alex Fortuna](https://github.com/dadooda)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
- Совместимость с Rails 2.3.4 (ActiveRecord::Error) и устаревшее форматирование через "^" (теперь надо использовать errors.full_messages.format) [Alexander Semyonov](https://github.com/alsemyonov)/Yaroslav Markin]
|
|
137
|
+
- Добавлена пара недостающих переводов из Rails 2.3.4
|
|
138
|
+
- транслитерация: Ы теперь превращается в Y [Alex Fortuna](https://github.com/dadooda)
|
|
139
|
+
|
|
140
|
+
## [0.2.0] - 2009.03.16
|
|
141
|
+
|
|
142
|
+
- number_to_human_size() translations: using edge format (Rails 2.3)
|
|
143
|
+
- i18n gem updated (0.1.3)
|
|
144
|
+
- Rails 2.3 compat
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
- Перевод для number_to_human_size(): испольуется форматирование из edge (Rails 2.3)
|
|
148
|
+
- Обновлен gem i18n до версии 0.1.3
|
|
149
|
+
- Совместимость с Rails 2.3
|
|
150
|
+
|
|
151
|
+
## [0.1.3] - 2008.12.27
|
|
152
|
+
|
|
153
|
+
- Add support.array.words_connector/two_words_connector/last_word_connector (Array#to_sentence) (Rails Edge)
|
|
154
|
+
- Add datetime.prompts translations (Rails Edge)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
- Добавлены переводы для Array#to_sentence (Rails Edge)
|
|
158
|
+
- Добавлены переводы для datetime.prompts (Rails Edge)
|
|
159
|
+
|
|
160
|
+
## [0.1.2] - 2008.12.04
|
|
161
|
+
|
|
162
|
+
Fixed I18n.load_path ordering, translations shipped with russian gem will no longer overwrite your own translations (thanks Dmitrij Smalko for bugreport).
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
Поправлено добавление переводов russian в I18n.load_path, теперь переводы из russian не будут замещать ваши собственные переводы (спасибо Dmitrij Smalko за обнаружение ошибки).
|
|
166
|
+
|
|
167
|
+
## [0.1.1] - 2008.11.24
|
|
168
|
+
|
|
169
|
+
Added number.human.storage_units translation key (Rails Edge).
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
Добавлен ключ number.human.storage_units (появился в Rails Edge).
|
|
173
|
+
|
|
174
|
+
## [0.1.0] - 2008.11.22
|
|
175
|
+
|
|
176
|
+
No changes, Rails 2.2 released
|
|
177
|
+
|
|
178
|
+
## [0.0.9] - 2008.11.21
|
|
179
|
+
|
|
180
|
+
- Updated I18n gem due to locale changes (0.1.1)
|
|
181
|
+
- NB! I18n changed default locale from :'en-US' to :'en', same recommended for other locales by default
|
|
182
|
+
- NB!! Russian locale is now :'ru' NOT :'ru-RU', update your locale files.
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
- I18n gem обновился до 0.1.1 в связи с изменениями в названиях локалей
|
|
186
|
+
- ВНИМАНИЕ: локаль по умолчанию I18n теперь называется не :'en-US' а :'en', такой же способ именования рекомендуется и для других локалей
|
|
187
|
+
- ВНИМАНИЕ! Локаль русского языка теперь называется :'ru' а не :'ru-RU'. Не забудьте обновить ваши файлы переводов.
|
|
188
|
+
|
|
189
|
+
## [0.0.8] - 2008.11.20
|
|
190
|
+
|
|
191
|
+
- Introduce transliteration (Russian.translit, Russian.transliterate)
|
|
192
|
+
- Add an ActiveSupport hack for #parameterize
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
- Добавилась поддержка транслитерации (Russian.translit, Russian.transliterate)
|
|
196
|
+
- Добавился хак для #parameterize ActiveSupport (генерация "красивых" URL)
|
|
197
|
+
|
|
198
|
+
## [0.0.7] - 2008.11.09
|
|
199
|
+
|
|
200
|
+
- Updated I18n gem
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
- Новая версия gem I18n
|
data/Gemfile
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
gem 'i18n', '>= 0.5.0'
|
|
5
|
-
gem 'rspec', '~> 2.7.0'
|
|
3
|
+
source "https://rubygems.org"
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
gem
|
|
5
|
+
gemspec
|
|
6
|
+
gem "rails", "~> 8.1.0"
|
|
9
7
|
|
|
8
|
+
eval_gemfile "gemfiles/standard.gemfile"
|
data/LICENSE
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Copyright (c) 2008
|
|
1
|
+
Copyright (c) 2008 Yaroslav Markin
|
|
2
2
|
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
4
|
a copy of this software and associated documentation files (the
|
|
@@ -17,4 +17,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
17
17
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
18
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
19
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# gem russian
|
|
2
|
+
|
|
3
|
+
**Russian language support for Ruby and Rails**: localization, date and time handling, pluralization, and improved Russian language support in Rails.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
**Поддержка русского языка для Ruby и Rails**: локализация, работа с датой и временем, плюрализация, локализация, улучшенная поддержка русского языка в Rails.
|
|
7
|
+
|
|
8
|
+
[](https://github.com/yaroslav/russian/actions/workflows/ci.yml)
|
|
9
|
+
[](https://rubydoc.info/gems/russian)
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Russian date and time localization** (`strftime`)
|
|
14
|
+
- **Russian date and time parsing** (`strptime`)
|
|
15
|
+
- Correct Russian **pluralization** (`"1 вещь"`, `"9 вешей"`)
|
|
16
|
+
- **Cyrillic transliteration** (`transliterate`)
|
|
17
|
+
- A simple proxy for the `i18n` gem with the Russian locale enforced
|
|
18
|
+
|
|
19
|
+
With Ruby on Rails:
|
|
20
|
+
|
|
21
|
+
- All necessary **Russian localization** through Rails’ built-in mechanisms (`i18n`)
|
|
22
|
+
- **Support for contextual month names in date and time helpers** (`[Март ↓] [2026 ↓]`, but `[01 ↓] [марта ↓] [2026 ↓]`)
|
|
23
|
+
- **Custom validation error messages** without the attribute name at the beginning (`"You need to accept the license agreement"` instead of something like `"License agreement accepted must be present"`)
|
|
24
|
+
- Working Russian **pluralization**
|
|
25
|
+
- Working Russian **transliteration**, which can also be used for `to_param` when building “pretty” URLs (`posts/42-privet-mir`)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
## Что умеет
|
|
29
|
+
|
|
30
|
+
- **Русская локализация даты и времени** (`strftime`)
|
|
31
|
+
- **Разбор даты и времени** на русском языке (`strptime`)
|
|
32
|
+
- Корректную **плюрализацию** для русского языка ("1 вещь", "9 вещей")
|
|
33
|
+
- **Транслитерация** кириллицы (`transliterate`)
|
|
34
|
+
- Простой прокси для gem i18n с явным пробросом русской локали
|
|
35
|
+
|
|
36
|
+
С Ruby on Rails:
|
|
37
|
+
|
|
38
|
+
- Всю необходимую **локализацию на русский язык** через встроенные в Rails механизмы (gem i18n)
|
|
39
|
+
- **Поддержка контекстных имен месяцев в хелперах** выбора даты и времени (`[Март ↓] [2026 ↓]`, но `[01 ↓] [марта ↓] [2026 ↓]`)
|
|
40
|
+
- **Особые сообщения об ошибках валидации** без явного названия атрибута в начале ("Нужно принять лицензионное соглашение", вместо чего-то вроде "Лицензионное соглашение принято должно присутствовать")
|
|
41
|
+
- Рабочая **плюрализация** для русского языка
|
|
42
|
+
- Рабочая **транслитерация** для русского языка, которая в том числе может использоваться для `to_param` при составлении "красивых" URL (`posts/42-privet-mir`)
|
|
43
|
+
|
|
44
|
+
## When to use
|
|
45
|
+
|
|
46
|
+
- Your application is entirely in Russian or another Cyrillic language
|
|
47
|
+
- Your application supports only a small number of languages, and **Russian is one of them or the primary one**
|
|
48
|
+
|
|
49
|
+
When not to use it:
|
|
50
|
+
|
|
51
|
+
- Your application targets many languages or uses unusual or complex I18n backends
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
## Когда стоит использовать
|
|
55
|
+
|
|
56
|
+
- **Приложение целиком на русском** или другом кириллическом языке
|
|
57
|
+
- Приложение поддерживает небольшое количество языков, но **русский — один из них или основной**
|
|
58
|
+
|
|
59
|
+
Когда не стоит использовать:
|
|
60
|
+
|
|
61
|
+
- Приложение сделано для большого количества языков или использует нестандартные или сложные бэкенды для I18n.
|
|
62
|
+
|
|
63
|
+
# Требования
|
|
64
|
+
|
|
65
|
+
- Современные версии Ruby и Rails. На момент написания — Ruby 3.2+ или 4.0+, Rails 7.2, 8.0, 8.1;
|
|
66
|
+
- Использование с Ruby on Rails не обязательно
|
|
67
|
+
- Используйте более ранние версии для устаревших и неподдерживаемых версий Ruby и Rails
|
|
68
|
+
|
|
69
|
+
# Установка
|
|
70
|
+
|
|
71
|
+
Для установки:
|
|
72
|
+
|
|
73
|
+
Через Bundler:
|
|
74
|
+
|
|
75
|
+
```sh
|
|
76
|
+
bundle add russian
|
|
77
|
+
bundle install
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Чтобы задать русскую локаль по умолчанию в вашем приложении, укажите
|
|
81
|
+
|
|
82
|
+
```ruby
|
|
83
|
+
I18n.default_locale = :ru
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Чтобы установить локаль для текущего Ruby thread, используйте
|
|
87
|
+
|
|
88
|
+
```ruby
|
|
89
|
+
I18n.locale = :ru
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Ruby on Rails
|
|
93
|
+
|
|
94
|
+
После установки через Bundler, укажите
|
|
95
|
+
|
|
96
|
+
```ruby
|
|
97
|
+
config.i18n.default_locale = :ru
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
в `config/application.rb`. Если по умолчанию нужна другая локаль, или же нужно переключать локали "на ходу", используйте методы модуля I18n.
|
|
101
|
+
|
|
102
|
+
Также ознакомьтесь с [гидом по интернационализации Ruby on Rails](https://guides.rubyonrails.org/i18n.html).
|
|
103
|
+
|
|
104
|
+
# Использование
|
|
105
|
+
|
|
106
|
+
gem russian можно использовать как с Ruby on Rails, так и отдельно: с любым другим веб-фреймворком, или в любом другом приложении. gem i18n, который Ruby on Rails использует для интернационализации, включен в gem russian как зависимость.
|
|
107
|
+
|
|
108
|
+
## Примеры и справка по переводам (I18n)
|
|
109
|
+
|
|
110
|
+
Небольшую справку по переводам (I18n) и пример того, как можно переводить имена моделей, атрибутов, и многие другие вещи, определенные в Rails или I18n, можно посмотреть в директории [lib/russian/locale](https://github.com/yaroslav/russian/tree/master/lib/russian/locale). Там находятся файлы переводов, которые используются в Russian, со всеми комментариями.
|
|
111
|
+
|
|
112
|
+
## Вспомогательные методы модуля Russian
|
|
113
|
+
|
|
114
|
+
### `locale`
|
|
115
|
+
|
|
116
|
+
Возвращает локаль русского языка (`:'ru'`).
|
|
117
|
+
|
|
118
|
+
```ruby
|
|
119
|
+
Russian.locale
|
|
120
|
+
Russian::LOCALE
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### `init_i18n`
|
|
124
|
+
|
|
125
|
+
Выполняется автоматически при загрузке. Добавление русских переводов в путь загрузки стандартного бэкенда I18n, включение модулей для плюрализации и транслитерации и перегрузка I18n.
|
|
126
|
+
|
|
127
|
+
```ruby
|
|
128
|
+
Russian::init_i18n
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### `translate` / `t`
|
|
132
|
+
|
|
133
|
+
Прокси для метода `translate` I18n, форсирует использование русской локали.
|
|
134
|
+
|
|
135
|
+
Поддерживаются и современный вызов с keyword args, и "старый" вызов с positional hash:
|
|
136
|
+
|
|
137
|
+
```ruby
|
|
138
|
+
Russian.translate(:"date.formats.default")
|
|
139
|
+
Russian.t(:"date.formats.default", scope: :foo)
|
|
140
|
+
Russian.t(:"date.formats.default", {scope: :foo})
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### `localize` / `l`
|
|
144
|
+
|
|
145
|
+
Прокси для метода `localize` I18n, форсирует использование русской локали.
|
|
146
|
+
|
|
147
|
+
Поддерживаются и современный вызов с keyword args, и старый вызов с positional hash:
|
|
148
|
+
|
|
149
|
+
```ruby
|
|
150
|
+
Russian.localize(Date.new(1985, 12, 1), format: :long)
|
|
151
|
+
Russian.l(Date.new(1985, 12, 1), {format: :long})
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### `strftime`
|
|
155
|
+
|
|
156
|
+
`strftime` с форсированием русской локали (упрощенный вариант `localize`)
|
|
157
|
+
|
|
158
|
+
```ruby
|
|
159
|
+
Russian.strftime(Time.new(2008, 9, 1, 11, 12, 43, "+03:00"), format: :long)
|
|
160
|
+
Russian.strftime(Time.new(2008, 9, 1, 11, 12, 43, "+03:00"), {format: :long})
|
|
161
|
+
|
|
162
|
+
Russian::strftime(Time.new(2008, 9, 1, 11, 12, 43, "+03:00"))
|
|
163
|
+
=> "Пн, 01 сент. 2008, 11:12:43 +0300"
|
|
164
|
+
Russian::strftime(Time.new(2008, 9, 1, 11, 12, 43, "+03:00"), "%d %B")
|
|
165
|
+
=> "01 сентября"
|
|
166
|
+
Russian::strftime(Time.new(2008, 9, 1, 11, 12, 43, "+03:00"), "%B")
|
|
167
|
+
=> "Сентябрь"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### `date_strptime` / `time_strptime` / `datetime_strptime`
|
|
171
|
+
|
|
172
|
+
Локализованные `strptime`-хелперы для `Date`, `Time` и `DateTime` для разбора даты и времени.
|
|
173
|
+
|
|
174
|
+
Понимают русские названия месяцев и дней недели, включая case-insensitive ввод.
|
|
175
|
+
`format` у `date_strptime` и `datetime_strptime` можно опустить, а `now`
|
|
176
|
+
у `time_strptime` остается опциональным, как и в `Time.strptime`.
|
|
177
|
+
Все остальные `%`-директивы обрабатываются нативными parser'ами Ruby:
|
|
178
|
+
`Date.strptime`, `Time.strptime` и `DateTime.strptime`.
|
|
179
|
+
|
|
180
|
+
```ruby
|
|
181
|
+
Russian.date_strptime("01 апреля 2011", "%d %B %Y")
|
|
182
|
+
=> #<Date: 2011-04-01 ...>
|
|
183
|
+
Russian.time_strptime("пт, 01 апр. 2011 23:45:05 +0300", "%a, %d %b %Y %H:%M:%S %z")
|
|
184
|
+
=> 2011-04-01 23:45:05 +0300
|
|
185
|
+
Russian.datetime_strptime("Пятница, 01 апреля 2011 23:45:05 +0300", "%A, %d %B %Y %H:%M:%S %z")
|
|
186
|
+
=> #<DateTime: 2011-04-01T23:45:05+03:00 ...>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### `pluralize` / `p`
|
|
190
|
+
|
|
191
|
+
Упрощенная плюрализация для русского языка.
|
|
192
|
+
|
|
193
|
+
```ruby
|
|
194
|
+
Russian.pluralize(1, "вещь", "вещи", "вещей")
|
|
195
|
+
=> "вещь"
|
|
196
|
+
Russian.p(2, "вещь", "вещи", "вещей")
|
|
197
|
+
=> "вещи"
|
|
198
|
+
Russian.p(10, "вещь", "вещи", "вещей")
|
|
199
|
+
=> "вещей"
|
|
200
|
+
Russian.p(3.14, "вещь", "вещи", "вещей", "вещи") # последний вариант используется для дробных величин
|
|
201
|
+
=> "вещи"
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### `transliterate` / `translit`
|
|
205
|
+
|
|
206
|
+
Транслитерация русских букв в строке.
|
|
207
|
+
|
|
208
|
+
```ruby
|
|
209
|
+
Russian.translit("рубин")
|
|
210
|
+
=> "rubin"
|
|
211
|
+
Russian.transliterate("Hallo Юлику Тарханову")
|
|
212
|
+
=> "Hallo Yuliku Tarhanovu"
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Ruby on Rails
|
|
216
|
+
|
|
217
|
+
Если gem russian используется внутри Rails, интеграция с Rails подключается автоматически через и применяется сразу же, если нужные части фреймворка уже загружены. Для современных версий Rails это дает два эффекта:
|
|
218
|
+
|
|
219
|
+
После загрузки можно использовать все стандартные функции библиотеки I18n, пользоваться измененным функционалом для лучшей поддержки русского языка, или использовать хелперы модуля Russian для еще более простой работы с русским языком.
|
|
220
|
+
|
|
221
|
+
### Переводы
|
|
222
|
+
|
|
223
|
+
При использовании с Ruby on Rails загружаются все стандартные переводы, и русский язык становится годным к использованию для локализации. В поставку включены все нужные переводы для ActionView, ActiveRecord, ActiveSupport, ActiveModel, которые можно переопределять по необходимости стандартными средствами I18n из вашего приложения.
|
|
224
|
+
|
|
225
|
+
### Хелперы
|
|
226
|
+
|
|
227
|
+
Хелперы даты-времени получают ключ `:use_standalone_month_names` для форсирования отображения отдельностоящего названия месяца ("Сентябрь" а не "сентября"). Такое имя месяца используется, когда включен ключ `:use_standalone_month_names`, либо когда есть ключ `:discard_day`. Для русской локали `select_month` всегда использует отдельностоящие имена месяцев.
|
|
228
|
+
|
|
229
|
+
### Валидация
|
|
230
|
+
|
|
231
|
+
На тот случай, если по каким-то причинам нельзя воспользоваться ключом `full_messages.format` в таблице переводов, Russian перегружает вывод "полных сообщений" об ошибках в ActiveModel.
|
|
232
|
+
|
|
233
|
+
Так, например,
|
|
234
|
+
|
|
235
|
+
```ruby
|
|
236
|
+
validates :accepted_terms, acceptance: {message: "нужно принять соглашение"}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
при валидации выдаст сообщение
|
|
240
|
+
|
|
241
|
+
```text
|
|
242
|
+
Accepted terms нужно принять соглашение
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
или, например
|
|
246
|
+
|
|
247
|
+
```text
|
|
248
|
+
Соглашение об использовании нужно принять соглашение
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
если вы указали перевод для имени атрибута.
|
|
252
|
+
|
|
253
|
+
Но
|
|
254
|
+
|
|
255
|
+
```ruby
|
|
256
|
+
validates :accepted_terms, acceptance: {message: "^Нужно принять соглашение"}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
даст сообщение
|
|
260
|
+
|
|
261
|
+
```text
|
|
262
|
+
Нужно принять соглашение
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Параметризация строк
|
|
266
|
+
|
|
267
|
+
Метод `parameterize` инфлектора ActiveSupport использует механизмы транслитерации I18n. Если русская локаль является текущей, он сможет поддерживать транслитерацию букв русского алфавита.
|
|
268
|
+
|
|
269
|
+
Пример:
|
|
270
|
+
|
|
271
|
+
```erb
|
|
272
|
+
class Person
|
|
273
|
+
def to_param
|
|
274
|
+
"#{id}-#{name.parameterize}"
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
@person = Person.find(1)
|
|
279
|
+
# => #<Person id: 1, name: "Дональд Кнут">
|
|
280
|
+
|
|
281
|
+
<%= link_to(@person.name, person_path(@person)) %>
|
|
282
|
+
# => <a href="/person/1-donald-knut">Дональд Кнут</a>
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
# Историческая справка
|
|
286
|
+
|
|
287
|
+
gem russian проектировалась для полноценной поддержки русского языка (форматирование даты и времени, плюрализация, транслит, локализация в целом) для Ruby и Ruby on Rails. Приоритет: построить полноценную среду для русской локализации Ruby и Rails проектов, при этом используя минимально возможное количество хаков, сохраняя при этом поддержку локализации приложения на другие языки, а также форсировать включение в основную ветку I18n и Rails всех функций локализации, необходимых для работы с русским языком. Вместе с командой gem i18n решено было обкатывать решение для русского языка на отдельном gem/плагине, и по мере возможности переносить наиболее общий функционал в "родительскую" библиотеку i18n. Таким образом, общей целью gem russian стала поддержка русского языка до тех пор, пока она не появится в самом I18n.
|
|
288
|
+
|
|
289
|
+
Библиотека I18n входит в состав Ruby on Rails начиная с версии 2.2. I18n — это самое простое и недеструктивное решение для локализации и интернационализации Rails приложений. К сожалению, в первых версиях отсутствовала поддержка нескольких важных возможностей, специфичных для русского языка. Таким образом, русский язык для локализации в Rails 2.2 фактически не поддерживался.
|
|
290
|
+
|
|
291
|
+
Для исправления этого досадного недоразумения появилась библиотека Russian. Ранее Russian включал в себя собственный бекенд для перегрузки форматирования даты-времени (использование названия месяца или дня недели в зависимости от контекста) и плюрализации (стандартный бекенд поддерживал только плюрализацию для английского языка), несколько хаков для Rails 2.2/2.3 (ActionView, ActiveRecord, ActiveSupport), полную локализацию даты-времени и таблицы переводов Rails на русский язык, и вспомогательные модули (плюрализация и транслитерация).
|
|
292
|
+
|
|
293
|
+
В версии 0.2 `gem i18n` наконец появились первые средства для поддержки русского языка: во многом, из-за gem russian была добавлена поддержка lambda-переводов, благодаря которой стало возможным вынести логику перевода названия месяца/дня недели в таблицу переводов. Далее в `gem i18n` появилась поддержка хранения правил плюрализации в таблице переводов (опять же, с помощью lambda-переводов) и правил транслитерации.
|
|
294
|
+
|
|
295
|
+
**Сейчас использование gem russian для русскоязычных приложений — скорее комфорт, а не абсолютная необходимость.** Некоторые из возможностей gem russian никогда не появятся в Rails из коробки.
|
|
296
|
+
|
|
297
|
+
# Разработка и тестирование
|
|
298
|
+
|
|
299
|
+
Для локального запуска:
|
|
300
|
+
|
|
301
|
+
Тесты:
|
|
302
|
+
|
|
303
|
+
```sh
|
|
304
|
+
bundle exec rspec
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Линтер:
|
|
308
|
+
|
|
309
|
+
```sh
|
|
310
|
+
bundle exec standardrb
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
Rails-интеграцию можно проверять отдельно по gemfile для нужной версии Rails:
|
|
314
|
+
|
|
315
|
+
```sh
|
|
316
|
+
BUNDLE_GEMFILE=gemfiles/rails_7_2.gemfile bundle exec rspec
|
|
317
|
+
BUNDLE_GEMFILE=gemfiles/rails_8_0.gemfile bundle exec rspec
|
|
318
|
+
BUNDLE_GEMFILE=gemfiles/rails_8_1.gemfile bundle exec rspec
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
# Авторы и благодарности
|
|
322
|
+
|
|
323
|
+
[Ярослав Маркин](http://yaroslav.io) при участии: [Юлика Тарханова](https://blog.julik.nl), Евгения Пименова, [Дмитрия Смалько](https://github.com/dsmalko), [Алексея Фортуны](https://github.com/dadooda), [Антона Агеева](https://github.com/antage), [Александра Семенова](https://github.com/alsemyonov), [valodzka](https://github.com/valodzka), [Николая Немшилова](https://github.com/MadRabbit), [Дмитрия Куликова](https://github.com/dima4p), [Алексея Саварцова](https://github.com/asavartsov), [Андрея Новикова](https://github.com/Envek), [Игоря Бочкарева](https://github.com/ujifgc), [Валентина Васильева](https://github.com/Valve).
|
|
324
|
+
|
|
325
|
+
Огромное спасибо:
|
|
326
|
+
|
|
327
|
+
[Юлику Тарханову](http://julik.nl) за [rutils](https://github.com/julik/rutils).
|
data/Rakefile
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
require
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/gem_tasks"
|
|
4
|
+
require "rspec/core/rake_task"
|
|
5
|
+
require "standard/rake"
|
|
6
|
+
require "yard"
|
|
4
7
|
|
|
5
|
-
task :default => :spec
|
|
6
8
|
desc "Run specs"
|
|
7
|
-
RSpec::Core::RakeTask.new
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
10
|
+
|
|
11
|
+
desc "Build YARD documentation"
|
|
12
|
+
YARD::Rake::YardocTask.new(:yard)
|
|
13
|
+
|
|
14
|
+
desc "Run lint and specs"
|
|
15
|
+
task ci: %i[standard spec]
|
|
16
|
+
|
|
17
|
+
task default: %i[standard spec]
|