commit vendor

This commit is contained in:
2025-11-11 14:49:30 +01:00
parent f33121a308
commit 6d03080c00
2436 changed files with 483781 additions and 0 deletions

56
vendor/rlanvin/php-rrule/LICENSE vendored Normal file
View File

@ -0,0 +1,56 @@
The MIT License (MIT)
Copyright (c) 2015 Rémi Lanvin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------------------------
Based on python-dateutil. LICENSE:
dateutil - Extensions to the standard Python datetime module.
Copyright (c) 2003-2011 - Gustavo Niemeyer <gustavo@niemeyer.net>
Copyright (c) 2012-2014 - Tomi Pieviläinen <tomi.pievilainen@iki.fi>
Copyright (c) 2014 - Yaron de Leeuw <me@jarondl.net>
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* 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.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
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 OWNER 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.

View File

@ -0,0 +1,48 @@
#!/usr/bin/env php
<?php
/**
* Inspired from https://github.com/sabre-io/vobject/blob/master/bin/fetch_windows_zones.php
*/
$input = 'https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/windowsZones.xml';
$output = __DIR__.'/../src/tzdata/windows.php';
$xml = simplexml_load_file($input);
if ($xml === false) {
fprintf(STDERR, "Something went wrong");
exit(1);
}
$map = [];
// mapZone can contains multiple mapping, so we take only where territory="001"
foreach ($xml->xpath('//mapZone[@territory=001]') as $zone) {
$from = (string) $zone['other'];
$to = (string) $zone['type'];
// then there can also be multiple timezone, so we take the first one
$to = explode(" ",$to)[0];
$map[$from] = $to;
}
ksort($map);
$export = var_export($map,true);
$script = basename(__FILE__);
$date = gmdate('c');
file_put_contents($output, <<<EOF
<?php
/**
* This file is automatically generated by {$script}.
*
* Generated at: {$date}
* Source used: {$input}
*/
return {$export};
EOF
);
echo "Success\n";

2366
vendor/rlanvin/php-rrule/src/RRule.php vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,105 @@
<?php
/**
* Licensed under the MIT license.
*
* For the full copyright and license information, please view the LICENSE file.
*
* @author Rémi Lanvin <remi@cloudconnected.fr>
* @link https://github.com/rlanvin/php-rrule
*/
namespace RRule;
/**
* Common interface for RRule and RSet objects
*/
interface RRuleInterface extends \ArrayAccess, \Countable, \IteratorAggregate
{
/**
* Return all the occurrences in an array of \DateTime.
*
* @param int $limit Limit the resultset to n occurrences (0, null or false = everything)
* @return array An array of \DateTime objects
*/
public function getOccurrences($limit = null);
/**
* Return all the ocurrences after a date, before a date, or between two dates.
*
* @param mixed $begin Can be null to return all occurrences before $end
* @param mixed $end Can be null to return all occurrences after $begin
* @param int|null $limit Limit the resultset to n occurrences (0, null or false = everything)
* @return array An array of \DateTime objects
*/
public function getOccurrencesBetween($begin, $end, $limit = null);
/**
* Return all the occurrences after a date.
*
* @param mixed $date
* @param bool $inclusive Whether or not to include $date (if date is an occurrence)
* @param int|null $limit Limit the resultset to n occurrences (0, null or false = everything)
* @return array
*/
public function getOccurrencesAfter($date, $inclusive = false, $limit = null);
/**
* Return the Nth occurrences after a date (non inclusive)
*
* @param mixed $date
* @param int $index The index (starts at 1)
* @return DateTimeInterface|null
*/
public function getNthOccurrenceAfter($date, $index);
/**
* Return all the occurrences before a date.
*
* @param mixed $date
* @param bool $inclusive Whether or not to include $date (if date is an occurrence)
* @param int|null $limit Limit the resultset to n occurrences (0, null or false = everything)
* @return array
*/
public function getOccurrencesBefore($date, $inclusive = false, $limit = null);
/**
* Return the Nth occurrences before a date (non inclusive)
*
* @param mixed $date
* @param int $index The index (starts at 1)
* @return DateTimeInterface|null
*/
public function getNthOccurrenceBefore($date, $index);
/**
* Return the Nth occurrences before or after a date.
*
* @param mixed $date
* @param int $index 0 returns the date, positive integer returns index in the future, negative in the past
* @return DateTimeInterface|null
*/
public function getNthOccurrenceFrom($date, $index);
/**
* Return true if $date is an occurrence.
*
* @param mixed $date
* @return bool
*/
public function occursAt($date);
/**
* Return true if the rrule has an end condition, false otherwise
*
* @return bool
*/
public function isFinite();
/**
* Return true if the rrule has no end condition (infite)
*
* @return bool
*/
public function isInfinite();
}

View File

@ -0,0 +1,207 @@
<?php
/**
* Licensed under the MIT license.
*
* For the full copyright and license information, please view the LICENSE file.
*
* @author Rémi Lanvin <remi@cloudconnected.fr>
* @link https://github.com/rlanvin/php-rrule
*/
namespace RRule;
/**
* Implement the common methods of the RRuleInterface used by RRule and RSet
*
* @internal
*/
trait RRuleTrait
{
/**
* Return all the occurrences in an array of \DateTime.
*
* @param int $limit Limit the resultset to n occurrences (0, null or false = everything)
* @return array An array of \DateTime objects
*/
public function getOccurrences($limit = null)
{
if (! $limit && $this->isInfinite()) {
throw new \LogicException('Cannot get all occurrences of an infinite recurrence rule.');
}
if ($limit !== null && $limit !== false && $limit < 0) {
throw new \InvalidArgumentException('$limit cannot be negative');
}
// cached version already computed
$iterator = $this;
if ($this->total !== null) {
$iterator = $this->cache;
}
$res = array();
$n = 0;
foreach ($iterator as $occurrence) {
$res[] = clone $occurrence; // we have to clone because DateTime is not immutable
$n += 1;
if ($limit && $n >= $limit) {
break;
}
}
return $res;
}
/**
* Return all the ocurrences after a date, before a date, or between two dates.
*
* @param mixed $begin Can be null to return all occurrences before $end
* @param mixed $end Can be null to return all occurrences after $begin
* @param int $limit Limit the resultset to n occurrences (0, null or false = everything)
* @return array An array of \DateTime objects
*/
public function getOccurrencesBetween($begin, $end, $limit = null)
{
if ($begin !== null) {
$begin = self::parseDate($begin);
}
if ($end !== null) {
$end = self::parseDate($end);
}
elseif (! $limit && $this->isInfinite()) {
throw new \LogicException('Cannot get all occurrences of an infinite recurrence rule.');
}
if ($limit !== null && $limit !== false && $limit < 0) {
throw new \InvalidArgumentException('$limit cannot be negative');
}
$iterator = $this;
if ($this->total !== null) {
$iterator = $this->cache;
}
$res = array();
$n = 0;
foreach ($iterator as $occurrence) {
if ($begin !== null && $occurrence < $begin) {
continue;
}
if ($end !== null && $occurrence > $end) {
break;
}
$res[] = clone $occurrence;
$n += 1;
if ($limit && $n >= $limit) {
break;
}
}
return $res;
}
public function getOccurrencesAfter($date, $inclusive = false, $limit = null)
{
if ($inclusive || ! $this->occursAt($date)) {
return $this->getOccurrencesBetween($date, null, $limit);
}
$limit += 1;
$occurrences = $this->getOccurrencesBetween($date, null, $limit);
return array_slice($occurrences, 1);
}
public function getNthOccurrenceAfter($date, $index)
{
if ($index <= 0) {
throw new \InvalidArgumentException("Index must be a positive integer");
}
$occurrences = $this->getOccurrencesAfter($date, false, $index);
return isset($occurrences[$index-1]) ? $occurrences[$index-1] : null;
}
public function getOccurrencesBefore($date, $inclusive = false, $limit = null)
{
// we need to get everything
$occurrences = $this->getOccurrencesBetween(null, $date);
if (! $inclusive && $this->occursAt($date)) {
array_pop($occurrences);
}
// the limit is counted from $date
if ($limit) {
$occurrences = array_slice($occurrences, -1 * $limit);
}
return $occurrences;
}
public function getNthOccurrenceBefore($date, $index)
{
if ($index <= 0) {
throw new \InvalidArgumentException("Index must be a positive integer");
}
$occurrences = $this->getOccurrencesBefore($date, false, $index);
if (sizeof($occurrences) < $index) {
return null;
}
return $occurrences[0];
}
public function getNthOccurrenceFrom($date, $index)
{
if (! is_numeric($index)) {
throw new \InvalidArgumentException('Malformed index (must be a numeric)');
}
if ($index == 0) {
return $this->occursAt($date) ? self::parseDate($date) : null;
}
elseif ($index > 0) {
return $this->getNthOccurrenceAfter($date, $index);
}
else {
return $this->getNthOccurrenceBefore($date, -1*$index);
}
}
/**
* Convert any date into a DateTime object.
*
* @param mixed $date
* @return \DateTime
*
* @throws \InvalidArgumentException on error
*/
static public function parseDate($date)
{
// DateTimeInterface is only on PHP 5.5+, and includes DateTimeImmutable
if (! $date instanceof \DateTime && ! $date instanceof \DateTimeInterface) {
try {
if (is_integer($date)) {
$date = \DateTime::createFromFormat('U',$date);
$date->setTimezone(new \DateTimeZone('UTC')); // default is +00:00 (see issue #15)
}
else {
$date = new \DateTime($date);
}
} catch (\Exception $e) { // PHP 5.6
throw new \InvalidArgumentException(
"Failed to parse the date ({$e->getMessage()})"
);
} catch (\Throwable $e) { // PHP 7+
throw new \InvalidArgumentException(
"Failed to parse the date ({$e->getMessage()})"
);
}
}
else {
$date = clone $date; // avoid reference problems
}
return $date;
}
}

687
vendor/rlanvin/php-rrule/src/RSet.php vendored Normal file
View File

@ -0,0 +1,687 @@
<?php
/**
* Licensed under the MIT license.
*
* For the full copyright and license information, please view the LICENSE file.
*
* @author Rémi Lanvin <remi@cloudconnected.fr>
* @link https://github.com/rlanvin/php-rrule
*/
namespace RRule;
/**
* Recurrence set
*/
class RSet implements RRuleInterface
{
use RRuleTrait;
/**
* @var array List of RDATE (single dates)
*/
protected $rdates = array();
/**
* @var array List of RRULE
*/
protected $rrules = array();
/**
* @var array List of EXDATE (single dates to be excluded)
*/
protected $exdates = array();
/**
* @var array List of EXRULES (single rules to be excluded)
*/
protected $exrules = array();
// cache variable
/**
* @var int|null Cache for the total number of occurrences
*/
protected $total = null;
/**
* @var int|null Cache for the finite status of the RSet
*/
protected $infinite = null;
/**
* @var array Cache for all the occurrences
*/
protected $cache = array();
/**
* Constructor
*
* @param string $string a RFC compliant text block
*/
public function __construct($string = null, $default_dtstart = null)
{
if ($string && is_string($string)) {
$string = trim($string);
$rrules = array();
$exrules = array();
$rdates = array();
$exdates = array();
$dtstart = null;
// parse
$lines = explode("\n", $string);
foreach ($lines as $line) {
$line = trim($line);
if (strpos($line,':') === false) {
throw new \InvalidArgumentException('Failed to parse RFC string, line is not starting with a property name followed by ":"');
}
list($property_name,$property_value) = explode(':',$line);
$tmp = explode(";",$property_name);
$property_name = $tmp[0];
switch (strtoupper($property_name)) {
case 'DTSTART':
if ($default_dtstart || $dtstart !== null) {
throw new \InvalidArgumentException('Failed to parse RFC string, multiple DTSTART found');
}
$dtstart = $line;
break;
case 'RRULE':
$rrules[] = $line;
break;
case 'EXRULE':
$exrules[] = $line;
break;
case 'RDATE':
$rdates = array_merge($rdates, RfcParser::parseRDate($line));
break;
case 'EXDATE':
$exdates = array_merge($exdates, RfcParser::parseExDate($line));
break;
default:
throw new \InvalidArgumentException("Failed to parse RFC, unknown property: $property_name");
}
}
foreach ($rrules as $rrule) {
if ($dtstart) {
$rrule = $dtstart."\n".$rrule;
}
$this->addRRule(new RRule($rrule, $default_dtstart));
}
foreach ($exrules as $rrule) {
if ($dtstart) {
$rrule = $dtstart."\n".$rrule;
}
$this->addExRule(new RRule($rrule, $default_dtstart));
}
foreach ($rdates as $date) {
$this->addDate($date);
}
foreach ($exdates as $date) {
$this->addExDate($date);
}
}
}
/**
* Add a RRule (or another RSet)
*
* @param mixed $rrule an instance of RRuleInterface or something that can be transformed into a RRule (string or array)
* @return $this
*/
public function addRRule($rrule)
{
if (is_string($rrule) || is_array($rrule)) {
$rrule = new RRule($rrule);
}
elseif (! $rrule instanceof RRuleInterface) {
throw new \InvalidArgumentException('The rule must be a string, an array, or implement RRuleInterface');
}
// cloning because I want to iterate it without being disturbed
$this->rrules[] = clone $rrule;
$this->clearCache();
return $this;
}
/**
* Return the RRULE(s) contained in this set
*
* @todo check if a deep copy is needed.
*
* @return array Array of RRule
*/
public function getRRules()
{
return $this->rrules;
}
/**
* Add a RRule with exclusion rules.
* In RFC 2445 but deprecated in RFC 5545
*
* @param mixed $rrule an instance of RRuleInterface or something that can be transformed into a RRule (string or array)
* @return $this
*/
public function addExRule($rrule)
{
if (is_string($rrule) || is_array($rrule)) {
$rrule = new RRule($rrule);
}
elseif (! $rrule instanceof RRuleInterface) {
throw new \InvalidArgumentException('The rule must be a string, an array or implement RRuleInterface');
}
// cloning because I want to iterate it without being disturbed
$this->exrules[] = clone $rrule;
$this->clearCache();
return $this;
}
/**
* Return the EXRULE(s) contained in this set
*
* @todo check if a deep copy is needed.
*
* @return array Array of RRule
*/
public function getExRules()
{
return $this->exrules;
}
/**
* Add a RDATE (renamed Date for simplicy, since we don't support full RDATE syntax at the moment)
*
* @param mixed $date a valid date representation or a \DateTime object
* @return $this
*/
public function addDate($date)
{
try {
$this->rdates[] = RRule::parseDate($date);
sort($this->rdates);
} catch (\Exception $e) {
throw new \InvalidArgumentException(
'Failed to parse RDATE - it must be a valid date, timestamp or \DateTime object'
);
}
$this->clearCache();
return $this;
}
/**
* Remove an RDATE
*
* @param mixed $date a valid date representation or a \DateTime object
* @return $this
*/
public function removeDate($date)
{
try {
$date_to_remove = RRule::parseDate($date);
$index = array_search($date_to_remove, $this->rdates);
if ($index !== false) {
unset($this->rdates[$index]);
$this->rdates = array_values($this->rdates);
}
} catch (\Exception $e) {
throw new \InvalidArgumentException(
'Failed to parse RDATE - it must be a valid date, timestamp or \DateTime object'
);
}
$this->clearCache();
return $this;
}
/**
* Remove all RDATEs
*
* @return $this
*/
public function clearDates()
{
$this->rdates = [];
$this->clearCache();
return $this;
}
/**
* Return the RDATE(s) contained in this set
*
* @todo check if a deep copy is needed.
*
* @return array Array of \DateTime
*/
public function getDates()
{
return $this->rdates;
}
/**
* Add a EXDATE
*
* @param mixed $date a valid date representation or a \DateTime object
* @return $this
*/
public function addExDate($date)
{
try {
$this->exdates[] = RRule::parseDate($date);
sort($this->exdates);
} catch (\Exception $e) {
throw new \InvalidArgumentException(
'Failed to parse EXDATE - it must be a valid date, timestamp or \DateTime object'
);
}
$this->clearCache();
return $this;
}
/**
* Remove an EXDATE
*
* @param mixed $date a valid date representation or a \DateTime object
* @return $this
*/
public function removeExDate($date)
{
try {
$date_to_remove = RRule::parseDate($date);
$index = array_search($date_to_remove, $this->exdates);
if ($index !== false) {
unset($this->exdates[$index]);
$this->exdates = array_values($this->exdates);
}
} catch (\Exception $e) {
throw new \InvalidArgumentException(
'Failed to parse EXDATE - it must be a valid date, timestamp or \DateTime object'
);
}
$this->clearCache();
return $this;
}
/**
* Removes all EXDATEs
*
* @return $this
*/
public function clearExDates()
{
$this->exdates = [];
$this->clearCache();
return $this;
}
/**
* Return the EXDATE(s) contained in this set
*
* @todo check if a deep copy is needed.
*
* @return array Array of \DateTime
*/
public function getExDates()
{
return $this->exdates;
}
/**
* Clear the cache.
* Do NOT use while the class is iterating.
* @return $this
*/
public function clearCache()
{
$this->total = null;
$this->infinite = null;
$this->cache = array();
$this->rlist_heap = null;
$this->rlist_iterator = null;
$this->exlist_heap = null;
$this->exlist_iterator = null;
return $this;
}
///////////////////////////////////////////////////////////////////////////////
// RRule interface
/**
* Return true if the rrule has an end condition, false otherwise
*
* @return bool
*/
public function isFinite()
{
return ! $this->isInfinite();
}
/**
* Return true if the rrule has no end condition (infite)
*
* @return bool
*/
public function isInfinite()
{
if ($this->infinite === null) {
$this->infinite = false;
foreach ($this->rrules as $rrule) {
if ($rrule->isInfinite()) {
$this->infinite = true;
break;
}
}
}
return $this->infinite;
}
/**
* Return all the occurrences in an array of \DateTime.
*
* @param int $limit Limit the resultset to n occurrences (0, null or false = everything)
* @return array An array of \DateTime objects
*/
public function getOccurrences($limit = null)
{
if (!$limit && $this->isInfinite()) {
throw new \LogicException('Cannot get all occurrences of an infinite recurrence set.');
}
// cached version already computed
$iterator = $this;
if ($this->total !== null) {
$iterator = $this->cache;
}
$res = array();
$n = 0;
foreach ($iterator as $occurrence) {
$res[] = clone $occurrence; // we have to clone because DateTime is not immutable
$n += 1;
if ($limit && $n >= $limit) {
break;
}
}
return $res;
}
/**
* Return true if $date is an occurrence.
*
* @param mixed $date
* @return bool
*/
public function occursAt($date)
{
$date = RRule::parseDate($date);
if (in_array($date, $this->cache)) {
// in the cache (whether cache is complete or not)
return true;
}
elseif ($this->total !== null) {
// cache complete and not in cache
return false;
}
// test if it *should* occur (before exclusion)
$occurs = false;
foreach ($this->rdates as $rdate) {
if ($rdate == $date) {
$occurs = true;
break;
}
}
if (! $occurs) {
foreach ($this->rrules as $rrule) {
if ($rrule->occursAt($date)) {
$occurs = true;
break;
}
}
}
// if it should occur, test if it's excluded
if ($occurs) {
foreach ($this->exdates as $exdate) {
if ($exdate == $date) {
return false;
}
}
foreach ($this->exrules as $exrule) {
if ($exrule->occursAt($date)) {
return false;
}
}
}
return $occurs;
}
///////////////////////////////////////////////////////////////////////////////
// ArrayAccess interface
/**
* @internal
*/
public function offsetExists($offset)
{
return is_numeric($offset) && $offset >= 0 && ! is_float($offset) && $offset < count($this);
}
/**
* @internal
*/
public function offsetGet($offset)
{
if (! is_numeric($offset) || $offset < 0 || is_float($offset)) {
throw new \InvalidArgumentException('Illegal offset type: '.gettype($offset));
}
if (isset($this->cache[$offset])) {
// found in cache
return clone $this->cache[$offset];
}
elseif ($this->total !== null) {
// cache complete and not found in cache
return null;
}
// not in cache and cache not complete, we have to loop to find it
$i = 0;
foreach ($this as $occurrence) {
if ($i == $offset) {
return $occurrence;
}
$i++;
if ($i > $offset) {
break;
}
}
return null;
}
/**
* @internal
*/
public function offsetSet($offset, $value)
{
throw new \LogicException('Setting a Date in a RSet is not supported (use addDate)');
}
/**
* @internal
*/
public function offsetUnset($offset)
{
throw new \LogicException('Unsetting a Date in a RSet is not supported (use addDate)');
}
///////////////////////////////////////////////////////////////////////////////
// Countable interface
/**
* Returns the number of recurrences in this set. It will have go
* through the whole recurrence, if this hasn't been done before, which
* introduces a performance penality.
* @return int
*/
public function count()
{
if ($this->isInfinite()) {
throw new \LogicException('Cannot count an infinite recurrence set.');
}
if ($this->total === null) {
foreach ($this as $occurrence) {}
}
return $this->total;
}
///////////////////////////////////////////////////////////////////////////////
// Private methods
// cache variables
protected $rlist_heap = null;
protected $rlist_iterator = null;
protected $exlist_heap = null;
protected $exlist_iterator = null;
/**
* This method will iterate over a bunch of different iterators (rrules and arrays),
* keeping the results *in order*, while never attempting to merge or sort
* anything in memory. It can combine both finite and infinite rrule.
*
* What we need to do it to build two heaps: rlist and exlist
* Each heap contains multiple iterators (either RRule or ArrayIterator)
* At each step of the loop, it calls all of the iterators to generate a new item,
* and stores them in the heap, that keeps them in order.
*
* This is made slightly more complicated because this method is a generator.
*
* @param $reset (bool) Whether to restart the iteration, or keep going
* @return \DateTime|null
*/
public function getIterator()
{
$previous_occurrence = null;
$total = 0;
foreach ($this->cache as $occurrence) {
yield clone $occurrence; // since DateTime is not immutable, avoid any problem
$total += 1;
}
if ($this->rlist_heap === null) {
// rrules + rdate
$this->rlist_heap = new \SplMinHeap();
$this->rlist_iterator = new \MultipleIterator(\MultipleIterator::MIT_NEED_ANY);
$this->rlist_iterator->attachIterator(new \ArrayIterator($this->rdates));
foreach ($this->rrules as $rrule) {
$this->rlist_iterator->attachIterator($rrule->getIterator());
}
$this->rlist_iterator->rewind();
// exrules + exdate
$this->exlist_heap = new \SplMinHeap();
$this->exlist_iterator = new \MultipleIterator(\MultipleIterator::MIT_NEED_ANY);
$this->exlist_iterator->attachIterator(new \ArrayIterator($this->exdates));
foreach ($this->exrules as $rrule) {
$this->exlist_iterator->attachIterator($rrule->getIterator());
}
$this->exlist_iterator->rewind();
}
while (true) {
foreach ($this->rlist_iterator->current() as $date) {
if ($date !== null) {
$this->rlist_heap->insert($date);
}
}
$this->rlist_iterator->next(); // advance the iterator for the next call
if ($this->rlist_heap->isEmpty()) {
break; // exit the loop to stop the iterator
}
$occurrence = $this->rlist_heap->top();
$this->rlist_heap->extract(); // remove the occurrence from the heap
if ($occurrence == $previous_occurrence) {
continue; // skip, was already considered
}
// now we need to check against exlist
// we need to iterate exlist as long as it contains dates lower than occurrence
// (they will be discarded), and then check if the date is the same
// as occurrence (in which case it is discarded)
$excluded = false;
while (true) {
foreach ($this->exlist_iterator->current() as $date) {
if ($date !== null) {
$this->exlist_heap->insert($date);
}
}
$this->exlist_iterator->next(); // advance the iterator for the next call
if ($this->exlist_heap->isEmpty()) {
break 1; // break this loop only
}
$exdate = $this->exlist_heap->top();
if ($exdate < $occurrence) {
$this->exlist_heap->extract();
continue;
}
elseif ($exdate == $occurrence) {
$excluded = true;
break 1;
}
else {
break 1; // exdate is > occurrence, so we'll keep it for later
}
}
$previous_occurrence = $occurrence;
if ($excluded) {
continue;
}
$total += 1;
$this->cache[] = clone $occurrence;
yield clone $occurrence; // = yield
}
$this->total = $total; // save total for count cache
return; // stop the iterator
}
}

View File

@ -0,0 +1,328 @@
<?php
/**
* Licensed under the MIT license.
*
* For the full copyright and license information, please view the LICENSE file.
*
* @author Rémi Lanvin <remi@cloudconnected.fr>
* @link https://github.com/rlanvin/php-rrule
*/
namespace RRule;
/**
* Collection of static methods to parse RFC strings.
*
* This is used internally by RRule and RSet. The methods are public, BUT this
* isn't part of the public API of this library. Therefore there is no guarantee
* they will not break even for a minor version release.
*
* @internal
*/
class RfcParser
{
static $tzdata = null;
/**
* High level "line".
* Explode a line into property name, property parameters and property value
*/
static public function parseLine($line, array $default = array())
{
$line = trim($line);
$property = array_merge(array(
'name' => '',
'params' => array(),
'value' => null
), $default);
if (strpos($line,':') === false) {
if (! $property['name']) {
throw new \InvalidArgumentException('Failed to parse RFC line, missing property name followed by ":"');
}
$property['value'] = $line;
}
else {
list($property['name'],$property['value']) = explode(':', $line);
$tmp = explode(';',$property['name']);
$property['name'] = $tmp[0];
array_splice($tmp,0,1);
foreach ($tmp as $pair) {
if (strpos($pair,'=') === false) {
throw new \InvalidArgumentException('Failed to parse RFC line, invalid property parameters: '.$pair);
}
list($key,$value) = explode('=',$pair);
$property['params'][$key] = $value;
}
}
return $property;
}
/**
* Parse both DTSTART and RRULE (and EXRULE).
*
* It's impossible to accuratly parse a RRULE in isolation (without the DTSTART)
* as some tests depends on DTSTART (notably the date format for UNTIL).
*
* @param string $string The RFC-like string
* @param mixed $dtstart The default dtstart to be used (if not in the string)
* @return array
*/
static public function parseRRule($string, $dtstart = null)
{
$string = trim($string);
$parts = array();
$dtstart_type = null;
$rfc_date_regexp = '/\d{6}(T\d{6})?Z?/'; // regexp to check the date, a bit loose
$nb_dtstart = 0;
$nb_rrule = 0;
$lines = explode("\n", $string);
if ($dtstart) {
$nb_dtstart = 1;
if (is_string($dtstart)) {
if (strlen($dtstart) == 10) {
$dtstart_type = 'date';
}
else {
$dtstart_type = 'localtime';
}
}
else {
$dtstart_type = 'tzid';
}
$parts['DTSTART'] = RRule::parseDate($dtstart);
}
foreach ($lines as $line) {
$property = self::parseLine($line, array(
'name' => sizeof($lines) > 1 ? null : 'RRULE' // allow missing property name for single-line RRULE
));
switch (strtoupper($property['name'])) {
case 'DTSTART':
$nb_dtstart += 1;
if ($nb_dtstart > 1) {
throw new \InvalidArgumentException('Too many DTSTART properties (there can be only one)');
}
$tmp = null;
$dtstart_type = 'date';
if (! preg_match($rfc_date_regexp, $property['value'])) {
throw new \InvalidArgumentException(
'Invalid DTSTART property: date or date time format incorrect'
);
}
if (isset($property['params']['TZID'])) {
// TZID must only be specified if this is a date-time (see section 3.3.4 & 3.3.5 of RFC 5545)
if (strpos($property['value'], 'T') === false) {
throw new \InvalidArgumentException(
'Invalid DTSTART property: TZID should not be specified if there is no time component'
);
}
// The "TZID" property parameter MUST NOT be applied to DATE-TIME
// properties whose time values are specified in UTC.
if (strpos($property['value'], 'Z') !== false) {
throw new \InvalidArgumentException(
'Invalid DTSTART property: TZID must not be applied when time is specified in UTC'
);
}
$dtstart_type = 'tzid';
$tmp = self::parseTimeZone($property['params']['TZID']);
}
elseif (strpos($property['value'], 'T') !== false) {
if (strpos($property['value'], 'Z') === false) {
$dtstart_type = 'localtime'; // no timezone
}
else {
$dtstart_type = 'utc';
}
}
$parts['DTSTART'] = new \DateTime($property['value'], $tmp);
break;
case 'RRULE':
case 'EXRULE':
$nb_rrule += 1;
if ($nb_rrule > 1) {
throw new \InvalidArgumentException('Too many RRULE properties (there can be only one)');
}
foreach (explode(';',$property['value']) as $pair) {
$pair = explode('=', $pair);
if (! isset($pair[1]) || isset($pair[2])) {
throw new \InvalidArgumentException("Failed to parse RFC string, malformed RRULE property: {$property['value']}");
}
list($key, $value) = $pair;
if ($key === 'UNTIL') {
if (! preg_match($rfc_date_regexp, $value)) {
throw new \InvalidArgumentException(
'Invalid UNTIL property: date or date time format incorrect'
);
}
switch ($dtstart_type) {
case 'date':
if (strpos($value, 'T') !== false) {
throw new \InvalidArgumentException(
'Invalid UNTIL property: The value of the UNTIL rule part MUST be a date if DTSTART is a date.'
);
}
break;
case 'localtime':
if (strpos($value, 'T') === false || strpos($value, 'Z') !== false) {
throw new \InvalidArgumentException(
'Invalid UNTIL property: if the "DTSTART" property is specified as a date with local time, then the UNTIL rule part MUST also be specified as a date with local time'
);
}
break;
case 'tzid':
case 'utc':
if (strpos($value, 'T') === false || strpos($value, 'Z') === false) {
throw new \InvalidArgumentException(
'Invalid UNTIL property: if the "DTSTART" property is specified as a date with UTC time or a date with local time and time zone reference, then the UNTIL rule part MUST be specified as a date with UTC time.'
);
}
break;
}
$value = new \DateTime($value);
}
elseif ($key === 'DTSTART') {
if (isset($parts['DTSTART'])) {
throw new \InvalidArgumentException('DTSTART cannot be part of RRULE and has already been defined');
}
// this is an invalid rule, however we'll support it since the JS lib is broken
// see https://github.com/rlanvin/php-rrule/issues/25
trigger_error("This string is not compliant with the RFC (DTSTART cannot be part of RRULE). It is accepted as is for compability reasons only.", E_USER_NOTICE);
}
$parts[$key] = $value;
}
break;
default:
throw new \InvalidArgumentException('Failed to parse RFC string, unsupported property: '.$property['name']);
}
}
return $parts;
}
/**
* Parse RDATE and return an array of DateTime
*/
static public function parseRDate($line)
{
$property = self::parseLine($line);
if ($property['name'] !== 'RDATE') {
throw new \InvalidArgumentException("Failed to parse RDATE line, this is a {$property['name']} property");
}
$period = false;
$tz = null;
foreach ($property['params'] as $name => $value) {
switch (strtoupper($name)) {
case 'TZID':
$tz = new \DateTimeZone($value);
break;
case 'VALUE':
switch ($value) {
case 'DATE':
case 'DATE-TIME':
break;
case 'PERIOD':
$period = true;
break;
default:
throw new \InvalidArgumentException("Unknown VALUE value for RDATE: $value, must be one of DATE-TIME, DATE or PERIOD");
}
break;
default:
throw new \InvalidArgumentException("Unknown property parameter: $name");
}
}
$dates = array();
foreach (explode(',',$property['value']) as $value) {
if ($period) {
if (strpos($value,'/') === false) {
throw new \InvalidArgumentException('Invalid period in RDATE');
}
// period is unsupported!
trigger_error('VALUE=PERIOD is not supported and ignored', E_USER_NOTICE);
}
else {
if (strpos($value, 'Z')) {
if ($tz !== null) {
throw new \InvalidArgumentException('Invalid RDATE property: TZID must not be applied when time is specified in UTC');
}
$dates[] = new \DateTime($value);
}
else {
$dates[] = new \DateTime($value, $tz);
}
// TODO should check that only dates are provided with VALUE=DATE, and so on.
}
}
return $dates;
}
/**
* Parse EXDATE and return an array of DateTime
*/
static public function parseExDate($line)
{
$property = self::parseLine($line);
if ($property['name'] !== 'EXDATE') {
throw new \InvalidArgumentException("Failed to parse EXDATE line, this is a {$property['name']} property");
}
$tz = null;
foreach ($property['params'] as $name => $value) {
switch (strtoupper($name)) {
case 'VALUE':
// Ignore optional words
break;
case 'TZID':
$tz = new \DateTimeZone($value);
break;
default:
throw new \InvalidArgumentException("Unknown property parameter: $name");
}
}
$dates = array();
foreach (explode(',',$property['value']) as $value) {
if (strpos($value, 'Z')) {
if ($tz !== null) {
throw new \InvalidArgumentException('Invalid EXDATE property: TZID must not be applied when time is specified in UTC');
}
$dates[] = new \DateTime($value);
}
else {
$dates[] = new \DateTime($value, $tz);
}
}
return $dates;
}
/**
* Create a new DateTimeZone object, converting non-standard timezone.
*
* @see https://github.com/rlanvin/php-rrule/issues/69
*/
static public function parseTimeZone($tzid)
{
if (self::$tzdata === null) {
self::$tzdata = require __DIR__.'/tzdata/windows.php';
}
if (isset(self::$tzdata[$tzid])) {
return new \DateTimeZone(self::$tzdata[$tzid]);
}
return new \DateTimeZone($tzid);
}
}

150
vendor/rlanvin/php-rrule/src/i18n/de.php vendored Normal file
View File

@ -0,0 +1,150 @@
<?php
/**
* Translation file for German language.
*
* Most strings can be an array, with a value as the key. The system will
* pick the translation corresponding to the key. The key "else" will be picked
* if no matching value is found. This is useful for plurals.
*
* Licensed under the MIT license.
*
* For the full copyright and license information, please view the LICENSE file.
*
* @author Rémi Lanvin <remi@cloudconnected.fr>
* @link https://github.com/rlanvin/php-rrule
*/
return array(
'yearly' => array(
'1' => 'Jährlich',
'else' => 'Alle %{interval} Jahre'
),
'monthly' => array(
'1' => 'Monatlich',
'else' => 'Alle %{interval} Monate'
),
'weekly' => array(
'1' => 'Wöchentlich',
'else' => 'Alle %{interval} Wochen'
),
'daily' => array(
'1' => 'Täglich',
'else' => 'Alle %{interval} Tage'
),
'hourly' => array(
'1' => 'Stündlich',
'else' => 'Alle %{interval} Stunden'
),
'minutely' => array(
'1' => 'Minütlich',
'else' => 'Alle %{interval} Minuten'
),
'secondly' => array(
'1' => 'Sekündlich',
'else' => 'Alle %{interval} Sekunden'
),
'dtstart' => ', ab dem %{date}',
'infinite' => ', für immer',
'until' => ', bis zum %{date}',
'count' => array(
'1' => ', einmalig',
'else' => ', %{count} Mal'
),
'and' => 'und',
'x_of_the_y' => array(
'yearly' => '%{x} des Jahres', // e.g. the first Monday of the year, or the first day of the year
'monthly' => '%{x} des Monats',
),
'bymonth' => ' im %{months}',
'months' => array(
1 => 'Januar',
2 => 'Februar',
3 => 'März',
4 => 'April',
5 => 'Mai',
6 => 'Juni',
7 => 'Juli',
8 => 'August',
9 => 'September',
10 => 'Oktober',
11 => 'November',
12 => 'Dezember',
),
'byweekday' => ' %{weekdays}',
'weekdays' => array(
1 => 'Montags',
2 => 'Dienstags',
3 => 'Mittwochs',
4 => 'Donnerstags',
5 => 'Freitags',
6 => 'Samstags',
7 => 'Sonntags',
),
'nth_weekday' => array(
'1' => 'der erste %{weekday}', // e.g. the first Monday
'2' => 'der zweite %{weekday}',
'3' => 'der dritte %{weekday}',
'else' => 'der %{n}. %{weekday}'
),
'-nth_weekday' => array(
'-1' => 'der letzte %{weekday}', // e.g. the last Monday
'-2' => 'der vorletzte %{weekday}',
'else' => 'der %{n}. letzte %{weekday}'
),
'byweekno' => array(
'1' => ' in Kalenderwoche %{weeks}',
'else' => ' in Kalenderwoche %{weeks}'
),
'nth_weekno' => '%{n}',
'bymonthday' => ' am %{monthdays}',
'nth_monthday' => array(
'1' => 'ersten Tag',
'else' => '%{n}. Tag'
),
'-nth_monthday' => array(
'-1' => 'letzten Tag',
'else' => '%{n}. letzten Tag'
),
'byyearday' => array(
'1' => ' am %{yeardays} Tag',
'else' => ' am %{yeardays} Tag'
),
'nth_yearday' => array(
'1' => 'ersten',
'2' => 'zweiten',
'3' => 'dritten',
'else' => '%{n}.'
),
'-nth_yearday' => array(
'-1' => 'der letzte',
'-2' => 'der vorletzte',
'else' => 'der %{n}. letzte'
),
'byhour' => array(
'1' => ' um %{hours} Uhr',
'else' => ' um %{hours} Uhr'
),
'nth_hour' => '%{n}',
'byminute' => array(
'1' => ' und %{minutes} Minute',
'else' => ' und %{minutes} Minuten'
),
'nth_minute' => '%{n}',
'bysecond' => array(
'1' => ' und %{seconds} Sekunde',
'else' => ' und %{seconds} Sekunden'
),
'nth_second' => '%{n}',
'bysetpos' => ', nur %{setpos} Auftreten',
'nth_setpos' => array(
'1' => 'das erste',
'2' => 'das zweite',
'3' => 'das dritte',
'else' => 'das %{n}.'
),
'-nth_setpos' => array(
'-1' => 'die letzte',
'-2' => 'die vorletzte',
'else' => 'die %{n}. letzte'
)
);

167
vendor/rlanvin/php-rrule/src/i18n/en.php vendored Normal file
View File

@ -0,0 +1,167 @@
<?php
/**
* Translation file for English language.
*
* Most strings can be an array, with a value as the key. The system will
* pick the translation corresponding to the key. The key "else" will be picked
* if no matching value is found. This is useful for plurals.
*
* Licensed under the MIT license.
*
* For the full copyright and license information, please view the LICENSE file.
*
* @author Rémi Lanvin <remi@cloudconnected.fr>
* @link https://github.com/rlanvin/php-rrule
*/
return array(
'yearly' => array(
'1' => 'yearly',
'else' => 'every %{interval} years'
),
'monthly' => array(
'1' => 'monthly',
'else' => 'every %{interval} months'
),
'weekly' => array(
'1' => 'weekly',
'2' => 'every other week',
'else' => 'every %{interval} weeks'
),
'daily' => array(
'1' => 'daily',
'2' => 'every other day',
'else' => 'every %{interval} days'
),
'hourly' => array(
'1' => 'hourly',
'else' => 'every %{interval} hours'
),
'minutely' => array(
'1' => 'minutely',
'else' => 'every %{interval} minutes'
),
'secondly' => array(
'1' => 'secondly',
'else' => 'every %{interval} seconds'
),
'dtstart' => ', starting from %{date}',
'infinite' => ', forever',
'until' => ', until %{date}',
'count' => array(
'1' => ', one time',
'else' => ', %{count} times'
),
'and' => 'and',
'x_of_the_y' => array(
'yearly' => '%{x} of the year', // e.g. the first Monday of the year, or the first day of the year
'monthly' => '%{x} of the month',
),
'bymonth' => ' in %{months}',
'months' => array(
1 => 'January',
2 => 'February',
3 => 'March',
4 => 'April',
5 => 'May',
6 => 'June',
7 => 'July',
8 => 'August',
9 => 'September',
10 => 'October',
11 => 'November',
12 => 'December',
),
'byweekday' => ' on %{weekdays}',
'weekdays' => array(
1 => 'Monday',
2 => 'Tuesday',
3 => 'Wednesday',
4 => 'Thursday',
5 => 'Friday',
6 => 'Saturday',
7 => 'Sunday',
),
'nth_weekday' => array(
'1' => 'the first %{weekday}', // e.g. the first Monday
'2' => 'the second %{weekday}',
'3' => 'the third %{weekday}',
'else' => 'the %{n}th %{weekday}'
),
'-nth_weekday' => array(
'-1' => 'the last %{weekday}', // e.g. the last Monday
'-2' => 'the penultimate %{weekday}',
'-3' => 'the antepenultimate %{weekday}',
'else' => 'the %{n}th to the last %{weekday}'
),
'byweekno' => array(
'1' => ' on week %{weeks}',
'else' => ' on weeks number %{weeks}'
),
'nth_weekno' => '%{n}',
'bymonthday' => ' on %{monthdays}',
'nth_monthday' => array(
'1' => 'the 1st',
'2' => 'the 2nd',
'3' => 'the 3rd',
'21' => 'the 21st',
'22' => 'the 22nd',
'23' => 'the 23rd',
'31' => 'the 31st',
'else' => 'the %{n}th'
),
'-nth_monthday' => array(
'-1' => 'the last day',
'-2' => 'the penultimate day',
'-3' => 'the antepenultimate day',
'-21' => 'the 21st to the last day',
'-22' => 'the 22nd to the last day',
'-23' => 'the 23rd to the last day',
'-31' => 'the 31st to the last day',
'else' => 'the %{n}th to the last day'
),
'byyearday' => array(
'1' => ' on %{yeardays} day',
'else' => ' on %{yeardays} days'
),
'nth_yearday' => array(
'1' => 'the first',
'2' => 'the second',
'3' => 'the third',
'else' => 'the %{n}th'
),
'-nth_yearday' => array(
'-1' => 'the last',
'-2' => 'the penultimate',
'-3' => 'the antepenultimate',
'else' => 'the %{n}th to the last'
),
'byhour' => array(
'1' => ' at %{hours}',
'else' => ' at %{hours}'
),
'nth_hour' => '%{n}h',
'byminute' => array(
'1' => ' at minute %{minutes}',
'else' => ' at minutes %{minutes}'
),
'nth_minute' => '%{n}',
'bysecond' => array(
'1' => ' at second %{seconds}',
'else' => ' at seconds %{seconds}'
),
'nth_second' => '%{n}',
'bysetpos' => ', but only %{setpos} instance of this set',
'nth_setpos' => array(
'1' => 'the first',
'2' => 'the second',
'3' => 'the third',
'else' => 'the %{n}th'
),
'-nth_setpos' => array(
'-1' => 'the last',
'-2' => 'the penultimate',
'-3' => 'the antepenultimate',
'else' => 'the %{n}th to the last'
)
);

160
vendor/rlanvin/php-rrule/src/i18n/es.php vendored Normal file
View File

@ -0,0 +1,160 @@
<?php
/**
* Translation file for Spanish language.
*
* @author Miguel Romero <mromero91.mr@gmail.com>
* @link https://github.com/rlanvin/php-rrule
*/
return array(
'yearly' => array(
'1' => 'anual',
'else' => 'cada %{interval} años' // cada 8 años
),
'monthly' => array(
'1' => 'mensual',
'else' => 'cada %{interval} meses' //cada 8 meses
),
'weekly' => array(
'1' => 'semanal',
'2' => 'cualquier otra semana',
'else' => 'cada %{interval} semanas' // cada 8 semanas
),
'daily' => array(
'1' => 'diario',
'2' => 'cualquier otro día',
'else' => 'cada %{interval} días' // cada 8 días
),
'hourly' => array(
'1' => 'cada hora',
'else' => 'cada %{interval} horas'// cada 8 horas
),
'minutely' => array(
'1' => 'cada minuto',
'else' => 'cada %{interval} minutos'// cada 8 minutos
),
'secondly' => array(
'1' => 'segundo lugar',
'else' => 'cada %{interval} segundos'// cada 8 segundos
),
'dtstart' => ', empezando desde %{date}',
'infinite' => ', por siempre',
'until' => ', hasta %{date}',
'count' => array(
'1' => ', una vez',
'else' => ', %{count} veces'
),
'and' => 'y',
'x_of_the_y' => array(
'yearly' => '%{x} del año', // e.g. the first Monday of the year, or the first day of the year
'monthly' => '%{x} del mes',
),
'bymonth' => ' en %{months}',
'months' => array(
1 => 'Enero',
2 => 'Febrero',
3 => 'Marzo',
4 => 'Abril',
5 => 'Mayo',
6 => 'Junio',
7 => 'Julio',
8 => 'Agosto',
9 => 'Septiembre',
10 => 'Octubre',
11 => 'Noviembre',
12 => 'Diciembre',
),
'byweekday' => ' en %{weekdays}',
'weekdays' => array(
1 => 'Lunes',
2 => 'Martes',
3 => 'Miercoles',
4 => 'Jueves',
5 => 'Viernes',
6 => 'Sabado',
7 => 'Domingo',
),
'nth_weekday' => array(
'1' => 'El primer %{weekday}', // e.g. the first Monday
'2' => 'El segundo %{weekday}',
'3' => 'El tercero %{weekday}',
'else' => 'El %{n}° %{weekday}'
),
'-nth_weekday' => array(
'-1' => 'El último %{weekday}', // e.g. the last Monday
'-2' => 'El penúltimo %{weekday}',
'-3' => 'El antepenúltimo %{weekday}',
'else' => 'El %{n}° hasta el último %{weekday}'
),
'byweekno' => array(
'1' => ' en semana %{weeks}',
'else' => ' en semana # %{weeks}'
),
'nth_weekno' => '%{n}',
'bymonthday' => ' en %{monthdays}',
'nth_monthday' => array(
'1' => 'El 1°',
'2' => 'El 2°',
'3' => 'El 3°',
'21' => 'El 21°',
'22' => 'El 22°',
'23' => 'El 23°',
'31' => 'El 31°',
'else' => 'El %{n}°'
),
'-nth_monthday' => array(
'-1' => 'El último día',
'-2' => 'El penúltimo día',
'-3' => 'El antepenúltimo día',
'-21' => 'El 21° hasta el último día',
'-22' => 'El 22° hasta el último día',
'-23' => 'El 23° hasta el último día',
'-31' => 'El 31° hasta el último día',
'else' => 'El %{n}° hasta el último día'
),
'byyearday' => array(
'1' => ' en %{yeardays} día',
'else' => ' en %{yeardays} días'
),
'nth_yearday' => array(
'1' => 'El primero',
'2' => 'El segundo',
'3' => 'El tercero',
'else' => 'El %{n}°'
),
'-nth_yearday' => array(
'-1' => 'El último',
'-2' => 'El penúltimo',
'-3' => 'El antepenúltimo',
'else' => 'El %{n}° hasta el último'
),
'byhour' => array(
'1' => ' a %{hours}',
'else' => ' a %{hours}'
),
'nth_hour' => '%{n}h',
'byminute' => array(
'1' => ' a minutos %{minutes}',
'else' => ' a minutos %{minutes}'
),
'nth_minute' => '%{n}',
'bysecond' => array(
'1' => ' a segundo %{seconds}',
'else' => ' a segundo %{seconds}'
),
'nth_second' => '%{n}',
'bysetpos' => ', pero solo %{setpos} instancia de este conjunto',
'nth_setpos' => array(
'1' => 'El primer',
'2' => 'El segundo',
'3' => 'El tercero',
'else' => 'El %{n}°'
),
'-nth_setpos' => array(
'-1' => 'El último',
'-2' => 'El penúltimo',
'-3' => 'El antepenúltimo',
'else' => 'El %{n}° hasta el último'
)
);

167
vendor/rlanvin/php-rrule/src/i18n/fa.php vendored Normal file
View File

@ -0,0 +1,167 @@
<?php
/**
* Translation file for English language.
*
* Most strings can be an array, with a value as the key. The system will
* pick the translation corresponding to the key. The key "else" will be picked
* if no matching value is found. This is useful for plurals.
*
* Licensed under the MIT license.
*
* For the full copyright and license information, please view the LICENSE file.
*
* @author Rémi Lanvin <remi@cloudconnected.fr>
* @link https://github.com/rlanvin/php-rrule
*/
return array(
'yearly' => array(
'1' => 'سالانه',
'else' => 'هر %{interval} سال'
),
'monthly' => array(
'1' => 'ماهانه',
'else' => 'هر %{interval} ماه'
),
'weekly' => array(
'1' => 'هفتگی',
'2' => 'هر هفته دیگر',
'else' => 'هر %{interval} هفته'
),
'daily' => array(
'1' => 'روزانه',
'2' => 'هر روز دیگر',
'else' => 'هر %{interval} روز'
),
'hourly' => array(
'1' => 'ساعتی',
'else' => 'هر %{interval} ساعت'
),
'minutely' => array(
'1' => 'دقیقه ای',
'else' => 'هر %{interval} دقیقه'
),
'secondly' => array(
'1' => 'ثانیه ای',
'else' => 'هر %{interval} ثانیه'
),
'dtstart' => ', از %{date}',
'infinite' => ', همیشه',
'until' => ', تا %{date}',
'count' => array(
'1' => ', یکبار',
'else' => ', %{count} بار'
),
'and' => 'و',
'x_of_the_y' => array(
'yearly' => '%{x} از سال', // e.g. the first Monday of the year, or the first day of the year
'monthly' => '%{x} از ماه',
),
'bymonth' => ' در %{months}',
'months' => array(
1 => 'January',
2 => 'February',
3 => 'March',
4 => 'April',
5 => 'May',
6 => 'June',
7 => 'July',
8 => 'August',
9 => 'September',
10 => 'October',
11 => 'November',
12 => 'December',
),
'byweekday' => ' در %{weekdays}',
'weekdays' => array(
1 => 'دوشنبه',
2 => 'سه شنبه',
3 => 'چهارشنبه',
4 => 'پنج شنبه',
5 => 'جمعه',
6 => 'شنبه',
7 => 'یکشنبه',
),
'nth_weekday' => array(
'1' => 'اولین %{weekday}', // e.g. the first Monday
'2' => 'دومین %{weekday}',
'3' => 'سومین %{weekday}',
'else' => '%{n}اٌمین %{weekday}'
),
'-nth_weekday' => array(
'-1' => 'آخرین %{weekday}', // e.g. the last Monday
'-2' => 'دو روز مونده به %{weekday}',
'-3' => 'سه زور مونده به %{weekday}',
'else' => '%{n} روز مونده به %{weekday}'
),
'byweekno' => array(
'1' => ' در %{weeks}',
'else' => ' در شماره هفته %{weeks}'
),
'nth_weekno' => '%{n}',
'bymonthday' => ' در %{monthdays}',
'nth_monthday' => array(
'1' => 'اولین',
'2' => 'دومین',
'3' => 'سومین',
'21' => '۲۱اْمین',
'22' => '۲۲اْمین',
'23' => '۲۳اْمین',
'31' => '۳۱اْمین',
'else' => 'در %{n}اْمین'
),
'-nth_monthday' => array(
'-1' => 'the last day',
'-2' => 'the penultimate day',
'-3' => 'the antepenultimate day',
'-21' => 'the 21st to the last day',
'-22' => 'the 22nd to the last day',
'-23' => 'the 23rd to the last day',
'-31' => 'the 31st to the last day',
'else' => 'the %{n}th to the last day'
),
'byyearday' => array(
'1' => ' در %{yeardays} روز',
'else' => ' در %{yeardays} روز'
),
'nth_yearday' => array(
'1' => 'اولین',
'2' => 'دومین',
'3' => 'سومین',
'else' => '%{n}اٌمین'
),
'-nth_yearday' => array(
'-1' => 'آخرین',
'-2' => 'دو روز مونده',
'-3' => 'سه روز مونده',
'else' => '%{n}اٌمین مونده به آخر'
),
'byhour' => array(
'1' => ' ساعت %{hours}',
'else' => ' ساعت %{hours}'
),
'nth_hour' => '%{n}',
'byminute' => array(
'1' => ':%{minutes}',
'else' => ' در %{minutes}'
),
'nth_minute' => '%{n}',
'bysecond' => array(
'1' => ' at second %{seconds}',
'else' => ' at seconds %{seconds}'
),
'nth_second' => '%{n}',
'bysetpos' => ', but only %{setpos} instance of this set',
'nth_setpos' => array(
'1' => 'اولین',
'2' => 'دومین',
'3' => 'سومین',
'else' => '%{n}اٌمین'
),
'-nth_setpos' => array(
'-1' => 'آخرین',
'-2' => 'دو روز مونده',
'-3' => 'سه روز مونده',
'else' => '%{n}اٌمین مونده به آخر'
)
);

136
vendor/rlanvin/php-rrule/src/i18n/fi.php vendored Normal file
View File

@ -0,0 +1,136 @@
<?php
/**
* Translation file for Finnish language.
*
* Licensed under the MIT license.
*
* For the full copyright and license information, please view the LICENSE file.
*
* @author Rémi Lanvin <remi@cloudconnected.fr>
* @link https://github.com/rlanvin/php-rrule
*
* @see http://people.uta.fi/~km56049/finnish/timexp.html
*/
return array(
'yearly' => array(
'1' => 'joka vuosi',
'2' => 'joka toinen vuosi',
'else' => '%{interval} vuoden välein'
),
'monthly' => array(
'1' => 'joka kuukausi',
'2' => 'joka toinen kuukausi',
'else' => '%{count} kuukauden välein'
),
'weekly' => array(
'1' => 'joka viikko',
'2' => 'joka toinen viikko',
'else' => '%{interval} viikon välein'
),
'daily' => array(
'1' => 'joka päivä',
'2' => 'joka toinen päivä',
'else' => '%{count} päivän välein'
),
'hourly' => array(
'1' => 'joka tunti',
'else' => 'joka %{interval} tunti'
),
'minutely' => array(
'1' => 'joka minuutti',
'else' => 'joka %{interval} minuutti'
),
'secondly' => array(
'1' => 'joka sekunti',
'else' => 'joka %{interval} sekunti'
),
'dtstart' => ', alkaen %{date}',
'infinite' => ', jatkuvasti',
'until' => ', %{date} asti',
'count' => array(
'1' => ', kerran',
'else' => ', %{count} kertaa'
),
'and' => 'ja',
'x_of_the_y' => array(
'yearly' => '%{x} vuodessa', // e.g. the first Monday of the year, or the first day of the year
'monthly' => '%{x} kuukaudessa',
),
'bymonth' => ' %{months}',
'months' => array(
1 => 'tammikuussa',
2 => 'helmikuussa',
3 => 'maaliskuussa',
4 => 'huhtikuussa',
5 => 'toukokuussa',
6 => 'kesäkuussa',
7 => 'heinäkuussa',
8 => 'elokuussa',
9 => 'syyskuussa',
10 => 'lokakuussa',
11 => 'marraskuussa',
12 => 'joulukuussa',
),
'byweekday' => ' %{weekdays}',
'weekdays' => array(
1 => 'maanantaina',
2 => 'tiistaina',
3 => 'keskiviikkona',
4 => 'torstaina',
5 => 'perjantaina',
6 => 'lauantaina',
7 => 'sunnuntaina',
),
'nth_weekday' => array(
'else' => '%{n}. %{weekday}'
),
'-nth_weekday' => array(
'-1' => 'viimeinen %{weekday}', // e.g. the last Monday
'-2' => 'toiseksi viimeinen %{weekday}',
'else' => '%{n}:ksi viimeinen %{weekday}'
),
'byweekno' => array(
'1' => ' viikkona %{weeks}',
'else' => ' viikkoina %{weeks}'
),
'nth_weekno' => '%{n}',
'bymonthday' => ' %{monthdays} päivä',
'nth_monthday' => array(
'else' => '%{n}.'
),
'-nth_monthday' => array(
'-1' => 'viimeinen',
'else' => '%{n}:ksi viimeinen'
),
'byyearday' => array(
'else' => ' %{yeardays} päivä'
),
'nth_yearday' => array(
'else' => '%{n}.'
),
'-nth_yearday' => array(
'-1' => 'viimeinen',
'else' => '%{n}:ksi viimeinen'
),
'byhour' => array(
'else' => ' klo. %{hours}'
),
'nth_hour' => '%{n}',
'byminute' => array(
'else' => ', minuutteina %{minutes}'
),
'nth_minute' => '%{n}',
'bysecond' => array(
'else' => ', sekunteina %{seconds}'
),
'nth_second' => '%{n}',
'bysetpos' => ', mutta vain %{setpos} tapaus edellä mainituista',
'nth_setpos' => array(
'else' => '%{n}.'
),
'-nth_setpos' => array(
'-1' => 'viimeinen',
'else' => '%{n}:ksi viimeinen'
)
);

155
vendor/rlanvin/php-rrule/src/i18n/fr.php vendored Normal file
View File

@ -0,0 +1,155 @@
<?php
/**
* Translation file for French language.
*
* Licensed under the MIT license.
*
* For the full copyright and license information, please view the LICENSE file.
*
* @author Rémi Lanvin <remi@cloudconnected.fr>
* @link https://github.com/rlanvin/php-rrule
*/
return array(
'yearly' => array(
'1' => 'tous les ans',
'2' => 'un an sur deux',
'else' => 'tous les %{interval} ans'
),
'monthly' => array(
'1' => 'tous les mois',
'2' => 'un mois sur deux',
'else' => 'tous les %{interval} mois'
),
'weekly' => array(
'1' => 'toutes les semaines',
'2' => 'une semaine sur deux',
'else' => 'toutes les %{interval} semaines'
),
'daily' => array(
'1' => 'tous les jours',
'2' => 'un jour sur deux',
'else' => 'tous les %{interval} jours'
),
'hourly' => array(
'1' => 'toutes les heures',
'else' => 'toutes les %{interval} heures'
),
'minutely' => array(
'1' => 'toutes les minutes',
'else' => 'toutes les %{interval} minutes'
),
'secondly' => array(
'1' => 'toutes les secondes',
'else' => 'toutes les %{interval} secondes'
),
'dtstart' => ', à partir du %{date}',
'infinite' => ', indéfiniment',
'until' => ', jusqu\'au %{date}',
'count' => array(
'1' => ', une fois',
'else' => ', %{count} fois'
),
'and' => 'et',
'x_of_the_y' => array(
'yearly' => '%{x} de l\'année', // e.g. the first Monday of the year, or the first day of the year
'monthly' => '%{x} du mois',
),
'bymonth' => ' en %{months}',
'months' => array(
1 => 'janvier',
2 => 'février',
3 => 'mars',
4 => 'avril',
5 => 'mai',
6 => 'juin',
7 => 'juillet',
8 => 'août',
9 => 'septembre',
10 => 'octobre',
11 => 'november',
12 => 'décembre',
),
'byweekday' => ' le %{weekdays}',
'weekdays' => array(
1 => 'lundi',
2 => 'mardi',
3 => 'mercredi',
4 => 'jeudi',
5 => 'vendredi',
6 => 'samedi',
7 => 'dimanche',
),
'nth_weekday' => array(
'1' => 'le 1er %{weekday}', // e.g. the first Monday
'else' => 'le %{n}e %{weekday}'
),
'-nth_weekday' => array(
'-1' => 'le dernier %{weekday}', // e.g. the last Monday
'-2' => 'l\'avant-dernier %{weekday}',
'-3' => 'l\'antépénultième %{weekday}',
'else' => 'le %{n}e %{weekday} en partant de la fin'
),
'byweekno' => array(
'1' => ' la semaine %{weeks}',
'else' => ' les semaines %{weeks}'
),
'nth_weekno' => '%{n}',
'bymonthday' => array(
'1' => ' %{monthdays}',
'else' => ' %{monthdays}'
),
'nth_monthday' => array(
'1' => 'le 1er',
'else' => 'le %{n}'
),
'-nth_monthday' => array(
'-1' => 'le dernier jour',
'-2' => 'l\'avant-dernier jour',
'-3' => 'l\'antépénultième jour',
'else' => 'le %{n}e jour en partant de la fin'
),
'byyearday' => array(
'1' => ' le %{yeardays} jour',
'else' => ' les %{yeardays} jours'
),
'nth_yearday' => array(
'1' => '1er',
'else' => '%{n}e'
),
'-nth_yearday' => array(
'-1' => 'dernier',
'-2' => 'avant-dernier',
'-3' => 'antépénultième',
'else' => '%{n}e en partant de la fin'
),
'byhour' => array(
'1' => ' à %{hours}',
'else' => ' à %{hours}'
),
'nth_hour' => '%{n}h',
'byminute' => array(
'1' => ' à la minute %{minutes}',
'else' => ' à la minute %{minutes}'
),
'nth_minute' => '%{n}min',
'bysecond' => array(
'1' => ' à %{seconds}',
'else' => ' à %{seconds}'
),
'nth_second' => '%{n}sec',
'bysetpos' => array(
'1' => ', mais seulement %{setpos} occurrence',
'else' => ', mais seulement %{setpos} occurrence'
),
'nth_setpos' => array(
'1' => 'la 1re',
'else' => 'la %{n}e'
),
'-nth_setpos' => array(
'-1' => 'la dernière',
'-2' => 'l\'avant-dernière',
'-3' => 'l\'antépénultième',
'else' => 'la %{n}e en partant de la fin'
)
);

156
vendor/rlanvin/php-rrule/src/i18n/it.php vendored Normal file
View File

@ -0,0 +1,156 @@
<?php
/**
* Translation file for Italian language.
*
* @author Manuele Grueff <shoresofnowhere@gmail.com>
* @link https://github.com/rlanvin/php-rrule
*/
return array(
'yearly' => array(
'1' => 'annualmente',
'else' => 'ogni %{interval} anni'
),
'monthly' => array(
'1' => 'mensilmente',
'else' => 'ogni %{interval} mesi'
),
'weekly' => array(
'1' => 'settimanalmente',
'2' => 'a settimane alterne',
'else' => 'ogni %{interval} settimana'
),
'daily' => array(
'1' => 'giornalmente',
'2' => 'a giorni alterni',
'else' => 'every %{interval} days'
),
'hourly' => array(
'1' => 'ogni ora',
'else' => 'ogni %{interval} ore'
),
'minutely' => array(
'1' => 'ogni minuto',
'else' => 'ogni %{interval} minuti'
),
'secondly' => array(
'1' => 'ogni secondo',
'else' => 'ogni %{interval} secondi'
),
'dtstart' => ', a partire dal %{date}',
'infinite' => ', per sempre',
'until' => ', fino al %{date}',
'count' => array(
'1' => ', una volta',
'else' => ', %{count} volte'
),
'and' => 'e',
'x_of_the_y' => array(
'yearly' => '%{x} dell\'anno', // e.g. the first Monday of the year, or the first day of the year
'monthly' => '%{x} del mese',
),
'bymonth' => ' in %{months}',
'months' => array(
1 => 'Gennaio',
2 => 'Febbraio',
3 => 'Marzo',
4 => 'Aprile',
5 => 'Maggio',
6 => 'Giugno',
7 => 'Luglio',
8 => 'Agosto',
9 => 'Settembre',
10 => 'Ottobre',
11 => 'Novembre',
12 => 'Dicembre',
),
'byweekday' => ' il %{weekdays}',
'weekdays' => array(
1 => 'Lunedì',
2 => 'Martedì',
3 => 'Mercoledì',
4 => 'Giovedì',
5 => 'Venerdì',
6 => 'Sabato',
7 => 'Domenica',
),
'nth_weekday' => array(
'1' => 'il primo %{weekday}', // e.g. the first Monday
'2' => 'il secondo %{weekday}',
'3' => 'il terzo %{weekday}',
'else' => 'il %{n}o %{weekday}'
),
'-nth_weekday' => array(
'-1' => 'l\'ultimo %{weekday}', // e.g. the last Monday
'-2' => 'il penultimo %{weekday}',
'-3' => 'il secondultimo %{weekday}',
'else' => '%{n} %{weekday} prima dell\'ultimo %{weekday}'
),
'byweekno' => array(
'1' => ' nella %{weeks} settimana',
'else' => ' nelle settimane %{weeks}'
),
'nth_weekno' => '%{n}',
'bymonthday' => ' il %{monthdays}',
'nth_monthday' => array(
'1' => 'il primo',
'2' => 'il secondo',
'3' => 'il terzo',
'21' => 'il ventunesimo',
'22' => 'il ventiduesimo',
'23' => 'il ventitresimo',
'31' => 'il trentunesimo',
'else' => 'il %{n}'
),
'-nth_monthday' => array(
'-1' => 'l\'ultimo giorno',
'-2' => 'il penultimo giorno',
'-3' => 'il secondultimo giorno',
'else' => 'a %{n} giorni dalla fine mese'
),
'byyearday' => array(
'1' => ' on %{yeardays} day',
'else' => ' on %{yeardays} days'
),
'nth_yearday' => array(
'1' => 'il primo',
'2' => 'il secondo',
'3' => 'il terzo',
'else' => 'il %{n}o'
),
'-nth_yearday' => array(
'-1' => 'l\'ultimo giorno',
'-2' => 'il penultimo giorno',
'-3' => 'il secondultimo giorno',
'else' => 'a %{n} giorni dalla fine anno'
),
'byhour' => array(
'1' => ' alle %{hours}',
'else' => ' alle %{hours}'
),
'nth_hour' => '%{n}h',
'byminute' => array(
'1' => ' al minuto %{minutes}',
'else' => ' ai minuti %{minutes}'
),
'nth_minute' => '%{n}',
'bysecond' => array(
'1' => ' al secondo %{seconds}',
'else' => ' ai secondi %{seconds}'
),
'nth_second' => '%{n}',
'bysetpos' => ', ma solo la %{setpos} occorrenza',
'nth_setpos' => array(
'1' => 'la prima',
'2' => 'la seconda',
'3' => 'la terza',
'else' => 'la %{n} occorrenza'
),
'-nth_setpos' => array(
'-1' => 'la ultima',
'-2' => 'la penultima',
'-3' => 'la secondultima',
'else' => 'a %{n} occorrenze dall\'ultima'
)
);
?>

159
vendor/rlanvin/php-rrule/src/i18n/nl.php vendored Normal file
View File

@ -0,0 +1,159 @@
<?php
/**
* Translation file for Dutch language.
* Provided by Peter Melis <peter.melis@britelayer.com>
*
* Most strings can be an array, with a value as the key. The system will
* pick the translation corresponding to the key. The key "else" will be picked
* if no matching value is found. This is useful for plurals.
*
* Licensed under the MIT license.
*
* For the full copyright and license information, please view the LICENSE file.
*
* @author Rémi Lanvin <remi@cloudconnected.fr>
* @link https://github.com/rlanvin/php-rrule
*/
return array(
'yearly' => array(
'1' => 'jaarlijks',
'else' => 'elke %{interval} jaar'
),
'monthly' => array(
'1' => 'maandelijks',
'else' => 'elke %{interval} maanden'
),
'weekly' => array(
'1' => 'wekelijks',
'2' => 'om de week',
'else' => 'elke %{interval} weken'
),
'daily' => array(
'1' => 'dagelijks',
'2' => 'om de dag',
'else' => 'elke %{interval} dagen'
),
'hourly' => array(
'1' => 'elk uur',
'else' => 'elke %{interval} uur'
),
'minutely' => array(
'1' => 'elke minuut',
'else' => 'elke %{interval} minuten'
),
'secondly' => array(
'1' => 'elke seconde',
'else' => 'elke %{interval} seconden'
),
'dtstart' => ', wordt gestart vanaf %{date}',
'infinite' => ', oneindig',
'until' => ', tot en met %{date}',
'count' => array(
'1' => ', één keer',
'else' => ', %{count} keren'
),
'and' => 'en',
'x_of_the_y' => array(
'yearly' => '%{x} van het jaar', // e.g. the first Monday of the year, or the first day of the year
'monthly' => '%{x} van de maand',
),
'bymonth' => ' in %{months}',
'months' => array(
1 => 'Januari',
2 => 'Februari',
3 => 'Maart',
4 => 'April',
5 => 'Mei',
6 => 'Juni',
7 => 'Juli',
8 => 'Augustus',
9 => 'September',
10 => 'Oktober',
11 => 'November',
12 => 'December',
),
'byweekday' => ' op %{weekdays}',
'weekdays' => array(
1 => 'Maandag',
2 => 'Dinsdag',
3 => 'Woensdag',
4 => 'Donderdag',
5 => 'Vrijdag',
6 => 'Zaterdag',
7 => 'Zondag',
),
'nth_weekday' => array(
'1' => 'de eerste %{weekday}', // e.g. the first Monday
'2' => 'de tweede %{weekday}',
'3' => 'de derde %{weekday}',
'8' => 'de achtste %{weekday}',
'else' => 'de %{n}e %{weekday}'
),
'-nth_weekday' => array(
'-1' => 'de laatste %{weekday}', // e.g. the last Monday
'-2' => 'de voorlaatste %{weekday}',
'-3' => 'de twee-na-laatste %{weekday}',
'else' => 'de %{n}e dag de laatste %{weekday}'
),
'byweekno' => array(
'1' => ' in week %{weeks}',
'else' => ' in week nummer %{weeks}'
),
'nth_weekno' => '%{n}',
'bymonthday' => ' op %{monthdays}',
'nth_monthday' => array(
'else' => 'de %{n}e'
),
'-nth_monthday' => array(
'-1' => 'de laatste dag', // not so many options necessary for NL translation, but none removed
'-2' => 'de voorlaatste dag',
'-3' => 'de twee-na-laatste dag',
'else' => 'de %{n}e tot de laatste dag'
),
'byyearday' => array(
'1' => ' op dag %{yeardays}',
'else' => ' op de dagen %{yeardays}'
),
'nth_yearday' => array(
'1' => 'de eerste',
'2' => 'de tweede',
'3' => 'de derde',
'8' => 'de achtste',
'else' => 'de %{n}e'
),
'-nth_yearday' => array(
'-1' => 'de laatste',
'-2' => 'de voorlaatste',
'-3' => 'de twee-na-laatste',
'else' => 'de %{n}e tot de laatste'
),
'byhour' => array(
'1' => ' op uur %{hours}',
'else' => ' op uren %{hours}'
),
'nth_hour' => '%{n}u',
'byminute' => array(
'1' => ' op minuut %{minutes}',
'else' => ' op minuten %{minutes}'
),
'nth_minute' => '%{n}',
'bysecond' => array(
'1' => ' op seconde %{seconds}',
'else' => ' op seconden %{seconds}'
),
'nth_second' => '%{n}',
'bysetpos' => ', maar alleen %{setpos} match van deze set',
'nth_setpos' => array(
'1' => 'de eerste',
'2' => 'de tweede',
'3' => 'de derde',
'8' => 'de achtste,',
'else' => 'de %{n}e'
),
'-nth_setpos' => array(
'-1' => 'de laatste',
'-2' => 'de voorlaatste',
'-3' => 'de twee-na-laatste',
'else' => 'de %{n}e tot de laatste'
)
);

View File

@ -0,0 +1,148 @@
<?php
/**
* This file is automatically generated by import_windows_timezones.php.
*
* Generated at: 2019-09-01T11:35:25+00:00
* Source used: https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/windowsZones.xml
*/
return array (
'AUS Central Standard Time' => 'Australia/Darwin',
'AUS Eastern Standard Time' => 'Australia/Sydney',
'Afghanistan Standard Time' => 'Asia/Kabul',
'Alaskan Standard Time' => 'America/Anchorage',
'Aleutian Standard Time' => 'America/Adak',
'Altai Standard Time' => 'Asia/Barnaul',
'Arab Standard Time' => 'Asia/Riyadh',
'Arabian Standard Time' => 'Asia/Dubai',
'Arabic Standard Time' => 'Asia/Baghdad',
'Argentina Standard Time' => 'America/Buenos_Aires',
'Astrakhan Standard Time' => 'Europe/Astrakhan',
'Atlantic Standard Time' => 'America/Halifax',
'Aus Central W. Standard Time' => 'Australia/Eucla',
'Azerbaijan Standard Time' => 'Asia/Baku',
'Azores Standard Time' => 'Atlantic/Azores',
'Bahia Standard Time' => 'America/Bahia',
'Bangladesh Standard Time' => 'Asia/Dhaka',
'Belarus Standard Time' => 'Europe/Minsk',
'Bougainville Standard Time' => 'Pacific/Bougainville',
'Canada Central Standard Time' => 'America/Regina',
'Cape Verde Standard Time' => 'Atlantic/Cape_Verde',
'Caucasus Standard Time' => 'Asia/Yerevan',
'Cen. Australia Standard Time' => 'Australia/Adelaide',
'Central America Standard Time' => 'America/Guatemala',
'Central Asia Standard Time' => 'Asia/Almaty',
'Central Brazilian Standard Time' => 'America/Cuiaba',
'Central Europe Standard Time' => 'Europe/Budapest',
'Central European Standard Time' => 'Europe/Warsaw',
'Central Pacific Standard Time' => 'Pacific/Guadalcanal',
'Central Standard Time' => 'America/Chicago',
'Central Standard Time (Mexico)' => 'America/Mexico_City',
'Chatham Islands Standard Time' => 'Pacific/Chatham',
'China Standard Time' => 'Asia/Shanghai',
'Cuba Standard Time' => 'America/Havana',
'Dateline Standard Time' => 'Etc/GMT+12',
'E. Africa Standard Time' => 'Africa/Nairobi',
'E. Australia Standard Time' => 'Australia/Brisbane',
'E. Europe Standard Time' => 'Europe/Chisinau',
'E. South America Standard Time' => 'America/Sao_Paulo',
'Easter Island Standard Time' => 'Pacific/Easter',
'Eastern Standard Time' => 'America/New_York',
'Eastern Standard Time (Mexico)' => 'America/Cancun',
'Egypt Standard Time' => 'Africa/Cairo',
'Ekaterinburg Standard Time' => 'Asia/Yekaterinburg',
'FLE Standard Time' => 'Europe/Kiev',
'Fiji Standard Time' => 'Pacific/Fiji',
'GMT Standard Time' => 'Europe/London',
'GTB Standard Time' => 'Europe/Bucharest',
'Georgian Standard Time' => 'Asia/Tbilisi',
'Greenland Standard Time' => 'America/Godthab',
'Greenwich Standard Time' => 'Atlantic/Reykjavik',
'Haiti Standard Time' => 'America/Port-au-Prince',
'Hawaiian Standard Time' => 'Pacific/Honolulu',
'India Standard Time' => 'Asia/Calcutta',
'Iran Standard Time' => 'Asia/Tehran',
'Israel Standard Time' => 'Asia/Jerusalem',
'Jordan Standard Time' => 'Asia/Amman',
'Kaliningrad Standard Time' => 'Europe/Kaliningrad',
'Korea Standard Time' => 'Asia/Seoul',
'Libya Standard Time' => 'Africa/Tripoli',
'Line Islands Standard Time' => 'Pacific/Kiritimati',
'Lord Howe Standard Time' => 'Australia/Lord_Howe',
'Magadan Standard Time' => 'Asia/Magadan',
'Magallanes Standard Time' => 'America/Punta_Arenas',
'Marquesas Standard Time' => 'Pacific/Marquesas',
'Mauritius Standard Time' => 'Indian/Mauritius',
'Middle East Standard Time' => 'Asia/Beirut',
'Montevideo Standard Time' => 'America/Montevideo',
'Morocco Standard Time' => 'Africa/Casablanca',
'Mountain Standard Time' => 'America/Denver',
'Mountain Standard Time (Mexico)' => 'America/Chihuahua',
'Myanmar Standard Time' => 'Asia/Rangoon',
'N. Central Asia Standard Time' => 'Asia/Novosibirsk',
'Namibia Standard Time' => 'Africa/Windhoek',
'Nepal Standard Time' => 'Asia/Katmandu',
'New Zealand Standard Time' => 'Pacific/Auckland',
'Newfoundland Standard Time' => 'America/St_Johns',
'Norfolk Standard Time' => 'Pacific/Norfolk',
'North Asia East Standard Time' => 'Asia/Irkutsk',
'North Asia Standard Time' => 'Asia/Krasnoyarsk',
'North Korea Standard Time' => 'Asia/Pyongyang',
'Omsk Standard Time' => 'Asia/Omsk',
'Pacific SA Standard Time' => 'America/Santiago',
'Pacific Standard Time' => 'America/Los_Angeles',
'Pacific Standard Time (Mexico)' => 'America/Tijuana',
'Pakistan Standard Time' => 'Asia/Karachi',
'Paraguay Standard Time' => 'America/Asuncion',
'Qyzylorda Standard Time' => 'Asia/Qyzylorda',
'Romance Standard Time' => 'Europe/Paris',
'Russia Time Zone 10' => 'Asia/Srednekolymsk',
'Russia Time Zone 11' => 'Asia/Kamchatka',
'Russia Time Zone 3' => 'Europe/Samara',
'Russian Standard Time' => 'Europe/Moscow',
'SA Eastern Standard Time' => 'America/Cayenne',
'SA Pacific Standard Time' => 'America/Bogota',
'SA Western Standard Time' => 'America/La_Paz',
'SE Asia Standard Time' => 'Asia/Bangkok',
'Saint Pierre Standard Time' => 'America/Miquelon',
'Sakhalin Standard Time' => 'Asia/Sakhalin',
'Samoa Standard Time' => 'Pacific/Apia',
'Sao Tome Standard Time' => 'Africa/Sao_Tome',
'Saratov Standard Time' => 'Europe/Saratov',
'Singapore Standard Time' => 'Asia/Singapore',
'South Africa Standard Time' => 'Africa/Johannesburg',
'Sri Lanka Standard Time' => 'Asia/Colombo',
'Sudan Standard Time' => 'Africa/Khartoum',
'Syria Standard Time' => 'Asia/Damascus',
'Taipei Standard Time' => 'Asia/Taipei',
'Tasmania Standard Time' => 'Australia/Hobart',
'Tocantins Standard Time' => 'America/Araguaina',
'Tokyo Standard Time' => 'Asia/Tokyo',
'Tomsk Standard Time' => 'Asia/Tomsk',
'Tonga Standard Time' => 'Pacific/Tongatapu',
'Transbaikal Standard Time' => 'Asia/Chita',
'Turkey Standard Time' => 'Europe/Istanbul',
'Turks And Caicos Standard Time' => 'America/Grand_Turk',
'US Eastern Standard Time' => 'America/Indianapolis',
'US Mountain Standard Time' => 'America/Phoenix',
'UTC' => 'Etc/GMT',
'UTC+12' => 'Etc/GMT-12',
'UTC+13' => 'Etc/GMT-13',
'UTC-02' => 'Etc/GMT+2',
'UTC-08' => 'Etc/GMT+8',
'UTC-09' => 'Etc/GMT+9',
'UTC-11' => 'Etc/GMT+11',
'Ulaanbaatar Standard Time' => 'Asia/Ulaanbaatar',
'Venezuela Standard Time' => 'America/Caracas',
'Vladivostok Standard Time' => 'Asia/Vladivostok',
'Volgograd Standard Time' => 'Europe/Volgograd',
'W. Australia Standard Time' => 'Australia/Perth',
'W. Central Africa Standard Time' => 'Africa/Lagos',
'W. Europe Standard Time' => 'Europe/Berlin',
'W. Mongolia Standard Time' => 'Asia/Hovd',
'West Asia Standard Time' => 'Asia/Tashkent',
'West Bank Standard Time' => 'Asia/Hebron',
'West Pacific Standard Time' => 'Pacific/Port_Moresby',
'Yakutsk Standard Time' => 'Asia/Yakutsk',
);