1# -*- coding: utf-8 -*-
2from __future__ import unicode_literals
3
4from io import StringIO
5
6import logging
7from parameterized import parameterized, param
8
9from dateparser.languages import default_loader, Locale
10from dateparser.languages.validation import LanguageValidator
11from dateparser.conf import apply_settings
12from dateparser.search.detection import AutoDetectLanguage, ExactLanguages
13from dateparser.utils import normalize_unicode
14
15from tests import BaseTestCase
16
17
18class TestBundledLanguages(BaseTestCase):
19    def setUp(self):
20        super(TestBundledLanguages, self).setUp()
21        self.language = NotImplemented
22        self.datetime_string = NotImplemented
23        self.translation = NotImplemented
24        self.tokens = NotImplemented
25        self.result = NotImplemented
26        self.settings = NotImplemented
27
28    @parameterized.expand([
29        param('en', "Sep 03 2014", "september 03 2014"),
30        param('en', "friday, 03 september 2014", "friday 03 september 2014"),
31        # Chinese
32        param('zh', "1年11个月", "1 year 11 month"),
33        param('zh', "1年11個月", "1 year 11 month"),
34        param('zh', "2015年04月08日10点05", "2015-04-08 10:05"),
35        param('zh', "2015年04月08日10:05", "2015-04-08 10:05"),
36        param('zh', "2013年04月08日", "2013-04-08"),
37        param('zh', "周一", "monday"),
38        param('zh', "礼拜一", "monday"),
39        param('zh', "周二", "tuesday"),
40        param('zh', "礼拜二", "tuesday"),
41        param('zh', "周三", "wednesday"),
42        param('zh', "礼拜三", "wednesday"),
43        param('zh', "星期日 2015年04月08日10:05", "sunday 2015-04-08 10:05"),
44        param('zh', "周六 2013年04月08日", "saturday 2013-04-08"),
45        param('zh', "下午3:30", "3:30 pm"),
46        param('zh', "凌晨3:30", "3:30 am"),
47        param('zh', "中午", "12:00"),
48        # French
49        param('fr', "20 Février 2012", "20 february 2012"),
50        param('fr', "Mercredi 19 Novembre 2013", "wednesday 19 november 2013"),
51        param('fr', "18 octobre 2012 à 19 h 21 min", "18 october 2012  19:21"),
52        # German
53        param('de', "29. Juni 2007", "29. june 2007"),
54        param('de', "Montag 5 Januar, 2015", "monday 5 january 2015"),
55        # Hungarian
56        param('hu', '2016 augusztus 11.', '2016 august 11.'),
57        param('hu', '2016-08-13 szombat 10:21', '2016-08-13 saturday 10:21'),
58        param('hu', '2016. augusztus 14. vasárnap 10:21', '2016. august 14. sunday 10:21'),
59        param('hu', 'hétfő', 'monday'),
60        param('hu', 'tegnapelőtt', '2 day ago'),
61        param('hu', 'ma', "0 day ago"),
62        param('hu', '2 hónappal ezelőtt', "2 month ago"),
63        param('hu', '2016-08-13 szombat 10:21 GMT', '2016-08-13 saturday 10:21 GMT'),
64        # Spanish
65        param('es', "Miércoles 31 Diciembre 2014", "wednesday 31 december 2014"),
66        # Italian
67        param('it', "Giovedi Maggio 29 2013", "thursday may 29 2013"),
68        param('it', "19 Luglio 2013", "19 july 2013"),
69        # Portuguese
70        param('pt', "22 de dezembro de 2014 às 02:38", "22  december  2014  02:38"),
71        # Russian
72        param('ru', "5 августа 2014 г. в 12:00", "5 august 2014 year.  12:00"),
73        # Turkish
74        param('tr', "2 Ocak 2015 Cuma, 16:49", "2 january 2015 friday 16:49"),
75        # Czech
76        param('cs', "22. prosinec 2014 v 2:38", "22. december 2014  2:38"),
77        # Dutch
78        param('nl', "maandag 22 december 2014 om 2:38", "monday 22 december 2014  2:38"),
79        # Romanian
80        param('ro', "22 Decembrie 2014 la 02:38", "22 december 2014  02:38"),
81        # Polish
82        param('pl', "4 stycznia o 13:50", "4 january  13:50"),
83        param('pl', "29 listopada 2014 o 08:40", "29 november 2014  08:40"),
84        # Ukrainian
85        param('uk', "30 листопада 2013 о 04:27", "30 november 2013  04:27"),
86        # Belarusian
87        param('be', "5 снежня 2015 г. у 12:00", "5 december 2015 year.  12:00"),
88        param('be', "11 верасня 2015 г. у 12:11", "11 september 2015 year.  12:11"),
89        param('be', "3 стд 2015 г. у 10:33", "3 january 2015 year.  10:33"),
90        # Arabic
91        param('ar', "6 يناير، 2015، الساعة 05:16 مساءً", "6 january 2015 05:16 pm"),
92        param('ar', "7 يناير، 2015، الساعة 11:00 صباحاً", "7 january 2015 11:00 am"),
93        # Vietnamese
94        param('vi', "Thứ Năm, ngày 8 tháng 1 năm 2015", "thursday 8 january 2015"),
95        param('vi', "Thứ Tư, 07/01/2015 | 22:34", "wednesday 07/01/2015  22:34"),
96        param('vi', "9 Tháng 1 2015 lúc 15:08", "9 january 2015  15:08"),
97        # Thai
98        param('th', "เมื่อ กุมภาพันธ์ 09, 2015, 09:27:57 AM", "february 09 2015 09:27:57 am"),
99        param('th', "เมื่อ กรกฎาคม 05, 2012, 01:18:06 AM", "july 05 2012 01:18:06 am"),
100        param('th', "วันเสาร์ที่ 16 ธันวาคม 2560 7:00 pm", "saturday 16 december 2560 7:00 pm"),
101        param('th', "วันอาทิตย์ที่ 17 ธันวาคม 2560 6:00 pm", "sunday 17 december 2560 6:00 pm"),
102
103        # Tagalog
104        param('tl', "Biyernes Hulyo 3, 2015", "friday july 3 2015"),
105        param('tl', "Pebrero 5, 2015 7:00 pm", "february 5 2015 7:00 pm"),
106        # Indonesian
107        param('id', "06 Sep 2015", "06 september 2015"),
108        param('id', "07 Feb 2015 20:15", "07 february 2015 20:15"),
109
110        # Miscellaneous
111        param('en', "2014-12-12T12:33:39-08:00", "2014-12-12 12:33:39-08:00"),
112        param('en', "2014-10-15T16:12:20+00:00", "2014-10-15 16:12:20+00:00"),
113        param('en', "28 Oct 2014 16:39:01 +0000", "28 october 2014 16:39:01 +0000"),
114        param('es', "13 Febrero 2015 a las 23:00", "13 february 2015  23:00"),
115
116        # Danish
117        param('da', "Sep 03 2014", "september 03 2014"),
118        param('da', "fredag, 03 september 2014", "friday 03 september 2014"),
119        param('da', "fredag d. 3 september 2014", "friday  3 september 2014"),
120
121        # Finnish
122        param('fi', "maanantai tammikuu 16, 2015", "monday january 16 2015"),
123        param('fi', "ma tammi 16, 2015", "monday january 16 2015"),
124        param('fi', "tiistai helmikuu 16, 2015", "tuesday february 16 2015"),
125        param('fi', "ti helmi 16, 2015", "tuesday february 16 2015"),
126        param('fi', "keskiviikko maaliskuu 16, 2015", "wednesday march 16 2015"),
127        param('fi', "ke maalis 16, 2015", "wednesday march 16 2015"),
128        param('fi', "torstai huhtikuu 16, 2015", "thursday april 16 2015"),
129        param('fi', "to huhti 16, 2015", "thursday april 16 2015"),
130        param('fi', "perjantai toukokuu 16, 2015", "friday may 16 2015"),
131        param('fi', "pe touko 16, 2015", "friday may 16 2015"),
132        param('fi', "lauantai kesäkuu 16, 2015", "saturday june 16 2015"),
133        param('fi', "la kesä 16, 2015", "saturday june 16 2015"),
134        param('fi', "sunnuntai heinäkuu 16, 2015", "sunday july 16 2015"),
135        param('fi', "su heinä 16, 2015", "sunday july 16 2015"),
136        param('fi', "su elokuu 16, 2015", "sunday august 16 2015"),
137        param('fi', "su elo 16, 2015", "sunday august 16 2015"),
138        param('fi', "su syyskuu 16, 2015", "sunday september 16 2015"),
139        param('fi', "su syys 16, 2015", "sunday september 16 2015"),
140        param('fi', "su lokakuu 16, 2015", "sunday october 16 2015"),
141        param('fi', "su loka 16, 2015", "sunday october 16 2015"),
142        param('fi', "su marraskuu 16, 2015", "sunday november 16 2015"),
143        param('fi', "su marras 16, 2015", "sunday november 16 2015"),
144        param('fi', "su joulukuu 16, 2015", "sunday december 16 2015"),
145        param('fi', "su joulu 16, 2015", "sunday december 16 2015"),
146        param('fi', "1. tammikuuta, 2016", "1. january 2016"),
147        param('fi', "tiistaina, 27. lokakuuta 2015", "tuesday 27. october 2015"),
148
149        # Japanese
150        param('ja', "午後3時", "pm 3:00"),
151        param('ja', "2時", "2:00"),
152        param('ja', "11時42分", "11:42"),
153        param('ja', "3ヶ月", "3 month"),
154        param('ja', "約53か月前", "53 month ago"),
155        param('ja', "3月", "march"),
156        param('ja', "十二月", "december"),
157        param('ja', "2月10日", "2-10"),
158        param('ja', "2013年2月", "2013 year february"),
159        param('ja', "2013年04月08日", "2013-04-08"),
160        param('ja', "2016年03月24日 木曜日 10時05分", "2016-03-24 thursday 10:05"),
161        param('ja', "2016年3月20日 21時40分", "2016-3-20 21:40"),
162        param('ja', "2016年03月21日 23時05分11秒", "2016-03-21 23:05:11"),
163        param('ja', "2016年3月21日(月) 14時48分", "2016-3-21 monday 14:48"),
164        param('ja', "2016年3月20日(日) 21時40分", "2016-3-20 sunday 21:40"),
165        param('ja', "2016年3月20日 (日) 21時40分", "2016-3-20 sunday 21:40"),
166
167        # Hebrew
168        param('he', "20 לאפריל 2012", "20 april 2012"),
169        param('he', "יום רביעי ה-19 בנובמבר 2013", "wednesday 19 november 2013"),
170        param('he', "18 לאוקטובר 2012 בשעה 19:21", "18 october 2012  19:21"),
171        param('he', "יום ה' 6/10/2016", "thursday 6/10/2016"),
172        param('he', "חצות", "12 am"),
173        param('he', "1 אחר חצות", "1 am"),
174        param('he', "3 לפנות בוקר", "3 am"),
175        param('he', "3 בבוקר", "3 am"),
176        param('he', "3 בצהריים", "3 pm"),
177        param('he', "6 לפנות ערב", "6 pm"),
178        param('he', "6 אחרי הצהריים", "6 pm"),
179        param('he', "6 אחרי הצהרים", "6 pm"),
180
181        # Bangla
182        param('bn', "সেপ্টেম্বর 03 2014", "september 03 2014"),
183        param('bn', "শুক্রবার, 03 সেপ্টেম্বর 2014", "friday 03 september 2014"),
184
185        # Hindi
186        param('hi', 'सोमवार 13 जून 1998', 'monday 13 june 1998'),
187        param('hi', 'मंगल 16 1786 12:18', 'tuesday 16 1786 12:18'),
188        param('hi', 'शनि 11 अप्रैल 2002 03:09', 'saturday 11 april 2002 03:09'),
189
190        # Swedish
191        param('sv', "Sept 03 2014", "september 03 2014"),
192        param('sv', "fredag, 03 september 2014", "friday 03 september 2014"),
193
194        # af
195        param('af', '5 Mei 2017', '5 may 2017'),
196        param('af', 'maandag, Augustus 15 2005 10 vm', 'monday august 15 2005 10 am'),
197
198        # agq
199        param('agq', '12 ndzɔ̀ŋɔ̀tɨ̀fʉ̀ghàdzughù 1999', '12 september 1999'),
200        param('agq', 'tsuʔndzɨkɔʔɔ 14 see 10 ak', 'saturday 14 may 10 pm'),
201
202        # ak
203        param('ak', 'esusow aketseaba-kɔtɔnimba', 'may'),
204        param('ak', '8 mumu-ɔpɛnimba ben', '8 december tuesday'),
205
206        # am
207        param('am', 'ፌብሩወሪ 22 8:00 ጥዋት', 'february 22 8:00 am'),
208        param('am', 'ኖቬም 10', 'november 10'),
209
210        # as
211        param('as', '17 জানুৱাৰী 1885', '17 january 1885'),
212        param('as', 'বৃহষ্পতিবাৰ 1 জুলাই 2009', 'thursday 1 july 2009'),
213
214        # asa
215        param('asa', '12 julai 1879 08:00 ichamthi', '12 july 1879 08:00 pm'),
216        param('asa', 'jpi 2 desemba 2007 01:00 icheheavo', 'sunday 2 december 2007 01:00 am'),
217
218        # ast
219        param('ast', "d'ochobre 11, 11:00 de la mañana", 'october 11 11:00 am'),
220        param('ast', "vienres 19 payares 1 tarde", 'friday 19 november 1 pm'),
221
222        # az-Cyrl
223        param('az-Cyrl', "7 феврал 1788 05:30 пм", '7 february 1788 05:30 pm'),
224        param('az-Cyrl', "чәршәнбә ахшамы ијл 14", 'tuesday july 14'),
225
226        # az-Latn
227        param('az-Latn', 'yanvar 13 şənbə', 'january 13 saturday'),
228        param('az-Latn', 'b noy 12', 'sunday november 12'),
229
230        # az
231        param('az', "17 iyn 2000 cümə axşamı", '17 june 2000 thursday'),
232        param('az', "22 sentyabr 2003 bazar ertəsi", '22 september 2003 monday'),
233
234        # bas
235        param('bas', '1906 6 hìlòndɛ̀ ŋgwà njaŋgumba', '1906 6 june monday'),
236        param('bas', 'ŋgwà kɔɔ, 11 màtùmb 5 i ɓugajɔp', 'friday 11 march 5 pm'),
237
238        # be
239        param('be', '13 лютага 1913', '13 february 1913'),
240        param('be', 'жнівень 12, чацвер', 'august 12 thursday'),
241
242        # bem
243        param('bem', 'palichimo 12 machi 2015 11:00 uluchelo', 'monday 12 march 2015 11:00 am'),
244        param('bem', '5 epreo 2000 pa mulungu', '5 april 2000 sunday'),
245
246        # bez
247        param('bez', '1 pa mwedzi gwa hutala 1889 10:00 pamilau', '1 january 1889 10:00 am'),
248        param('bez', '31 pa mwedzi gwa kumi na mbili hit', '31 december thursday'),
249
250        # bm
251        param('bm', '12 ɔkutɔburu 2001 araba', '12 october 2001 wednesday'),
252        param('bm', 'alamisa 15 uti 1998', 'thursday 15 august 1998'),
253
254        # bo
255        param('bo', "ཟླ་བ་བཅུ་གཅིག་པ་ 18", 'november 18'),
256        param('bo', "གཟའ་ཕུར་བུ་ 12 ཟླ་བ་བཅུ་པ་ 1879 10:15 ཕྱི་དྲོ་", 'thursday 12 october 1879 10:15 pm'),
257
258        # br
259        param('br', "merc'her c'hwevrer 12 07:32 gm", "wednesday february 12 07:32 pm"),
260        param('br', "10 gwengolo 2002 sadorn", "10 september 2002 saturday"),
261
262        # brx
263        param('brx', "6 अखथबर 2019 10:00 बेलासे", "6 october 2019 10:00 pm"),
264        param('brx', "बिसथि 8 फेब्रुवारी", "thursday 8 february"),
265
266        # bs-Cyrl
267        param('bs-Cyrl', "2 септембар 2000, четвртак", "2 september 2000 thursday"),
268        param('bs-Cyrl', "1 јули 1987 9:25 поподне", "1 july 1987 9:25 pm"),
269
270        # bs-Latn
271        param('bs-Latn', "23 septembar 1879, petak", "23 september 1879 friday"),
272        param('bs-Latn', "subota 1 avg 2009 02:27 popodne", "saturday 1 august 2009 02:27 pm"),
273
274        # bs
275        param('bs', "10 maj 2020 utorak", "10 may 2020 tuesday"),
276        param('bs', "ponedjeljak, 1989 2 januar", "monday 1989 2 january"),
277
278        # ca
279        param('ca', "14 d'abril 1980 diumenge", "14 april 1980 sunday"),
280        param('ca', "3 de novembre 2004 dj", "3 november 2004 thursday"),
281
282        # ce
283        param('ce', "6 январь 1987 пӏераскан де", "6 january 1987 friday"),
284        param('ce', "оршотан де 3 июль 1890", "monday 3 july 1890"),
285
286        # cgg
287        param('cgg', "20 okwakataana 2027 orwamukaaga", "20 may 2027 saturday"),
288        param('cgg', "okwaikumi na ibiri 12 oks", "december 12 wednesday"),
289
290        # chr
291        param('chr', "ᎤᎾᏙᏓᏉᏅᎯ 16 ᏕᎭᎷᏱ 1562 11:16 ᏒᎯᏱᎢᏗᏢ", "monday 16 june 1562 11:16 pm"),
292        param('chr', "13 ᎠᏂᏍᎬᏘ ᎤᎾᏙᏓᏈᏕᎾ 8:00 ᏌᎾᎴ", "13 may saturday 8:00 am"),
293
294        # cy
295        param('cy', "dydd sadwrn 27 chwefror 1990 9 yb", "saturday 27 february 1990 9 am"),
296        param('cy', "19 gorff 2000 dydd gwener", "19 july 2000 friday"),
297
298        # dav
299        param('dav', "mori ghwa kawi 24 kuramuka kana", "february 24 thursday"),
300        param('dav', "11 ike 4 luma lwa p", "11 september 4 pm"),
301
302        # dje
303        param('dje', "2 žuweŋ 2030 alz 11 zaarikay b", "2 june 2030 friday 11 pm"),
304        param('dje', "sektanbur 12 alarba", "september 12 wednesday"),
305
306        # dsb
307        param('dsb', "njeźela julija 15 2 wótpołdnja", "sunday july 15 2 pm"),
308        param('dsb', "awgusta 10 sob", "august 10 saturday"),
309
310        # dua
311        param('dua', "madiɓɛ́díɓɛ́ 15 ɗónɛsú 7 idiɓa", "july 15 friday 7 am"),
312        param('dua', "éti 12 tiníní", "sunday 12 november"),
313
314        # dyo
315        param('dyo', "mee 1 2000 talata", "may 1 2000 tuesday"),
316        param('dyo', "arjuma de 10", "friday december 10"),
317
318        # dz
319        param('dz', "ཟླ་བཅུ་གཅིག་པ་ 10 གཟའ་ཉི་མ་", "november 10 saturday"),
320        param('dz', "མིར་ 2 སྤྱི་ཟླ་དྲུག་པ 2009 2 ཕྱི་ཆ་", "monday 2 june 2009 2 pm"),
321
322        # ebu
323        param('ebu', "mweri wa gatantatũ 11 maa 08:05 ut", "june 11 friday 08:05 pm"),
324        param('ebu', "2 igi 1998 njumamothii", "2 december 1998 saturday"),
325
326        # ee
327        param('ee', "5 afɔfĩe 2009 05:05 ɣetrɔ kɔsiɖa", "5 april 2009 05:05 pm sunday"),
328        param('ee', "yawoɖa 1890 deasiamime 23", "thursday 1890 august 23"),
329
330        # el
331        param('el', "απρίλιος 13 09:09 μμ", "april 13 09:09 pm"),
332        param('el', "1 ιούνιος 2002 07:17 πμ", "1 june 2002 07:17 am"),
333
334        # eo
335        param('eo', "12 aŭgusto 1887 06:06 atm", "12 august 1887 06:06 am"),
336        param('eo', "vendredo 10 sep 1957", "friday 10 september 1957"),
337
338        # et
339        param('et', "3 juuni 2001 neljapäev 07:09 pm", "3 june 2001 thursday 07:09 pm"),
340        param('et', "7 veebr 2004", "7 february 2004"),
341
342        # eu
343        param('eu', "1 urtarrila 1990 asteazkena", "1 january 1990 wednesday"),
344        param('eu', "ig 30 martxoa 1905", "sunday 30 march 1905"),
345
346        # ewo
347        param('ewo', "ngɔn lála 13 08:07 ngəgógəle", "march 13 08:07 pm"),
348        param('ewo', "séradé ngad 12 1915 2:00 ngəgógəle", "saturday november 12 1915 2:00 pm"),
349
350        # ff
351        param('ff', "1 colte 1976 hoore-biir 04:15 subaka", "1 february 1976 saturday 04:15 am"),
352        param('ff', "naasaande 3 yar 02:00 kikiiɗe", "thursday 3 october 02:00 pm"),
353
354        # fil
355        param('fil', "2 setyembre 1880 biyernes", "2 september 1880 friday"),
356        param('fil', "15 ago 1909 lun", "15 august 1909 monday"),
357
358        # fo
359        param('fo', "mánadagur 30 januar 1976", "monday 30 january 1976"),
360        param('fo', "2 apríl 1890 fríggjadagur", "2 april 1890 friday"),
361
362        # fur
363        param('fur', "12 avost 1990 domenie", "12 august 1990 sunday"),
364        param('fur', "miercus 5 fev 1990 10:10 p", "wednesday 5 february 1990 10:10 pm"),
365
366        # fy
367        param('fy', "febrewaris 2 1987 freed", "february 2 1987 friday"),
368        param('fy', "to 20 maaie 2010", "thursday 20 may 2010"),
369
370        # ga
371        param('ga', "1 bealtaine 2019 dé céadaoin", "1 may 2019 wednesday"),
372        param('ga', "deireadh fómhair 12 aoine 10:09 pm", "october 12 friday 10:09 pm"),
373
374        # gd
375        param('gd', "2 am faoilleach 1890 diardaoin 02:13 m", "2 january 1890 thursday 02:13 am"),
376        param('gd', "did an t-ògmhios 15 1876 08:15 f", "sunday june 15 1876 08:15 pm"),
377
378        # gl
379        param('gl', "1 xullo 2009 sáb", "1 july 2009 saturday"),
380        param('gl', "martes 15 setembro 1980", "tuesday 15 september 1980"),
381
382        # gsw
383        param('gsw', "5 auguscht 1856 10:08 am namittag", "5 august 1856 10:08 pm"),
384        param('gsw', "ziischtig 13 dezämber 03:12 vormittag", "tuesday 13 december 03:12 am"),
385
386        # gu
387        param('gu', "10 સપ્ટેમ્બર 2005 ગુરુવાર", "10 september 2005 thursday"),
388        param('gu', "સોમવાર 1 જુલાઈ 1980", "monday 1 july 1980"),
389
390        # guz
391        param('guz', "apiriri 2 1789 chumatano", "april 2 1789 wednesday"),
392        param('guz', "esabato 11 cul 2000 10:19 ma", "saturday 11 july 2000 10:19 am"),
393
394        # gv
395        param('gv', "3 toshiaght-arree 2023 jeh", "3 february 2023 friday"),
396        param('gv', "1 m-souree 1999 jedoonee", "1 june 1999 sunday"),
397
398        # ha
399        param('ha', "18 yuni 1920 laraba", "18 june 1920 wednesday"),
400        param('ha', "2 afi 1908 lit", "2 april 1908 monday"),
401
402        # haw
403        param('haw', "1 'apelila 1968 p6", "1 april 1968 saturday"),
404        param('haw', "po'alima 29 'ok 1899", "friday 29 october 1899"),
405
406        # hr
407        param('hr', "2 ožujak 1980 pet", "2 march 1980 friday"),
408        param('hr', "nedjelja 3 lis 1879", "sunday 3 october 1879"),
409
410        # hsb
411        param('hsb', "5 měrc 1789 póndźela 11:13 popołdnju", "5 march 1789 monday 11:13 pm"),
412        param('hsb', "štwórtk 2000 awg 14", "thursday 2000 august 14"),
413
414        # hy
415        param('hy', "2 դեկտեմբերի 2006 շբթ 02:00 կա", "2 december 2006 saturday 02:00 am"),
416        param('hy', "չորեքշաբթի մյս 17, 2009", "wednesday may 17 2009"),
417
418        # ig
419        param('ig', "1 ọgọọst 2001 wenezdee", "1 august 2001 wednesday"),
420        param('ig', "mbọsị ụka 23 epr 1980", "sunday 23 april 1980"),
421
422        # ii
423        param('ii', "ꆏꊂꇖ 12 ꌕꆪ 1980", "thursday 12 march 1980"),
424        param('ii', "ꉆꆪ 1 02:05 ꁯꋒ", "august 1 02:05 pm"),
425
426        # is
427        param('is', "þriðjudagur 15 júlí 2001", "tuesday 15 july 2001"),
428        param('is', "fös 10 desember 08:17 fh", "friday 10 december 08:17 am"),
429
430        # jgo
431        param('jgo', "pɛsaŋ pɛ́nɛ́pfúꞌú 15 10:16 ŋka mbɔ́t nji", "september 15 10:16 pm"),
432        param('jgo', "ápta mɔ́ndi 10 nduŋmbi saŋ 2009", "tuesday 10 january 2009"),
433
434        # jmc
435        param('jmc', "2 aprilyi 2015 jumapilyi 03:10 kyiukonyi", "2 april 2015 sunday 03:10 pm"),
436        param('jmc', "alh 11 julyai 1987", "thursday 11 july 1987"),
437
438        # kab
439        param('kab', "3 meɣres 1999 kuẓass 11:16 n tmeddit", "3 march 1999 wednesday 11:16 pm"),
440        param('kab', "1 yennayer 2004 sḍis", "1 january 2004 friday"),
441
442        # kam
443        param('kam', "mwai wa katatũ 12 wa katano 09:18 ĩyawĩoo", "march 12 friday 09:18 pm"),
444        param('kam', "1 mwai wa ĩkumi na ilĩ 1789 wth", "1 december 1789 saturday"),
445
446        # kde
447        param('kde', "mwedi wa nnyano na umo 12 1907 liduva litandi", "june 12 1907 saturday"),
448        param('kde', "2 mei 11:10 chilo ll6", "2 may 11:10 pm thursday"),
449
450        # kea
451        param('kea', "sigunda-fera 12 julhu 1902", "monday 12 july 1902"),
452        param('kea', "2 diz 2005 kua", "2 december 2005 wednesday"),
453
454        # khq
455        param('khq', "1 žanwiye 2019 ati 01:09 adduha", "1 january 2019 monday 01:09 am"),
456        param('khq', "alhamiisa 12 noowanbur 1908", "thursday 12 november 1908"),
457
458        # ki
459        param('ki', "1 mwere wa gatano 1980 09:12 hwaĩ-inĩ", "1 may 1980 09:12 pm"),
460        param('ki', "njumatana 2 wmw 2000 01:12 kiroko", "wednesday 2 november 2000 01:12 am"),
461
462        # kk
463        param('kk', "3 маусым 1956 дс", "3 june 1956 monday"),
464        param('kk', "жексенбі 12 қыркүйек 1890", "sunday 12 september 1890"),
465
466        # kl
467        param('kl', "2 martsi 2001 ataasinngorneq", "2 march 2001 monday"),
468        param('kl', "pin 1 oktoberi 1901", "wednesday 1 october 1901"),
469
470        # kln
471        param('kln', "3 ng'atyaato koang'wan 10:09 kooskoliny", "3 february thursday 10:09 pm"),
472        param('kln', "kipsuunde nebo aeng' 14 2009 kos", "december 14 2009 wednesday"),
473
474        # kok
475        param('kok', "1 नोव्हेंबर 2000 आदित्यवार 01:19 मनं", "1 november 2000 sunday 01:19 pm"),
476        param('kok', "मंगळार 2 फेब्रुवारी 2003", "tuesday 2 february 2003"),
477
478        # ksb
479        param('ksb', "jumaamosi 1 ago 09:19 makeo", "saturday 1 august 09:19 am"),
480        param('ksb', "3 febluali 1980 jmn", "3 february 1980 tuesday"),
481
482        # ksf
483        param('ksf', "ŋwíí a ntɔ́ntɔ 3 1990 09:15 cɛɛ́nko", "january 3 1990 09:15 pm"),
484        param('ksf', "2 ŋ3 1789 jǝǝdí", "2 march 1789 thursday"),
485
486        # ksh
487        param('ksh', "mohndaach 12 fäbrowa 2001 12:18 nm", "monday 12 february 2001 12:18 pm"),
488        param('ksh', "5 oujoß 12:17 uhr vörmiddaachs", "5 august 12:17 am"),
489
490        # kw
491        param('kw', "14 mis metheven 1980 dy yow", "14 june 1980 thursday"),
492        param('kw', "mis kevardhu 2019 1 sad", "december 2019 1 saturday"),
493
494        # ky
495        param('ky', "22 февраль 2025 01:12 түштөн кийинки", "22 february 2025 01:12 pm"),
496        param('ky', "шаршемби 11 авг 1908", "wednesday 11 august 1908"),
497
498        # lag
499        param('lag', "17 kʉvɨɨrɨ 2018 ijumáa", "17 august 2018 friday"),
500        param('lag', "táatu 16 kwiinyi 1978", "monday 16 october 1978"),
501
502        # lb
503        param('lb', "2 mäerz 2034 don 02:19 moies", "2 march 2034 thursday 02:19 am"),
504        param('lb', "samschdeg 15 abrëll", "saturday 15 april"),
505
506        # lg
507        param('lg', "sebuttemba 17 1980 lw6", "september 17 1980 saturday"),
508        param('lg', "2 okitobba 2010 lwakusatu", "2 october 2010 wednesday"),
509
510        # lkt
511        param('lkt', "18 čhaŋwápetȟo wí 2013 owáŋgyužažapi", "18 may 2013 saturday"),
512        param('lkt', "1 tȟahékapšuŋ wí 1978 aŋpétuzaptaŋ", "1 december 1978 friday"),
513
514        # ln
515        param('ln', "23 yan 2001 mokɔlɔ mwa mísáto", "23 january 2001 wednesday"),
516        param('ln', "mtn 17 sánzá ya zómi na míbalé 09:17 ntɔ́ngɔ́", "friday 17 december 09:17 am"),
517
518        # lo
519        param('lo', "18 ພຶດສະພາ 1908 ວັນອາທິດ", "18 may 1908 sunday"),
520        param('lo', "8 ກໍລະກົດ 2003 03:03 ຫຼັງທ່ຽງ", "8 july 2003 03:03 pm"),
521
522        # lt
523        param('lt', "15 gegužės 1970 trečiadienis", "15 may 1970 wednesday"),
524        param('lt', "an 2 rugsėjo 09:18 priešpiet", "tuesday 2 september 09:18 am"),
525
526        # lu
527        param('lu', "2 ciongo 2016 njw 02:16 dilolo", "2 january 2016 thursday 02:16 pm"),
528        param('lu', "16 lùshìkà 2009", "16 august 2009"),
529
530        # luo
531        param('luo', "15 dwe mar adek 1908 tan", "15 march 1908 thursday"),
532        param('luo', "jumapil 3 dao 2008 01:12 ot", "sunday 3 july 2008 01:12 pm"),
533
534        # luy
535        param('luy', "23 juni 1970 murwa wa kanne", "23 june 1970 thursday"),
536        param('luy', "jumatano, 5 aprili 1998", "wednesday 5 april 1998"),
537
538        # lv
539        param('lv', "14 jūnijs 2010 10:10 priekšpusdienā", "14 june 2010 10:10 am"),
540        param('lv', "24 okt 2000 piektdiena 11:11 pēcpusd", "24 october 2000 friday 11:11 pm"),
541
542        # mas
543        param('mas', "2 olodoyíóríê inkókúâ 1954 08:16 ɛnkakɛnyá", "2 april 1954 08:16 am"),
544        param('mas', "15 ɔɛn 2032 alaámisi 02:13 ɛndámâ", "15 march 2032 thursday 02:13 pm"),
545
546        # mer
547        param('mer', "1 mĩĩ 1924 wetano 10:05 ũg", "1 may 1924 friday 10:05 pm"),
548        param('mer', "6 njuraĩ 1895 muramuko", "6 july 1895 monday"),
549
550        # mfe
551        param('mfe', "27 zilye 1988 merkredi", "27 july 1988 wednesday"),
552        param('mfe', "lindi 3 oktob 1897", "monday 3 october 1897"),
553
554        # mg
555        param('mg', "1 martsa 1789 alakamisy", "1 march 1789 thursday"),
556        param('mg', "5 aogositra 1911 zoma", "5 august 1911 friday"),
557
558        # mgh
559        param('mgh', "sabato mweri wo unethanu 15 07:18 wichishu", "sunday may 15 07:18 am"),
560        param('mgh', "2 tis 1789 jumamosi 08:17 mchochil'l", "2 september 1789 saturday 08:17 pm"),
561
562        # mgo
563        param('mgo', "5 iməg mbegtug aneg 5", "5 january thursday"),
564        param('mgo', "aneg 2 iməg zò 17 1908", "monday november 17 1908"),
565
566        # mk
567        param('mk', "4 септември 2009 09:18 претпл", "4 september 2009 09:18 am"),
568        param('mk', "вторник 10 август 1777 01:12 попл", "tuesday 10 august 1777 01:12 pm"),
569
570        # mn
571        param('mn', "дөрөвдүгээр сар 15 баасан 10:10 үө", "april 15 friday 10:10 am"),
572        param('mn', "12 9-р сар 2019 пүрэв", "12 september 2019 thursday"),
573
574        # mr
575        param('mr', "16 फेब्रुवारी 1908 गुरु 02:03 मउ", "16 february 1908 thursday 02:03 pm"),
576        param('mr', "शनिवार 15 सप्टें 1888", "saturday 15 september 1888"),
577
578        # ms
579        param('ms', "4 mei 1768 jumaat 09:09 ptg", "4 may 1768 friday 09:09 pm"),
580        param('ms', "isnin 14 disember 2001 11:09 pg", "monday 14 december 2001 11:09 am"),
581
582        # mt
583        param('mt', "3 frar 1998 il-ħadd", "3 february 1998 sunday"),
584        param('mt', "16 awwissu 2019 erb", "16 august 2019 wednesday"),
585
586        # mua
587        param('mua', "1 cokcwaklaŋne 2014 comzyiiɗii", "1 february 2014 tuesday"),
588        param('mua', "fĩi yuru 17 1908 cze 10:08 lilli", "december 17 1908 saturday 10:08 pm"),
589
590        # naq
591        param('naq', "20 ǂkhoesaob 1934 wunstaxtsees", "20 july 1934 wednesday"),
592        param('naq', "do 12 gamaǀaeb 1999 05:12 ǃuias", "thursday 12 june 1999 05:12 pm"),
593
594        # nb
595        param('nb', "2 mars 1998 torsdag", "2 march 1998 thursday"),
596        param('nb', "ons 15 des 2001", "wednesday 15 december 2001"),
597
598        # nd
599        param('nd', "19 nkwenkwezi 1967 mgqibelo", "19 may 1967 saturday"),
600        param('nd', "sit 1 zibandlela 2011", "wednesday 1 january 2011"),
601
602        # ne
603        param('ne', "1 फेब्रुअरी 2003 बिहिबार 09:18 अपराह्न्", "1 february 2003 thursday 09:18 pm"),
604        param('ne', "आइत् 4 अक्टोबर 1957", "sunday 4 october 1957"),
605
606        # nl
607        param('nl', "4 augustus 1678 zaterdag", "4 august 1678 saturday"),
608        param('nl', "vr 27 juni 1997", "friday 27 june 1997"),
609
610        # nmg
611        param('nmg', "5 ngwɛn ńna 1897 sɔ́ndɔ mafú málal", "5 april 1897 wednesday"),
612        param('nmg', "mɔ́ndɔ 1 ng11 1678 04:15 kugú", "monday 1 november 1678 04:15 pm"),
613
614        # nn
615        param('nn', "tysdag 2 september 1897 01:12 fm", "tuesday 2 september 1897 01:12 am"),
616        param('nn', "2 mai 2000 søndag 09:18 ettermiddag", "2 may 2000 sunday 09:18 pm"),
617
618        # nnh
619        param('nnh', "1 saŋ tsɛ̀ɛ cÿó màga lyɛ̌' 08:18 ncwònzém", "1 may saturday 08:18 pm"),
620        param('nnh', "3 saŋ lepyè shúm 1789 mvfò lyɛ̌'", "3 march 1789 monday"),
621
622        # nus
623        param('nus', "7 kornyoot 2006 diɔ̱k lätni 01:12 tŋ", "7 june 2006 wednesday 01:12 pm"),
624        param('nus', "bäkɛl, 12 tio̱p in di̱i̱t 2008", "saturday 12 december 2008"),
625
626        # nyn
627        param('nyn', "5 okwakashatu 1980 okt", "5 march 1980 friday"),
628        param('nyn', "2 kms 2087 sande", "2 july 2087 sunday"),
629
630        # om
631        param('om', "15 bitooteessa 1997 02:23 wb", "15 march 1997 02:23 pm"),
632        param('om', "jimaata 13 gur 01:12 wd", "friday 13 february 01:12 am"),
633
634        # os
635        param('os', "хуыцаубон 1998 апрелы 12", "sunday 1998 april 12"),
636        param('os', "1 ноя 1990 ӕртыццӕг", "1 november 1990 wednesday"),
637
638        # pa-Guru
639        param('pa-Guru', "ਸ਼ਨਿੱਚਰਵਾਰ 4 ਫ਼ਰਵਰੀ 1989 01:12 ਬਾਦ", "saturday 4 february 1989 01:12 pm"),
640        param('pa-Guru', "2 ਅਕਤੂਬਰ 2015 ਸੋਮਵਾਰ", "2 october 2015 monday"),
641
642        # pa
643        param('pa', "2 ਅਗਸਤ 1682 ਸ਼ਨਿੱਚਰ", "2 august 1682 saturday"),
644        param('pa', "12 ਅਕਤੂ 11:08 ਪੂਦੁ", "12 october 11:08 am"),
645
646        # qu
647        param('qu', "5 pauqar waray 1878 miércoles", "5 march 1878 wednesday"),
648        param('qu', "6 int 2009 domingo", "6 june 2009 sunday"),
649
650        # rm
651        param('rm', "1 schaner 1890 venderdi", "1 january 1890 friday"),
652        param('rm', "me 6 avust 2009", "wednesday 6 august 2009"),
653
654        # rn
655        param('rn', "11 ntwarante 2008 12:34 zmw", "11 march 2008 12:34 pm"),
656        param('rn', "7 nze 1999 ku wa kabiri", "7 september 1999 tuesday"),
657
658        # rof
659        param('rof', "13 mweri wa tisa ijtn 12:56 kingoto", "13 september wednesday 12:56 pm"),
660        param('rof', "ijumanne 2 mweri wa saba 1890", "tuesday 2 july 1890"),
661
662        # rw
663        param('rw', "16 kamena 2001 kuwa gatanu", "16 june 2001 friday"),
664        param('rw', "3 ukuboza 2013 gnd", "3 december 2013 saturday"),
665
666        # rwk
667        param('rwk', "3 aprilyi 2009 ijumaa", "3 april 2009 friday"),
668        param('rwk', "jumamosi 2 januari 02:13 utuko", "saturday 2 january 02:13 am"),
669
670        # sah
671        param('sah', "16 тохсунньу 2003 сэрэдэ 09:59 эк", "16 january 2003 wednesday 09:59 pm"),
672        param('sah', "баскыһыанньа 14 балаҕан ыйа 1998", "sunday 14 september 1998"),
673
674        # saq
675        param('saq', "1 lapa le okuni 1980 kun 10:45 tesiran", "1 march 1980 monday 10:45 am"),
676        param('saq', "mderot ee inet 12 lapa le ong'wan 1824", "wednesday 12 april 1824"),
677
678        # sbp
679        param('sbp', "1 mupalangulwa mulungu 08:15 lwamilawu", "1 january sunday 08:15 am"),
680        param('sbp', "jtn 17 mokhu 2001", "wednesday 17 october 2001"),
681
682        # se
683        param('se', "láv 22 cuoŋománnu 10:08 iđitbeaivi", "saturday 22 april 10:08 am"),
684        param('se', "duorasdat 11 borgemánnu 1978 12:09 eb", "thursday 11 august 1978 12:09 pm"),
685
686        # seh
687        param('seh', "12 fevreiro 2005 sha", "12 february 2005 friday"),
688        param('seh', "chiposi 2 decembro 1987", "monday 2 december 1987"),
689
690        # ses
691        param('ses', "18 žuyye 2009 atalaata 03:12 aluula", "18 july 2009 tuesday 03:12 pm"),
692        param('ses', "asibti 2 awi 1987", "saturday 2 april 1987"),
693
694        # sg
695        param('sg', "5 ngubùe 1890 bïkua-ûse 12:08 lk", "5 april 1890 monday 12:08 pm"),
696        param('sg', "bk3 23 föndo 2001", "tuesday 23 june 2001"),
697
698        # shi-Latn
699        param('shi-Latn', "6 bṛayṛ 2014 akṛas 07:06 tifawt", "6 february 2014 wednesday 07:06 am"),
700        param('shi-Latn', "asamas 15 ɣuct 2045", "sunday 15 august 2045"),
701
702        # sk
703        param('sk', "15 marec 1987 utorok", "15 march 1987 tuesday"),
704        param('sk', "streda 17 mája 2003", "wednesday 17 may 2003"),
705
706        # sl
707        param('sl', "12 junij 2003 petek 10:09 pop", "12 june 2003 friday 10:09 pm"),
708        param('sl', "ponedeljek 15 okt 1997 09:07 dopoldne", "monday 15 october 1997 09:07 am"),
709
710        # smn
711        param('smn', "1 njuhčâmáánu 2008 majebaargâ 08:08 ip", "1 march 2008 tuesday 08:08 am"),
712        param('smn', "láv 23 roovvâd 1897", "saturday 23 october 1897"),
713
714        # sn
715        param('sn', "11 chikumi 1998 chipiri", "11 june 1998 tuesday"),
716        param('sn', "china 2 mbudzi 1890", "thursday 2 november 1890"),
717
718        # so
719        param('so', "sab 5 bisha saddexaad 1765 11:08 gn", "saturday 5 march 1765 11:08 pm"),
720        param('so', "16 lit 2008 axd", "16 december 2008 sunday"),
721
722        # sq
723        param('sq', "2 qershor 1997 e mërkurë 10:08 pasdite", "2 june 1997 wednesday 10:08 pm"),
724        param('sq', "pre 15 gusht 1885 04:54 e paradites", "friday 15 august 1885 04:54 am"),
725
726        # sr-Cyrl
727        param('sr-Cyrl', "16 април 2016 суб 03:46 по подне", "16 april 2016 saturday 03:46 pm"),
728        param('sr-Cyrl', "уторак 3 новембар 1999", "tuesday 3 november 1999"),
729
730        # sr-Latn
731        param('sr-Latn', "4 septembar 2000 četvrtak", "4 september 2000 thursday"),
732        param('sr-Latn', "uto 18 maj 2004 11:15 pre podne", "tuesday 18 may 2004 11:15 am"),
733
734        # sr
735        param('sr', "3 децембар 2005 уто 10:15 по подне", "3 december 2005 tuesday 10:15 pm"),
736        param('sr', "петак 12 август 2001", "friday 12 august 2001"),
737
738        # sv
739        param('sv', "4 augusti 2007 lördag 02:44 fm", "4 august 2007 saturday 02:44 am"),
740        param('sv', "onsdag 16 mars 08:15 eftermiddag", "wednesday 16 march 08:15 pm"),
741
742        # sw
743        param('sw', "5 mei 1994 jumapili 10:17 asubuhi", "5 may 1994 sunday 10:17 am"),
744        param('sw', "jumanne 2 desemba 2003", "tuesday 2 december 2003"),
745
746        # ta
747        param('ta', "6 ஏப்ரல் 1997 செவ்வாய் 02:09 முற்பகல்", "6 april 1997 tuesday 02:09 am"),
748        param('ta', "ஞாயி 1 ஜூன் 1998", "sunday 1 june 1998"),
749
750        # te
751        param('te', "సోమవారం 3 నవంబర 1887", "monday 3 november 1887"),
752        param('te', "5 మార్చి 2001 శుక్రవారం", "5 march 2001 friday"),
753
754        # teo
755        param('teo', "2 omodok'king'ol 1996 nakaare", "2 june 1996 tuesday"),
756        param('teo', "nakasabiti 4 jol 2001 01:12 ebongi", "saturday 4 july 2001 01:12 pm"),
757
758        # to
759        param('to', "5 fēpueli 2007 mōn 02:17 efiafi", "5 february 2007 monday 02:17 pm"),
760        param('to', "falaite 14 'okatopa 2015 09:48 hh", "friday 14 october 2015 09:48 am"),
761
762        # twq
763        param('twq', "17 feewiriye 2023 11:12 zaarikay b", "17 february 2023 11:12 pm"),
764        param('twq', "alzuma 11 sektanbur 2019", "friday 11 september 2019"),
765
766        # tzm
767        param('tzm', "2 yulyuz 2002 akwas 01:16 ḍeffir aza", "2 july 2002 thursday 01:16 pm"),
768        param('tzm', "asa 13 nwanbir 2005", "sunday 13 november 2005"),
769
770        # uz-Cyrl
771        param('uz-Cyrl', "пайшанба 24 ноябр 1957 01:18 то", "thursday 24 november 1957 01:18 am"),
772        param('uz-Cyrl', "4 авг 1887 чоршанба", "4 august 1887 wednesday"),
773
774        # uz-Latn
775        param('uz-Latn', "3 iyul 1997 payshanba 08:17 tk", "3 july 1997 thursday 08:17 pm"),
776        param('uz-Latn', "shan 15 sentabr 2008", "saturday 15 september 2008"),
777
778        # uz
779        param('uz', "1 fevral 1776 dushanba 09:17 to", "1 february 1776 monday 09:17 am"),
780        param('uz', "juma 18 aprel 2027", "friday 18 april 2027"),
781
782        # vun
783        param('vun', "2 aprilyi 1956 jumatatuu", "2 april 1956 monday"),
784        param('vun', "jumamosi 12 oktoba 02:16 kyiukonyi", "saturday 12 october 02:16 pm"),
785
786        # wae
787        param('wae', "zištag 16 abrille 2002", "tuesday 16 april 2002"),
788        param('wae', "27 öigšte 1669 fritag", "27 august 1669 friday"),
789
790        # xog
791        param('xog', "21 marisi 2001 owokubili", "21 march 2001 tuesday"),
792        param('xog', "kuta 30 okitobba 1955 02:17 eigulo", "friday 30 october 1955 02:17 pm"),
793
794        # yav
795        param('yav', "12 imɛŋ i puɔs 1998 metúkpíápɛ", "12 september 1998 wednesday"),
796        param('yav', "5 o10 2001 séselé 12:07 kiɛmɛ́ɛm", "5 october 2001 saturday 12:07 am"),
797
798        # yo
799        param('yo', "5 èrèlè 2005 ọjọ́rú 10:07 àárọ̀", "5 february 2005 wednesday 10:07 am"),
800        param('yo', "ọjọ́ àbámẹ́ta 2 oṣù ẹ̀bibi 1896", "saturday 2 may 1896"),
801
802        # zu
803        param('zu', "3 mashi 2007 ulwesibili 10:08", "3 march 2007 tuesday 10:08"),
804        param('zu', "son 23 umasingana 1996", "sunday 23 january 1996"),
805    ])
806    def test_translation(self, shortname, datetime_string, expected_translation):
807        self.given_settings()
808        self.given_bundled_language(shortname)
809        self.given_string(datetime_string)
810        self.when_datetime_string_translated()
811        self.then_string_translated_to(expected_translation)
812
813    @parameterized.expand([
814        # English
815        param('en', "yesterday", "1 day ago"),
816        param('en', "today", "0 day ago"),
817        param('en', "day before yesterday", "2 day ago"),
818        param('en', "last month", "1 month ago"),
819        param('en', "less than a minute ago", "45 second ago"),
820        # German
821        param('de', "vorgestern", "2 day ago"),
822        param('de', "heute", "0 day ago"),
823        param('de', "vor 3 Stunden", "3 hour ago"),
824        param('de', "vor 2 Monaten", "2 month ago"),
825        param('de', "vor 2 Monaten, 2 Wochen", "2 month ago 2 week"),
826        # French
827        param('fr', "avant-hier", "2 day ago"),
828        param('fr', "hier", "1 day ago"),
829        param('fr', "aujourd'hui", "0 day ago"),
830        # Spanish
831        param('es', "anteayer", "2 day ago"),
832        param('es', "ayer", "1 day ago"),
833        param('es', "ayer a las", "1 day ago "),
834        param('es', "hoy", "0 day ago"),
835        param('es', "hace un horas", "1 hour ago"),
836        param('es', "2 semanas", "2 week"),
837        param('es', "2 año", "2 year"),
838        # Italian
839        param('it', "altro ieri", "2 day ago"),
840        param('it', "ieri", "1 day ago"),
841        param('it', "oggi", "0 day ago"),
842        param('it', "2 settimana fa", "2 week ago"),
843        param('it', "2 anno fa", "2 year ago"),
844        # Portuguese
845        param('pt', "anteontem", "2 day ago"),
846        param('pt', "ontem", "1 day ago"),
847        param('pt', "hoje", "0 day ago"),
848        param('pt', "56 minutos", "56 minute"),
849        param('pt', "12 dias", "12 day"),
850        param('pt', "há 14 min.", "14 minute ago."),
851        param('pt', "1 segundo atrás", "1 second ago"),
852        # Russian
853        param('ru', "9 месяцев", "9 month"),
854        param('ru', "8 недели", "8 week"),
855        param('ru', "7 года", "7 year"),
856        param('ru', "позавчера", "2 day ago"),
857        param('ru', "сейчас", "0 second ago"),
858        param('ru', "спустя 2 дня", "in 2 day"),
859        param('ru', "вчера", "1 day ago"),
860        param('ru', "сегодня", "0 day ago"),
861        param('ru', "завтра", "in 1 day"),
862        param('ru', "послезавтра", "in 2 day"),
863        param('ru', "несколько секунд", "44 second"),
864        # Turkish
865        param('tr', "dün", "1 day ago"),
866        param('tr', "22 dakika", "22 minute"),
867        param('tr', "12 hafta", "12 week"),
868        param('tr', "13 yıl", "13 year"),
869        # Czech
870        param('cs', "40 sekunda", "40 second"),
871        param('cs', "4 týden", "4 week"),
872        param('cs', "14 roků", "14 year"),
873        # Chinese
874        param('zh', "昨天", "1 day ago"),
875        param('zh', "前天", "2 day ago"),
876        param('zh', "50 秒", "50 second"),
877        param('zh', "7 周", "7 week"),
878        param('zh', "12 年", "12 year"),
879        param('zh', "半小时前", "30 minute ago"),
880        # Danish
881        param('da', "i går", "1 day ago"),
882        param('da', "i dag", "0 day ago"),
883        param('da', "sidste måned", "1 month ago"),
884        param('da', "mindre end et minut siden", "45  seconds"),
885        # Dutch
886        param('nl', "17 uur geleden", "17 hour ago"),
887        param('nl', "27 jaar geleden", "27 year ago"),
888        param('nl', "45 minuten", "45 minute"),
889        param('nl', "nu", "0 second ago"),
890        param('nl', "eergisteren", "2 day ago"),
891        param('nl', "volgende maand", "in 1 month"),
892        # Romanian
893        param('ro', "23 săptămâni în urmă", "23 week ago"),
894        param('ro', "23 săptămâni", "23 week"),
895        param('ro', "13 oră", "13 hour"),
896        # Arabic
897        param('ar', "يومين", "2 day"),
898        param('ar', "أمس", "1 day ago"),
899        param('ar', "4 عام", "4 year"),
900        param('ar', "منذ 2 ساعات", "ago 2 hour"),
901        param('ar', "منذ ساعتين", "ago 2 hour"),
902        param('ar', "اليوم السابق", "1 day ago"),
903        param('ar', "اليوم", "0 day ago"),
904        # Polish
905        param('pl', "2 godz.", "2 hour."),
906        param('pl', "Wczoraj o 07:40", "1 day ago  07:40"),
907        # Vietnamese
908        param('vi', "2 tuần 3 ngày", "2 week 3 day"),
909        param('vi', "21 giờ trước", "21 hour ago"),
910        param('vi', "Hôm qua 08:16", "1 day ago 08:16"),
911        param('vi', "Hôm nay 15:39", "0 day ago 15:39"),
912        # French
913        param('fr', "maintenant", "0 second ago"),
914        param('fr', "demain", "in 1 day"),
915        param('fr', u"Il y a moins d'une minute", "1 minute ago"),
916        param('fr', u"Il y a moins de 30s", "30 second ago"),
917        # Tagalog
918        param('tl', "kahapon", "1 day ago"),
919        param('tl', "ngayon", "0 second ago"),
920        # Ukrainian
921        param('uk', "позавчора", "2 day ago"),
922        # Belarusian
923        param('be', "9 месяцаў", "9 month"),
924        param('be', "8 тыдняў", "8 week"),
925        param('be', "1 тыдзень", "1 week"),
926        param('be', "2 года", "2 year"),
927        param('be', "3 гады", "3 year"),
928        param('be', "11 секунд", "11 second"),
929        param('be', "учора", "1 day ago"),
930        param('be', "пазаўчора", "2 day ago"),
931        param('be', "сёння", "0 day ago"),
932        param('be', "некалькі хвілін", "2 minute"),
933        # Indonesian
934        param('id', "baru saja", "0 second ago"),
935        param('id', "hari ini", "0 day ago"),
936        param('id', "kemarin", "1 day ago"),
937        param('id', "kemarin lusa", "2 day ago"),
938        param('id', "sehari yang lalu", "1 day  ago"),
939        param('id', "seminggu yang lalu", "1 week  ago"),
940        param('id', "sebulan yang lalu", "1 month  ago"),
941        param('id', "setahun yang lalu", "1 year  ago"),
942        # Finnish
943        param('fi', "1 vuosi sitten", "1 year ago"),
944        param('fi', "2 vuotta sitten", "2 year ago"),
945        param('fi', "3 v sitten", "3 year ago"),
946        param('fi', "4 v. sitten", "4 year. ago"),
947        param('fi', "5 vv. sitten", "5 year. ago"),
948        param('fi', "1 kuukausi sitten", "1 month ago"),
949        param('fi', "2 kuukautta sitten", "2 month ago"),
950        param('fi', "3 kk sitten", "3 month ago"),
951        param('fi', "1 viikko sitten", "1 week ago"),
952        param('fi', "2 viikkoa sitten", "2 week ago"),
953        param('fi', "3 vk sitten", "3 week ago"),
954        param('fi', "4 vko sitten", "4 week ago"),
955        param('fi', "1 päivä sitten", "1 day ago"),
956        param('fi', "2 päivää sitten", "2 day ago"),
957        param('fi', "8 pvää sitten", "8 day ago"),
958        param('fi', "3 pv sitten", "3 day ago"),
959        param('fi', "4 p. sitten", "4 day. ago"),
960        param('fi', "5 pvä sitten", "5 day ago"),
961        param('fi', "1 tunti sitten", "1 hour ago"),
962        param('fi', "2 tuntia sitten", "2 hour ago"),
963        param('fi', "3 t sitten", "3 hour ago"),
964        param('fi', "1 minuutti sitten", "1 minute ago"),
965        param('fi', "2 minuuttia sitten", "2 minute ago"),
966        param('fi', "3 min sitten", "3 minute ago"),
967        param('fi', "1 sekunti sitten", "1 second ago"),
968        param('fi', "2 sekuntia sitten", "2 second ago"),
969        param('fi', "1 sekuntti sitten", "1 second ago"),
970        param('fi', "2 sekunttia sitten", "2 second ago"),
971        param('fi', "3 s sitten", "3 second ago"),
972        param('fi', "eilen", "1 day ago"),
973        param('fi', "tänään", "0 day ago"),
974        param('fi', "huomenna", "in 1 day"),
975        param('fi', "nyt", "0 second ago"),
976        param('fi', "ensi viikolla", "in 1 week"),
977        param('fi', "viime viikolla", "1 week ago"),
978        param('fi', "toissa vuonna", "2 year ago"),
979        param('fi', "9 kuukautta sitten", "9 month ago"),
980        param('fi', "3 viikon päästä", "in 3 week"),
981        param('fi', "10 tunnin kuluttua", "in 10 hour"),
982        # Japanese
983        param('ja', "今年", "0 year ago"),
984        param('ja', "去年", "1 year ago"),
985        param('ja', "17年前", "17 year ago"),
986        param('ja', "今月", "0 month ago"),
987        param('ja', "先月", "1 month ago"),
988        param('ja', "1ヶ月前", "1 month ago"),
989        param('ja', "2ヶ月前", "2 month ago"),
990        param('ja', "今週", "0 week ago"),
991        param('ja', "先週", "1 week ago"),
992        param('ja', "先々週", "2 week ago"),
993        param('ja', "2週間前", "2 week ago"),
994        param('ja', "3週間", "3 week"),
995        param('ja', "今日", "0 day ago"),
996        param('ja', "昨日", "1 day ago"),
997        param('ja', "一昨日", "2 day ago"),
998        param('ja', "3日前", "3 day ago"),
999        param('ja', "1時間", "1 hour"),
1000        param('ja', "23時間前", "23 hour ago"),
1001        param('ja', "30分", "30 minute"),
1002        param('ja', "3分間", "3 minute"),
1003        param('ja', "60秒", "60 second"),
1004        param('ja', "3秒前", "3 second ago"),
1005        param('ja', "現在", "0 second ago"),
1006        # Hebrew
1007        param('he', "אתמול", "1 day ago"),
1008        param('he', "אתמול בשעה 3", "1 day ago  3"),
1009        param('he', "היום", "0 day ago"),
1010        param('he', "לפני יומיים", "2 day ago"),
1011        param('he', "לפני שבועיים", "2 week ago"),
1012        # Bulgarian
1013        param("bg", "вдругиден", "in 2 day"),
1014        param("bg", "утре", "in 1 day"),
1015        param("bg", "след 5 дни", "in 5 day"),
1016        param("bg", "вчера", "1 day ago"),
1017        param("bg", "преди 9 дни", "9 day ago"),
1018        param("bg", "преди 10 минути", "10 minute ago"),
1019        param("bg", "преди час", "1 hour ago"),
1020        param("bg", "преди 4 години", "4 year ago"),
1021        param("bg", "преди десетилетие", "10 year ago"),
1022        # Bangla
1023        param('bn', "গতকাল", "1 day ago"),
1024        param('bn', "আজ", "0 day ago"),
1025        param('bn', "গত মাস", "1 month ago"),
1026        param('bn', "আগামী সপ্তাহ", "in 1 week"),
1027        # Hindi
1028        param('hi', "१ सप्ताह", "1 week"),
1029        param('hi', "२४ मिनट पहले", "24 minute ago"),
1030        param('hi', "5 वर्ष", "5 year"),
1031        param('hi', "५३ सप्ताह बाद", "53 week in"),
1032        param('hi', "12 सेकंड पूर्व", "12 second ago"),
1033        # Swedish
1034        param('sv', "igår", "1 day ago"),
1035        param('sv', "idag", "0 day ago"),
1036        param('sv', "förrgår", "2 day ago"),
1037        param('sv', "förra månaden", "1 month ago"),
1038        param('sv', "nästa månad", "in 1 month"),
1039        # Georgian
1040        param('ka', 'გუშინ', '1 day ago'),
1041        param('ka', 'დღეს', '0 day ago'),
1042        param('ka', 'ერთ თვე', '1 month'),
1043        param('ka', 'დღეიდან ერთ კვირა', 'in 1 week'),
1044
1045        # af
1046        param('af', "3 week gelede", "3 week ago"),
1047        param('af', "volgende jaar 10:08 nm", "in 1 year 10:08 pm"),
1048        param('af', "oor 45 sekondes", "in 45 second"),
1049        # am
1050        param('am', "የሚቀጥለው ሳምንት", "in 1 week"),
1051        param('am', "በ10 ሳምንት ውስጥ", "in 10 week"),
1052        # as
1053        param('as', "কাইলৈ", "in 1 day"),
1054        param('as', "আজি", "0 day ago"),
1055        # asa
1056        param('asa', "ighuo", "1 day ago"),
1057        param('asa', "yavo 09:27 ichamthi", "in 1 day 09:27 pm"),
1058        # ast
1059        param('ast', "el mes viniente 02:17 tarde", "in 1 month 02:17 pm"),
1060        param('ast', "hai 22 selmana", "22 week ago"),
1061        param('ast', "en 5 minutos", "in 5 minute"),
1062        # az-Latn
1063        param('az-Latn', "keçən həftə", "1 week ago"),
1064        param('az-Latn', "10 ay ərzində", "in 10 month"),
1065        param('az-Latn', "22 saniyə öncə", "22 second ago"),
1066        # az
1067        param('az', "12 saat ərzində", "in 12 hour"),
1068        param('az', "15 həftə öncə", "15 week ago"),
1069        # bas
1070        param('bas', "lɛ̀n 12:08 i ɓugajɔp", "0 day ago 12:08 pm"),
1071        param('bas', "yààni", "1 day ago"),
1072        # bem
1073        param('bem', "lelo", "0 day ago"),
1074        param('bem', "17 umweshi", "17 month"),
1075        # bez
1076        param('bez', "hilawu 08:44 pamilau", "in 1 day 08:44 am"),
1077        param('bez', "neng'u ni", "0 day ago"),
1078        param('bez', "12 mlungu gumamfu", "12 week"),
1079        # bm
1080        param('bm', "sini 01:18 am", "in 1 day 01:18 am"),
1081        param('bm', "kunu", "1 day ago"),
1082        param('bm', "22 dɔgɔkun", "22 week"),
1083        # bo
1084        param('bo', "ཁས་ས་", "1 day ago"),
1085        param('bo', "སང་ཉིན་", "in 1 day"),
1086        # br
1087        param('br', "ar sizhun diaraok", "1 week ago"),
1088        param('br', "ar bloaz a zeu 02:19 gm", "in 1 year 02:19 pm"),
1089        param('br', "10 deiz", "10 day"),
1090        # brx
1091        param('brx', "गाबोन", "in 1 day"),
1092        param('brx', "मैया 11:58 फुं", "1 day ago 11:58 am"),
1093        param('brx', "17 मिनिथ", "17 minute"),
1094        # bs-Cyrl
1095        param('bs-Cyrl', "следећег месеца", "in 1 month"),
1096        param('bs-Cyrl', "прошле године 10:05 пре подне", "1 year ago 10:05 am"),
1097        param('bs-Cyrl', "пре 28 недеља", "28 week ago"),
1098        # bs-Latn
1099        param('bs-Latn', "sljedeće godine", "in 1 year"),
1100        param('bs-Latn', "prije 4 mjeseci", "4 month ago"),
1101        param('bs-Latn', "za 36 sati", "in 36 hour"),
1102        # bs
1103        param('bs', "prije 12 sekundi", "12 second ago"),
1104        param('bs', "za 5 godinu", "in 5 year"),
1105        param('bs', "ovaj sat", "0 hour ago"),
1106        # ca
1107        param('ca', "d'aquí a 22 hores", "in 22 hour"),
1108        param('ca', "fa 17 anys", "17 year ago"),
1109        param('ca', "el mes passat", "1 month ago"),
1110        param('ca', "la pròxima setmana", "in 1 week"),
1111        param('ca', "despús-ahir", "2 day ago"),
1112        param('ca', "en un dia", "in 1 day"),
1113        param('ca', "demà passat", "in 2 day"),
1114        # ce
1115        param('ce', "72 сахьт даьлча", "in 72 hour"),
1116        param('ce', "42 шо хьалха", "42 year ago"),
1117        param('ce', "рогӏерчу баттахь", "in 1 month"),
1118        # cgg
1119        param('cgg', "nyenkyakare", "in 1 day"),
1120        param('cgg', "nyomwabazyo", "1 day ago"),
1121        param('cgg', "5 omwaka", "5 year"),
1122        # chr
1123        param('chr', "ᎯᎠ ᎢᏯᏔᏬᏍᏔᏅ", "0 minute ago"),
1124        param('chr', "ᎾᎿ 8 ᎧᎸᎢ ᏥᎨᏒ", "8 month ago"),
1125        param('chr', "ᎾᎿ 22 ᎢᏯᏔᏬᏍᏔᏅ", "in 22 minute"),
1126        # cs
1127        param('cs', "za 3 rok", "in 3 year"),
1128        param('cs', "před 11 měsícem", "11 month ago"),
1129        param('cs', "tento měsíc", "0 month ago"),
1130        # cy
1131        param('cy', "wythnos ddiwethaf", "1 week ago"),
1132        param('cy', "25 o flynyddoedd yn ôl", "25 year ago"),
1133        param('cy', "ymhen 4 awr", "in 4 hour"),
1134        # da
1135        param('da', "for 15 måneder siden", "15 month ago"),
1136        param('da', "om 60 sekunder", "in 60 second"),
1137        param('da', "sidste måned", "1 month ago"),
1138        # dav
1139        param('dav', "iguo", "1 day ago"),
1140        param('dav', "kesho 02:12 luma lwa p", "in 1 day 02:12 pm"),
1141        param('dav', "15 juma", "15 week"),
1142        # de
1143        param('de', "nächstes jahr", "in 1 year"),
1144        param('de', "letzte woche 04:25 nachm", "1 week ago 04:25 pm"),
1145        # dje
1146        param('dje', "hõo 08:08 subbaahi", "0 day ago 08:08 am"),
1147        param('dje', "suba", "in 1 day"),
1148        param('dje', "7 handu", "7 month"),
1149        # dsb
1150        param('dsb', "pśed 10 góźinami", "10 hour ago"),
1151        param('dsb', "za 43 minutow", "in 43 minute"),
1152        param('dsb', "pśiducy tyźeń", "in 1 week"),
1153        # dua
1154        param('dua', "kíɛlɛ nítómb́í", "1 day ago"),
1155        param('dua', "12 ŋgandɛ", "12 hour"),
1156        param('dua', "wɛ́ŋgɛ̄", "0 day ago"),
1157        # dyo
1158        param('dyo', "fucen", "1 day ago"),
1159        param('dyo', "kajom", "in 1 day"),
1160        param('dyo', "6 fuleeŋ", "6 month"),
1161        # dz
1162        param('dz', "ནངས་པ་", "in 1 day"),
1163        param('dz', "སྐར་མ་ 3 ནང་", "in 3 minute"),
1164        param('dz', "ལོ་འཁོར་ 21 ཧེ་མ་", "21 year ago"),
1165        # ebu
1166        param('ebu', "ĩgoro", "1 day ago"),
1167        param('ebu', "2 ndagĩka", "2 minute"),
1168        param('ebu', "rũciũ", "in 1 day"),
1169        # ee
1170        param('ee', "ɣleti si va yi", "1 month ago"),
1171        param('ee', "ƒe 24 si wo va yi", "24 year ago"),
1172        param('ee', "le sekend 20 me", "in 20 second"),
1173        # el
1174        param('el', "πριν από 45 λεπτό", "45 minute ago"),
1175        param('el', "σε 22 μήνες", "in 22 month"),
1176        param('el', "επόμενη εβδομάδα 12:09 μμ", "in 1 week 12:09 pm"),
1177        # et
1178        param('et', "eelmine nädal", "1 week ago"),
1179        param('et', "1 a pärast", "in 1 year"),
1180        param('et', "4 tunni eest", "4 hour ago"),
1181        # eu
1182        param('eu', "aurreko hilabetea", "1 month ago"),
1183        param('eu', "duela 15 segundo", "15 second ago"),
1184        param('eu', "2 hilabete barru", "in 2 month"),
1185        # ewo
1186        param('ewo', "okírí", "in 1 day"),
1187        param('ewo', "angogé 10:15 kíkíríg", "1 day ago 10:15 am"),
1188        param('ewo', "5 m̀bú", "5 year"),
1189        # ff
1190        param('ff', "hannde", "0 day ago"),
1191        param('ff', "haŋki 01:14 subaka", "1 day ago 01:14 am"),
1192        param('ff', "2 yontere", "2 week"),
1193        # fil
1194        param('fil', "22 min ang nakalipas", "22 minute ago"),
1195        param('fil', "sa 5 taon", "in 5 year"),
1196        param('fil', "nakalipas na linggo", "1 week ago"),
1197        # fo
1198        param('fo', "seinasta mánað", "1 month ago"),
1199        param('fo', "um 3 viku", "in 3 week"),
1200        param('fo', "7 tímar síðan", "7 hour ago"),
1201        # fur
1202        param('fur', "ca di 16 setemanis", "in 16 week"),
1203        param('fur', "15 secont indaûr", "15 second ago"),
1204        param('fur', "doman", "in 1 day"),
1205        # fy
1206        param('fy', "folgjende moanne", "in 1 month"),
1207        param('fy', "oer 24 oere", "in 24 hour"),
1208        param('fy', "2 deien lyn", "2 day ago"),
1209        # ga
1210        param('ga', "i gceann 6 nóiméad", "in 6 minute"),
1211        param('ga', "12 seachtain ó shin", "12 week ago"),
1212        param('ga', "an bhliain seo chugainn", "in 1 year"),
1213        # gd
1214        param('gd', "an ceann 2 mhìosa", "in 2 month"),
1215        param('gd', "15 uair a thìde air ais", "15 hour ago"),
1216        param('gd', "am mìos seo chaidh", "1 month ago"),
1217        # gl
1218        param('gl', "hai 25 semanas", "25 week ago"),
1219        param('gl', "en 2 horas", "in 2 hour"),
1220        param('gl', "o ano pasado", "1 year ago"),
1221        # gsw
1222        param('gsw', "moorn", "in 1 day"),
1223        param('gsw', "geschter", "1 day ago"),
1224        # gu
1225        param('gu', "2 વર્ષ પહેલા", "2 year ago"),
1226        param('gu', "આવતા મહિને", "in 1 month"),
1227        param('gu', "22 કલાક પહેલાં", "22 hour ago"),
1228        # guz
1229        param('guz', "mambia", "in 1 day"),
1230        param('guz', "igoro", "1 day ago"),
1231        # ha
1232        param('ha', "gobe", "in 1 day"),
1233        param('ha', "jiya", "1 day ago"),
1234        # hr
1235        param('hr', "prije 3 dana", "3 day ago"),
1236        param('hr', "sljedeći mjesec", "in 1 month"),
1237        param('hr', "za 2 sati", "in 2 hour"),
1238        # hsb
1239        param('hsb', "před 5 tydźenjemi", "5 week ago"),
1240        param('hsb', "za 60 sekundow", "in 60 second"),
1241        param('hsb', "lětsa", "0 year ago"),
1242        # hy
1243        param('hy', "հաջորդ ամիս", "in 1 month"),
1244        param('hy', "2 վայրկյան առաջ", "2 second ago"),
1245        param('hy', "3 տարուց", "in 3 year"),
1246        # id
1247        param('id', "5 tahun yang lalu", "5 year ago"),
1248        param('id', "dalam 43 menit", "in 43 minute"),
1249        param('id', "dlm 23 dtk", "in 23 second"),
1250        # ig
1251        param('ig', "nnyaafụ", "1 day ago"),
1252        param('ig', "taata", "0 day ago"),
1253        # is
1254        param('is', "í næstu viku", "in 1 week"),
1255        param('is', "fyrir 3 mánuðum", "3 month ago"),
1256        param('is', "eftir 2 klst", "in 2 hour"),
1257        # it
1258        param('it', "tra 3 minuti", "in 3 minute"),
1259        param('it', "5 giorni fa", "5 day ago"),
1260        param('it', "anno prossimo", "in 1 year"),
1261        # jgo
1262        param('jgo', "ɛ́ gɛ mɔ́ 20 háwa", "20 hour ago"),
1263        param('jgo', "ɛ́ gɛ́ mɔ́ pɛsaŋ 5", "5 month ago"),
1264        param('jgo', "nǔu ŋguꞌ 2", "in 2 year"),
1265        # jmc
1266        param('jmc', "ngama", "in 1 day"),
1267        param('jmc', "ukou", "1 day ago"),
1268        # ka
1269        param('ka', "ამ საათში", "0 hour ago"),
1270        param('ka', "7 კვირის წინ", "7 week ago"),
1271        param('ka', "6 წუთში", "in 6 minute"),
1272        # kab
1273        param('kab', "iḍelli", "1 day ago"),
1274        param('kab', "ass-a", "0 day ago"),
1275        # kam
1276        param('kam', "ũmũnthĩ", "0 day ago"),
1277        param('kam', "ũnĩ", "in 1 day"),
1278        # kde
1279        param('kde', "nundu", "in 1 day"),
1280        param('kde', "lido", "1 day ago"),
1281        # kea
1282        param('kea', "es simana li", "0 week ago"),
1283        param('kea', "di li 2 min", "in 2 minute"),
1284        param('kea', "a ten 6 anu", "6 year ago"),
1285        # khq
1286        param('khq', "hõo", "0 day ago"),
1287        param('khq', "bi", "1 day ago"),
1288        # ki
1289        param('ki', "rũciũ", "in 1 day"),
1290        param('ki', "ira", "1 day ago"),
1291        # kk
1292        param('kk', "3 апта бұрын", "3 week ago"),
1293        param('kk', "5 секундтан кейін", "in 5 second"),
1294        param('kk', "өткен ай", "1 month ago"),
1295        # kl
1296        param('kl', "om 8 sapaatip-akunnera", "in 8 week"),
1297        param('kl', "for 6 ukioq siden", "6 year ago"),
1298        param('kl', "om 56 minutsi", "in 56 minute"),
1299        # kln
1300        param('kln', "raini", "0 day ago"),
1301        param('kln', "mutai", "in 1 day"),
1302        # km
1303        param('km', "ម៉ោងនេះ", "0 hour ago"),
1304        param('km', "19 ខែមុន", "19 month ago"),
1305        param('km', "ក្នុង​រយៈ​ពេល 23 ម៉ោង", "in 23 hour"),
1306        # kn
1307        param('kn', "18 ತಿಂಗಳುಗಳ ಹಿಂದೆ", "18 month ago"),
1308        param('kn', "26 ಸೆಕೆಂಡ್‌ನಲ್ಲಿ", "in 26 second"),
1309        param('kn', "ಈ ನಿಮಿಷ", "0 minute ago"),
1310        # ko
1311        param('ko', "2분 후", "in 2 minute"),
1312        param('ko', "5년 전", "5 year ago"),
1313        param('ko', "다음 달", "in 1 month"),
1314        # ksb
1315        param('ksb', "keloi", "in 1 day"),
1316        param('ksb', "evi eo", "0 day ago"),
1317        # ksf
1318        param('ksf', "ridúrǝ́", "in 1 day"),
1319        param('ksf', "rinkɔɔ́", "1 day ago"),
1320        # ksh
1321        param('ksh', "nächste woche", "in 1 week"),
1322        param('ksh', "en 3 johre", "in 3 year"),
1323        param('ksh', "diese mohnd", "0 month ago"),
1324        # ky
1325        param('ky', "ушул мүнөттө", "0 minute ago"),
1326        param('ky', "6 айд кийин", "in 6 month"),
1327        param('ky', "5 мүнөт мурун", "5 minute ago"),
1328        # lag
1329        param('lag', "lamʉtoondo", "in 1 day"),
1330        param('lag', "niijo", "1 day ago"),
1331        # lb
1332        param('lb', "virun 2 stonn", "2 hour ago"),
1333        param('lb', "an 5 joer", "in 5 year"),
1334        param('lb', "leschte mount", "1 month ago"),
1335        # lg
1336        param('lg', "nkya", "in 1 day"),
1337        param('lg', "ggulo", "1 day ago"),
1338        # lkt
1339        param('lkt', "hékta wíyawapi 8 k'uŋ héhaŋ", "8 month ago"),
1340        param('lkt', "tȟokáta okó kiŋháŋ", "in 1 week"),
1341        param('lkt', "letáŋhaŋ owápȟe 4 kiŋháŋ", "in 4 hour"),
1342        # ln
1343        param('ln', "lóbi elékí", "1 day ago"),
1344        param('ln', "lóbi ekoyâ", "in 1 day"),
1345        # lo
1346        param('lo', "ໃນອີກ 5 ຊົ່ວໂມງ", "in 5 hour"),
1347        param('lo', "3 ປີກ່ອນ", "3 year ago"),
1348        # lt
1349        param('lt', "praėjusią savaitę", "1 week ago"),
1350        param('lt', "prieš 12 mėnesį", "12 month ago"),
1351        param('lt', "po 2 valandų", "in 2 hour"),
1352        # lu
1353        param('lu', "lelu", "0 day ago"),
1354        param('lu', "makelela", "1 day ago"),
1355        # luo
1356        param('luo', "nyoro", "1 day ago"),
1357        param('luo', "kiny", "in 1 day"),
1358        # luy
1359        param('luy', "mgorova", "1 day ago"),
1360        param('luy', "lero", "0 day ago"),
1361        # lv
1362        param('lv', "pēc 67 minūtes", "in 67 minute"),
1363        param('lv', "pirms 5 nedēļām", "5 week ago"),
1364        param('lv', "nākamajā gadā", "in 1 year"),
1365        # mas
1366        param('mas', "tááisérè", "in 1 day"),
1367        param('mas', "ŋolé", "1 day ago"),
1368        # mer
1369        param('mer', "ĩgoro", "1 day ago"),
1370        param('mer', "narua", "0 day ago"),
1371        # mfe
1372        param('mfe', "zordi", "0 day ago"),
1373        param('mfe', "demin", "in 1 day"),
1374        # mg
1375        param('mg', "rahampitso", "in 1 day"),
1376        param('mg', "omaly", "1 day ago"),
1377        # mgh
1378        param('mgh', "lel'lo", "0 day ago"),
1379        param('mgh', "n'chana", "1 day ago"),
1380        # mgo
1381        param('mgo', "ikwiri", "1 day ago"),
1382        param('mgo', "isu", "in 1 day"),
1383        # mk
1384        param('mk', "пред 4 минута", "4 minute ago"),
1385        param('mk', "за 6 месеци", "in 6 month"),
1386        param('mk', "минатата година", "1 year ago"),
1387        # ml
1388        param('ml', "ഈ മിനിറ്റിൽ", "0 minute ago"),
1389        param('ml', "7 മണിക്കൂറിൽ", "in 7 hour"),
1390        param('ml', "2 വർഷം മുമ്പ്", "2 year ago"),
1391        # mn
1392        param('mn', "5 цагийн өмнө", "5 hour ago"),
1393        param('mn', "10 жилийн дараа", "in 10 year"),
1394        param('mn', "өнгөрсөн долоо хоног", "1 week ago"),
1395        # mr
1396        param('mr', "2 मिनिटांमध्ये", "in 2 minute"),
1397        param('mr', "5 महिन्यापूर्वी", "5 month ago"),
1398        param('mr', "हे वर्ष", "0 year ago"),
1399        # ms
1400        param('ms', "dalam 7 hari", "in 7 day"),
1401        param('ms', "3 thn lalu", "3 year ago"),
1402        param('ms', "bulan depan", "in 1 month"),
1403        # mt
1404        param('mt', "ix-xahar li għadda", "1 month ago"),
1405        param('mt', "2 sena ilu", "2 year ago"),
1406        param('mt', "il-ġimgħa d-dieħla", "in 1 week"),
1407        # mua
1408        param('mua', "tǝ'nahko", "0 day ago"),
1409        param('mua', "tǝ'nane", "in 1 day"),
1410        # my
1411        param('my', "ပြီးခဲ့သည့် 7 မိနစ်", "7 minute ago"),
1412        param('my', "12 လအတွင်း", "in 12 month"),
1413        param('my', "ယခု သီတင်းပတ်", "0 week ago"),
1414        # nb
1415        param('nb', "om 6 timer", "in 6 hour"),
1416        param('nb', "om 2 måneder", "in 2 month"),
1417        param('nb', "forrige uke", "1 week ago"),
1418        # nd
1419        param('nd', "kusasa", "in 1 day"),
1420        param('nd', "izolo", "1 day ago"),
1421        # ne
1422        param('ne', "5 वर्ष अघि", "5 year ago"),
1423        param('ne', "35 मिनेटमा", "in 35 minute"),
1424        param('ne', "यो हप्ता", "0 week ago"),
1425        # nl
1426        param('nl', "15 dgn geleden", "15 day ago"),
1427        param('nl', "over 2 maand", "in 2 month"),
1428        param('nl', "vorige jaar", "1 year ago"),
1429        # nmg
1430        param('nmg', "nakugú", "1 day ago"),
1431        param('nmg', "namáná", "in 1 day"),
1432        # nn
1433        param('nn', "for 5 minutter siden", "5 minute ago"),
1434        param('nn', "om 3 uker", "in 3 week"),
1435        param('nn', "i morgon", "in 1 day"),
1436        # nnh
1437        param('nnh', "jǔɔ gẅie à ne ntóo", "in 1 day"),
1438        param('nnh', "jǔɔ gẅie à ka tɔ̌g", "1 day ago"),
1439        # nus
1440        param('nus', "ruun", "in 1 day"),
1441        param('nus', "walɛ 06:23 tŋ", "0 day ago 06:23 pm"),
1442        # nyn
1443        param('nyn', "nyomwabazyo", "1 day ago"),
1444        param('nyn', "erizooba", "0 day ago"),
1445        # os
1446        param('os', "3 боны размӕ", "3 day ago"),
1447        param('os', "47 сахаты фӕстӕ", "in 47 hour"),
1448        param('os', "знон", "1 day ago"),
1449        # pa-Guru
1450        param('pa-Guru', "ਅਗਲਾ ਹਫ਼ਤਾ", "in 1 week"),
1451        param('pa-Guru', "5 ਮਹੀਨੇ ਪਹਿਲਾਂ", "5 month ago"),
1452        param('pa-Guru', "22 ਮਿੰਟਾਂ ਵਿੱਚ", "in 22 minute"),
1453        # pa
1454        param('pa', "15 ਘੰਟੇ ਪਹਿਲਾਂ", "15 hour ago"),
1455        param('pa', "16 ਸਕਿੰਟ ਵਿੱਚ", "in 16 second"),
1456        param('pa', "ਅਗਲਾ ਸਾਲ", "in 1 year"),
1457        # pl
1458        param('pl', "6 tygodni temu", "6 week ago"),
1459        param('pl', "za 8 lat", "in 8 year"),
1460        param('pl', "ta minuta", "0 minute ago"),
1461        # rm
1462        param('rm', "damaun", "in 1 day"),
1463        param('rm', "ier", "1 day ago"),
1464        # ro
1465        param('ro', "acum 2 de ore", "2 hour ago"),
1466        param('ro', "peste 5 de ani", "in 5 year"),
1467        param('ro', "săptămâna trecută", "1 week ago"),
1468        # rof
1469        param('rof', "linu", "0 day ago"),
1470        param('rof', "ng'ama", "in 1 day"),
1471        # ru
1472        param('ru', "12 секунды назад", "12 second ago"),
1473        param('ru', "через 8 месяца", "in 8 month"),
1474        param('ru', "в прошлом году", "1 year ago"),
1475        # rwk
1476        param('rwk', "ukou", "1 day ago"),
1477        param('rwk', "ngama", "in 1 day"),
1478        # sah
1479        param('sah', "20 чаас ынараа өттүгэр", "20 hour ago"),
1480        param('sah', "50 сылынан", "in 50 year"),
1481        param('sah', "ааспыт нэдиэлэ", "1 week ago"),
1482        # saq
1483        param('saq', "duo", "0 day ago"),
1484        param('saq', "taisere", "in 1 day"),
1485        # sbp
1486        param('sbp', "pamulaawu", "in 1 day"),
1487        param('sbp', "ineng'uni", "0 day ago"),
1488        # se
1489        param('se', "51 minuhta maŋŋilit", "in 51 minute"),
1490        param('se', "3 jahkki árat", "3 year ago"),
1491        param('se', "ihttin", "in 1 day"),
1492        # seh
1493        param('seh', "manguana", "in 1 day"),
1494        param('seh', "zuro", "1 day ago"),
1495        # ses
1496        param('ses', "suba", "in 1 day"),
1497        param('ses', "hõo", "0 day ago"),
1498        # sg
1499        param('sg', "bîrï", "1 day ago"),
1500        param('sg', "lâsô", "0 day ago"),
1501        # shi-Latn
1502        param('shi-Latn', "iḍlli", "1 day ago"),
1503        param('shi-Latn', "askka 06:15 tifawt", "in 1 day 06:15 am"),
1504        # shi-Tfng
1505        param('shi-Tfng', "ⴰⵙⴽⴽⴰ", "in 1 day"),
1506        param('shi-Tfng', "ⴰⵙⵙⴰ", "0 day ago"),
1507        # shi
1508        param('shi', "ⵉⴹⵍⵍⵉ", "1 day ago"),
1509        # si
1510        param('si', "තත්පර 14කින්", "in 14 second"),
1511        param('si', "වසර 2කට පෙර", "2 year ago"),
1512        param('si', "මෙම සතිය", "0 week ago"),
1513        # sk
1514        param('sk', "pred 11 týždňami", "11 week ago"),
1515        param('sk', "o 25 rokov", "in 25 year"),
1516        param('sk', "v tejto hodine", "0 hour ago"),
1517        # sl
1518        param('sl', "pred 4 dnevom", "4 day ago"),
1519        param('sl', "čez 76 leto", "in 76 year"),
1520        param('sl', "naslednji mesec", "in 1 month"),
1521        # sn
1522        param('sn', "mangwana", "in 1 day"),
1523        param('sn', "nhasi", "0 day ago"),
1524        # so
1525        param('so', "berri", "in 1 day"),
1526        param('so', "shalay", "1 day ago"),
1527        # sq
1528        param('sq', "pas 6 muajsh", "in 6 month"),
1529        param('sq', "72 orë më parë", "72 hour ago"),
1530        param('sq', "javën e ardhshme", "in 1 week"),
1531        # sr-Cyrl
1532        param('sr-Cyrl', "пре 5 година", "5 year ago"),
1533        param('sr-Cyrl', "за 52 нед", "in 52 week"),
1534        param('sr-Cyrl', "данас", "0 day ago"),
1535        # sr-Latn
1536        param('sr-Latn', "za 120 sekundi", "in 120 second"),
1537        param('sr-Latn', "pre 365 dana", "365 day ago"),
1538        param('sr-Latn', "prošle nedelje", "1 week ago"),
1539        # sr
1540        param('sr', "пре 40 сати", "40 hour ago"),
1541        param('sr', "за 100 год", "in 100 year"),
1542        param('sr', "овог месеца", "0 month ago"),
1543        # sv
1544        param('sv', "för 15 vecka sedan", "15 week ago"),
1545        param('sv', "om 2 sekunder", "in 2 second"),
1546        param('sv', "förra året", "1 year ago"),
1547        # sw
1548        param('sw', "sekunde 25 zilizopita", "25 second ago"),
1549        param('sw', "miezi 5 iliyopita", "5 month ago"),
1550        param('sw', "mwaka uliopita", "1 year ago"),
1551        # ta
1552        param('ta', "7 நாட்களுக்கு முன்", "7 day ago"),
1553        param('ta', "45 ஆண்டுகளில்", "in 45 year"),
1554        param('ta', "இப்போது", "0 second ago"),
1555        # te
1556        param('te', "12 గంటల క్రితం", "12 hour ago"),
1557        param('te', "25 సంవత్సరాల్లో", "in 25 year"),
1558        param('te', "గత వారం", "1 week ago"),
1559        # teo
1560        param('teo', "moi", "in 1 day"),
1561        param('teo', "lolo", "0 day ago"),
1562        # to
1563        param('to', "miniti 'e 5 kuo'osi", "5 minute ago"),
1564        param('to', "'i he ta'u 'e 6", "in 6 year"),
1565        param('to', "'aneafi", "1 day ago"),
1566        # tr
1567        param('tr', "11 saat önce", "11 hour ago"),
1568        param('tr', "10 yıl sonra", "in 10 year"),
1569        param('tr', "geçen ay", "1 month ago"),
1570        # twq
1571        param('twq', "hõo", "0 day ago"),
1572        param('twq', "suba", "in 1 day"),
1573        # tzm
1574        param('tzm', "assenaṭ", "1 day ago"),
1575        param('tzm', "asekka", "in 1 day"),
1576        # uk
1577        param('uk', "18 хвилину тому", "18 minute ago"),
1578        param('uk', "через 22 року", "in 22 year"),
1579        param('uk', "цього тижня", "0 week ago"),
1580        # uz-Cyrl
1581        param('uz-Cyrl', "кейинги ой", "in 1 month"),
1582        param('uz-Cyrl', "30 йил аввал", "30 year ago"),
1583        param('uz-Cyrl', "59 сониядан сўнг", "in 59 second"),
1584        # uz-Latn
1585        param('uz-Latn', "3 haftadan keyin", "in 3 week"),
1586        param('uz-Latn', "5 soat oldin", "5 hour ago"),
1587        param('uz-Latn', "shu yil", "0 year ago"),
1588        # uz
1589        param('uz', "25 soat oldin", "25 hour ago"),
1590        param('uz', "8 yildan keyin", "in 8 year"),
1591        param('uz', "bugun", "0 day ago"),
1592        # vi
1593        param('vi', "sau 22 giờ nữa", "in 22 hour"),
1594        param('vi', "15 tháng trước", "15 month ago"),
1595        param('vi', "tuần sau", "in 1 week"),
1596        # vun
1597        param('vun', "ngama", "in 1 day"),
1598        param('vun', "ukou", "1 day ago"),
1599        # wae
1600        param('wae', "vor 11 minüta", "11 minute ago"),
1601        param('wae', "i 15 wuča", "in 15 week"),
1602        param('wae', "hitte", "0 day ago"),
1603        # xog
1604        param('xog', "enkyo", "in 1 day"),
1605        param('xog', "edho", "1 day ago"),
1606        # yav
1607        param('yav', "ínaan", "0 day ago"),
1608        param('yav', "nakinyám", "in 1 day"),
1609        # yo
1610        param('yo', "ọ̀la", "in 1 day"),
1611        param('yo', "òní", "0 day ago"),
1612        # yue
1613        param('yue', "13 個星期後", "in 13 week"),
1614        param('yue', "2 小時前", "2 hour ago"),
1615        param('yue', "上個月", "1 month ago"),
1616        # zgh
1617        param('zgh', "ⴰⵙⵙⴰ", "0 day ago"),
1618        param('zgh', "ⵉⴹⵍⵍⵉ", "1 day ago"),
1619        # zh-Hans
1620        param('zh-Hans', "3秒钟后", "in 3 second"),
1621        param('zh-Hans', "4年后", "in 4 year"),
1622        param('zh-Hans', "上周", "1 week ago"),
1623        # zh-Hant
1624        param('zh-Hant', "7 分鐘後", "in 7 minute"),
1625        param('zh-Hant', "12 個月前", "12 month ago"),
1626        param('zh-Hant', "這一小時", "0 hour ago"),
1627        # zu
1628        param('zu', "10 amaminithi edlule", "10 minute ago"),
1629        param('zu', "20 unyaka odlule", "20 year ago"),
1630        param('zu', "manje", "0 second ago"),
1631    ])
1632    def test_freshness_translation(self, shortname, datetime_string, expected_translation):
1633        self.given_settings(settings={'NORMALIZE': False})
1634        # Finnish language use "t" as hour, so empty SKIP_TOKENS.
1635        if shortname == 'fi':
1636            self.settings.SKIP_TOKENS = []
1637        self.given_bundled_language(shortname)
1638        self.given_string(datetime_string)
1639        self.when_datetime_string_translated()
1640        self.then_string_translated_to(expected_translation)
1641
1642    @parameterized.expand([
1643        param('pt', "sexta-feira, 10 de junho de 2014 14:52",
1644              ["sexta-feira", " ", "10", " ", "de", " ", "junho", " ", "de", " ", "2014", " ", "14", ":", "52"]),
1645        param('it', "14_luglio_15", ["14", "luglio", "15"]),
1646        param('zh', "1年11个月", ["1", "年", "11", "个月"]),
1647        param('zh', "1年11個月", ["1", "年", "11", "個月"]),
1648        param('tr', "2 saat önce", ["2 saat önce"]),
1649        param('fr', "il ya environ 23 heures'",
1650              ["il ya", " ", "environ", " ", "23", " ", "heures"]),
1651        param('de', "Gestern um 04:41",
1652              ['Gestern', ' ', 'um', ' ', '04', ':', '41']),
1653        param('de', "Donnerstag, 8. Januar 2015 um 07:17",
1654              ['Donnerstag', ' ', '8', '.', ' ', 'Januar', ' ', '2015', ' ', 'um', ' ', '07', ':', '17']),
1655        param('ru', "8 января 2015 г. в 9:10",
1656              ['8', ' ', 'января', ' ', '2015', ' ', 'г', '.', ' ', 'в', ' ', '9', ':', '10']),
1657        param('cs', "6. leden 2015 v 22:29",
1658              ['6', '.', ' ', 'leden', ' ', '2015', ' ', 'v', ' ', '22', ':', '29']),
1659        param('nl', "woensdag 7 januari 2015 om 21:32",
1660              ['woensdag', ' ', '7', ' ', 'januari', ' ', '2015', ' ', 'om', ' ', '21', ':', '32']),
1661        param('ro', "8 Ianuarie 2015 la 13:33",
1662              ['8', ' ', 'Ianuarie', ' ', '2015', ' ', 'la', ' ', '13', ':', '33']),
1663        param('ar', "8 يناير، 2015، الساعة 10:01 صباحاً",
1664              ['8', ' ', 'يناير', ' ', '2015', 'الساعة', ' ', '10', ':', '01',  ' ','صباحاً']),
1665        param('th', "8 มกราคม 2015 เวลา 12:22 น.",
1666              ['8', ' ', 'มกราคม', ' ', '2015', ' ', 'เวลา', ' ', '12', ':', '22', ' ', 'น.']),
1667        param('pl', "8 stycznia 2015 o 10:19",
1668              ['8', ' ', 'stycznia', ' ', '2015', ' ', 'o', ' ', '10', ':', '19']),
1669        param('vi', "Thứ Năm, ngày 8 tháng 1 năm 2015",
1670              ["Thứ Năm", " ", "ngày", " ", "8", " ", "tháng 1", " ", "năm", " ", "2015"]),
1671        param('tl', "Biyernes Hulyo 3 2015",
1672              ["Biyernes", " ", "Hulyo", " ", "3", " ", "2015"]),
1673        param('be', "3 верасня 2015 г. у 11:10",
1674              ['3', ' ', 'верасня', ' ', '2015', ' ', 'г', '.', ' ', 'у', ' ', '11', ':', '10']),
1675        param('id', "3 Juni 2015 13:05:46",
1676              ['3', ' ', 'Juni', ' ', '2015', ' ', '13', ':', '05', ':', '46']),
1677        param('he', "ה-21 לאוקטובר 2016 ב-15:00",
1678              ['ה-', '21', ' ', 'לאוקטובר', ' ', '2016', ' ', 'ב-', '15', ':', '00']),
1679        param('bn', "3 জুন 2015 13:05:46",
1680              ['3', ' ', 'জুন', ' ', '2015', ' ', '13', ':', '05', ':', '46']),
1681        param('hi', "13 मार्च 2013 11:15:09",
1682              ['13', ' ', 'मार्च', ' ', '2013', ' ', '11', ':', '15', ':', '09']),
1683        param('mgo', "aneg 5 12 iməg àdùmbə̀ŋ 2001 09:14 pm",
1684              ['aneg 5', ' ', '12', ' ', 'iməg àdùmbə̀ŋ', ' ', '2001', ' ', '09', ':', '14', ' ', 'pm']),
1685        param('qu', "2 kapaq raymi 1998 domingo", ['2', ' ', 'kapaq raymi', ' ', '1998', ' ', 'domingo']),
1686        param('os', "24 сахаты размӕ 10:09 ӕмбисбоны размӕ",
1687              ['24 сахаты размӕ', ' ', '10', ':', '09', ' ', 'ӕмбисбоны размӕ']),
1688        param('pa', "25 ਘੰਟੇ ਪਹਿਲਾਂ 10:08 ਬਾਦੁ",
1689              ['25 ਘੰਟੇ ਪਹਿਲਾਂ', ' ', '10', ':', '08', ' ', 'ਬਾਦੁ']),
1690        param('en', "25_April_2008", ['25', 'April', '2008']),
1691        param('af', "hierdie uur 10:19 vm", ['hierdie uur', ' ', '10', ':', '19', ' ', 'vm']),
1692        param('rof', "7 mweri wa kaana 1998 12:09 kang'ama",
1693              ["7", " ", "mweri wa kaana", " ", "1998", " ", "12", ":", "09", " ", "kang'ama"]),
1694        param('saq', "14 lapa le tomon obo 2098 ong",
1695              ["14", " ", "lapa le tomon obo", " ", "2098", " ", "ong"]),
1696        param('wae', "cor 6 wučä 09:19 pm", ['cor 6 wučä', ' ', '09', ':', '19', ' ', 'pm']),
1697        param('naq', "13 ǃkhanǀgôab 1887", ["13", " ", "ǃkhanǀgôab", " ", "1887"]),
1698
1699    ])
1700    def test_split(self, shortname, datetime_string, expected_tokens):
1701        self.given_settings(settings={'NORMALIZE': False})
1702        self.given_bundled_language(shortname)
1703        self.given_string(datetime_string)
1704        self.when_datetime_string_splitted()
1705        self.then_tokens_are(expected_tokens)
1706
1707    @parameterized.expand([
1708        param('en', "17th October, 2034 @ 01:08 am PDT", strip_timezone=True),
1709        param('en', "#@Sept#04#2014", strip_timezone=False),
1710        param('en', "2014-12-13T00:11:00Z", strip_timezone=False),
1711        param('de', "Donnerstag, 8. Januar 2015 um 07:17", strip_timezone=False),
1712        param('da', "Torsdag, 8. januar 2015 kl. 07:17", strip_timezone=False),
1713        param('ru', "8 января 2015 г. в 9:10", strip_timezone=False),
1714        param('cs', "Pondělí v 22:29", strip_timezone=False),
1715        param('nl', "woensdag 7 januari om 21:32", strip_timezone=False),
1716        param('ro', "8 Ianuarie 2015 la 13:33", strip_timezone=False),
1717        param('ar', "ساعتين", strip_timezone=False),
1718        param('tr', "3 hafta", strip_timezone=False),
1719        param('th', "17 เดือนมิถุนายน", strip_timezone=False),
1720        param('pl', "przedwczoraj", strip_timezone=False),
1721        param('fa', "ژانویه 8, 2015، ساعت 15:46", strip_timezone=False),
1722        param('vi', "2 tuần 3 ngày", strip_timezone=False),
1723        param('tl', "Hulyo 3, 2015 7:00 pm", strip_timezone=False),
1724        param('be', "3 верасня 2015 г. у 11:10", strip_timezone=False),
1725        param('id', "01 Agustus 2015 18:23", strip_timezone=False),
1726        param('he', "6 לדצמבר 1973", strip_timezone=False),
1727        param('bn', "3 সপ্তাহ", strip_timezone=False),
1728    ])
1729    def test_applicable_languages(self, shortname, datetime_string, strip_timezone):
1730        self.given_settings()
1731        self.given_bundled_language(shortname)
1732        self.given_string(datetime_string)
1733        self.when_datetime_string_checked_if_applicable(strip_timezone)
1734        self.then_language_is_applicable()
1735
1736    @parameterized.expand([
1737        param('ru', "08.haziran.2014, 11:07", strip_timezone=False),
1738        param('ar', "6 دقیقه", strip_timezone=False),
1739        param('fa', "ساعتين", strip_timezone=False),
1740        param('cs', "3 hafta", strip_timezone=False),
1741    ])
1742    def test_not_applicable_languages(self, shortname, datetime_string, strip_timezone):
1743        self.given_settings()
1744        self.given_bundled_language(shortname)
1745        self.given_string(datetime_string)
1746        self.when_datetime_string_checked_if_applicable(strip_timezone)
1747        self.then_language_is_not_applicable()
1748
1749    @apply_settings
1750    def given_settings(self, settings=None):
1751        self.settings = settings
1752
1753    def given_string(self, datetime_string):
1754        if self.settings.NORMALIZE:
1755            datetime_string = normalize_unicode(datetime_string)
1756        self.datetime_string = datetime_string
1757
1758    def given_bundled_language(self, shortname):
1759        self.language = default_loader.get_locale(shortname)
1760
1761    def when_datetime_string_translated(self):
1762        self.translation = self.language.translate(self.datetime_string, settings=self.settings)
1763
1764    def when_datetime_string_splitted(self, keep_formatting=False):
1765        self.tokens = self.language._get_dictionary(self.settings).split(self.datetime_string)
1766
1767    def when_datetime_string_checked_if_applicable(self, strip_timezone):
1768        self.result = self.language.is_applicable(self.datetime_string, strip_timezone,
1769                                                  settings=self.settings)
1770
1771    def then_string_translated_to(self, expected_string):
1772        self.assertEqual(expected_string, self.translation)
1773
1774    def then_tokens_are(self, expected_tokens):
1775        self.assertEqual(expected_tokens, self.tokens)
1776
1777    def then_language_is_applicable(self):
1778        self.assertTrue(self.result)
1779
1780    def then_language_is_not_applicable(self):
1781        self.assertFalse(self.result)
1782
1783
1784class BaseLanguageDetectorTestCase(BaseTestCase):
1785    __test__ = False
1786
1787    NOT_DETECTED = object()
1788
1789    def setUp(self):
1790        super(BaseLanguageDetectorTestCase, self).setUp()
1791        self.datetime_string = NotImplemented
1792        self.detector = NotImplemented
1793        self.detected_language = NotImplemented
1794        self.known_languages = None
1795
1796    @parameterized.expand([
1797        param("1 january 2015", 'en'),
1798    ])
1799    def test_valid_dates_detected(self, datetime_string, expected_language):
1800        self.given_locales(expected_language)
1801        self.given_detector()
1802        self.given_settings()
1803        self.given_string(datetime_string)
1804        self.when_searching_for_first_applicable_language()
1805        self.then_language_was_detected(expected_language)
1806
1807    @parameterized.expand([
1808        param("foo"),
1809    ])
1810    def test_invalid_dates_not_detected(self, datetime_string):
1811        self.given_locales('en')
1812        self.given_detector()
1813        self.given_settings()
1814        self.given_string(datetime_string)
1815        self.when_searching_for_first_applicable_language()
1816        self.then_no_language_was_detected()
1817
1818    def test_invalid_date_after_valid_date_not_detected(self):
1819        self.given_settings()
1820        self.given_locales('en')
1821        self.given_detector()
1822        self.given_previously_detected_string("1 january 2015")
1823        self.given_string("foo")
1824        self.when_searching_for_first_applicable_language()
1825        self.then_no_language_was_detected()
1826
1827    def test_valid_date_after_invalid_date_detected(self):
1828        self.given_locales('en')
1829        self.given_settings()
1830        self.given_detector()
1831        self.given_previously_detected_string("foo")
1832        self.given_string("1 january 2015")
1833        self.when_searching_for_first_applicable_language()
1834        self.then_language_was_detected('en')
1835
1836    def given_locales(self, *shortnames):
1837        self.known_languages = [default_loader.get_locale(shortname)
1838                                for shortname in shortnames]
1839
1840    @apply_settings
1841    def given_settings(self, settings=None):
1842        self.settings = settings
1843
1844    def given_previously_detected_string(self, datetime_string):
1845        for _ in self.detector.iterate_applicable_languages(
1846                datetime_string, modify=True, settings=self.settings):
1847            break
1848
1849    def given_string(self, datetime_string):
1850        self.datetime_string = datetime_string
1851
1852    def given_detector(self):
1853        raise NotImplementedError
1854
1855    def when_searching_for_first_applicable_language(self):
1856        for language in self.detector.iterate_applicable_languages(self.datetime_string, modify=True,
1857                                                                   settings=self.settings):
1858            self.detected_language = language
1859            break
1860        else:
1861            self.detected_language = self.NOT_DETECTED
1862
1863    def then_language_was_detected(self, shortname):
1864        self.assertIsInstance(self.detected_language, Locale, "Language was not properly detected")
1865        self.assertEqual(shortname, self.detected_language.shortname)
1866
1867    def then_no_language_was_detected(self):
1868        self.assertIs(self.detected_language, self.NOT_DETECTED)
1869
1870
1871class TestExactLanguages(BaseLanguageDetectorTestCase):
1872    __test__ = True
1873
1874    @parameterized.expand([
1875        param("01-01-12", ['en', 'fr']),
1876        param("01-01-12", ['tr', 'ar']),
1877        param("01-01-12", ['ru', 'fr', 'en', 'pl']),
1878        param("01-01-12", ['en']),
1879    ])
1880    def test_exact_languages(self, datetime_string, shortnames):
1881        self.given_settings()
1882        self.given_string(datetime_string)
1883        self.given_known_languages(shortnames)
1884        self.given_detector()
1885        self.when_using_exact_languages()
1886        self.then_exact_languages_were_filtered(shortnames)
1887
1888    @apply_settings
1889    def given_settings(self, settings=None):
1890        self.settings = settings
1891
1892    def given_known_languages(self, shortnames):
1893        self.known_languages = [default_loader.get_locale(shortname)
1894                                for shortname in shortnames]
1895
1896    def given_detector(self):
1897        self.assertIsInstance(self.known_languages, list,
1898                              "Require a list of languages to initialize")
1899        self.assertGreaterEqual(len(self.known_languages), 1,
1900                                "Could only be initialized with one or more languages")
1901        self.detector = ExactLanguages(languages=self.known_languages)
1902
1903    def when_using_exact_languages(self):
1904        self.exact_languages = self.detector.iterate_applicable_languages(
1905            self.datetime_string, modify=True, settings=self.settings)
1906
1907    def then_exact_languages_were_filtered(self, shortnames):
1908        self.assertEqual(set(shortnames), set([lang.shortname for lang in self.exact_languages]))
1909
1910
1911class BaseAutoDetectLanguageDetectorTestCase(BaseLanguageDetectorTestCase):
1912    allow_redetection = NotImplemented
1913
1914    def given_detector(self):
1915        self.detector = AutoDetectLanguage(
1916            languages=self.known_languages, allow_redetection=self.allow_redetection)
1917
1918    @apply_settings
1919    def given_settings(self, settings=None):
1920        self.settings = settings
1921
1922
1923class TestAutoDetectLanguageDetectorWithoutRedetection(BaseAutoDetectLanguageDetectorTestCase):
1924    __test__ = True
1925    allow_redetection = False
1926
1927
1928class TestAutoDetectLanguageDetectorWithRedetection(BaseAutoDetectLanguageDetectorTestCase):
1929    __test__ = True
1930    allow_redetection = True
1931
1932
1933class TestLanguageValidatorWhenInvalid(BaseTestCase):
1934    def setUp(self):
1935        super(TestLanguageValidatorWhenInvalid, self).setUp()
1936        self.validator = LanguageValidator
1937        self.captured_logs = StringIO()
1938        self.validator.get_logger()
1939        self.sh = logging.StreamHandler(self.captured_logs)
1940        self.validator.logger.addHandler(self.sh)
1941        self.log_list = self.captured_logs.getvalue().split('\n')[0]
1942
1943    @staticmethod
1944    def make_python3_msg(text):
1945        text = text.replace('unicode', 'str')
1946        text = text.replace('u\'', '\'')
1947        return text
1948
1949    def get_log_str(self):
1950        return self.make_python3_msg(self.captured_logs.getvalue().split('\n')[0])
1951
1952    @parameterized.expand([
1953        param('en', 'string instead of dict', log_msg="Language 'en' info expected to be dict, "
1954                                                      "but have got str", ),
1955    ])
1956    def test_validate_info_when_invalid_type(self, lang_id, lang_info, log_msg):
1957        result = self.validator.validate_info(lang_id, lang_info)
1958        self.assertEqual(log_msg, self.get_log_str())
1959        self.assertFalse(result)
1960
1961    @parameterized.expand([
1962        param('en', {}, log_msg="Language 'en' does not have a name"),
1963        param('en', {'name': 22}, log_msg="Language 'en' does not have a name"),
1964        param('en', {'name': ''}, log_msg="Language 'en' does not have a name"),
1965    ])
1966    def test_validate_name_when_invalid(self, lang_id, lang_info, log_msg):
1967        result = self.validator._validate_name(lang_id, lang_info)
1968        self.assertEqual(log_msg, self.get_log_str())
1969        self.assertFalse(result)
1970
1971    @parameterized.expand([
1972        param('en', {'no_word_spacing': 'string instead of bool'},
1973              log_msg="Invalid 'no_word_spacing' value 'string instead of bool' for 'en' language: "
1974                      "expected boolean"),
1975    ])
1976    def test_validate_word_spacing_when_invalid(self, lang_id, lang_info, log_msg):
1977        result = self.validator._validate_word_spacing(lang_id, lang_info)
1978        self.assertEqual(log_msg, self.get_log_str())
1979        self.assertFalse(result)
1980
1981    @parameterized.expand([
1982        param('en', {'skip': 'string instead of list'},
1983              log_msg="Invalid 'skip' list for 'en' language: "
1984                      "expected list type but have got str"),
1985        param('en', {'skip': ['']}, log_msg="Invalid 'skip' token '' for 'en' language: "
1986                                            "expected not empty string"),
1987    ])
1988    def test_validate_skip_list_when_invalid(self, lang_id, lang_info, log_msg):
1989        result = self.validator._validate_skip_list(lang_id, lang_info)
1990        self.assertEqual(log_msg, self.get_log_str())
1991        self.assertFalse(result)
1992
1993    @parameterized.expand([
1994        param('en', {}),
1995
1996    ])
1997    def test_validate_skip_list_when_absent(self, lang_id, lang_info):
1998        result = self.validator._validate_skip_list(lang_id, lang_info)
1999        self.assertTrue(result)
2000
2001    @parameterized.expand([
2002        param('en', {'pertain': 'it is a string', 'skip': ['']},
2003              log_msg="Invalid 'pertain' token '' for 'en' language: expected not empty string"),
2004        param('en', {'pertain': [''], 'skip': 'it is a string'},
2005              log_msg="Invalid 'pertain' list for 'en' language: expected list type but have got str"),
2006    ])
2007    def test_validate_pertain_list_when_invalid(self, lang_id, lang_info, log_msg):
2008        result = self.validator._validate_pertain_list(lang_id, lang_info)
2009        self.assertEqual(log_msg, self.get_log_str())
2010        self.assertFalse(result)
2011
2012    @parameterized.expand([
2013        param('en', {}),
2014
2015    ])
2016    def test_validate_pertain_list_when_absent(self, lang_id, lang_info):
2017        result = self.validator._validate_pertain_list(lang_id, lang_info)
2018        self.assertTrue(result)
2019
2020    @parameterized.expand([
2021        param('en', {}, log_msg="No translations for 'monday' provided for 'en' language"),
2022        param('en',
2023              {'monday': 1, 'tuesday': 2, 'wednesday': 3, 'thursday': 4, 'friday': 5, 'saturday': 6, 'sunday': 7},
2024              log_msg="Invalid 'monday' translations list for 'en' language: expected list type but have got int"),
2025        param('en', {'monday': [1], 'tuesday': [2], 'wednesday': [3], 'thursday': [4], 'friday': [5],
2026                     'saturday': [6], 'sunday': [7]},
2027              log_msg="Invalid 'monday' translation 1 for 'en' language: expected not empty string"),
2028    ])
2029    def test_validate_weekdays_when_invalid(self, lang_id, lang_info, log_msg):
2030        result = self.validator._validate_weekdays(lang_id, lang_info)
2031        self.assertEqual(log_msg, self.get_log_str())
2032        self.assertFalse(result)
2033
2034    @parameterized.expand([
2035        param('en', {}, log_msg="No translations for 'january' provided for 'en' language"),
2036        param('en',
2037              {'january': 1, 'february': 2, 'march': 3, 'april': 4, 'may': 5, 'june': 6, 'july': 7,
2038               'august': 8, 'september': 9, 'october': 10, 'november': 11, 'december': 12},
2039              log_msg="Invalid 'january' translations list for 'en' language: expected list type but have got int"),
2040        param('en',
2041              {'january': [1], 'february': [2], 'march': [3], 'april': [4], 'may': [5], 'june': [6], 'july': [7],
2042               'august': [8], 'september': [9], 'october': [10], 'november': [11], 'december': [12]},
2043              log_msg="Invalid 'january' translation 1 for 'en' language: expected not empty string"),
2044    ])
2045    def test_validate_months_when_invalid(self, lang_id, lang_info, log_msg):
2046        result = self.validator._validate_months(lang_id, lang_info)
2047        self.assertEqual(log_msg, self.get_log_str())
2048        self.assertFalse(result)
2049
2050    @parameterized.expand([
2051        param('en', {}, log_msg="No translations for 'year' provided for 'en' language"),
2052        param('en',
2053              {'year': 1, 'month': 2, 'week': 3, 'day': 4, 'hour': 5, 'minute': 6, 'second': 7},
2054              log_msg="Invalid 'year' translations list for 'en' language: expected list type but have got int"),
2055        param('en',
2056              {'year': [1], 'month': [2], 'week': [3], 'day': [4], 'hour': [5], 'minute': [6], 'second': [7]},
2057              log_msg="Invalid 'year' translation 1 for 'en' language: expected not empty string"),
2058    ])
2059    def test_validate_units_when_invalid(self, lang_id, lang_info, log_msg):
2060        result = self.validator._validate_units(lang_id, lang_info)
2061        self.assertEqual(log_msg, self.get_log_str())
2062        self.assertFalse(result)
2063
2064    @parameterized.expand([
2065        param('en', {}, log_msg="No translations for 'ago' provided for 'en' language"),
2066        param('en',
2067              {'ago': 1}, log_msg="Invalid 'ago' translations list for 'en' language: "
2068                                  "expected list type but have got int"),
2069        param('en',
2070              {'ago': []}, log_msg="No translations for 'ago' provided for 'en' language"),
2071        param('en',
2072              {'ago': ['']}, log_msg="Invalid 'ago' translation '' for 'en' language: expected not empty string"),
2073    ])
2074    def test_validate_other_words_when_invalid(self, lang_id, lang_info, log_msg='na'):
2075        result = self.validator._validate_other_words(lang_id, lang_info)
2076        self.assertEqual(log_msg, self.get_log_str())
2077        self.assertFalse(result)
2078
2079    @parameterized.expand([
2080        param('en', {}),
2081
2082    ])
2083    def test_validate_simplifications_when_absent(self, lang_id, lang_info):
2084        result = self.validator._validate_simplifications(lang_id, lang_info)
2085        self.assertTrue(result)
2086
2087    @parameterized.expand([
2088        param('en',
2089              {'simplifications': 'string instead of list'},
2090              log_msg="Invalid 'simplifications' list for 'en' language: expected list type but have got str"),
2091        param('en',
2092              {'simplifications': [{}]},
2093              log_msg="Invalid simplification {} for 'en' language: eash simplification suppose "
2094                      "to be one-to-one mapping"),
2095        param('en',
2096              {'simplifications': [{28: []}]},
2097              log_msg="Invalid simplification {28: []} for 'en' language: each simplification suppose "
2098                      "to be string-to-string-or-int mapping"),
2099        param('en',
2100              {'simplifications': [{'simplification': []}]},
2101              log_msg="Invalid simplification {'simplification': []} for 'en' language: each simplification suppose "
2102                      "to be string-to-string-or-int mapping"),
2103        param('en',
2104              {'simplifications': [{'(\d+)\s*hr(s?)\g<(.+?)>': r'\1 hour\2'}]},
2105              log_msg="Invalid simplification {'(\\\\d+)\\\\s*hr(s?)\\\\g<(.+?)>': '\\\\1 hour\\\\2'} "
2106                      "for 'en' language: groups 3 were not used"),
2107        param('en',
2108              {'simplifications': [{'(one)(two)(three)': r'\1\3\2\4'}]},
2109              log_msg="Invalid simplification {'(one)(two)(three)': '\\\\1\\\\3\\\\2\\\\4'} for 'en' language:"
2110                      " unknown groups 4"),
2111        param('en',
2112              {'simplifications': [{r'(?P<A>\w+)(?P<B>\w+)': '\\g<A>'}]},
2113              log_msg="Invalid simplification {'(?P<A>\\\\w+)(?P<B>\\\\w+)': '\\\\g<A>'} for 'en' language:"
2114                      " groups 2 were not used"),
2115        param('en',
2116              {'simplifications': [{r'(?P<A>\w+)': '\\g<B>(.*?)'}]},
2117              log_msg="Invalid simplification {'(?P<A>\\\\w+)': '\\\\g<B>(.*?)'} for 'en' language: unknown group B"),
2118
2119    ])
2120    def test_validate_simplifications_when_invalid(self, lang_id, lang_info, log_msg):
2121        result = self.validator._validate_simplifications(lang_id, lang_info)
2122        self.assertEqual(log_msg, self.get_log_str())
2123        self.assertFalse(result)
2124
2125    @parameterized.expand([
2126        param('en', {'sentence_splitter_group': 'string instead of int'},
2127              log_msg="Invalid 'sentence_splitter_group' for 'en' language: "
2128                      "expected int type but have got str"),
2129        param('en', {'sentence_splitter_group': 48},
2130              log_msg="Invalid 'sentence_splitter_group' number 48 for 'en' language: "
2131                      "expected number from 1 to 6"),
2132
2133    ])
2134    def test_validate_sentence_splitter_group_when_invalid(self, lang_id, lang_info, log_msg):
2135        result = self.validator._validate_sentence_splitter_group(lang_id, lang_info)
2136        self.assertEqual(log_msg, self.get_log_str())
2137        self.assertFalse(result)
2138
2139    @parameterized.expand([
2140        param('en', {'invalid_key': ''},
2141              log_msg="Extra keys found for 'en' language: 'invalid_key'"),
2142
2143    ])
2144    def test_validate_extra_keys_when_invalid(self, lang_id, lang_info, log_msg):
2145        result = self.validator._validate_extra_keys(lang_id, lang_info)
2146        self.assertEqual(log_msg, self.get_log_str())
2147        self.assertFalse(result)
2148