synergy_russian 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/CHANGELOG +113 -0
  2. data/LICENSE +20 -0
  3. data/README.textile +272 -0
  4. data/Rakefile +55 -0
  5. data/TODO +10 -0
  6. data/init.rb +3 -0
  7. data/lib/russian.rb +118 -0
  8. data/lib/russian/action_view_ext/helpers/date_helper.rb +112 -0
  9. data/lib/russian/active_record_ext/custom_error_message.rb +163 -0
  10. data/lib/russian/active_support_ext/parameterize.rb +31 -0
  11. data/lib/russian/backend/advanced.rb +134 -0
  12. data/lib/russian/locale/actionview.yml +162 -0
  13. data/lib/russian/locale/activerecord.yml +95 -0
  14. data/lib/russian/locale/activesupport.yml +16 -0
  15. data/lib/russian/locale/datetime.yml +49 -0
  16. data/lib/russian/locale/pluralize.rb +25 -0
  17. data/lib/russian/transliteration.rb +72 -0
  18. data/lib/vendor/i18n/MIT-LICENSE +20 -0
  19. data/lib/vendor/i18n/README.textile +20 -0
  20. data/lib/vendor/i18n/Rakefile +5 -0
  21. data/lib/vendor/i18n/i18n.gemspec +27 -0
  22. data/lib/vendor/i18n/lib/i18n.rb +199 -0
  23. data/lib/vendor/i18n/lib/i18n/backend/simple.rb +214 -0
  24. data/lib/vendor/i18n/lib/i18n/exceptions.rb +53 -0
  25. data/lib/vendor/i18n/test/all.rb +5 -0
  26. data/lib/vendor/i18n/test/i18n_exceptions_test.rb +100 -0
  27. data/lib/vendor/i18n/test/i18n_test.rb +125 -0
  28. data/lib/vendor/i18n/test/locale/en.rb +1 -0
  29. data/lib/vendor/i18n/test/locale/en.yml +3 -0
  30. data/lib/vendor/i18n/test/simple_backend_test.rb +568 -0
  31. data/spec/fixtures/en.yml +4 -0
  32. data/spec/fixtures/ru.yml +4 -0
  33. data/spec/i18n/locale/datetime_spec.rb +99 -0
  34. data/spec/i18n/locale/pluralization_spec.rb +28 -0
  35. data/spec/locale_spec.rb +129 -0
  36. data/spec/russian_spec.rb +136 -0
  37. data/spec/spec_helper.rb +7 -0
  38. data/spec/transliteration_spec.rb +51 -0
  39. metadata +102 -0
@@ -0,0 +1,162 @@
1
+ ru:
2
+ number:
3
+ # Используется в number_with_delimiter()
4
+ # Также является установками по умолчанию для 'currency', 'percentage', 'precision', 'human'
5
+ #
6
+ # Used in number_with_delimiter()
7
+ # These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
8
+ format:
9
+ # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5)
10
+ separator: "."
11
+ # Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three)
12
+ delimiter: " "
13
+ # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
14
+ precision: 3
15
+
16
+ # Used in number_to_currency()
17
+ currency:
18
+ format:
19
+ # Формат отображения валюты и обозначение самой валюты
20
+ #
21
+ #
22
+ # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
23
+ format: "%n %u"
24
+ unit: "руб."
25
+ # These three are to override number.format and are optional
26
+ separator: "."
27
+ delimiter: " "
28
+ precision: 2
29
+
30
+ # Used in number_to_percentage()
31
+ percentage:
32
+ format:
33
+ # These three are to override number.format and are optional
34
+ # separator:
35
+ delimiter: ""
36
+
37
+ # Used in number_to_precision()
38
+ precision:
39
+ format:
40
+ # These three are to override number.format and are optional
41
+ # separator:
42
+ delimiter: ""
43
+ # precision:
44
+
45
+ # Used in number_to_human_size()
46
+ human:
47
+ format:
48
+ # These three are to override number.format and are optional
49
+ # separator:
50
+ delimiter: ""
51
+ precision: 1
52
+
53
+ # Rails 2.2
54
+ # storage_units: [байт, КБ, МБ, ГБ, ТБ]
55
+
56
+ # Rails 2.3
57
+ storage_units:
58
+ # Storage units output formatting.
59
+ # %u is the storage unit, %n is the number (default: 2 MB)
60
+ format: "%n %u"
61
+ units:
62
+ byte:
63
+ one: "байт"
64
+ few: "байта"
65
+ many: "байт"
66
+ other: "байта"
67
+ kb: "КБ"
68
+ mb: "МБ"
69
+ gb: "ГБ"
70
+ tb: "ТБ"
71
+
72
+ # Используется в хелперах distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
73
+ #
74
+ #
75
+ # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
76
+ datetime:
77
+ distance_in_words:
78
+ half_a_minute: "меньше минуты"
79
+ less_than_x_seconds:
80
+ one: "меньше %{count} секунды"
81
+ few: "меньше %{count} секунд"
82
+ many: "меньше %{count} секунд"
83
+ other: "меньше %{count} секунды"
84
+ x_seconds:
85
+ one: "%{count} секунда"
86
+ few: "%{count} секунды"
87
+ many: "%{count} секунд"
88
+ other: "%{count} секунды"
89
+ less_than_x_minutes:
90
+ one: "меньше %{count} минуты"
91
+ few: "меньше %{count} минут"
92
+ many: "меньше %{count} минут"
93
+ other: "меньше %{count} минуты"
94
+ x_minutes:
95
+ one: "%{count} минуту"
96
+ few: "%{count} минуты"
97
+ many: "%{count} минут"
98
+ other: "%{count} минуты"
99
+ about_x_hours:
100
+ one: "около %{count} часа"
101
+ few: "около %{count} часов"
102
+ many: "около %{count} часов"
103
+ other: "около %{count} часа"
104
+ x_days:
105
+ one: "%{count} день"
106
+ few: "%{count} дня"
107
+ many: "%{count} дней"
108
+ other: "%{count} дня"
109
+ about_x_months:
110
+ one: "около %{count} месяца"
111
+ few: "около %{count} месяцев"
112
+ many: "около %{count} месяцев"
113
+ other: "около %{count} месяца"
114
+ x_months:
115
+ one: "%{count} месяц"
116
+ few: "%{count} месяца"
117
+ many: "%{count} месяцев"
118
+ other: "%{count} месяца"
119
+ about_x_years:
120
+ one: "около %{count} года"
121
+ few: "около %{count} лет"
122
+ many: "около %{count} лет"
123
+ other: "около %{count} лет"
124
+ over_x_years:
125
+ one: "больше %{count} года"
126
+ few: "больше %{count} лет"
127
+ many: "больше %{count} лет"
128
+ other: "больше %{count} лет"
129
+ almost_x_years:
130
+ one: "почти %{count} год"
131
+ few: "почти %{count} года"
132
+ many: "почти %{count} лет"
133
+ other: "почти %{count} лет"
134
+ prompts:
135
+ year: "Год"
136
+ month: "Месяц"
137
+ day: "День"
138
+ hour: "Часов"
139
+ minute: "Минут"
140
+ second: "Секунд"
141
+
142
+ # Используется в хелпере error_messages_for
143
+ activerecord:
144
+ errors:
145
+ template:
146
+ # Заголовок сообщения об ошибке
147
+ header:
148
+ one: "%{model}: сохранение не удалось из-за %{count} ошибки"
149
+ few: "%{model}: сохранение не удалось из-за %{count} ошибок"
150
+ many: "%{model}: сохранение не удалось из-за %{count} ошибок"
151
+ other: "%{model}: сохранение не удалось из-за %{count} ошибки"
152
+
153
+ # Первый параграф сообщения об ошибке. Можно использовать макрос %{count}
154
+ #
155
+ #
156
+ # The variable :count is also available
157
+ body: "Проблемы возникли со следующими полями:"
158
+
159
+ support:
160
+ select:
161
+ # default value for :prompt => true in FormOptionsHelper
162
+ prompt: "Выберите: "
@@ -0,0 +1,95 @@
1
+ ru:
2
+ activerecord:
3
+ # Сообщения об ошибке (валидации) ActiveRecord
4
+ errors:
5
+ # Для всех сообщений доступны макросы %{model}, {{attribute}}, {{value}}.
6
+ # Для некоторых доступен макрос %{count} -- в этом случае можно задать несколько вариантов
7
+ # сообщения (плюрализация)
8
+ #
9
+ # Также можно использовать сообщения, начинающиеся с "^" -- в этом случае
10
+ # в списке ошибок валидации перед конкретным сообщением не будет выводиться имя атрибута.
11
+ #
12
+ #
13
+ # The values :model, :attribute and :value are always available for interpolation
14
+ # The value :count is available when applicable. Can be used for pluralization.
15
+ #
16
+ # You can use ^-prefixed messages as well to get rid of human attribute name appearing
17
+ # before your message in validation messages.
18
+ messages:
19
+ inclusion: "имеет непредусмотренное значение"
20
+ exclusion: "имеет зарезервированное значение"
21
+ invalid: "имеет неверное значение"
22
+ confirmation: "не совпадает с подтверждением"
23
+ accepted: "нужно подтвердить"
24
+ empty: "не может быть пустым"
25
+ blank: "не может быть пустым"
26
+ too_long:
27
+ one: "слишком большой длины (не может быть больше чем %{count} символ)"
28
+ few: "слишком большой длины (не может быть больше чем %{count} символа)"
29
+ many: "слишком большой длины (не может быть больше чем %{count} символов)"
30
+ other: "слишком большой длины (не может быть больше чем %{count} символа)"
31
+ too_short:
32
+ one: "недостаточной длины (не может быть меньше %{count} символа)"
33
+ few: "недостаточной длины (не может быть меньше %{count} символов)"
34
+ many: "недостаточной длины (не может быть меньше %{count} символов)"
35
+ other: "недостаточной длины (не может быть меньше %{count} символа)"
36
+ wrong_length:
37
+ one: "неверной длины (может быть длиной ровно %{count} символ)"
38
+ few: "неверной длины (может быть длиной ровно %{count} символа)"
39
+ many: "неверной длины (может быть длиной ровно %{count} символов)"
40
+ other: "неверной длины (может быть длиной ровно %{count} символа)"
41
+ taken: "уже существует"
42
+ not_a_number: "не является числом"
43
+ greater_than: "может иметь лишь значение большее %{count}"
44
+ greater_than_or_equal_to: "может иметь лишь значение большее или равное %{count}"
45
+ equal_to: "может иметь лишь значение, равное %{count}"
46
+ less_than: "может иметь лишь значение меньшее чем %{count}"
47
+ less_than_or_equal_to: "может иметь значение меньшее или равное %{count}"
48
+ odd: "может иметь лишь четное значение"
49
+ even: "может иметь лишь нечетное значение"
50
+ record_invalid: "Возникли ошибки: %{errors}"
51
+
52
+ full_messages:
53
+ format: "%{attribute} %{message}"
54
+
55
+ # Можно добавить собственные сообщения об ошибке тут или задавать их в контексте атрибута.
56
+ #
57
+ #
58
+ # Append your own errors here or at the model/attributes scope.
59
+ #
60
+ #
61
+ # Например,
62
+ # models:
63
+ # user:
64
+ # # Задает сообщение об ошибке (пустое значение) для атрибутов модели User
65
+ # # Можно использовать макросы %{model}, {{attribute}}.
66
+ # # Также можно использовать сообщения, начинающиеся с "^" -- в этом случае
67
+ # # в списке ошибок валидации перед конкретным сообщением не будет выводиться имя атрибута.
68
+ # blank: "собственное сообщение об ошибке (пустой атрибут) для модели %{model} и атрибута {{attribute}}"
69
+ # attributes:
70
+ # # Также можно задавать собственные сообщения об ошибке для конкретных атрибутов модели.
71
+ # # Ниже определим собственное сообщение об ошибке для атрибута name модели User.
72
+ # name:
73
+ # blank: "Атрибут %{attribute} особенный -- у него свое сообщение об ошибке при пустом атрибуте"
74
+ models:
75
+
76
+ # Перевод названий моделей. Используется в Model.human_name().
77
+ #
78
+ #models:
79
+ # Например,
80
+ # user: "Пользователь"
81
+ # переведет модель User как "Пользователь".
82
+ #
83
+ #
84
+ # Overrides default messages
85
+
86
+ # Перевод названий атрибутов моделей. Используется в Model.human_attribute_name(attribute).
87
+ #attributes:
88
+ # Например,
89
+ # user:
90
+ # name: "Имя"
91
+ # переведет атрибут name модели User как "Имя".
92
+ #
93
+ #
94
+ # Overrides model and default messages.
95
+
@@ -0,0 +1,16 @@
1
+ ru:
2
+ # Используется в array.to_sentence
3
+ #
4
+ #
5
+ # Used in array.to_sentence.
6
+ support:
7
+ array:
8
+ # Rails 2.2
9
+ sentence_connector: "и"
10
+ skip_last_comma: true
11
+
12
+ # Rails 2.3
13
+ words_connector: ", "
14
+ two_words_connector: " и "
15
+ last_word_connector: " и "
16
+
@@ -0,0 +1,49 @@
1
+ ru:
2
+ date:
3
+ formats:
4
+ # Форматы указываются в виде, поддерживаемом strftime.
5
+ # По умолчанию используется default.
6
+ # Можно добавлять собственные форматы
7
+ #
8
+ #
9
+ # Use the strftime parameters for formats.
10
+ # When no format has been given, it uses default.
11
+ # You can provide other formats here if you like!
12
+ default: "%d.%m.%Y"
13
+ short: "%d %b"
14
+ long: "%d %B %Y"
15
+
16
+ # Названия дней недели -- контекстные и отдельностоящие
17
+ day_names: [воскресенье, понедельник, вторник, среда, четверг, пятница, суббота]
18
+ standalone_day_names: [Воскресенье, Понедельник, Вторник, Среда, Четверг, Пятница, Суббота]
19
+ abbr_day_names: [Вс, Пн, Вт, Ср, Чт, Пт, Сб]
20
+
21
+ # Названия месяцев -- сокращенные и полные, плюс отдельностоящие.
22
+ # Не забудьте nil в начале массиве (~)
23
+ #
24
+ #
25
+ # Don't forget the nil at the beginning; there's no such thing as a 0th month
26
+ month_names: [~, января, февраля, марта, апреля, мая, июня, июля, августа, сентября, октября, ноября, декабря]
27
+ standalone_month_names: [~, Январь, Февраль, Март, Апрель, Май, Июнь, Июль, Август, Сентябрь, Октябрь, Ноябрь, Декабрь]
28
+ abbr_month_names: [~, янв., февр., марта, апр., мая, июня, июля, авг., сент., окт., нояб., дек.]
29
+ standalone_abbr_month_names: [~, янв., февр., март, апр., май, июнь, июль, авг., сент., окт., нояб., дек.]
30
+
31
+ # Порядок компонентов даты для хелперов
32
+ #
33
+ #
34
+ # Used in date_select and datime_select.
35
+ order:
36
+ - :day
37
+ - :month
38
+ - :year
39
+
40
+ time:
41
+ # Форматы времени
42
+ formats:
43
+ default: "%a, %d %b %Y, %H:%M:%S %z"
44
+ short: "%d %b, %H:%M"
45
+ long: "%d %B %Y, %H:%M"
46
+
47
+ # am/pm решено перевести как "утра/вечера" :)
48
+ am: "утра"
49
+ pm: "вечера"
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ {
4
+ :'ru' => {
5
+ :pluralize => lambda { |n|
6
+ # Правило плюрализации для русского языка, взято из CLDR, http://unicode.org/cldr/
7
+ #
8
+ #
9
+ # Russian language pluralization rules, taken from CLDR project, http://unicode.org/cldr/
10
+ #
11
+ # one -> n mod 10 is 1 and n mod 100 is not 11;
12
+ # few -> n mod 10 in 2..4 and n mod 100 not in 12..14;
13
+ # many -> n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14;
14
+ # other -> everything else
15
+ #
16
+ # Пример
17
+ #
18
+ # :one = 1, 21, 31, 41, 51, 61...
19
+ # :few = 2-4, 22-24, 32-34...
20
+ # :many = 0, 5-20, 25-30, 35-40...
21
+ # :other = 1.31, 2.31, 5.31...
22
+ n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,72 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Russian
4
+ # Russian transliteration
5
+ #
6
+ # Транслитерация для букв русского алфавита
7
+ module Transliteration
8
+ extend self
9
+
10
+ # Transliteration heavily based on rutils gem by Julian "julik" Tarkhanov and Co.
11
+ # <http://rutils.rubyforge.org/>
12
+ # Cleaned up and optimized.
13
+
14
+ LOWER_SINGLE = {
15
+ "і"=>"i","ґ"=>"g","ё"=>"yo","№"=>"#","є"=>"e",
16
+ "ї"=>"yi","а"=>"a","б"=>"b",
17
+ "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"zh",
18
+ "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
19
+ "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
20
+ "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
21
+ "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"'",
22
+ "ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
23
+ }
24
+ LOWER_MULTI = {
25
+ "ье"=>"ie",
26
+ "ьё"=>"ie",
27
+ }
28
+
29
+ UPPER_SINGLE = {
30
+ "Ґ"=>"G","Ё"=>"YO","Є"=>"E","Ї"=>"YI","І"=>"I",
31
+ "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
32
+ "Д"=>"D","Е"=>"E","Ж"=>"ZH","З"=>"Z","И"=>"I",
33
+ "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
34
+ "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
35
+ "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
36
+ "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"'","Ы"=>"Y","Ь"=>"",
37
+ "Э"=>"E","Ю"=>"YU","Я"=>"YA",
38
+ }
39
+ UPPER_MULTI = {
40
+ "ЬЕ"=>"IE",
41
+ "ЬЁ"=>"IE",
42
+ }
43
+
44
+ LOWER = (LOWER_SINGLE.merge(LOWER_MULTI)).freeze
45
+ UPPER = (UPPER_SINGLE.merge(UPPER_MULTI)).freeze
46
+ MULTI_KEYS = (LOWER_MULTI.merge(UPPER_MULTI)).keys.sort_by {|s| s.length}.reverse.freeze
47
+
48
+ # Transliterate a string with russian characters
49
+ #
50
+ # Возвращает строку, в которой все буквы русского алфавита заменены на похожую по звучанию латиницу
51
+ def transliterate(str)
52
+ chars = str.scan(%r{#{MULTI_KEYS.join '|'}|\w|.})
53
+
54
+ result = ""
55
+
56
+ chars.each_with_index do |char, index|
57
+ if UPPER.has_key?(char) && LOWER.has_key?(chars[index+1])
58
+ # combined case
59
+ result << UPPER[char].downcase.capitalize
60
+ elsif UPPER.has_key?(char)
61
+ result << UPPER[char]
62
+ elsif LOWER.has_key?(char)
63
+ result << LOWER[char]
64
+ else
65
+ result << char
66
+ end
67
+ end
68
+
69
+ result
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 The Ruby I18n team
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
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.