russian 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,44 +1,219 @@
1
1
  h1. Russian
2
2
 
3
- Russian language support for Ruby and Rails, using I18n library (also shipped in Rails 2.2+).
3
+ Поддержка русского языка для Ruby и Rails при помощи библиотеки I18n.
4
4
 
5
- Поддержка русского языка для Ruby и Rails при помощи библиотеки I18n (также входит в состав Rails 2.2+)
5
+ Russian language support for Ruby and Rails, using I18n library.
6
6
 
7
7
  h3. If you don't speak Russian
8
8
 
9
- This code may still be useful for you. You can learn how to create custom backends for I18n and how to
10
- provide support of "standalone" (as defined in "Unicode CLDR":http://unicode.org/cldr/) month names with I18n and Rails, and also how to add dead simple pluralization rules into your translation tables.
9
+ This code may still be useful for you and Ruby I18n community. You can learn how to create custom backends for I18n and how to provide support of "standalone" (as defined in "Unicode CLDR":http://unicode.org/cldr/) month names with I18n and Rails, and also how to add dead simple pluralization rules into your translation tables. This library also includes a module (@Russian@) with a set of helpers to provide simplistic pluralization and @strftime@ for Russian language -- in a way that is easier than using I18n methods.
10
+
11
+ Feel free to shoot an email to Yaroslav Markin ("yaroslav@markin.net":mailto:yaroslav@markin.net)
11
12
 
12
13
  h1. Что это
13
14
 
14
15
  Russian -- это библиотека для полноценной поддержки русского языка (форматирование даты и времени, плюрализация, локализация в целом) для Ruby и Ruby on Rails.
15
16
 
16
- Для этого используется библиотека I18n, несколько хаков поверх нее и файлы переводов.
17
+ Цель проекта -- построить полноценную среду для русской локализации Ruby и Rails проектов, при этом используя минимально возможное количество хаков, сохраняя при этом поддержку локализации приложения на другие языки, а также форсировать включение в основную ветку I18n и Rails всех функций локализации, необходимых для работы с русским языком.
18
+
19
+ Russian использует библиотеку I18n (включена в поставку), несколько хаков поверх нее (собственный бекэнд с поддержкой спецефичного для русского форматирования даты и времени, поддержкой плюрализации), несколько хаков поверх Rails (хаки хелперов даты-времени, хак для сообщений валидации) и файлы переводов, а также набор хелперов, упрощающий работу с русским языком (простая плюрализация, простой strftime и др.).
20
+
21
+ Russian стремится быть минимально деструктивной для окружения и быть полностью совместимой с другими языками (таким образом, когда приложение использует Russian и собственный бекэнд Russian, оно остается польностью совместимым с Rails i18n).
22
+
23
+ h2. Что такое I18n
24
+
25
+ Библиотека I18n входит в состав Ruby on Rails начиная с версии 2.2. В перспективе I18n -- это самое простое и недеструктивное решение для локализации и интернационализации Rails приложений, но в текущей версии отсутствовала поддержка нескольких важных возможностей, специфичных для русского языка. Таким образом, русский язык для локализации в Rails 2.2 фактически не поддерживался.
17
26
 
18
- I18n входит в состав Ruby on Rails начиная с версии 2.2, но на момент публикации нормальная поддержка русского языка отсутствовала.
27
+ Для исправления этого досадного недоразумения появилась библиотека Russian (подробнее см. _Использование_).
28
+
29
+ h1. Требования
30
+
31
+ * Ruby 1.8 (тестировалось на 1.8.6);
32
+ * Для использования с Rails нужна версия не ниже 2.2;
33
+ * Для тестирования библиотеки вам понадобится RSpec.
19
34
 
20
35
  h1. Установка
21
36
 
22
- TODO: пути на GitHub, публикация на RubyForge
37
+ Страница Russian на github -- "http://github.com/yaroslav/russian/":http://github.com/yaroslav/russian/
38
+
39
+ Russian можно установить как gem с github. Для этого:
40
+
41
+ 1. Нужно добавить репозиторий gem'ов github в качестве источника
23
42
 
24
- * gem rubyforge
25
- * gem github
43
+ @gem sources -a http://gems.github.com@
44
+
45
+ 2. Установить gem
46
+
47
+ @gem install yaroslav-russian@
48
+
49
+ Gem @russian@ также зеркалируется на RubyForge, поэтому его можно установить командой
50
+
51
+ @gem install russian@.
26
52
 
27
53
  h2. Ruby on Rails
28
54
 
29
- * gem
30
- * plugin github
55
+ Существует два варианта использования Russian вместе с Rails:
56
+
57
+ 1. Установка gem
58
+
59
+ В файле @config/environment.rb@ сделайте ссылку на gem @yaroslav-russian@ с github:
60
+
61
+ <pre><code>
62
+ Rails::Initializer.run do |config|
63
+ config.gem 'yaroslav-russian', :lib => 'russian', :source => 'http://gems.github.com'
64
+ end
65
+ </code></pre>
66
+
67
+ Чтобы установить gem, используйте команду
68
+
69
+ @rake gems:install@.
70
+
71
+ 2. Установка плагина
72
+
73
+ Для того, чтобы установить Russian как плагин к Rails, используйте команду
74
+
75
+ @script/plugin install git://github.com/yaroslav/russian.git@
76
+
77
+ _NB:_ вполне вероятно, что на Windows нет нормальной реализации git, поэтому вам придется загружать исходники
78
+ в виде архива с github или же просто использовать gem.
31
79
 
32
80
  h1. Использование
33
81
 
34
- * Прозрачное: локаль по умолчанию, свой бекенд (недеструктивный)
35
- * Хелперы Russian.*
82
+ При загрузке Russian включает:
83
+
84
+ * библиотеку I18n если она еще не используется (например, если Russian используется отдельно от Rails)
85
+ * собственный класс для I18n бекэнда (полностью совместим со стандартным бекэндом)
86
+ * перегрузку хелперов даты для Rails (если Rails загружен)
87
+ * пререгрузку обработки сообщений валидации для ActiveRecord (если Rails загружен)
88
+
89
+ При инициализации:
90
+
91
+ * заменяется бэкэнд I18n со стандартного на собственный бекэнд Russian (@I18n::Backend::Advanced@)
92
+ * _NB:_ локаль русского языка (@ru-RU@) становится локалью по умолчанию
93
+ * загружаются все файлы переводов, в том числе переводы для Rails.
94
+
95
+ После этого можно использовать все стандартные функции библиотеки I18n, пользоваться измененным функицоналом для лучшей поддержки русского языка, или использовать хелперы модуля Russian для еще более простой работы с русским языком.
96
+
97
+ h2. Отличия от стандартной библиотеки I18n
98
+
99
+ 1. Поддержка двух видов названий месяцев -- контекст ("сентября") и отдельностоящее ("Сентябрь").
100
+
101
+ Для этого перегружена функция локализации, теперь название месяца используется в зависимости от контекста. В словарях Russian определены оба варианта.
102
+
103
+ Перегрузка недеструктивная: если для какого-то другого языка не определены два варианта названий месяцев, ошибки не возникнет.
104
+
105
+ Аналогично есть поддержка двух видов названий дней недели.
106
+
107
+ 2. Плюрализация
108
+
109
+ Стандартно I18n поддерживается только плюрализация по английским правилам; бекэнд, использующийся в Russian, позволяет каждому языку определять правила плюрализации в таблице переводов, задавая их как @Proc@.
110
+
111
+ Перегрузка недеструктивная: если правила в таблице нет, используется правило по умолчанию (английский язык).
112
+
113
+ Правила для русского языка включены.
114
+
115
+ h1. Справочник
116
+
117
+ h2. Вспомогательные методы модуля Russian
118
+
119
+ <pre></code>
120
+ Russian.locale
121
+ Russian::LOCALE
122
+ </code></pre>
123
+
124
+ -- возвращает локаль русского языка (@ru-RU@).
125
+
126
+ <pre></code>
127
+ Russian::i18n_backend_class
128
+ </code></pre>
129
+
130
+ -- возвращает класс собственного бекенда I18n
131
+
132
+ <pre></code>
133
+ Russian::init_i18n
134
+ </code></pre>
135
+
136
+ -- инициализация Russian. Включение бекэнда, русский язык по умолчанию, загрузка переводов.
137
+
138
+ _NB:_ Выполняется автоматически при загрузке.
139
+
140
+ <pre></code>
141
+ Russian::translate
142
+ Russian::t
143
+ </code></pre>
144
+
145
+ -- прокси для метода @translate@ I18n, форсирует использование русской локали.
146
+
147
+ <pre></code>
148
+ Russian::localize
149
+ Russian::l
150
+ </code></pre>
151
+
152
+ -- прокси для метода @localize@ I18n, форсирует использование русской локали.
153
+
154
+ <pre></code>
155
+ Russian::strftime
156
+
157
+ Russian::strftime(Time.now)
158
+ => "Пн, 01 сент. 2008, 11:12:43 +0300"
159
+ Russian::strftime(Time.now, "%B")
160
+ => "Сентябрь"
161
+ </code></pre>
162
+
163
+ -- @strftime@ с форсированием русской локали (упрощенный вариант @localize@)
164
+
165
+ <pre></code>
166
+ Russian::pluralize
167
+ Russian::p
168
+
169
+ Russian.p(1, "вещь", "вещи", "вещей")
170
+ => "вещь"
171
+ Russian.p(2, "вещь", "вещи", "вещей")
172
+ => "вещи"
173
+ Russian.p(10, "вещь", "вещи", "вещей")
174
+ => "вещей"
175
+ </code></pre>
176
+
177
+ -- упрощенная (без использования хешей I18n) плюрализация для русского языка
36
178
 
37
179
  h2. Ruby on Rails
38
180
 
39
- * Стандартный язык для I18n
40
- * Перегрузка хелперов
181
+ h3. Переводы
182
+
183
+ При использовании с Ruby on Rails загружаются все стандартные переводы, и русский язык становится годным к использованию для локализации. В поставку включены все нужные переводы для ActionView, ActiveRecord, ActiveSupport, которые можно переопределять по необходимости стандартными средствами I18n.
184
+
185
+ h3. Хелперы
186
+
187
+ Хелперы даты-времени получают ключ @:use_standalone_month_names@ для форсирования отображения отдельностоящего названия месяца ("Сентябрь" а не "сентября"). Такое имя месяца используется когда включен ключ @:use_standalone_month_names@ (для отдельностоящего @select_month@ он включается по умолчанию), либо когда есть ключ @:discard_day@.
188
+
189
+ h3. Валидация
190
+
191
+ Обработка ошибок в ActiveRecord перегружается -- в Russian включен популярный плагин custom_error_message, с помощью которого можно переопределять стандартное отображение сообщений об ошибках. Так, например,
192
+
193
+ @validates_acceptance_of :accepted_terms, :message => 'нужно принять соглашение'@
194
+
195
+ даст сообщение
196
+
197
+ @Accepted terms нужно принять соглашение@
198
+
199
+ или, например
200
+
201
+ @Соглашение об использовании нужно принять соглашение@
202
+
203
+ если вы указали перевод для имени атрибута.
204
+
205
+ Но
206
+
207
+ @validates_acceptance_of :accepted_terms, :message => '^Нужно принять соглашение'@
208
+
209
+ даст сообщение
210
+
211
+ @Нужно принять соглашение@
212
+
213
+ _NB:_ в сообщениях валидации можно использовать такие макросы как @{{attribute}}@, @{{value}}@ -- подробнее см. документацию по I18n.
41
214
 
42
215
  h1. Автор
43
216
 
44
- Ярослав Маркин ("yaroslav@markin.net":mailto:yaroslav@markin.net)
217
+ Для сообщений об ошибках, обнаруженных неточностях и предложений:
218
+
219
+ Ярослав Маркин ("yaroslav@markin.net":mailto:yaroslav@markin.net)
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'rubygems/specification'
5
5
  require 'date'
6
6
 
7
7
  GEM = "russian"
8
- GEM_VERSION = "0.0.1"
8
+ GEM_VERSION = "0.0.2"
9
9
  AUTHOR = "Yaroslav Markin"
10
10
  EMAIL = "yaroslav@markin.net"
11
11
  HOMEPAGE = "http://github.com/yaroslav/russian/"
data/TODO CHANGED
@@ -1,8 +1,9 @@
1
1
  TODO
2
2
  ====
3
- * docs and README (english - brief, full russian doc)
4
3
  * check Unicode CLDR to ensure all datetime formats are correct
4
+ * examples of custom translations, AR models/attributes/messages translations
5
5
  * refactor Advanced backend localize method (looks ugly)
6
+ * Countries list
6
7
 
7
8
  Questionable
8
9
  ============
@@ -13,7 +13,7 @@ module Russian
13
13
  module VERSION
14
14
  MAJOR = 0
15
15
  MINOR = 0
16
- TINY = 1
16
+ TINY = 2
17
17
 
18
18
  STRING = [MAJOR, MINOR, TINY].join('.')
19
19
  end
@@ -67,6 +67,7 @@ module Russian
67
67
  variants_hash = pluralization_variants_to_hash(*variants)
68
68
  I18n.backend.send(:pluralize, LOCALE, variants_hash, n)
69
69
  end
70
+ alias :p :pluralize
70
71
 
71
72
  protected
72
73
  # Returns all locale files shipped with library
@@ -1,4 +1,14 @@
1
- # Replaces Rails select_month helper and translated_month_names private method to provide
1
+ # Заменяет хелпер Rails <tt>select_month</tt> и метод <tt>translated_month_names</tt>
2
+ # для поддержки функционала "отдельностоящих имен месяцев".
3
+ #
4
+ # Теперь можно использовать и полные, и сокращенные название месяцев в двух вариантах -- контекстном
5
+ # (по умолчанию) и отдельностоящем (если в текущем языке есть соответствующие переводы).
6
+ # Теперь хелперы поддерживают ключ <tt>:use_standalone_month_names</tt>, хелпер <tt>select_month</tt>
7
+ # устанавливает его по умолчанию.
8
+ # Отдельностоящие имена месяцев также используютс когда указан ключ <tt>:discard_day</tt>.
9
+ #
10
+ #
11
+ # Replaces Rails <tt>select_month</tt> helper and <tt>translated_month_names</tt> private method to provide
2
12
  # "standalone month names" feature.
3
13
  #
4
14
  # It is now possible to use both abbreviated and full month names in two variants (if current locale provides them).
@@ -20,6 +30,11 @@ if defined?(ActionView::Helpers::DateTimeSelector) && ActionView::Helpers::DateT
20
30
  # force standalone month names usage by using <tt>:use_standalone_month_names</tt> key.
21
31
  # Override the field name using the <tt>:field_name</tt> option, 'month' by default.
22
32
  #
33
+ #
34
+ # Также поддерживается ключ <tt>:use_standalone_month_names</tt> для явного указания о необходимости
35
+ # использования отдельностоящих имен месяцев, если текущий язык их поддерживает.
36
+ #
37
+ #
23
38
  # ==== Examples
24
39
  # # Generates a select field for months that defaults to the current month that
25
40
  # # will use keys like "January", "March".
@@ -64,6 +79,11 @@ if defined?(ActionView::Helpers::DateTimeSelector) && ActionView::Helpers::DateT
64
79
  #
65
80
  # Also looks up if <tt>:discard_day</tt> or <tt>:use_standalone_month_names</tt> option is set
66
81
  # and uses i18n standalone month names if so.
82
+ #
83
+ #
84
+ # Также в зависимости от использования ключей <tt>:discard_day</tt> или <tt>:use_standalone_month_names</tt>
85
+ # убеждается, есть ли соотвествующие переводы в текущем языке и использует "отдельностоящие" названия
86
+ # месяцев по необходимости
67
87
  def translated_month_names
68
88
  begin
69
89
  if @options[:use_short_month]
@@ -9,6 +9,26 @@ if defined?(ActiveRecord::Errors)
9
9
  # Non-base messages are prefixed with the attribute name as usual UNLESS they begin with '^'
10
10
  # in which case the attribute name is omitted.
11
11
  # E.g. validates_acceptance_of :accepted_terms, :message => '^Please accept the terms of service'
12
+ #
13
+ #
14
+ # Переопределяет метод ActiveRecord::Errors::full_messages. Сообщения об ошибках для атрибутов
15
+ # теперь не имеют префикса с названием атрибута если в сообщении об ошибке первым символом указан "^".
16
+ #
17
+ # Так, например,
18
+ #
19
+ # validates_acceptance_of :accepted_terms, :message => 'нужно принять соглашение'
20
+ #
21
+ # даст сообщение
22
+ #
23
+ # Accepted terms нужно принять соглашение
24
+ #
25
+ # однако,
26
+ #
27
+ # validates_acceptance_of :accepted_terms, :message => '^Нужно принять соглашение'
28
+ #
29
+ # даст сообщение
30
+ #
31
+ # Нужно принять соглашение
12
32
  def full_messages
13
33
  full_messages = []
14
34
 
@@ -1,9 +1,17 @@
1
1
  module I18n
2
2
  module Backend
3
+ # "Продвинутый" бекэнд для I18n.
4
+ #
5
+ # Наследует Simple бекэнд и полностью с ним совместим. Добаляет поддержку
6
+ # для отдельностоящих/контекстных названий дней недели и месяцев.
7
+ # Также позволяет каждому языку использовать собственные правила плюрализации,
8
+ # объявленные как Proc (<tt>lambda</tt>).
9
+ #
10
+ #
3
11
  # Advanced I18n backend.
4
12
  #
5
- # Extends <tt>Simple</tt> backend. Allows usage of <tt>standalone_*</tt> keys
6
- # for DateTime localization and usage of user-defined <tt>Proc</tt> (lambda) pluralization
13
+ # Extends Simple backend. Allows usage of "standalone" keys
14
+ # for DateTime localization and usage of user-defined Proc (lambda) pluralization
7
15
  # methods in translation tables.
8
16
  class Advanced < Simple
9
17
  LOCALIZE_ABBR_MONTH_NAMES_MATCH = /(%d|%e)?(\s*)(%b)/
@@ -15,8 +23,13 @@ module I18n
15
23
  # formatted date string. Takes a key from the date/time formats
16
24
  # translations as a format argument (<em>e.g.</em>, <tt>:short</tt> in <tt>:'date.formats'</tt>).
17
25
  #
18
- # Note that it differs from <tt>localize</tt> in <tt>Simple</tt> backend by checking for
19
- # <tt>standalone_*</tt> month name/day name keys in translation and using them if available.
26
+ #
27
+ # Метод отличается от <tt>localize</tt> в Simple бекэнде поддержкой
28
+ # отдельностоящих/контекстных названий дней недели и месяцев.
29
+ #
30
+ #
31
+ # Note that it differs from <tt>localize</tt> in Simple< backend by checking for
32
+ # "standalone" month name/day name keys in translation and using them if available.
20
33
  def localize(locale, object, format = :default)
21
34
  raise ArgumentError, "Object must be a Date, DateTime or Time object. #{object.inspect} given." unless object.respond_to?(:strftime)
22
35
 
@@ -65,6 +78,19 @@ module I18n
65
78
  end
66
79
 
67
80
  protected
81
+ # Использует правила плюрализации из таблицы переводов для языка (если присутствуют),
82
+ # иначе использует правило плюрализации по умолчанию (английский язык).
83
+ #
84
+ # Пример задания правила в таблице переводов:
85
+ #
86
+ # store_translations :'en-US', {
87
+ # :pluralize => lambda { |n| n == 1 ? :one : :other }
88
+ # }
89
+ #
90
+ # Правило должно возвращать один из символов для таблицы переводов:
91
+ # :zero, :one, :two, :few, :many, :other
92
+ #
93
+ #
68
94
  # Picks a pluralization rule specified in translation tables for a language or
69
95
  # uses default pluralization rules.
70
96
  #
@@ -1,5 +1,8 @@
1
1
  ru-RU:
2
2
  number:
3
+ # Используется в number_with_delimiter()
4
+ # Также является установками по умолчанию для 'currency', 'percentage', 'precision', 'human'
5
+ #
3
6
  # Used in number_with_delimiter()
4
7
  # These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
5
8
  format:
@@ -13,6 +16,9 @@ ru-RU:
13
16
  # Used in number_to_currency()
14
17
  currency:
15
18
  format:
19
+ # Формат отображения валюты и обозначение самой валюты
20
+ #
21
+ #
16
22
  # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
17
23
  format: "%n %u"
18
24
  unit: "руб."
@@ -45,6 +51,9 @@ ru-RU:
45
51
  delimiter: ""
46
52
  precision: 1
47
53
 
54
+ # Используется в хелперах distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
55
+ #
56
+ #
48
57
  # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
49
58
  datetime:
50
59
  distance_in_words:
@@ -100,14 +109,20 @@ ru-RU:
100
109
  many: "больше {{count}} лет"
101
110
  other: "больше {{count}} лет"
102
111
 
112
+ # Используется в хелпере error_messages_for
103
113
  activerecord:
104
114
  errors:
105
115
  template:
116
+ # Заголовок сообщения об ошибке
106
117
  header:
107
118
  one: "{{model}} не удалось сохранить из-за 1 ошибки"
108
119
  few: "{{model}} не удалось сохранить из-за {{count}} ошибок"
109
120
  many: "{{model}} не удалось сохранить из-за {{count}} ошибок"
110
121
  other: "{{model}} не удалось сохранить из-за {{count}} ошибок"
122
+
123
+ # Первый параграф сообщения об ошибке. Можно использовать макрос {{count}}
124
+ #
125
+ #
111
126
  # The variable :count is also available
112
127
  body: "Проблемы возникли со следующими полями:"
113
128
 
@@ -1,6 +1,15 @@
1
1
  ru-RU:
2
2
  activerecord:
3
+ # Сообщения об ошибке (валидации) ActiveRecord
3
4
  errors:
5
+ # Для всех сообщений доступны макросы {{model}}, {{attribute}}, {{value}}.
6
+ # Для некоторых доступен макрос {{count}} -- в этом случае можно задать несколько вариантов
7
+ # сообщения (плюрализация)
8
+ #
9
+ # Также можно использовать сообщения, начинающиеся с "^" -- в этом случае
10
+ # в списке ошибок валидации перед конкретным сообщением не будет выводиться имя атрибута.
11
+ #
12
+ #
4
13
  # The values :model, :attribute and :value are always available for interpolation
5
14
  # The value :count is available when applicable. Can be used for pluralization.
6
15
  #
@@ -15,20 +24,20 @@ ru-RU:
15
24
  empty: "не может быть пустым"
16
25
  blank: "не может быть пустым"
17
26
  too_long:
18
- one: "слишком большой длины (допустимая длина - менее 1 символа)"
19
- few: "слишком большой длины (допустимая длина - менее {{count}} символов)"
20
- many: "слишком большой длины (допустимая длина - менее {{count}} символов)"
21
- other: "слишком большой длины (допустимая длина - менее {{count}} символов)"
27
+ one: "слишком большой длины (не может быть больше чем 1 символ)"
28
+ few: "слишком большой длины (не может быть больше чем {{count}} символа)"
29
+ many: "слишком большой длины (не может быть больше чем {{count}} символов)"
30
+ other: "слишком большой длины (не может быть больше чем {{count}} символа)"
22
31
  too_short:
23
- one: "недостаточной длины (допустимая длина - более 1 символа)"
24
- few: "недостаточной длины (допустимая длина - более {{count}} символов)"
25
- many: "недостаточной длины (допустимая длина - более {{count}} символов)"
26
- other: "недостаточной длины (допустимая длина - более {{count}} символов)"
32
+ one: "недостаточной длины (не может быть меньше 1 символа)"
33
+ few: "недостаточной длины (не может быть меньше {{count}} символов)"
34
+ many: "недостаточной длины (не может быть меньше {{count}} символов)"
35
+ other: "недостаточной длины (не может быть меньше {{count}} символов)"
27
36
  wrong_length:
28
- one: "неверной длины (допустимая длина - ровно 1 символ)"
29
- few: "неверной длины (допустимая длина - ровно {{count}} символа)"
30
- many: "неверной длины (допустимая длина - ровно {{count}} символов)"
31
- other: "неверной длины (допустимая длина - ровно {{count}} символа)"
37
+ one: "неверной длины (может быть длиной ровно 1 символ)"
38
+ few: "неверной длины (может быть длиной ровно {{count}} символа)"
39
+ many: "неверной длины (может быть длиной ровно {{count}} символов)"
40
+ other: "неверной длины (может быть длиной ровно {{count}} символа)"
32
41
  taken: "уже существует"
33
42
  not_a_number: "не является числом"
34
43
  greater_than: "может иметь значение большее {{count}}"
@@ -38,11 +47,20 @@ ru-RU:
38
47
  less_than_or_equal_to: "может иметь значение меньшее или равное {{count}}"
39
48
  odd: "может иметь лишь четное значение"
40
49
  even: "может иметь лишь нечетное значение"
50
+ # Можно добавить собственные сообщения об ошибке тут или в конкексте модели/атрибутов (ниже)
51
+ #
52
+ #
41
53
  # Append your own errors here or at the model/attributes scope.
42
54
 
43
- models:
44
- # Overrides default messages
55
+ models:
56
+ # Перегрузка названий моделей
57
+ #
58
+ #
59
+ # Overrides default messages
45
60
 
46
- attributes:
47
- # Overrides model and default messages.
61
+ attributes:
62
+ # Перегрузка сообщений атрибутов
63
+ #
64
+ #
65
+ # Overrides model and default messages.
48
66
 
@@ -1,4 +1,7 @@
1
1
  ru-RU:
2
+ # Используется в array.to_sentence
3
+ #
4
+ #
2
5
  # Used in array.to_sentence.
3
6
  support:
4
7
  array:
@@ -1,29 +1,46 @@
1
1
  ru-RU:
2
2
  date:
3
3
  formats:
4
+ # Форматы указываются в виде, поддерживаемом strftime.
5
+ # По умолчанию используется default.
6
+ # Можно добавлять собственные форматы
7
+ #
8
+ #
4
9
  # Use the strftime parameters for formats.
5
10
  # When no format has been given, it uses default.
6
11
  # You can provide other formats here if you like!
7
12
  default: "%d.%m.%Y"
8
13
  short: "%d %b"
9
14
  long: "%d %B %Y"
10
-
15
+
16
+ # Названия дней недели -- контекстные и отдельностоящие
11
17
  day_names: [воскресенье, понедельник, вторник, среда, четверг, пятница, суббота]
12
18
  standalone_day_names: [Воскресенье, Понедельник, Вторник, Среда, Четверг, Пятница, Суббота]
13
19
  abbr_day_names: [Вс, Пн, Вт, Ср, Чт, Пт, Сб]
14
-
20
+
21
+ # Названия месяцев -- сокращенные и полные, плюс отдельностоящие.
22
+ # Не забудьте nil в начале массиве (~)
23
+ #
24
+ #
15
25
  # Don't forget the nil at the beginning; there's no such thing as a 0th month
16
26
  month_names: [~, января, февраля, марта, апреля, мая, июня, июля, августа, сентября, октября, ноября, декабря]
17
27
  standalone_month_names: [~, Январь, Февраль, Март, Апрель, Май, Июнь, Июль, Август, Сентябрь, Октябрь, Ноябрь, Декабрь]
18
28
  abbr_month_names: [~, янв., февр., марта, апр., мая, июня, июля, авг., сент., окт., нояб., дек.]
19
29
  standalone_abbr_month_names: [~, янв., февр., март, апр., май, июнь, июль, авг., сент., окт., нояб., дек.]
30
+
31
+ # Порядок компонентов даты для хелперов
32
+ #
33
+ #
20
34
  # Used in date_select and datime_select.
21
35
  order: [ :day, :month, :year ]
22
36
 
23
37
  time:
38
+ # Форматы времени
24
39
  formats:
25
40
  default: "%a, %d %b %Y, %H:%M:%S %z"
26
41
  short: "%d %b, %H:%M"
27
42
  long: "%d %B %Y, %H:%M"
43
+
44
+ # am/pm решено перевести как "утра/вечера" :)
28
45
  am: "утра"
29
46
  pm: "вечера"
@@ -1,6 +1,9 @@
1
1
  {
2
2
  :'ru-RU' => {
3
3
  :pluralize => lambda { |n|
4
+ # Правило плюрализации для русского языка, взято из CLDR, http://unicode.org/cldr/
5
+ #
6
+ #
4
7
  # Russian language pluralization rules, taken from CLDR project, http://unicode.org/cldr/
5
8
  #
6
9
  # one -> n mod 10 is 1 and n mod 100 is not 11;
@@ -117,25 +117,27 @@ describe Russian do
117
117
  end
118
118
  end
119
119
 
120
- describe "pluralize" do
121
- it "should pluralize with variants given" do
122
- variants = %w(вещь вещи вещей)
120
+ describe "with pluralization" do
121
+ %w(p pluralize).each do |method|
122
+ it "'#{method}' should pluralize with variants given" do
123
+ variants = %w(вещь вещи вещей)
124
+
125
+ Russian.send(method, 1, *variants).should == "вещь"
126
+ Russian.send(method, 2, *variants).should == 'вещи'
127
+ Russian.send(method, 3, *variants).should == 'вещи'
128
+ Russian.send(method, 5, *variants).should == 'вещей'
129
+ Russian.send(method, 10, *variants).should == 'вещей'
130
+ Russian.send(method, 21, *variants).should == 'вещь'
131
+ Russian.send(method, 29, *variants).should == 'вещей'
132
+ Russian.send(method, 129, *variants).should == 'вещей'
133
+ Russian.send(method, 131, *variants).should == 'вещь'
134
+ end
123
135
 
124
- Russian.pluralize(1, *variants).should == "вещь"
125
- Russian.pluralize(2, *variants).should == 'вещи'
126
- Russian.pluralize(3, *variants).should == 'вещи'
127
- Russian.pluralize(5, *variants).should == 'вещей'
128
- Russian.pluralize(10, *variants).should == 'вещей'
129
- Russian.pluralize(21, *variants).should == 'вещь'
130
- Russian.pluralize(29, *variants).should == 'вещей'
131
- Russian.pluralize(129, *variants).should == 'вещей'
132
- Russian.pluralize(131, *variants).should == 'вещь'
133
- end
134
-
135
- it "should raise an exception when there are not enough variants" do
136
- lambda { Russian.pluralize(1) }.should raise_error(ArgumentError)
137
- lambda { Russian.pluralize(1, "вещь") }.should raise_error(ArgumentError)
138
- lambda { Russian.pluralize(1, "вещь", "вещи") }.should raise_error(ArgumentError)
136
+ it "should raise an exception when there are not enough variants" do
137
+ lambda { Russian.send(method, 1) }.should raise_error(ArgumentError)
138
+ lambda { Russian.send(method, 1, "вещь") }.should raise_error(ArgumentError)
139
+ lambda { Russian.send(method, 1, "вещь", "вещи") }.should raise_error(ArgumentError)
140
+ end
139
141
  end
140
142
  end
141
143
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: russian
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yaroslav Markin