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 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
- source :rubygems
1
+ # frozen_string_literal: true
2
2
 
3
- gem 'rake'
4
- gem 'i18n', '>= 0.5.0'
5
- gem 'rspec', '~> 2.7.0'
3
+ source "https://rubygems.org"
6
4
 
7
- # Rails 3+
8
- gem 'activesupport', '~> 3.0.0'
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-2011 Yaroslav Markin
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
+ [![CI](https://github.com/yaroslav/russian/actions/workflows/ci.yml/badge.svg)](https://github.com/yaroslav/russian/actions/workflows/ci.yml)
9
+ [![Docs](https://img.shields.io/badge/yard-docs-blue.svg)](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
- require 'rubygems'
2
- require 'rspec/core/rake_task'
3
- require 'rubygems/specification'
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 do |t|
8
- t.pattern = FileList['spec/**/*_spec.rb']
9
- t.rspec_opts = %w(-fs --color)
10
- end
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]