commit vendor
This commit is contained in:
56
vendor/rlanvin/php-rrule/LICENSE
vendored
Normal file
56
vendor/rlanvin/php-rrule/LICENSE
vendored
Normal 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.
|
||||
48
vendor/rlanvin/php-rrule/bin/import_windows_timezones.php
vendored
Normal file
48
vendor/rlanvin/php-rrule/bin/import_windows_timezones.php
vendored
Normal 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
2366
vendor/rlanvin/php-rrule/src/RRule.php
vendored
Normal file
File diff suppressed because it is too large
Load Diff
105
vendor/rlanvin/php-rrule/src/RRuleInterface.php
vendored
Normal file
105
vendor/rlanvin/php-rrule/src/RRuleInterface.php
vendored
Normal 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();
|
||||
}
|
||||
207
vendor/rlanvin/php-rrule/src/RRuleTrait.php
vendored
Normal file
207
vendor/rlanvin/php-rrule/src/RRuleTrait.php
vendored
Normal 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
687
vendor/rlanvin/php-rrule/src/RSet.php
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
328
vendor/rlanvin/php-rrule/src/RfcParser.php
vendored
Normal file
328
vendor/rlanvin/php-rrule/src/RfcParser.php
vendored
Normal 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
150
vendor/rlanvin/php-rrule/src/i18n/de.php
vendored
Normal 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
167
vendor/rlanvin/php-rrule/src/i18n/en.php
vendored
Normal 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
160
vendor/rlanvin/php-rrule/src/i18n/es.php
vendored
Normal 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
167
vendor/rlanvin/php-rrule/src/i18n/fa.php
vendored
Normal 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
136
vendor/rlanvin/php-rrule/src/i18n/fi.php
vendored
Normal 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
155
vendor/rlanvin/php-rrule/src/i18n/fr.php
vendored
Normal 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
156
vendor/rlanvin/php-rrule/src/i18n/it.php
vendored
Normal 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
159
vendor/rlanvin/php-rrule/src/i18n/nl.php
vendored
Normal 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'
|
||||
)
|
||||
);
|
||||
148
vendor/rlanvin/php-rrule/src/tzdata/windows.php
vendored
Normal file
148
vendor/rlanvin/php-rrule/src/tzdata/windows.php
vendored
Normal 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',
|
||||
);
|
||||
Reference in New Issue
Block a user