Skip to content

Commit 0962a6e

Browse files
senpossdispater
authored andcommitted
Add RU locale (#228)
* Add RU locale * Show "few seconds" as numbers, as in 1.x for RU locale * Add RU locale tests * Fix styling in locale.py
1 parent 0a96016 commit 0962a6e

File tree

4 files changed

+371
-0
lines changed

4 files changed

+371
-0
lines changed

pendulum/locales/ru/__init__.py

Whitespace-only changes.

pendulum/locales/ru/custom.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
"""
4+
ru custom locale file.
5+
"""
6+
7+
translations = {
8+
# Relative time
9+
'ago': '{} назад',
10+
'from_now': 'через {}',
11+
'after': '{0} после',
12+
'before': '{0} до',
13+
14+
# Date formats
15+
'date_formats': {
16+
'LTS': 'HH:mm:ss',
17+
'LT': 'HH:mm',
18+
'L': 'DD.MM.YYYY',
19+
'LL': 'D MMMM YYYY г.',
20+
'LLL': 'D MMMM YYYY г., HH:mm',
21+
'LLLL': 'dddd, D MMMM YYYY г., HH:mm'
22+
},
23+
}

pendulum/locales/ru/locale.py

Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
"""
4+
ru locale file.
5+
6+
It has been generated automatically and must not be modified directly.
7+
"""
8+
9+
from .custom import translations as custom_translations
10+
11+
12+
locale = {
13+
'plural': lambda n: 'few' if (((0 == 0 and ((0 == 0))) and ((n % 10) == (n % 10) and (((n % 10) >= 2 and (n % 10) <= 4)))) and (not ((n % 100) == (n % 100) and (((n % 100) >= 12 and (n % 100) <= 14))))) else 'many' if ((((0 == 0 and ((0 == 0))) and ((n % 10) == (n % 10) and (((n % 10) == 0)))) or ((0 == 0 and ((0 == 0))) and ((n % 10) == (n % 10) and (((n % 10) >= 5 and (n % 10) <= 9))))) or ((0 == 0 and ((0 == 0))) and ((n % 100) == (n % 100) and (((n % 100) >= 11 and (n % 100) <= 14))))) else 'one' if (((0 == 0 and ((0 == 0))) and ((n % 10) == (n % 10) and (((n % 10) == 1)))) and (not ((n % 100) == (n % 100) and (((n % 100) == 11))))) else 'other',
14+
'ordinal': lambda n: 'other',
15+
'translations': {
16+
'days': {
17+
'abbreviated': {
18+
0: 'вс',
19+
1: 'пн',
20+
2: 'вт',
21+
3: 'ср',
22+
4: 'чт',
23+
5: 'пт',
24+
6: 'сб',
25+
},
26+
'narrow': {
27+
0: 'вс',
28+
1: 'пн',
29+
2: 'вт',
30+
3: 'ср',
31+
4: 'чт',
32+
5: 'пт',
33+
6: 'сб',
34+
},
35+
'short': {
36+
0: 'вс',
37+
1: 'пн',
38+
2: 'вт',
39+
3: 'ср',
40+
4: 'чт',
41+
5: 'пт',
42+
6: 'сб',
43+
},
44+
'wide': {
45+
0: 'воскресенье',
46+
1: 'понедельник',
47+
2: 'вторник',
48+
3: 'среда',
49+
4: 'четверг',
50+
5: 'пятница',
51+
6: 'суббота',
52+
},
53+
},
54+
'months': {
55+
'abbreviated': {
56+
1: 'янв.',
57+
2: 'февр.',
58+
3: 'мар.',
59+
4: 'апр.',
60+
5: 'мая',
61+
6: 'июн.',
62+
7: 'июл.',
63+
8: 'авг.',
64+
9: 'сент.',
65+
10: 'окт.',
66+
11: 'нояб.',
67+
12: 'дек.',
68+
},
69+
'narrow': {
70+
1: 'Я',
71+
2: 'Ф',
72+
3: 'М',
73+
4: 'А',
74+
5: 'М',
75+
6: 'И',
76+
7: 'И',
77+
8: 'А',
78+
9: 'С',
79+
10: 'О',
80+
11: 'Н',
81+
12: 'Д',
82+
},
83+
'wide': {
84+
1: 'января',
85+
2: 'февраля',
86+
3: 'марта',
87+
4: 'апреля',
88+
5: 'мая',
89+
6: 'июня',
90+
7: 'июля',
91+
8: 'августа',
92+
9: 'сентября',
93+
10: 'октября',
94+
11: 'ноября',
95+
12: 'декабря',
96+
},
97+
},
98+
'units': {
99+
'year': {
100+
'one': '{0} год',
101+
'few': '{0} года',
102+
'many': '{0} лет',
103+
'other': '{0} года',
104+
},
105+
'month': {
106+
'one': '{0} месяц',
107+
'few': '{0} месяца',
108+
'many': '{0} месяцев',
109+
'other': '{0} месяца',
110+
},
111+
'week': {
112+
'one': '{0} неделя',
113+
'few': '{0} недели',
114+
'many': '{0} недель',
115+
'other': '{0} недели',
116+
},
117+
'day': {
118+
'one': '{0} день',
119+
'few': '{0} дня',
120+
'many': '{0} дней',
121+
'other': '{0} дня',
122+
},
123+
'hour': {
124+
'one': '{0} час',
125+
'few': '{0} часа',
126+
'many': '{0} часов',
127+
'other': '{0} часа',
128+
},
129+
'minute': {
130+
'one': '{0} минута',
131+
'few': '{0} минуты',
132+
'many': '{0} минут',
133+
'other': '{0} минуты',
134+
},
135+
'second': {
136+
'one': '{0} секунда',
137+
'few': '{0} секунды',
138+
'many': '{0} секунд',
139+
'other': '{0} секунды',
140+
},
141+
'microsecond': {
142+
'one': '{0} микросекунда',
143+
'few': '{0} микросекунды',
144+
'many': '{0} микросекунд',
145+
'other': '{0} микросекунды',
146+
},
147+
},
148+
'relative': {
149+
'year': {
150+
'future': {
151+
'other': 'через {0} года',
152+
'one': 'через {0} год',
153+
'few': 'через {0} года',
154+
'many': 'через {0} лет',
155+
},
156+
'past': {
157+
'other': '{0} года назад',
158+
'one': '{0} год назад',
159+
'few': '{0} года назад',
160+
'many': '{0} лет назад',
161+
},
162+
},
163+
'month': {
164+
'future': {
165+
'other': 'через {0} месяца',
166+
'one': 'через {0} месяц',
167+
'few': 'через {0} месяца',
168+
'many': 'через {0} месяцев',
169+
},
170+
'past': {
171+
'other': '{0} месяца назад',
172+
'one': '{0} месяц назад',
173+
'few': '{0} месяца назад',
174+
'many': '{0} месяцев назад',
175+
},
176+
},
177+
'week': {
178+
'future': {
179+
'other': 'через {0} недели',
180+
'one': 'через {0} неделю',
181+
'few': 'через {0} недели',
182+
'many': 'через {0} недель',
183+
},
184+
'past': {
185+
'other': '{0} недели назад',
186+
'one': '{0} неделю назад',
187+
'few': '{0} недели назад',
188+
'many': '{0} недель назад',
189+
},
190+
},
191+
'day': {
192+
'future': {
193+
'other': 'через {0} дня',
194+
'one': 'через {0} день',
195+
'few': 'через {0} дня',
196+
'many': 'через {0} дней',
197+
},
198+
'past': {
199+
'other': '{0} дня назад',
200+
'one': '{0} день назад',
201+
'few': '{0} дня назад',
202+
'many': '{0} дней назад',
203+
},
204+
},
205+
'hour': {
206+
'future': {
207+
'other': 'через {0} часа',
208+
'one': 'через {0} час',
209+
'few': 'через {0} часа',
210+
'many': 'через {0} часов',
211+
},
212+
'past': {
213+
'other': '{0} часа назад',
214+
'one': '{0} час назад',
215+
'few': '{0} часа назад',
216+
'many': '{0} часов назад',
217+
},
218+
},
219+
'minute': {
220+
'future': {
221+
'other': 'через {0} минуты',
222+
'one': 'через {0} минуту',
223+
'few': 'через {0} минуты',
224+
'many': 'через {0} минут',
225+
},
226+
'past': {
227+
'other': '{0} минуты назад',
228+
'one': '{0} минуту назад',
229+
'few': '{0} минуты назад',
230+
'many': '{0} минут назад',
231+
},
232+
},
233+
'second': {
234+
'future': {
235+
'other': 'через {0} секунды',
236+
'one': 'через {0} секунду',
237+
'few': 'через {0} секунды',
238+
'many': 'через {0} секунд',
239+
},
240+
'past': {
241+
'other': '{0} секунды назад',
242+
'one': '{0} секунду назад',
243+
'few': '{0} секунды назад',
244+
'many': '{0} секунд назад',
245+
},
246+
},
247+
},
248+
'day_periods': {
249+
'midnight': 'полночь',
250+
'am': 'AM',
251+
'noon': 'полдень',
252+
'pm': 'PM',
253+
'morning1': 'утра',
254+
'afternoon1': 'дня',
255+
'evening1': 'вечера',
256+
'night1': 'ночи',
257+
},
258+
},
259+
'custom': custom_translations
260+
}

tests/localization/test_ru.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
import pendulum
5+
6+
7+
locale = 'ru'
8+
9+
10+
def test_diff_for_humans():
11+
with pendulum.test(pendulum.datetime(2016, 8, 29)):
12+
diff_for_humans()
13+
14+
15+
def diff_for_humans():
16+
d = pendulum.now().subtract(seconds=1)
17+
assert d.diff_for_humans(locale=locale) == '1 секунду назад'
18+
19+
d = pendulum.now().subtract(seconds=2)
20+
assert d.diff_for_humans(locale=locale) == '2 секунды назад'
21+
22+
d = pendulum.now().subtract(seconds=5)
23+
assert d.diff_for_humans(locale=locale) == '5 секунд назад'
24+
25+
d = pendulum.now().subtract(seconds=21)
26+
assert d.diff_for_humans(locale=locale) == '21 секунду назад'
27+
28+
d = pendulum.now().subtract(minutes=1)
29+
assert d.diff_for_humans(locale=locale) == '1 минуту назад'
30+
31+
d = pendulum.now().subtract(minutes=2)
32+
assert d.diff_for_humans(locale=locale) == '2 минуты назад'
33+
34+
d = pendulum.now().subtract(minutes=5)
35+
assert d.diff_for_humans(locale=locale) == '5 минут назад'
36+
37+
d = pendulum.now().subtract(hours=1)
38+
assert d.diff_for_humans(locale=locale) == '1 час назад'
39+
40+
d = pendulum.now().subtract(hours=2)
41+
assert d.diff_for_humans(locale=locale) == '2 часа назад'
42+
43+
d = pendulum.now().subtract(hours=5)
44+
assert d.diff_for_humans(locale=locale) == '5 часов назад'
45+
46+
d = pendulum.now().subtract(days=1)
47+
assert d.diff_for_humans(locale=locale) == '1 день назад'
48+
49+
d = pendulum.now().subtract(days=2)
50+
assert d.diff_for_humans(locale=locale) == '2 дня назад'
51+
52+
d = pendulum.now().subtract(days=5)
53+
assert d.diff_for_humans(locale=locale) == '5 дней назад'
54+
55+
d = pendulum.now().subtract(weeks=1)
56+
assert d.diff_for_humans(locale=locale) == '1 неделю назад'
57+
58+
d = pendulum.now().subtract(weeks=2)
59+
assert d.diff_for_humans(locale=locale) == '2 недели назад'
60+
61+
d = pendulum.now().subtract(months=1)
62+
assert d.diff_for_humans(locale=locale) == '1 месяц назад'
63+
64+
d = pendulum.now().subtract(months=2)
65+
assert d.diff_for_humans(locale=locale) == '2 месяца назад'
66+
67+
d = pendulum.now().subtract(months=5)
68+
assert d.diff_for_humans(locale=locale) == '5 месяцев назад'
69+
70+
d = pendulum.now().subtract(years=1)
71+
assert d.diff_for_humans(locale=locale) == '1 год назад'
72+
73+
d = pendulum.now().subtract(years=2)
74+
assert d.diff_for_humans(locale=locale) == '2 года назад'
75+
76+
d = pendulum.now().subtract(years=5)
77+
assert d.diff_for_humans(locale=locale) == '5 лет назад'
78+
79+
d = pendulum.now().add(seconds=1)
80+
assert d.diff_for_humans(locale=locale) == 'через 1 секунду'
81+
82+
d = pendulum.now().add(seconds=1)
83+
d2 = pendulum.now()
84+
assert d.diff_for_humans(d2, locale=locale) == '1 секунда после'
85+
assert d2.diff_for_humans(d, locale=locale) == '1 секунда до'
86+
87+
assert d.diff_for_humans(d2, True, locale=locale) == '1 секунда'
88+
assert d2.diff_for_humans(d.add(seconds=1), True, locale=locale) == '2 секунды'

0 commit comments

Comments
 (0)