* Calendar: update holidays with new thunderbird.net URLs/data for a lot more countries

This commit is contained in:
ralf 2024-01-18 21:58:56 +02:00
parent ce34b5eaf9
commit d0ddbcb16c
4 changed files with 109 additions and 87 deletions

View File

@ -1939,7 +1939,8 @@ class calendar_bo
$holidays = calendar_holidays::read( $holidays = calendar_holidays::read(
!empty($GLOBALS['egw_info']['server']['ical_holiday_url']) ? !empty($GLOBALS['egw_info']['server']['ical_holiday_url']) ?
$GLOBALS['egw_info']['server']['ical_holiday_url'] : $GLOBALS['egw_info']['server']['ical_holiday_url'] :
$GLOBALS['egw_info']['user']['preferences']['common']['country'], $year); $GLOBALS['egw_info']['user']['preferences']['common']['country'], $year,
$GLOBALS['egw_info']['user']['preferences']['common']['lang']);
// search for birthdays // search for birthdays
if ($GLOBALS['egw_info']['server']['hide_birthdays'] != 'yes') if ($GLOBALS['egw_info']['server']['hide_birthdays'] != 'yes')

View File

@ -17,7 +17,8 @@ use EGroupware\Api;
* *
* Holidays are read from: * Holidays are read from:
* - a given iCal URL or * - a given iCal URL or
* - json file with 2-digit iso country-code: URL pairs is read from https://community.egroupware.org or * - json file with 2-digit uppercase iso country-code and 2-digit lowercase iso language-code: URL pairs is read from https://community.egroupware.org or
* - json file with 2-digit uppercase iso country-code: URL pairs is read from https://community.egroupware.org or
* - json file is read from /calendar/setup/ical_holiday_urls.json * - json file is read from /calendar/setup/ical_holiday_urls.json
* *
* Holidays are cached on tree or instance level, later for custom urls. * Holidays are cached on tree or instance level, later for custom urls.
@ -25,8 +26,8 @@ use EGroupware\Api;
* from previous (requested) year until next 5 years. * from previous (requested) year until next 5 years.
* *
* Holiday urls are from Mozilla Calendar project: * Holiday urls are from Mozilla Calendar project:
* @link https://www.mozilla.org/en-US/projects/calendar/holidays/ * @link https://www.thunderbird.net/en-US/calendar/holidays/
* @link https://www.mozilla.org/media/caldata/calendars.json (json from which above page is generated) * @link https://www.thunderbird.net/media/caldata/calendars.json (json from which above page is generated)
* @link https://github.com/mozilla/bedrock/tree/master/media/caldata * @link https://github.com/mozilla/bedrock/tree/master/media/caldata
*/ */
class calendar_holidays class calendar_holidays
@ -42,21 +43,25 @@ class calendar_holidays
* *
* @param string $country 2-digit iso country code or URL * @param string $country 2-digit iso country code or URL
* @param int $year =null default current year * @param int $year =null default current year
* @param ?string $lang s-digit is language code
* @return array of Ymd => array of array with values for keys 'occurence','month','day','name', (commented out) 'title' * @return array of Ymd => array of array with values for keys 'occurence','month','day','name', (commented out) 'title'
*/ */
public static function read($country, $year=null) public static function read($country, $year=null, $lang=null)
{ {
if (!$year) $year = (int)Api\DateTime::to('now', 'Y'); if (!$year) $year = (int)Api\DateTime::to('now', 'Y');
$level = self::is_url($country) ? Api\Cache::INSTANCE : Api\Cache::TREE; $level = self::is_url($country) ? Api\Cache::INSTANCE : Api\Cache::TREE;
$holidays = Api\Cache::getCache($level, __CLASS__, $country.':'.$year); if (empty($lang) || !($holidays = Api\Cache::getCache($level, __CLASS__, $country.':'.$year.':'.$lang)))
{
$holidays = Api\Cache::getCache($level, __CLASS__, $country.':'.$year);
}
// if we dont find holidays in cache, we render from previous year until next 5 years // if we don't find holidays in cache, we render from previous year until next 5 years
if (!isset($holidays) && ($years = self::render($country, $year-1, $year+5))) if (!isset($holidays) && ($years = self::render($country, $year-1, $year+5, $lang)))
{ {
foreach($years as $y => $data) foreach($years as $y => $data)
{ {
Api\Cache::setCache($level, __CLASS__, $country.':'.$y, $data, self::HOLIDAY_CACHE_TIME); Api\Cache::setCache($level, __CLASS__, $country.':'.$y.($lang?':'.$lang:''), $data, self::HOLIDAY_CACHE_TIME);
} }
$holidays = $years[$year]; $holidays = $years[$year];
} }
@ -69,15 +74,16 @@ class calendar_holidays
* @param string $country 2-digit iso country code or URL * @param string $country 2-digit iso country code or URL
* @param int $year =null default current year * @param int $year =null default current year
* @param int $until_year =null default, fetch only one year, if given result is indexed additional by year * @param int $until_year =null default, fetch only one year, if given result is indexed additional by year
* @param ?string $lang =null 2-digit iso language code
* @return array of Ymd => array of array with values for keys 'occurence','month','day','name', (commented out) 'title' * @return array of Ymd => array of array with values for keys 'occurence','month','day','name', (commented out) 'title'
*/ */
public static function render($country, $year=null, $until_year=null) public static function render($country, $year=null, $until_year=null, $lang=null)
{ {
if (!$year) $year = (int)Api\DateTime::to('now', 'Y'); if (!$year) $year = (int)Api\DateTime::to('now', 'Y');
$end_year = $until_year && $year < $until_year ? $until_year : $year; $end_year = $until_year && $year < $until_year ? $until_year : $year;
$starttime = microtime(true); $starttime = microtime(true);
if (!($holidays = self::fetch($country))) if (!($holidays = self::fetch($country, $lang)) && !($holidays = self::fetch($country)))
{ {
return array(); return array();
} }
@ -149,11 +155,12 @@ class calendar_holidays
* Fetch iCal for given country * Fetch iCal for given country
* *
* @param string $country 2-digit iso country code or URL * @param string $country 2-digit iso country code or URL
* @param ?string $lang 2-digit iso language code or NULL
* @return array|Iterator parsed events * @return array|Iterator parsed events
*/ */
protected static function fetch($country) protected static function fetch($country, $lang=null)
{ {
if (!($url = self::is_url($country) ? $country : self::ical_url($country))) if (!($url = self::is_url($country) ? $country : self::ical_url($country, $lang)))
{ {
error_log("No holiday iCal for '$country'!"); error_log("No holiday iCal for '$country'!");
return array(); return array();
@ -188,9 +195,10 @@ class calendar_holidays
* We first try to fetch urls from https://community.egroupware.org and if that fails we use the local one. * We first try to fetch urls from https://community.egroupware.org and if that fails we use the local one.
* *
* @param string $country * @param string $country
* @param ?string $lang
* @return string|boolean|null string with url, false if we cant load urls, NULL if $country is not included * @return string|boolean|null string with url, false if we cant load urls, NULL if $country is not included
*/ */
protected static function ical_url($country) protected static function ical_url($country, $lang=null)
{ {
$urls = Api\Cache::getTree(__CLASS__, 'ical_holiday_urls'); $urls = Api\Cache::getTree(__CLASS__, 'ical_holiday_urls');
@ -208,7 +216,7 @@ class calendar_holidays
} }
Api\Cache::setTree(__CLASS__, 'ical_holiday_urls', $urls, $urls ? self::URL_CACHE_TIME : self::URL_FAIL_CACHE_TIME); Api\Cache::setTree(__CLASS__, 'ical_holiday_urls', $urls, $urls ? self::URL_CACHE_TIME : self::URL_FAIL_CACHE_TIME);
} }
return $urls[$country]; return $urls[$country.'_'.$lang] ?? $urls[$country];
} }
} }

View File

@ -1,72 +1,85 @@
{ {
"_origin": "https://www.thunderbird.net/en-US/calendar/holidays/", "_origin": "https://www.thunderbird.net/en-US/calendar/holidays/",
"DZ": "https://www.mozilla.org/media/caldata/AlgeriaHolidays.ics", "AL": "https://www.thunderbird.net/media/caldata/autogen/Albania-Holidays.ics",
"AR": "https://www.mozilla.org/media/caldata/ArgentinaHolidays.ics", "DZ": "https://www.thunderbird.net/media/caldata/autogen/Algeria-(Arabic)-Holidays.ics",
"AU": "https://www.mozilla.org/media/caldata/AustraliaHolidays.ics", "DZ_fr": "https://www.thunderbird.net/media/caldata/autogen/Algeria-(French)-Holidays.ics",
"AT": "https://www.mozilla.org/media/caldata/AustrianHolidays.ics", "AR": "https://www.thunderbird.net/media/caldata/autogen/Argentina-Holidays.ics",
"BE": "https://www.mozilla.org/media/caldata/BelgianHolidays.ics", "AM": "https://www.thunderbird.net/media/caldata/autogen/Armenia-Holidays.ics",
"BO": "https://www.mozilla.org/media/caldata/BoliviaHolidays.ics", "AU": "https://www.thunderbird.net/media/caldata/autogen/Australia-Holidays.ics",
"BR": "https://www.mozilla.org/media/caldata/BrazilHolidays.ics", "AT": "https://www.thunderbird.net/media/caldata/autogen/Austrian-Holidays.ics",
"BG": "https://www.mozilla.org/media/caldata/BulgarianHolidays.ics", "BE": "https://www.thunderbird.net/media/caldata/autogen/Belgian-(Dutch)-Holidays.ics",
"CA": "https://www.mozilla.org/media/caldata/CanadaHolidays.ics", "BE_fr": "https://www.thunderbird.net/media/caldata/autogen/Belgian-(French)-Holidays.ics",
"CL": "https://www.mozilla.org/media/caldata/ChileHolidays.ics", "BO": "https://www.thunderbird.net/media/caldata/autogen/Bolivia-Holidays.ics",
"CN": "https://www.mozilla.org/media/caldata/ChinaHolidays.ics", "BR": "https://www.thunderbird.net/media/caldata/autogen/Brazil-Holidays.ics",
"CO": "https://www.mozilla.org/media/caldata/ColombianHolidays.ics", "BG": "https://www.thunderbird.net/media/caldata/autogen/Bulgarian-Holidays.ics",
"CR": "https://www.mozilla.org/media/caldata/CostaRicaHolidays.ics", "CA": "https://www.thunderbird.net/media/caldata/autogen/Canada-(English)-Holidays.ics",
"HR": "https://www.mozilla.org/media/caldata/CroatiaHolidays.ics", "CA_fr": "https://www.thunderbird.net/media/caldata/autogen/Canada-(French)-Holidays.ics",
"CZ": "https://www.mozilla.org/media/caldata/CzechHolidays.ics", "CL": "https://www.thunderbird.net/media/caldata/autogen/Chile-Holidays.ics",
"DK": "https://www.mozilla.org/media/caldata/DanishHolidays.ics", "CN": "https://www.thunderbird.net/media/caldata/autogen/China-Holidays.ics",
"DO": "https://www.mozilla.org/media/caldata/DominicanRepublicSpanish.ics", "CO": "https://www.thunderbird.net/media/caldata/autogen/Colombian-Holidays.ics",
"EE": "https://www.mozilla.org/media/caldata/EstoniaHolidays.ics", "CR": "https://www.thunderbird.net/media/caldata/autogen/Costa-Rica-Holidays.ics",
"FI": "https://www.mozilla.org/media/caldata/FinlandHolidays.ics", "HR": "https://www.thunderbird.net/media/caldata/autogen/Croatia-Holidays.ics",
"FR": "https://www.mozilla.org/media/caldata/FrenchHolidays.ics", "CZ": "https://www.thunderbird.net/media/caldata/autogen/Czech-Holidays.ics",
"DE": "https://www.mozilla.org/media/caldata/GermanHolidays.ics", "DK": "https://www.thunderbird.net/media/caldata/autogen/Danmark-Holidays.ics",
"GR": "https://www.mozilla.org/media/caldata/GreeceHolidays.ics", "DO": "https://www.thunderbird.net/media/caldata/Dominican-Republic.ics",
"GY": "https://www.mozilla.org/media/caldata/GuyanaHolidays.ics", "EE": "https://www.thunderbird.net/media/caldata/autogen/Estonia-Holidays.ics",
"HT": "https://www.mozilla.org/media/caldata/HaitiHolidays.ics", "FI": "https://www.thunderbird.net/media/caldata/autogen/Finland-Holidays.ics",
"HK": "https://www.mozilla.org/media/caldata/HongKongHolidays.ics", "FR": "https://www.thunderbird.net/media/caldata/autogen/France-Holidays.ics",
"HU": "https://www.mozilla.org/media/caldata/HungarianHolidays.ics", "DE": "https://www.thunderbird.net/media/caldata/autogen/Germany-Holidays.ics",
"IS": "https://www.mozilla.org/media/caldata/IcelandHolidays.ics", "GR": "https://www.thunderbird.net/media/caldata/autogen/Greece-Holidays.ics",
"IN": "https://www.mozilla.org/media/caldata/IndiaHolidays.ics", "GY": "https://www.thunderbird.net/media/caldata/autogen/Guyana-Holidays.ics",
"ID": "https://www.mozilla.org/media/caldata/IndonesianHolidays.ics", "HT": "https://www.thunderbird.net/media/caldata/autogen/Haiti-Holidays.ics",
"IR": "https://www.mozilla.org/media/caldata/IranHolidays_Persian.ics", "HK": "https://www.thunderbird.net/media/caldata/autogen/Hong-Kong-Holidays.ics",
"IE": "https://www.mozilla.org/media/caldata/IrelandHolidays2014-2021.ics", "HU": "https://www.thunderbird.net/media/caldata/autogen/Hungary-Holidays.ics",
"IT": "https://www.mozilla.org/media/caldata/ItalianHolidays.ics", "IS": "https://www.thunderbird.net/media/caldata/autogen/Iceland-Holidays.ics",
"JP": "https://www.mozilla.org/media/caldata/JapanHolidays.ics", "IN": "https://www.thunderbird.net/media/caldata/autogen/India-Holidays.ics",
"KZ": "https://www.mozilla.org/media/caldata/KazakhstanHolidaysRussian.ics", "ID": "https://www.thunderbird.net/media/caldata/autogen/Indonesia-Holidays.ics",
"KE": "https://www.mozilla.org/media/caldata/KenyaHolidays.ics", "IE": "https://www.thunderbird.net/media/caldata/Ireland-(English)-Holidays.ics",
"KR": "https://www.mozilla.org/media/caldata/SouthKoreaHolidays.ics", "IE_ga": "https://www.thunderbird.net/media/caldata/Ireland-(Irish)-Holidays.ics",
"LV": "https://www.mozilla.org/media/caldata/LatviaHolidays.ics", "IS": "https://www.thunderbird.net/media/caldata/autogen/Israel-Holidays.ics",
"LI": "https://www.mozilla.org/media/caldata/LiechtensteinHolidays.ics", "IT": "https://www.thunderbird.net/media/caldata/autogen/Italy-Holidays.ics",
"LT": "https://www.mozilla.org/media/caldata/LithuanianHolidays.ics", "JP": "https://www.thunderbird.net/media/caldata/autogen/Japan-Holidays.ics",
"LU": "https://www.mozilla.org/media/caldata/LuxembourgHolidays.ics", "KZ": "https://www.thunderbird.net/media/caldata/autogen/Kazakhstan-Holidays.ics",
"MA": "https://www.mozilla.org/media/caldata/MoroccoHolidays.ics", "KE": "https://www.thunderbird.net/media/caldata/autogen/Kenya-Holidays.ics",
"NL": "https://www.mozilla.org/media/caldata/DutchHolidays.ics", "LV": "https://www.thunderbird.net/media/caldata/autogen/Latvia-Holidays.ics",
"NZ": "https://www.mozilla.org/media/caldata/NewZealandHolidays.ics", "LB": "https://www.thunderbird.net/media/caldata/autogen/Lebanon-Holidays.ics",
"NI": "https://www.mozilla.org/media/caldata/NicaraguaHolidays.ics", "LI": "https://www.thunderbird.net/media/caldata/autogen/Liechtenstein-Holidays.ics",
"NO": "https://www.mozilla.org/media/caldata/NorwegianHolidays.ics", "LT": "https://www.thunderbird.net/media/caldata/autogen/Lithuania-Holidays.ics",
"PK": "https://www.mozilla.org/media/caldata/PakistanHolidays.ics", "LU": "https://www.thunderbird.net/media/caldata/autogen/Luxembourg-(Germany)-Holidays.ics",
"PE": "https://www.mozilla.org/media/caldata/PeruHolidays.ics", "LU_fr": "https://www.thunderbird.net/media/caldata/autogen/Luxembourg-(French)-Holidays.ics",
"PH": "https://www.mozilla.org/media/caldata/PhilippinesHolidays.ics", "MY": "https://www.thunderbird.net/media/caldata/autogen/Malaysia-Holidays.ics",
"PL": "https://www.mozilla.org/media/caldata/PolishHolidays.ics", "MT": "https://www.thunderbird.net/media/caldata/autogen/Malta-Holidays.ics",
"PT": "https://www.mozilla.org/media/caldata/PortugalHolidays.ics", "MX": "https://www.thunderbird.net/media/caldata/autogen/Mexico-Holidays.ics",
"RO": "https://www.mozilla.org/media/caldata/RomaniaHolidays.ics", "MA": "https://www.thunderbird.net/media/caldata/autogen/Morocco-Holidays.ics",
"RU": "https://www.mozilla.org/media/caldata/RussiaHolidays.ics", "NA": "https://www.thunderbird.net/media/caldata/autogen/Nabimia-Holidays.ics",
"SG": "https://www.mozilla.org/media/caldata/SingaporeHolidays.ics", "NL": "https://www.thunderbird.net/media/caldata/autogen/Netherlands-Holidays.ics",
"SK": "https://www.mozilla.org/media/caldata/SlovakHolidays.ics", "NZ": "https://www.thunderbird.net/media/caldata/autogen/New-Zealand-Holidays.ics",
"SI": "https://www.mozilla.org/media/caldata/SlovenianHolidays.ics", "NI": "https://www.thunderbird.net/media/caldata/autogen/Nicaragua-Holidays.ics",
"ZA": "https://www.mozilla.org/media/caldata/SouthAfricaHolidays.ics", "NO": "https://www.thunderbird.net/media/caldata/autogen/Norway-Holidays.ics",
"ES": "https://www.mozilla.org/media/caldata/SpanishHolidays.ics", "PK": "https://www.thunderbird.net/media/caldata/autogen/Pakistan-Holidays.ics",
"LK": "https://www.mozilla.org/media/caldata/SriLankaHolidays.ics", "PE": "https://www.thunderbird.net/media/caldata/autogen/Peru-Holidays.ics",
"SE": "https://www.mozilla.org/media/caldata/SwedishHolidays.ics", "PH": "https://www.thunderbird.net/media/caldata/autogen/Philippines-Holidays.ics",
"CH": "https://www.mozilla.org/media/caldata/SwissHolidays.ics", "PL": "https://www.thunderbird.net/media/caldata/autogen/Polish-Holidays.ics",
"TW": "https://www.mozilla.org/media/caldata/TaiwanHolidays.ics", "PT": "https://www.thunderbird.net/media/caldata/autogen/Portugal-Holidays.ics",
"TH": "https://www.mozilla.org/media/caldata/ThaiHolidays.ics", "PR": "https://www.thunderbird.net/media/caldata/autogen/Puerto-Rico-Holidays.ics",
"TT": "https://www.mozilla.org/media/caldata/TrinidadTobagoHolidays.ics", "RO": "https://www.thunderbird.net/media/caldata/autogen/Romania-Holidays.ics",
"TR": "https://www.mozilla.org/media/caldata/TurkeyHolidays.ics", "RU": "https://www.thunderbird.net/media/caldata/autogen/Russia-Holidays.ics",
"UA": "https://www.mozilla.org/media/caldata/UkraineHolidays.ics", "SG": "https://www.thunderbird.net/media/caldata/autogen/Singapore-Holidays.ics",
"GB": "https://www.mozilla.org/media/caldata/UKHolidays.ics", "SK": "https://www.thunderbird.net/media/caldata/autogen/Slovakia-Holidays.ics",
"US": "https://www.mozilla.org/media/caldata/USHolidays.ics", "SI": "https://www.thunderbird.net/media/caldata/autogen/Slovenia-Holidays.ics",
"UY": "https://www.mozilla.org/media/caldata/UruguayHolidays.ics", "ZA": "https://www.thunderbird.net/media/caldata/autogen/South-Africa-Holidays.ics",
"VN": "https://www.mozilla.org/media/caldata/VietnamHolidays.ics" "KR": "https://www.thunderbird.net/media/caldata/autogen/South-Korea-Holidays.ics",
"ES": "https://www.thunderbird.net/media/caldata/autogen/Spain-Holidays.ics",
"LK": "https://www.thunderbird.net/media/caldata/autogen/Sri-Lanka-Holidays.ics",
"SE": "https://www.thunderbird.net/media/caldata/autogen/Swedish-Holidays.ics",
"CH": "https://www.thunderbird.net/media/caldata/autogen/Switzerland-Holidays.ics",
"TW": "https://www.thunderbird.net/media/caldata/autogen/Taiwan-Holidays.ics",
"TH": "https://www.thunderbird.net/media/caldata/autogen/Thailand-Holidays.ics",
"TT": "https://www.thunderbird.net/media/caldata/autogen/Trinidad-and-Tobago-Holidays.ics",
"TR": "https://www.thunderbird.net/media/caldata/autogen/Turkey-Holidays.ics",
"UA": "https://www.thunderbird.net/media/caldata/autogen/Ukraine-Holidays.ics",
"GB": "https://www.thunderbird.net/media/caldata/autogen/United-Kingdom-Holidays.ics",
"US": "https://www.thunderbird.net/media/caldata/autogen/United-States-Holidays.ics",
"UY": "https://www.thunderbird.net/media/caldata/autogen/Uruguay-Holidays.ics",
"VN": "https://www.thunderbird.net/media/caldata/autogen/Vietnam-Holidays.ics"
} }

View File

@ -11,7 +11,7 @@
<row> <row>
<et2-vbox> <et2-vbox>
<et2-description value="Custom URL for iCal with holidays for all users" label="%s:"></et2-description> <et2-description value="Custom URL for iCal with holidays for all users" label="%s:"></et2-description>
<et2-description label="(Without a custom URL we use nation of user preference to load holidays from %s)" href="https://www.mozilla.org/en-US/projects/calendar/holidays/" value="Mozilla Holiday Calendars" extraLinkTarget="_blank"></et2-description> <et2-description label="(Without a custom URL we use nation of user preference to load holidays from %s)" href="https://www.thuderbird.net/en-US/calendar/holidays/" value="Mozilla Holiday Calendars" extraLinkTarget="_blank"></et2-description>
</et2-vbox> </et2-vbox>
<et2-url id="newsettings[ical_holiday_url]"></et2-url> <et2-url id="newsettings[ical_holiday_url]"></et2-url>
</row> </row>