russian 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +191 -16
- data/Rakefile +1 -1
- data/TODO +2 -1
- data/lib/russian.rb +2 -1
- data/lib/russian/action_view_ext/helpers/date_helper.rb +21 -1
- data/lib/russian/active_record_ext/custom_error_message.rb +20 -0
- data/lib/russian/backend/advanced.rb +30 -4
- data/lib/russian/locale/actionview.yml +15 -0
- data/lib/russian/locale/activerecord.yml +34 -16
- data/lib/russian/locale/activesupport.yml +3 -0
- data/lib/russian/locale/datetime.yml +19 -2
- data/lib/russian/locale/pluralize.rb +3 -0
- data/spec/russian_spec.rb +20 -18
- metadata +1 -1
data/README.textile
CHANGED
@@ -1,44 +1,219 @@
|
|
1
1
|
h1. Russian
|
2
2
|
|
3
|
-
|
3
|
+
Поддержка русского языка для Ruby и Rails при помощи библиотеки I18n.
|
4
4
|
|
5
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
25
|
-
|
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
|
-
|
30
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
217
|
+
Для сообщений об ошибках, обнаруженных неточностях и предложений:
|
218
|
+
|
219
|
+
Ярослав Маркин ("yaroslav@markin.net":mailto:yaroslav@markin.net)
|
data/Rakefile
CHANGED
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
|
============
|
data/lib/russian.rb
CHANGED
@@ -13,7 +13,7 @@ module Russian
|
|
13
13
|
module VERSION
|
14
14
|
MAJOR = 0
|
15
15
|
MINOR = 0
|
16
|
-
TINY =
|
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
|
-
#
|
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
|
6
|
-
# for DateTime localization and usage of user-defined
|
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
|
-
#
|
19
|
-
# <tt>
|
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: "слишком большой длины (
|
19
|
-
few: "слишком большой длины (
|
20
|
-
many: "слишком большой длины (
|
21
|
-
other: "слишком большой длины (
|
27
|
+
one: "слишком большой длины (не может быть больше чем 1 символ)"
|
28
|
+
few: "слишком большой длины (не может быть больше чем {{count}} символа)"
|
29
|
+
many: "слишком большой длины (не может быть больше чем {{count}} символов)"
|
30
|
+
other: "слишком большой длины (не может быть больше чем {{count}} символа)"
|
22
31
|
too_short:
|
23
|
-
one: "недостаточной длины (
|
24
|
-
few: "недостаточной длины (
|
25
|
-
many: "недостаточной длины (
|
26
|
-
other: "недостаточной длины (
|
32
|
+
one: "недостаточной длины (не может быть меньше 1 символа)"
|
33
|
+
few: "недостаточной длины (не может быть меньше {{count}} символов)"
|
34
|
+
many: "недостаточной длины (не может быть меньше {{count}} символов)"
|
35
|
+
other: "недостаточной длины (не может быть меньше {{count}} символов)"
|
27
36
|
wrong_length:
|
28
|
-
one: "неверной длины (
|
29
|
-
few: "неверной длины (
|
30
|
-
many: "неверной длины (
|
31
|
-
other: "неверной длины (
|
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
|
-
|
44
|
-
|
55
|
+
models:
|
56
|
+
# Перегрузка названий моделей
|
57
|
+
#
|
58
|
+
#
|
59
|
+
# Overrides default messages
|
45
60
|
|
46
|
-
|
47
|
-
|
61
|
+
attributes:
|
62
|
+
# Перегрузка сообщений атрибутов
|
63
|
+
#
|
64
|
+
#
|
65
|
+
# Overrides model and default messages.
|
48
66
|
|
@@ -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;
|
data/spec/russian_spec.rb
CHANGED
@@ -117,25 +117,27 @@ describe Russian do
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
describe "
|
121
|
-
|
122
|
-
|
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
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
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
|