rutils 0.1.2 → 0.1.3
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.
- data/CHANGELOG +45 -0
- data/README +97 -36
- data/TODO +1 -16
- data/bin/gilensize +1 -1
- data/lib/countries/countries.rb +1772 -0
- data/lib/datetime/datetime.rb +60 -43
- data/lib/gilenson/gilenson.rb +594 -249
- data/lib/gilenson/gilenson_port.rb +287 -307
- data/lib/integration/rails_date_helper_override.rb +9 -31
- data/lib/integration/red_cloth_override.rb +2 -1
- data/lib/pluralizer/pluralizer.rb +213 -192
- data/lib/rutils.rb +23 -11
- data/lib/transliteration/transliteration.rb +148 -148
- data/test/run_tests.rb +2 -2
- data/test/t_datetime.rb +32 -6
- data/test/t_gilenson.rb +291 -29
- data/test/t_integration.rb +33 -33
- data/test/t_pluralize.rb +56 -49
- data/test/t_transliteration.rb +68 -68
- data/test/t_typografica.rb +46 -46
- metadata +5 -4
- data/test/t_binaries.rb +0 -26
@@ -1,45 +1,25 @@
|
|
1
1
|
if defined?(Object::ActionView)
|
2
|
-
module Object::ActionView
|
3
|
-
module Helpers
|
4
|
-
module DateHelper
|
2
|
+
module Object::ActionView::Helpers::DateHelper
|
5
3
|
|
6
|
-
#
|
7
|
-
# For example, if the distance is 47 minutes, it'll return
|
8
|
-
# "about 1 hour". See the source for the complete wording list.
|
4
|
+
# Заменяет ActionView::Helpers::DateHelper::distance_of_time_in_words на русское сообщение.
|
9
5
|
#
|
10
|
-
#
|
11
|
-
# <tt>distance_of_time_in_words(50)</tt>
|
12
|
-
#
|
13
|
-
# Set <tt>include_seconds</tt> to true if you want more detailed approximations if distance < 1 minute
|
6
|
+
# Целые числа интерпретируются как секунды
|
7
|
+
# <tt>distance_of_time_in_words(50)</tt> возвращает "меньше минуты".
|
14
8
|
|
15
9
|
alias :stock_distance_of_time_in_words :distance_of_time_in_words
|
16
10
|
def distance_of_time_in_words(*args)
|
17
11
|
RuTils::overrides_enabled? ? RuTils::DateTime::distance_of_time_in_words(*args) : stock_distance_of_time_in_words
|
18
12
|
end
|
19
13
|
|
20
|
-
#
|
21
|
-
def time_ago_in_words(from_time, include_seconds = false)
|
22
|
-
distance_of_time_in_words(from_time, Time.now, include_seconds)
|
23
|
-
end
|
24
|
-
|
25
|
-
# Returns a select tag with options for each of the months January through December with the current month selected.
|
26
|
-
# The month names are presented as keys (what's shown to the user) and the month numbers (1-12) are used as values
|
27
|
-
# (what's submitted to the server). It's also possible to use month numbers for the presentation instead of names --
|
28
|
-
# set the <tt>:use_month_numbers</tt> key in +options+ to true for this to happen. If you want both numbers and names,
|
29
|
-
# set the <tt>:add_month_numbers</tt> key in +options+ to true. Examples:
|
30
|
-
#
|
31
|
-
# select_month(Date.today) # Will use keys like "January", "March"
|
32
|
-
# select_month(Date.today, :use_month_numbers => true) # Will use keys like "1", "3"
|
33
|
-
# select_month(Date.today, :add_month_numbers => true) # Will use keys like "1 - January", "3 - March"
|
34
|
-
#
|
35
|
-
# Override the field name using the <tt>:field_name</tt> option, 'month' by default.
|
14
|
+
# Заменяет ActionView::Helpers::DateHelper::select_month меню выбора русской даты.
|
36
15
|
#
|
37
|
-
#
|
38
|
-
#
|
16
|
+
# select_month(Date.today) # Использует ключи "Январь", "Март"
|
17
|
+
# select_month(Date.today, :use_month_numbers => true) # Использует ключи "1", "3"
|
18
|
+
# select_month(Date.today, :add_month_numbers => true) # Использует ключи "1 - Январь", "3 - Март"
|
39
19
|
def select_month(date, options = {})
|
40
20
|
month_options = []
|
41
21
|
if RuTils::overrides_enabled?
|
42
|
-
month_names = options[:use_short_month] ?
|
22
|
+
month_names = options[:use_short_month] ? Date::RU_ABBR_MONTHNAMES : Date::RU_INFLECTED_MONTHNAMES
|
43
23
|
else
|
44
24
|
month_names = options[:use_short_month] ? Date::ABBR_MONTHNAMES : Date::MONTHNAMES
|
45
25
|
end
|
@@ -60,7 +40,5 @@ if defined?(Object::ActionView)
|
|
60
40
|
|
61
41
|
select_html(options[:field_name] || 'month', month_options, options[:prefix], options[:include_blank], options[:discard_type], options[:disabled])
|
62
42
|
end
|
63
|
-
end
|
64
|
-
end
|
65
43
|
end
|
66
44
|
end #endif
|
@@ -1,7 +1,8 @@
|
|
1
1
|
if defined?(Object::RedCloth)
|
2
2
|
# RuTils выполняет перегрузку Textile Glyphs в RedCloth, перенося форматирование спецсимволов на Gilenson.
|
3
3
|
class Object::RedCloth < String #:nodoc:
|
4
|
-
|
4
|
+
|
5
|
+
# Этот метод в RedCloth при наличии Гиленсона надо отключать
|
5
6
|
alias_method :stock_htmlesc, :htmlesc
|
6
7
|
def htmlesc(text, mode=0) #:nodoc:
|
7
8
|
RuTils::overrides_enabled? ? text : stock_htmlesc(text, mode)
|
@@ -1,215 +1,236 @@
|
|
1
1
|
module RuTils
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
module Pluralization #:nodoc:
|
3
|
+
# Выбирает нужный падеж существительного в зависимости от числа
|
4
|
+
def self.choose_plural(amount, *variants)
|
5
5
|
variant = (amount%10==1 && amount%100!=11 ? 1 : amount%10>=2 && amount%10<=4 && (amount%100<10 || amount%100>=20) ? 2 : 3)
|
6
6
|
variants[variant-1]
|
7
|
-
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.rublej(amount)
|
10
|
+
pts = []
|
11
|
+
|
12
|
+
pts << RuTils::Pluralization::sum_string(amount.to_i, 1, "рубль", "рубля", "рублей") unless amount.to_i == 0
|
13
|
+
if amount.kind_of?(Float)
|
14
|
+
remainder = (amount.divmod(1)[1]*100).round
|
15
|
+
if (remainder == 100)
|
16
|
+
pts = [RuTils::Pluralization::sum_string(amount.to_i+1, 1, 'рубль', 'рубля', 'рублей')]
|
17
|
+
else
|
18
|
+
pts << RuTils::Pluralization::sum_string(remainder.to_i, 2, 'копейка', 'копейки', 'копеек')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
pts.join(' ')
|
23
|
+
end
|
8
24
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
return "ноль " + five_items if amount == 0
|
25
|
+
# Выполняет преобразование числа из цифрого вида в символьное
|
26
|
+
# amount - числительное
|
27
|
+
# gender = 1 - мужской, = 2 - женский, = 3 - средний
|
28
|
+
# one_item - именительный падеж единственного числа (= 1)
|
29
|
+
# two_items - родительный падеж единственного числа (= 2-4)
|
30
|
+
# five_items - родительный падеж множественного числа ( = 5-10)
|
31
|
+
def self.sum_string(amount, gender, one_item='', two_items='', five_items='')
|
32
|
+
into = ''
|
33
|
+
tmp_val ||= 0
|
20
34
|
|
21
|
-
|
35
|
+
return "ноль " + five_items if amount == 0
|
22
36
|
|
23
|
-
|
24
|
-
into, tmp_val = sum_string_fn(into, tmp_val, gender, one_item, two_items, five_items)
|
37
|
+
tmp_val = amount
|
25
38
|
|
26
|
-
|
39
|
+
# единицы
|
40
|
+
into, tmp_val = sum_string_fn(into, tmp_val, gender, one_item, two_items, five_items)
|
27
41
|
|
28
|
-
|
29
|
-
into, tmp_val = sum_string_fn(into, tmp_val, 2, "тысяча", "тысячи", "тысяч")
|
42
|
+
return into if tmp_val == 0
|
30
43
|
|
31
|
-
|
44
|
+
# тысячи
|
45
|
+
into, tmp_val = sum_string_fn(into, tmp_val, 2, "тысяча", "тысячи", "тысяч")
|
32
46
|
|
33
|
-
|
34
|
-
into, tmp_val = sum_string_fn(into, tmp_val, 1, "миллион", "миллиона", "миллионов")
|
47
|
+
return into if tmp_val == 0
|
35
48
|
|
36
|
-
|
49
|
+
# миллионы
|
50
|
+
into, tmp_val = sum_string_fn(into, tmp_val, 1, "миллион", "миллиона", "миллионов")
|
37
51
|
|
38
|
-
|
39
|
-
into, tmp_val = sum_string_fn(into, tmp_val, 1, "миллиард", "миллиарда", "миллиардов")
|
40
|
-
return into
|
41
|
-
end
|
52
|
+
return into if tmp_val == 0
|
42
53
|
|
54
|
+
# миллиардов
|
55
|
+
into, tmp_val = sum_string_fn(into, tmp_val, 1, "миллиард", "миллиарда", "миллиардов")
|
56
|
+
return into
|
57
|
+
end
|
58
|
+
|
43
59
|
private
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
# сборка строки
|
134
|
-
st = ''
|
135
|
-
return [(st << hundreds.to_s << tens.to_s << ones.to_s << end_word.to_s << " " << into.to_s).strip, tmp_val]
|
136
|
-
end
|
137
|
-
|
138
|
-
# Реализует вывод прописью любого объекта, реализующего Float
|
139
|
-
module FloatFormatting
|
140
|
-
|
141
|
-
# Выдает сумму прописью с учетом дробной доли. Дробная доля округляется до миллионной, или (если
|
142
|
-
# дробная доля оканчивается на нули) до ближайшей доли ( 500 тысячных округляется до 5 десятых).
|
143
|
-
# Дополнительный аргумент - род существительного (1 - мужской, 2- женский, 3-средний)
|
144
|
-
def propisju(gender = 2)
|
145
|
-
raise "Это не число!" if self.nan?
|
146
|
-
|
147
|
-
st = RuTils::Pluralization::sum_string(self.to_i, gender, "целая", "целых", "целых")
|
148
|
-
it = []
|
149
|
-
|
150
|
-
remainder = self.to_s.match(/\.(\d+)/)[1]
|
151
|
-
|
152
|
-
signs = remainder.to_s.size- 1
|
153
|
-
|
154
|
-
it << ["десятая", "десятых"]
|
155
|
-
it << ["сотая", "сотых"]
|
156
|
-
it << ["тысячная", "тысячных"]
|
157
|
-
it << ["десятитысячная", "десятитысячных"]
|
158
|
-
it << ["стотысячная", "стотысячных"]
|
159
|
-
it << ["миллионная", "милллионных"]
|
160
|
-
it << ["десятимиллионная", "десятимилллионных", "десятимиллионных"]
|
161
|
-
it << ["стомиллионная", "стомилллионных", "стомиллионных"]
|
162
|
-
it << ["миллиардная", "миллиардных", "миллиардных"]
|
163
|
-
it << ["десятимиллиардная", "десятимиллиардных", "десятимиллиардных"]
|
164
|
-
it << ["стомиллиардная", "стомиллиардных", "стомиллиардных"]
|
165
|
-
it << ["триллионная", "триллионных", "триллионных"]
|
166
|
-
|
167
|
-
while it[signs].nil?
|
168
|
-
remainder = (remainder/10).round
|
169
|
-
signs = remainder.to_s.size- 1
|
170
|
-
end
|
171
|
-
|
172
|
-
suf1, suf2, suf3 = it[signs][0], it[signs][1], it[signs][2]
|
173
|
-
st + " " + RuTils::Pluralization::sum_string(remainder.to_i, 2, suf1, suf2, suf2)
|
174
|
-
end
|
175
|
-
|
176
|
-
def propisju_items(gender=1, *forms)
|
177
|
-
if self == self.to_i
|
178
|
-
return self.to_i.propisju_items(gender, *forms)
|
179
|
-
else
|
180
|
-
self.propisju(gender) + " " + forms[1]
|
60
|
+
def self.sum_string_fn(into, tmp_val, gender, one_item='', two_items='', five_items='')
|
61
|
+
rest, rest1, end_word, ones, tens, hundreds = [nil]*6
|
62
|
+
#
|
63
|
+
rest = tmp_val % 1000
|
64
|
+
tmp_val = tmp_val / 1000
|
65
|
+
if rest == 0
|
66
|
+
# последние три знака нулевые
|
67
|
+
into = five_items + " " if into == ""
|
68
|
+
return [into, tmp_val]
|
69
|
+
end
|
70
|
+
#
|
71
|
+
# начинаем подсчет с Rest
|
72
|
+
end_word = five_items
|
73
|
+
# сотни
|
74
|
+
hundreds = case rest / 100
|
75
|
+
when 0 then ""
|
76
|
+
when 1 then "сто "
|
77
|
+
when 2 then "двести "
|
78
|
+
when 3 then "триста "
|
79
|
+
when 4 then "четыреста "
|
80
|
+
when 5 then "пятьсот "
|
81
|
+
when 6 then "шестьсот "
|
82
|
+
when 7 then "семьсот "
|
83
|
+
when 8 then "восемьсот "
|
84
|
+
when 9 then "девятьсот "
|
85
|
+
end
|
86
|
+
|
87
|
+
# десятки
|
88
|
+
rest = rest % 100
|
89
|
+
rest1 = rest / 10
|
90
|
+
ones = ""
|
91
|
+
case rest1
|
92
|
+
when 0 then tens = ""
|
93
|
+
when 1 # особый случай
|
94
|
+
tens = case rest
|
95
|
+
when 10 then "десять "
|
96
|
+
when 11 then "одиннадцать "
|
97
|
+
when 12 then "двенадцать "
|
98
|
+
when 13 then "тринадцать "
|
99
|
+
when 14 then "четырнадцать "
|
100
|
+
when 15 then "пятнадцать "
|
101
|
+
when 16 then "шестнадцать "
|
102
|
+
when 17 then "семнадцать "
|
103
|
+
when 18 then "восемнадцать "
|
104
|
+
when 19 then "девятнадцать "
|
105
|
+
end
|
106
|
+
when 2: tens = "двадцать "
|
107
|
+
when 3: tens = "тридцать "
|
108
|
+
when 4: tens = "сорок "
|
109
|
+
when 5: tens = "пятьдесят "
|
110
|
+
when 6: tens = "шестьдесят "
|
111
|
+
when 7: tens = "семьдесят "
|
112
|
+
when 8: tens = "восемьдесят "
|
113
|
+
when 9: tens = "девяносто "
|
114
|
+
end
|
115
|
+
#
|
116
|
+
if rest1 < 1 or rest1 > 1 # единицы
|
117
|
+
case rest % 10
|
118
|
+
when 1
|
119
|
+
ones = case gender
|
120
|
+
when 1 then "один "
|
121
|
+
when 2 then "одна "
|
122
|
+
when 3 then "одно "
|
123
|
+
end
|
124
|
+
end_word = one_item
|
125
|
+
when 2
|
126
|
+
if gender == 2
|
127
|
+
ones = "две "
|
128
|
+
else
|
129
|
+
ones = "два "
|
130
|
+
end
|
131
|
+
end_word = two_items
|
132
|
+
when 3
|
133
|
+
ones = "три " if end_word = two_items
|
134
|
+
when 4
|
135
|
+
ones = "четыре " if end_word = two_items
|
136
|
+
when 5
|
137
|
+
ones = "пять "
|
138
|
+
when 6
|
139
|
+
ones = "шесть "
|
140
|
+
when 7
|
141
|
+
ones = "семь "
|
142
|
+
when 8
|
143
|
+
ones = "восемь "
|
144
|
+
when 9
|
145
|
+
ones = "девять "
|
181
146
|
end
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
147
|
+
end
|
148
|
+
|
149
|
+
# сборка строки
|
150
|
+
st = ''
|
151
|
+
return [(st << hundreds.to_s << tens.to_s << ones.to_s << end_word.to_s << " " << into.to_s).strip, tmp_val]
|
152
|
+
end
|
153
|
+
|
154
|
+
# Реализует вывод прописью любого объекта, реализующего Float
|
155
|
+
module FloatFormatting
|
156
|
+
|
157
|
+
# Выдает сумму прописью с учетом дробной доли. Дробная доля округляется до миллионной, или (если
|
158
|
+
# дробная доля оканчивается на нули) до ближайшей доли ( 500 тысячных округляется до 5 десятых).
|
159
|
+
# Дополнительный аргумент - род существительного (1 - мужской, 2- женский, 3-средний)
|
160
|
+
def propisju(gender = 2)
|
161
|
+
raise "Это не число!" if self.nan?
|
162
|
+
|
163
|
+
st = RuTils::Pluralization::sum_string(self.to_i, gender, "целая", "целых", "целых")
|
164
|
+
|
165
|
+
remainder = self.to_s.match(/\.(\d+)/)[1]
|
166
|
+
|
167
|
+
signs = remainder.to_s.size- 1
|
168
|
+
|
169
|
+
it = [["десятая", "десятых"]]
|
170
|
+
it << ["сотая", "сотых"]
|
171
|
+
it << ["тысячная", "тысячных"]
|
172
|
+
it << ["десятитысячная", "десятитысячных"]
|
173
|
+
it << ["стотысячная", "стотысячных"]
|
174
|
+
it << ["миллионная", "милллионных"]
|
175
|
+
it << ["десятимиллионная", "десятимилллионных", "десятимиллионных"]
|
176
|
+
it << ["стомиллионная", "стомилллионных", "стомиллионных"]
|
177
|
+
it << ["миллиардная", "миллиардных", "миллиардных"]
|
178
|
+
it << ["десятимиллиардная", "десятимиллиардных", "десятимиллиардных"]
|
179
|
+
it << ["стомиллиардная", "стомиллиардных", "стомиллиардных"]
|
180
|
+
it << ["триллионная", "триллионных", "триллионных"]
|
181
|
+
|
182
|
+
while it[signs].nil?
|
183
|
+
remainder = (remainder/10).round
|
184
|
+
signs = remainder.to_s.size- 1
|
185
|
+
end
|
186
|
+
|
187
|
+
suf1, suf2, suf3 = it[signs][0], it[signs][1], it[signs][2]
|
188
|
+
st + " " + RuTils::Pluralization::sum_string(remainder.to_i, 2, suf1, suf2, suf2)
|
189
|
+
end
|
190
|
+
|
191
|
+
def propisju_items(gender=1, *forms)
|
192
|
+
if self == self.to_i
|
193
|
+
return self.to_i.propisju_items(gender, *forms)
|
194
|
+
else
|
195
|
+
self.propisju(gender) + " " + forms[1]
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
# Реализует вывод прописью любого объекта, реализующего Numeric
|
202
|
+
module NumericFormatting
|
203
|
+
# Выбирает корректный вариант числительного в зависимости от рода и числа и оформляет сумму прописью
|
204
|
+
# 234.propisju => "двести сорок три"
|
205
|
+
# 221.propisju(2) => "двести двадцать одна"
|
206
|
+
def propisju(gender = 1)
|
207
|
+
RuTils::Pluralization::sum_string(self, gender, "")
|
208
|
+
end
|
209
|
+
|
210
|
+
def propisju_items(gender=1, *forms)
|
211
|
+
self.propisju(gender) + " " + RuTils::Pluralization::choose_plural(self.to_i, *forms)
|
212
|
+
end
|
213
|
+
|
214
|
+
# Выбирает корректный вариант числительного в зависимости от рода и числа. Например:
|
215
|
+
# * 4.items("колесо", "колеса", "колес") => "колеса"
|
216
|
+
def items(one_item, two_items, five_items)
|
217
|
+
RuTils::Pluralization::choose_plural(self, one_item, two_items, five_items)
|
218
|
+
end
|
219
|
+
|
220
|
+
# Выводит сумму в рублях прописью. Например:
|
221
|
+
# * (15.4).rublej => "пятнадцать рублей сорок копеек"
|
222
|
+
def rublej
|
223
|
+
RuTils::Pluralization::rublej(self)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
206
227
|
end
|
207
228
|
|
208
229
|
class Object::Numeric
|
209
|
-
|
230
|
+
include RuTils::Pluralization::NumericFormatting
|
210
231
|
end
|
211
232
|
|
212
233
|
|
213
234
|
class Object::Float
|
214
|
-
|
235
|
+
include RuTils::Pluralization::FloatFormatting
|
215
236
|
end
|
data/lib/rutils.rb
CHANGED
@@ -5,18 +5,30 @@ require 'jcode' # вот от этого надо бы избавиться - с
|
|
5
5
|
# Главный контейнер модуля
|
6
6
|
module RuTils
|
7
7
|
# Папка, куда установлен модуль RuTils. Нужно чтобы автоматически копировать RuTils в другие приложения.
|
8
|
-
INSTALLATION_DIRECTORY = File.expand_path(File.dirname(__FILE__) + '/../')
|
9
|
-
MAJOR = 0
|
10
|
-
MINOR = 1
|
11
|
-
TINY =
|
8
|
+
INSTALLATION_DIRECTORY = File.expand_path(File.dirname(__FILE__) + '/../') #:nodoc:
|
9
|
+
MAJOR = 0 #:nodoc:
|
10
|
+
MINOR = 1 #:nodoc:
|
11
|
+
TINY = 3 #:nodoc:
|
12
12
|
|
13
13
|
# Версия RuTils
|
14
|
-
|
14
|
+
VERSION = [MAJOR, MINOR ,TINY].join('.')
|
15
|
+
|
16
|
+
# Стандартный маркер для подстановок
|
17
|
+
SUBSTITUTION_MARKER = "\xFF\xFF\xFF\xFF" #:nodoc:
|
18
|
+
|
19
|
+
def self.load_component(name) #:nodoc:
|
20
|
+
require RuTils::INSTALLATION_DIRECTORY + "/lib/#{name}/#{name}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.reload_component(name) #:nodoc:
|
24
|
+
load RuTils::INSTALLATION_DIRECTORY + "/lib/#{name}/#{name}.rb"
|
25
|
+
end
|
15
26
|
end
|
16
27
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
28
|
+
|
29
|
+
RuTils::load_component :pluralizer #Выбор числительного и сумма прописью
|
30
|
+
RuTils::load_component :gilenson # Гиленсон
|
31
|
+
RuTils::load_component :datetime # Дата и время без локалей
|
32
|
+
RuTils::load_component :transliteration # Транслит
|
33
|
+
RuTils::load_component :integration # Интеграция с rails, textile и тд
|
34
|
+
RuTils::load_component :countries # Данные о странах на русском и английском
|