├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── LICENSE_dateparser.txt ├── README.md ├── benchmark-parser_test.go ├── benchmark-search_test.go ├── config.go ├── data-supplementary ├── base_data.yaml └── date-translation │ ├── ar.yaml │ ├── be.yaml │ ├── bg.yaml │ ├── bn.yaml │ ├── ca.yaml │ ├── cs.yaml │ ├── da.yaml │ ├── de.yaml │ ├── en.yaml │ ├── es.yaml │ ├── fa.yaml │ ├── fi.yaml │ ├── fr.yaml │ ├── he.yaml │ ├── hi.yaml │ ├── hr.yaml │ ├── hu.yaml │ ├── id.yaml │ ├── it.yaml │ ├── ja.yaml │ ├── ka.yaml │ ├── nb.yaml │ ├── nl.yaml │ ├── pl.yaml │ ├── pt.yaml │ ├── ro.yaml │ ├── ru.yaml │ ├── sk.yaml │ ├── sv.yaml │ ├── th.yaml │ ├── tl.yaml │ ├── tr.yaml │ ├── uk.yaml │ ├── vi.yaml │ ├── yue.yaml │ ├── zh-Hans.yaml │ ├── zh-Hant.yaml │ └── zh.yaml ├── date └── date.go ├── go.mod ├── go.sum ├── hijri-parser.go ├── internal ├── data │ ├── 00-locale-data.go │ ├── 01-language-order.go │ ├── 02-language-map.go │ ├── 03-language-locales-map.go │ ├── 04-locale-order.go │ ├── af.go │ ├── agq.go │ ├── ak.go │ ├── am.go │ ├── ar.go │ ├── as.go │ ├── asa.go │ ├── ast.go │ ├── az-cyrl.go │ ├── az-latn.go │ ├── az.go │ ├── bas.go │ ├── be.go │ ├── bem.go │ ├── bez.go │ ├── bg.go │ ├── bm.go │ ├── bn.go │ ├── bo.go │ ├── br.go │ ├── brx.go │ ├── bs-cyrl.go │ ├── bs-latn.go │ ├── bs.go │ ├── ca.go │ ├── ce.go │ ├── cgg.go │ ├── chr.go │ ├── ckb.go │ ├── cs.go │ ├── cy.go │ ├── da.go │ ├── dav.go │ ├── de.go │ ├── dje.go │ ├── dsb.go │ ├── dua.go │ ├── dyo.go │ ├── dz.go │ ├── ebu.go │ ├── ee.go │ ├── el.go │ ├── en.go │ ├── eo.go │ ├── es.go │ ├── et.go │ ├── eu.go │ ├── ewo.go │ ├── fa.go │ ├── ff.go │ ├── fi.go │ ├── fil.go │ ├── fo.go │ ├── fr.go │ ├── fur.go │ ├── fy.go │ ├── ga.go │ ├── gd.go │ ├── gl.go │ ├── gsw.go │ ├── gu.go │ ├── guz.go │ ├── gv.go │ ├── ha.go │ ├── haw.go │ ├── he.go │ ├── hi.go │ ├── hr.go │ ├── hsb.go │ ├── hu.go │ ├── hy.go │ ├── id.go │ ├── ig.go │ ├── ii.go │ ├── is.go │ ├── it.go │ ├── ja.go │ ├── jgo.go │ ├── jmc.go │ ├── ka.go │ ├── kab.go │ ├── kam.go │ ├── kde.go │ ├── kea.go │ ├── khq.go │ ├── ki.go │ ├── kk.go │ ├── kl.go │ ├── kln.go │ ├── km.go │ ├── kn.go │ ├── ko.go │ ├── kok.go │ ├── ks.go │ ├── ksb.go │ ├── ksf.go │ ├── ksh.go │ ├── kw.go │ ├── ky.go │ ├── lag.go │ ├── lb.go │ ├── lg.go │ ├── lkt.go │ ├── ln.go │ ├── lo.go │ ├── lrc.go │ ├── lt.go │ ├── lu.go │ ├── luo.go │ ├── luy.go │ ├── lv.go │ ├── mas.go │ ├── mer.go │ ├── mfe.go │ ├── mg.go │ ├── mgh.go │ ├── mgo.go │ ├── mk.go │ ├── ml.go │ ├── mn.go │ ├── mr.go │ ├── ms.go │ ├── mt.go │ ├── mua.go │ ├── my.go │ ├── mzn.go │ ├── naq.go │ ├── nb.go │ ├── nd.go │ ├── ne.go │ ├── nl.go │ ├── nmg.go │ ├── nn.go │ ├── nnh.go │ ├── nus.go │ ├── nyn.go │ ├── om.go │ ├── or.go │ ├── os.go │ ├── pa-arab.go │ ├── pa-guru.go │ ├── pa.go │ ├── pl.go │ ├── ps.go │ ├── pt.go │ ├── qu.go │ ├── rm.go │ ├── rn.go │ ├── ro.go │ ├── rof.go │ ├── ru.go │ ├── rw.go │ ├── rwk.go │ ├── sah.go │ ├── saq.go │ ├── sbp.go │ ├── se.go │ ├── seh.go │ ├── ses.go │ ├── sg.go │ ├── shi-latn.go │ ├── shi-tfng.go │ ├── shi.go │ ├── si.go │ ├── sk.go │ ├── sl.go │ ├── smn.go │ ├── sn.go │ ├── so.go │ ├── sq.go │ ├── sr-cyrl.go │ ├── sr-latn.go │ ├── sr.go │ ├── sv.go │ ├── sw.go │ ├── ta.go │ ├── te.go │ ├── teo.go │ ├── th.go │ ├── ti.go │ ├── tl.go │ ├── to.go │ ├── tr.go │ ├── twq.go │ ├── tzm.go │ ├── ug.go │ ├── uk.go │ ├── ur.go │ ├── uz-arab.go │ ├── uz-cyrl.go │ ├── uz-latn.go │ ├── uz.go │ ├── vi.go │ ├── vun.go │ ├── wae.go │ ├── xog.go │ ├── yav.go │ ├── yi.go │ ├── yo.go │ ├── yue.go │ ├── zgh.go │ ├── zh-hans.go │ ├── zh-hant.go │ ├── zh.go │ └── zu.go ├── dateutil │ ├── dateutil.go │ └── dateutil_test.go ├── digit │ └── digit.go ├── language │ ├── 00-constant.go │ ├── applicable-check.go │ ├── applicable-check_test.go │ ├── detector.go │ ├── detector_test.go │ ├── languages.go │ ├── loader.go │ ├── loader_test.go │ ├── split.go │ ├── split_test.go │ ├── translate-search.go │ ├── translate-search_test.go │ ├── translate.go │ ├── translate_test.go │ └── utils.go ├── parser │ ├── absolute │ │ ├── parser.go │ │ ├── root.go │ │ └── root_test.go │ ├── common │ │ ├── apply-day.go │ │ ├── apply-month.go │ │ ├── strict-check.go │ │ ├── time.go │ │ └── time_test.go │ ├── formatted │ │ ├── parser.go │ │ └── parser_test.go │ ├── hijri │ │ ├── parser.go │ │ └── parser_test.go │ ├── jalali │ │ ├── parser.go │ │ ├── parser_test.go │ │ └── translate.go │ ├── nospace │ │ ├── constants.go │ │ ├── parser.go │ │ └── parser_test.go │ ├── relative │ │ └── parser.go │ ├── timestamp │ │ ├── parser.go │ │ └── parser_test.go │ └── tokenizer │ │ ├── tokenizer.go │ │ └── tokenizer_test.go ├── regexp │ ├── regexp-re2.go │ └── regexp.go ├── setting │ └── config.go ├── strutil │ ├── dict.go │ ├── strutil.go │ └── strutil_test.go └── timezone │ ├── loader.go │ ├── parser.go │ ├── parser_test.go │ ├── timezones.go │ └── tz-offsets.go ├── jalali-parser.go ├── parser-relative_test.go ├── parser.go ├── parser_test.go ├── root.go ├── scripts ├── codegen │ ├── 00-main.go │ ├── 01-logger.go │ ├── 02-constants.go │ ├── 03-model-cldr-gregorian.go │ ├── 03-model-cldr-territory.go │ ├── 03-structs.go │ ├── 04-utils.go │ ├── 05-templates.go │ ├── code-generator.go │ ├── data-cldr-parser.go │ ├── data-supplementary-parser.go │ ├── language-locales.go │ ├── language-map.go │ ├── language-order.go │ ├── locale-order.go │ └── raw-downloader.go ├── digit │ ├── main.go │ └── templates.go └── speedtest │ └── main.go ├── search.go ├── search_test.go └── util_test.go /.gitignore: -------------------------------------------------------------------------------- 1 | data-json/ 2 | raw-data/ 3 | .vscode/ 4 | .idea -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### 2021-12-10 2 | 3 | - Implement locale data loader and its unit tests. 4 | 5 | ### 2021-12-07 6 | 7 | - Implement timezone parser and its unit tests. 8 | 9 | ### 2021-12-05 10 | 11 | - Implement script to generate Go code. At this point all Python script is ported. 12 | - Restructure directories layout. 13 | 14 | ### 2021-12-04 15 | 16 | No commit today as well, back to home. 17 | 18 | ### 2021-12-03 19 | 20 | No commit today, going to meet family. 21 | 22 | ### 2021-12-02 23 | 24 | - Implement script to generate locale data from supplementary data. 25 | 26 | ### 2021-12-01 27 | 28 | - Implement script to generate simplified locale data from CLDR data. 29 | 30 | ### 2021-11-30 31 | 32 | - Implement script for parsing CLDR gregorian data. 33 | - Implement script for parsing CLDR date fields data. 34 | 35 | ### 2021-11-29 36 | 37 | - Implement script for generating language maps and ordering languages by their popularity. 38 | - Restructure scripts into one single CLI. 39 | 40 | ### 2021-11-28 41 | 42 | - Implement script for fetching raw data from `CLDR` repository. 43 | 44 | ### 2021-11-28 45 | 46 | - Repository created. 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2021, Markus Mobius 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /LICENSE_dateparser.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, Scrapinghub 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | 8 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 9 | 10 | * Neither the name of DateParser nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 11 | 12 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 13 | -------------------------------------------------------------------------------- /data-supplementary/base_data.yaml: -------------------------------------------------------------------------------- 1 | skip: [" ", "'", ",", "-", ".", "/", ";", "@", "[", "]", "|", ","] 2 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/ar.yaml: -------------------------------------------------------------------------------- 1 | sentence_splitter_group: 6 2 | 3 | skip: ['الساعة', 'في', 'هـ'] 4 | 5 | monday: 6 | - الإثنين 7 | 8 | year: 9 | - عام 10 | - سنة 11 | month: 12 | - شهر 13 | week: 14 | - أسبوع 15 | day: 16 | - أيام 17 | hour: 18 | - ساعة 19 | - ساعات 20 | minute: 21 | - دقيقة 22 | - دقائق 23 | second: 24 | - ثانية 25 | 26 | ago: 27 | - منذ 28 | - مضت 29 | in: 30 | - خلال 31 | 32 | am: 33 | - صباحاً 34 | 35 | relative-type: 36 | 1 day ago: 37 | - اليوم السابق 38 | - الأمس 39 | 2 day: 40 | - يومين 41 | 2 hour: 42 | - ساعتين 43 | 1 hour ago: 44 | - ساعة واحدة 45 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/be.yaml: -------------------------------------------------------------------------------- 1 | skip: ['каля', 'у', 'і', 'ў'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | monday: 6 | - Пнд 7 | tuesday: 8 | - Аўт 9 | thursday: 10 | - Чцв 11 | - Чв 12 | friday: 13 | - Пят 14 | saturday: 15 | - Суб 16 | sunday: 17 | - Няд 18 | 19 | january: 20 | - Стд 21 | april: 22 | - Крс 23 | may: 24 | - Траўня 25 | - Тра 26 | august: 27 | - Жнівеня 28 | - Жнв 29 | september: 30 | - Врс 31 | october: 32 | - Кст 33 | november: 34 | - Ліс 35 | december: 36 | - Снж 37 | 38 | year: 39 | - гады 40 | - года 41 | - гадоў 42 | month: 43 | - месяца 44 | - месяцы 45 | - месяцаў 46 | week: 47 | - тыдзень 48 | - тыдня 49 | - тыдні 50 | - тыдняў 51 | day: 52 | - дні 53 | - дзён 54 | - дзен 55 | hour: 56 | - гадзіны 57 | - гадзіну 58 | - гадзін 59 | minute: 60 | - хвілін 61 | - хвіліны 62 | - хвіліну 63 | - хвіл 64 | second: 65 | - секунды 66 | - секунду 67 | - секунд 68 | - сек 69 | 70 | ago: 71 | - таму назад 72 | - таму 73 | - назад 74 | in: 75 | - на працягу 76 | 77 | relative-type: 78 | 2 day ago: 79 | - пазаўчора 80 | 1 day ago: 81 | - ўчора 82 | 0 day ago: 83 | - сення 84 | 85 | simplifications: 86 | - ^гадзіна: 1 гадзіна 87 | - гадзіну: 1 гадзіну 88 | - ^хвіліну: 1 хвіліну 89 | - ^секунду: 1 секунду 90 | - некалькі секунд: 44 секунды 91 | - некалькі хвілін: 2 хвіліны 92 | - (\d+[.,]?\d*)\s*гадзін\s(\d+[.,]?\d*)\s*хвілін: \1:\2 93 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/bg.yaml: -------------------------------------------------------------------------------- 1 | skip: ["върху", "до", "на", "около", "от", "под"] 2 | 3 | sentence_splitter_group : 1 4 | 5 | monday: 6 | - пон 7 | tuesday: 8 | - вто 9 | wednesday: 10 | - сря 11 | 12 | january: 13 | - ян 14 | february: 15 | - фв 16 | april: 17 | - ап 18 | june: 19 | - юн 20 | july: 21 | - юл 22 | september: 23 | - септ 24 | - септм 25 | 26 | year: 27 | - год 28 | - години 29 | month: 30 | - мес 31 | - месеци 32 | week: 33 | - с 34 | - сед 35 | - седмици 36 | day: 37 | - дни 38 | - дена 39 | hour: 40 | - часа 41 | minute: 42 | - минути 43 | second: 44 | - сек 45 | - секунди 46 | 47 | ago: 48 | - преди 49 | in: 50 | - след 51 | - после 52 | - подир 53 | 54 | relative-type: 55 | 10 year ago: 56 | - преди десетилетие 57 | 1 year ago: 58 | - преди година 59 | in 10 year: 60 | - след 1 десетилетие 61 | 1 week ago: 62 | - преди седмица 63 | 2 day ago: 64 | - онзи ден 65 | 1 day ago: 66 | - снощи 67 | - преди ден 68 | in 1 day: 69 | - след ден 70 | in 2 day: 71 | - вдругиден 72 | 1 hour ago: 73 | - преди час 74 | in 1 hour: 75 | - след час 76 | 77 | simplifications: 78 | - един: '1' 79 | - два: '2' 80 | - три: '3' 81 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/bn.yaml: -------------------------------------------------------------------------------- 1 | skip: ["ই", "এবং", "টা", "প্রায়", "লা", "শে"] 2 | 3 | sentence_splitter_group : 3 4 | 5 | january: 6 | - জানুয়ারি 7 | february: 8 | - ফেব্রুয়ারি 9 | 10 | year: 11 | - বৎসর 12 | - সাল 13 | 14 | ago: 15 | - আগে 16 | in: 17 | - মধ্যে 18 | 19 | relative-type: 20 | in 1 year: 21 | - আগামী বছর 22 | in 1 month: 23 | - আগামী মাস 24 | in 1 week: 25 | - আগামী সপ্তাহ 26 | 2 day ago: 27 | - গত পরশু 28 | 29 | simplifications: 30 | - মধ্যাহ্ন: '12:00' 31 | - মধ্যরাত: '00:00' 32 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/ca.yaml: -------------------------------------------------------------------------------- 1 | skip: ["de", "del", "i", "l'"] 2 | pertain: ["de", "del"] 3 | 4 | in: 5 | - en 6 | 7 | relative-type: 8 | 0 day ago: 9 | - hui 10 | 2 day ago: 11 | - despús-ahir 12 | - abans-d’ahir 13 | - dellà-ahir 14 | in 2 day: 15 | - endemà 16 | - sendemà 17 | - despús-demà 18 | - demà passat 19 | - passat demà 20 | in 3 day: 21 | - endemà passat 22 | in 1 week: 23 | - la setmana vinent 24 | - la pròxima setmana 25 | - la propera setmana 26 | 27 | simplifications: 28 | - una: '1' 29 | - un: '1' 30 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/cs.yaml: -------------------------------------------------------------------------------- 1 | skip: ['přibližně', 'v'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | monday: 6 | - Pon 7 | tuesday: 8 | - Úte 9 | wednesday: 10 | - Stř 11 | - Středu 12 | thursday: 13 | - Čtv 14 | friday: 15 | - Pát 16 | saturday: 17 | - Sob 18 | - Sobotu 19 | sunday: 20 | - Ned 21 | - Neděli 22 | 23 | february: 24 | - únr 25 | june: 26 | - Čer 27 | july: 28 | - Črc 29 | - črv 30 | 31 | year: 32 | - roků 33 | - roky 34 | month: 35 | - měsíců 36 | - měsíce 37 | - měsícem 38 | week: 39 | - týdnů 40 | - týdny 41 | - týdnem 42 | day: 43 | - dnů 44 | - dny 45 | hour: 46 | - hodin 47 | - hodiny 48 | - hodinou 49 | - hodinu 50 | - hodinami 51 | minute: 52 | - minut 53 | - minutami 54 | - minuty 55 | second: 56 | - sekundy 57 | - sekund 58 | - vteřina 59 | - vteřin 60 | - vteřiny 61 | 62 | ago: 63 | - před 64 | in: 65 | - ve 66 | - v 67 | 68 | relative-type: 69 | 2 day ago: 70 | - předevčírem 71 | 72 | simplifications: 73 | - teď: 0 sekunda 74 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/da.yaml: -------------------------------------------------------------------------------- 1 | skip: ['cirka', 'd.', 'kl', 'kl.'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | month: 6 | - måneder 7 | week: 8 | - uger 9 | day: 10 | - dage 11 | hour: 12 | - timer 13 | minute: 14 | - minutter 15 | second: 16 | - sekunder 17 | 18 | ago: 19 | - siden 20 | in: 21 | - i 22 | 23 | relative-type-regex: 24 | \1 hour ago: 25 | - for (\d+[.,]?\d*)\s*h 26 | - for (\d+[.,]?\d*) timer 27 | \1 minute ago: 28 | - for (\d+[.,]?\d*)\s*m 29 | - for (\d+[.,]?\d*) minutter 30 | \1 second ago: 31 | - for (\d+[.,]?\d*)\s*s 32 | - for (\d+[.,]?\d*) sekunder 33 | 34 | simplifications: 35 | - en: '1' 36 | - et: '1' 37 | - (\d+[.,]?\d*)\s*hr(s?): \1 time\2 38 | - (\d+[.,]?\d*)\s*min(s?): \1 minut\2 39 | - (\d+[.,]?\d*)\s*sec(s?): \1 sekund\2 40 | - middag: '12:00' 41 | - midnat: '00:00' 42 | - (\d+[.,]?\d*)h(\d+[.,]?\d*)m?: \1:\2 43 | - mindre end 1 minut siden: 45 seconds 44 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/de.yaml: -------------------------------------------------------------------------------- 1 | skip: ['etwa', 'uhr', 'um', 'und'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | monday: 6 | - Mon 7 | tuesday: 8 | - Die 9 | wednesday: 10 | - Mit 11 | thursday: 12 | - Don 13 | friday: 14 | - Fre 15 | saturday: 16 | - Sam 17 | sunday: 18 | - Son 19 | 20 | january: 21 | - Jänner 22 | february: 23 | - Feber 24 | march: 25 | - Mrz 26 | september: 27 | - Sept 28 | 29 | year: 30 | - Jahre 31 | - Jahren 32 | month: 33 | - Monate 34 | - Monaten 35 | week: 36 | - Wochen 37 | day: 38 | - Tage 39 | - Tagen 40 | hour: 41 | - Stunden 42 | minute: 43 | - Minuten 44 | second: 45 | - Sekunden 46 | 47 | ago: 48 | - vor 49 | in: 50 | - in 51 | - im 52 | 53 | relative-type: 54 | 2 day ago: 55 | - vorgestern 56 | in 2 day: 57 | - übermorgen 58 | 59 | relative-type-regex: 60 | \1 hour ago: 61 | - vor (\d+[.,]?\d*)\s*h 62 | \1 minute ago: 63 | - vor (\d+[.,]?\d*)\s*m 64 | \1 second ago: 65 | - vor (\d+[.,]?\d*)\s*s 66 | 67 | simplifications: 68 | - einer: '1' 69 | - einem: '1' 70 | - ein: '1' 71 | - zwei: '2' 72 | - drei: '3' 73 | - vier: '4' 74 | - fünf: '5' 75 | - sechs: '6' 76 | - sieben: '7' 77 | - acht: '8' 78 | - neun: '9' 79 | - zehn: '10' 80 | - elf: '11' 81 | - zwölf: '12' 82 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/en.yaml: -------------------------------------------------------------------------------- 1 | skip: 2 | [ 3 | 'about', 4 | 'ad', 5 | 'and', 6 | 'at', 7 | 'by', 8 | 'just', 9 | 'm', 10 | 'nd', 11 | 'of', 12 | 'on', 13 | 'rd', 14 | 'st', 15 | 'th', 16 | 'the', 17 | ] 18 | pertain: ['of'] 19 | 20 | sentence_splitter_group: 1 21 | 22 | tuesday: 23 | - Tues 24 | 25 | september: 26 | - sept 27 | 28 | decade: 29 | - decade 30 | - decades 31 | year: 32 | - y 33 | - years 34 | month: 35 | - months 36 | week: 37 | - weeks 38 | day: 39 | - d 40 | - days 41 | hour: 42 | - h 43 | - hours 44 | - hrs 45 | minute: 46 | - m 47 | - minutes 48 | - mins 49 | second: 50 | - s 51 | - seconds 52 | - secs 53 | 54 | ago: 55 | - ago 56 | - before 57 | in: 58 | - in 59 | - from now 60 | - after 61 | 62 | relative-type: 63 | 2 day ago: 64 | - day before yesterday 65 | 1 decade ago: 66 | - last decade 67 | - this decade 68 | in 1 decade: 69 | - next decade 70 | in 2 day: 71 | - day after tomorrow 72 | 0 day ago: 73 | - till date 74 | 75 | relative-type-regex: 76 | in \1 decade: 77 | - in (\d+[.,]?\d*) decades? 78 | \1 decade ago: 79 | - (\d+[.,]?\d*) decades? ago 80 | 81 | simplifications: 82 | - an: '1' 83 | - a: '1' 84 | - (?:12\s+)?noon: '12:00' 85 | - (?:12\s+)?midnight: '00:00' 86 | - (\d+[.,]?\d*)h(\d+[.,]?\d*): \1:\2 87 | - (from\s+)now: \1in 88 | - less than 1 minute ago: 45 second ago 89 | - (\d+[.,]?\d*) (decade|year|month|week|day|hour|minute|second)s? later: in \1 \2 90 | - one: '1' 91 | - two: '2' 92 | - three: '3' 93 | - four: '4' 94 | - five: '5' 95 | - six: '6' 96 | - seven: '7' 97 | - eight: '8' 98 | - nine: '9' 99 | - ten: '10' 100 | - eleven: '11' 101 | - twelve: '12' 102 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/es.yaml: -------------------------------------------------------------------------------- 1 | skip: ["a las", "cerca", "de", "del", "en", "y"] 2 | pertain: ["de", "del"] 3 | 4 | sentence_splitter_group : 2 5 | 6 | monday: 7 | - Lu 8 | wednesday: 9 | - Mi 10 | thursday: 11 | - Ju 12 | friday: 13 | - Vi 14 | saturday: 15 | - Sa 16 | sunday: 17 | - Do 18 | 19 | september: 20 | - Setiembre 21 | - Sep 22 | - Set 23 | 24 | year: 25 | - años 26 | month: 27 | - meses 28 | week: 29 | - semanas 30 | day: 31 | - días 32 | hour: 33 | - horas 34 | minute: 35 | - minutos 36 | second: 37 | - segundos 38 | 39 | ago: 40 | - hace 41 | in: 42 | - en 43 | 44 | relative-type: 45 | 2 day ago: 46 | - anteayer 47 | 48 | simplifications: 49 | - una: '1' 50 | - un: '1' 51 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/fa.yaml: -------------------------------------------------------------------------------- 1 | sentence_splitter_group : 6 2 | 3 | tuesday: 4 | - سهشنبه 5 | wednesday: 6 | - چهار شنبه 7 | thursday: 8 | - پنج شنبه 9 | saturday: 10 | - روز شنبه 11 | - دو شنبه 12 | - د 13 | 14 | january: 15 | - جنوری 16 | february: 17 | - فبروری 18 | march: 19 | - مارچ 20 | april: 21 | - اپریل 22 | may: 23 | - می 24 | june: 25 | - جون 26 | july: 27 | - جولای 28 | august: 29 | - آگست 30 | september: 31 | - سپتمبر 32 | october: 33 | - اکتوبر 34 | november: 35 | - نومبر 36 | december: 37 | - دسمبر 38 | 39 | second: 40 | - دوم 41 | 42 | ago: 43 | - پیش 44 | in: 45 | - در 46 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/fi.yaml: -------------------------------------------------------------------------------- 1 | skip: [':n'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | january: 6 | - tammikuussa 7 | february: 8 | - helmikuussa 9 | march: 10 | - maaliskuussa 11 | april: 12 | - huhtikuussa 13 | may: 14 | - toukokuussa 15 | june: 16 | - kesäkuussa 17 | july: 18 | - heinäkuussa 19 | august: 20 | - elokuussa 21 | september: 22 | - Syyskuussa 23 | october: 24 | - Lokakuussa 25 | november: 26 | - Marraskuussa 27 | december: 28 | - Joulukuussa 29 | 30 | year: 31 | - vuotta 32 | - vv 33 | - vuonna 34 | - vuoden 35 | month: 36 | - kuukautta 37 | - kuukauden 38 | week: 39 | - viikkoa 40 | - vko 41 | - viikon 42 | day: 43 | - päivää 44 | - p 45 | - pvä 46 | - pvää 47 | - päivän 48 | hour: 49 | - tuntia 50 | - tunnin 51 | minute: 52 | - minuuttia 53 | - minuutin 54 | second: 55 | - sekuntia 56 | - sekuntti 57 | - sekunttia 58 | - sekuntin 59 | - sekunnin 60 | 61 | ago: 62 | - sitten 63 | in: 64 | - kuluttua 65 | - päästä 66 | 67 | relative-type: 68 | 2 year ago: 69 | - toissa vuonna 70 | 2 month ago: 71 | - toissa kuussa 72 | 2 week ago: 73 | - toissa viikolla 74 | 2 day ago: 75 | - toissa päivänä 76 | 77 | simplifications: 78 | - (\d+[.,]?\d*) (sekunnin|sekuntin|minuutin|tunnin|päivän|viikon|kuukauden|vuoden) (päästä|kuluttua): \3 \1 \2 79 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/fr.yaml: -------------------------------------------------------------------------------- 1 | skip: ['environ', 'er', 'et', 'le', 'à'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | monday: 6 | - lu 7 | tuesday: 8 | - ma 9 | wednesday: 10 | - me 11 | thursday: 12 | - je 13 | friday: 14 | - ve 15 | saturday: 16 | - sa 17 | sunday: 18 | - di 19 | 20 | january: 21 | - jan 22 | february: 23 | - fév 24 | june: 25 | - jun 26 | july: 27 | - jul 28 | august: 29 | - aoû 30 | september: 31 | - sep 32 | 33 | year: 34 | - années 35 | - ans 36 | week: 37 | - semaines 38 | day: 39 | - jours 40 | hour: 41 | - heures 42 | minute: 43 | - minutes 44 | second: 45 | - secondes 46 | 47 | ago: 48 | - il ya 49 | - il y a 50 | in: 51 | - dans 52 | - en 53 | - après 54 | 55 | relative-type: 56 | 2 day ago: 57 | - avant-hier 58 | in 2 day: 59 | - après-demain 60 | 61 | simplifications: 62 | - d'une: '1' 63 | - d'un: '1' 64 | - une: '1' 65 | - un: '1' 66 | - (\d+[.,]?\d*)\s+h\s+(\d+[.,]?\d*)\s+min: \1h\2m 67 | - (\d+[.,]?\d*)h(\d+[.,]?\d*)m?: \1:\2 68 | - moins\s(?:de\s)?(\d+[.,]?\d*)\s?(minute|seconde|heure): \1 \2 69 | - moins\s(?:de\s)?(\d+[.,]?\d*)\s?s: \1 seconde 70 | - moins\s(?:de\s)?(\d+[.,]?\d*)\s?m: \1 minute 71 | - moins\s(?:de\s)?(\d+[.,]?\d*)\s?h: \1 heure 72 | - deux: '2' 73 | - trois: '3' 74 | - quatre: '4' 75 | - cinq: '5' 76 | - six: '6' 77 | - sept: '7' 78 | - huit: '8' 79 | - neuf: '9' 80 | - dix: '10' 81 | - onze: '11' 82 | - douze: '12' 83 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/he.yaml: -------------------------------------------------------------------------------- 1 | sentence_splitter_group: 1 2 | 3 | skip: ['ב-', 'בסביבות', 'בערך', 'בקירוב', 'בשעה', 'ה-'] 4 | 5 | monday: 6 | - שני 7 | - יום ב 8 | tuesday: 9 | - שלישי 10 | - יום ג 11 | wednesday: 12 | - רביעי 13 | - יום ד 14 | thursday: 15 | - חמישי 16 | - יום ה 17 | friday: 18 | - שישי 19 | - יום ו 20 | sunday: 21 | - ראשון 22 | - יום א 23 | 24 | january: 25 | - לינואר 26 | - בינואר 27 | - ינו 28 | february: 29 | - בפברואר 30 | - לפברואר 31 | - פבר 32 | march: 33 | - במרץ 34 | - למרץ 35 | - מרס 36 | - במרס 37 | - למרס 38 | - מארס 39 | - במארס 40 | - למארס 41 | april: 42 | - באפריל 43 | - לאפריל 44 | - אפר 45 | may: 46 | - במאי 47 | - למאי 48 | june: 49 | - ביוני 50 | - ליוני 51 | - יונ 52 | july: 53 | - ביולי 54 | - ליולי 55 | - יול 56 | august: 57 | - באוגוסט 58 | - לאוגוסט 59 | - אוג 60 | september: 61 | - בספטמבר 62 | - לספטמבר 63 | - ספט 64 | october: 65 | - באוקטובר 66 | - לאוקטובר 67 | - אוק 68 | november: 69 | - בנובמבר 70 | - לנובמבר 71 | - נוב 72 | december: 73 | - בדצמבר 74 | - לדצמבר 75 | - דצמ 76 | 77 | year: 78 | - שנים 79 | - בשנה 80 | month: 81 | - חודשים 82 | - בחודש 83 | week: 84 | - שבועות 85 | day: 86 | - ימים 87 | - ביום 88 | hour: 89 | - שעות 90 | minute: 91 | - דקות 92 | second: 93 | - שניה 94 | - שניות 95 | 96 | ago: 97 | - לפני 98 | in: 99 | - בעוד 100 | - עוד 101 | 102 | simplifications: 103 | - ויום: 1 יום 104 | - ושבוע: 1 שבוע 105 | - וחודש: 1 חודש 106 | - ושנה: 1 שנה 107 | - ו(\w+): \1 108 | - שנתיי?ם: 2 שנים 109 | - חודשיים: 2 חודשים 110 | - שבועיי?ם: 2 שבועות 111 | - יומיי?ם: 2 ימים 112 | - שעתיי?ם: 2 שעות 113 | - שלשום: 2 ימים 114 | - מחר: בעוד 1 יום 115 | - אחר חצות: am 116 | - חצות: 12 am 117 | - לפנות בוקר: am 118 | - בבוקר: am 119 | - בצהריי?ם: pm 120 | - אחרי ה?צהריי?ם: pm 121 | - אחה"צ: pm 122 | - לפנות ערב: pm 123 | - בערב: pm 124 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/hi.yaml: -------------------------------------------------------------------------------- 1 | skip: ['के', 'को', 'बजे', 'सन्', 'से'] 2 | 3 | sentence_splitter_group: 3 4 | 5 | september: 6 | - सितम्बर 7 | october: 8 | - अक्टूबर 9 | november: 10 | - नवम्बर 11 | december: 12 | - दिसम्बर 13 | decade: 14 | - दशक 15 | 16 | year: 17 | - साल 18 | - वर्षों 19 | month: 20 | - महीना 21 | - मास 22 | - महीने 23 | day: 24 | - दिवस 25 | hour: 26 | - घंटे 27 | 28 | ago: 29 | - पहले 30 | - पूर्व 31 | in: 32 | - में 33 | - बाद 34 | 35 | relative-type: 36 | 2 day ago: 37 | - परसों 38 | 1 decade ago: 39 | - पिछला दशक 40 | in 1 decade: 41 | - अगला दशक 42 | 43 | relative-type-regex: 44 | in \1 decade: 45 | - (\d+[.,]?\d*) दशक में 46 | \1 decade ago: 47 | - (\d+[.,]?\d*) दशक पहले 48 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/hr.yaml: -------------------------------------------------------------------------------- 1 | in: 2 | - u 3 | 4 | january: 5 | - siječnju 6 | - siječnjem 7 | february: 8 | - veljači 9 | - veljačom 10 | march: 11 | - ožujku 12 | - ožujkom 13 | april: 14 | - travnju 15 | - travnjem 16 | may: 17 | - svibnju 18 | - svibnjem 19 | june: 20 | - lipnju 21 | - lipnjem 22 | july: 23 | - srpnju 24 | - srpnjem 25 | august: 26 | - kolovozu 27 | - kolovozom 28 | september: 29 | - rujnu 30 | - rujnom 31 | october: 32 | - listopadu 33 | - listopadom 34 | november: 35 | - studenom 36 | - studenomu 37 | - studenome 38 | - studenog 39 | - studenim 40 | december: 41 | - prosincu 42 | - prosincem 43 | 44 | relative-type: 45 | in 1 year: 46 | - sljedeća g 47 | - sljedeća god 48 | - sljedeća godina 49 | - sljedećoj godini 50 | 51 | - iduća g 52 | - iduće g 53 | - idućoj g 54 | - iduća god 55 | - iduće god 56 | - idućoj god 57 | - iduća godina 58 | - iduće godine 59 | - idućoj godini 60 | 61 | - dogodine 62 | - nagodinu 63 | 64 | in 1 month: 65 | - sljedećeg mjeseca 66 | - sljedećem mjesecu 67 | 68 | - idući mj 69 | - idućeg mj 70 | - idućem mj 71 | - idući mjesec 72 | - idućeg mjeseca 73 | - idućem mjesecu 74 | 75 | in 1 week: 76 | - sljedećeg tjedna 77 | - sljedećem tjednu 78 | 79 | - idući tj 80 | - idućeg tj 81 | - idućem tj 82 | - idući tjedan 83 | - idućeg tjedna 84 | - idućem tjednu 85 | 86 | in 1 day: 87 | - sutra 88 | 89 | in 2 day: 90 | - prekosutra 91 | 92 | 1 year ago: 93 | - prošla godina 94 | - prošloj godini 95 | - lani 96 | 97 | 2 year ago: 98 | - preklani 99 | 100 | 1 month ago: 101 | - prošlog mjeseca 102 | - prošlom mjesecu 103 | 104 | 1 week ago: 105 | - prošlog tjedna 106 | - prošlom tjednu 107 | 108 | 1 day ago: 109 | - jučer 110 | 111 | 2 day ago: 112 | - prekjučer 113 | 114 | relative-type-regex: 115 | \1 year ago: 116 | - prije (\d+[.,]?\d*) godine 117 | \1 month ago: 118 | - prije (\d+[.,]?\d*) mjeseca 119 | \1 week ago: 120 | - prije (\d+[.,]?\d*) tjedna 121 | \1 hour ago: 122 | - prije (\d+[.,]?\d*) sata 123 | \1 minute ago: 124 | - prije (\d+[.,]?\d*) minute 125 | \1 second ago: 126 | - prije (\d+[.,]?\d*) sekunde 127 | - prije (\d+[.,]?\d*) sekundu 128 | 129 | in \1 year: 130 | - za (\d+[.,]?\d*) godine 131 | in \1 month: 132 | - za (\d+[.,]?\d*) mjeseca 133 | in \1 week: 134 | - za (\d+[.,]?\d*) tjedna 135 | in \1 hour: 136 | - za (\d+[.,]?\d*) sata 137 | in \1 minute: 138 | - za (\d+[.,]?\d*) minute 139 | in \1 second: 140 | - za (\d+[.,]?\d*) sekunde 141 | - za (\d+[.,]?\d*) sekundu 142 | 143 | simplifications: 144 | - podne: '12:00' 145 | - ponoć: '00:00' 146 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/hu.yaml: -------------------------------------------------------------------------------- 1 | skip: ["-a", "-ai", "-akor", "-e", "-ei", "-ekor", "-es", "-i", "-ig", "-je", "-jei", "-ji", "-kor", "-tól", "-től", "-áig", "-án", "-ától", "-éig", "-én", "-étől", "-ös"] 2 | 3 | sentence_splitter_group : 1 4 | 5 | sunday: 6 | - vas 7 | 8 | january: 9 | - I 10 | february: 11 | - feb 12 | - II 13 | march: 14 | - már 15 | - III 16 | april: 17 | - IV 18 | may: 19 | - V 20 | june: 21 | - VI 22 | july: 23 | - VII 24 | august: 25 | - VIII 26 | september: 27 | - IX 28 | october: 29 | - X 30 | november: 31 | - XI 32 | december: 33 | - XII 34 | 35 | year: 36 | - évek 37 | - évvel 38 | - éve 39 | month: 40 | - hó 41 | - hónapok 42 | - hónappal 43 | - hónapja 44 | week: 45 | - hetek 46 | - héttel 47 | - hete 48 | day: 49 | - napok 50 | - napja 51 | - nappal 52 | hour: 53 | - ó 54 | - órák 55 | - órája 56 | - órával 57 | - óráig 58 | - órától 59 | minute: 60 | - p 61 | - percek 62 | - perce 63 | - perccel 64 | - percig 65 | - perctől 66 | second: 67 | - mp 68 | - másodpercek 69 | - másodperce 70 | - másodperccel 71 | - másodpercig 72 | - másodperctől 73 | ago: 74 | - ezelőtt 75 | in: 76 | - múlva 77 | 78 | relative-type: 79 | 2 day ago: 80 | - tegnapelőtt 81 | 82 | simplifications: 83 | - egy: '1' 84 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/id.yaml: -------------------------------------------------------------------------------- 1 | skip: ['pukul', 'tanggal', 'yang'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | sunday: 6 | - Ahad 7 | 8 | august: 9 | - Agu 10 | september: 11 | - Sept 12 | 13 | ago: 14 | - lalu 15 | in: 16 | - dalam 17 | 18 | relative-type: 19 | 1 year: 20 | - setahun 21 | 1 month: 22 | - sebulan 23 | 1 week: 24 | - seminggu 25 | 2 day ago: 26 | - kemarin lusa 27 | 1 day: 28 | - sehari 29 | 0 second ago: 30 | - baru saja 31 | 32 | relative-type-regex: 33 | \1 week ago: 34 | - (\d+[.,]?\d*) minggu lalu 35 | \1 month ago: 36 | - (\d+[.,]?\d*) bulan lalu 37 | \1 year ago: 38 | - (\d+[.,]?\d*) tahun lalu 39 | \1 week: 40 | - (\d+[.,]?\d*) minggu 41 | sunday: 42 | - minggu 43 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/it.yaml: -------------------------------------------------------------------------------- 1 | skip: ['circa', 'e'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | year: 6 | - anni 7 | month: 8 | - mesi 9 | week: 10 | - settimane 11 | day: 12 | - giorni 13 | hour: 14 | - ore 15 | minute: 16 | - minuti 17 | second: 18 | - secondi 19 | 20 | ago: 21 | - fa 22 | in: 23 | - in 24 | 25 | relative-type: 26 | 2 day ago: 27 | - altro ieri 28 | 29 | simplifications: 30 | - (\d+[.,]?\d*)\s+ora: \1 ore 31 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/ja.yaml: -------------------------------------------------------------------------------- 1 | no_word_spacing: true 2 | 3 | sentence_splitter_group: 4 4 | 5 | skip: ['約'] 6 | 7 | pertain: ['の'] 8 | 9 | monday: 10 | - (月) 11 | tuesday: 12 | - (火) 13 | wednesday: 14 | - (水) 15 | thursday: 16 | - (木) 17 | friday: 18 | - (金) 19 | saturday: 20 | - (土) 21 | sunday: 22 | - (日) 23 | 24 | january: 25 | - 一月 26 | february: 27 | - 二月 28 | march: 29 | - 三月 30 | april: 31 | - 四月 32 | may: 33 | - 五月 34 | june: 35 | - 六月 36 | july: 37 | - 七月 38 | august: 39 | - 八月 40 | september: 41 | - 九月 42 | october: 43 | - 十月 44 | november: 45 | - 十一月 46 | december: 47 | - 十二月 48 | 49 | month: 50 | - ヶ月 51 | - カ月 52 | - か月 53 | week: 54 | - 週間 55 | day: 56 | - 日間 57 | hour: 58 | - 時間 59 | minute: 60 | - 分間 61 | second: 62 | - 秒間 63 | ago: 64 | - 前 65 | in: 66 | - 今から 67 | - で 68 | 69 | relative-type: 70 | 0 second ago: 71 | - 現在 72 | 2 day ago: 73 | - 一昨日 74 | 2 week ago: 75 | - 先々週 76 | 1 year ago: 77 | - 去年 78 | in 2 day: 79 | - 明後日 80 | 81 | simplifications: 82 | - (\d+[.,]?\d*)年(?:\s+)?(\d+[.,]?\d*)月(?:\s+)?(\d+[.,]?\d*)日: \1-\2-\3 83 | - (\d+[.,]?\d*)月(?:\s+)?(\d+[.,]?\d*)日: \1-\2 84 | - (\d+[.,]?\d*)時(?:\s+)?(\d+[.,]?\d*)分(?:\s+)?(\d+[.,]?\d*)秒: \1:\2:\3 85 | - (\d+[.,]?\d*)時(?:\s+)?(\d+[.,]?\d*)分: \1:\2 86 | - (\d+[.,]?\d*)時$: \1:00 87 | - 正午: '12:00' 88 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/ka.yaml: -------------------------------------------------------------------------------- 1 | skip: ["და", "დაახლოებით", "ზე", "ის"] 2 | 3 | sentence_splitter_group : 1 4 | 5 | year: 6 | - წლის 7 | 8 | ago: 9 | - წინ 10 | in: 11 | - დღეიდან 12 | 13 | simplifications: 14 | - ერთ: '1' 15 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/nb.yaml: -------------------------------------------------------------------------------- 1 | week: 2 | - uker 3 | day: 4 | - dager 5 | hour: 6 | - timer 7 | 8 | ago: 9 | - siden 10 | in: 11 | - om 12 | 13 | relative-type-regex: 14 | \1 day ago: 15 | - for (\d+[.,]?\d*) dager siden 16 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/nl.yaml: -------------------------------------------------------------------------------- 1 | skip: ["om"] 2 | 3 | sentence_splitter_group : 1 4 | 5 | month: 6 | - maanden 7 | week: 8 | - weken 9 | day: 10 | - dagen 11 | minute: 12 | - minuten 13 | second: 14 | - seconden 15 | 16 | ago: 17 | - geleden 18 | in: 19 | - in 20 | 21 | relative-type: 22 | 1 year ago: 23 | - vorige jaar 24 | 2 day ago: 25 | - eergisteren 26 | in 2 day: 27 | - overmorgen 28 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/pl.yaml: -------------------------------------------------------------------------------- 1 | sentence_splitter_group : 1 2 | 3 | skip: ["i", "o", "r.", "roku", "w"] 4 | 5 | monday: 6 | - Poniedziałek 7 | - Poniedzialek 8 | - Pon 9 | - Pn 10 | tuesday: 11 | - Wtorek 12 | - Wt 13 | - Wto 14 | wednesday: 15 | - Środa 16 | - Sroda 17 | - Środę 18 | - Srode 19 | - Śro 20 | - Sro 21 | - Śr 22 | - Sr 23 | thursday: 24 | - Czwartek 25 | - Czw 26 | - Cz 27 | friday: 28 | - Piątek 29 | - Piatek 30 | - Pią 31 | - Pia 32 | - Pi 33 | - Pt 34 | saturday: 35 | - Sobota 36 | - Sobotę 37 | - Sobote 38 | - Sob 39 | - So 40 | - Sb 41 | sunday: 42 | - Niedziela 43 | - Niedzielę 44 | - Niedziele 45 | - Nie 46 | - Nd 47 | 48 | january: 49 | - Styczeń 50 | - Styczen 51 | - Stycznia 52 | - Styczniu 53 | - Sty 54 | february: 55 | - Luty 56 | - Lutego 57 | - Lutym 58 | - Lut 59 | march: 60 | - Marzec 61 | - Marca 62 | - Marcu 63 | - Mar 64 | april: 65 | - Kwiecień 66 | - Kwiecien 67 | - Kwietnia 68 | - Kwietniu 69 | - Kwi 70 | - Kwie 71 | may: 72 | - Maj 73 | - Maja 74 | - Maju 75 | june: 76 | - Czerwiec 77 | - Czerwca 78 | - Czerwcu 79 | - Cze 80 | july: 81 | - Lipiec 82 | - Lipca 83 | - Lipcu 84 | - Lip 85 | august: 86 | - Sierpień 87 | - Sierpien 88 | - Sierpnia 89 | - Sierpniu 90 | - Sie 91 | september: 92 | - Wrzesień 93 | - Wrzesien 94 | - Września 95 | - Wrzesnia 96 | - Wrześniu 97 | - Wrzesniu 98 | - Wrz 99 | october: 100 | - Październik 101 | - Pazdziernik 102 | - Października 103 | - Pazdziernika 104 | - Październiku 105 | - Pazdzierniku 106 | - Paź 107 | - Paz 108 | november: 109 | - Listopad 110 | - Listopada 111 | - Listopadzie 112 | - Lis 113 | december: 114 | - Grudzień 115 | - Grudzien 116 | - Grudnia 117 | - Grudniu 118 | - Gru 119 | 120 | year: 121 | - lata 122 | - lat 123 | month: 124 | - miesiac 125 | - miesięcy 126 | - miesiąca 127 | - miesiące 128 | - miesiace 129 | week: 130 | - tydzien 131 | - tygodni 132 | - tygodnie 133 | day: 134 | - dzien 135 | - dnia 136 | - dniu 137 | - dni 138 | hour: 139 | - godzinę 140 | - godzine 141 | - godzin 142 | - godziny 143 | minute: 144 | - minuty 145 | - minut 146 | - minute 147 | - minutę 148 | second: 149 | - sekundę 150 | - sekunde 151 | - sekundy 152 | - sekund 153 | 154 | ago: 155 | - temu 156 | in: 157 | - za 158 | 159 | simplifications: 160 | - dziś: 0 dnia 161 | - dzisiaj: 0 dnia 162 | - onegdaj: 2 dnia 163 | - przedwczoraj: 2 dnia temu 164 | - jutro: za 1 dnia 165 | - pojutrze: za 2 dnia 166 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/pt.yaml: -------------------------------------------------------------------------------- 1 | skip: ["cerca", "de", "e", "às"] 2 | pertain: ["de"] 3 | 4 | sentence_splitter_group : 1 5 | 6 | monday: 7 | - Segunda 8 | tuesday: 9 | - Terça 10 | wednesday: 11 | - Quarta 12 | thursday: 13 | - Quinta 14 | friday: 15 | - Sexta 16 | saturday: 17 | - Sab 18 | 19 | september: 20 | - Septembro 21 | 22 | year: 23 | - anos 24 | month: 25 | - meses 26 | week: 27 | - semanas 28 | day: 29 | - dias 30 | hour: 31 | - horas 32 | minute: 33 | - minutos 34 | second: 35 | - segundos 36 | 37 | ago: 38 | - atrás 39 | - há 40 | in: 41 | - em 42 | 43 | relative-type: 44 | 2 day ago: 45 | - anteontem 46 | 47 | simplifications: 48 | - uma: '1' 49 | - um: '1' 50 | - alguns segundos: 44 segundos 51 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/ro.yaml: -------------------------------------------------------------------------------- 1 | skip: ["de", "la"] 2 | 3 | sentence_splitter_group : 1 4 | 5 | wednesday: 6 | - Mi 7 | 8 | february: 9 | - Febr 10 | march: 11 | - Mart 12 | september: 13 | - Sep 14 | november: 15 | - Noiem 16 | 17 | year: 18 | - ani 19 | month: 20 | - luna 21 | - luni 22 | week: 23 | - săptămâni 24 | day: 25 | - zile 26 | hour: 27 | - ore 28 | minute: 29 | - minute 30 | second: 31 | - secunde 32 | 33 | ago: 34 | - în urmă 35 | in: 36 | - în 37 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/ru.yaml: -------------------------------------------------------------------------------- 1 | skip: ['в', 'во', 'и', 'около', 'примерно'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | monday: 6 | - пнд 7 | tuesday: 8 | - втр 9 | wednesday: 10 | - срд 11 | - среду 12 | thursday: 13 | - чтв 14 | friday: 15 | - птн 16 | - пятницу 17 | saturday: 18 | - сбт 19 | - субботу 20 | sunday: 21 | - воскресение 22 | - вск 23 | 24 | february: 25 | - Фев 26 | september: 27 | - Сен 28 | november: 29 | - Ноя 30 | 31 | year: 32 | - года 33 | - году 34 | - лет 35 | month: 36 | - месяца 37 | - месяцев 38 | week: 39 | - недели 40 | - недель 41 | - неделю 42 | day: 43 | - дня 44 | - дней 45 | - сутки 46 | - суток 47 | hour: 48 | - часа 49 | - часов 50 | minute: 51 | - минуты 52 | - минут 53 | - минуту 54 | second: 55 | - секунды 56 | - секунд 57 | - секунду 58 | 59 | ago: 60 | - назад 61 | in: 62 | - в течение 63 | - спустя 64 | - через 65 | 66 | relative-type: 67 | 2 day ago: 68 | - позавчера 69 | in 2 day: 70 | - послезавтра 71 | in 3 day: 72 | - послепослезавтра 73 | 74 | simplifications: 75 | - од(?:на|ну|ни|ной|ин): '1' 76 | - дв(?:а|е|ое|ух): '2' 77 | - пар[ауы]: '2' 78 | - три: '3' 79 | - четыре: '4' 80 | - пять: '5' 81 | - шесть: '6' 82 | - семь: '7' 83 | - восемь: '8' 84 | - девять: '9' 85 | - десять: '10' 86 | - одиннадцать: '11' 87 | - двенадцать: '12' 88 | - пятнадцать: '15' 89 | - двадцать: '20' 90 | - тридцать: '30' 91 | - сорок: '40' 92 | - пятьдесят: '50' 93 | - несколько секунд: 44 секунды 94 | - полчаса: 30 минут 95 | - полгода: 6 месяцев 96 | - полтора часа: 90 минут 97 | - полтора года: 18 месяцев 98 | - ((?:через|спустя|в течение)\s+)секунд[уы]: ${1}1 секунду 99 | - ((?:через|спустя|в течение)\s+)минут[уы]: ${1}1 минуту 100 | - ((?:через|спустя|в течение)\s+)часа?: ${1}1 час 101 | - ((?:через|спустя|в течение)\s+)(?:день|дня): ${1}1 день 102 | - ((?:через|спустя|в течение)\s+)сут(?:ки|ок): ${1}1 сутки 103 | - ((?:через|спустя|в течение)\s+)недел[юи]: ${1}1 неделю 104 | - ((?:через|спустя|в течение)\s+)месяца?: ${1}1 месяц 105 | - ((?:через|спустя|в течение)\s+)года?: ${1}1 год 106 | - ([^\d]\s+|^)секунду(\s+назад): ${1}1 секунду\2 107 | - ([^\d]\s+|^)минуту(\s+назад): ${1}1 минуту\2 108 | - ([^\d]\s+|^)час(\s+назад): ${1}1 час\2 109 | - ([^\d]\s+|^)день(\s+назад): ${1}1 день\2 110 | - ([^\d]\s+|^)сутки(\s+назад): ${1}1 сутки\2 111 | - ([^\d]\s+|^)неделю(\s+назад): ${1}1 неделю\2 112 | - ([^\d]\s+|^)месяц(\s+назад): ${1}1 месяц\2 113 | - ([^\d]\s+|^)год(\s+назад): ${1}1 год\2 114 | - (\d{3,}1)\s*год\s*$: \1 115 | - (\d*[02-9])\s*год\b: \1 116 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/sk.yaml: -------------------------------------------------------------------------------- 1 | skip: ['v', 'vo'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | wednesday: 6 | - stredu 7 | saturday: 8 | - sobotu 9 | sunday: 10 | - nedeľu 11 | 12 | ago: 13 | - pred 14 | in: 15 | - o 16 | - za 17 | 18 | relative-type: 19 | 2 day ago: 20 | - predvčerom 21 | in 2 days: 22 | - pozajtra 23 | 24 | relative-type-regex: 25 | in \1 day: 26 | - o (\d+[.,]?\d*) dni 27 | in \1 hour: 28 | - o (\d+[.,]?\d*) hodiny 29 | in \1 minute: 30 | - o (\d+[.,]?\d*) minúty 31 | in \1 month: 32 | - o (\d+[.,]?\d*) mesiace 33 | in \1 second: 34 | - o (\d+[.,]?\d*) sekundy 35 | in \1 week: 36 | - o (\d+[.,]?\d*) týždne 37 | in \1 year: 38 | - o (\d+[.,]?\d*) roky 39 | 40 | simplifications: 41 | - pred sekundou: pred 1 sekundou 42 | - pred minútou: pred 1 minútou 43 | - pred hodinou: pred 1 hodinou 44 | - pred týždňom: pred 1 týždňom 45 | - pred mesiacom: pred 1 mesiacom 46 | - pred rokom: pred 1 rokom 47 | - pred pol rokom: pred 6 mesiacmi 48 | - o sekundu: o 1 sekundu 49 | - o minútu: o 1 minútu 50 | - o hodinu: o 1 hodinu 51 | - o týždeň: o 1 týždeň 52 | - o mesiac: o 1 mesiac 53 | - o rok: o 1 rok 54 | - o pol roka: o 6 mesiacov 55 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/sv.yaml: -------------------------------------------------------------------------------- 1 | skip: ["den", "på"] 2 | 3 | sentence_splitter_group : 1 4 | 5 | monday: 6 | - Månd 7 | tuesday: 8 | - Tisd 9 | wednesday: 10 | - Onsd 11 | thursday: 12 | - Torsd 13 | friday: 14 | - Fred 15 | saturday: 16 | - Lörd 17 | sunday: 18 | - Sönd 19 | 20 | june: 21 | - Jun 22 | july: 23 | - Jul 24 | september: 25 | - Sept 26 | 27 | year: 28 | - året 29 | month: 30 | - månader 31 | - månaden 32 | week: 33 | - veckor 34 | day: 35 | - dagar 36 | hour: 37 | - timmar 38 | - t 39 | minute: 40 | - minuter 41 | second: 42 | - sekunder 43 | 44 | ago: 45 | - sedan 46 | in: 47 | - om 48 | - från nu 49 | 50 | relative-type: 51 | 1 year ago: 52 | - förra året 53 | 2 day ago: 54 | - förrgår 55 | 1 day ago: 56 | - igår 57 | 0 day ago: 58 | - idag 59 | in 1 day: 60 | - imorgon 61 | 62 | simplifications: 63 | - en: '1' 64 | - två: '2' 65 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/th.yaml: -------------------------------------------------------------------------------- 1 | sentence_splitter_group : 5 2 | 3 | skip: ["น.", "เมื่อ ", "เวลา"] 4 | 5 | monday: 6 | - จันทร์ 7 | - วันจันทร์ที่ 8 | tuesday: 9 | - อังคาร 10 | - วันอังคารที่ 11 | wednesday: 12 | - พุธ 13 | - วันพุธที่ 14 | thursday: 15 | - พฤหัสบดี 16 | - พฤหัส 17 | - วันพฤหัสบดีที่ 18 | friday: 19 | - ศุกร์ 20 | - วันศุกร์ที่ 21 | saturday: 22 | - เสาร์ 23 | - วันเสาร์ที่ 24 | sunday: 25 | - อาทิตย์ 26 | - วันอาทิตย์ที่ 27 | 28 | january: 29 | - เดือนมกราคม 30 | - มกรา 31 | february: 32 | - เดือนกุมภาพันธ์ 33 | - กุมภา 34 | march: 35 | - เดือนมีนาคม 36 | - มีนา 37 | april: 38 | - เมษา 39 | - เดือนเมษายน 40 | may: 41 | - เดือนพฤษภาคม 42 | - พฤษภา 43 | june: 44 | - เดือนมิถุนายน 45 | - มิถุนา 46 | july: 47 | - เดือนกรกฏาคม 48 | - กรกฎา 49 | august: 50 | - สิงหา 51 | - เดือนสิงหาคม 52 | september: 53 | - กันยา 54 | - เดือนกันยายน 55 | october: 56 | - เดือนตุลาคม 57 | - ตุลา 58 | november: 59 | - เดือนพฤศจิกายน 60 | - พฤศจิ 61 | december: 62 | - เดือนธันวาคม 63 | - ธันวา 64 | 65 | ago: 66 | - แต่ก่อน 67 | - มาแล้ว 68 | - ก่อน 69 | in: 70 | - ใน 71 | 72 | simplifications: 73 | - วันนี้: 0 วัน 74 | - เมื่อวานนี้: 1 วัน 75 | - 1 วันที่แล้ว: 1 วัน 76 | - เมื่อวานซืน: 2 วัน 77 | - 2 วันที่แล้ว: 2 วัน 78 | - เมื่อสักครู่นี้: 0 วินาที 79 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/tl.yaml: -------------------------------------------------------------------------------- 1 | sentence_splitter_group : 1 2 | 3 | skip: ["ganap", "na", "noon", "noong", "sa"] 4 | 5 | monday: 6 | - Lunes 7 | - Lun 8 | tuesday: 9 | - Martes 10 | wednesday: 11 | - Miyerkules 12 | - Miy 13 | thursday: 14 | - Huwebes 15 | - Huw 16 | friday: 17 | - Biyernes 18 | - Biy 19 | saturday: 20 | - Sabado 21 | - Sab 22 | sunday: 23 | - Linggo 24 | - Lin 25 | 26 | january: 27 | - Enero 28 | - Ene 29 | february: 30 | - Pebrero 31 | - Peb 32 | march: 33 | - Marso 34 | - Mar 35 | april: 36 | - Abril 37 | - Abr 38 | may: 39 | - Mayo 40 | - May 41 | june: 42 | - Hunyo 43 | - Hun 44 | july: 45 | - Hulyo 46 | - Hul 47 | august: 48 | - Agosto 49 | - Ago 50 | september: 51 | - Setyembre 52 | - Set 53 | october: 54 | - Oktubre 55 | - Okt 56 | november: 57 | - Nobyembre 58 | - Nob 59 | december: 60 | - Disyembre 61 | - Dis 62 | 63 | year: 64 | - taon 65 | month: 66 | - buwan 67 | week: 68 | - linggo 69 | day: 70 | - araw 71 | hour: 72 | - oras 73 | minute: 74 | - minuto 75 | second: 76 | - segundo 77 | 78 | ago: 79 | - nakaraan 80 | - nakalipas 81 | in: 82 | - sa 83 | 84 | simplifications: 85 | - kahapon: 1 araw nakaraan 86 | - ngayon: 0 segundo nakalipas 87 | - isang araw: 2 araw 88 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/tr.yaml: -------------------------------------------------------------------------------- 1 | skip: ["ve", "yaklaşık"] 2 | 3 | sentence_splitter_group : 1 4 | 5 | wednesday: 6 | - Çrs 7 | thursday: 8 | - Prs 9 | 10 | january: 11 | - Oc 12 | february: 13 | - Şu 14 | april: 15 | - Ni 16 | june: 17 | - Ha 18 | july: 19 | - Te 20 | august: 21 | - Ağ 22 | september: 23 | - Ey 24 | october: 25 | - Ek 26 | november: 27 | - Ka 28 | december: 29 | - Ar 30 | 31 | year: 32 | - sene 33 | 34 | ago: 35 | - önce 36 | in: 37 | - içerisinde 38 | - içinde 39 | - sonra 40 | 41 | relative-type: 42 | in 1 year: 43 | - önümüzdeki yıl 44 | in 1 month: 45 | - önümüzdeki ay 46 | in 1 week: 47 | - haftaya 48 | - önümüzdeki hafta 49 | 1 day ago: 50 | - geçen gün 51 | in 1 day: 52 | - önümüzdeki gün 53 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/uk.yaml: -------------------------------------------------------------------------------- 1 | skip: ['приблизно', 'близько', 'о', 'об', 'і'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | monday: 6 | - пн 7 | - пон 8 | - понед 9 | - понеділок 10 | tuesday: 11 | - вт 12 | - вів 13 | - вівтор 14 | - вівторок 15 | wednesday: 16 | - ср 17 | - сер 18 | - серед 19 | - середа 20 | - середу 21 | thursday: 22 | - чт 23 | - чет 24 | - четвер 25 | friday: 26 | - пят 27 | saturday: 28 | - сб 29 | - суб 30 | - субот 31 | - субота 32 | - суботу 33 | sunday: 34 | - нд 35 | - нед 36 | - неділ 37 | - неділя 38 | - неділю 39 | 40 | march: 41 | - берез 42 | september: 43 | - верес 44 | november: 45 | - листоп 46 | 47 | year: 48 | - р 49 | - рік 50 | - роки 51 | - років 52 | - року 53 | - роком 54 | - році 55 | - роках 56 | - роками 57 | - рокові 58 | month: 59 | - м 60 | - міс 61 | - місяць 62 | - місяці 63 | - місяців 64 | - місяця 65 | - місяцю 66 | - місяцям 67 | - місяцем 68 | - місяцеві 69 | - місяцях 70 | - місяцями 71 | week: 72 | - т 73 | - тиждень 74 | - тижня 75 | - тижні 76 | - тижнів 77 | - тижнем 78 | - тижневі 79 | - тижню 80 | day: 81 | - д 82 | - дн 83 | - день 84 | - дня 85 | - дні 86 | - днів 87 | - доба 88 | - доби 89 | - діб 90 | - дневі 91 | - дню 92 | - днем 93 | hour: 94 | - г 95 | - год 96 | - годин 97 | - година 98 | - години 99 | - годин 100 | - годину 101 | - г 102 | - годині 103 | - годиною 104 | - годино 105 | minute: 106 | - хв 107 | - хвилини 108 | - хвилин 109 | - хвилину 110 | - хвилина 111 | - хвилині 112 | - хвилиною 113 | - хвилино 114 | second: 115 | - с 116 | - секунда 117 | - секунди 118 | - секунд 119 | - секунду 120 | - сек 121 | - секунді 122 | - секундою 123 | - секундо 124 | 125 | am: 126 | - до полудня 127 | pm: 128 | - після полудня 129 | - пополудні 130 | - пополудні 131 | 132 | ago: 133 | - тому 134 | - назад 135 | in: 136 | - протягом 137 | - через 138 | - за 139 | 140 | relative-type: 141 | 2 day ago: 142 | - позавчора 143 | 1 day ago: 144 | - вчора 145 | in 2 day: 146 | - післязавтра 147 | 148 | relative-type-regex: 149 | \1 hour ago: 150 | - (\d+[.,]?\d*) година тому 151 | \1 minute ago: 152 | - (\d+[.,]?\d*) хвилина тому 153 | \1 second ago: 154 | - (\d+[.,]?\d*) секунда тому 155 | 156 | simplifications: 157 | - од(на|ну|ні|ної|нієї|ин|ній): '1' 158 | - дв(а|і|оє|ох): '2' 159 | - пар[ауі]: '2' 160 | - три: '3' 161 | - чотири: '4' 162 | - п'ять: '5' 163 | - шість: '6' 164 | - сім: '7' 165 | - вісім: '8' 166 | - дев'ять: '9' 167 | - десять: '10' 168 | - одинадцять: '11' 169 | - дванадцять: '12' 170 | - п'ятнадцять: '15' 171 | - двадцять: '20' 172 | - тридцять: '30' 173 | - сорок: '40' 174 | - п'ятдесят: '50' 175 | - півгодини: 30 хвилин 176 | - пів години: 30 хвилин 177 | - півроку: 6 місяців 178 | - пів року: 6 місяців 179 | - півтори години: 90 хвилин 180 | - півтора року: 18 місяців 181 | - ^година: 1 година 182 | - ^годину: 1 годину 183 | - ^хвилину: 1 хвилину 184 | - ^секунду: 1 секунду 185 | - кілька секунд: 44 секунди 186 | - кілька хвилин: 2 хвилини 187 | - опів на: 30 хвилин 188 | - за чверть: 15 хвилин 189 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/vi.yaml: -------------------------------------------------------------------------------- 1 | pertain: ['lúc'] 2 | 3 | sentence_splitter_group: 1 4 | 5 | monday: 6 | - Thứ 2 7 | tuesday: 8 | - Thứ 3 9 | wednesday: 10 | - Thứ 4 11 | thursday: 12 | - Thứ 5 13 | friday: 14 | - Thứ 6 15 | saturday: 16 | - Thứ 7 17 | sunday: 18 | - Thứ 1 19 | 20 | january: 21 | - Tháng một 22 | february: 23 | - Tháng hai 24 | march: 25 | - Tháng ba 26 | april: 27 | - Tháng tư 28 | may: 29 | - Tháng năm 30 | june: 31 | - Tháng sáu 32 | july: 33 | - Tháng bảy 34 | august: 35 | - Tháng tám 36 | september: 37 | - Tháng chín 38 | october: 39 | - Tháng mười 40 | november: 41 | - Tháng mười một 42 | december: 43 | - Tháng mười hai 44 | 45 | month: 46 | - thang 47 | - Thg 48 | week: 49 | - tuần lể 50 | day: 51 | - ban ngày 52 | - buổi 53 | minute: 54 | - chút 55 | - lát 56 | - nguyên bản 57 | second: 58 | - giây đồng hồ 59 | - hạng nhì 60 | 61 | ago: 62 | - cách đây 63 | - trước đây 64 | - trước 65 | - trước 66 | in: 67 | - trong 68 | 69 | simplifications: 70 | - (?:ngày|năm)\s(\d+[.,]?\d*): \1 71 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/yue.yaml: -------------------------------------------------------------------------------- 1 | no_word_spacing: true 2 | 3 | sentence_splitter_group : 4 4 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/zh-Hans.yaml: -------------------------------------------------------------------------------- 1 | no_word_spacing: true 2 | 3 | sentence_splitter_group: 4 4 | 5 | relative-type: 6 | 2 day ago: 7 | - 前天 8 | 0 second ago: 9 | - 刚刚 10 | 0 hour ago: 11 | - 这一时间 12 | - 此时 13 | in 2 days: 14 | - 后天 15 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/zh-Hant.yaml: -------------------------------------------------------------------------------- 1 | no_word_spacing: true 2 | 3 | sentence_splitter_group: 4 4 | -------------------------------------------------------------------------------- /data-supplementary/date-translation/zh.yaml: -------------------------------------------------------------------------------- 1 | no_word_spacing: true 2 | 3 | sentence_splitter_group: 4 4 | 5 | skip: ['约'] 6 | 7 | monday: 8 | - 礼拜一 9 | tuesday: 10 | - 礼拜二 11 | wednesday: 12 | - 礼拜三 13 | thursday: 14 | - 礼拜四 15 | friday: 16 | - 礼拜五 17 | saturday: 18 | - 礼拜六 19 | sunday: 20 | - 星期天 21 | - 礼拜日 22 | - 礼拜天 23 | 24 | month: 25 | - 个月 26 | - 個月 27 | week: 28 | - 星期 29 | day: 30 | - 天 31 | 32 | ago: 33 | - 前 34 | in: 35 | - 在 36 | 37 | relative-type: 38 | 2 day ago: 39 | - 前天 40 | 0 second ago: 41 | - 刚刚 42 | 0 hour ago: 43 | - 这一时间 44 | - 此时 45 | in 2 days: 46 | - 后天 47 | 48 | simplifications: 49 | - 半小时前: 30分前 50 | - (?:中午|下午|(?:晚上?))(?:\s*)(\d+[.,]?\d*)(?:\s*):(?:\s+|:)?(\d+[.,]?\d*): \1:\2 pm 51 | - (?:上午|早上|凌晨)(?:\s*)(\d+[.,]?\d*)(?:\s*):(?:\s+|:)?(\d+[.,]?\d*): \1:\2 am 52 | - 中午: '12:00' 53 | - (\d+[.,]?\d*)年(?:\s+)?(\d+[.,]?\d*)月(?:\s+)?(\d+[.,]?\d*)日(?:\s+)?(\d+[.,]?\d*)时(?:\s+)?(\d+[.,]?\d*)分: \1-\2-\3 \4:\5 54 | - (\d+[.,]?\d*)年(?:\s+)?(\d+[.,]?\d*)月(?:\s+)?(\d{1,2})(?:日)?(?:\s+)?(\d{1,2})(?:点|:)(\d{1,2}): \1-\2-\3 \4:\5 55 | - (\d+[.,]?\d*)年(?:\s+)?(\d+[.,]?\d*)月(?:\s+)?(\d{1,2})(?:日)?: \1-\2-\3 56 | - (\d+[.,]?\d*)月(.*[前后]): \1 月\2 57 | -------------------------------------------------------------------------------- /date/date.go: -------------------------------------------------------------------------------- 1 | package date 2 | 3 | import ( 4 | "time" 5 | ) 6 | 7 | // Period is representation of confidence level for the parsed date. 8 | // For example, if the parsed date has period level `Month`, then 9 | // the parser is only confident up to the month, while the day and 10 | // time is taken from the current time. 11 | type Period uint8 12 | 13 | const ( 14 | None Period = iota 15 | Second 16 | Minute 17 | Hour 18 | Day 19 | Month 20 | Year 21 | ) 22 | 23 | var periodString = map[Period]string{ 24 | Second: "Second", 25 | Minute: "Minute", 26 | Hour: "Hour", 27 | Day: "Day", 28 | Month: "Month", 29 | Year: "Year", 30 | } 31 | 32 | func (p Period) String() string { 33 | return periodString[p] 34 | } 35 | 36 | func (p Period) IsTime() bool { 37 | return p == Second || p == Minute || p == Hour 38 | } 39 | 40 | // Date is object that represents the parsed date with useful information. 41 | type Date struct { 42 | Locale string 43 | Period Period 44 | Time time.Time 45 | } 46 | 47 | // IsZero reports whether the date is empty or not. 48 | func (d Date) IsZero() bool { 49 | return d.Period == None || d.Time.IsZero() 50 | } 51 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/markusmobius/go-dateparser 2 | 3 | go 1.24.1 4 | 5 | require ( 6 | github.com/go-git/go-git/v5 v5.12.0 7 | github.com/go-shiori/dom v0.0.0-20230515143342-73569d674e1c 8 | github.com/hablullah/go-hijri v1.0.2 9 | github.com/jalaali/go-jalaali v0.0.0-20210801064154-80525e88d958 10 | github.com/rs/zerolog v1.33.0 11 | github.com/spf13/cobra v1.8.0 12 | github.com/stretchr/testify v1.9.0 13 | github.com/wasilibs/go-re2 v1.3.0 14 | github.com/zyedidia/generic v1.2.1 15 | golang.org/x/text v0.14.0 16 | gopkg.in/yaml.v2 v2.4.0 17 | ) 18 | 19 | require ( 20 | dario.cat/mergo v1.0.0 // indirect 21 | github.com/Microsoft/go-winio v0.6.1 // indirect 22 | github.com/ProtonMail/go-crypto v1.0.0 // indirect 23 | github.com/andybalholm/cascadia v1.3.2 // indirect 24 | github.com/cloudflare/circl v1.3.7 // indirect 25 | github.com/cyphar/filepath-securejoin v0.2.4 // indirect 26 | github.com/davecgh/go-spew v1.1.1 // indirect 27 | github.com/emirpasic/gods v1.18.1 // indirect 28 | github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect 29 | github.com/go-git/go-billy/v5 v5.5.0 // indirect 30 | github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f // indirect 31 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect 32 | github.com/hablullah/go-juliandays v1.0.0 // indirect 33 | github.com/inconshreveable/mousetrap v1.1.0 // indirect 34 | github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect 35 | github.com/kevinburke/ssh_config v1.2.0 // indirect 36 | github.com/magefile/mage v1.14.0 // indirect 37 | github.com/mattn/go-colorable v0.1.13 // indirect 38 | github.com/mattn/go-isatty v0.0.19 // indirect 39 | github.com/pjbgf/sha1cd v0.3.0 // indirect 40 | github.com/pmezard/go-difflib v1.0.0 // indirect 41 | github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect 42 | github.com/skeema/knownhosts v1.2.2 // indirect 43 | github.com/spf13/pflag v1.0.5 // indirect 44 | github.com/tetratelabs/wazero v1.2.1 // indirect 45 | github.com/xanzy/ssh-agent v0.3.3 // indirect 46 | golang.org/x/crypto v0.21.0 // indirect 47 | golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect 48 | golang.org/x/mod v0.12.0 // indirect 49 | golang.org/x/net v0.22.0 // indirect 50 | golang.org/x/sys v0.18.0 // indirect 51 | golang.org/x/tools v0.13.0 // indirect 52 | gopkg.in/warnings.v0 v0.1.2 // indirect 53 | gopkg.in/yaml.v3 v3.0.1 // indirect 54 | ) 55 | -------------------------------------------------------------------------------- /hijri-parser.go: -------------------------------------------------------------------------------- 1 | package dateparser 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/markusmobius/go-dateparser/date" 7 | "github.com/markusmobius/go-dateparser/internal/parser/hijri" 8 | ) 9 | 10 | // ParseHijri parses a Hijri date string using Umm al-Qura Calendar 11 | // which commonly used in Islamic country. 12 | func ParseHijri(cfg *Configuration, str string) (date.Date, error) { 13 | // Prepare config 14 | if cfg == nil { 15 | cfg = &Configuration{} 16 | } 17 | 18 | // Hijri usually used in Eastern country which uses DMY, 19 | // so here it used as default. 20 | dateOrder := "DMY" 21 | if cfg.DateOrder != nil { 22 | do := cfg.DateOrder("") 23 | if do, valid := validateDateOrder(do); valid { 24 | dateOrder = do 25 | } 26 | } 27 | 28 | cfg = cfg.initiate() 29 | err := cfg.validate() 30 | if err != nil { 31 | return date.Date{}, fmt.Errorf("config error: %w", err) 32 | } 33 | 34 | // Start parser 35 | iCfg := cfg.toInternalConfig() 36 | iCfg.DateOrder = dateOrder 37 | return hijri.Parse(iCfg, str) 38 | } 39 | -------------------------------------------------------------------------------- /internal/data/as.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | as_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | as_Locale = merge(nil, LocaleData{ 11 | Name: "as", 12 | DateOrder: "YMD", 13 | Charset: []rune(`ceghiklnorstuwxyzঅআইএওকগঘঙচছজটডণতদধনপফবভমলশষসহািীুূৃেৈো্ৰৱ`), 14 | Translations: map[string][]string{ 15 | "বহষপতিবাৰ": {"thursday"}, 16 | "ছেপতেমবৰ": {"september"}, 17 | "ফেবৰৱাৰী": {"february"}, 18 | "জানৱাৰী": {"january"}, 19 | "ডিচেমবৰ": {"december"}, 20 | "মঙগলবাৰ": {"tuesday"}, 21 | "অকটোবৰ": {"october"}, 22 | "অপৰাহণ": {"pm"}, 23 | "ছেকেণড": {"second"}, 24 | "দেওবাৰ": {"sunday"}, 25 | "নৱেমবৰ": {"november"}, 26 | "পৰবাহণ": {"am"}, 27 | "বহষপতি": {"thursday"}, 28 | "শকৰবাৰ": {"friday"}, 29 | "শনিবাৰ": {"saturday"}, 30 | "সোমবাৰ": {"monday"}, 31 | "এপৰিল": {"april"}, 32 | "বধবাৰ": {"wednesday"}, 33 | "মিনিট": {"minute"}, 34 | "সপতাহ": {"week"}, 35 | "অকটো": {"october"}, 36 | "আগষট": {"august"}, 37 | "ঘণটা": {"hour"}, 38 | "জলাই": {"july"}, 39 | "ডিসে": {"december"}, 40 | "ফেবৰ": {"february"}, 41 | "মঙগল": {"tuesday"}, 42 | "মাৰচ": {"march"}, 43 | "সেপট": {"september"}, 44 | "gmt": {"gmt"}, 45 | "utc": {"utc"}, 46 | "জান": {"january"}, 47 | "দিন": {"day"}, 48 | "নভে": {"november"}, 49 | "বছৰ": {"year"}, 50 | "মাহ": {"month"}, 51 | "শকৰ": {"friday"}, 52 | "শনি": {"saturday"}, 53 | "সোম": {"monday"}, 54 | "ৰবি": {"sunday"}, 55 | "am": {"am"}, 56 | "pm": {"pm"}, 57 | "আগ": {"august"}, 58 | "জন": {"june"}, 59 | "বধ": {"wednesday"}, 60 | "মে": {"may"}, 61 | " ": {" "}, 62 | "'": {""}, 63 | "+": {"+"}, 64 | ",": {""}, 65 | "-": {"-"}, 66 | ".": {"."}, 67 | "/": {"/"}, 68 | ":": {":"}, 69 | ";": {""}, 70 | "@": {""}, 71 | "[": {""}, 72 | "]": {""}, 73 | "z": {"z"}, 74 | "|": {""}, 75 | }, 76 | RelativeType: map[string]string{ 77 | "this minute": "0 minute ago", 78 | "last month": "1 month ago", 79 | "next month": "in 1 month", 80 | "this month": "0 month ago", 81 | "last week": "1 week ago", 82 | "last year": "1 year ago", 83 | "next week": "in 1 week", 84 | "next year": "in 1 year", 85 | "this hour": "0 hour ago", 86 | "this week": "0 week ago", 87 | "this year": "0 year ago", 88 | "কাইলৈ": "in 1 day", 89 | "কালি": "1 day ago", 90 | "now": "0 second ago", 91 | "আজি": "0 day ago", 92 | }, 93 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "বহষপতিবাৰ", "ছেপতেমবৰ", "ফেবৰৱাৰী", "জানৱাৰী", "ডিচেমবৰ", "মঙগলবাৰ", "অকটোবৰ", "অপৰাহণ", "ছেকেণড", "দেওবাৰ", "নৱেমবৰ", "পৰবাহণ", "বহষপতি", "শকৰবাৰ", "শনিবাৰ", "সোমবাৰ", "এপৰিল", "কাইলৈ", "বধবাৰ", "মিনিট", "সপতাহ", "অকটো", "আগষট", "কালি", "ঘণটা", "জলাই", "ডিসে", "ফেবৰ", "মঙগল", "মাৰচ", "সেপট", "gmt", "now", "utc", "আজি", "জান", "দিন", "নভে", "বছৰ", "মাহ", "শকৰ", "শনি", "সোম", "ৰবি", "am", "pm", "আগ", "জন", "বধ", "মে", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 94 | }) 95 | } 96 | -------------------------------------------------------------------------------- /internal/data/bem.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | bem_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | bem_Locale = merge(nil, LocaleData{ 11 | Name: "bem", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuvwxyz`), 14 | Translations: map[string][]string{ 15 | "pachibelushi": {"saturday"}, 16 | "palichibuli": {"tuesday"}, 17 | "palichisano": {"friday"}, 18 | "palichitatu": {"wednesday"}, 19 | "pa mulungu": {"sunday"}, 20 | "palichimo": {"monday"}, 21 | "palichine": {"thursday"}, 22 | "februari": {"february"}, 23 | "septemba": {"september"}, 24 | "ubushiku": {"day"}, 25 | "uluchelo": {"am"}, 26 | "umulungu": {"week"}, 27 | "akasuba": {"pm"}, 28 | "disemba": {"december"}, 29 | "januari": {"january"}, 30 | "novemba": {"november"}, 31 | "sekondi": {"second"}, 32 | "umweshi": {"month"}, 33 | "mineti": {"minute"}, 34 | "ogasti": {"august"}, 35 | "oktoba": {"october"}, 36 | "umwaka": {"year"}, 37 | "epreo": {"april"}, 38 | "julai": {"july"}, 39 | "machi": {"march"}, 40 | "insa": {"hour"}, 41 | "juni": {"june"}, 42 | "dis": {"december"}, 43 | "epr": {"april"}, 44 | "feb": {"february"}, 45 | "gmt": {"gmt"}, 46 | "jan": {"january"}, 47 | "jul": {"july"}, 48 | "jun": {"june"}, 49 | "mac": {"march"}, 50 | "mei": {"may"}, 51 | "nov": {"november"}, 52 | "oga": {"august"}, 53 | "okt": {"october"}, 54 | "sep": {"september"}, 55 | "utc": {"utc"}, 56 | "am": {"am"}, 57 | "pm": {"pm"}, 58 | " ": {" "}, 59 | "'": {""}, 60 | "+": {"+"}, 61 | ",": {""}, 62 | "-": {"-"}, 63 | ".": {"."}, 64 | "/": {"/"}, 65 | ":": {":"}, 66 | ";": {""}, 67 | "@": {""}, 68 | "[": {""}, 69 | "]": {""}, 70 | "z": {"z"}, 71 | "|": {""}, 72 | }, 73 | RelativeType: map[string]string{ 74 | "this minute": "0 minute ago", 75 | "last month": "1 month ago", 76 | "next month": "in 1 month", 77 | "this month": "0 month ago", 78 | "last week": "1 week ago", 79 | "last year": "1 year ago", 80 | "next week": "in 1 week", 81 | "next year": "in 1 year", 82 | "this hour": "0 hour ago", 83 | "this week": "0 week ago", 84 | "this year": "0 year ago", 85 | "yesterday": "1 day ago", 86 | "tomorrow": "in 1 day", 87 | "lelo": "0 day ago", 88 | "now": "0 second ago", 89 | }, 90 | KnownWords: []string{"pachibelushi", "palichibuli", "palichisano", "palichitatu", "this minute", "last month", "next month", "pa mulungu", "this month", "last week", "last year", "next week", "next year", "palichimo", "palichine", "this hour", "this week", "this year", "yesterday", "februari", "septemba", "tomorrow", "ubushiku", "uluchelo", "umulungu", "akasuba", "disemba", "januari", "novemba", "sekondi", "umweshi", "mineti", "ogasti", "oktoba", "umwaka", "epreo", "julai", "machi", "insa", "juni", "lelo", "dis", "epr", "feb", "gmt", "jan", "jul", "jun", "mac", "mei", "nov", "now", "oga", "okt", "sep", "utc", "am", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 91 | }) 92 | } 93 | -------------------------------------------------------------------------------- /internal/data/bm.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | bm_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | bm_Locale = merge(nil, LocaleData{ 11 | Name: "bm", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuwxyzɔɛ`), 14 | Translations: map[string][]string{ 15 | "desanburu": {"december"}, 16 | "nowanburu": {"november"}, 17 | "sɛtanburu": {"september"}, 18 | "ɔkutɔburu": {"october"}, 19 | "feburuye": {"february"}, 20 | "alamisa": {"thursday"}, 21 | "awirili": {"april"}, 22 | "dɔgɔkun": {"week"}, 23 | "sekondi": {"second"}, 24 | "zanwuye": {"january"}, 25 | "marisi": {"march"}, 26 | "miniti": {"minute"}, 27 | "sibiri": {"saturday"}, 28 | "tarata": {"tuesday"}, 29 | "zuluye": {"july"}, 30 | "araba": {"wednesday"}, 31 | "ntɛnɛ": {"monday"}, 32 | "zuwɛn": {"june"}, 33 | "juma": {"friday"}, 34 | "kalo": {"month"}, 35 | "kari": {"sunday"}, 36 | "lɛrɛ": {"hour"}, 37 | "ala": {"thursday"}, 38 | "ara": {"wednesday"}, 39 | "awi": {"april"}, 40 | "des": {"december"}, 41 | "don": {"day"}, 42 | "feb": {"february"}, 43 | "gmt": {"gmt"}, 44 | "jum": {"friday"}, 45 | "kar": {"sunday"}, 46 | "mar": {"march"}, 47 | "now": {"november"}, 48 | "ntɛ": {"monday"}, 49 | "san": {"year"}, 50 | "sib": {"saturday"}, 51 | "sɛt": {"september"}, 52 | "tar": {"tuesday"}, 53 | "utc": {"utc"}, 54 | "uti": {"august"}, 55 | "zan": {"january"}, 56 | "zul": {"july"}, 57 | "zuw": {"june"}, 58 | "ɔku": {"october"}, 59 | "am": {"am"}, 60 | "mɛ": {"may"}, 61 | "pm": {"pm"}, 62 | " ": {" "}, 63 | "'": {""}, 64 | "+": {"+"}, 65 | ",": {""}, 66 | "-": {"-"}, 67 | ".": {"."}, 68 | "/": {"/"}, 69 | ":": {":"}, 70 | ";": {""}, 71 | "@": {""}, 72 | "[": {""}, 73 | "]": {""}, 74 | "z": {"z"}, 75 | "|": {""}, 76 | }, 77 | RelativeType: map[string]string{ 78 | "this minute": "0 minute ago", 79 | "last month": "1 month ago", 80 | "next month": "in 1 month", 81 | "this month": "0 month ago", 82 | "last week": "1 week ago", 83 | "last year": "1 year ago", 84 | "next week": "in 1 week", 85 | "next year": "in 1 year", 86 | "this hour": "0 hour ago", 87 | "this week": "0 week ago", 88 | "this year": "0 year ago", 89 | "kunu": "1 day ago", 90 | "sini": "in 1 day", 91 | "now": "0 second ago", 92 | "bi": "0 day ago", 93 | }, 94 | KnownWords: []string{"this minute", "last month", "next month", "this month", "desanburu", "last week", "last year", "next week", "next year", "nowanburu", "sɛtanburu", "this hour", "this week", "this year", "ɔkutɔburu", "feburuye", "alamisa", "awirili", "dɔgɔkun", "sekondi", "zanwuye", "marisi", "miniti", "sibiri", "tarata", "zuluye", "araba", "ntɛnɛ", "zuwɛn", "juma", "kalo", "kari", "kunu", "lɛrɛ", "sini", "ala", "ara", "awi", "des", "don", "feb", "gmt", "jum", "kar", "mar", "now", "ntɛ", "san", "sib", "sɛt", "tar", "utc", "uti", "zan", "zul", "zuw", "ɔku", "am", "bi", "mɛ", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 95 | }) 96 | } 97 | -------------------------------------------------------------------------------- /internal/data/brx.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | brx_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | brx_Locale = merge(nil, LocaleData{ 11 | Name: "brx", 12 | DateOrder: "MDY", 13 | Charset: []rune(`/ceghiklnorstuwxyzंअआइएखगजथदनफबमयरलवसह़ािीुेैो्`), 14 | Translations: map[string][]string{ 15 | "सबथा/हबथा": {"week"}, 16 | "बिसथिबार": {"thursday"}, 17 | "जानवारी": {"january"}, 18 | "फबरवारी": {"february"}, 19 | "दिसजबर": {"december"}, 20 | "मगलबार": {"tuesday"}, 21 | "रबिबार": {"sunday"}, 22 | "सखरबार": {"friday"}, 23 | "सनिबार": {"saturday"}, 24 | "सबथजबर": {"september"}, 25 | "अखथबर": {"october"}, 26 | "एफरिल": {"april"}, 27 | "नबजबर": {"november"}, 28 | "बदबार": {"wednesday"}, 29 | "बिसथि": {"thursday"}, 30 | "बोसोर": {"year"}, 31 | "मिनिथ": {"minute"}, 32 | "समबार": {"monday"}, 33 | "आगसथ": {"august"}, 34 | "जलाइ": {"july"}, 35 | "बलास": {"pm"}, 36 | "मारस": {"march"}, 37 | "रिगा": {"hour"}, 38 | "सखनद": {"second"}, 39 | "gmt": {"gmt"}, 40 | "utc": {"utc"}, 41 | "दान": {"month"}, 42 | "मगल": {"tuesday"}, 43 | "रबि": {"sunday"}, 44 | "सखर": {"friday"}, 45 | "सनि": {"saturday"}, 46 | "सान": {"day"}, 47 | "am": {"am"}, 48 | "pm": {"pm"}, 49 | "जन": {"june"}, 50 | "बद": {"wednesday"}, 51 | "सम": {"monday"}, 52 | " ": {" "}, 53 | "'": {""}, 54 | "+": {"+"}, 55 | ",": {""}, 56 | "-": {"-"}, 57 | ".": {"."}, 58 | "/": {"/"}, 59 | ":": {":"}, 60 | ";": {""}, 61 | "@": {""}, 62 | "[": {""}, 63 | "]": {""}, 64 | "z": {"z"}, 65 | "|": {""}, 66 | "फ": {"am"}, 67 | "म": {"may"}, 68 | }, 69 | RelativeType: map[string]string{ 70 | "this minute": "0 minute ago", 71 | "last month": "1 month ago", 72 | "next month": "in 1 month", 73 | "this month": "0 month ago", 74 | "last week": "1 week ago", 75 | "last year": "1 year ago", 76 | "next week": "in 1 week", 77 | "next year": "in 1 year", 78 | "this hour": "0 hour ago", 79 | "this week": "0 week ago", 80 | "this year": "0 year ago", 81 | "गाबोन": "in 1 day", 82 | "now": "0 second ago", 83 | "दिन": "0 day ago", 84 | "मया": "1 day ago", 85 | }, 86 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "सबथा/हबथा", "बिसथिबार", "जानवारी", "फबरवारी", "दिसजबर", "मगलबार", "रबिबार", "सखरबार", "सनिबार", "सबथजबर", "अखथबर", "एफरिल", "गाबोन", "नबजबर", "बदबार", "बिसथि", "बोसोर", "मिनिथ", "समबार", "आगसथ", "जलाइ", "बलास", "मारस", "रिगा", "सखनद", "gmt", "now", "utc", "दान", "दिन", "मगल", "मया", "रबि", "सखर", "सनि", "सान", "am", "pm", "जन", "बद", "सम", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|", "फ", "म"}, 87 | }) 88 | } 89 | -------------------------------------------------------------------------------- /internal/data/ckb.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | ckb_Locale LocaleData 7 | ckb_IR_Locale LocaleData 8 | ) 9 | 10 | func init() { 11 | ckb_Locale = merge(nil, LocaleData{ 12 | Name: "ckb", 13 | DateOrder: "YMD", 14 | Charset: []rune(`cdeghiklnorstuwxyzئابتجحدرزسشلمنويپچکھیێە`), 15 | Translations: map[string][]string{ 16 | "کانوونی دووەم": {"january"}, 17 | "تشرینی دووەم": {"november"}, 18 | "تشرینی یەکەم": {"october"}, 19 | "کانونی یەکەم": {"december"}, 20 | "پێنجشەممە": {"thursday"}, 21 | "چوارشەممە": {"wednesday"}, 22 | "حوزەیران": {"june"}, 23 | "دووشەممە": {"monday"}, 24 | "یەکشەممە": {"sunday"}, 25 | "سێشەممە": {"tuesday"}, 26 | "يەیلوول": {"september"}, 27 | "minute": {"minute"}, 28 | "second": {"second"}, 29 | "تەمووز": {"july"}, 30 | "month": {"month"}, 31 | "شوبات": {"february"}, 32 | "شەممە": {"saturday"}, 33 | "نیسان": {"april"}, 34 | "يازار": {"march"}, 35 | "يایار": {"may"}, 36 | "ھەینی": {"friday"}, 37 | "hour": {"hour"}, 38 | "week": {"week"}, 39 | "year": {"year"}, 40 | "day": {"day"}, 41 | "gmt": {"gmt"}, 42 | "utc": {"utc"}, 43 | "ياب": {"august"}, 44 | "am": {"am"}, 45 | "pm": {"pm"}, 46 | "بن": {"am"}, 47 | "دن": {"pm"}, 48 | " ": {" "}, 49 | "'": {""}, 50 | "+": {"+"}, 51 | ",": {""}, 52 | "-": {"-"}, 53 | ".": {"."}, 54 | "/": {"/"}, 55 | ":": {":"}, 56 | ";": {""}, 57 | "@": {""}, 58 | "[": {""}, 59 | "]": {""}, 60 | "z": {"z"}, 61 | "|": {""}, 62 | }, 63 | RelativeType: map[string]string{ 64 | "this minute": "0 minute ago", 65 | "last month": "1 month ago", 66 | "next month": "in 1 month", 67 | "this month": "0 month ago", 68 | "last week": "1 week ago", 69 | "last year": "1 year ago", 70 | "next week": "in 1 week", 71 | "next year": "in 1 year", 72 | "this hour": "0 hour ago", 73 | "this week": "0 week ago", 74 | "this year": "0 year ago", 75 | "yesterday": "1 day ago", 76 | "tomorrow": "in 1 day", 77 | "today": "0 day ago", 78 | "now": "0 second ago", 79 | }, 80 | KnownWords: []string{"کانوونی دووەم", "تشرینی دووەم", "تشرینی یەکەم", "کانونی یەکەم", "this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "yesterday", "پێنجشەممە", "چوارشەممە", "tomorrow", "حوزەیران", "دووشەممە", "یەکشەممە", "سێشەممە", "يەیلوول", "minute", "second", "تەمووز", "month", "today", "شوبات", "شەممە", "نیسان", "يازار", "يایار", "ھەینی", "hour", "week", "year", "day", "gmt", "now", "utc", "ياب", "am", "pm", "بن", "دن", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 81 | }) 82 | 83 | ckb_IR_Locale = merge(&ckb_Locale, LocaleData{ 84 | Name: "ckb-IR", 85 | DateOrder: "YMD", 86 | }) 87 | } 88 | -------------------------------------------------------------------------------- /internal/data/dje.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | dje_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | dje_Locale = merge(nil, LocaleData{ 11 | Name: "dje", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuwxyzõŋž`), 14 | Translations: map[string][]string{ 15 | "zaarikay b": {"pm"}, 16 | "deesanbur": {"december"}, 17 | "feewiriye": {"february"}, 18 | "noowanbur": {"november"}, 19 | "sektanbur": {"september"}, 20 | "alhamisi": {"thursday"}, 21 | "atalaata": {"tuesday"}, 22 | "oktoobur": {"october"}, 23 | "subbaahi": {"am"}, 24 | "zanwiye": {"january"}, 25 | "alarba": {"wednesday"}, 26 | "alhadi": {"sunday"}, 27 | "alzuma": {"friday"}, 28 | "asibti": {"saturday"}, 29 | "atinni": {"monday"}, 30 | "awiril": {"april"}, 31 | "miniti": {"minute"}, 32 | "guuru": {"hour"}, 33 | "handu": {"month"}, 34 | "jiiri": {"year"}, 35 | "marsi": {"march"}, 36 | "zaari": {"day"}, 37 | "zuweŋ": {"june"}, 38 | "zuyye": {"july"}, 39 | "hebu": {"week"}, 40 | "miti": {"second"}, 41 | "ala": {"wednesday"}, 42 | "alh": {"sunday"}, 43 | "alm": {"thursday"}, 44 | "alz": {"friday"}, 45 | "asi": {"saturday"}, 46 | "ata": {"tuesday"}, 47 | "ati": {"monday"}, 48 | "awi": {"april"}, 49 | "dee": {"december"}, 50 | "fee": {"february"}, 51 | "gmt": {"gmt"}, 52 | "mar": {"march"}, 53 | "noo": {"november"}, 54 | "okt": {"october"}, 55 | "sek": {"september"}, 56 | "utc": {"utc"}, 57 | "zan": {"january"}, 58 | "zuw": {"june"}, 59 | "zuy": {"july"}, 60 | "am": {"am"}, 61 | "me": {"may"}, 62 | "pm": {"pm"}, 63 | "ut": {"august"}, 64 | " ": {" "}, 65 | "'": {""}, 66 | "+": {"+"}, 67 | ",": {""}, 68 | "-": {"-"}, 69 | ".": {"."}, 70 | "/": {"/"}, 71 | ":": {":"}, 72 | ";": {""}, 73 | "@": {""}, 74 | "[": {""}, 75 | "]": {""}, 76 | "z": {"z"}, 77 | "|": {""}, 78 | }, 79 | RelativeType: map[string]string{ 80 | "this minute": "0 minute ago", 81 | "last month": "1 month ago", 82 | "next month": "in 1 month", 83 | "this month": "0 month ago", 84 | "last week": "1 week ago", 85 | "last year": "1 year ago", 86 | "next week": "in 1 week", 87 | "next year": "in 1 year", 88 | "this hour": "0 hour ago", 89 | "this week": "0 week ago", 90 | "this year": "0 year ago", 91 | "suba": "in 1 day", 92 | "hoo": "0 day ago", 93 | "now": "0 second ago", 94 | "bi": "1 day ago", 95 | }, 96 | KnownWords: []string{"this minute", "last month", "next month", "this month", "zaarikay b", "deesanbur", "feewiriye", "last week", "last year", "next week", "next year", "noowanbur", "sektanbur", "this hour", "this week", "this year", "alhamisi", "atalaata", "oktoobur", "subbaahi", "zanwiye", "alarba", "alhadi", "alzuma", "asibti", "atinni", "awiril", "miniti", "guuru", "handu", "jiiri", "marsi", "zaari", "zuweŋ", "zuyye", "hebu", "miti", "suba", "ala", "alh", "alm", "alz", "asi", "ata", "ati", "awi", "dee", "fee", "gmt", "hoo", "mar", "noo", "now", "okt", "sek", "utc", "zan", "zuw", "zuy", "am", "bi", "me", "pm", "ut", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 97 | }) 98 | } 99 | -------------------------------------------------------------------------------- /internal/data/dyo.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | dyo_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | dyo_Locale = merge(nil, LocaleData{ 11 | Name: "dyo", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuvwxyzéóúŋ`), 14 | Translations: map[string][]string{ 15 | "settembar": {"september"}, 16 | "aramisay": {"thursday"}, 17 | "disambar": {"december"}, 18 | "novembar": {"november"}, 19 | "alarbay": {"wednesday"}, 20 | "febirie": {"february"}, 21 | "oktobar": {"october"}, 22 | "aburil": {"april"}, 23 | "arjuma": {"friday"}, 24 | "fuleeŋ": {"month"}, 25 | "lookuŋ": {"week"}, 26 | "minute": {"minute"}, 27 | "sanvie": {"january"}, 28 | "second": {"second"}, 29 | "sibiti": {"saturday"}, 30 | "suuyee": {"july"}, 31 | "talata": {"tuesday"}, 32 | "dimas": {"sunday"}, 33 | "funak": {"day"}, 34 | "teneŋ": {"monday"}, 35 | "emit": {"year"}, 36 | "hour": {"hour"}, 37 | "mars": {"march"}, 38 | "sueŋ": {"june"}, 39 | "ala": {"wednesday"}, 40 | "ara": {"thursday"}, 41 | "arj": {"friday"}, 42 | "dim": {"sunday"}, 43 | "gmt": {"gmt"}, 44 | "mee": {"may"}, 45 | "sib": {"saturday"}, 46 | "tal": {"tuesday"}, 47 | "ten": {"monday"}, 48 | "utc": {"utc"}, 49 | "ab": {"april"}, 50 | "am": {"am"}, 51 | "de": {"december"}, 52 | "fe": {"february"}, 53 | "ma": {"march"}, 54 | "me": {"may"}, 55 | "no": {"november"}, 56 | "ok": {"october"}, 57 | "pm": {"pm"}, 58 | "sa": {"january"}, 59 | "se": {"september"}, 60 | "su": {"july", "june"}, 61 | "ut": {"august"}, 62 | " ": {" "}, 63 | "'": {""}, 64 | "+": {"+"}, 65 | ",": {""}, 66 | "-": {"-"}, 67 | ".": {"."}, 68 | "/": {"/"}, 69 | ":": {":"}, 70 | ";": {""}, 71 | "@": {""}, 72 | "[": {""}, 73 | "]": {""}, 74 | "z": {"z"}, 75 | "|": {""}, 76 | }, 77 | RelativeType: map[string]string{ 78 | "this minute": "0 minute ago", 79 | "last month": "1 month ago", 80 | "next month": "in 1 month", 81 | "this month": "0 month ago", 82 | "last week": "1 week ago", 83 | "last year": "1 year ago", 84 | "next week": "in 1 week", 85 | "next year": "in 1 year", 86 | "this hour": "0 hour ago", 87 | "this week": "0 week ago", 88 | "this year": "0 year ago", 89 | "fucen": "1 day ago", 90 | "kajom": "in 1 day", 91 | "jaat": "0 day ago", 92 | "now": "0 second ago", 93 | }, 94 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "settembar", "this hour", "this week", "this year", "aramisay", "disambar", "novembar", "alarbay", "febirie", "oktobar", "aburil", "arjuma", "fuleeŋ", "lookuŋ", "minute", "sanvie", "second", "sibiti", "suuyee", "talata", "dimas", "fucen", "funak", "kajom", "teneŋ", "emit", "hour", "jaat", "mars", "sueŋ", "ala", "ara", "arj", "dim", "gmt", "mee", "now", "sib", "tal", "ten", "utc", "ab", "am", "de", "fe", "ma", "me", "no", "ok", "pm", "sa", "se", "su", "ut", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 95 | }) 96 | } 97 | -------------------------------------------------------------------------------- /internal/data/haw.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | haw_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | haw_Locale = merge(nil, LocaleData{ 11 | Name: "haw", 12 | DateOrder: "DMY", 13 | Charset: []rune(`cdeghiklnorstuwxyzā`), 14 | Translations: map[string][]string{ 15 | "kepakemapa": {"september"}, 16 | "pepeluali": {"february"}, 17 | "'apelila": {"april"}, 18 | "'okakopa": {"october"}, 19 | "kekemapa": {"december"}, 20 | "nowemapa": {"november"}, 21 | "po'akahi": {"monday"}, 22 | "po'akolu": {"wednesday"}, 23 | "po'alima": {"friday"}, 24 | "'aukake": {"august"}, 25 | "ianuali": {"january"}, 26 | "po'alua": {"tuesday"}, 27 | "po'aono": {"saturday"}, 28 | "lapule": {"sunday"}, 29 | "malaki": {"march"}, 30 | "minute": {"minute"}, 31 | "po'aha": {"thursday"}, 32 | "second": {"second"}, 33 | "iulai": {"july"}, 34 | "month": {"month"}, 35 | "hour": {"hour"}, 36 | "iune": {"june"}, 37 | "week": {"week"}, 38 | "year": {"year"}, 39 | "'ap": {"april"}, 40 | "'au": {"august"}, 41 | "'ok": {"october"}, 42 | "day": {"day"}, 43 | "gmt": {"gmt"}, 44 | "ian": {"january"}, 45 | "iul": {"july"}, 46 | "iun": {"june"}, 47 | "kek": {"december"}, 48 | "kep": {"september"}, 49 | "mal": {"march"}, 50 | "mei": {"may"}, 51 | "now": {"november"}, 52 | "pep": {"february"}, 53 | "utc": {"utc"}, 54 | "am": {"am"}, 55 | "lp": {"sunday"}, 56 | "p1": {"monday"}, 57 | "p2": {"tuesday"}, 58 | "p3": {"wednesday"}, 59 | "p4": {"thursday"}, 60 | "p5": {"friday"}, 61 | "p6": {"saturday"}, 62 | "pm": {"pm"}, 63 | " ": {" "}, 64 | "'": {""}, 65 | "+": {"+"}, 66 | ",": {""}, 67 | "-": {"-"}, 68 | ".": {"."}, 69 | "/": {"/"}, 70 | ":": {":"}, 71 | ";": {""}, 72 | "@": {""}, 73 | "[": {""}, 74 | "]": {""}, 75 | "z": {"z"}, 76 | "|": {""}, 77 | }, 78 | RelativeType: map[string]string{ 79 | "this minute": "0 minute ago", 80 | "last month": "1 month ago", 81 | "next month": "in 1 month", 82 | "this month": "0 month ago", 83 | "last week": "1 week ago", 84 | "last year": "1 year ago", 85 | "next week": "in 1 week", 86 | "next year": "in 1 year", 87 | "this hour": "0 hour ago", 88 | "this week": "0 week ago", 89 | "this year": "0 year ago", 90 | "yesterday": "1 day ago", 91 | "tomorrow": "in 1 day", 92 | "today": "0 day ago", 93 | "now": "0 second ago", 94 | }, 95 | KnownWords: []string{"this minute", "kepakemapa", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "pepeluali", "this hour", "this week", "this year", "yesterday", "'apelila", "'okakopa", "kekemapa", "nowemapa", "po'akahi", "po'akolu", "po'alima", "tomorrow", "'aukake", "ianuali", "po'alua", "po'aono", "lapule", "malaki", "minute", "po'aha", "second", "iulai", "month", "today", "hour", "iune", "week", "year", "'ap", "'au", "'ok", "day", "gmt", "ian", "iul", "iun", "kek", "kep", "mal", "mei", "now", "pep", "utc", "am", "lp", "p1", "p2", "p3", "p4", "p5", "p6", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 96 | }) 97 | } 98 | -------------------------------------------------------------------------------- /internal/data/ig.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | ig_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | ig_Locale = merge(nil, LocaleData{ 11 | Name: "ig", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuvwxyzịọụ`), 14 | Translations: map[string][]string{ 15 | "februwari": {"february"}, 16 | "mbosi uka": {"sunday"}, 17 | "jenuwari": {"january"}, 18 | "nkejinta": {"second"}, 19 | "septemba": {"september"}, 20 | "wenezdee": {"wednesday"}, 21 | "disemba": {"december"}, 22 | "elekere": {"hour"}, 23 | "fraidee": {"friday"}, 24 | "novemba": {"november"}, 25 | "satodee": {"saturday"}, 26 | "tiuzdee": {"tuesday"}, 27 | "toozdee": {"thursday"}, 28 | "maachi": {"march"}, 29 | "ogoost": {"august"}, 30 | "oktoba": {"october"}, 31 | "ubochi": {"day"}, 32 | "eprel": {"april"}, 33 | "julai": {"july"}, 34 | "monde": {"monday"}, 35 | "nkeji": {"minute"}, 36 | "frai": {"friday"}, 37 | "juun": {"june"}, 38 | "onwa": {"month"}, 39 | "afo": {"year"}, 40 | "dis": {"december"}, 41 | "epr": {"april"}, 42 | "feb": {"february"}, 43 | "gmt": {"gmt"}, 44 | "izu": {"week"}, 45 | "jen": {"january"}, 46 | "jul": {"july"}, 47 | "juu": {"june"}, 48 | "maa": {"march"}, 49 | "mee": {"may"}, 50 | "mon": {"monday"}, 51 | "nov": {"november"}, 52 | "ogo": {"august"}, 53 | "okt": {"october"}, 54 | "sat": {"saturday"}, 55 | "sep": {"september"}, 56 | "tiu": {"tuesday"}, 57 | "too": {"thursday"}, 58 | "uka": {"sunday"}, 59 | "utc": {"utc"}, 60 | "wen": {"wednesday"}, 61 | "am": {"am"}, 62 | "pm": {"pm"}, 63 | " ": {" "}, 64 | "'": {""}, 65 | "+": {"+"}, 66 | ",": {""}, 67 | "-": {"-"}, 68 | ".": {"."}, 69 | "/": {"/"}, 70 | ":": {":"}, 71 | ";": {""}, 72 | "@": {""}, 73 | "[": {""}, 74 | "]": {""}, 75 | "z": {"z"}, 76 | "|": {""}, 77 | }, 78 | RelativeType: map[string]string{ 79 | "this minute": "0 minute ago", 80 | "last month": "1 month ago", 81 | "next month": "in 1 month", 82 | "this month": "0 month ago", 83 | "last week": "1 week ago", 84 | "last year": "1 year ago", 85 | "next week": "in 1 week", 86 | "next year": "in 1 year", 87 | "this hour": "0 hour ago", 88 | "this week": "0 week ago", 89 | "this year": "0 year ago", 90 | "nnyaafu": "1 day ago", 91 | "taata": "0 day ago", 92 | "echi": "in 1 day", 93 | "now": "0 second ago", 94 | }, 95 | KnownWords: []string{"this minute", "last month", "next month", "this month", "februwari", "last week", "last year", "mbosi uka", "next week", "next year", "this hour", "this week", "this year", "jenuwari", "nkejinta", "septemba", "wenezdee", "disemba", "elekere", "fraidee", "nnyaafu", "novemba", "satodee", "tiuzdee", "toozdee", "maachi", "ogoost", "oktoba", "ubochi", "eprel", "julai", "monde", "nkeji", "taata", "echi", "frai", "juun", "onwa", "afo", "dis", "epr", "feb", "gmt", "izu", "jen", "jul", "juu", "maa", "mee", "mon", "nov", "now", "ogo", "okt", "sat", "sep", "tiu", "too", "uka", "utc", "wen", "am", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 96 | }) 97 | } 98 | -------------------------------------------------------------------------------- /internal/data/ii.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | ii_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | ii_Locale = merge(nil, LocaleData{ 11 | Name: "ii", 12 | DateOrder: "YMD", 13 | Charset: []rune(`ceghiklnorstuwxyzꀃꀋꁯꃆꃏꃘꄑꄮꅔꆏꆪꇖꇙꈉꈎꈬꉆꉈꉬꊂꊪꊰꋍꋒꌕꎸꏂꏃꑋꑍꑭ`), 14 | Translations: map[string][]string{ 15 | "gmt": {"gmt"}, 16 | "utc": {"utc"}, 17 | "ꆏꊂꃘ": {"saturday"}, 18 | "ꆏꊂꇖ": {"thursday"}, 19 | "ꆏꊂꉬ": {"friday"}, 20 | "ꆏꊂꋍ": {"monday"}, 21 | "ꆏꊂꌕ": {"wednesday"}, 22 | "ꆏꊂꑍ": {"tuesday"}, 23 | "ꊰꊪꆪ": {"november"}, 24 | "ꊰꑋꆪ": {"december"}, 25 | "ꑭꆏꑍ": {"sunday"}, 26 | "am": {"am"}, 27 | "pm": {"pm"}, 28 | "ꁯꋒ": {"pm"}, 29 | "ꃘꆪ": {"june"}, 30 | "ꄮꈉ": {"hour"}, 31 | "ꆏꃘ": {"saturday"}, 32 | "ꆏꇖ": {"thursday"}, 33 | "ꆏꉬ": {"friday"}, 34 | "ꆏꋍ": {"monday"}, 35 | "ꆏꌕ": {"wednesday"}, 36 | "ꆏꑍ": {"tuesday"}, 37 | "ꇖꆪ": {"april"}, 38 | "ꈬꆪ": {"september"}, 39 | "ꉆꆪ": {"august"}, 40 | "ꉬꆪ": {"may"}, 41 | "ꊰꆪ": {"october"}, 42 | "ꋍꆪ": {"january"}, 43 | "ꌕꆪ": {"march"}, 44 | "ꎸꄑ": {"am"}, 45 | "ꏃꆪ": {"july"}, 46 | "ꑍꆪ": {"february"}, 47 | "ꑭꆏ": {"week", "sunday"}, 48 | " ": {" "}, 49 | "'": {""}, 50 | "+": {"+"}, 51 | ",": {""}, 52 | "-": {"-"}, 53 | ".": {"."}, 54 | "/": {"/"}, 55 | ":": {":"}, 56 | ";": {""}, 57 | "@": {""}, 58 | "[": {""}, 59 | "]": {""}, 60 | "z": {"z"}, 61 | "|": {""}, 62 | "ꃏ": {"minute"}, 63 | "ꆪ": {"month"}, 64 | "ꇙ": {"second"}, 65 | "ꈎ": {"year"}, 66 | "ꑍ": {"day"}, 67 | }, 68 | RelativeType: map[string]string{ 69 | "this minute": "0 minute ago", 70 | "last month": "1 month ago", 71 | "next month": "in 1 month", 72 | "this month": "0 month ago", 73 | "last week": "1 week ago", 74 | "last year": "1 year ago", 75 | "next week": "in 1 week", 76 | "next year": "in 1 year", 77 | "this hour": "0 hour ago", 78 | "this week": "0 week ago", 79 | "this year": "0 year ago", 80 | "now": "0 second ago", 81 | "ꀋꅔꉈ": "1 day ago", 82 | "ꃆꏂꑍ": "in 1 day", 83 | "ꀃꑍ": "0 day ago", 84 | }, 85 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "gmt", "now", "utc", "ꀋꅔꉈ", "ꃆꏂꑍ", "ꆏꊂꃘ", "ꆏꊂꇖ", "ꆏꊂꉬ", "ꆏꊂꋍ", "ꆏꊂꌕ", "ꆏꊂꑍ", "ꊰꊪꆪ", "ꊰꑋꆪ", "ꑭꆏꑍ", "am", "pm", "ꀃꑍ", "ꁯꋒ", "ꃘꆪ", "ꄮꈉ", "ꆏꃘ", "ꆏꇖ", "ꆏꉬ", "ꆏꋍ", "ꆏꌕ", "ꆏꑍ", "ꇖꆪ", "ꈬꆪ", "ꉆꆪ", "ꉬꆪ", "ꊰꆪ", "ꋍꆪ", "ꌕꆪ", "ꎸꄑ", "ꏃꆪ", "ꑍꆪ", "ꑭꆏ", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|", "ꃏ", "ꆪ", "ꇙ", "ꈎ", "ꑍ"}, 86 | }) 87 | } 88 | -------------------------------------------------------------------------------- /internal/data/khq.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | khq_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | khq_Locale = merge(nil, LocaleData{ 11 | Name: "khq", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuwxyzõŋž`), 14 | Translations: map[string][]string{ 15 | "alhamiisa": {"thursday"}, 16 | "deesanbur": {"december"}, 17 | "feewiriye": {"february"}, 18 | "noowanbur": {"november"}, 19 | "sektanbur": {"september"}, 20 | "oktoobur": {"october"}, 21 | "assabdu": {"saturday"}, 22 | "atalata": {"tuesday"}, 23 | "zanwiye": {"january"}, 24 | "adduha": {"am"}, 25 | "alarba": {"wednesday"}, 26 | "alhadi": {"sunday"}, 27 | "aljuma": {"friday"}, 28 | "aluula": {"pm"}, 29 | "awiril": {"april"}, 30 | "miniti": {"minute"}, 31 | "atini": {"monday"}, 32 | "guuru": {"hour"}, 33 | "handu": {"month"}, 34 | "jaari": {"day"}, 35 | "jiiri": {"year"}, 36 | "marsi": {"march"}, 37 | "zuweŋ": {"june"}, 38 | "zuyye": {"july"}, 39 | "hebu": {"week"}, 40 | "miti": {"second"}, 41 | "ala": {"wednesday"}, 42 | "alh": {"sunday"}, 43 | "alj": {"friday"}, 44 | "alm": {"thursday"}, 45 | "ass": {"saturday"}, 46 | "ata": {"tuesday"}, 47 | "ati": {"monday"}, 48 | "awi": {"april"}, 49 | "dee": {"december"}, 50 | "fee": {"february"}, 51 | "gmt": {"gmt"}, 52 | "mar": {"march"}, 53 | "noo": {"november"}, 54 | "okt": {"october"}, 55 | "sek": {"september"}, 56 | "utc": {"utc"}, 57 | "zan": {"january"}, 58 | "zuw": {"june"}, 59 | "zuy": {"july"}, 60 | "am": {"am"}, 61 | "me": {"may"}, 62 | "pm": {"pm"}, 63 | "ut": {"august"}, 64 | " ": {" "}, 65 | "'": {""}, 66 | "+": {"+"}, 67 | ",": {""}, 68 | "-": {"-"}, 69 | ".": {"."}, 70 | "/": {"/"}, 71 | ":": {":"}, 72 | ";": {""}, 73 | "@": {""}, 74 | "[": {""}, 75 | "]": {""}, 76 | "z": {"z"}, 77 | "|": {""}, 78 | }, 79 | RelativeType: map[string]string{ 80 | "this minute": "0 minute ago", 81 | "last month": "1 month ago", 82 | "next month": "in 1 month", 83 | "this month": "0 month ago", 84 | "last week": "1 week ago", 85 | "last year": "1 year ago", 86 | "next week": "in 1 week", 87 | "next year": "in 1 year", 88 | "this hour": "0 hour ago", 89 | "this week": "0 week ago", 90 | "this year": "0 year ago", 91 | "suba": "in 1 day", 92 | "hoo": "0 day ago", 93 | "now": "0 second ago", 94 | "bi": "1 day ago", 95 | }, 96 | KnownWords: []string{"this minute", "last month", "next month", "this month", "alhamiisa", "deesanbur", "feewiriye", "last week", "last year", "next week", "next year", "noowanbur", "sektanbur", "this hour", "this week", "this year", "oktoobur", "assabdu", "atalata", "zanwiye", "adduha", "alarba", "alhadi", "aljuma", "aluula", "awiril", "miniti", "atini", "guuru", "handu", "jaari", "jiiri", "marsi", "zuweŋ", "zuyye", "hebu", "miti", "suba", "ala", "alh", "alj", "alm", "ass", "ata", "ati", "awi", "dee", "fee", "gmt", "hoo", "mar", "noo", "now", "okt", "sek", "utc", "zan", "zuw", "zuy", "am", "bi", "me", "pm", "ut", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 97 | }) 98 | } 99 | -------------------------------------------------------------------------------- /internal/data/kok.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | kok_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | kok_Locale = merge(nil, LocaleData{ 11 | Name: "kok", 12 | DateOrder: "YMD", 13 | Charset: []rune(`cdeghiklnorstuwxyzंआएओकगचजटडतदधनपफबमयरलळवशसहािीुूेैो्`), 14 | Translations: map[string][]string{ 15 | "आदितयवार": {"sunday"}, 16 | "जानवारी": {"january"}, 17 | "फबरवारी": {"february"}, 18 | "minute": {"minute"}, 19 | "second": {"second"}, 20 | "ओकटोबर": {"october"}, 21 | "नोवहबर": {"november"}, 22 | "शकरवार": {"friday"}, 23 | "शनिवार": {"saturday"}, 24 | "सोमवार": {"monday"}, 25 | "month": {"month"}, 26 | "एपरिल": {"april"}, 27 | "गरवार": {"thursday"}, 28 | "डिसबर": {"december"}, 29 | "बधवार": {"wednesday"}, 30 | "मगळार": {"tuesday"}, 31 | "सपटबर": {"september"}, 32 | "hour": {"hour"}, 33 | "week": {"week"}, 34 | "year": {"year"}, 35 | "ओगसट": {"august"}, 36 | "मारच": {"march"}, 37 | "day": {"day"}, 38 | "gmt": {"gmt"}, 39 | "utc": {"utc"}, 40 | "मगळ": {"tuesday"}, 41 | "रवि": {"sunday"}, 42 | "शकर": {"friday"}, 43 | "शनि": {"saturday"}, 44 | "सोम": {"monday"}, 45 | "am": {"am"}, 46 | "pm": {"pm"}, 47 | "गर": {"thursday"}, 48 | "जन": {"june"}, 49 | "जल": {"july"}, 50 | "बध": {"wednesday"}, 51 | "मन": {"pm"}, 52 | "मप": {"am"}, 53 | " ": {" "}, 54 | "'": {""}, 55 | "+": {"+"}, 56 | ",": {""}, 57 | "-": {"-"}, 58 | ".": {"."}, 59 | "/": {"/"}, 60 | ":": {":"}, 61 | ";": {""}, 62 | "@": {""}, 63 | "[": {""}, 64 | "]": {""}, 65 | "z": {"z"}, 66 | "|": {""}, 67 | "म": {"may"}, 68 | }, 69 | RelativeType: map[string]string{ 70 | "this minute": "0 minute ago", 71 | "last month": "1 month ago", 72 | "next month": "in 1 month", 73 | "this month": "0 month ago", 74 | "last week": "1 week ago", 75 | "last year": "1 year ago", 76 | "next week": "in 1 week", 77 | "next year": "in 1 year", 78 | "this hour": "0 hour ago", 79 | "this week": "0 week ago", 80 | "this year": "0 year ago", 81 | "yesterday": "1 day ago", 82 | "tomorrow": "in 1 day", 83 | "today": "0 day ago", 84 | "now": "0 second ago", 85 | }, 86 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "yesterday", "tomorrow", "आदितयवार", "जानवारी", "फबरवारी", "minute", "second", "ओकटोबर", "नोवहबर", "शकरवार", "शनिवार", "सोमवार", "month", "today", "एपरिल", "गरवार", "डिसबर", "बधवार", "मगळार", "सपटबर", "hour", "week", "year", "ओगसट", "मारच", "day", "gmt", "now", "utc", "मगळ", "रवि", "शकर", "शनि", "सोम", "am", "pm", "गर", "जन", "जल", "बध", "मन", "मप", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|", "म"}, 87 | }) 88 | } 89 | -------------------------------------------------------------------------------- /internal/data/ks.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | ks_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | ks_Locale = merge(nil, LocaleData{ 11 | Name: "ks", 12 | DateOrder: "MDY", 13 | Charset: []rune(`ceghiklnorstuwxyzآؤابتجدرزسفلمنؤَُِٕٗٚٛٮٲٹپچڑژکگھہۄی۪`), 14 | Translations: map[string][]string{ 15 | "ژندرروار": {"monday"}, 16 | "برٮسوار": {"thursday"}, 17 | "ژندروار": {"monday"}, 18 | "اتھوار": {"sunday"}, 19 | "اکتوبر": {"october"}, 20 | "بودوار": {"wednesday"}, 21 | "بوموار": {"tuesday"}, 22 | "جولایی": {"july"}, 23 | "اپریل": {"april"}, 24 | "بٹوار": {"saturday"}, 25 | "جنوری": {"january"}, 26 | "دسمبر": {"december"}, 27 | "ستمبر": {"september"}, 28 | "سٮکنڑ": {"second"}, 29 | "فروری": {"february"}, 30 | "نومبر": {"november"}, 31 | "گٲنٹہ": {"hour"}, 32 | "اگست": {"august"}, 33 | "رٮتھ": {"month"}, 34 | "مارچ": {"march"}, 35 | "ہفتہ": {"week"}, 36 | "gmt": {"gmt"}, 37 | "utc": {"utc"}, 38 | "جمہ": {"friday"}, 39 | "جون": {"june"}, 40 | "دۄہ": {"day"}, 41 | "منٹ": {"minute"}, 42 | "وری": {"year"}, 43 | "am": {"am"}, 44 | "pm": {"pm"}, 45 | "می": {"may"}, 46 | " ": {" "}, 47 | "'": {""}, 48 | "+": {"+"}, 49 | ",": {""}, 50 | "-": {"-"}, 51 | ".": {"."}, 52 | "/": {"/"}, 53 | ":": {":"}, 54 | ";": {""}, 55 | "@": {""}, 56 | "[": {""}, 57 | "]": {""}, 58 | "z": {"z"}, 59 | "|": {""}, 60 | }, 61 | RelativeType: map[string]string{ 62 | "this minute": "0 minute ago", 63 | "last month": "1 month ago", 64 | "next month": "in 1 month", 65 | "this month": "0 month ago", 66 | "last week": "1 week ago", 67 | "last year": "1 year ago", 68 | "next week": "in 1 week", 69 | "next year": "in 1 year", 70 | "this hour": "0 hour ago", 71 | "this week": "0 week ago", 72 | "this year": "0 year ago", 73 | "راتھ": "1 day ago", 74 | "پگاہ": "in 1 day", 75 | "now": "0 second ago", 76 | "از": "0 day ago", 77 | }, 78 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "ژندرروار", "برٮسوار", "ژندروار", "اتھوار", "اکتوبر", "بودوار", "بوموار", "جولایی", "اپریل", "بٹوار", "جنوری", "دسمبر", "ستمبر", "سٮکنڑ", "فروری", "نومبر", "گٲنٹہ", "اگست", "راتھ", "رٮتھ", "مارچ", "پگاہ", "ہفتہ", "gmt", "now", "utc", "جمہ", "جون", "دۄہ", "منٹ", "وری", "am", "pm", "از", "می", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 79 | }) 80 | } 81 | -------------------------------------------------------------------------------- /internal/data/lg.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | lg_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | lg_Locale = merge(nil, LocaleData{ 11 | Name: "lg", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuvwxyz`), 14 | Translations: map[string][]string{ 15 | "lwakutaano": {"friday"}, 16 | "lwamukaaga": {"saturday"}, 17 | "sebuttemba": {"september"}, 18 | "febwaliyo": {"february"}, 19 | "janwaliyo": {"january"}, 20 | "kasikonda": {"second"}, 21 | "lwakubiri": {"tuesday"}, 22 | "lwakusatu": {"wednesday"}, 23 | "okitobba": {"october"}, 24 | "sabbiiti": {"week", "sunday"}, 25 | "agusito": {"august"}, 26 | "dakiika": {"minute"}, 27 | "desemba": {"december"}, 28 | "julaayi": {"july"}, 29 | "lwakuna": {"thursday"}, 30 | "novemba": {"november"}, 31 | "balaza": {"monday"}, 32 | "lunaku": {"day"}, 33 | "marisi": {"march"}, 34 | "apuli": {"april"}, 35 | "juuni": {"june"}, 36 | "maayi": {"may"}, 37 | "mwaka": {"year"}, 38 | "mwezi": {"month"}, 39 | "saawa": {"hour"}, 40 | "agu": {"august"}, 41 | "apu": {"april"}, 42 | "bal": {"monday"}, 43 | "des": {"december"}, 44 | "feb": {"february"}, 45 | "gmt": {"gmt"}, 46 | "jan": {"january"}, 47 | "jul": {"july"}, 48 | "juu": {"june"}, 49 | "lw2": {"tuesday"}, 50 | "lw3": {"wednesday"}, 51 | "lw4": {"thursday"}, 52 | "lw5": {"friday"}, 53 | "lw6": {"saturday"}, 54 | "maa": {"may"}, 55 | "mar": {"march"}, 56 | "nov": {"november"}, 57 | "oki": {"october"}, 58 | "sab": {"sunday"}, 59 | "seb": {"september"}, 60 | "utc": {"utc"}, 61 | "am": {"am"}, 62 | "pm": {"pm"}, 63 | " ": {" "}, 64 | "'": {""}, 65 | "+": {"+"}, 66 | ",": {""}, 67 | "-": {"-"}, 68 | ".": {"."}, 69 | "/": {"/"}, 70 | ":": {":"}, 71 | ";": {""}, 72 | "@": {""}, 73 | "[": {""}, 74 | "]": {""}, 75 | "z": {"z"}, 76 | "|": {""}, 77 | }, 78 | RelativeType: map[string]string{ 79 | "this minute": "0 minute ago", 80 | "last month": "1 month ago", 81 | "next month": "in 1 month", 82 | "this month": "0 month ago", 83 | "last week": "1 week ago", 84 | "last year": "1 year ago", 85 | "next week": "in 1 week", 86 | "next year": "in 1 year", 87 | "this hour": "0 hour ago", 88 | "this week": "0 week ago", 89 | "this year": "0 year ago", 90 | "lwaleero": "0 day ago", 91 | "ggulo": "1 day ago", 92 | "nkya": "in 1 day", 93 | "now": "0 second ago", 94 | }, 95 | KnownWords: []string{"this minute", "last month", "lwakutaano", "lwamukaaga", "next month", "sebuttemba", "this month", "febwaliyo", "janwaliyo", "kasikonda", "last week", "last year", "lwakubiri", "lwakusatu", "next week", "next year", "this hour", "this week", "this year", "lwaleero", "okitobba", "sabbiiti", "agusito", "dakiika", "desemba", "julaayi", "lwakuna", "novemba", "balaza", "lunaku", "marisi", "apuli", "ggulo", "juuni", "maayi", "mwaka", "mwezi", "saawa", "nkya", "agu", "apu", "bal", "des", "feb", "gmt", "jan", "jul", "juu", "lw2", "lw3", "lw4", "lw5", "lw6", "maa", "mar", "nov", "now", "oki", "sab", "seb", "utc", "am", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 96 | }) 97 | } 98 | -------------------------------------------------------------------------------- /internal/data/lrc.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | lrc_Locale LocaleData 7 | lrc_IQ_Locale LocaleData 8 | ) 9 | 10 | func init() { 11 | lrc_Locale = merge(nil, LocaleData{ 12 | Name: "lrc", 13 | DateOrder: "YMD", 14 | Charset: []rune(`cdefghiklnorstuwxyzآأئاتثجدرزسشصفقلمنويٙپڤکگھیە`), 15 | Translations: map[string][]string{ 16 | "سيپتامر": {"september"}, 17 | "يوکتوڤر": {"october"}, 18 | "جانڤیە": {"january"}, 19 | "ديسامر": {"december"}, 20 | "فيڤریە": {"february"}, 21 | "نوڤامر": {"november"}, 22 | "اڤریل": {"april"}, 23 | "اگوست": {"august"}, 24 | "ثانیە": {"second"}, 25 | "ديیقە": {"minute"}, 26 | "ھافتە": {"week"}, 27 | "جوان": {"june"}, 28 | "جولا": {"july"}, 29 | "ساات": {"hour"}, 30 | "مارس": {"march"}, 31 | "fri": {"friday"}, 32 | "gmt": {"gmt"}, 33 | "mon": {"monday"}, 34 | "sat": {"saturday"}, 35 | "sun": {"sunday"}, 36 | "thu": {"thursday"}, 37 | "tue": {"tuesday"}, 38 | "utc": {"utc"}, 39 | "wed": {"wednesday"}, 40 | "روز": {"day"}, 41 | "سال": {"year"}, 42 | "ميی": {"may"}, 43 | "am": {"am"}, 44 | "pm": {"pm"}, 45 | "ما": {"month"}, 46 | " ": {" "}, 47 | "'": {""}, 48 | "+": {"+"}, 49 | ",": {""}, 50 | "-": {"-"}, 51 | ".": {"."}, 52 | "/": {"/"}, 53 | ":": {":"}, 54 | ";": {""}, 55 | "@": {""}, 56 | "[": {""}, 57 | "]": {""}, 58 | "z": {"z"}, 59 | "|": {""}, 60 | }, 61 | RelativeType: map[string]string{ 62 | "this minute": "0 minute ago", 63 | "last month": "1 month ago", 64 | "next month": "in 1 month", 65 | "this month": "0 month ago", 66 | "last week": "1 week ago", 67 | "last year": "1 year ago", 68 | "next week": "in 1 week", 69 | "next year": "in 1 year", 70 | "this hour": "0 hour ago", 71 | "this week": "0 week ago", 72 | "this year": "0 year ago", 73 | "دیروز": "1 day ago", 74 | "امرو": "0 day ago", 75 | "شوصو": "in 1 day", 76 | "now": "0 second ago", 77 | }, 78 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "سيپتامر", "يوکتوڤر", "جانڤیە", "ديسامر", "فيڤریە", "نوڤامر", "اڤریل", "اگوست", "ثانیە", "ديیقە", "دیروز", "ھافتە", "امرو", "جوان", "جولا", "ساات", "شوصو", "مارس", "fri", "gmt", "mon", "now", "sat", "sun", "thu", "tue", "utc", "wed", "روز", "سال", "ميی", "am", "pm", "ما", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 79 | }) 80 | 81 | lrc_IQ_Locale = merge(&lrc_Locale, LocaleData{ 82 | Name: "lrc-IQ", 83 | DateOrder: "YMD", 84 | }) 85 | } 86 | -------------------------------------------------------------------------------- /internal/data/mer.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | mer_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | mer_Locale = merge(nil, LocaleData{ 11 | Name: "mer", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuvwxyzĩũ`), 14 | Translations: map[string][]string{ 15 | "feburuari": {"february"}, 16 | "jumamosi": {"saturday"}, 17 | "muramuko": {"monday"}, 18 | "septemba": {"september"}, 19 | "dicemba": {"december"}, 20 | "januari": {"january"}, 21 | "ndagika": {"minute"}, 22 | "novemba": {"november"}, 23 | "sekondi": {"second"}, 24 | "wethatu": {"wednesday"}, 25 | "agasti": {"august"}, 26 | "kiumia": {"week", "sunday"}, 27 | "njurai": {"july"}, 28 | "oktuba": {"october"}, 29 | "wetano": {"friday"}, 30 | "ipuru": {"april"}, 31 | "ithaa": {"hour"}, 32 | "machi": {"march"}, 33 | "mwaka": {"year"}, 34 | "mweri": {"month"}, 35 | "njuni": {"june"}, 36 | "ntuku": {"day"}, 37 | "wairi": {"tuesday"}, 38 | "wena": {"thursday"}, 39 | "aga": {"august"}, 40 | "dec": {"december"}, 41 | "feb": {"february"}, 42 | "gmt": {"gmt"}, 43 | "ipu": {"april"}, 44 | "jan": {"january"}, 45 | "jum": {"saturday"}, 46 | "kiu": {"sunday"}, 47 | "mac": {"march"}, 48 | "mii": {"may"}, 49 | "mra": {"monday"}, 50 | "njr": {"july"}, 51 | "nju": {"june"}, 52 | "nov": {"november"}, 53 | "okt": {"october"}, 54 | "spt": {"september"}, 55 | "utc": {"utc"}, 56 | "wai": {"tuesday"}, 57 | "wen": {"thursday"}, 58 | "wet": {"wednesday"}, 59 | "wtn": {"friday"}, 60 | "am": {"am"}, 61 | "pm": {"pm"}, 62 | "ru": {"am"}, 63 | "ug": {"pm"}, 64 | " ": {" "}, 65 | "'": {""}, 66 | "+": {"+"}, 67 | ",": {""}, 68 | "-": {"-"}, 69 | ".": {"."}, 70 | "/": {"/"}, 71 | ":": {":"}, 72 | ";": {""}, 73 | "@": {""}, 74 | "[": {""}, 75 | "]": {""}, 76 | "z": {"z"}, 77 | "|": {""}, 78 | }, 79 | RelativeType: map[string]string{ 80 | "this minute": "0 minute ago", 81 | "last month": "1 month ago", 82 | "next month": "in 1 month", 83 | "this month": "0 month ago", 84 | "last week": "1 week ago", 85 | "last year": "1 year ago", 86 | "next week": "in 1 week", 87 | "next year": "in 1 year", 88 | "this hour": "0 hour ago", 89 | "this week": "0 week ago", 90 | "this year": "0 year ago", 91 | "igoro": "1 day ago", 92 | "narua": "0 day ago", 93 | "ruju": "in 1 day", 94 | "now": "0 second ago", 95 | }, 96 | KnownWords: []string{"this minute", "last month", "next month", "this month", "feburuari", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "jumamosi", "muramuko", "septemba", "dicemba", "januari", "ndagika", "novemba", "sekondi", "wethatu", "agasti", "kiumia", "njurai", "oktuba", "wetano", "igoro", "ipuru", "ithaa", "machi", "mwaka", "mweri", "narua", "njuni", "ntuku", "wairi", "ruju", "wena", "aga", "dec", "feb", "gmt", "ipu", "jan", "jum", "kiu", "mac", "mii", "mra", "njr", "nju", "nov", "now", "okt", "spt", "utc", "wai", "wen", "wet", "wtn", "am", "pm", "ru", "ug", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 97 | }) 98 | } 99 | -------------------------------------------------------------------------------- /internal/data/mfe.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | mfe_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | mfe_Locale = merge(nil, LocaleData{ 11 | Name: "mfe", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghiklnorstuvwxyz`), 14 | Translations: map[string][]string{ 15 | "merkredi": {"wednesday"}, 16 | "vandredi": {"friday"}, 17 | "fevriye": {"february"}, 18 | "dimans": {"sunday"}, 19 | "segonn": {"second"}, 20 | "semenn": {"week"}, 21 | "septam": {"september"}, 22 | "zanvie": {"january"}, 23 | "avril": {"april"}, 24 | "desam": {"december"}, 25 | "lindi": {"monday"}, 26 | "mardi": {"tuesday"}, 27 | "minit": {"minute"}, 28 | "novam": {"november"}, 29 | "oktob": {"october"}, 30 | "samdi": {"saturday"}, 31 | "zilye": {"july"}, 32 | "lane": {"year"}, 33 | "mars": {"march"}, 34 | "zedi": {"thursday"}, 35 | "zour": {"day"}, 36 | "avr": {"april"}, 37 | "des": {"december"}, 38 | "dim": {"sunday"}, 39 | "fev": {"february"}, 40 | "gmt": {"gmt"}, 41 | "ler": {"hour"}, 42 | "lin": {"monday"}, 43 | "mar": {"march", "tuesday"}, 44 | "mer": {"wednesday"}, 45 | "mwa": {"month"}, 46 | "nov": {"november"}, 47 | "okt": {"october"}, 48 | "out": {"august"}, 49 | "sam": {"saturday"}, 50 | "sep": {"september"}, 51 | "utc": {"utc"}, 52 | "van": {"friday"}, 53 | "zan": {"january"}, 54 | "zil": {"july"}, 55 | "zin": {"june"}, 56 | "am": {"am"}, 57 | "me": {"may"}, 58 | "pm": {"pm"}, 59 | "ze": {"thursday"}, 60 | " ": {" "}, 61 | "'": {""}, 62 | "+": {"+"}, 63 | ",": {""}, 64 | "-": {"-"}, 65 | ".": {"."}, 66 | "/": {"/"}, 67 | ":": {":"}, 68 | ";": {""}, 69 | "@": {""}, 70 | "[": {""}, 71 | "]": {""}, 72 | "z": {"z"}, 73 | "|": {""}, 74 | }, 75 | RelativeType: map[string]string{ 76 | "this minute": "0 minute ago", 77 | "last month": "1 month ago", 78 | "next month": "in 1 month", 79 | "this month": "0 month ago", 80 | "last week": "1 week ago", 81 | "last year": "1 year ago", 82 | "next week": "in 1 week", 83 | "next year": "in 1 year", 84 | "this hour": "0 hour ago", 85 | "this week": "0 week ago", 86 | "this year": "0 year ago", 87 | "demin": "in 1 day", 88 | "zordi": "0 day ago", 89 | "now": "0 second ago", 90 | "yer": "1 day ago", 91 | }, 92 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "merkredi", "vandredi", "fevriye", "dimans", "segonn", "semenn", "septam", "zanvie", "avril", "demin", "desam", "lindi", "mardi", "minit", "novam", "oktob", "samdi", "zilye", "zordi", "lane", "mars", "zedi", "zour", "avr", "des", "dim", "fev", "gmt", "ler", "lin", "mar", "mer", "mwa", "nov", "now", "okt", "out", "sam", "sep", "utc", "van", "yer", "zan", "zil", "zin", "am", "me", "pm", "ze", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 93 | }) 94 | } 95 | -------------------------------------------------------------------------------- /internal/data/mg.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | mg_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | mg_Locale = merge(nil, LocaleData{ 11 | Name: "mg", 12 | DateOrder: "YMD", 13 | Charset: []rune(`bcdefghijklnorstuvwxyz`), 14 | Translations: map[string][]string{ 15 | "alatsinainy": {"monday"}, 16 | "herinandro": {"week"}, 17 | "alakamisy": {"thursday"}, 18 | "aogositra": {"august"}, 19 | "septambra": {"september"}, 20 | "alarobia": {"wednesday"}, 21 | "asabotsy": {"saturday"}, 22 | "desambra": {"december"}, 23 | "febroary": {"february"}, 24 | "novambra": {"november"}, 25 | "segondra": {"second"}, 26 | "alahady": {"sunday"}, 27 | "janoary": {"january"}, 28 | "minitra": {"minute"}, 29 | "oktobra": {"october"}, 30 | "aprily": {"april"}, 31 | "martsa": {"march"}, 32 | "talata": {"tuesday"}, 33 | "volana": {"month"}, 34 | "alats": {"monday"}, 35 | "andro": {"day"}, 36 | "jolay": {"july"}, 37 | "taona": {"year"}, 38 | "alah": {"sunday"}, 39 | "alak": {"thursday"}, 40 | "alar": {"wednesday"}, 41 | "asab": {"saturday"}, 42 | "jona": {"june"}, 43 | "zoma": {"friday"}, 44 | "aog": {"august"}, 45 | "apr": {"april"}, 46 | "des": {"december"}, 47 | "feb": {"february"}, 48 | "gmt": {"gmt"}, 49 | "jan": {"january"}, 50 | "jol": {"july"}, 51 | "jon": {"june"}, 52 | "mar": {"march"}, 53 | "mey": {"may"}, 54 | "nov": {"november"}, 55 | "okt": {"october"}, 56 | "ora": {"hour"}, 57 | "sep": {"september"}, 58 | "tal": {"tuesday"}, 59 | "utc": {"utc"}, 60 | "zom": {"friday"}, 61 | "am": {"am"}, 62 | "pm": {"pm"}, 63 | " ": {" "}, 64 | "'": {""}, 65 | "+": {"+"}, 66 | ",": {""}, 67 | "-": {"-"}, 68 | ".": {"."}, 69 | "/": {"/"}, 70 | ":": {":"}, 71 | ";": {""}, 72 | "@": {""}, 73 | "[": {""}, 74 | "]": {""}, 75 | "z": {"z"}, 76 | "|": {""}, 77 | }, 78 | RelativeType: map[string]string{ 79 | "this minute": "0 minute ago", 80 | "last month": "1 month ago", 81 | "next month": "in 1 month", 82 | "rahampitso": "in 1 day", 83 | "this month": "0 month ago", 84 | "last week": "1 week ago", 85 | "last year": "1 year ago", 86 | "next week": "in 1 week", 87 | "next year": "in 1 year", 88 | "this hour": "0 hour ago", 89 | "this week": "0 week ago", 90 | "this year": "0 year ago", 91 | "omaly": "1 day ago", 92 | "anio": "0 day ago", 93 | "now": "0 second ago", 94 | }, 95 | KnownWords: []string{"alatsinainy", "this minute", "herinandro", "last month", "next month", "rahampitso", "this month", "alakamisy", "aogositra", "last week", "last year", "next week", "next year", "septambra", "this hour", "this week", "this year", "alarobia", "asabotsy", "desambra", "febroary", "novambra", "segondra", "alahady", "janoary", "minitra", "oktobra", "aprily", "martsa", "talata", "volana", "alats", "andro", "jolay", "omaly", "taona", "alah", "alak", "alar", "anio", "asab", "jona", "zoma", "aog", "apr", "des", "feb", "gmt", "jan", "jol", "jon", "mar", "mey", "nov", "now", "okt", "ora", "sep", "tal", "utc", "zom", "am", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 96 | }) 97 | } 98 | -------------------------------------------------------------------------------- /internal/data/mgo.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | mgo_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | mgo_Locale = merge(nil, LocaleData{ 11 | Name: "mgo", 12 | DateOrder: "YMD", 13 | Charset: []rune(`bcdefghiklnorstuwxyzàèìòùŋɔə̀`), 14 | Translations: map[string][]string{ 15 | "imeg mbəŋchubi": {"march"}, 16 | "iməg ichiibɔd": {"june"}, 17 | "iməg adumbəŋ": {"july"}, 18 | "iməg krizmed": {"december"}, 19 | "iməg mbegtug": {"january"}, 20 | "iməg ichika": {"august"}, 21 | "iməg tesi'e": {"october"}, 22 | "imeg abubi": {"february"}, 23 | "iməg ngwət": {"april"}, 24 | "iməg fog": {"may"}, 25 | "iməg kud": {"september"}, 26 | "iməg zo": {"november"}, 27 | "mbegtug": {"january"}, 28 | "aneg 1": {"sunday"}, 29 | "aneg 2": {"monday"}, 30 | "aneg 3": {"tuesday"}, 31 | "aneg 4": {"wednesday"}, 32 | "aneg 5": {"thursday"}, 33 | "aneg 6": {"friday"}, 34 | "aneg 7": {"saturday"}, 35 | "minute": {"minute"}, 36 | "second": {"second"}, 37 | "fitu'": {"year"}, 38 | "anəg": {"day"}, 39 | "hour": {"hour"}, 40 | "iməg": {"month"}, 41 | "nkap": {"week"}, 42 | "gmt": {"gmt"}, 43 | "utc": {"utc"}, 44 | "am": {"am"}, 45 | "pm": {"pm"}, 46 | " ": {" "}, 47 | "'": {""}, 48 | "+": {"+"}, 49 | ",": {""}, 50 | "-": {"-"}, 51 | ".": {"."}, 52 | "/": {"/"}, 53 | ":": {":"}, 54 | ";": {""}, 55 | "@": {""}, 56 | "[": {""}, 57 | "]": {""}, 58 | "z": {"z"}, 59 | "|": {""}, 60 | }, 61 | RelativeType: map[string]string{ 62 | "this minute": "0 minute ago", 63 | "last month": "1 month ago", 64 | "next month": "in 1 month", 65 | "this month": "0 month ago", 66 | "last week": "1 week ago", 67 | "last year": "1 year ago", 68 | "next week": "in 1 week", 69 | "next year": "in 1 year", 70 | "this hour": "0 hour ago", 71 | "this week": "0 week ago", 72 | "this year": "0 year ago", 73 | "ikwiri": "1 day ago", 74 | "techɔŋ": "0 day ago", 75 | "isu": "in 1 day", 76 | "now": "0 second ago", 77 | }, 78 | KnownWords: []string{"imeg mbəŋchubi", "iməg ichiibɔd", "iməg adumbəŋ", "iməg krizmed", "iməg mbegtug", "iməg ichika", "iməg tesi'e", "this minute", "imeg abubi", "iməg ngwət", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "iməg fog", "iməg kud", "iməg zo", "mbegtug", "aneg 1", "aneg 2", "aneg 3", "aneg 4", "aneg 5", "aneg 6", "aneg 7", "ikwiri", "minute", "second", "techɔŋ", "fitu'", "anəg", "hour", "iməg", "nkap", "gmt", "isu", "now", "utc", "am", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 79 | }) 80 | } 81 | -------------------------------------------------------------------------------- /internal/data/nnh.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | nnh_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | nnh_Locale = merge(nil, LocaleData{ 11 | Name: "nnh", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuvwxyzàáèéíòóùúÿŋǔɔɛʉ̀́̌ẅ`), 14 | Translations: map[string][]string{ 15 | "mbɔɔnte tsetsɛɛ lyɛ'": {"thursday"}, 16 | "saŋ tyɛb tyɛb mbʉŋ": {"july"}, 17 | "mbɔɔnte mvfo lyɛ'": {"tuesday"}, 18 | "saŋ taŋa tsetsa'": {"october"}, 19 | "saŋ tsetsɛɛ lum": {"january"}, 20 | "mvfo maga lyɛ'": {"friday"}, 21 | "saŋ lepye shum": {"march"}, 22 | "saŋ ngwɔ' mbyɛ": {"september"}, 23 | "saŋ kag ngwoŋ": {"february"}, 24 | "lyɛ'ɛ swiŋte": {"sunday"}, 25 | "saŋ tsɛɛ cyo": {"may"}, 26 | "tsetsɛɛ lyɛ'": {"wednesday"}, 27 | "saŋ mejwoŋo": {"november"}, 28 | "saŋ njyola'": {"june"}, 29 | "maga lyɛ'": {"saturday"}, 30 | "mba'amba'": {"am"}, 31 | "mvfo lyɛ'": {"monday"}, 32 | "ncwonzem": {"pm"}, 33 | "saŋ mbʉŋ": {"august"}, 34 | "fʉ' nem": {"hour"}, 35 | "saŋ cyo": {"april"}, 36 | "saŋ lum": {"december"}, 37 | "minute": {"minute"}, 38 | "second": {"second"}, 39 | "month": {"month"}, 40 | "lyɛ'": {"day"}, 41 | "ngu'": {"year"}, 42 | "week": {"week"}, 43 | "gmt": {"gmt"}, 44 | "utc": {"utc"}, 45 | "am": {"am"}, 46 | "pm": {"pm"}, 47 | " ": {" "}, 48 | "'": {""}, 49 | "+": {"+"}, 50 | ",": {""}, 51 | "-": {"-"}, 52 | ".": {"."}, 53 | "/": {"/"}, 54 | ":": {":"}, 55 | ";": {""}, 56 | "@": {""}, 57 | "[": {""}, 58 | "]": {""}, 59 | "z": {"z"}, 60 | "|": {""}, 61 | }, 62 | RelativeType: map[string]string{ 63 | "juɔ gwie a ne ntoo": "in 1 day", 64 | "juɔ gwie a ka tɔg": "1 day ago", 65 | "this minute": "0 minute ago", 66 | "last month": "1 month ago", 67 | "next month": "in 1 month", 68 | "this month": "0 month ago", 69 | "last week": "1 week ago", 70 | "last year": "1 year ago", 71 | "next week": "in 1 week", 72 | "next year": "in 1 year", 73 | "this hour": "0 hour ago", 74 | "this week": "0 week ago", 75 | "this year": "0 year ago", 76 | "lyɛ'ɔɔn": "0 day ago", 77 | "now": "0 second ago", 78 | }, 79 | KnownWords: []string{"mbɔɔnte tsetsɛɛ lyɛ'", "juɔ gwie a ne ntoo", "saŋ tyɛb tyɛb mbʉŋ", "juɔ gwie a ka tɔg", "mbɔɔnte mvfo lyɛ'", "saŋ taŋa tsetsa'", "saŋ tsetsɛɛ lum", "mvfo maga lyɛ'", "saŋ lepye shum", "saŋ ngwɔ' mbyɛ", "saŋ kag ngwoŋ", "lyɛ'ɛ swiŋte", "saŋ tsɛɛ cyo", "tsetsɛɛ lyɛ'", "saŋ mejwoŋo", "saŋ njyola'", "this minute", "last month", "next month", "this month", "last week", "last year", "maga lyɛ'", "mba'amba'", "mvfo lyɛ'", "next week", "next year", "this hour", "this week", "this year", "ncwonzem", "saŋ mbʉŋ", "fʉ' nem", "lyɛ'ɔɔn", "saŋ cyo", "saŋ lum", "minute", "second", "month", "lyɛ'", "ngu'", "week", "gmt", "now", "utc", "am", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 80 | }) 81 | } 82 | -------------------------------------------------------------------------------- /internal/data/or.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | or_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | or_Locale = merge(nil, LocaleData{ 11 | Name: "or", 12 | DateOrder: "DMY", 13 | Charset: []rune(`cdeghiklnorstuwxyzଅଆଇକଗଙଚଜଟଡଧନପଫବଭମରଲଳଶଷସାିୀୁୃେୋ୍`), 14 | Translations: map[string][]string{ 15 | "ସେପଟେମବର": {"september"}, 16 | "ମଙଗଳବାର": {"tuesday"}, 17 | "minute": {"minute"}, 18 | "second": {"second"}, 19 | "ଅକଟୋବର": {"october"}, 20 | "ଜାନଆରୀ": {"january"}, 21 | "ଡସେମବର": {"december"}, 22 | "ନଭେମବର": {"november"}, 23 | "ଫେବଆରୀ": {"february"}, 24 | "ଶକରବାର": {"friday"}, 25 | "ସୋମବାର": {"monday"}, 26 | "month": {"month"}, 27 | "ଅପରେଲ": {"april"}, 28 | "ଗରବାର": {"thursday"}, 29 | "ବଧବାର": {"wednesday"}, 30 | "ମାରଚଚ": {"march"}, 31 | "ରବବାର": {"sunday"}, 32 | "ଶନବାର": {"saturday"}, 33 | "hour": {"hour"}, 34 | "week": {"week"}, 35 | "year": {"year"}, 36 | "ଅଗଷଟ": {"august"}, 37 | "ଜଲାଇ": {"july"}, 38 | "ମଙଗଳ": {"tuesday"}, 39 | "day": {"day"}, 40 | "gmt": {"gmt"}, 41 | "utc": {"utc"}, 42 | "ଶକର": {"friday"}, 43 | "ସୋମ": {"monday"}, 44 | "am": {"am"}, 45 | "pm": {"pm"}, 46 | "ଗର": {"thursday"}, 47 | "ଜନ": {"june"}, 48 | "ବଧ": {"wednesday"}, 49 | "ମଇ": {"may"}, 50 | "ରବ": {"sunday"}, 51 | "ଶନ": {"saturday"}, 52 | " ": {" "}, 53 | "'": {""}, 54 | "+": {"+"}, 55 | ",": {""}, 56 | "-": {"-"}, 57 | ".": {"."}, 58 | "/": {"/"}, 59 | ":": {":"}, 60 | ";": {""}, 61 | "@": {""}, 62 | "[": {""}, 63 | "]": {""}, 64 | "z": {"z"}, 65 | "|": {""}, 66 | }, 67 | RelativeType: map[string]string{ 68 | "this minute": "0 minute ago", 69 | "last month": "1 month ago", 70 | "next month": "in 1 month", 71 | "this month": "0 month ago", 72 | "last week": "1 week ago", 73 | "last year": "1 year ago", 74 | "next week": "in 1 week", 75 | "next year": "in 1 year", 76 | "this hour": "0 hour ago", 77 | "this week": "0 week ago", 78 | "this year": "0 year ago", 79 | "yesterday": "1 day ago", 80 | "tomorrow": "in 1 day", 81 | "today": "0 day ago", 82 | "now": "0 second ago", 83 | }, 84 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "yesterday", "tomorrow", "ସେପଟେମବର", "ମଙଗଳବାର", "minute", "second", "ଅକଟୋବର", "ଜାନଆରୀ", "ଡସେମବର", "ନଭେମବର", "ଫେବଆରୀ", "ଶକରବାର", "ସୋମବାର", "month", "today", "ଅପରେଲ", "ଗରବାର", "ବଧବାର", "ମାରଚଚ", "ରବବାର", "ଶନବାର", "hour", "week", "year", "ଅଗଷଟ", "ଜଲାଇ", "ମଙଗଳ", "day", "gmt", "now", "utc", "ଶକର", "ସୋମ", "am", "pm", "ଗର", "ଜନ", "ବଧ", "ମଇ", "ରବ", "ଶନ", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 85 | }) 86 | } 87 | -------------------------------------------------------------------------------- /internal/data/pa-arab.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | pa_Arab_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | pa_Arab_Locale = merge(nil, LocaleData{ 11 | Name: "pa-Arab", 12 | DateOrder: "DMY", 13 | Charset: []rune(`cdeghiklnorstuwxyzئابتجدرسعفلمنويُٹپچکگھہی`), 14 | Translations: map[string][]string{ 15 | "second": {"second"}, 16 | "اکتوبر": {"october"}, 17 | "جمعرات": {"thursday"}, 18 | "جولايی": {"july"}, 19 | "اتوار": {"sunday"}, 20 | "اپریل": {"april"}, 21 | "جنوری": {"january"}, 22 | "دسمبر": {"december"}, 23 | "ستمبر": {"september"}, 24 | "فروری": {"february"}, 25 | "مہينا": {"month"}, 26 | "نومبر": {"november"}, 27 | "گھنٹا": {"hour"}, 28 | "اگست": {"august"}, 29 | "جمعہ": {"friday"}, 30 | "مارچ": {"march"}, 31 | "منگل": {"tuesday"}, 32 | "ورھا": {"year"}, 33 | "ہفتہ": {"week", "saturday"}, 34 | "gmt": {"gmt"}, 35 | "utc": {"utc"}, 36 | "بدھ": {"wednesday"}, 37 | "جون": {"june"}, 38 | "دين": {"day"}, 39 | "منٹ": {"minute"}, 40 | "پیر": {"monday"}, 41 | "am": {"am"}, 42 | "pm": {"pm"}, 43 | "مي": {"may"}, 44 | " ": {" "}, 45 | "'": {""}, 46 | "+": {"+"}, 47 | ",": {""}, 48 | "-": {"-"}, 49 | ".": {"."}, 50 | "/": {"/"}, 51 | ":": {":"}, 52 | ";": {""}, 53 | "@": {""}, 54 | "[": {""}, 55 | "]": {""}, 56 | "z": {"z"}, 57 | "|": {""}, 58 | }, 59 | RelativeType: map[string]string{ 60 | "this minute": "0 minute ago", 61 | "last month": "1 month ago", 62 | "next month": "in 1 month", 63 | "this month": "0 month ago", 64 | "last week": "1 week ago", 65 | "last year": "1 year ago", 66 | "next week": "in 1 week", 67 | "next year": "in 1 year", 68 | "this hour": "0 hour ago", 69 | "this week": "0 week ago", 70 | "this year": "0 year ago", 71 | "yesterday": "1 day ago", 72 | "tomorrow": "in 1 day", 73 | "today": "0 day ago", 74 | "now": "0 second ago", 75 | }, 76 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "yesterday", "tomorrow", "second", "اکتوبر", "جمعرات", "جولايی", "today", "اتوار", "اپریل", "جنوری", "دسمبر", "ستمبر", "فروری", "مہينا", "نومبر", "گھنٹا", "اگست", "جمعہ", "مارچ", "منگل", "ورھا", "ہفتہ", "gmt", "now", "utc", "بدھ", "جون", "دين", "منٹ", "پیر", "am", "pm", "مي", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 77 | }) 78 | } 79 | -------------------------------------------------------------------------------- /internal/data/ps.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | ps_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | ps_Locale = merge(nil, LocaleData{ 11 | Name: "ps", 12 | DateOrder: "YMD", 13 | Charset: []rune(`cdeghiklnorstuwxyzابتجدرسشعغفلمنهويپچکګیۍ‌`), 14 | Translations: map[string][]string{ 15 | "چهارشنبه": {"wednesday"}, 16 | "سه‌شنبه": {"tuesday"}, 17 | "پنجشنبه": {"thursday"}, 18 | "minute": {"minute"}, 19 | "second": {"second"}, 20 | "اکتوبر": {"october"}, 21 | "دوشنبه": {"monday"}, 22 | "سپتمبر": {"september"}, 23 | "فبروري": {"february"}, 24 | "یکشنبه": {"sunday"}, 25 | "month": {"month"}, 26 | "اپریل": {"april"}, 27 | "جنوري": {"january"}, 28 | "جولای": {"july"}, 29 | "دسمبر": {"december"}, 30 | "نومبر": {"november"}, 31 | "hour": {"hour"}, 32 | "week": {"week"}, 33 | "year": {"year"}, 34 | "اګست": {"august"}, 35 | "جمعه": {"friday"}, 36 | "شنبه": {"saturday"}, 37 | "مارچ": {"march"}, 38 | "day": {"day"}, 39 | "gmt": {"gmt"}, 40 | "utc": {"utc"}, 41 | "جون": {"june"}, 42 | "am": {"am"}, 43 | "pm": {"pm"}, 44 | "غم": {"am"}, 45 | "غو": {"pm"}, 46 | "مۍ": {"may"}, 47 | " ": {" "}, 48 | "'": {""}, 49 | "+": {"+"}, 50 | ",": {""}, 51 | "-": {"-"}, 52 | ".": {"."}, 53 | "/": {"/"}, 54 | ":": {":"}, 55 | ";": {""}, 56 | "@": {""}, 57 | "[": {""}, 58 | "]": {""}, 59 | "z": {"z"}, 60 | "|": {""}, 61 | }, 62 | RelativeType: map[string]string{ 63 | "this minute": "0 minute ago", 64 | "last month": "1 month ago", 65 | "next month": "in 1 month", 66 | "this month": "0 month ago", 67 | "last week": "1 week ago", 68 | "last year": "1 year ago", 69 | "next week": "in 1 week", 70 | "next year": "in 1 year", 71 | "this hour": "0 hour ago", 72 | "this week": "0 week ago", 73 | "this year": "0 year ago", 74 | "yesterday": "1 day ago", 75 | "tomorrow": "in 1 day", 76 | "today": "0 day ago", 77 | "now": "0 second ago", 78 | }, 79 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "yesterday", "tomorrow", "چهارشنبه", "سه‌شنبه", "پنجشنبه", "minute", "second", "اکتوبر", "دوشنبه", "سپتمبر", "فبروري", "یکشنبه", "month", "today", "اپریل", "جنوري", "جولای", "دسمبر", "نومبر", "hour", "week", "year", "اګست", "جمعه", "شنبه", "مارچ", "day", "gmt", "now", "utc", "جون", "am", "pm", "غم", "غو", "مۍ", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 80 | }) 81 | } 82 | -------------------------------------------------------------------------------- /internal/data/rm.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | rm_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | rm_Locale = merge(nil, LocaleData{ 11 | Name: "rm", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghiklnorstuvwxyz`), 14 | Translations: map[string][]string{ 15 | "glindesdi": {"monday"}, 16 | "settember": {"september"}, 17 | "zercladur": {"june"}, 18 | "december": {"december"}, 19 | "dumengia": {"sunday"}, 20 | "november": {"november"}, 21 | "venderdi": {"friday"}, 22 | "fanadur": {"july"}, 23 | "gievgia": {"thursday"}, 24 | "mesemna": {"wednesday"}, 25 | "october": {"october"}, 26 | "schaner": {"january"}, 27 | "secunda": {"second"}, 28 | "avrigl": {"april"}, 29 | "favrer": {"february"}, 30 | "minuta": {"minute"}, 31 | "avust": {"august"}, 32 | "mardi": {"tuesday"}, 33 | "schan": {"january"}, 34 | "sonda": {"saturday"}, 35 | "zercl": {"june"}, 36 | "emna": {"week"}, 37 | "favr": {"february"}, 38 | "mais": {"month"}, 39 | "mars": {"march"}, 40 | "matg": {"may"}, 41 | "sett": {"september"}, 42 | "avr": {"april"}, 43 | "dec": {"december"}, 44 | "fan": {"july"}, 45 | "gie": {"thursday"}, 46 | "gli": {"monday"}, 47 | "gmt": {"gmt"}, 48 | "nov": {"november"}, 49 | "oct": {"october"}, 50 | "onn": {"year"}, 51 | "tag": {"day"}, 52 | "ura": {"hour"}, 53 | "utc": {"utc"}, 54 | "am": {"am"}, 55 | "du": {"sunday"}, 56 | "ma": {"tuesday"}, 57 | "me": {"wednesday"}, 58 | "pm": {"pm"}, 59 | "so": {"saturday"}, 60 | "ve": {"friday"}, 61 | " ": {" "}, 62 | "'": {""}, 63 | "+": {"+"}, 64 | ",": {""}, 65 | "-": {"-"}, 66 | ".": {"."}, 67 | "/": {"/"}, 68 | ":": {":"}, 69 | ";": {""}, 70 | "@": {""}, 71 | "[": {""}, 72 | "]": {""}, 73 | "z": {"z"}, 74 | "|": {""}, 75 | }, 76 | RelativeType: map[string]string{ 77 | "this minute": "0 minute ago", 78 | "last month": "1 month ago", 79 | "next month": "in 1 month", 80 | "this month": "0 month ago", 81 | "last week": "1 week ago", 82 | "last year": "1 year ago", 83 | "next week": "in 1 week", 84 | "next year": "in 1 year", 85 | "this hour": "0 hour ago", 86 | "this week": "0 week ago", 87 | "this year": "0 year ago", 88 | "damaun": "in 1 day", 89 | "ier": "1 day ago", 90 | "now": "0 second ago", 91 | "oz": "0 day ago", 92 | }, 93 | KnownWords: []string{"this minute", "last month", "next month", "this month", "glindesdi", "last week", "last year", "next week", "next year", "settember", "this hour", "this week", "this year", "zercladur", "december", "dumengia", "november", "venderdi", "fanadur", "gievgia", "mesemna", "october", "schaner", "secunda", "avrigl", "damaun", "favrer", "minuta", "avust", "mardi", "schan", "sonda", "zercl", "emna", "favr", "mais", "mars", "matg", "sett", "avr", "dec", "fan", "gie", "gli", "gmt", "ier", "nov", "now", "oct", "onn", "tag", "ura", "utc", "am", "du", "ma", "me", "oz", "pm", "so", "ve", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 94 | }) 95 | } 96 | -------------------------------------------------------------------------------- /internal/data/seh.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | seh_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | seh_Locale = merge(nil, LocaleData{ 11 | Name: "seh", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuvwxyz`), 14 | Translations: map[string][]string{ 15 | "chishanu": {"friday"}, 16 | "decembro": {"december"}, 17 | "fevreiro": {"february"}, 18 | "novembro": {"november"}, 19 | "setembro": {"september"}, 20 | "augusto": {"august"}, 21 | "chipiri": {"tuesday"}, 22 | "chiposi": {"monday"}, 23 | "chitatu": {"wednesday"}, 24 | "dimingu": {"sunday"}, 25 | "janeiro": {"january"}, 26 | "segundo": {"second"}, 27 | "chinai": {"thursday"}, 28 | "minuto": {"minute"}, 29 | "ntsiku": {"day"}, 30 | "otubro": {"october"}, 31 | "sabudu": {"saturday"}, 32 | "abril": {"april"}, 33 | "chaka": {"year"}, 34 | "julho": {"july"}, 35 | "junho": {"june"}, 36 | "marco": {"march"}, 37 | "mwezi": {"month"}, 38 | "hora": {"hour"}, 39 | "maio": {"may"}, 40 | "week": {"week"}, 41 | "abr": {"april"}, 42 | "aug": {"august"}, 43 | "dec": {"december"}, 44 | "dim": {"sunday"}, 45 | "fev": {"february"}, 46 | "gmt": {"gmt"}, 47 | "jan": {"january"}, 48 | "jul": {"july"}, 49 | "jun": {"june"}, 50 | "mai": {"may"}, 51 | "mar": {"march"}, 52 | "nai": {"thursday"}, 53 | "nov": {"november"}, 54 | "otu": {"october"}, 55 | "pir": {"tuesday"}, 56 | "pos": {"monday"}, 57 | "sab": {"saturday"}, 58 | "set": {"september"}, 59 | "sha": {"friday"}, 60 | "tat": {"wednesday"}, 61 | "utc": {"utc"}, 62 | "am": {"am"}, 63 | "pm": {"pm"}, 64 | " ": {" "}, 65 | "'": {""}, 66 | "+": {"+"}, 67 | ",": {""}, 68 | "-": {"-"}, 69 | ".": {"."}, 70 | "/": {"/"}, 71 | ":": {":"}, 72 | ";": {""}, 73 | "@": {""}, 74 | "[": {""}, 75 | "]": {""}, 76 | "z": {"z"}, 77 | "|": {""}, 78 | }, 79 | RelativeType: map[string]string{ 80 | "this minute": "0 minute ago", 81 | "last month": "1 month ago", 82 | "next month": "in 1 month", 83 | "this month": "0 month ago", 84 | "last week": "1 week ago", 85 | "last year": "1 year ago", 86 | "next week": "in 1 week", 87 | "next year": "in 1 year", 88 | "this hour": "0 hour ago", 89 | "this week": "0 week ago", 90 | "this year": "0 year ago", 91 | "manguana": "in 1 day", 92 | "lero": "0 day ago", 93 | "zuro": "1 day ago", 94 | "now": "0 second ago", 95 | }, 96 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "chishanu", "decembro", "fevreiro", "manguana", "novembro", "setembro", "augusto", "chipiri", "chiposi", "chitatu", "dimingu", "janeiro", "segundo", "chinai", "minuto", "ntsiku", "otubro", "sabudu", "abril", "chaka", "julho", "junho", "marco", "mwezi", "hora", "lero", "maio", "week", "zuro", "abr", "aug", "dec", "dim", "fev", "gmt", "jan", "jul", "jun", "mai", "mar", "nai", "nov", "now", "otu", "pir", "pos", "sab", "set", "sha", "tat", "utc", "am", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 97 | }) 98 | } 99 | -------------------------------------------------------------------------------- /internal/data/ses.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | ses_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | ses_Locale = merge(nil, LocaleData{ 11 | Name: "ses", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuwxyzõŋž`), 14 | Translations: map[string][]string{ 15 | "alhamiisa": {"thursday"}, 16 | "deesanbur": {"december"}, 17 | "feewiriye": {"february"}, 18 | "noowanbur": {"november"}, 19 | "sektanbur": {"september"}, 20 | "atalaata": {"tuesday"}, 21 | "oktoobur": {"october"}, 22 | "zanwiye": {"january"}, 23 | "adduha": {"am"}, 24 | "alarba": {"wednesday"}, 25 | "alhadi": {"sunday"}, 26 | "aluula": {"pm"}, 27 | "alzuma": {"friday"}, 28 | "asibti": {"saturday"}, 29 | "atinni": {"monday"}, 30 | "awiril": {"april"}, 31 | "miniti": {"minute"}, 32 | "guuru": {"hour"}, 33 | "handu": {"month"}, 34 | "jiiri": {"year"}, 35 | "marsi": {"march"}, 36 | "zaari": {"day"}, 37 | "zuweŋ": {"june"}, 38 | "zuyye": {"july"}, 39 | "hebu": {"week"}, 40 | "miti": {"second"}, 41 | "ala": {"wednesday"}, 42 | "alh": {"sunday"}, 43 | "alm": {"thursday"}, 44 | "alz": {"friday"}, 45 | "asi": {"saturday"}, 46 | "ata": {"tuesday"}, 47 | "ati": {"monday"}, 48 | "awi": {"april"}, 49 | "dee": {"december"}, 50 | "fee": {"february"}, 51 | "gmt": {"gmt"}, 52 | "mar": {"march"}, 53 | "noo": {"november"}, 54 | "okt": {"october"}, 55 | "sek": {"september"}, 56 | "utc": {"utc"}, 57 | "zan": {"january"}, 58 | "zuw": {"june"}, 59 | "zuy": {"july"}, 60 | "am": {"am"}, 61 | "me": {"may"}, 62 | "pm": {"pm"}, 63 | "ut": {"august"}, 64 | " ": {" "}, 65 | "'": {""}, 66 | "+": {"+"}, 67 | ",": {""}, 68 | "-": {"-"}, 69 | ".": {"."}, 70 | "/": {"/"}, 71 | ":": {":"}, 72 | ";": {""}, 73 | "@": {""}, 74 | "[": {""}, 75 | "]": {""}, 76 | "z": {"z"}, 77 | "|": {""}, 78 | }, 79 | RelativeType: map[string]string{ 80 | "this minute": "0 minute ago", 81 | "last month": "1 month ago", 82 | "next month": "in 1 month", 83 | "this month": "0 month ago", 84 | "last week": "1 week ago", 85 | "last year": "1 year ago", 86 | "next week": "in 1 week", 87 | "next year": "in 1 year", 88 | "this hour": "0 hour ago", 89 | "this week": "0 week ago", 90 | "this year": "0 year ago", 91 | "suba": "in 1 day", 92 | "hoo": "0 day ago", 93 | "now": "0 second ago", 94 | "bi": "1 day ago", 95 | }, 96 | KnownWords: []string{"this minute", "last month", "next month", "this month", "alhamiisa", "deesanbur", "feewiriye", "last week", "last year", "next week", "next year", "noowanbur", "sektanbur", "this hour", "this week", "this year", "atalaata", "oktoobur", "zanwiye", "adduha", "alarba", "alhadi", "aluula", "alzuma", "asibti", "atinni", "awiril", "miniti", "guuru", "handu", "jiiri", "marsi", "zaari", "zuweŋ", "zuyye", "hebu", "miti", "suba", "ala", "alh", "alm", "alz", "asi", "ata", "ati", "awi", "dee", "fee", "gmt", "hoo", "mar", "noo", "now", "okt", "sek", "utc", "zan", "zuw", "zuy", "am", "bi", "me", "pm", "ut", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 97 | }) 98 | } 99 | -------------------------------------------------------------------------------- /internal/data/shi.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | shi_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | shi_Locale = merge(nil, LocaleData{ 11 | Name: "shi", 12 | DateOrder: "DMY", 13 | Charset: []rune(`ceghiklnorstuwxyzⴰⴱⴳⴷⴹⴼⴽⵉⵊⵍⵎⵏⵓⵔⵕⵖⵙⵚⵛⵜⵡⵢⵣ`), 14 | Translations: map[string][]string{ 15 | "ⴷⵓⵊⴰⵏⴱⵉⵔ": {"december"}, 16 | "ⵏⵓⵡⴰⵏⴱⵉⵔ": {"november"}, 17 | "ⵛⵓⵜⴰⵏⴱⵉⵔ": {"september"}, 18 | "ⵜⴰⴷⴳⴳⵡⴰⵜ": {"pm"}, 19 | "ⴰⵙⴳⴳⵡⴰⵙ": {"year"}, 20 | "ⴰⵙⵉⴹⵢⴰⵙ": {"saturday"}, 21 | "ⵉⵎⴰⵍⴰⵙⵙ": {"week"}, 22 | "ⵜⴰⵙⵔⴰⴳⵜ": {"hour"}, 23 | "ⵜⵓⵙⴷⵉⴷⵜ": {"minute"}, 24 | "ⴰⵙⴰⵎⴰⵙ": {"sunday"}, 25 | "ⴰⵙⵉⵏⴰⵙ": {"tuesday"}, 26 | "ⵉⵏⵏⴰⵢⵔ": {"january"}, 27 | "ⵙⵉⵎⵡⴰⵙ": {"friday"}, 28 | "ⵜⴰⵙⵉⵏⵜ": {"second"}, 29 | "ⵜⵉⴼⴰⵡⵜ": {"am"}, 30 | "ⵢⵓⵍⵢⵓⵣ": {"july"}, 31 | "ⴰⴽⵕⴰⵙ": {"wednesday"}, 32 | "ⴰⴽⵡⴰⵙ": {"thursday"}, 33 | "ⴰⵢⵏⴰⵙ": {"monday"}, 34 | "ⴰⵢⵢⵓⵔ": {"month"}, 35 | "ⴱⵕⴰⵢⵕ": {"february"}, 36 | "ⴽⵜⵓⴱⵔ": {"october"}, 37 | "ⵉⴱⵔⵉⵔ": {"april"}, 38 | "ⵎⴰⵢⵢⵓ": {"may"}, 39 | "ⵢⵓⵏⵢⵓ": {"june"}, 40 | "ⴰⵙⵉⴹ": {"saturday"}, 41 | "ⴰⵙⵉⵎ": {"friday"}, 42 | "ⵎⴰⵕⵚ": {"march"}, 43 | "ⵖⵓⵛⵜ": {"august"}, 44 | "gmt": {"gmt"}, 45 | "utc": {"utc"}, 46 | "ⴰⴽⵕ": {"wednesday"}, 47 | "ⴰⴽⵡ": {"thursday"}, 48 | "ⴰⵙⴰ": {"sunday"}, 49 | "ⴰⵙⵉ": {"tuesday"}, 50 | "ⴰⵙⵙ": {"day"}, 51 | "ⴰⵢⵏ": {"monday"}, 52 | "ⴱⵕⴰ": {"february"}, 53 | "ⴷⵓⵊ": {"december"}, 54 | "ⴽⵜⵓ": {"october"}, 55 | "ⵉⴱⵔ": {"april"}, 56 | "ⵉⵏⵏ": {"january"}, 57 | "ⵎⴰⵕ": {"march"}, 58 | "ⵎⴰⵢ": {"may"}, 59 | "ⵏⵓⵡ": {"november"}, 60 | "ⵖⵓⵛ": {"august"}, 61 | "ⵛⵓⵜ": {"september"}, 62 | "ⵢⵓⵍ": {"july"}, 63 | "ⵢⵓⵏ": {"june"}, 64 | "am": {"am"}, 65 | "pm": {"pm"}, 66 | " ": {" "}, 67 | "'": {""}, 68 | "+": {"+"}, 69 | ",": {""}, 70 | "-": {"-"}, 71 | ".": {"."}, 72 | "/": {"/"}, 73 | ":": {":"}, 74 | ";": {""}, 75 | "@": {""}, 76 | "[": {""}, 77 | "]": {""}, 78 | "z": {"z"}, 79 | "|": {""}, 80 | }, 81 | RelativeType: map[string]string{ 82 | "this minute": "0 minute ago", 83 | "last month": "1 month ago", 84 | "next month": "in 1 month", 85 | "this month": "0 month ago", 86 | "last week": "1 week ago", 87 | "last year": "1 year ago", 88 | "next week": "in 1 week", 89 | "next year": "in 1 year", 90 | "this hour": "0 hour ago", 91 | "this week": "0 week ago", 92 | "this year": "0 year ago", 93 | "ⴰⵙⴽⴽⴰ": "in 1 day", 94 | "ⵉⴹⵍⵍⵉ": "1 day ago", 95 | "ⴰⵙⵙⴰ": "0 day ago", 96 | "now": "0 second ago", 97 | }, 98 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "ⴷⵓⵊⴰⵏⴱⵉⵔ", "ⵏⵓⵡⴰⵏⴱⵉⵔ", "ⵛⵓⵜⴰⵏⴱⵉⵔ", "ⵜⴰⴷⴳⴳⵡⴰⵜ", "ⴰⵙⴳⴳⵡⴰⵙ", "ⴰⵙⵉⴹⵢⴰⵙ", "ⵉⵎⴰⵍⴰⵙⵙ", "ⵜⴰⵙⵔⴰⴳⵜ", "ⵜⵓⵙⴷⵉⴷⵜ", "ⴰⵙⴰⵎⴰⵙ", "ⴰⵙⵉⵏⴰⵙ", "ⵉⵏⵏⴰⵢⵔ", "ⵙⵉⵎⵡⴰⵙ", "ⵜⴰⵙⵉⵏⵜ", "ⵜⵉⴼⴰⵡⵜ", "ⵢⵓⵍⵢⵓⵣ", "ⴰⴽⵕⴰⵙ", "ⴰⴽⵡⴰⵙ", "ⴰⵙⴽⴽⴰ", "ⴰⵢⵏⴰⵙ", "ⴰⵢⵢⵓⵔ", "ⴱⵕⴰⵢⵕ", "ⴽⵜⵓⴱⵔ", "ⵉⴱⵔⵉⵔ", "ⵉⴹⵍⵍⵉ", "ⵎⴰⵢⵢⵓ", "ⵢⵓⵏⵢⵓ", "ⴰⵙⵉⴹ", "ⴰⵙⵉⵎ", "ⴰⵙⵙⴰ", "ⵎⴰⵕⵚ", "ⵖⵓⵛⵜ", "gmt", "now", "utc", "ⴰⴽⵕ", "ⴰⴽⵡ", "ⴰⵙⴰ", "ⴰⵙⵉ", "ⴰⵙⵙ", "ⴰⵢⵏ", "ⴱⵕⴰ", "ⴷⵓⵊ", "ⴽⵜⵓ", "ⵉⴱⵔ", "ⵉⵏⵏ", "ⵎⴰⵕ", "ⵎⴰⵢ", "ⵏⵓⵡ", "ⵖⵓⵛ", "ⵛⵓⵜ", "ⵢⵓⵍ", "ⵢⵓⵏ", "am", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 99 | }) 100 | } 101 | -------------------------------------------------------------------------------- /internal/data/tl.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | import "github.com/markusmobius/go-dateparser/internal/regexp" 6 | 7 | var ( 8 | tl_Locale LocaleData 9 | ) 10 | 11 | func init() { 12 | tl_Locale = merge(nil, LocaleData{ 13 | Name: "tl", 14 | DateOrder: "", 15 | Charset: []rune(`bcdeghiklnorstuwyz`), 16 | SentenceSplitterGroup: 1, 17 | Simplifications: []ReplacementData{ 18 | {regexp.MustCompile(`(?i)(\A|[^\pL\pM\d_])kahapon(\z|[^\pL\pM\d_])`), "${1}1 araw nakaraan${2}"}, 19 | {regexp.MustCompile(`(?i)(\A|[^\pL\pM\d_])ngayon(\z|[^\pL\pM\d_])`), "${1}0 segundo nakalipas${2}"}, 20 | {regexp.MustCompile(`(?i)(\A|[^\pL\pM\d_])isang araw(\z|[^\pL\pM\d_])`), "${1}2 araw${2}"}, 21 | }, 22 | Translations: map[string][]string{ 23 | "miyerkules": {"wednesday"}, 24 | "disyembre": {"december"}, 25 | "nakalipas": {"ago"}, 26 | "nobyembre": {"november"}, 27 | "setyembre": {"september"}, 28 | "biyernes": {"friday"}, 29 | "nakaraan": {"ago"}, 30 | "huwebes": {"thursday"}, 31 | "oktubre": {"october"}, 32 | "pebrero": {"february"}, 33 | "segundo": {"second"}, 34 | "agosto": {"august"}, 35 | "linggo": {"week", "sunday"}, 36 | "martes": {"tuesday"}, 37 | "minuto": {"minute"}, 38 | "sabado": {"saturday"}, 39 | "abril": {"april"}, 40 | "buwan": {"month"}, 41 | "enero": {"january"}, 42 | "ganap": {""}, 43 | "hulyo": {"july"}, 44 | "hunyo": {"june"}, 45 | "lunes": {"monday"}, 46 | "marso": {"march"}, 47 | "noong": {""}, 48 | "araw": {"day"}, 49 | "mayo": {"may"}, 50 | "noon": {""}, 51 | "oras": {"hour"}, 52 | "taon": {"year"}, 53 | "abr": {"april"}, 54 | "ago": {"august"}, 55 | "biy": {"friday"}, 56 | "dis": {"december"}, 57 | "ene": {"january"}, 58 | "gmt": {"gmt"}, 59 | "hul": {"july"}, 60 | "hun": {"june"}, 61 | "huw": {"thursday"}, 62 | "lin": {"sunday"}, 63 | "lun": {"monday"}, 64 | "mar": {"march"}, 65 | "may": {"may"}, 66 | "miy": {"wednesday"}, 67 | "nob": {"november"}, 68 | "okt": {"october"}, 69 | "peb": {"february"}, 70 | "sab": {"saturday"}, 71 | "set": {"september"}, 72 | "utc": {"utc"}, 73 | "am": {"am"}, 74 | "na": {""}, 75 | "pm": {"pm"}, 76 | "sa": {"in"}, 77 | " ": {" "}, 78 | "'": {""}, 79 | "+": {"+"}, 80 | ",": {""}, 81 | "-": {"-"}, 82 | ".": {"."}, 83 | "/": {"/"}, 84 | ":": {":"}, 85 | ";": {""}, 86 | "@": {""}, 87 | "[": {""}, 88 | "]": {""}, 89 | "z": {"z"}, 90 | "|": {""}, 91 | }, 92 | KnownWords: []string{"miyerkules", "disyembre", "nakalipas", "nobyembre", "setyembre", "biyernes", "nakaraan", "huwebes", "oktubre", "pebrero", "segundo", "agosto", "linggo", "martes", "minuto", "sabado", "abril", "buwan", "enero", "ganap", "hulyo", "hunyo", "lunes", "marso", "noong", "araw", "mayo", "noon", "oras", "taon", "abr", "ago", "biy", "dis", "ene", "gmt", "hul", "hun", "huw", "lin", "lun", "mar", "may", "miy", "nob", "okt", "peb", "sab", "set", "utc", "am", "na", "pm", "sa", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 93 | }) 94 | } 95 | -------------------------------------------------------------------------------- /internal/data/twq.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | twq_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | twq_Locale = merge(nil, LocaleData{ 11 | Name: "twq", 12 | DateOrder: "DMY", 13 | Charset: []rune(`bcdefghijklnorstuwxyzõŋž`), 14 | Translations: map[string][]string{ 15 | "zaarikay b": {"pm"}, 16 | "alhamiisa": {"thursday"}, 17 | "deesanbur": {"december"}, 18 | "feewiriye": {"february"}, 19 | "noowanbur": {"november"}, 20 | "sektanbur": {"september"}, 21 | "atalaata": {"tuesday"}, 22 | "oktoobur": {"october"}, 23 | "subbaahi": {"am"}, 24 | "zanwiye": {"january"}, 25 | "alarba": {"wednesday"}, 26 | "alhadi": {"sunday"}, 27 | "alzuma": {"friday"}, 28 | "asibti": {"saturday"}, 29 | "atinni": {"monday"}, 30 | "awiril": {"april"}, 31 | "miniti": {"minute"}, 32 | "guuru": {"hour"}, 33 | "handu": {"month"}, 34 | "jiiri": {"year"}, 35 | "marsi": {"march"}, 36 | "zaari": {"day"}, 37 | "zuweŋ": {"june"}, 38 | "zuyye": {"july"}, 39 | "hebu": {"week"}, 40 | "miti": {"second"}, 41 | "ala": {"wednesday"}, 42 | "alh": {"sunday"}, 43 | "alm": {"thursday"}, 44 | "alz": {"friday"}, 45 | "asi": {"saturday"}, 46 | "ata": {"tuesday"}, 47 | "ati": {"monday"}, 48 | "awi": {"april"}, 49 | "dee": {"december"}, 50 | "fee": {"february"}, 51 | "gmt": {"gmt"}, 52 | "mar": {"march"}, 53 | "noo": {"november"}, 54 | "okt": {"october"}, 55 | "sek": {"september"}, 56 | "utc": {"utc"}, 57 | "zan": {"january"}, 58 | "zuw": {"june"}, 59 | "zuy": {"july"}, 60 | "am": {"am"}, 61 | "me": {"may"}, 62 | "pm": {"pm"}, 63 | "ut": {"august"}, 64 | " ": {" "}, 65 | "'": {""}, 66 | "+": {"+"}, 67 | ",": {""}, 68 | "-": {"-"}, 69 | ".": {"."}, 70 | "/": {"/"}, 71 | ":": {":"}, 72 | ";": {""}, 73 | "@": {""}, 74 | "[": {""}, 75 | "]": {""}, 76 | "z": {"z"}, 77 | "|": {""}, 78 | }, 79 | RelativeType: map[string]string{ 80 | "this minute": "0 minute ago", 81 | "last month": "1 month ago", 82 | "next month": "in 1 month", 83 | "this month": "0 month ago", 84 | "last week": "1 week ago", 85 | "last year": "1 year ago", 86 | "next week": "in 1 week", 87 | "next year": "in 1 year", 88 | "this hour": "0 hour ago", 89 | "this week": "0 week ago", 90 | "this year": "0 year ago", 91 | "suba": "in 1 day", 92 | "hoo": "0 day ago", 93 | "now": "0 second ago", 94 | "bi": "1 day ago", 95 | }, 96 | KnownWords: []string{"this minute", "last month", "next month", "this month", "zaarikay b", "alhamiisa", "deesanbur", "feewiriye", "last week", "last year", "next week", "next year", "noowanbur", "sektanbur", "this hour", "this week", "this year", "atalaata", "oktoobur", "subbaahi", "zanwiye", "alarba", "alhadi", "alzuma", "asibti", "atinni", "awiril", "miniti", "guuru", "handu", "jiiri", "marsi", "zaari", "zuweŋ", "zuyye", "hebu", "miti", "suba", "ala", "alh", "alm", "alz", "asi", "ata", "ati", "awi", "dee", "fee", "gmt", "hoo", "mar", "noo", "now", "okt", "sek", "utc", "zan", "zuw", "zuy", "am", "bi", "me", "pm", "ut", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 97 | }) 98 | } 99 | -------------------------------------------------------------------------------- /internal/data/uz-arab.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | uz_Arab_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | uz_Arab_Locale = merge(nil, LocaleData{ 11 | Name: "uz-Arab", 12 | DateOrder: "YMD", 13 | Charset: []rune(`cdeghiklnorstuwxyzابتجدرسشعفلمنهوپچکگی‌`), 14 | Translations: map[string][]string{ 15 | "چهارشنبه": {"wednesday"}, 16 | "سه‌شنبه": {"tuesday"}, 17 | "پنجشنبه": {"thursday"}, 18 | "minute": {"minute"}, 19 | "second": {"second"}, 20 | "اکتوبر": {"october"}, 21 | "دوشنبه": {"monday"}, 22 | "سپتمبر": {"september"}, 23 | "فبروری": {"february"}, 24 | "یکشنبه": {"sunday"}, 25 | "month": {"month"}, 26 | "اپریل": {"april"}, 27 | "جنوری": {"january"}, 28 | "جولای": {"july"}, 29 | "دسمبر": {"december"}, 30 | "نومبر": {"november"}, 31 | "hour": {"hour"}, 32 | "week": {"week"}, 33 | "year": {"year"}, 34 | "اگست": {"august"}, 35 | "جمعه": {"friday"}, 36 | "شنبه": {"saturday"}, 37 | "مارچ": {"march"}, 38 | "day": {"day"}, 39 | "gmt": {"gmt"}, 40 | "utc": {"utc"}, 41 | "اپر": {"april"}, 42 | "اکت": {"october"}, 43 | "اگس": {"august"}, 44 | "جنو": {"january"}, 45 | "جول": {"july"}, 46 | "جون": {"june"}, 47 | "دسم": {"december"}, 48 | "سپت": {"september"}, 49 | "فبر": {"february"}, 50 | "مار": {"march"}, 51 | "نوم": {"november"}, 52 | "am": {"am"}, 53 | "pm": {"pm"}, 54 | "می": {"may"}, 55 | " ": {" "}, 56 | "'": {""}, 57 | "+": {"+"}, 58 | ",": {""}, 59 | "-": {"-"}, 60 | ".": {"."}, 61 | "/": {"/"}, 62 | ":": {":"}, 63 | ";": {""}, 64 | "@": {""}, 65 | "[": {""}, 66 | "]": {""}, 67 | "z": {"z"}, 68 | "|": {""}, 69 | "ج": {"friday"}, 70 | "د": {"monday"}, 71 | "س": {"tuesday"}, 72 | "ش": {"saturday"}, 73 | "پ": {"thursday"}, 74 | "چ": {"wednesday"}, 75 | "ی": {"sunday"}, 76 | }, 77 | RelativeType: map[string]string{ 78 | "this minute": "0 minute ago", 79 | "last month": "1 month ago", 80 | "next month": "in 1 month", 81 | "this month": "0 month ago", 82 | "last week": "1 week ago", 83 | "last year": "1 year ago", 84 | "next week": "in 1 week", 85 | "next year": "in 1 year", 86 | "this hour": "0 hour ago", 87 | "this week": "0 week ago", 88 | "this year": "0 year ago", 89 | "yesterday": "1 day ago", 90 | "tomorrow": "in 1 day", 91 | "today": "0 day ago", 92 | "now": "0 second ago", 93 | }, 94 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "yesterday", "tomorrow", "چهارشنبه", "سه‌شنبه", "پنجشنبه", "minute", "second", "اکتوبر", "دوشنبه", "سپتمبر", "فبروری", "یکشنبه", "month", "today", "اپریل", "جنوری", "جولای", "دسمبر", "نومبر", "hour", "week", "year", "اگست", "جمعه", "شنبه", "مارچ", "day", "gmt", "now", "utc", "اپر", "اکت", "اگس", "جنو", "جول", "جون", "دسم", "سپت", "فبر", "مار", "نوم", "am", "pm", "می", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|", "ج", "د", "س", "ش", "پ", "چ", "ی"}, 95 | }) 96 | } 97 | -------------------------------------------------------------------------------- /internal/data/zgh.go: -------------------------------------------------------------------------------- 1 | // Code is generated by script; DO NOT EDIT. 2 | 3 | package data 4 | 5 | var ( 6 | zgh_Locale LocaleData 7 | ) 8 | 9 | func init() { 10 | zgh_Locale = merge(nil, LocaleData{ 11 | Name: "zgh", 12 | DateOrder: "DMY", 13 | Charset: []rune(`ceghiklnorstuwxyzⴰⴱⴳⴷⴹⴼⴽⵉⵊⵍⵎⵏⵓⵔⵕⵖⵙⵚⵛⵜⵡⵢⵣ`), 14 | Translations: map[string][]string{ 15 | "ⴷⵓⵊⴰⵏⴱⵉⵔ": {"december"}, 16 | "ⵏⵓⵡⴰⵏⴱⵉⵔ": {"november"}, 17 | "ⵛⵓⵜⴰⵏⴱⵉⵔ": {"september"}, 18 | "ⵜⴰⴷⴳⴳⵡⴰⵜ": {"pm"}, 19 | "ⴰⵙⴳⴳⵡⴰⵙ": {"year"}, 20 | "ⴰⵙⵉⴹⵢⴰⵙ": {"saturday"}, 21 | "ⴰⵙⵉⵎⵡⴰⵙ": {"friday"}, 22 | "ⵉⵎⴰⵍⴰⵙⵙ": {"week"}, 23 | "ⵜⴰⵙⵔⴰⴳⵜ": {"hour"}, 24 | "ⵜⵓⵙⴷⵉⴷⵜ": {"minute"}, 25 | "ⴰⵙⴰⵎⴰⵙ": {"sunday"}, 26 | "ⴰⵙⵉⵏⴰⵙ": {"tuesday"}, 27 | "ⵉⵏⵏⴰⵢⵔ": {"january"}, 28 | "ⵜⴰⵙⵉⵏⵜ": {"second"}, 29 | "ⵜⵉⴼⴰⵡⵜ": {"am"}, 30 | "ⵢⵓⵍⵢⵓⵣ": {"july"}, 31 | "ⴰⴽⵕⴰⵙ": {"wednesday"}, 32 | "ⴰⴽⵡⴰⵙ": {"thursday"}, 33 | "ⴰⵢⵏⴰⵙ": {"monday"}, 34 | "ⴰⵢⵢⵓⵔ": {"month"}, 35 | "ⴱⵕⴰⵢⵕ": {"february"}, 36 | "ⴽⵜⵓⴱⵔ": {"october"}, 37 | "ⵉⴱⵔⵉⵔ": {"april"}, 38 | "ⵎⴰⵢⵢⵓ": {"may"}, 39 | "ⵢⵓⵏⵢⵓ": {"june"}, 40 | "ⴰⵙⵉⴹ": {"saturday"}, 41 | "ⴰⵙⵉⵎ": {"friday"}, 42 | "ⵎⴰⵕⵚ": {"march"}, 43 | "ⵖⵓⵛⵜ": {"august"}, 44 | "gmt": {"gmt"}, 45 | "utc": {"utc"}, 46 | "ⴰⴽⵕ": {"wednesday"}, 47 | "ⴰⴽⵡ": {"thursday"}, 48 | "ⴰⵙⴰ": {"sunday"}, 49 | "ⴰⵙⵉ": {"tuesday"}, 50 | "ⴰⵙⵙ": {"day"}, 51 | "ⴰⵢⵏ": {"monday"}, 52 | "ⴱⵕⴰ": {"february"}, 53 | "ⴷⵓⵊ": {"december"}, 54 | "ⴽⵜⵓ": {"october"}, 55 | "ⵉⴱⵔ": {"april"}, 56 | "ⵉⵏⵏ": {"january"}, 57 | "ⵎⴰⵕ": {"march"}, 58 | "ⵎⴰⵢ": {"may"}, 59 | "ⵏⵓⵡ": {"november"}, 60 | "ⵖⵓⵛ": {"august"}, 61 | "ⵛⵓⵜ": {"september"}, 62 | "ⵢⵓⵍ": {"july"}, 63 | "ⵢⵓⵏ": {"june"}, 64 | "am": {"am"}, 65 | "pm": {"pm"}, 66 | " ": {" "}, 67 | "'": {""}, 68 | "+": {"+"}, 69 | ",": {""}, 70 | "-": {"-"}, 71 | ".": {"."}, 72 | "/": {"/"}, 73 | ":": {":"}, 74 | ";": {""}, 75 | "@": {""}, 76 | "[": {""}, 77 | "]": {""}, 78 | "z": {"z"}, 79 | "|": {""}, 80 | }, 81 | RelativeType: map[string]string{ 82 | "this minute": "0 minute ago", 83 | "last month": "1 month ago", 84 | "next month": "in 1 month", 85 | "this month": "0 month ago", 86 | "last week": "1 week ago", 87 | "last year": "1 year ago", 88 | "next week": "in 1 week", 89 | "next year": "in 1 year", 90 | "this hour": "0 hour ago", 91 | "this week": "0 week ago", 92 | "this year": "0 year ago", 93 | "ⴰⵙⴽⴽⴰ": "in 1 day", 94 | "ⵉⴹⵍⵍⵉ": "1 day ago", 95 | "ⴰⵙⵙⴰ": "0 day ago", 96 | "now": "0 second ago", 97 | }, 98 | KnownWords: []string{"this minute", "last month", "next month", "this month", "last week", "last year", "next week", "next year", "this hour", "this week", "this year", "ⴷⵓⵊⴰⵏⴱⵉⵔ", "ⵏⵓⵡⴰⵏⴱⵉⵔ", "ⵛⵓⵜⴰⵏⴱⵉⵔ", "ⵜⴰⴷⴳⴳⵡⴰⵜ", "ⴰⵙⴳⴳⵡⴰⵙ", "ⴰⵙⵉⴹⵢⴰⵙ", "ⴰⵙⵉⵎⵡⴰⵙ", "ⵉⵎⴰⵍⴰⵙⵙ", "ⵜⴰⵙⵔⴰⴳⵜ", "ⵜⵓⵙⴷⵉⴷⵜ", "ⴰⵙⴰⵎⴰⵙ", "ⴰⵙⵉⵏⴰⵙ", "ⵉⵏⵏⴰⵢⵔ", "ⵜⴰⵙⵉⵏⵜ", "ⵜⵉⴼⴰⵡⵜ", "ⵢⵓⵍⵢⵓⵣ", "ⴰⴽⵕⴰⵙ", "ⴰⴽⵡⴰⵙ", "ⴰⵙⴽⴽⴰ", "ⴰⵢⵏⴰⵙ", "ⴰⵢⵢⵓⵔ", "ⴱⵕⴰⵢⵕ", "ⴽⵜⵓⴱⵔ", "ⵉⴱⵔⵉⵔ", "ⵉⴹⵍⵍⵉ", "ⵎⴰⵢⵢⵓ", "ⵢⵓⵏⵢⵓ", "ⴰⵙⵉⴹ", "ⴰⵙⵉⵎ", "ⴰⵙⵙⴰ", "ⵎⴰⵕⵚ", "ⵖⵓⵛⵜ", "gmt", "now", "utc", "ⴰⴽⵕ", "ⴰⴽⵡ", "ⴰⵙⴰ", "ⴰⵙⵉ", "ⴰⵙⵙ", "ⴰⵢⵏ", "ⴱⵕⴰ", "ⴷⵓⵊ", "ⴽⵜⵓ", "ⵉⴱⵔ", "ⵉⵏⵏ", "ⵎⴰⵕ", "ⵎⴰⵢ", "ⵏⵓⵡ", "ⵖⵓⵛ", "ⵛⵓⵜ", "ⵢⵓⵍ", "ⵢⵓⵏ", "am", "pm", " ", "'", "+", ",", "-", ".", "/", ":", ";", "@", "[", "]", "z", "|"}, 99 | }) 100 | } 101 | -------------------------------------------------------------------------------- /internal/dateutil/dateutil.go: -------------------------------------------------------------------------------- 1 | package dateutil 2 | 3 | import "time" 4 | 5 | // IsLeapYear check if the year is a leap year. 6 | func IsLeapYear(year int) bool { 7 | if year%400 == 0 { 8 | return true 9 | } else if year%100 == 0 { 10 | return false 11 | } else if year%4 == 0 { 12 | return true 13 | } else { 14 | return false 15 | } 16 | } 17 | 18 | // GetLeapYear returns the previous (or next if `toFuture` is true) 19 | // leap year from the current year. 20 | func GetLeapYear(year int, toFuture bool) int { 21 | step := 1 22 | if !toFuture { 23 | step = -1 24 | } 25 | 26 | for { 27 | year += step 28 | if IsLeapYear(year) { 29 | return year 30 | } 31 | } 32 | } 33 | 34 | // GetLastDayOfMonth fetch the last day of month. 35 | func GetLastDayOfMonth(year, month int) int { 36 | return time.Date(year, time.Month(month), 1, 0, 0, 0, 0, time.UTC). 37 | AddDate(0, 1, -1).Day() 38 | } 39 | -------------------------------------------------------------------------------- /internal/dateutil/dateutil_test.go: -------------------------------------------------------------------------------- 1 | package dateutil 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | ) 9 | 10 | func TestIsLeapYear(t *testing.T) { 11 | type testScenario struct { 12 | Year int 13 | IsLeap bool 14 | } 15 | 16 | tests := []testScenario{ 17 | // Not leap year 18 | {1999, false}, 19 | {1700, false}, 20 | // Is leap year 21 | {1696, true}, 22 | {1996, true}, 23 | {2000, true}, 24 | {2016, true}, 25 | {2096, true}, 26 | {2392, true}, 27 | } 28 | 29 | for _, test := range tests { 30 | message := fmt.Sprintf("%d, IS LEAP YEAR: %v", test.Year, test.IsLeap) 31 | assert.Equal(t, test.IsLeap, IsLeapYear(test.Year), message) 32 | } 33 | } 34 | 35 | func TestGetLeapYear_future(t *testing.T) { 36 | type testScenario struct { 37 | Year int 38 | NextLeapYear int 39 | } 40 | 41 | tests := []testScenario{ 42 | {2020, 2024}, 43 | {1996, 2000}, 44 | {2096, 2104}, 45 | {1696, 1704}, 46 | {2396, 2400}, 47 | {0, 4}, 48 | } 49 | 50 | for _, test := range tests { 51 | message := fmt.Sprintf("%d, NEXT LEAP YEAR IS: %d", test.Year, test.NextLeapYear) 52 | assert.Equal(t, test.NextLeapYear, GetLeapYear(test.Year, true), message) 53 | } 54 | } 55 | 56 | func TestGetLeapYear_past(t *testing.T) { 57 | type testScenario struct { 58 | Year int 59 | PrevLeapYear int 60 | } 61 | 62 | tests := []testScenario{ 63 | {2020, 2016}, 64 | {2000, 1996}, 65 | {2104, 2096}, 66 | {1704, 1696}, 67 | {2396, 2392}, 68 | {0, -4}, 69 | } 70 | 71 | for _, test := range tests { 72 | message := fmt.Sprintf("%d, PREV LEAP YEAR WAS: %d", test.Year, test.PrevLeapYear) 73 | assert.Equal(t, test.PrevLeapYear, GetLeapYear(test.Year, false), message) 74 | } 75 | } 76 | 77 | func TestGetLastDayOfMonth(t *testing.T) { 78 | type testScenario struct { 79 | Year int 80 | Month int 81 | LastDay int 82 | } 83 | 84 | tests := []testScenario{ 85 | {2111, 1, 31}, 86 | {1999, 2, 28}, 87 | {1996, 2, 29}, 88 | {2000, 2, 29}, 89 | {1700, 2, 28}, 90 | {2020, 3, 31}, 91 | {1987, 4, 30}, 92 | {1000, 5, 31}, 93 | {1534, 6, 30}, 94 | {1777, 7, 31}, 95 | {1234, 8, 31}, 96 | {1678, 9, 30}, 97 | {1947, 10, 31}, 98 | {2015, 11, 30}, 99 | {2300, 12, 31}, 100 | } 101 | 102 | for _, test := range tests { 103 | message := fmt.Sprintf("%d-%02d, LAST DAY IS: %d", test.Year, test.Month, test.LastDay) 104 | assert.Equal(t, test.LastDay, GetLastDayOfMonth(test.Year, test.Month), message) 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /internal/language/00-constant.go: -------------------------------------------------------------------------------- 1 | package language 2 | 3 | import ( 4 | "errors" 5 | "unicode" 6 | 7 | "github.com/markusmobius/go-dateparser/internal/regexp" 8 | "github.com/markusmobius/go-dateparser/internal/strutil" 9 | "golang.org/x/text/unicode/rangetable" 10 | ) 11 | 12 | var ( 13 | ErrNotFound = errors.New("locale not found") 14 | ErrUnknownLocales = errors.New("unknown locale(s)") 15 | ErrUnknownLanguages = errors.New("unknown language(s)") 16 | ErrConflictingLocales = errors.New("locales should not have same language and different region") 17 | ) 18 | 19 | const ( 20 | splitSeparator = `|#=#=#|` 21 | ) 22 | 23 | var ( 24 | rxSpaces = regexp.MustCompile(`\s{2,}`) 25 | rxKeepToken1 = regexp.MustCompile(`^.*[^\W_].*$`) 26 | rxKeepToken2 = regexp.MustCompile(`^.*[^\P{L}\d_].*$`) 27 | rxNumeral = regexp.MustCompile(`(\d+)`) 28 | rxTokenDigit = regexp.MustCompile(`[\d\.:\-/]+`) 29 | 30 | disallowedKnownWordRunes = rangetable.Merge( 31 | unicode.Letter, 32 | unicode.Mark, 33 | unicode.Number, 34 | ) 35 | 36 | rxSentenceSplitters = map[int]*regexp.Regexp{ 37 | // The most common splitter, used in European, Tagalog, Hebrew, Georgian, Indonesian, Vietnamese 38 | 1: regexp.MustCompile(`([^\s.]*)[\.!?;…\r\n]+(?:\s|$)*`), 39 | // Splitter for Spanish 40 | 2: regexp.MustCompile(`([^\s.]*)[\.!?;…\r\n]+(\s*[¡¿]*|$)|[¡¿]+`), 41 | // Splitter for Hindi and Bangla 42 | 3: regexp.MustCompile(`([^\s.]*)[|!?;\r\n]+(?:\s|$)+`), 43 | // Splitter for Japanese and Chinese 44 | 4: regexp.MustCompile(`([^\s.]*)[。…‥\.!??!;\r\n]+(?:\s|$)+`), 45 | // Splitter for Thai 46 | 5: regexp.MustCompile(`([^\s.]*)[\r\n]+`), 47 | // Splitter for Arabic and Farsi 48 | 6: regexp.MustCompile(`([^\s.]*)[\r\n؟!\.…]+(?:\s|$)+`), 49 | } 50 | 51 | dashes = strutil.NewDict("-", "——", "—", "~") 52 | alwaysKeptTokens = strutil.NewDict("+", ":", ".", " ", "-", "/") 53 | freshnessWords = strutil.NewDict("day", "week", "month", "year", "hour", "minute", "second") 54 | langWithDigitAbbrs = strutil.NewDict("fi", "cs", "hu", "de", "da") 55 | commonCharset = rangetable.New([]rune(`0123456789()\-/.,:' `)...) 56 | ) 57 | -------------------------------------------------------------------------------- /internal/language/applicable-check.go: -------------------------------------------------------------------------------- 1 | package language 2 | 3 | import ( 4 | "unicode/utf8" 5 | 6 | "github.com/markusmobius/go-dateparser/internal/data" 7 | "github.com/markusmobius/go-dateparser/internal/digit" 8 | "github.com/markusmobius/go-dateparser/internal/setting" 9 | "github.com/markusmobius/go-dateparser/internal/strutil" 10 | "github.com/markusmobius/go-dateparser/internal/timezone" 11 | ) 12 | 13 | // IsApplicable checks the specified locale data is applicable to translate the date string `str`. 14 | // The `str` parameter is a string representing date and/or time in a recognizably valid format. 15 | // If `stripTimezone` set to true, timezone will be stripped and ignored. 16 | func IsApplicable(cfg *setting.Configuration, ld *data.LocaleData, str string, stripTimezone bool) bool { 17 | // Parse config 18 | skippedTokens := mapSkippedTokens(cfg, ld) 19 | 20 | // Strip timezone if needed 21 | if stripTimezone { 22 | str, _ = timezone.PopTzOffset(str) 23 | } 24 | 25 | // Normalize string 26 | str = strutil.NormalizeString(str) 27 | str = digit.NormalizeString(str) 28 | str = Simplify(ld, str) 29 | 30 | // Generate tokens 31 | tokens := Split(ld, str, false, skippedTokens) 32 | 33 | // Check if tokens valid 34 | // First check if tokens only consist of tokens that must be kept 35 | var nKeptTokens int 36 | for _, token := range tokens { 37 | if alwaysKeptTokens.Contain(token) { 38 | nKeptTokens++ 39 | } 40 | } 41 | 42 | if nKeptTokens == len(tokens) { 43 | return false 44 | } 45 | 46 | // Check if token exist in locale data 47 | for _, token := range tokens { 48 | isSkipped := skippedTokens.Contain(token) 49 | isNumberOnly := strutil.IsNumberOnly(token) 50 | inDictionary := isInDictionary(ld, token) 51 | 52 | var exactCombinedMatch bool 53 | if ld.RxExactCombined != nil { 54 | exactCombinedMatch = ld.RxExactCombined.MatchString(token) 55 | } 56 | 57 | if isNumberOnly || inDictionary || isSkipped || exactCombinedMatch { 58 | continue 59 | } 60 | 61 | return false 62 | } 63 | 64 | return true 65 | } 66 | 67 | func CountApplicability(cfg *setting.Configuration, ld *data.LocaleData, str string, stripTimezone bool) (int, int) { 68 | // Parse config 69 | skippedTokens := strutil.NewDict() 70 | if cfg != nil { 71 | skippedTokens.Add(cfg.SkipTokens...) 72 | } 73 | 74 | // Strip timezone if needed 75 | if stripTimezone { 76 | str, _ = timezone.PopTzOffset(str) 77 | } 78 | 79 | // Split string to sentences 80 | str = Simplify(ld, str) 81 | sentences := SplitSentence(ld, str) 82 | 83 | // Extract tokens from sentences 84 | tokens := strutil.NewDict() 85 | for _, sentence := range sentences { 86 | sentenceTokens := simpleSplit(ld, sentence, false, skippedTokens) 87 | tokens.Add(sentenceTokens...) 88 | } 89 | 90 | // Count token that exist in dictionary 91 | var nExist, nSkipped int 92 | for token := range tokens { 93 | translations, exist := ld.Translations[token] 94 | if exist && utf8.RuneCountInString(token) >= 2 { 95 | if len(translations) > 0 { 96 | nExist++ 97 | } else { 98 | nSkipped++ 99 | } 100 | } else if strutil.IsNumberOnly(token) { 101 | nSkipped++ 102 | } 103 | } 104 | 105 | return nExist, nSkipped 106 | } 107 | -------------------------------------------------------------------------------- /internal/language/applicable-check_test.go: -------------------------------------------------------------------------------- 1 | package language 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/markusmobius/go-dateparser/internal/setting" 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | func TestIsApplicable(t *testing.T) { 12 | type testScenario struct { 13 | Locale string 14 | Text string 15 | Expected bool 16 | StripTimezone bool 17 | } 18 | 19 | ts := func(locale string, text string, expected bool, stripTimezone ...bool) testScenario { 20 | s := testScenario{Locale: locale, Text: text, Expected: expected} 21 | if len(stripTimezone) > 0 { 22 | s.StripTimezone = stripTimezone[0] 23 | } 24 | return s 25 | } 26 | 27 | stripTimezone := true 28 | tests := []testScenario{ 29 | // Should be applicable 30 | ts("en", "17th October, 2034 @ 01:08 am PDT", true, stripTimezone), 31 | ts("en", "#@Sept#04#2014", true), 32 | ts("en", "2014-12-13T00:11:00Z", true), 33 | ts("de", "Donnerstag, 8. Januar 2015 um 07:17", true), 34 | ts("da", "Torsdag, 8. januar 2015 kl. 07:17", true), 35 | ts("ru", "8 января 2015 г. в 9:10", true), 36 | ts("cs", "Pondělí v 22:29", true), 37 | ts("nl", "woensdag 7 januari om 21:32", true), 38 | ts("ro", "8 Ianuarie 2015 la 13:33", true), 39 | ts("ar", "ساعتين", true), 40 | ts("tr", "3 hafta", true), 41 | ts("th", "17 เดือนมิถุนายน", true), 42 | ts("pl", "przedwczoraj", true), 43 | ts("fa", "ژانویه 8, 2015، ساعت 15:46", true), 44 | ts("vi", "2 tuần 3 ngày", true), 45 | ts("tl", "Hulyo 3, 2015 7:00 pm", true), 46 | ts("be", "3 верасня 2015 г. у 11:10", true), 47 | ts("id", "01 Agustus 2015 18:23", true), 48 | ts("he", "6 לדצמבר 1973", true), 49 | ts("bn", "3 সপ্তাহ", true), 50 | 51 | // Should be NOT applicable 52 | ts("ru", "08.haziran.2014, 11:07", false), 53 | ts("ar", "6 دقیقه", false), 54 | ts("fa", "ساعتين", false), 55 | ts("cs", "3 hafta", false), 56 | } 57 | 58 | // Prepare config 59 | cfg := &setting.Configuration{ 60 | SkipTokens: []string{"t"}, 61 | } 62 | 63 | nFailed := 0 64 | for _, test := range tests { 65 | // Prepare log message 66 | message := fmt.Sprintf("%s, \"%s\"", test.Locale, test.Text) 67 | 68 | // Load locale 69 | ld, err := GetLocale(test.Locale) 70 | assert.Nil(t, err, message) 71 | 72 | // Make sure it's applicable 73 | isApplicable := IsApplicable(cfg, ld, test.Text, test.StripTimezone) 74 | passed := assert.Equal(t, test.Expected, isApplicable, message) 75 | if !passed { 76 | nFailed++ 77 | } 78 | } 79 | 80 | if nFailed > 0 { 81 | fmt.Printf("Failed %d from %d tests\n", nFailed, len(tests)) 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /internal/language/utils.go: -------------------------------------------------------------------------------- 1 | package language 2 | 3 | import ( 4 | "slices" 5 | "strings" 6 | 7 | "github.com/markusmobius/go-dateparser/internal/data" 8 | "github.com/markusmobius/go-dateparser/internal/setting" 9 | "github.com/markusmobius/go-dateparser/internal/strutil" 10 | ) 11 | 12 | func mapSkippedTokens(cfg *setting.Configuration, ld *data.LocaleData) strutil.Dict { 13 | skippedTokens := strutil.NewDict() 14 | if cfg != nil { 15 | skippedTokens.Add(cfg.SkipTokens...) 16 | } 17 | 18 | if ld != nil && ld.Name == "fi" { 19 | skippedTokens.Remove("t") 20 | } 21 | 22 | return skippedTokens 23 | } 24 | 25 | func join(tokens []string, separator string) string { 26 | if len(tokens) == 0 { 27 | return "" 28 | } 29 | 30 | joined := tokens[0] 31 | for i := 1; i < len(tokens); i++ { 32 | left, right := tokens[i-1], tokens[i] 33 | leftAlwaysKept := alwaysKeptTokens.Contain(left) 34 | rightAlwaysKept := alwaysKeptTokens.Contain(right) 35 | if !leftAlwaysKept && !rightAlwaysKept { 36 | joined += separator 37 | } 38 | 39 | joined += right 40 | } 41 | 42 | joined = strings.TrimSpace(joined) 43 | return joined 44 | } 45 | 46 | func translateWord(ld *data.LocaleData, word string) ([]string, bool) { 47 | if translation, exist := ld.RelativeType[word]; exist { 48 | return []string{translation}, true 49 | } 50 | 51 | if translations, exist := ld.Translations[word]; exist { 52 | return slices.Clone(translations), true 53 | } 54 | 55 | return nil, false 56 | } 57 | 58 | func isInDictionary(ld *data.LocaleData, word string) bool { 59 | _, exist := translateWord(ld, word) 60 | return exist 61 | } 62 | 63 | func createPermutation[T comparable](input [][]T) [][]T { 64 | // Calculate count of possible permutation 65 | nPermutation := 1 66 | for _, entries := range input { 67 | nPermutation *= len(entries) 68 | } 69 | 70 | // Create result container 71 | inputSize := len(input) 72 | results := make([][]T, nPermutation) 73 | for i := range results { 74 | results[i] = make([]T, inputSize) 75 | } 76 | 77 | // Fill the permutation 78 | currentTotal := nPermutation 79 | for i, entries := range input { 80 | nEntry := len(entries) 81 | maxEntrySubmission := currentTotal / nEntry 82 | 83 | var entryIdx, nEntrySubmitted int 84 | for permutationIdx := range nPermutation { 85 | if nEntrySubmitted >= maxEntrySubmission { 86 | entryIdx++ 87 | nEntrySubmitted = 0 88 | } 89 | 90 | if entryIdx >= nEntry { 91 | entryIdx = 0 92 | } 93 | 94 | results[permutationIdx][i] = entries[entryIdx] 95 | nEntrySubmitted++ 96 | } 97 | 98 | currentTotal /= nEntry 99 | } 100 | 101 | return results 102 | } 103 | -------------------------------------------------------------------------------- /internal/parser/absolute/root.go: -------------------------------------------------------------------------------- 1 | package absolute 2 | 3 | import ( 4 | "strings" 5 | "time" 6 | 7 | "github.com/markusmobius/go-dateparser/date" 8 | "github.com/markusmobius/go-dateparser/internal/dateutil" 9 | "github.com/markusmobius/go-dateparser/internal/setting" 10 | "github.com/markusmobius/go-dateparser/internal/timezone" 11 | ) 12 | 13 | func Parse(cfg *setting.Configuration, str string, tz timezone.OffsetData) (date.Date, error) { 14 | parser := &Parser{ 15 | Config: cfg, 16 | FnGetDateTimeParams: getDateTimeParams, 17 | FnGetDatePartValue: getDatePartValue, 18 | FnCreateDateTime: createDateTime, 19 | } 20 | 21 | if err := parser.Init(str); err != nil { 22 | return date.Date{}, err 23 | } 24 | 25 | return parser.Parse(tz) 26 | } 27 | 28 | func getDateTimeParams(p *Parser) map[string]int { 29 | // Get component values 30 | day, dayExist := p.ComponentValues["day"] 31 | if !dayExist || day == 0 { 32 | day = p.Now.Day() 33 | } 34 | 35 | month, monthExist := p.ComponentValues["month"] 36 | if !monthExist || month == 0 { 37 | month = int(p.Now.Month()) 38 | } 39 | 40 | year, yearExist := p.ComponentValues["year"] 41 | if !yearExist || year == 0 { 42 | year = p.Now.Year() 43 | } 44 | 45 | return map[string]int{ 46 | "year": year, 47 | "month": month, 48 | "day": day, 49 | } 50 | } 51 | 52 | func createDateTime(p *Parser, pms map[string]int, loc *time.Location) (time.Time, error) { 53 | Y, M, D := pms["year"], pms["month"], pms["day"] 54 | H, m, s, ns := pms["hour"], pms["minute"], pms["second"], pms["nanosecond"] 55 | 56 | // Fix leap year 57 | if D == 29 && M == 2 && !dateutil.IsLeapYear(Y) { 58 | Y = p.getCorrectLeapYear(Y) 59 | } 60 | 61 | // Fix max day 62 | lastDayOfMonth := dateutil.GetLastDayOfMonth(Y, M) 63 | if D > lastDayOfMonth { 64 | D = lastDayOfMonth 65 | } 66 | 67 | return time.Date(Y, time.Month(M), D, H, m, s, ns, loc), nil 68 | } 69 | 70 | func getDatePartValue(p *Parser, component, token, directive string) (int, bool) { 71 | token = strings.ToLower(token) 72 | if t, _ := time.Parse(directive, token); !t.IsZero() { 73 | switch component { 74 | case "day": 75 | return t.Day(), true 76 | case "weekday": 77 | return int(t.Weekday()), true 78 | case "month": 79 | return int(t.Month()), true 80 | case "year": 81 | return t.Year(), true 82 | } 83 | } 84 | 85 | return 0, false 86 | } 87 | -------------------------------------------------------------------------------- /internal/parser/absolute/root_test.go: -------------------------------------------------------------------------------- 1 | package absolute 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/markusmobius/go-dateparser/internal/setting" 8 | "github.com/markusmobius/go-dateparser/internal/timezone" 9 | "github.com/stretchr/testify/assert" 10 | ) 11 | 12 | func TestParse_error(t *testing.T) { 13 | // Prepare scenarios 14 | cfgStrict := &setting.Configuration{StrictParsing: true} 15 | cfgAllRequired := &setting.Configuration{RequiredParts: []string{"day", "month", "year"}} 16 | cfgDayRequired := &setting.Configuration{RequiredParts: []string{"day"}} 17 | cfgMonthRequired := &setting.Configuration{RequiredParts: []string{"month"}} 18 | cfgYearRequired := &setting.Configuration{RequiredParts: []string{"year"}} 19 | 20 | type testScenario struct { 21 | Text string 22 | Config *setting.Configuration 23 | } 24 | 25 | tests := []testScenario{ 26 | // Empty string 27 | {"", nil}, 28 | 29 | // Not date 30 | {"invalid date string", nil}, 31 | {"Aug 7, 2014Aug 7, 2014", nil}, 32 | {"24h ago", nil}, 33 | {"2015-03-17t16:37:51+00:002015-03-17t15:24:37+00:00", nil}, 34 | {"8 enero 2013 martes 7:03 AM EST 8 enero 2013 martes 7:03 AM EST", nil}, 35 | {"12/09/18567", nil}, 36 | 37 | // Wrong day 38 | {"29 February 2015", nil}, 39 | {"32 January 2015", nil}, 40 | {"31 April 2015", nil}, 41 | {"31 June 2015", nil}, 42 | {"31 September 2015", nil}, 43 | 44 | // Incomplete dates with strict parsing enabled 45 | {"april 2010", cfgStrict}, 46 | {"11 March", cfgStrict}, 47 | {"March", cfgStrict}, 48 | {"31 2010", cfgStrict}, 49 | {"31/2010", cfgStrict}, 50 | 51 | // Partially complete dates, all date components required 52 | {"april 2010", cfgAllRequired}, 53 | {"11 March", cfgAllRequired}, 54 | {"March", cfgAllRequired}, 55 | {"31 2010", cfgAllRequired}, 56 | {"31/2010", cfgAllRequired}, 57 | 58 | // Day is required 59 | {"april 2010", cfgDayRequired}, 60 | {"March", cfgDayRequired}, 61 | {"2010", cfgDayRequired}, 62 | 63 | // Month required 64 | {"31 2010", cfgMonthRequired}, 65 | {"31/2010", cfgMonthRequired}, 66 | 67 | // Year required 68 | {"11 March", cfgYearRequired}, 69 | {"March", cfgYearRequired}, 70 | } 71 | 72 | // Start test 73 | var nFailed int 74 | var tz timezone.OffsetData 75 | for _, test := range tests { 76 | _, err := Parse(test.Config, test.Text, tz) 77 | passed := assert.Error(t, err, test.Text) 78 | if !passed { 79 | nFailed++ 80 | } 81 | } 82 | 83 | if nFailed > 0 { 84 | fmt.Printf("Failed %d from %d tests\n", nFailed, len(tests)) 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /internal/parser/common/apply-day.go: -------------------------------------------------------------------------------- 1 | package common 2 | 3 | import ( 4 | "time" 5 | 6 | "github.com/markusmobius/go-dateparser/internal/dateutil" 7 | "github.com/markusmobius/go-dateparser/internal/setting" 8 | ) 9 | 10 | func ApplyDayFromConfig(cfg *setting.Configuration, t time.Time, currentDay ...int) time.Time { 11 | if cfg == nil { 12 | return t 13 | } 14 | 15 | var newDay int 16 | switch cfg.PreferredDayOfMonth { 17 | case setting.First: 18 | newDay = 1 19 | case setting.Last: 20 | newDay = t.AddDate(0, 1, -t.Day()).Day() 21 | default: // current day 22 | if len(currentDay) > 0 { 23 | newDay = currentDay[0] 24 | } else { 25 | if cfg.CurrentTime.IsZero() { 26 | newDay = time.Now().UTC().Day() 27 | } else { 28 | newDay = cfg.CurrentTime.Day() 29 | } 30 | } 31 | } 32 | 33 | // Make sure new day is not bigger than max day 34 | lastDayOfMonth := dateutil.GetLastDayOfMonth(t.Year(), int(t.Month())) 35 | if newDay > lastDayOfMonth { 36 | newDay = lastDayOfMonth 37 | } 38 | 39 | return time.Date(t.Year(), t.Month(), newDay, 40 | t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), 41 | t.Location()) 42 | } 43 | -------------------------------------------------------------------------------- /internal/parser/common/apply-month.go: -------------------------------------------------------------------------------- 1 | package common 2 | 3 | import ( 4 | "time" 5 | 6 | "github.com/markusmobius/go-dateparser/internal/setting" 7 | ) 8 | 9 | func ApplyMonthFromConfig(cfg *setting.Configuration, t time.Time, currentMonth ...time.Month) time.Time { 10 | if cfg == nil { 11 | return t 12 | } 13 | 14 | var newMonth time.Month 15 | switch cfg.PreferredMonthOfYear { 16 | case setting.FirstMonth: 17 | newMonth = 1 18 | case setting.LastMonth: 19 | newMonth = 12 20 | default: // current day 21 | if len(currentMonth) > 0 { 22 | newMonth = time.Month(currentMonth[0]) 23 | } else { 24 | if cfg.CurrentTime.IsZero() { 25 | newMonth = time.Now().UTC().Month() 26 | } else { 27 | newMonth = cfg.CurrentTime.Month() 28 | } 29 | } 30 | } 31 | 32 | return time.Date(t.Year(), newMonth, t.Day(), 33 | t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), 34 | t.Location()) 35 | } 36 | -------------------------------------------------------------------------------- /internal/parser/common/strict-check.go: -------------------------------------------------------------------------------- 1 | package common 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/markusmobius/go-dateparser/internal/setting" 7 | "github.com/markusmobius/go-dateparser/internal/strutil" 8 | ) 9 | 10 | func CheckStrictParsing(cfg *setting.Configuration, missingParts strutil.Dict) error { 11 | // Read config 12 | var strictParsing bool 13 | var requiredParts []string 14 | if cfg != nil { 15 | strictParsing = cfg.StrictParsing 16 | requiredParts = cfg.RequiredParts 17 | } 18 | 19 | // If strict parsing enabled, make sure there are no missing parts 20 | if strictParsing && len(missingParts) > 0 { 21 | return fmt.Errorf("fields missing from date string: %s", missingParts) 22 | } 23 | 24 | // Check if there are any missing required parts 25 | for _, requiredPart := range requiredParts { 26 | if missingParts.Contain(requiredPart) { 27 | return fmt.Errorf("required part \"%s\" is missing", requiredPart) 28 | } 29 | } 30 | 31 | return nil 32 | } 33 | -------------------------------------------------------------------------------- /internal/parser/common/time.go: -------------------------------------------------------------------------------- 1 | package common 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | "time" 7 | 8 | "github.com/markusmobius/go-dateparser/date" 9 | ) 10 | 11 | // ParseTime parses the specified string using one of the common time formats. 12 | func ParseTime(s string) (time.Time, date.Period, error) { 13 | timeFormats := []struct { 14 | Pattern string 15 | Period date.Period 16 | }{ 17 | {"15:4:5", date.Second}, 18 | {"3:4:5 PM", date.Second}, 19 | {"15:4", date.Minute}, 20 | {"3:4 PM", date.Minute}, 21 | {"3 PM", date.Hour}, 22 | {"15:4:5.999999", date.Second}, 23 | {"3:4:5.999999 PM", date.Second}, 24 | {"15:4 PM", date.Minute}, 25 | } 26 | 27 | tmp := strings.TrimSpace(s) 28 | tmp = strings.ToUpper(tmp) 29 | for _, format := range timeFormats { 30 | t, err := time.Parse(format.Pattern, tmp) 31 | if err != nil { 32 | continue 33 | } 34 | 35 | return t, format.Period, nil 36 | } 37 | 38 | err := fmt.Errorf("%s doesn't seem to be a valid time", s) 39 | return time.Time{}, date.None, err 40 | } 41 | -------------------------------------------------------------------------------- /internal/parser/common/time_test.go: -------------------------------------------------------------------------------- 1 | package common 2 | 3 | import ( 4 | "testing" 5 | "time" 6 | 7 | "github.com/markusmobius/go-dateparser/date" 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | func TestParseTime(t *testing.T) { 12 | // Helper function 13 | isEqual := func(s string, hour, min, sec, msec int, expectedPeriod date.Period) { 14 | expectedTime := time.Date(0, 1, 1, hour, min, sec, msec*1_000, time.UTC) 15 | result, period, _ := ParseTime(s) 16 | assert.Equal(t, expectedTime, result, s) 17 | assert.Equal(t, expectedPeriod, period, s) 18 | } 19 | 20 | isZero := func(s string) { 21 | result, period, _ := ParseTime(s) 22 | assert.True(t, result.IsZero(), s) 23 | assert.Equal(t, date.None, period) 24 | } 25 | 26 | // Time should be parsed 27 | isEqual("11:30:14", 11, 30, 14, 0, date.Second) 28 | isEqual("11:30", 11, 30, 0, 0, date.Minute) 29 | isEqual("11:30 PM", 23, 30, 0, 0, date.Minute) 30 | isEqual("13:30 PM", 13, 30, 0, 0, date.Minute) 31 | isEqual("16:14 AM", 16, 14, 0, 0, date.Minute) 32 | isEqual("23:30 AM", 23, 30, 0, 0, date.Minute) 33 | isEqual("1:30 AM", 1, 30, 0, 0, date.Minute) 34 | isEqual("1:30:15.330 AM", 1, 30, 15, 330000, date.Second) 35 | isEqual("1:30:15.330 PM", 13, 30, 15, 330000, date.Second) 36 | isEqual("1:30:15.3301 PM", 13, 30, 15, 330100, date.Second) 37 | isEqual("11:20:05 AM", 11, 20, 5, 0, date.Second) 38 | isEqual("14:30:15.330100", 14, 30, 15, 330100, date.Second) 39 | isEqual("11 AM", 11, 0, 0, 0, date.Hour) 40 | isEqual("11 PM", 23, 0, 0, 0, date.Hour) 41 | 42 | // Time is invalid 43 | isZero("11") 44 | isZero("22:12:12 PM") 45 | isZero("22:12:10:16") 46 | isZero("10:14.123 PM") 47 | isZero("2:13:88") 48 | isZero("23:01:56.34 PM") 49 | isZero("2.45 PM") 50 | } 51 | -------------------------------------------------------------------------------- /internal/parser/formatted/parser.go: -------------------------------------------------------------------------------- 1 | package formatted 2 | 3 | import ( 4 | "strings" 5 | "time" 6 | 7 | "github.com/markusmobius/go-dateparser/date" 8 | "github.com/markusmobius/go-dateparser/internal/parser/common" 9 | "github.com/markusmobius/go-dateparser/internal/setting" 10 | "github.com/markusmobius/go-dateparser/internal/timezone" 11 | ) 12 | 13 | // Parse the specified string using one of the specified formats. 14 | func Parse(cfg *setting.Configuration, str string, formats ...string) date.Date { 15 | // Create initial period 16 | period := date.Day 17 | 18 | // Check if string contain timezone 19 | var timeLoc *time.Location 20 | if _, tzData := timezone.PopTzOffset(str); tzData.IsZero() { 21 | if cfg.DefaultTimezone != nil { 22 | timeLoc = cfg.DefaultTimezone 23 | } else { 24 | timeLoc = time.UTC 25 | } 26 | } else { 27 | timeLoc = time.FixedZone(tzData.Name, tzData.Offset) 28 | } 29 | 30 | // Fetch current time 31 | currentTime := time.Now().UTC() 32 | if !cfg.CurrentTime.IsZero() { 33 | currentTime = cfg.CurrentTime 34 | } 35 | 36 | // Try each format 37 | checker := time.Date(12, 3, 4, 5, 6, 7, 8, time.UTC) 38 | 39 | for _, format := range formats { 40 | // Parse time 41 | t, err := time.ParseInLocation(format, str, timeLoc) 42 | if err != nil { 43 | continue 44 | } 45 | 46 | // Check if format has day or month 47 | checkerText := checker.Format(format) 48 | formatHasDay := strings.Contains(checkerText, "4") 49 | formatHasMonth := strings.Contains(checkerText, "3") || strings.Contains(checkerText, "Mar") 50 | 51 | if !formatHasMonth && !formatHasDay { 52 | period = date.Year 53 | t = common.ApplyMonthFromConfig(cfg, t) 54 | t = common.ApplyDayFromConfig(cfg, t) 55 | } else if !formatHasMonth { 56 | period = date.Year 57 | t = common.ApplyMonthFromConfig(cfg, t) 58 | } else if !formatHasDay { 59 | period = date.Month 60 | t = common.ApplyDayFromConfig(cfg, t) 61 | } 62 | 63 | // Check if format has year 64 | if t.Year() == 0 { 65 | t = time.Date(currentTime.Year(), t.Month(), t.Day(), 66 | t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), 67 | t.Location()) 68 | } 69 | 70 | return date.Date{Time: t, Period: period} 71 | } 72 | 73 | return date.Date{} 74 | } 75 | -------------------------------------------------------------------------------- /internal/parser/formatted/parser_test.go: -------------------------------------------------------------------------------- 1 | package formatted 2 | 3 | import ( 4 | "testing" 5 | "time" 6 | 7 | "github.com/markusmobius/go-dateparser/date" 8 | "github.com/markusmobius/go-dateparser/internal/setting" 9 | "github.com/stretchr/testify/assert" 10 | ) 11 | 12 | func TestParse(t *testing.T) { 13 | // Helper function 14 | dateIsParsed := func(dt date.Date) { assert.NotZero(t, dt.Time) } 15 | dateIsNotParsed := func(dt date.Date) { assert.Zero(t, dt.Time) } 16 | dateAsExpected := func(dt date.Date, expected string, expectedFormat ...string) { 17 | dateIsParsed(dt) 18 | 19 | format := "2006-01-02" 20 | if len(expectedFormat) > 0 { 21 | format = expectedFormat[0] 22 | } 23 | 24 | str := dt.Time.Format(format) 25 | assert.Equal(t, expected, str) 26 | } 27 | 28 | // Prepare configuration 29 | cfg := setting.Configuration{ 30 | CurrentTime: time.Date(2015, 2, 4, 0, 0, 0, 0, time.UTC), 31 | } 32 | 33 | // No matching format, shouldn't be parsed 34 | dt := Parse(&cfg, "yesterday", "2006-01-02") 35 | dateIsNotParsed(dt) 36 | 37 | // Matching format, should be parsed 38 | dt = Parse(&cfg, "25-03-14", "02-01-06") 39 | dateAsExpected(dt, "2014-03-25") 40 | 41 | // Should use current year for dates without year 42 | dt = Parse(&cfg, "09.16", "01.02") 43 | dateAsExpected(dt, "2015-09-16") 44 | 45 | // Should use day from config for dates without day 46 | str, format := "August 2014", "January 2006" 47 | cfg = setting.Configuration{ 48 | CurrentTime: time.Date(2014, 8, 12, 0, 0, 0, 0, time.UTC), 49 | } 50 | 51 | cfg.PreferredDayOfMonth = setting.First 52 | dt = Parse(&cfg, str, format) 53 | dateAsExpected(dt, "2014-08-01") 54 | 55 | cfg.PreferredDayOfMonth = setting.Last 56 | dt = Parse(&cfg, str, format) 57 | dateAsExpected(dt, "2014-08-31") 58 | 59 | cfg.PreferredDayOfMonth = setting.Current 60 | dt = Parse(&cfg, str, format) 61 | dateAsExpected(dt, "2014-08-12") 62 | 63 | // Should use month from config for dates without month 64 | str, format = "2014", "2006" 65 | cfg = setting.Configuration{ 66 | CurrentTime: time.Date(2014, 7, 1, 0, 0, 0, 0, time.UTC), 67 | } 68 | 69 | cfg.PreferredMonthOfYear = setting.FirstMonth 70 | dt = Parse(&cfg, str, format) 71 | dateAsExpected(dt, "2014-01-01") 72 | 73 | cfg.PreferredMonthOfYear = setting.LastMonth 74 | dt = Parse(&cfg, str, format) 75 | dateAsExpected(dt, "2014-12-01") 76 | 77 | cfg.PreferredMonthOfYear = setting.CurrentMonth 78 | dt = Parse(&cfg, str, format) 79 | dateAsExpected(dt, "2014-07-01") 80 | } 81 | -------------------------------------------------------------------------------- /internal/parser/hijri/parser_test.go: -------------------------------------------------------------------------------- 1 | package hijri 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | "time" 7 | 8 | "github.com/markusmobius/go-dateparser/date" 9 | "github.com/markusmobius/go-dateparser/internal/setting" 10 | "github.com/stretchr/testify/assert" 11 | ) 12 | 13 | func TestParse(t *testing.T) { 14 | // Prepare scenarios 15 | type testScenario struct { 16 | Text string 17 | ExpectedTime time.Time 18 | } 19 | 20 | tests := []testScenario{ 21 | {"14-09-1432 هـ, 09:40 صباحاً", tt(2011, 8, 14, 9, 40)}, 22 | {"20-02-1430 هـ, 07:21 صباحاً", tt(2009, 2, 15, 7, 21)}, 23 | {"11-08-1434 هـ, 09:38 صباحاً", tt(2013, 6, 20, 9, 38)}, 24 | {" 17-01-1437 هـ 08:30 مساءً", tt(2015, 10, 30, 20, 30)}, 25 | {"29-02-1433 هـ, 06:22 صباحاً", tt(2012, 1, 23, 6, 22)}, 26 | {"04-03-1433 هـ, 10:08 مساءً", tt(2012, 1, 27, 22, 8)}, 27 | // Safar is only up to 29, so here parser should limit the day to 29. 28 | {"30-02-1433", tt(2012, 1, 23)}, 29 | // Handle two digit year 30 | {"30-02-33", tt(2012, 1, 23)}, 31 | {"10-03-90", tt(1970, 5, 16)}, 32 | } 33 | 34 | // Prepare config 35 | cfg := &setting.Configuration{ 36 | DateOrder: "DMY", 37 | } 38 | 39 | // Start tests 40 | nFailed := 0 41 | for _, test := range tests { 42 | // Prepare log message 43 | message := fmt.Sprintf("\"%s\" => \"%s\"", test.Text, 44 | test.ExpectedTime.Format("2006-01-02 15:04:05.999999")) 45 | 46 | // Parse text 47 | dt, _ := Parse(cfg, test.Text) 48 | if passed := assertResult(t, dt, test.ExpectedTime, date.Day, message); !passed { 49 | fmt.Println("\t\t\tGOT:", dt) 50 | nFailed++ 51 | } 52 | } 53 | 54 | if nFailed > 0 { 55 | fmt.Printf("Failed %d from %d tests\n", nFailed, len(tests)) 56 | } 57 | } 58 | 59 | func tt(Y, M, D int, times ...int) time.Time { 60 | nTimes := len(times) 61 | var H, m, s, ms int 62 | 63 | if nTimes >= 1 { 64 | H = times[0] 65 | } 66 | if nTimes >= 2 { 67 | m = times[1] 68 | } 69 | if nTimes >= 3 { 70 | s = times[2] 71 | } 72 | if nTimes >= 4 { 73 | ms = times[3] 74 | } 75 | 76 | return time.Date(Y, time.Month(M), D, H, m, s, ms*1000, time.UTC) 77 | } 78 | 79 | func assertResult(t *testing.T, dt date.Date, expectedTime time.Time, expectedPeriod date.Period, messages ...string) bool { 80 | var message string 81 | if len(messages) > 0 { 82 | message = messages[0] 83 | } 84 | 85 | passed := assert.False(t, dt.IsZero(), message) 86 | if passed { 87 | diff := expectedTime.Sub(dt.Time) 88 | passed = assert.Zero(t, diff, message) 89 | } 90 | 91 | if passed { 92 | passed = assert.Equal(t, expectedPeriod, dt.Period, message) 93 | } 94 | 95 | return passed 96 | } 97 | -------------------------------------------------------------------------------- /internal/parser/timestamp/parser.go: -------------------------------------------------------------------------------- 1 | package timestamp 2 | 3 | import ( 4 | "strconv" 5 | "time" 6 | 7 | "github.com/markusmobius/go-dateparser/date" 8 | "github.com/markusmobius/go-dateparser/internal/regexp" 9 | "github.com/markusmobius/go-dateparser/internal/setting" 10 | ) 11 | 12 | var ( 13 | rxTimestamp = regexp.MustCompile(`^(\d{10})(\d{3})?(\d{3})?(?:\.|\s|$)`) 14 | rxNegativeTimestamp = regexp.MustCompile(`^([-]\d{10})(\d{3})?(\d{3})?(?:\.|\s|$)`) 15 | ) 16 | 17 | // Parse parses the Unix timestamp. 18 | func Parse(cfg *setting.Configuration, str string, negative bool) date.Date { 19 | period := date.Day 20 | if cfg != nil && cfg.ReturnTimeAsPeriod { 21 | period = date.Second 22 | } 23 | 24 | var rx *regexp.Regexp 25 | if negative { 26 | rx = rxNegativeTimestamp 27 | } else { 28 | rx = rxTimestamp 29 | } 30 | 31 | parts := rx.FindStringSubmatch(str) 32 | if len(parts) > 0 { 33 | seconds, _ := strconv.ParseInt(parts[1], 10, 64) 34 | millis, _ := strconv.ParseInt(parts[2], 10, 64) 35 | micros, _ := strconv.ParseInt(parts[3], 10, 64) 36 | nanos := micros*1_000 + millis*1_000_000 37 | 38 | t := time.Unix(seconds, nanos) 39 | return date.Date{Time: t, Period: period} 40 | } 41 | 42 | return date.Date{} 43 | } 44 | -------------------------------------------------------------------------------- /internal/parser/timestamp/parser_test.go: -------------------------------------------------------------------------------- 1 | package timestamp 2 | 3 | import ( 4 | "testing" 5 | "time" 6 | 7 | "github.com/stretchr/testify/assert" 8 | ) 9 | 10 | func TestParse(t *testing.T) { 11 | // Prepare variables and helper function 12 | zero := time.Time{} 13 | parse := func(s string, negative ...bool) time.Time { 14 | var isNegative bool 15 | if len(negative) > 0 { 16 | isNegative = negative[0] 17 | } 18 | 19 | dt := Parse(nil, s, isNegative) 20 | return dt.Time 21 | } 22 | 23 | // Test milliseconds timestamp 24 | expected := time.Unix(1570308760, 263*1_000_000) 25 | assert.Equal(t, expected, parse("1570308760263")) 26 | 27 | // Test microseconds timestamp 28 | expected = time.Unix(1570308760, 263_111*1_000) 29 | assert.Equal(t, expected, parse("1570308760263111")) 30 | 31 | // Test negative timestamp 32 | expected = time.Unix(-1570308760, 0) 33 | assert.Equal(t, expected, parse("-1570308760", true)) 34 | assert.Equal(t, zero, parse("-1570308760", false)) 35 | assert.Equal(t, zero, parse("1570308760", true)) 36 | 37 | expected = time.Unix(1570308760, 0) 38 | assert.Equal(t, expected, parse("1570308760", false)) 39 | 40 | // Test wrong timestamp 41 | assert.Equal(t, zero, parse("15703087602631")) 42 | assert.Equal(t, zero, parse("157030876026xx")) 43 | assert.Equal(t, zero, parse("1570308760263x")) 44 | assert.Equal(t, zero, parse("157030876026311")) 45 | assert.Equal(t, zero, parse("15703087602631x")) 46 | assert.Equal(t, zero, parse("15703087602631xx")) 47 | assert.Equal(t, zero, parse("15703087602631111")) 48 | assert.Equal(t, zero, parse("1570308760263111x")) 49 | assert.Equal(t, zero, parse("1570308760263111xx")) 50 | assert.Equal(t, zero, parse("1570308760263111222")) 51 | } 52 | -------------------------------------------------------------------------------- /internal/parser/tokenizer/tokenizer.go: -------------------------------------------------------------------------------- 1 | package tokenizer 2 | 3 | import ( 4 | "unicode" 5 | 6 | "golang.org/x/text/unicode/rangetable" 7 | ) 8 | 9 | var ( 10 | digits = rangetable.New([]rune("1234567890:")...) 11 | letters = rangetable.New([]rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")...) 12 | ) 13 | 14 | type TokenType uint8 15 | 16 | const ( 17 | Null TokenType = iota 18 | Digit 19 | Letter 20 | Other 21 | ) 22 | 23 | type Token struct { 24 | Text string 25 | Type TokenType 26 | } 27 | 28 | func (t Token) IsEmpty() bool { 29 | return t.Text == "" && t.Type == 0 30 | } 31 | 32 | func Tokenize(str string) []Token { 33 | chars := []rune(str) 34 | switch len(chars) { 35 | case 0: 36 | return nil 37 | case 1: 38 | tokenType, _ := compareChars(chars[0], 0) 39 | return []Token{{str, tokenType}} 40 | } 41 | 42 | var tokens []Token 43 | text := []rune{chars[0]} 44 | for i := 1; i < len(chars); i++ { 45 | prev, current := chars[i-1], chars[i] 46 | tokenType, changed := compareChars(prev, current) 47 | if changed { 48 | tokens = append(tokens, Token{ 49 | Text: string(text), 50 | Type: tokenType, 51 | }) 52 | text = []rune{current} 53 | } else { 54 | text = append(text, current) 55 | } 56 | } 57 | 58 | if len(text) > 0 { 59 | tokenType, _ := compareChars(text[0], 0) 60 | tokens = append(tokens, Token{ 61 | Text: string(text), 62 | Type: tokenType, 63 | }) 64 | } 65 | 66 | return tokens 67 | } 68 | 69 | func compareChars(r1, r2 rune) (TokenType, bool) { 70 | r1IsDigit := unicode.Is(digits, r1) || r1 == ':' 71 | r2IsDigit := unicode.Is(digits, r2) || r2 == ':' 72 | r1IsLetter := unicode.Is(letters, r1) 73 | r2IsLetter := unicode.Is(letters, r2) 74 | 75 | if r1IsDigit { 76 | return Digit, !r2IsDigit 77 | } 78 | 79 | if r1IsLetter { 80 | return Letter, !r2IsLetter 81 | } 82 | 83 | return Other, r2IsDigit || r2IsLetter 84 | } 85 | -------------------------------------------------------------------------------- /internal/parser/tokenizer/tokenizer_test.go: -------------------------------------------------------------------------------- 1 | package tokenizer 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | ) 9 | 10 | func TestTokenize(t *testing.T) { 11 | // Helper functions 12 | sp := func(items ...string) []string { return items } 13 | tt := func(items ...TokenType) []TokenType { return items } 14 | 15 | fnTexts := func(tokens []Token) []string { 16 | var texts []string 17 | for i := range tokens { 18 | texts = append(texts, tokens[i].Text) 19 | } 20 | return texts 21 | } 22 | 23 | fnTypes := func(tokens []Token) []TokenType { 24 | var types []TokenType 25 | for i := range tokens { 26 | types = append(types, tokens[i].Type) 27 | } 28 | return types 29 | } 30 | 31 | // Prepare scenarios 32 | D, L, O := Digit, Letter, Other 33 | type testScenario struct { 34 | String string 35 | ExpectedTexts []string 36 | ExpectedTypes []TokenType 37 | } 38 | 39 | tests := []testScenario{{ 40 | "11 april 2010", 41 | sp("11", " ", "april", " ", "2010"), 42 | tt(D, O, L, O, D), 43 | }, { 44 | "Tuesday 11 april 2010", 45 | sp("Tuesday", " ", "11", " ", "april", " ", "2010"), 46 | tt(L, O, D, O, L, O, D), 47 | }, { 48 | "11/12-2013", 49 | sp("11", "/", "12", "-", "2013"), 50 | tt(D, O, D, O, D), 51 | }, { 52 | "11/12-2013", 53 | sp("11", "/", "12", "-", "2013"), 54 | tt(D, O, D, O, D), 55 | }, { 56 | "10:30:35 PM", 57 | sp("10:30:35", " ", "PM"), 58 | tt(D, O, L), 59 | }, { 60 | "18:50", 61 | sp("18:50"), 62 | tt(D), 63 | }, { 64 | "December 23, 2010, 16:50 pm", 65 | sp("December", " ", "23", ", ", "2010", ", ", "16:50", " ", "pm"), 66 | tt(L, O, D, O, D, O, D, O, L), 67 | }, { 68 | "Oct 1 2018 4:40 PM EST —", 69 | sp("Oct", " ", "1", " ", "2018", " ", "4:40", " ", "PM", " ", "EST", " —"), 70 | tt(L, O, D, O, D, O, D, O, L, O, L, O), 71 | }, { 72 | "0123456789", 73 | sp("0123456789"), 74 | tt(D), 75 | }, { 76 | "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 77 | sp("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 78 | tt(L), 79 | }, { 80 | "./\\()\"',.;<>~!@#$%^&*|+=[]{}`~?-—– 😊", // unrecognized characters 81 | sp("./\\()\"',.;<>~!@#$%^&*|+=[]{}`~?-—– 😊"), 82 | tt(O), 83 | }} 84 | 85 | // Start tests 86 | nFailed := 0 87 | for _, test := range tests { 88 | tokens := Tokenize(test.String) 89 | passed := assert.Equal(t, test.ExpectedTexts, fnTexts(tokens), test.String) 90 | if passed { 91 | passed = assert.Equal(t, test.ExpectedTypes, fnTypes(tokens), test.String) 92 | } 93 | 94 | if !passed { 95 | nFailed++ 96 | } 97 | } 98 | 99 | if nFailed > 0 { 100 | fmt.Printf("Failed %d from %d tests\n", nFailed, len(tests)) 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /internal/setting/config.go: -------------------------------------------------------------------------------- 1 | package setting 2 | 3 | import ( 4 | "slices" 5 | "time" 6 | ) 7 | 8 | type PreferredDateSource uint8 9 | 10 | const ( 11 | CurrentPeriod PreferredDateSource = iota 12 | Past 13 | Future 14 | ) 15 | 16 | type PreferredDayOfMonth uint8 17 | 18 | const ( 19 | Current PreferredDayOfMonth = iota 20 | First 21 | Last 22 | ) 23 | 24 | type PreferredMonthOfYear uint8 25 | 26 | const ( 27 | CurrentMonth PreferredMonthOfYear = iota 28 | FirstMonth 29 | LastMonth 30 | ) 31 | 32 | type Configuration struct { 33 | // Date order 34 | DateOrder string 35 | 36 | // Incomplete dates 37 | CurrentTime time.Time 38 | DefaultTimezone *time.Location 39 | PreferredDayOfMonth PreferredDayOfMonth 40 | PreferredMonthOfYear PreferredMonthOfYear 41 | PreferredDateSource PreferredDateSource 42 | StrictParsing bool 43 | RequiredParts []string 44 | 45 | // Language detection 46 | SkipTokens []string 47 | DefaultLanguages []string 48 | 49 | // Others 50 | ReturnTimeAsPeriod bool 51 | PreserveEndOfMonth bool 52 | } 53 | 54 | func (c Configuration) Clone() *Configuration { 55 | return &Configuration{ 56 | DateOrder: c.DateOrder, 57 | CurrentTime: c.CurrentTime, 58 | DefaultTimezone: c.DefaultTimezone, 59 | PreferredDayOfMonth: c.PreferredDayOfMonth, 60 | PreferredMonthOfYear: c.PreferredMonthOfYear, 61 | PreferredDateSource: c.PreferredDateSource, 62 | StrictParsing: c.StrictParsing, 63 | RequiredParts: slices.Clone(c.RequiredParts), 64 | SkipTokens: slices.Clone(c.SkipTokens), 65 | DefaultLanguages: slices.Clone(c.DefaultLanguages), 66 | ReturnTimeAsPeriod: c.ReturnTimeAsPeriod, 67 | PreserveEndOfMonth: c.PreserveEndOfMonth, 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /internal/strutil/dict.go: -------------------------------------------------------------------------------- 1 | package strutil 2 | 3 | import ( 4 | "sort" 5 | "strings" 6 | ) 7 | 8 | // Dict is a simple wrapper for `map[string]struct{}`. 9 | // Useful for keeping unique values. 10 | type Dict map[string]struct{} 11 | 12 | // NewDict returns a new Dict populated with the specified items. 13 | func NewDict(items ...string) Dict { 14 | dict := Dict{} 15 | for _, item := range items { 16 | dict[item] = struct{}{} 17 | } 18 | return dict 19 | } 20 | 21 | // Add add items into the Dict. If the Dict has not been initialized, 22 | // it will stop and items won't be added to Dict. 23 | func (d Dict) Add(items ...string) { 24 | if d == nil { 25 | return 26 | } 27 | 28 | for _, item := range items { 29 | d[item] = struct{}{} 30 | } 31 | } 32 | 33 | // Remove removes items from the Dict. 34 | func (d Dict) Remove(items ...string) { 35 | if d == nil { 36 | return 37 | } 38 | 39 | for _, item := range items { 40 | delete(d, item) 41 | } 42 | } 43 | 44 | // Contain checks if the specified item is registered inside the Dict. 45 | func (d Dict) Contain(item string) bool { 46 | _, exist := d[item] 47 | return exist 48 | } 49 | 50 | // Items returns the sorted items that registered in the Dict. 51 | func (d Dict) Items() []string { 52 | var items []string 53 | for item := range d { 54 | items = append(items, item) 55 | } 56 | sort.Strings(items) 57 | return items 58 | } 59 | 60 | // String returns the string representation of this Dict. 61 | func (d Dict) String() string { 62 | return strings.Join(d.Items(), ", ") 63 | } 64 | -------------------------------------------------------------------------------- /internal/strutil/strutil_test.go: -------------------------------------------------------------------------------- 1 | package strutil 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | ) 9 | 10 | func TestSanitizeDate(t *testing.T) { 11 | // Prepare scenarios 12 | type testScenario struct { 13 | Text string 14 | Expected string 15 | } 16 | 17 | tests := []testScenario{ 18 | {"2005г.", "2005"}, 19 | {"2005г. 20:37", "2005 20:37"}, 20 | {"2005 г.", "2005"}, 21 | {"2005 г. 15:24", "2005 15:24"}, 22 | {"Авг.", "Авг"}, 23 | {"2019:", "2019"}, 24 | {"31/07/2019:", "31/07/2019"}, 25 | } 26 | 27 | // Start test 28 | var nFailed int 29 | for _, test := range tests { 30 | // Prepare log message 31 | message := fmt.Sprintf("\"%s\" => \"%s\"", test.Text, test.Expected) 32 | 33 | // Sanitize text 34 | result := SanitizeDate(test.Text) 35 | passed := assert.Equal(t, test.Expected, result, message) 36 | if !passed { 37 | nFailed++ 38 | } 39 | } 40 | 41 | if nFailed > 0 { 42 | fmt.Printf("Failed %d from %d tests\n", nFailed, len(tests)) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /internal/timezone/loader.go: -------------------------------------------------------------------------------- 1 | package timezone 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | "time" 7 | ) 8 | 9 | // Load loads a timezone from the known timezone list and IANA database. 10 | // Returns error if the `name` is not found. 11 | func Load(name string) (*time.Location, error) { 12 | // Check if name exists in known timezone list 13 | upperName := strings.ToUpper(name) 14 | for _, info := range timezoneInfoList { 15 | if offset, exist := info.Timezones[upperName]; exist { 16 | return time.FixedZone(name, offset), nil 17 | } 18 | } 19 | 20 | // Try to look up from IANA Time Zone database 21 | loc, err := time.LoadLocation(name) 22 | if err == nil && loc != nil { 23 | return loc, nil 24 | } 25 | 26 | // Try to pop timezone 27 | _, tz := PopTzOffset(" " + name) 28 | if !tz.IsZero() { 29 | return time.FixedZone(name, tz.Offset), nil 30 | } 31 | 32 | return time.UTC, fmt.Errorf("%s is not a known timezone", name) 33 | } 34 | 35 | // MustLoad is like `Load`, except it will return `nil` if no timezone found. 36 | func MustLoad(name string) *time.Location { 37 | loc, err := Load(name) 38 | if loc == nil || err != nil { 39 | return time.UTC 40 | } 41 | return loc 42 | } 43 | -------------------------------------------------------------------------------- /internal/timezone/parser.go: -------------------------------------------------------------------------------- 1 | package timezone 2 | 3 | // PopTzOffset extracts timezone data from str then return the 4 | // str with the timezone code removed. 5 | func PopTzOffset(str string) (string, OffsetData) { 6 | if rxSearchIgnoreCase.MatchString(str) { 7 | for _, offsetData := range timezoneOffsets { 8 | idxs := offsetData.Regex.FindStringIndex(str) 9 | if len(idxs) == 0 { 10 | continue 11 | } 12 | 13 | str = str[:idxs[0]+1] + str[idxs[1]:] 14 | return str, offsetData 15 | } 16 | } 17 | 18 | return str, OffsetData{} 19 | } 20 | 21 | // WordIsTz check if the specified word is a timezone code. 22 | func WordIsTz(word string) bool { 23 | return rxSearch.MatchString(word) 24 | } 25 | -------------------------------------------------------------------------------- /internal/timezone/tz-offsets.go: -------------------------------------------------------------------------------- 1 | package timezone 2 | 3 | import ( 4 | "fmt" 5 | "sort" 6 | "strings" 7 | 8 | "github.com/markusmobius/go-dateparser/internal/regexp" 9 | ) 10 | 11 | type OffsetData struct { 12 | Name string 13 | Regex *regexp.Regexp 14 | Offset int 15 | } 16 | 17 | func (tod OffsetData) IsZero() bool { 18 | return tod.Name == "" && tod.Regex == nil && tod.Offset == 0 19 | } 20 | 21 | var timezoneOffsets, rxSearch, rxSearchIgnoreCase = func() ([]OffsetData, *regexp.Regexp, *regexp.Regexp) { 22 | // Process timezone info list 23 | offsets := []OffsetData{} 24 | regexPatterns := map[string]struct{}{} 25 | searchPatterns := map[string]struct{}{} 26 | 27 | for _, tzInfo := range timezoneInfoList { 28 | for _, pattern := range tzInfo.RegexPatterns { 29 | // Main pattern 30 | for tzName, offset := range tzInfo.Timezones { 31 | searchPattern := regexp.QuoteMeta(tzName) 32 | regexPattern := fmt.Sprintf(pattern, searchPattern) 33 | if _, exist := regexPatterns[regexPattern]; exist { 34 | continue 35 | } 36 | 37 | searchPatterns[searchPattern] = struct{}{} 38 | offsets = append(offsets, OffsetData{ 39 | Name: tzName, 40 | Regex: regexp.MustCompile(`(?i)` + regexPattern), 41 | Offset: offset, 42 | }) 43 | } 44 | 45 | // Alternative patterns 46 | for replacer, replacement := range tzInfo.AlternativePatterns { 47 | for tzName, offset := range tzInfo.Timezones { 48 | searchPattern := regexp.QuoteMeta(tzName) 49 | searchPattern = replacer.ReplaceAllString(searchPattern, replacement) 50 | regexPattern := fmt.Sprintf(pattern, searchPattern) 51 | if _, exist := regexPatterns[regexPattern]; exist { 52 | continue 53 | } 54 | 55 | searchPatterns[searchPattern] = struct{}{} 56 | offsets = append(offsets, OffsetData{ 57 | Name: tzName, 58 | Regex: regexp.MustCompile(`(?i)` + regexPattern), 59 | Offset: offset, 60 | }) 61 | } 62 | } 63 | } 64 | } 65 | 66 | // Generate regex for searching 67 | var patterns []string 68 | for pattern := range searchPatterns { 69 | patterns = append(patterns, pattern) 70 | } 71 | 72 | sort.Strings(patterns) 73 | strSearchPatterns := strings.Join(patterns, "|") 74 | 75 | rxSearch := regexp.MustCompile(strSearchPatterns) 76 | rxSearchIgnoreCase := regexp.MustCompile("(?i)" + strSearchPatterns) 77 | return offsets, rxSearch, rxSearchIgnoreCase 78 | }() 79 | -------------------------------------------------------------------------------- /jalali-parser.go: -------------------------------------------------------------------------------- 1 | package dateparser 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/markusmobius/go-dateparser/date" 7 | "github.com/markusmobius/go-dateparser/internal/parser/jalali" 8 | ) 9 | 10 | // ParseJalali parses a Jalali date (which also called Persian or Solar 11 | // Hijri date) which commonly used in Iran and Afghanistan. 12 | func ParseJalali(cfg *Configuration, str string) (date.Date, error) { 13 | // Prepare config 14 | if cfg == nil { 15 | cfg = &Configuration{} 16 | } 17 | 18 | // Iran and Afghanistan mostly uses DMY format, 19 | // so here it used as default. 20 | dateOrder := "DMY" 21 | if cfg.DateOrder != nil { 22 | do := cfg.DateOrder("") 23 | if do, valid := validateDateOrder(do); valid { 24 | dateOrder = do 25 | } 26 | } 27 | 28 | cfg = cfg.initiate() 29 | err := cfg.validate() 30 | if err != nil { 31 | return date.Date{}, fmt.Errorf("config error: %w", err) 32 | } 33 | 34 | // Start parser 35 | iCfg := cfg.toInternalConfig() 36 | iCfg.DateOrder = dateOrder 37 | return jalali.Parse(iCfg, str) 38 | } 39 | -------------------------------------------------------------------------------- /root.go: -------------------------------------------------------------------------------- 1 | package dateparser 2 | 3 | import ( 4 | "github.com/markusmobius/go-dateparser/date" 5 | "github.com/markusmobius/go-dateparser/internal/data" 6 | "github.com/markusmobius/go-dateparser/internal/timezone" 7 | ) 8 | 9 | var defaultParser = &Parser{} 10 | 11 | // Parse parses string representing date and/or time in recognizable localized formats, 12 | // using the default Parser. Useful for quick use. 13 | func Parse(cfg *Configuration, str string, formats ...string) (date.Date, error) { 14 | return defaultParser.Parse(cfg, str, formats...) 15 | } 16 | 17 | // Search detect the suitable language of the text, then find all substrings of the given 18 | // string which represent date and/or time and parse them using the default parser. Useful 19 | // for quick use. 20 | func Search(cfg *Configuration, text string) (string, []SearchResult, error) { 21 | return defaultParser.Search(cfg, text) 22 | } 23 | 24 | // IsKnownLocale is helper function to check if the specified locale or language can be parsed 25 | // by the Parser. The code must be in ISO639 format. 26 | func IsKnownLocale(code string) bool { 27 | _, exist := data.GetLocaleData(code) 28 | return exist 29 | } 30 | 31 | // PopTzOffset is helper function to extracts timezone data from str then return the 32 | // str with the timezone code removed. 33 | func PopTzOffset(str string) (cleanStr string, tzName string, tzOffset int) { 34 | cleanStr, data := timezone.PopTzOffset(str) 35 | tzName, tzOffset = data.Name, data.Offset 36 | return 37 | } 38 | -------------------------------------------------------------------------------- /scripts/codegen/01-logger.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | 6 | "github.com/rs/zerolog" 7 | ) 8 | 9 | var log = zerolog.New(zerolog.ConsoleWriter{ 10 | Out: os.Stderr, 11 | TimeFormat: "15:04:05", 12 | }).With().Timestamp().Logger() 13 | -------------------------------------------------------------------------------- /scripts/codegen/03-model-cldr-territory.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | type CldrTerritoryData struct { 4 | Supplemental struct { 5 | TerritoryInfo map[string]struct { 6 | Gdp string `json:"_gdp"` 7 | LiteracyPercent string `json:"_literacyPercent"` 8 | Population string `json:"_population"` 9 | LanguagePopulation map[string]struct { 10 | PopulationPercent string `json:"_populationPercent"` 11 | OfficialStatus string `json:"_officialStatus"` 12 | } `json:"languagePopulation"` 13 | } `json:"territoryInfo"` 14 | } `json:"supplemental"` 15 | } 16 | -------------------------------------------------------------------------------- /scripts/codegen/code-generator.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "go/format" 6 | "os" 7 | ) 8 | 9 | func generateCode(tplName string, data any, dstPath string) error { 10 | // Generate code 11 | b := bytes.NewBuffer(nil) 12 | err := templates[tplName].Execute(b, data) 13 | if err != nil { 14 | return err 15 | } 16 | 17 | // Format code 18 | code, err := format.Source(b.Bytes()) 19 | if err != nil { 20 | return err 21 | } 22 | 23 | // Save to file 24 | return os.WriteFile(dstPath, code, os.ModePerm) 25 | } 26 | 27 | func generateLocaleDataCode(dstPath string, listData []LocaleData) error { 28 | // Generate code 29 | b := bytes.NewBuffer(nil) 30 | b.WriteString(` 31 | // Code is generated by script; DO NOT EDIT. 32 | 33 | package data 34 | import "github.com/markusmobius/go-dateparser/internal/regexp" 35 | `) 36 | 37 | // Generate locale data 38 | err := templates["locale-data"].Execute(b, &listData) 39 | if err != nil { 40 | return err 41 | } 42 | 43 | // Remove empty fields 44 | code := b.Bytes() 45 | code = rxGoEmptyField.ReplaceAll(code, []byte("")) 46 | code = rxGoZeroField.ReplaceAll(code, []byte("")) 47 | 48 | // Format code 49 | code, err = format.Source(code) 50 | if err != nil { 51 | return err 52 | } 53 | 54 | nRegex := bytes.Count(code, []byte("regexp")) 55 | if nRegex <= 1 { 56 | code = rxGoRegexImport.ReplaceAll(code, []byte("")) 57 | } 58 | 59 | // Save to file 60 | return os.WriteFile(dstPath, code, os.ModePerm) 61 | } 62 | -------------------------------------------------------------------------------- /scripts/codegen/language-locales.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | "path/filepath" 6 | "strings" 7 | 8 | "github.com/zyedidia/generic/mapset" 9 | ) 10 | 11 | func createLanguageLocales() (map[string][]string, error) { 12 | cldrDatesFullDir := filepath.Join(RAW_DIR, "cldr-dates-full", "main") 13 | 14 | // Fetch all CLDR languages and their locales 15 | dirItems, err := os.ReadDir(cldrDatesFullDir) 16 | if err != nil { 17 | return nil, err 18 | } 19 | 20 | languageNames := mapset.New[string]() 21 | languageLocales := map[string][]string{} 22 | for _, item := range dirItems { 23 | if !item.IsDir() { 24 | continue 25 | } 26 | 27 | // Check if dir name contains locale. If false, then this locale is the 28 | // "language" which will become parents for several sub-locales. 29 | name := item.Name() 30 | locale := rxLocale.FindString(name) 31 | 32 | if locale == "" { 33 | languageNames.Put(name) 34 | if _, exist := languageLocales[name]; !exist { 35 | languageLocales[name] = []string{} 36 | } 37 | } else { 38 | language := strings.TrimSuffix(name, locale) 39 | languageLocales[language] = append(languageLocales[language], name) 40 | } 41 | } 42 | 43 | // Remove invalid or excluded language 44 | for language := range languageLocales { 45 | isValid := languageNames.Has(language) 46 | _, isExcluded := excludedLanguages[language] 47 | if !isValid || isExcluded || language == "root" { 48 | delete(languageLocales, language) 49 | } 50 | } 51 | 52 | // Add supplementary languages to the map 53 | supplementaryLanguages, err := getSupplementaryLanguages() 54 | if err != nil { 55 | return nil, err 56 | } 57 | 58 | for _, language := range supplementaryLanguages { 59 | if _, exist := languageLocales[language]; !exist { 60 | languageLocales[language] = []string{} 61 | } 62 | } 63 | 64 | return languageLocales, nil 65 | } 66 | 67 | func getSupplementaryLanguages() ([]string, error) { 68 | dirItems, err := os.ReadDir(SUPPLEMENTARY_DIR) 69 | if err != nil { 70 | return nil, err 71 | } 72 | 73 | var languages []string 74 | for _, item := range dirItems { 75 | if item.IsDir() { 76 | continue 77 | } 78 | 79 | name := item.Name() 80 | ext := filepath.Ext(name) 81 | if ext != ".yaml" { 82 | continue 83 | } 84 | 85 | name = strings.TrimSuffix(name, ext) 86 | languages = append(languages, name) 87 | } 88 | 89 | return languages, nil 90 | } 91 | -------------------------------------------------------------------------------- /scripts/codegen/language-map.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "strings" 4 | 5 | func createLanguageMap(languageOrder []string) map[string][]string { 6 | languageMap := map[string][]string{} 7 | 8 | for _, language := range languageOrder { 9 | key := language 10 | if strings.Contains(key, "-") { 11 | key = rxLocaleCleaner.ReplaceAllString(key, "") 12 | } 13 | languageMap[key] = append(languageMap[key], language) 14 | } 15 | 16 | return languageMap 17 | } 18 | -------------------------------------------------------------------------------- /scripts/codegen/locale-order.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | func createLocaleOrder(languageLocales map[string][]string, languageOrder []string) map[string]int { 4 | // Create language order map 5 | languageOrders := map[string]int{} 6 | for i, language := range languageOrder { 7 | languageOrders[language] = i 8 | } 9 | 10 | // Create locale order 11 | localeOrders := map[string]int{} 12 | for language, locales := range languageLocales { 13 | localeOrders[language] = languageOrders[language] 14 | for _, locale := range locales { 15 | localeOrders[locale] = languageOrders[language] 16 | } 17 | } 18 | 19 | return localeOrders 20 | } 21 | -------------------------------------------------------------------------------- /scripts/codegen/raw-downloader.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "io" 5 | "net/http" 6 | "os" 7 | "path" 8 | "path/filepath" 9 | "strings" 10 | 11 | "github.com/go-git/go-git/v5" 12 | "github.com/go-git/go-git/v5/plumbing" 13 | ) 14 | 15 | func downloadRawData() error { 16 | os.RemoveAll(RAW_DIR) 17 | 18 | err := downloadCldrData() 19 | if err != nil { 20 | return err 21 | } 22 | 23 | err = downloadW3ContentLanguage() 24 | return err 25 | } 26 | 27 | func downloadCldrData() error { 28 | // Fetch data from CLDR repository 29 | repos := []string{ 30 | "https://github.com/unicode-cldr/cldr-dates-full.git", 31 | "https://github.com/unicode-cldr/cldr-core.git", 32 | "https://github.com/unicode-cldr/cldr-rbnf.git", 33 | } 34 | 35 | for _, repo := range repos { 36 | dirName := strings.TrimSuffix(path.Base(repo), ".git") 37 | dstDir := filepath.Join(RAW_DIR, dirName) 38 | 39 | log.Info().Msgf("cloning %s from %s", dirName, repo) 40 | _, err := git.PlainClone(dstDir, false, &git.CloneOptions{ 41 | URL: repo, 42 | Depth: 1, 43 | SingleBranch: true, 44 | ReferenceName: plumbing.NewTagReferenceName(CLDR_VERSION)}) 45 | if err != nil { 46 | return err 47 | } 48 | } 49 | 50 | return nil 51 | } 52 | 53 | func downloadW3ContentLanguage() error { 54 | // Prepare dst dir 55 | dstDir := filepath.Join(RAW_DIR, "w3techs") 56 | err := os.MkdirAll(dstDir, os.ModePerm) 57 | if err != nil { 58 | return err 59 | } 60 | 61 | // Download page 62 | url := "https://w3techs.com/technologies/overview/content_language" 63 | resp, err := http.DefaultClient.Get(url) 64 | if err != nil { 65 | return err 66 | } 67 | defer resp.Body.Close() 68 | 69 | // Save to file 70 | bt, err := io.ReadAll(resp.Body) 71 | if err != nil { 72 | return err 73 | } 74 | 75 | dstPath := filepath.Join(dstDir, "content_language.html") 76 | return os.WriteFile(dstPath, bt, os.ModePerm) 77 | } 78 | -------------------------------------------------------------------------------- /scripts/digit/templates.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "text/template" 4 | 5 | var tpl = template.Must(template.New("").Parse(codeTemplate)) 6 | 7 | const codeTemplate = ` 8 | // Code is generated by scripts/digit; DO NOT EDIT. 9 | 10 | package digit 11 | 12 | import ( 13 | "unicode" 14 | ) 15 | 16 | // NormalizeString converts non latin digit to its latin counterpart. 17 | // For example, '١' will be converted into '1'. 18 | func NormalizeString(str string) string { 19 | lastUsedRange := -1 20 | runes := []rune(str) 21 | for i, r := range runes { 22 | // If it's not digit, don't change it 23 | if !unicode.IsDigit(r) { 24 | continue 25 | } 26 | 27 | // If we previously already used a range, try to use it again 28 | if lastUsedRange > 0 { 29 | if number, ok := allDigitRanges[lastUsedRange].apply(r); ok { 30 | runes[i] = number 31 | continue 32 | } 33 | } 34 | 35 | // If not, try every digit range 36 | for j := range allDigitRanges { 37 | if number, ok := allDigitRanges[j].apply(r); ok { 38 | runes[i] = number 39 | lastUsedRange = j 40 | break 41 | } 42 | } 43 | } 44 | 45 | return string(runes) 46 | } 47 | 48 | type digitRange struct { 49 | Start rune 50 | End rune 51 | } 52 | 53 | func (dr digitRange) apply(r rune) (rune, bool) { 54 | if r >= dr.Start && r <= dr.End { 55 | number := int32(r - dr.Start) 56 | return '0' + number, true 57 | } 58 | 59 | return r, false 60 | } 61 | 62 | var allDigitRanges = []digitRange{ 63 | {{range $data := . -}} 64 | {'{{$data.Start}}', '{{$data.End}}'}, // {{$data.Name}} 65 | {{end -}} 66 | } 67 | ` 68 | -------------------------------------------------------------------------------- /util_test.go: -------------------------------------------------------------------------------- 1 | package dateparser_test 2 | 3 | import ( 4 | "testing" 5 | "time" 6 | 7 | "github.com/markusmobius/go-dateparser/date" 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | func tt(Y, M, D int, times ...int) time.Time { 12 | nTimes := len(times) 13 | var H, m, s, ms int 14 | 15 | if nTimes >= 1 { 16 | H = times[0] 17 | } 18 | if nTimes >= 2 { 19 | m = times[1] 20 | } 21 | if nTimes >= 3 { 22 | s = times[2] 23 | } 24 | if nTimes >= 4 { 25 | ms = times[3] 26 | } 27 | 28 | return time.Date(Y, time.Month(M), D, H, m, s, ms*1000, time.UTC) 29 | } 30 | 31 | func assertParseResult(t *testing.T, dt date.Date, expectedTime time.Time, expectedPeriod date.Period, messages ...string) bool { 32 | var message string 33 | if len(messages) > 0 { 34 | message = messages[0] 35 | } 36 | 37 | passed := assert.False(t, dt.IsZero(), message) 38 | if passed { 39 | diff := expectedTime.Sub(dt.Time) 40 | passed = assert.Zero(t, diff, message) 41 | } 42 | 43 | if passed { 44 | passed = assert.Equal(t, expectedPeriod, dt.Period, message) 45 | } 46 | 47 | return passed 48 | } 49 | --------------------------------------------------------------------------------