From 33ec7ef98c215a565c4b44fcae58b1396034db61 Mon Sep 17 00:00:00 2001 From: honza Date: Thu, 7 May 2026 12:50:35 +0200 Subject: [PATCH] Better cs translation (#1325) --- dateparser/data/date_translation_data/cs.py | 358 +++++++++++++++++- .../date_translation_data/cs.yaml | 166 +++++++- tests/test_languages.py | 16 + 3 files changed, 518 insertions(+), 22 deletions(-) diff --git a/dateparser/data/date_translation_data/cs.py b/dateparser/data/date_translation_data/cs.py index 93a93367b..ed7e1ae90 100644 --- a/dateparser/data/date_translation_data/cs.py +++ b/dateparser/data/date_translation_data/cs.py @@ -37,8 +37,7 @@ "července", "červenec", "čvc", - "Črc", - "črv" + "Črc" ], "august": [ "srp", @@ -78,7 +77,8 @@ "st", "středa", "Stř", - "Středu" + "Středu", + "Středy" ], "thursday": [ "čt", @@ -88,13 +88,15 @@ "friday": [ "pá", "pátek", - "Pát" + "Pát", + "Pátku" ], "saturday": [ "so", "sobota", "Sob", - "Sobotu" + "Sobotu", + "Soboty" ], "sunday": [ "ne", @@ -112,14 +114,19 @@ "r", "rok", "roků", - "roky" + "roky", + "let", + "léta", + "lety" ], "month": [ "měs", "měsíc", "měsíců", "měsíce", - "měsícem" + "měsícem", + "měsícemi", + "měsícema" ], "week": [ "týd", @@ -131,7 +138,9 @@ "day": [ "den", "dnů", - "dny" + "dny", + "dnem", + "dní" ], "hour": [ "h", @@ -140,23 +149,27 @@ "hodiny", "hodinou", "hodinu", - "hodinami" + "hodinami", + "hodinama" ], "minute": [ "min", "minuta", "minut", "minutami", - "minuty" + "minuty", + "minutama" ], "second": [ "s", "sekunda", "sekundy", "sekund", + "sekundami", "vteřina", "vteřin", - "vteřiny" + "vteřiny", + "vteřinami" ], "relative-type": { "0 day ago": [ @@ -172,7 +185,11 @@ "tento měsíc" ], "0 second ago": [ - "nyní" + "nyní", + "teď hned", + "teď", + "okamžitě", + "právě teď" ], "0 week ago": [ "tento týd", @@ -195,7 +212,9 @@ "minulý rok" ], "in 1 day": [ - "zítra" + "zítra", + "zítřek", + "zítřka" ], "in 1 month": [ "příští měsíc" @@ -209,6 +228,15 @@ ], "2 day ago": [ "předevčírem" + ], + "3 day ago": [ + "předpředevčírem" + ], + "in 2 day": [ + "pozítří" + ], + "in 3 day": [ + "popozítří" ] }, "relative-type-regex": { @@ -281,12 +309,41 @@ "za (\\d+[.,]?\\d*) let", "za (\\d+[.,]?\\d*) r", "za (\\d+[.,]?\\d*) rok" + ], + "\\1 decade ago": [ + "před (\\d+[.,]?\\d*) desetiletími", + "před (\\d+[.,]?\\d*) dekádami", + "před (\\d+[.,]?\\d*) dekádou", + "před (\\d+[.,]?\\d*) desetiletím" + ], + "in \\1 decade": [ + "za (\\d+[.,]?\\d*) desetiletí", + "za (\\d+[.,]?\\d*) dekád", + "za (\\d+[.,]?\\d*) dekády", + "za (\\d+[.,]?\\d*) dekádu" + ], + "\\1 century ago": [ + "před (\\d+[.,]?\\d*) staletími", + "před (\\d+[.,]?\\d*) stoletími", + "před (\\d+[.,]?\\d*) stoletím" + ], + "in \\1 century": [ + "za (\\d+[.,]?\\d*) staletí", + "za (\\d+[.,]?\\d*) století" ] }, "locale_specific": {}, "skip": [ "přibližně", "v", + "ve", + "přibližně", + "asi", + "zhruba", + "cca", + "kolem", + "okolo", + "někdy", " ", "'", ",", @@ -305,12 +362,281 @@ "před" ], "in": [ - "ve", - "v" + "za" ], "simplifications": [ { - "teď": "0 sekunda" + "(o )?půlnoc(i|í)?": "0:00" + }, + { + "ráno": "AM" + }, + { + "dopoledne": "AM" + }, + { + "odpoledne": "PM" + }, + { + "(pod)?večer": "PM" + }, + { + "budoucí(ho)?": "příští" + }, + { + "nadcházející(ho)?": "příští" + }, + { + "tenhle": "tento" + }, + { + "tohle": "tento" + }, + { + "letos": "tento rok" + }, + { + "vloni": "minulý rok" + }, + { + "loni": "minulý rok" + }, + { + "jed(en|na|no|ním|ným|nou|noho|né|ný)": "1" + }, + { + "dv(a|ě|ou|ěma)": "2" + }, + { + "tř(i|ech|em|emi)": "3" + }, + { + "čty(r|ř)(i|ech|em|mi)": "4" + }, + { + "pět(i)?": "5" + }, + { + "šest(i)?": "6" + }, + { + "sed(u)?m(i)?": "7" + }, + { + "osm(i)?": "8" + }, + { + "devět|devíti": "9" + }, + { + "deset(i)?": "10" + }, + { + "jedenáct(i)?": "11" + }, + { + "dvanáct(i)?": "12" + }, + { + "čtrnáct(i)?": "14" + }, + { + "dvacet(i)?": "20" + }, + { + "třicet(i)?": "30" + }, + { + "první(ho|mu|m)?": "1." + }, + { + "druh(ý|á|é|ého|ému|ým|ou|ýho)": "2." + }, + { + "třet(í|ího|ímu|ím)": "3." + }, + { + "čtvrt(ý|á|é|ého|ému|ým|ou|ýho)": "4." + }, + { + "pát(ý|á|é|ého|ému|ým|ou|ýho)": "5." + }, + { + "šest(ý|á|é|ého|ému|ým|ou|ýho)": "6." + }, + { + "sedm(ý|á|é|ého|ému|ým|ou|ýho)": "7." + }, + { + "osm(ý|á|é|ého|ému|ým|ou|ýho)": "8." + }, + { + "devát(ý|á|é|ého|ému|ým|ou|ýho)": "9." + }, + { + "desát(ý|á|é|ého|ému|ým|ou|ýho)": "10." + }, + { + "jedenáct(ý|á|ého|ému|ým|ou|ýho|é)": "11." + }, + { + "dvanáct(ý|á|ého|ému|ým|ou|ýho|é)": "12." + }, + { + "čtrnáct(ý|á|ého|ému|ým|ou|ýho|é)": "14." + }, + { + "dvacát(ý|á|ého|ému|ým|ou|ýho|é)": "20." + }, + { + "třicát(ý|á|ého|ému|ým|ou|ýho|é)": "30." + }, + { + "(?<=(za|před)\\s)hodin(u|ou)\\b": "1 hodinu" + }, + { + "(?<=(za|před)\\s)minut(u|ou)\\b": "1 minutu" + }, + { + "(?<=(za|před)\\s)(?:vteřin(u|ou)|sekund(u|ou))\\b": "1 sekundu" + }, + { + "(?<=(za|před)\\s)týdn(em)\\b": "1 týden" + }, + { + "(?<=(za|před)\\s)měsíc(em)\\b": "1 měsíc" + }, + { + "(?<=(za|před)\\s)rok(em)\\b": "1 rok" + }, + { + "(?<=(za|před)\\s)den(em)\\b": "1 den" + }, + { + "čtvrt\\s*hodin(y|u)": "15 minut" + }, + { + "čtvrt\\s*hodinou": "15 minutami" + }, + { + "půl\\s*hodin(y|u)": "30 minut" + }, + { + "půl\\s*hodinou": "30 minutami" + }, + { + "tři\\s*čtvrtě\\s*hodin(y|u)": "45 minut" + }, + { + "tři\\s*čtvrtě\\s*hodinou": "45 minutami" + }, + { + "čtvrt na 1\\.?": "12:15" + }, + { + "čtvrt na 2\\.?": "1:15" + }, + { + "čtvrt na 3\\.?": "2:15" + }, + { + "čtvrt na 4\\.?": "3:15" + }, + { + "čtvrt na 5\\.?": "4:15" + }, + { + "čtvrt na 6\\.?": "5:15" + }, + { + "čtvrt na 7\\.?": "6:15" + }, + { + "čtvrt na 8\\.?": "7:15" + }, + { + "čtvrt na 9\\.?": "8:15" + }, + { + "čtvrt na 10\\.?": "9:15" + }, + { + "čtvrt na 11\\.?": "10:15" + }, + { + "čtvrt na 12\\.?": "11:15" + }, + { + "půl 1\\.?": "12:30" + }, + { + "půl 2\\.?": "1:30" + }, + { + "půl 3\\.?": "2:30" + }, + { + "půl 4\\.?": "3:30" + }, + { + "půl 5\\.?": "4:30" + }, + { + "půl 6\\.?": "5:30" + }, + { + "půl 7\\.?": "6:30" + }, + { + "půl 8\\.?": "7:30" + }, + { + "půl 9\\.?": "8:30" + }, + { + "půl 10\\.?": "9:30" + }, + { + "půl 11\\.?": "10:30" + }, + { + "půl 12\\.?": "11:30" + }, + { + "tři\\s*čtvrtě na 1\\.?": "12:45" + }, + { + "tři\\s*čtvrtě na 2\\.?": "1:45" + }, + { + "tři\\s*čtvrtě na 3\\.?": "2:45" + }, + { + "tři\\s*čtvrtě na 4\\.?": "3:45" + }, + { + "tři\\s*čtvrtě na 5\\.?": "4:45" + }, + { + "tři\\s*čtvrtě na 6\\.?": "5:45" + }, + { + "tři\\s*čtvrtě na 7\\.?": "6:45" + }, + { + "tři\\s*čtvrtě na 8\\.?": "7:45" + }, + { + "tři\\s*čtvrtě na 9\\.?": "8:45" + }, + { + "tři\\s*čtvrtě na 10\\.?": "9:45" + }, + { + "tři\\s*čtvrtě na 11\\.?": "10:45" + }, + { + "tři\\s*čtvrtě na 12\\.?": "11:45" } ] } diff --git a/dateparser_data/supplementary_language_data/date_translation_data/cs.yaml b/dateparser_data/supplementary_language_data/date_translation_data/cs.yaml index 610478020..569841a6d 100644 --- a/dateparser_data/supplementary_language_data/date_translation_data/cs.yaml +++ b/dateparser_data/supplementary_language_data/date_translation_data/cs.yaml @@ -1,4 +1,5 @@ -skip: ["přibližně", "v"] +skip: ["přibližně", "v", "ve", "přibližně", "asi", "zhruba", "cca", "kolem", "okolo", "někdy"] + sentence_splitter_group : 1 @@ -9,13 +10,16 @@ tuesday: wednesday: - Stř - Středu + - Středy thursday: - Čtv friday: - Pát + - Pátku saturday: - Sob - Sobotu + - Soboty sunday: - Ned - Neděli @@ -26,15 +30,18 @@ june: - Čer july: - Črc - - črv - year: - roků - roky + - let + - léta + - lety month: - měsíců - měsíce - měsícem + - měsícemi + - měsícema week: - týdnů - týdny @@ -42,32 +49,179 @@ week: day: - dnů - dny + - dnem + - dní + hour: - hodin - hodiny - hodinou - hodinu - hodinami + - hodinama minute: - minut - minutami - minuty + - minutama second: - sekundy - sekund + - sekundami - vteřina - vteřin - vteřiny + - vteřinami ago: - před in: - - ve - - v + # "v" and "ve" is literal translations, but in context of time cz works diferently and uses "za". + - za relative-type: 2 day ago: - předevčírem + 3 day ago: + - předpředevčírem + in 1 day: + - zítřek + - zítřka + in 2 day: + - pozítří + in 3 day: + - popozítří + 0 second ago: + - teď hned + - teď + - okamžitě + - právě teď + +relative-type-regex: + \1 decade ago: + - před (\d+[.,]?\d*) desetiletími + - před (\d+[.,]?\d*) dekádami + - před (\d+[.,]?\d*) dekádou + - před (\d+[.,]?\d*) desetiletím + in \1 decade: + - za (\d+[.,]?\d*) desetiletí + - za (\d+[.,]?\d*) dekád + - za (\d+[.,]?\d*) dekády + - za (\d+[.,]?\d*) dekádu + \1 century ago: + - před (\d+[.,]?\d*) staletími + - před (\d+[.,]?\d*) stoletími + - před (\d+[.,]?\d*) stoletím + in \1 century: + - za (\d+[.,]?\d*) staletí + - za (\d+[.,]?\d*) století simplifications: - - teď: 0 sekunda + # 12-hour modificators + - (o )?půlnoc(i|í)?: 0:00 + - ráno: AM + - dopoledne: AM + - odpoledne: PM + - (pod)?večer: PM + + + # Synonyms + - budoucí(ho)?: příští + - nadcházející(ho)?: příští + - tenhle: tento + - tohle: tento + - letos: tento rok + - vloni: minulý rok + - loni: minulý rok + + # Numbers (Normal) + - jed(en|na|no|ním|ným|nou|noho|né|ný): '1' + - dv(a|ě|ou|ěma): '2' + - tř(i|ech|em|emi): '3' + - čty(r|ř)(i|ech|em|mi): '4' + - pět(i)?: '5' + - šest(i)?: '6' + - sed(u)?m(i)?: '7' + - osm(i)?: '8' + - devět|devíti: '9' + - deset(i)?: '10' + - jedenáct(i)?: '11' + - dvanáct(i)?: '12' + - čtrnáct(i)?: '14' + - dvacet(i)?: '20' + - třicet(i)?: '30' + + # Numbers (Ordinal) + - první(ho|mu|m)?: '1.' + - druh(ý|á|é|ého|ému|ým|ou|ýho): '2.' + - třet(í|ího|ímu|ím): '3.' + - čtvrt(ý|á|é|ého|ému|ým|ou|ýho): '4.' + - pát(ý|á|é|ého|ému|ým|ou|ýho): '5.' + - šest(ý|á|é|ého|ému|ým|ou|ýho): '6.' + - sedm(ý|á|é|ého|ému|ým|ou|ýho): '7.' + - osm(ý|á|é|ého|ému|ým|ou|ýho): '8.' + - devát(ý|á|é|ého|ému|ým|ou|ýho): '9.' + - desát(ý|á|é|ého|ému|ým|ou|ýho): '10.' + - jedenáct(ý|á|ého|ému|ým|ou|ýho|é): '11.' + - dvanáct(ý|á|ého|ému|ým|ou|ýho|é): '12.' + - čtrnáct(ý|á|ého|ému|ým|ou|ýho|é): '14.' + - dvacát(ý|á|ého|ému|ým|ou|ýho|é): '20.' + - třicát(ý|á|ého|ému|ým|ou|ýho|é): '30.' + + # Variant of "1" in places, where czechs would not use the nuber. (e.g. "za 1 hodinu" vs "za hodinu") + - '(?<=(za|před)\s)hodin(u|ou)\b': '1 hodinu' + - '(?<=(za|před)\s)minut(u|ou)\b': '1 minutu' + - '(?<=(za|před)\s)(?:vteřin(u|ou)|sekund(u|ou))\b': '1 sekundu' + - '(?<=(za|před)\s)týdn(em)\b': '1 týden' + - '(?<=(za|před)\s)měsíc(em)\b': '1 měsíc' + - '(?<=(za|před)\s)rok(em)\b': '1 rok' + - '(?<=(za|před)\s)den(em)\b': '1 den' + + # Fractions of hours (For relative time) + - 'čtvrt\s*hodin(y|u)': 15 minut + - 'čtvrt\s*hodinou': 15 minutami + - 'půl\s*hodin(y|u)': 30 minut + - 'půl\s*hodinou': 30 minutami + - 'tři\s*čtvrtě\s*hodin(y|u)': 45 minut + - 'tři\s*čtvrtě\s*hodinou': 45 minutami + + + # Fraction variant of absolute time + - 'čtvrt na 1\.?': '12:15' + - 'čtvrt na 2\.?': '1:15' + - 'čtvrt na 3\.?': '2:15' + - 'čtvrt na 4\.?': '3:15' + - 'čtvrt na 5\.?': '4:15' + - 'čtvrt na 6\.?': '5:15' + - 'čtvrt na 7\.?': '6:15' + - 'čtvrt na 8\.?': '7:15' + - 'čtvrt na 9\.?': '8:15' + - 'čtvrt na 10\.?': '9:15' + - 'čtvrt na 11\.?': '10:15' + - 'čtvrt na 12\.?': '11:15' + + - 'půl 1\.?': '12:30' + - 'půl 2\.?': '1:30' + - 'půl 3\.?': '2:30' + - 'půl 4\.?': '3:30' + - 'půl 5\.?': '4:30' + - 'půl 6\.?': '5:30' + - 'půl 7\.?': '6:30' + - 'půl 8\.?': '7:30' + - 'půl 9\.?': '8:30' + - 'půl 10\.?': '9:30' + - 'půl 11\.?': '10:30' + - 'půl 12\.?': '11:30' + + - 'tři\s*čtvrtě na 1\.?': '12:45' + - 'tři\s*čtvrtě na 2\.?': '1:45' + - 'tři\s*čtvrtě na 3\.?': '2:45' + - 'tři\s*čtvrtě na 4\.?': '3:45' + - 'tři\s*čtvrtě na 5\.?': '4:45' + - 'tři\s*čtvrtě na 6\.?': '5:45' + - 'tři\s*čtvrtě na 7\.?': '6:45' + - 'tři\s*čtvrtě na 8\.?': '7:45' + - 'tři\s*čtvrtě na 9\.?': '8:45' + - 'tři\s*čtvrtě na 10\.?': '9:45' + - 'tři\s*čtvrtě na 11\.?': '10:45' + - 'tři\s*čtvrtě na 12\.?': '11:45' diff --git a/tests/test_languages.py b/tests/test_languages.py index 52b9f2179..406e087ab 100644 --- a/tests/test_languages.py +++ b/tests/test_languages.py @@ -1189,6 +1189,22 @@ def test_translation(self, shortname, datetime_string, expected_translation): param("cs", "40 sekunda", "40 second"), param("cs", "4 týden", "4 week"), param("cs", "14 roků", "14 year"), + param("cs", "20 let", "20 year"), + param("cs", "pět minut", "5 minute"), + param("cs", "před šesti minutami", "6 minute ago"), + param("cs", "sedmého ledna loni", "7. january 1 year ago"), + param("cs", "včera", "1 day ago"), + param("cs", "předevčírem", "2 day ago"), + param("cs", "dnes", "0 day ago"), + param("cs", "teď", "0 second ago"), + param("cs", "před rokem", "ago 1 year"), + param("cs", "prvního ledna 2021 v půl šesté", "1. january 2021 5:30"), + param("cs", "desátého šestý", "10. 6."), + param("cs", "za dvacet let", "in 20 year"), + param("cs", "za čtrnáct dní", "in 14 day"), + param("cs", "čtvrt na tři", "2:15"), + param("cs", "zítra o půlnoci", "in 1 day 0:00"), + param("cs", "v sedum třicet odpoledne", " 7 30 pm"), # Chinese param("zh", "昨天", "1 day ago"), param("zh", "前天", "2 day ago"),