Translated all computed holidays from English into German and added HolidayHelpers to reduce code duplication.

Summary: Added German langauage support for all computed holidays currently supported in English. Also created HolidayHelpers, which contains more complex holiday calculations used across languages.

Reviewed By: patapizza

Differential Revision: D17386163

fbshipit-source-id: 9dd88f8b0d699e5d7254a5ba7114bfa01b15176a
This commit is contained in:
Michael Voegele 2019-09-20 18:16:00 -07:00 committed by Facebook Github Bot
parent 71e1b9760d
commit 4218897f64
7 changed files with 1571 additions and 241 deletions

File diff suppressed because it is too large Load Diff

View File

@ -689,4 +689,438 @@ allExamples = concat
[ "am vierten Dezember"
, "der vierte Dezember"
]
, examples (datetimeHoliday (2014, 1, 31, 0, 0, 0) Day "Chinesisches Neujahr")
[ "Chinesisches Neujahr"
, "Chinesisches Frühlingsfest"
, "Chinesisches Neujahrsfest"
]
, examples (datetimeHoliday (2018, 2, 16, 0, 0, 0) Day "Chinesisches Neujahr")
[ "Chinesisches Neujahr 2018"
]
, examples (datetimeHoliday (2018, 9, 18, 0, 0, 0) Day "Jom Kippur")
[ "Jom Kippur 2018"
, "Yom Kippur 2018"
]
, examples (datetimeHoliday (2018, 9, 30, 0, 0, 0) Day "Schmini Azeret")
[ "Schmini Azeret 2018"
, "Schemini Azeret 2018"
, "Shemini Atzeret 2018"
]
, examples (datetimeHoliday (2018, 10, 1, 0, 0, 0) Day "Simchat Torah")
[ "simchat torah 2018"
]
, examples (datetimeHoliday (2018, 7, 21, 0, 0, 0) Day "Tisha B'Av")
[ "tisha b'av 2018"
]
, examples (datetimeHoliday (2018, 4, 18, 0, 0, 0) Day "Jom Ha'atzmaut")
[ "Jom Haatzmaut 2018"
, "Yom Haatzmaut 2018"
, "Yom Ha'atzmaut 2018"
]
, examples (datetimeHoliday (2017, 5, 13, 0, 0, 0) Day "Lag BaOmer")
[ "Lag BaOmer 2017"
, "Lag LaOmer 2017"
]
, examples (datetimeHoliday (2018, 4, 11, 0, 0, 0) Day "Jom HaShoah")
[ "Jom HaShoah 2018"
, "Yom HaShoah 2018"
, "Holocaustgedenktag 2018"
, "Holocaust-Gedenktag 2018"
]
, examples (datetimeIntervalHoliday ((2018, 9, 9, 0, 0, 0), (2018, 9, 12, 0, 0, 0)) Day "Rosch haSchana")
[ "Rosch haSchana 2018"
, "Rosch ha-Schana 2018"
, "Rosch ha-Schanah 2018"
]
, examples (datetimeIntervalHoliday ((2018, 12, 2, 0, 0, 0), (2018, 12, 10, 0, 0, 0)) Day "Chanukka")
[ "Chanukka 2018"
, "Hanukkah 2018"
]
, examples (datetimeIntervalHoliday ((2018, 3, 30, 0, 0, 0), (2018, 4, 8, 0, 0, 0)) Day "Pessach")
[ "Passover 2018"
, "Pessach 2018"
, "Passa 2018"
, "Passah 2018"
, "Pascha 2018"
]
, examples (datetimeIntervalHoliday ((2018, 9, 23, 0, 0, 0), (2018, 10, 2, 0, 0, 0)) Day "Sukkot")
[ "Laubhüttenfest 2018"
, "Sukkot 2018"
]
, examples (datetimeIntervalHoliday ((2018, 5, 19, 0, 0, 0), (2018, 5, 22, 0, 0, 0)) Day "Schawuot")
[ "Shavuot 2018"
, "Schawuot 2018"
]
, examples (datetimeHoliday (2017, 11, 30, 0, 0, 0) Day "Maulid an-Nabī")
[ "Mawlid al-Nabawi 2017"
, "Maulid an-Nabī 2017"
]
, examples (datetimeHoliday (1950, 7, 16, 0, 0, 0) Day "Eid al-Fitr")
[ "Eid al-Fitr 1950"
]
, examples (datetimeHoliday (1975, 10, 6, 0, 0, 0) Day "Eid al-Fitr")
[ "Eid al-Fitr 1975"
]
, examples (datetimeHoliday (1988, 5, 16, 0, 0, 0) Day "Eid al-Fitr")
[ "Eid al-Fitr 1988"
]
, examples (datetimeHoliday (2018, 6, 15, 0, 0, 0) Day "Eid al-Fitr")
[ "Eid al-Fitr 2018"
]
, examples (datetimeHoliday (2034, 12, 12, 0, 0, 0) Day "Eid al-Fitr")
[ "Eid al-Fitr 2034"
]
, examples (datetimeHoliday (2046, 8, 4, 0, 0, 0) Day "Eid al-Fitr")
[ "Eid al-Fitr 2046"
]
, examples (datetimeHoliday (2050, 6, 21, 0, 0, 0) Day "Eid al-Fitr")
[ "Eid al-Fitr 2050"
]
, examples (datetimeHoliday (2018, 8, 21, 0, 0, 0) Day "Eid al-Adha")
[ "Eid al-Adha 2018"
, "id ul-adha 2018"
, "Opferfest 2018"
, "Bakr Id 2018"
]
, examples (datetimeHoliday (1980, 10, 19, 0, 0, 0) Day "Eid al-Adha")
[ "Eid al-Adha 1980"
, "id ul-adha 1980"
, "Opferfest 1980"
, "Bakr Id 1980"
]
, examples (datetimeHoliday (1966, 4, 1, 0, 0, 0) Day "Eid al-Adha")
[ "Eid al-Adha 1966"
, "id ul-adha 1966"
, "Opferfest 1966"
, "Bakr Id 1966"
]
, examples (datetimeHoliday (1974, 1, 3, 0, 0, 0) Day "Eid al-Adha")
[ "Eid al-Adha 1974"
, "id ul-adha 1974"
, "Opferfest 1974"
, "Bakr Id 1974"
]
, examples (datetimeHoliday (2017, 6, 22, 0, 0, 0) Day "Lailat al-Qadr")
[ "laylat al kadr 2017"
, "die Nacht der Bestimmung 2017"
, "Laylat al-Qadr 2017"
, "Lailat al-Qadr 2017"
]
, examples (datetimeHoliday (2018, 6, 11, 0, 0, 0) Day "Lailat al-Qadr")
[ "laylat al-qadr 2018"
, "die Nacht der Allmacht 2018"
, "Laylat al-Qadr 2018"
, "Lailat al-Qadr 2018"
]
, examples (datetimeHoliday (2018, 9, 11, 0, 0, 0) Day "Islamisches Neujahr")
[ "Islamisches Neujahr 2018"
, "Amun Jadid 2018"
]
, examples (datetimeHoliday (2017, 9, 30, 0, 0, 0) Day "Aschura")
[ "Aschura-Tag 2017"
, "Aschura 2017"
, "Ashura 2017"
]
, examples (datetimeHoliday (2018, 1, 30, 0, 0, 0) Day "Tu biSchevat")
[ "Tu BiShvat 2018"
, "Tu biSchevat 2018"
]
, examples (datetimeHoliday (2017, 6, 23, 0, 0, 0) Day "Jumu'atul-Wida")
[ "Jamat Ul-Vida 2017"
, "Jumu'atul-Wida 2017"
]
, examples (datetimeHoliday (2018, 6, 8, 0, 0, 0) Day "Jumu'atul-Wida")
[ "Jamat Ul-Vida 2018"
, "Jumu'atul-Wida 2018"
]
, examples (datetimeHoliday (2018, 4, 13, 0, 0, 0) Day "Isra and Mi'raj")
[ "isra and mi'raj 2018"
, "Aufstieg des Propheten 2018"
]
, examples (datetimeHoliday (2019, 4, 3, 0, 0, 0) Day "Isra and Mi'raj")
[ "Die Nachtreise 2019"
, "Aufstieg in den Himmel 2019"
]
, examples (datetimeIntervalHoliday ((1950, 6, 17, 0, 0, 0), (1950, 7, 16, 0, 0, 0)) Day "Ramadan")
[ "Ramadan 1950"
]
, examples (datetimeIntervalHoliday ((1977, 8, 15, 0, 0, 0), (1977, 9, 14, 0, 0, 0)) Day "Ramadan")
[ "Ramadan 1977"
]
, examples (datetimeIntervalHoliday ((2018, 5, 16, 0, 0, 0), (2018, 6, 15, 0, 0, 0)) Day "Ramadan")
[ "Ramadan 2018"
]
, examples (datetimeIntervalHoliday ((2034, 11, 12, 0, 0, 0), (2034, 12, 12, 0, 0, 0)) Day "Ramadan")
[ "Ramadan 2034"
]
, examples (datetimeIntervalHoliday ((2046, 7, 5, 0, 0, 0), (2046, 8, 4, 0, 0, 0)) Day "Ramadan")
[ "Ramadan 2046"
]
, examples (datetimeIntervalHoliday ((2050, 5, 22, 0, 0, 0), (2050, 6, 21, 0, 0, 0)) Day "Ramadan")
[ "Ramadan 2050"
]
, examples (datetimeHoliday (2017, 10, 17, 0, 0, 0) Day "Dhanteras")
[ "Dhanatrayodashi 2017"
]
, examples (datetimeHoliday (2019, 10, 25, 0, 0, 0) Day "Dhanteras")
[ "Dhanteras 2019"
]
, examples (datetimeHoliday (2019, 10, 26, 0, 0, 0) Day "Naraka Chaturdashi")
[ "kali chaudas 2019"
, "choti diwali 2019"
]
, examples (datetimeHoliday (2019, 10, 27, 0, 0, 0) Day "Diwali")
[ "diwali 2019"
, "Deepavali 2019"
, "Lakshmi Puja 2019"
]
, examples (datetimeHoliday (2019, 10, 29, 0, 0, 0) Day "Bhai Dooj")
[ "bhai dooj 2019"
]
, examples (datetimeHoliday (2019, 11, 2, 0, 0, 0) Day "Chhath")
[ "chhath 2019"
, "dala puja 2019"
, "Surya Shashthi 2019"
]
, examples (datetimeHoliday (2021, 10, 14, 0, 0, 0) Day "Maha Navami")
[ "Maha Navami 2021"
]
, examples (datetimeHoliday (2021, 10, 12, 0, 0, 0) Day "Maha Saptami")
[ "Maha Saptami 2021"
]
, examples (datetimeHoliday (2018, 10, 18, 0, 0, 0) Day "Vijayadashami")
[ "Dussehra 2018"
, "vijayadashami 2018"
]
, examples (datetimeIntervalHoliday ((2018, 10, 9, 0, 0, 0), (2018, 10, 19, 0, 0, 0)) Day "Navaratri")
[ "navaratri 2018"
, "durga puja 2018"
]
, examples (datetimeHoliday (2018, 10, 27, 0, 0, 0) Day "Karva Chauth")
[ "karva chauth 2018"
, "karva chauth 2018"
]
, examples (datetimeHoliday (2018, 8, 26, 0, 0, 0) Day "Raksha Bandhan")
[ "rakhi 2018"
]
, examples (datetimeHoliday (2020, 4, 6, 0, 0, 0) Day "Mahavir Jayanti")
[ "mahavir jayanti 2020"
, "mahaveer janma kalyanak 2020"
]
, examples (datetimeHoliday (2020, 2, 21, 0, 0, 0) Day "Maha Shivaratri")
[ "maha shivaratri 2020"
]
, examples (datetimeHoliday (2018, 2, 10, 0, 0, 0) Day "Dayananda Saraswati Jayanti")
[ "saraswati jayanti 2018"
]
, examples (datetimeHoliday (2018, 1, 14, 0, 0, 0) Day "Thai Pongal")
[ "pongal 2018"
, "makara sankranthi 2018"
]
, examples (datetimeHoliday (2018, 1, 13, 0, 0, 0) Day "Boghi")
[ "bogi pandigai 2018"
]
, examples (datetimeHoliday (2018, 1, 15, 0, 0, 0) Day "Mattu Pongal")
[ "maattu pongal 2018"
]
, examples (datetimeHoliday (2018, 1, 16, 0, 0, 0) Day "Kaanum Pongal")
[ "kaanum pongal 2018"
, "kanni pongal 2018"
]
, examples (datetimeHoliday (2019, 1, 15, 0, 0, 0) Day "Thai Pongal")
[ "makar sankranti 2019"
, "maghi 2019"
]
, examples (datetimeHoliday (2018, 4, 14, 0, 0, 0) Day "Vaisakhi")
[ "Vaisakhi 2018"
, "baisakhi 2018"
, "Vasakhi 2018"
, "vaishakhi 2018"
]
, examples (datetimeHoliday (2018, 8, 24, 0, 0, 0) Day "Thiru Onam")
[ "onam 2018"
, "Thiru Onam 2018"
, "Thiruvonam 2018"
]
, examples (datetimeHoliday (2019, 2, 10, 0, 0, 0) Day "Vasant Panchami")
[ "vasant panchami 2019"
, "basant panchami 2019"
]
, examples (datetimeHoliday (2019, 3, 20, 0, 0, 0) Day "Holika Dahan")
[ "chhoti holi 2019"
, "holika dahan 2019"
, "kamudu pyre 2019"
]
, examples (datetimeHoliday (2019, 8, 23, 0, 0, 0) Day "Krishna Janmashtami")
[ "krishna janmashtami 2019"
, "gokulashtami 2019"
]
, examples (datetimeHoliday (2019, 3, 21, 0, 0, 0) Day "Holi")
[ "holi 2019"
, "dhulandi 2019"
, "phagwah 2019"
]
, examples (datetimeHoliday (2018, 8, 17, 0, 0, 0) Day "Parsi Neujahr")
[ "Parsi Neujahr 2018"
, "Jamshedi Navroz 2018"
]
, examples (datetimeHoliday (2022, 8, 16, 0, 0, 0) Day "Parsi Neujahr")
[ "jamshedi Navroz 2022"
, "Parsi Neujahr 2022"
]
, examples (datetimeIntervalHoliday ((2013, 4, 26, 0, 0, 0), (2013, 4, 29, 0, 0, 0)) Day "Global Youth Service-Tag")
[ "GYSD 2013"
, "Global Youth Service-Tag"
]
, examples (datetimeHoliday (2013, 5, 24, 0, 0, 0) Day "Vesak")
[ "vesak"
, "vaisakha"
, "Buddha-Tag"
, "Buddha Purnima"
, "Wesakfest"
]
, examples (datetimeIntervalHoliday ((2013, 3, 23, 20, 30, 0), (2013, 3, 23, 21, 31, 0)) Minute "Earth Hour")
[ "Earth Hour"
, "Stunde der Erde"
]
, examples (datetimeIntervalHoliday ((2016, 3, 19, 20, 30, 0), (2016, 3, 19, 21, 31, 0)) Minute "Earth Hour")
[ "Earth Hour 2016"
, "Stunde der Erde 2016"
]
, examples (datetimeHoliday (2013, 2, 23, 0, 0, 0) Day "Purim")
[ "purim"
]
, examples (datetimeHoliday (2013, 2, 24, 0, 0, 0) Day "Shushan Purim")
[ "Shushan Purim"
]
, examples (datetimeHoliday (2014, 1, 7, 0, 0, 0) Day "Guru Gobind Singh Jayanti")
[ "Guru Gobind Singh Geburtstag"
, "Guru Gobind Singh Jayanti 2014"
, "Guru Govind Singh Jayanti"
]
, examples (datetimeHoliday (2018, 4, 27, 0, 0, 0) Day "Königstag")
[ "Koningsdag 2018"
, "königstag 2018"
]
, examples (datetimeHoliday (2014, 4, 26, 0, 0, 0) Day "Königstag")
[ "Koningsdag 2014"
]
, examples (datetimeHoliday (2018, 5, 9, 0, 0, 0) Day "Rabindra Jayanti")
[ "Rabindra Jayanti 2018"
, "Rabindranath Jayanti 2018"
]
, examples (datetimeHoliday (2019, 5, 9, 0, 0, 0) Day "Rabindra Jayanti")
[ "Rabindra Jayanti 2019"
, "Rabindranath Jayanti 2019"
]
, examples (datetimeHoliday (2018, 1, 31, 0, 0, 0) Day "Guru Ravidass Jayanti")
[ "Guru Ravidas Jayanti 2018"
, "Guru Ravidass Geburtstag 2018"
, "Guru Ravidass Jayanti 2018"
]
, examples (datetimeHoliday (2019, 2, 19, 0, 0, 0) Day "Guru Ravidass Jayanti")
[ "Guru Ravidass Jayanti 2019"
, "Guru Ravidas Geburtstag 2019"
]
, examples (datetimeHoliday (2019, 10, 13, 0, 0, 0) Day "Pargat Diwas")
[ "Valmiki Jayanti 2019"
, "Pargat Diwas 2019"
]
, examples (datetimeHoliday (2018, 10, 24, 0, 0, 0) Day "Pargat Diwas")
[ "Maharishi Valmiki Jayanti 2018"
, "Pargat Diwas 2018"
]
, examples (datetimeHoliday (2018, 5, 10, 0, 0, 0) Day "Christi Himmelfahrt")
[ "Christi Himmelfahrt 2018"
, "Himmelfahrt 2018"
, "Himmelfahrtstag 2018"
]
, examples (datetimeHoliday (2018, 2, 14, 0, 0, 0) Day "Aschermittwoch")
[ "Aschermittwoch 2018"
, "Aschertag 2018"
, "Aschetag 2018"
]
, examples (datetimeHoliday (2018, 2, 19, 0, 0, 0) Day "Aschermontag")
[ "Aschermontag 2018"
, "Reiner Montag 2018"
, "Sauberer Montag 2018"
]
, examples (datetimeHoliday (2018, 5, 31, 0, 0, 0) Day "Corpus Christi")
[ "Corpus Christi 2018"
, "Fronleichnam 2018"
]
, examples (datetimeHoliday (2018, 4, 2, 0, 0, 0) Day "Ostermontag")
[ "Ostermontag 2018"
]
, examples (datetimeHoliday (2018, 4, 1, 0, 0, 0) Day "Ostersonntag")
[ "Ostersonntag 2018"
]
, examples (datetimeHoliday (2018, 11, 8, 0, 0, 0) Day "Govardhan Puja")
[ "Govardhan Puja 2018"
, "Annakut 2018"
]
, examples (datetimeHoliday (2018, 3, 30, 0, 0, 0) Day "Karfreitag")
[ "Karfreitag 2018"
, "Stiller Freitag 2018"
, "Hoher Freitag 2018"
]
, examples (datetimeHoliday (2018, 3, 31, 0, 0, 0) Day "Karsamstag")
[ "Karsamstag 2018"
, "Stiller Samstag 2018"
, "Karsonnabend 2018"
]
, examples (datetimeHoliday (2018, 3, 31, 0, 0, 0) Day "Lazarus-Samstag")
[ "Lazarus-Samstag 2018"
, "Lazarus Samstag 2018"
]
, examples (datetimeHoliday (2018, 3, 29, 0, 0, 0) Day "Gründonnerstag")
[ "Gründonnerstag 2018"
, "Hoher Donnerstag 2018"
, "Heiliger Donnerstag 2018"
, "Weißer Donnerstag 2018"
, "Palmdonnerstag 2018"
]
, examples (datetimeHoliday (2018, 4, 9, 0, 0, 0) Day "Orthodoxer Ostermontag")
[ "Orthodoxer Ostermontag 2018"
]
, examples (datetimeHoliday (2018, 4, 8, 0, 0, 0) Day "Orthodoxer Ostersonntag")
[ "Orthodoxer Ostersonntag 2018"
]
, examples (datetimeHoliday (2018, 4, 7, 0, 0, 0) Day "Orthodoxer Karsamstag")
[ "Orthodoxer Karsamstag 2018"
]
, examples (datetimeHoliday (2018, 4, 6, 0, 0, 0) Day "Orthodoxer Karfreitag")
[ "Orthodoxer Karfreitag 2018"
]
, examples (datetimeHoliday (2018, 4, 1, 0, 0, 0) Day "Orthodoxer Palmsonntag")
[ "Orthodoxer Palmsonntag 2018"
]
, examples (datetimeHoliday (2018, 3, 25, 0, 0, 0) Day "Palmsonntag")
[ "Palmsonntag 2018"
]
, examples (datetimeHoliday (2018, 5, 20, 0, 0, 0) Day "Pfingsten")
[ "Pfingsten 2018"
, "pentecost 2018"
]
, examples (datetimeHoliday (2018, 2, 13, 0, 0, 0) Day "Fastnacht")
[ "Fastnacht 2018"
, "mardi gras 2018"
, "Fastnachtsdienstag 2018"
]
, examples (datetimeHoliday (2018, 5, 27, 0, 0, 0) Day "Dreifaltigkeitssonntag")
[ "Dreifaltigkeitssonntag 2018"
, "Dreifaltigkeitsfest 2018"
, "Trinitatis 2018"
, "Goldener Sonntag 2018"
]
, examples (datetimeHoliday (2018, 5, 21, 0, 0, 0) Day "Pfingstmontag")
[ "Pfingstmontag 2018"
, "Pentecost Montag 2018"
]
, examples (datetimeIntervalHoliday ((2018, 2, 19, 0, 0, 0), (2018, 3, 31, 0, 0, 0)) Day "Große Fastenzeit")
[ "Große Fastenzeit 2018"
]
, examples (datetimeIntervalHoliday ((2018, 2, 14, 0, 0, 0), (2018, 4, 1, 0, 0, 0)) Day "Fastenzeit")
[ "Fastenzeit 2018"
]
]

View File

@ -21,7 +21,9 @@ import Duckling.Dimensions.Types
import Duckling.Numeral.Helpers (parseInt)
import Duckling.Ordinal.Types (OrdinalData (..))
import Duckling.Regex.Types (GroupMatch(..))
import Duckling.Time.Computed
import Duckling.Time.Helpers
import Duckling.Time.HolidayHelpers
import Duckling.Time.Types (TimeData (..))
import Duckling.Types
import qualified Duckling.Ordinal.Types as TOrdinal
@ -111,6 +113,190 @@ ruleHolidays = mkRuleHolidays
, nthDOWOfMonth 3 7 6 )
]
ruleComputedHolidays :: [Rule]
ruleComputedHolidays = mkRuleHolidays
[ ( "Christi Himmelfahrt", "(christi\\s+)?himmelfahrt(stag)?"
, cycleNthAfter False TG.Day 39 easterSunday )
, ( "Aschermittwoch", "ascher?(tag|mittwoch)"
, cycleNthAfter False TG.Day (-46) easterSunday )
, ( "Aschura", "asc?hura(\\-?tag)?"
, cycleNthAfter False TG.Day 9 muharram )
, ( "Bhai Dooj", "bhai(ya)?\\s+d(u|oo)j|bhau\\-beej|bhai\\s+(tika|phonta)"
, cycleNthAfter False TG.Day 4 dhanteras )
, ( "Chhath", "chhathi?|chhath (parv|puja)|dala (chhath|puja)|surya shashthi"
, cycleNthAfter False TG.Day 8 dhanteras )
, ( "Boghi", "boghi|bogi\\s+pandigai"
, cycleNthAfter False TG.Day (-1) thaiPongal )
, ( "Chinesisches Neujahr", "chinesische(s|r)\\s+(neujahr(s(tag|fest))?|frühlingsfest)"
, chineseNewYear )
, ( "Aschermontag"
, "(orthodoxer?\\s+)?(ascher|reiner?\\s+|sauberer?\\s+)montag"
, cycleNthAfter False TG.Day (-48) orthodoxEaster )
, ( "Corpus Christi", "corpus\\s+christi|fronleichnam"
, cycleNthAfter False TG.Day 60 easterSunday )
, ( "Dhanteras", "dhanatrayodashi|dhanteras|dhanvantari\\s+trayodashi"
, dhanteras )
, ( "Diwali", "deepavali|diwali|lakshmi\\s+puja"
, cycleNthAfter False TG.Day 2 dhanteras )
, ( "Durga Ashtami", "(durga|maha)(\\s+a)?shtami"
, cycleNthAfter False TG.Day 7 navaratri )
, ( "Ostermontag", "ostermontag"
, cycleNthAfter False TG.Day 1 easterSunday )
, ( "Ostersonntag", "ostersonntag", easterSunday )
, ( "Eid al-Adha", "bakr[\\-\\s]e?id|e?id [au]l\\-adha|opferfest"
, eidalAdha )
, ( "Eid al-Fitr", "eid al\\-fitr", eidalFitr )
, ( "Govardhan Puja", "govardhan\\s+puja|annak(u|oo)t"
, cycleNthAfter False TG.Day 3 dhanteras )
, ( "Karfreitag", "(kar|stiller\\s+|hoher\\s+)freitag"
, cycleNthAfter False TG.Day (-2) easterSunday )
, ( "Guru Gobind Singh Jayanti"
, "guru\\s+(gobind|govind)\\s+singh\\s+(Geburtstag|jayanti)"
, guruGobindSinghJayanti )
, ( "Holi", "(rangwali )?holi|dhuleti|dhulandi|phagwah"
, cycleNthAfter False TG.Day 39 vasantPanchami )
, ( "Holika Dahan", "holika dahan|kamudu pyre|chhoti holi"
, cycleNthAfter False TG.Day 38 vasantPanchami )
, ( "Karsamstag"
, "(kar|stiller\\s+)samstag|karsonnabend"
, cycleNthAfter False TG.Day (-1) easterSunday )
, ( "Islamisches Neujahr", "(arabisches|hijri|islamisches) neujahr|amun jadid|muharram"
, muharram )
, ( "Isra and Mi'raj"
, "isra and mi'raj|aufstieg des propheten|(die\\s+)?nachtreise|aufstieg\\s+in\\s+den\\s+himmel"
, cycleNthAfter False TG.Day 26 rajab
)
, ( "Jumu'atul-Wida", "jumu'atul\\-widaa?'?|jamat[\\-\\s]ul[\\-\\s]vida"
, predNthAfter (-1) (dayOfWeek 5) eidalFitr )
, ( "Kaanum Pongal", "(kaanum|kanni)\\s+pongal"
, cycleNthAfter False TG.Day 2 thaiPongal )
, ( "Lag BaOmer", "lag (b|l)[a']omer", lagBaOmer )
, ( "Vaisakhi", "mesadi|[bv]aisakhi|vaisakhadi|vasakhi|vaishakhi", vaisakhi)
, ( "Lailat al-Qadr"
, "la[iy]lat al[\\-\\s][qk]adr|(die)? nacht der (bestimmung|allmacht)"
, cycleNthAfter False TG.Day 26 ramadan )
, ( "Lazarus-Samstag", "lazarus(\\-|\\s+)samstag"
, cycleNthAfter False TG.Day (-8) orthodoxEaster )
, ( "Maha Navami", "maha\\s+navami", cycleNthAfter False TG.Day 8 navaratri )
, ( "Maha Saptami", "maha\\s+saptami", cycleNthAfter False TG.Day 6 navaratri )
, ( "Mattu Pongal", "maa?ttu\\s+pongal"
, cycleNthAfter False TG.Day 1 thaiPongal )
, ( "Gründonnerstag"
, "(grün|hoher\\s+|heiliger\\s+|weißer\\s+|palm)donnerstag"
, cycleNthAfter False TG.Day (-3) easterSunday )
, ( "Maulid an-Nabī"
, "Maulid\\s+an\\-Nabī|mawlid(\\s+al\\-nab(awi|i\\s+al\\-sharif))?|mevli[dt]|mulud|geburtstag des propheten( muhammad)?"
, mawlid )
, ( "Naraka Chaturdashi"
, "naraka? (nivaran )?chaturdashi|(kali|roop) chaudas|choti diwali"
, cycleNthAfter False TG.Day 1 dhanteras )
, ( "Orthodoxer Ostermontag", "orthodoxer\\s+ostermontag"
, cycleNthAfter False TG.Day 1 orthodoxEaster )
, ( "Orthodoxer Ostersonntag", "orthodoxer\\s+ostersonntag"
, orthodoxEaster )
, ( "Orthodoxer Karsamstag", "orthodoxer\\s+karsamstag"
, cycleNthAfter False TG.Day (-1) orthodoxEaster )
, ( "Orthodoxer Karfreitag", "orthodoxer\\s+karfreitag"
, cycleNthAfter False TG.Day (-2) orthodoxEaster )
, ( "Orthodoxer Palmsonntag", "orthodoxer\\s+palmsonntag"
, cycleNthAfter False TG.Day (-7) orthodoxEaster )
, ( "Palmsonntag", "palmsonntag"
, cycleNthAfter False TG.Day (-7) easterSunday )
, ( "Pfingsten", "pfingsten|pentecost"
, cycleNthAfter False TG.Day 49 easterSunday )
, ( "Purim", "purim", purim )
, ( "Raksha Bandhan", "raksha(\\s+)?bandhan|rakhi", rakshaBandhan )
, ( "Pargat Diwas", "pargat diwas|(maharishi )?valmiki jayanti", pargatDiwas )
, ( "Mahavir Jayanti", "(mahavir|mahaveer) (jayanti|janma kalyanak)"
, mahavirJayanti )
, ( "Maha Shivaratri", "maha(\\s+)?shivaratri", mahaShivaRatri)
, ( "Dayananda Saraswati Jayanti","((maharishi|swami) )?(dayananda )?saraswati jayanti", saraswatiJayanti )
, ( "Karva Chauth", "karva\\s+chauth|karaka\\s+chaturthi", karvaChauth)
, ( "Krishna Janmashtami", "(krishna )?janmashtami|gokulashtami", krishnaJanmashtami )
, ( "Schmini Azeret", "sc?he?mini\\s+at?zeret"
, cycleNthAfter False TG.Day 21 roshHashana )
, ( "Fastnacht", "fastnacht(sdienstag)?|mardi gras"
, cycleNthAfter False TG.Day (-47) easterSunday )
, ( "Shushan Purim", "shushan\\s+purim", cycleNthAfter False TG.Day 1 purim )
, ( "Simchat Torah", "simc?hat\\s+torah"
, cycleNthAfter False TG.Day 22 roshHashana )
, ( "Thai Pongal"
, "(thai )?pongal|pongal pandigai|(makara? |magha )?sankranth?i|maghi"
, thaiPongal )
, ( "Thiru Onam", "(thiru(v|\\s+))?onam", thiruOnam )
, ( "Tisha B'Av", "tisha b'av", tishaBAv )
, ( "Dreifaltigkeitssonntag",
"trinitatis(fest)?|(dreifaltigkeits|goldener\\s+)sonntag|drei(faltigkeit|einigkeit)(sfest)?"
, cycleNthAfter False TG.Day 56 easterSunday )
, ( "Vasant Panchami", "[bv]asant\\s+panchami", vasantPanchami )
, ( "Vijayadashami", "dasara|duss(eh|he)ra|vijayadashami"
, cycleNthAfter False TG.Day 9 navaratri )
, ( "Tu biSchevat", "tu b[i']sc?he?vat", tuBishvat )
, ( "Vesak", "v(e|ai)sak(ha)?|buddha(\\-?tag|\\s+purnima)|wesakfest", vesak )
, ( "Jom Ha'atzmaut", "[yj]om ha'?atzmaut", yomHaatzmaut )
, ( "Jom HaShoah"
, "[yj]om hashoah|[yj]om hazikaron lashoah ve-lag'vurah|holocaust\\-?gedenktag"
, cycleNthAfter False TG.Day 12 passover )
, ( "Jom Kippur", "[yj]om\\s+kippur", cycleNthAfter False TG.Day 9 roshHashana )
, ( "Pfingstmontag", "pfingstmontag|(pentecost|whit)\\s+montag"
, cycleNthAfter False TG.Day 50 easterSunday )
, ( "Rabindra Jayanti", "rabindra(nath)?\\s+jayanti", rabindraJayanti )
, ("Guru Ravidass Jayanti", "guru\\s+ravidass?\\s+(geburtstag|jayanti)"
, ravidassJayanti )
]
ruleComputedHolidays' :: [Rule]
ruleComputedHolidays' = mkRuleHolidays'
[ ( "Global Youth Service-Tag", "global youth service[\\-\\s]?tag|gysd"
, let start = globalYouthServiceDay
end = cycleNthAfter False TG.Day 2 globalYouthServiceDay
in interval TTime.Open start end )
, ( "Große Fastenzeit", "große\\s+fastenzeit"
, let start = cycleNthAfter False TG.Day (-48) orthodoxEaster
end = cycleNthAfter False TG.Day (-9) orthodoxEaster
in interval TTime.Open start end )
, ( "Chanukka", "c?hann?ukk?ah?"
, let start = chanukah
end = cycleNthAfter False TG.Day 7 chanukah
in interval TTime.Open start end )
, ( "Fastenzeit", "fastenzeit"
, let start = cycleNthAfter False TG.Day (-46) easterSunday
end = cycleNthAfter False TG.Day (-1) easterSunday
in interval TTime.Open start end )
, ( "Navaratri", "durga\\s+puja|durgotsava|nava?rath?ri"
, let start = navaratri
end = cycleNthAfter False TG.Day 9 navaratri
in interval TTime.Open start end )
, ( "Pessach", "passover|pess?a[ck]?h|pascha|Passah?"
, let start = passover
end = cycleNthAfter False TG.Day 8 passover
in interval TTime.Open start end )
, ( "Ramadan", "rama[dt]h?an|ramzaa?n"
, let start = ramadan
end = cycleNthAfter False TG.Day (-1) eidalFitr
in interval TTime.Open start end )
, ( "Rosch haSchana", "rosch ha\\-?schanah?"
, let start = roshHashana
end = cycleNthAfter False TG.Day 2 roshHashana
in interval TTime.Open start end )
, ( "Schawuot", "sc?ha[vw]u'?oth?|shovuos"
, let start = cycleNthAfter False TG.Day 50 passover
end = cycleNthAfter False TG.Day 52 passover
in interval TTime.Open start end )
, ( "Sukkot", "Laubhüttenfest|su[ck]{2}o[st]"
, let start = cycleNthAfter False TG.Day 14 roshHashana
end = cycleNthAfter False TG.Day 22 roshHashana
in interval TTime.Open start end )
-- Does not account for leap years, so every 365 days.
, ( "Parsi Neujahr", "parsi neujahr|jamshedi navroz"
, predEveryNDaysFrom 365 (2020, 8, 16)
)
, ( "Earth Hour", "earth hour|stunde der erde"
, computeEarthHour )
, ( "Königstag", "königstag|koningsdag"
, computeKingsDay )
]
ruleRelativeMinutesTotillbeforeIntegerHourofday :: Rule
ruleRelativeMinutesTotillbeforeIntegerHourofday = Rule
{ name = "relative minutes to|till|before <integer> (hour-of-day)"
@ -1716,3 +1902,5 @@ rules =
++ ruleMonths
++ ruleSeasons
++ ruleHolidays
++ ruleComputedHolidays
++ ruleComputedHolidays'

View File

@ -28,6 +28,7 @@ import Duckling.Ordinal.Types (OrdinalData (..))
import Duckling.Regex.Types
import Duckling.Time.Computed
import Duckling.Time.Helpers
import Duckling.Time.HolidayHelpers
import Duckling.Time.Types (TimeData (..), TimeIntervalType (..))
import Duckling.Types
import qualified Duckling.Duration.Types as TDuration
@ -1910,32 +1911,14 @@ ruleComputedHolidays' = mkRuleHolidays'
, let start = cycleNthAfter False TG.Day 14 roshHashana
end = cycleNthAfter False TG.Day 22 roshHashana
in interval TTime.Open start end )
-- Other
-- Last Saturday of March unless it falls on Holy Saturday
-- In which case it's the Saturday before
, ( "Earth Hour", "earth hour"
, let holySaturday = cycleNthAfter False TG.Day (-1) easterSunday
tentative = predLastOf (dayOfWeek 6) (month 3)
alternative = cycleNthAfter False TG.Day (-7) tentative
in do
day <- intersectWithReplacement holySaturday tentative alternative
start <- intersect day $ hourMinute True 20 30
interval TTime.Closed start $ cycleNthAfter False TG.Minute 60 start )
-- Does not account for leap years, so every 365 days.
, ( "Parsi New Year", "parsi new year|jamshedi navroz"
, predEveryNDaysFrom 365 (2020, 8, 16)
)
-- king's day is on April 27th unless its on Sunday in which case its a day
-- earlier used a bit of a trick since intersectWithReplacement expects all
-- times to be aligned in granularity (e.g once a week, twice a year, etc.)
-- we intersect with last Sunday of April since if "4/27 is on Sunday" it
-- will be the last Sunday on April
, ( "Earth Hour", "earth hour"
, computeEarthHour )
, ( "King's Day", "king's day|koningsdag"
, let tentative = monthDay 4 27
alternative = monthDay 4 26
lastSundayOfApril = predLastOf (dayOfWeek 7) (month 4)
in intersectWithReplacement lastSundayOfApril tentative alternative )
, computeKingsDay )
]
ruleCycleThisLastNext :: Rule

View File

@ -0,0 +1,40 @@
-- Copyright (c) 2016-present, Facebook, Inc.
-- All rights reserved.
--
-- This source code is licensed under the BSD-style license found in the
-- LICENSE file in the root directory of this source tree.
module Duckling.Time.HolidayHelpers
( computeEarthHour, computeKingsDay
) where
import Data.Maybe
import Prelude
import Duckling.Time.Helpers
import Duckling.Time.Computed
import Duckling.Time.Types (TimeData (..))
import qualified Duckling.Time.Types as TTime
import qualified Duckling.TimeGrain.Types as TG
-- Last Saturday of March unless it falls on Holy Saturday,
-- in which case it's the Saturday before.
computeEarthHour :: Maybe TimeData
computeEarthHour =
let holySaturday = cycleNthAfter False TG.Day (-1) easterSunday
tentative = predLastOf (dayOfWeek 6) (month 3)
alternative = cycleNthAfter False TG.Day (-7) tentative
in do
day <- intersectWithReplacement holySaturday tentative alternative
start <- intersect day $ hourMinute True 20 30
interval TTime.Closed start $ cycleNthAfter False TG.Minute 60 start
-- King's day is on April 27th unless it's on Sunday, in which case it's a day
-- earlier. We intersect with the last Sunday of April. If 4/27 is a Sunday it
-- will be the last Sunday in April.
computeKingsDay :: Maybe TimeData
computeKingsDay =
let tentative = monthDay 4 27
alternative = monthDay 4 26
lastSundayOfApril = predLastOf (dayOfWeek 7) (month 4)
in intersectWithReplacement lastSundayOfApril tentative alternative

View File

@ -24,6 +24,7 @@ import Duckling.Numeral.Types (NumeralData (..))
import Duckling.Ordinal.Types (OrdinalData (..))
import Duckling.Regex.Types
import Duckling.Time.Helpers
import Duckling.Time.HolidayHelpers
import Duckling.Time.Types (TimeData (..))
import Duckling.Types
import qualified Duckling.Numeral.Types as TNumeral
@ -95,16 +96,8 @@ ruleHolidays = mkRuleHolidays
ruleComputedHolidays' :: [Rule]
ruleComputedHolidays' = mkRuleHolidays'
[
-- king's day is on April 27th unless its on Sunday in which case its a day
-- earlier used a bit of a trick since intersectWithReplacement expects all
-- times to be aligned in granularity (e.g once a week, twice a year, etc.)
-- we intersect with last Sunday of April since if "4/27 is on Sunday" it
-- will be the last Sunday on April
( "Koningsdag", "king's day|koningsdag"
, let tentative = monthDay 4 27
alternative = monthDay 4 26
lastSundayOfApril = predLastOf (dayOfWeek 7) (month 4)
in intersectWithReplacement lastSundayOfApril tentative alternative )
, computeKingsDay )
]
ruleRelativeMinutesToOrAfterIntegerPartOfDay :: Rule
ruleRelativeMinutesToOrAfterIntegerPartOfDay = Rule

View File

@ -707,6 +707,7 @@ library
, Duckling.Time.Computed
, Duckling.Time.Corpus
, Duckling.Time.Helpers
, Duckling.Time.HolidayHelpers
, Duckling.Time.Types
-- REMOVE ME
, Duckling.Time.TimeZone.Parse