date time language support

This commit is contained in:
Yuri Kuznetsov
2019-11-07 15:57:29 +02:00
parent 26f65def3e
commit eae677f846
5 changed files with 279 additions and 234 deletions

View File

@@ -177,7 +177,8 @@ class Container
return new \Espo\Core\Utils\DateTime(
$this->get('config')->get('dateFormat'),
$this->get('config')->get('timeFormat'),
$this->get('config')->get('timeZone')
$this->get('config')->get('timeZone'),
$this->get('config')->get('language')
);
}

View File

@@ -320,10 +320,11 @@ class Htmlizer
$format = $context['hash']['format'] ?? null;
$timezone = $context['hash']['timezone'] ?? null;
$language = $context['hash']['language'] ?? null;
$dateTime = $context['data']['root']['__dateTime'];
if (strlen($dateValue) > 11) return $dateTime->convertSystemDateTime($dateValue, $timezone, $format);
if (strlen($dateValue) > 11) return $dateTime->convertSystemDateTime($dateValue, $timezone, $format, $language);
return $dateTime->convertSystemDate($dateValue, $format);
return $dateTime->convertSystemDate($dateValue, $format, $language);
},
'ifEqual' => function () {
$args = func_get_args();

View File

@@ -29,6 +29,8 @@
namespace Espo\Core\Utils;
use Carbon\Carbon;
class DateTime
{
protected $dateFormat;
@@ -37,6 +39,8 @@ class DateTime
protected $timezone;
protected $langauge;
public static $systemDateTimeFormat = 'Y-m-d H:i:s';
public static $systemDateFormat = 'Y-m-d';
@@ -45,58 +49,31 @@ class DateTime
protected $internalDateFormat = 'Y-m-d';
protected $dateFormats = array(
protected $dateFormats = [
'MM/DD/YYYY' => 'm/d/Y',
'YYYY-MM-DD' => 'Y-m-d',
'DD.MM.YYYY' => 'd.m.Y',
'DD/MM/YYYY' => 'd/m/Y',
);
];
protected $timeFormats = array(
protected $timeFormats = [
'HH:mm' => 'H:i',
'hh:mm A' => 'h:i A',
'hh:mm a' => 'h:ia',
'hh:mmA' => 'h:iA',
);
];
protected $formattingMap = array(
'MMMM' => 'F',
'MMM' => 'M',
'MM' => 'm',
'M' => 'n',
'DDDD' => 'z',
'DD' => 'd',
'D' => 'j',
'dddd' => 'l',
'ddd' => 'D',
'ww' => 'W',
'w' => 'W',
'e' => 'w',
'YYYY' => 'Y',
'YY' => 'y',
'HH' => 'H',
'H' => 'G',
'hh' => 'h',
'h' => 'g',
'mm' => 'i',
'm' => 'i',
'A' => 'A',
'a' => 'a',
'ss' => 's',
's' => 's',
'Z' => 'O',
'z' => 'O',
'ZZ' => 'P',
'Do' => 'jS',
);
public function __construct($dateFormat = 'YYYY-MM-DD', $timeFormat = 'HH:mm', $timeZone = 'UTC')
public function __construct(
?string $dateFormat = 'YYYY-MM-DD',
?string $timeFormat = 'HH:mm',
?string $timeZone = 'UTC',
?string $language = 'en_US'
)
{
$this->dateFormat = $dateFormat;
$this->timeFormat = $timeFormat;
$this->timezone = new \DateTimeZone($timeZone);
$this->dateFormat = $dateFormat ?? 'YYYY-MM-DD';
$this->timeFormat = $timeFormat ?? 'HH:mm';
$this->timezone = new \DateTimeZone($timeZone ?? 'UTC');
$this->language = $language ?? 'en_US';
}
public function getDateFormat()
@@ -129,11 +106,6 @@ class DateTime
return $this->dateFormats[$this->dateFormat] . ' ' . $this->timeFormats[$this->timeFormat];
}
protected function convertFormatToPhp($format)
{
return strtr($format, $this->formattingMap);
}
public function convertSystemDateToGlobal($string)
{
return $this->convertSystemDate($string);
@@ -144,39 +116,36 @@ class DateTime
return $this->convertSystemDateTime($string);
}
public function convertSystemDate($string, $format = null)
public function convertSystemDate(string $string, ?string $format = null, ?string $language = null)
{
$dateTime = \DateTime::createFromFormat('Y-m-d', $string);
if ($dateTime) {
if ($format) {
$phpFormat = $this->convertFormatToPhp($format);
} else {
$phpFormat = $this->getPhpDateFormat();
}
return $dateTime->format($phpFormat);
$carbon = Carbon::instance($dateTime);
$carbon->locale($language ?? $this->language);
return $carbon->isoFormat($format ?? $this->getDateFormat());
}
return null;
}
public function convertSystemDateTime($string, $timezone = null, $format = null)
public function convertSystemDateTime(string $string, ?string $timezone = null, ?string $format = null, ?string $language = null)
{
if (is_string($string) && strlen($string) === 16) {
$string .= ':00';
}
$dateTime = \DateTime::createFromFormat('Y-m-d H:i:s', $string);
if (empty($timezone)) {
$timezone = $this->timezone;
$tz = $this->timezone;
} else {
$timezone = new \DateTimeZone($timezone);
$tz = new \DateTimeZone($timezone);
}
if ($dateTime) {
if ($format) {
$phpFormat = $this->convertFormatToPhp($format);
} else {
$phpFormat = $this->getPhpDateTimeFormat();
}
return $dateTime->setTimezone($timezone)->format($phpFormat);
$dateTime->setTimezone($tz);
$carbon = Carbon::instance($dateTime);
$carbon->locale($language ?? $this->language);
return $carbon->isoFormat($format ?? $this->getDateFormat());
}
return null;
}
@@ -196,38 +165,42 @@ class DateTime
return date($this->getInternalDateFormat());
}
public function getTodayString($timezone = null)
public function getTodayString(?string $timezone = null, ?string $format = null)
{
if ($timezone) {
$timezoneObj = new \DateTimeZone($timezone);
$tz = new \DateTimeZone($timezone);
} else {
$timezoneObj = $this->timezone;
$tz = $this->timezone;
}
$dateTime = new \DateTime();
$dateTime->setTimezone($timezoneObj);
$dateTime->setTimezone($tz);
return $dateTime->format($this->getPhpDateFormat());
$format = $format ?? $this->getDateTimeFormat();
$carbon = Carbon::instance($dateTime);
$carbon->locale($this->language);
return $carbon->isoFormat($format);
}
public function getNowString($timezone = null, $format = null)
public function getNowString(?string $timezone = null, ?string $format = null)
{
if ($timezone) {
$timezoneObj = new \DateTimeZone($timezone);
$tz = new \DateTimeZone($timezone);
} else {
$timezoneObj = $this->timezone;
$tz = $this->timezone;
}
$dateTime = new \DateTime();
$dateTime->setTimezone($timezoneObj);
$dateTime->setTimezone($tz);
if ($format) {
$phpFormat = $this->convertFormatToPhp($format);
} else {
$phpFormat = $this->getPhpDateTimeFormat();
}
$format = $format ?? $this->getDateTimeFormat();
return $dateTime->format($phpFormat);
$carbon = Carbon::instance($dateTime);
$carbon->locale($this->language);
return $carbon->isoFormat($format);
}
public static function isAfterThreshold($value, $period)

View File

@@ -25,7 +25,6 @@
"zordius/lightncandy": "0.*",
"composer/semver": "^1.4",
"tecnickcom/tcpdf": "^6.2",
"php-mime-mail-parser/php-mime-mail-parser": "3.*",
"zbateson/mail-mime-parser": "1.1.*",
"phpoffice/phpspreadsheet": "^1.1",
"spatie/async": "dev-for-espocrm",
@@ -37,7 +36,8 @@
"container-interop/container-interop": "1.2.0",
"zendframework/zend-mime": "^2.7.1",
"zendframework/zend-stdlib": "^3.1",
"robthree/twofactorauth": "^1.6"
"robthree/twofactorauth": "^1.6",
"nesbot/carbon": "^2.26"
},
"autoload": {
"psr-0": {

374
composer.lock generated
View File

@@ -4,8 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"hash": "c5bc2fb1697f4d1a1100c0bf26bb7e43",
"content-hash": "6d70bda95c5adbb4a3a4f868dbacfce5",
"content-hash": "58cf37fd7fae2d3b1889cdcc745eca1d",
"packages": [
{
"name": "cboden/ratchet",
@@ -58,7 +57,7 @@
"sockets",
"websocket"
],
"time": "2017-12-12 00:49:31"
"time": "2017-12-12T00:49:31+00:00"
},
{
"name": "composer/semver",
@@ -120,7 +119,7 @@
"validation",
"versioning"
],
"time": "2016-03-30 13:16:03"
"time": "2016-03-30T13:16:03+00:00"
},
{
"name": "container-interop/container-interop",
@@ -151,7 +150,7 @@
],
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
"homepage": "https://github.com/container-interop/container-interop",
"time": "2017-02-14 19:40:03"
"time": "2017-02-14T19:40:03+00:00"
},
{
"name": "doctrine/annotations",
@@ -223,7 +222,7 @@
"docblock",
"parser"
],
"time": "2013-06-16 21:33:03"
"time": "2013-06-16T21:33:03+00:00"
},
{
"name": "doctrine/cache",
@@ -297,7 +296,7 @@
"cache",
"caching"
],
"time": "2013-10-25 19:04:14"
"time": "2013-10-25T19:04:14+00:00"
},
{
"name": "doctrine/collections",
@@ -365,7 +364,7 @@
"collections",
"iterator"
],
"time": "2014-02-03 23:07:43"
"time": "2014-02-03T23:07:43+00:00"
},
{
"name": "doctrine/common",
@@ -440,7 +439,7 @@
"persistence",
"spl"
],
"time": "2013-09-07 10:20:34"
"time": "2013-09-07T10:20:34+00:00"
},
{
"name": "doctrine/dbal",
@@ -506,7 +505,7 @@
"persistence",
"queryobject"
],
"time": "2014-01-01 16:43:57"
"time": "2014-01-01T16:43:57+00:00"
},
{
"name": "doctrine/inflector",
@@ -570,7 +569,7 @@
"singuarlize",
"string"
],
"time": "2013-01-10 21:49:15"
"time": "2013-01-10T21:49:15+00:00"
},
{
"name": "doctrine/lexer",
@@ -622,7 +621,7 @@
"lexer",
"parser"
],
"time": "2013-01-12 18:59:04"
"time": "2013-01-12T18:59:04+00:00"
},
{
"name": "evenement/evenement",
@@ -665,7 +664,7 @@
"event-dispatcher",
"event-emitter"
],
"time": "2017-07-23 21:35:13"
"time": "2017-07-23T21:35:13+00:00"
},
{
"name": "guzzlehttp/psr7",
@@ -732,7 +731,7 @@
"uri",
"url"
],
"time": "2018-12-04 20:46:45"
"time": "2018-12-04T20:46:45+00:00"
},
{
"name": "michelf/php-markdown",
@@ -778,7 +777,7 @@
"keywords": [
"markdown"
],
"time": "2018-01-15 00:49:33"
"time": "2018-01-15T00:49:33+00:00"
},
{
"name": "monolog/monolog",
@@ -856,7 +855,7 @@
"logging",
"psr-3"
],
"time": "2016-07-02 14:02:10"
"time": "2016-07-02T14:02:10+00:00"
},
{
"name": "mtdowling/cron-expression",
@@ -897,7 +896,74 @@
"cron",
"schedule"
],
"time": "2013-11-23 19:48:39"
"time": "2013-11-23T19:48:39+00:00"
},
{
"name": "nesbot/carbon",
"version": "2.26.0",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
"reference": "e01ecc0b71168febb52ae1fdc1cfcc95428e604e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e01ecc0b71168febb52ae1fdc1cfcc95428e604e",
"reference": "e01ecc0b71168febb52ae1fdc1cfcc95428e604e",
"shasum": ""
},
"require": {
"ext-json": "*",
"php": "^7.1.8 || ^8.0",
"symfony/translation": "^3.4 || ^4.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
"kylekatarnls/multi-tester": "^1.1",
"phpmd/phpmd": "dev-php-7.1-compatibility",
"phpstan/phpstan": "^0.11",
"phpunit/phpunit": "^7.5 || ^8.0",
"squizlabs/php_codesniffer": "^3.4"
},
"bin": [
"bin/carbon"
],
"type": "library",
"extra": {
"laravel": {
"providers": [
"Carbon\\Laravel\\ServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Carbon\\": "src/Carbon/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Brian Nesbitt",
"email": "brian@nesbot.com",
"homepage": "http://nesbot.com"
},
{
"name": "kylekatarnls",
"homepage": "http://github.com/kylekatarnls"
}
],
"description": "An API extension for DateTime that supports 281 different languages.",
"homepage": "http://carbon.nesbot.com",
"keywords": [
"date",
"datetime",
"time"
],
"time": "2019-10-21T21:32:25+00:00"
},
{
"name": "opis/closure",
@@ -958,87 +1024,7 @@
"serialization",
"serialize"
],
"time": "2018-10-02 13:36:53"
},
{
"name": "php-mime-mail-parser/php-mime-mail-parser",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-mime-mail-parser/php-mime-mail-parser.git",
"reference": "5f5bdf0f2496f7cd6afc8ec739d328f847da6b25"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-mime-mail-parser/php-mime-mail-parser/zipball/5f5bdf0f2496f7cd6afc8ec739d328f847da6b25",
"reference": "5f5bdf0f2496f7cd6afc8ec739d328f847da6b25",
"shasum": ""
},
"require": {
"ext-mailparse": "*",
"php": "^5.6.0 || ^7.0"
},
"replace": {
"exorus/php-mime-mail-parser": "*",
"messaged/php-mime-mail-parser": "*"
},
"require-dev": {
"php-coveralls/php-coveralls": "0.*",
"phpunit/php-token-stream": "^1.3.0",
"phpunit/phpunit": "^5.7",
"squizlabs/php_codesniffer": "2.*"
},
"type": "library",
"autoload": {
"psr-4": {
"PhpMimeMailParser\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "bucabay",
"email": "gabe@fijiwebdesign.com",
"homepage": "http://www.fijiwebdesign.com",
"role": "Developer"
},
{
"name": "eXorus",
"email": "exorus.spam@gmail.com",
"homepage": "https://github.com/eXorus/",
"role": "Developer"
},
{
"name": "M.Valinskis",
"email": "M.Valins@gmail.com",
"homepage": "https://code.google.com/p/php-mime-mail-parser",
"role": "Developer"
},
{
"name": "eugene.emmett.wood",
"email": "gene_w@cementhorizon.com",
"homepage": "https://code.google.com/p/php-mime-mail-parser",
"role": "Developer"
},
{
"name": "alknetso",
"email": "alkne@gmail.com",
"homepage": "https://code.google.com/p/php-mime-mail-parser",
"role": "Developer"
}
],
"description": "Fully Tested Mailparse Extension Wrapper for PHP 5.6+",
"homepage": "https://github.com/php-mime-mail-parser/php-mime-mail-parser",
"keywords": [
"MimeMailParser",
"mail",
"mailparse",
"mime"
],
"time": "2018-09-28 21:56:35"
"time": "2018-10-02T13:36:53+00:00"
},
{
"name": "phpoffice/phpspreadsheet",
@@ -1126,7 +1112,7 @@
"xls",
"xlsx"
],
"time": "2018-01-28 12:37:15"
"time": "2018-01-28T12:37:15+00:00"
},
{
"name": "psr/container",
@@ -1175,7 +1161,7 @@
"container-interop",
"psr"
],
"time": "2017-02-14 16:28:37"
"time": "2017-02-14T16:28:37+00:00"
},
{
"name": "psr/http-message",
@@ -1225,7 +1211,7 @@
"request",
"response"
],
"time": "2016-08-06 14:39:51"
"time": "2016-08-06T14:39:51+00:00"
},
{
"name": "psr/log",
@@ -1263,7 +1249,7 @@
"psr",
"psr-3"
],
"time": "2012-12-21 11:40:51"
"time": "2012-12-21T11:40:51+00:00"
},
{
"name": "psr/simple-cache",
@@ -1311,7 +1297,7 @@
"psr-16",
"simple-cache"
],
"time": "2017-01-02 13:31:39"
"time": "2017-01-02T13:31:39+00:00"
},
{
"name": "ralouphie/getallheaders",
@@ -1351,7 +1337,7 @@
}
],
"description": "A polyfill for getallheaders.",
"time": "2016-02-11 07:05:27"
"time": "2016-02-11T07:05:27+00:00"
},
{
"name": "ratchet/rfc6455",
@@ -1400,7 +1386,7 @@
"rfc6455",
"websocket"
],
"time": "2018-05-02 14:52:00"
"time": "2018-05-02T14:52:00+00:00"
},
{
"name": "react/cache",
@@ -1440,7 +1426,7 @@
"promise",
"reactphp"
],
"time": "2018-06-25 12:52:40"
"time": "2018-06-25T12:52:40+00:00"
},
{
"name": "react/dns",
@@ -1485,7 +1471,7 @@
"dns-resolver",
"reactphp"
],
"time": "2018-11-11 11:21:13"
"time": "2018-11-11T11:21:13+00:00"
},
{
"name": "react/event-loop",
@@ -1526,7 +1512,7 @@
"asynchronous",
"event-loop"
],
"time": "2018-07-11 14:37:46"
"time": "2018-07-11T14:37:46+00:00"
},
{
"name": "react/promise",
@@ -1572,7 +1558,7 @@
"promise",
"promises"
],
"time": "2019-01-07 21:25:54"
"time": "2019-01-07T21:25:54+00:00"
},
{
"name": "react/promise-timer",
@@ -1625,7 +1611,7 @@
"timeout",
"timer"
],
"time": "2018-06-13 16:45:37"
"time": "2018-06-13T16:45:37+00:00"
},
{
"name": "react/socket",
@@ -1672,7 +1658,7 @@
"reactphp",
"stream"
],
"time": "2019-01-07 14:10:13"
"time": "2019-01-07T14:10:13+00:00"
},
{
"name": "react/stream",
@@ -1718,7 +1704,7 @@
"stream",
"writable"
],
"time": "2019-01-01 16:15:09"
"time": "2019-01-01T16:15:09+00:00"
},
{
"name": "react/zmq",
@@ -1759,7 +1745,7 @@
"zeromq",
"zmq"
],
"time": "2018-05-18 15:27:55"
"time": "2018-05-18T15:27:55+00:00"
},
{
"name": "robthree/twofactorauth",
@@ -1810,7 +1796,7 @@
"php",
"tfa"
],
"time": "2019-06-21 08:51:04"
"time": "2019-06-21T08:51:04+00:00"
},
{
"name": "slim/slim",
@@ -1856,7 +1842,7 @@
"rest",
"router"
],
"time": "2015-03-08 18:41:17"
"time": "2015-03-08T18:41:17+00:00"
},
{
"name": "spatie/async",
@@ -1910,7 +1896,7 @@
"async",
"spatie"
],
"time": "2018-12-11 08:49:14"
"time": "2018-12-11T08:49:14+00:00"
},
{
"name": "symfony/http-foundation",
@@ -1964,7 +1950,7 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "https://symfony.com",
"time": "2019-01-05 16:37:49"
"time": "2019-01-05T16:37:49+00:00"
},
{
"name": "symfony/polyfill-iconv",
@@ -2023,7 +2009,7 @@
"portable",
"shim"
],
"time": "2019-08-06 08:03:45"
"time": "2019-08-06T08:03:45+00:00"
},
{
"name": "symfony/polyfill-mbstring",
@@ -2082,7 +2068,7 @@
"portable",
"shim"
],
"time": "2018-09-21 13:07:52"
"time": "2018-09-21T13:07:52+00:00"
},
{
"name": "symfony/process",
@@ -2131,7 +2117,7 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
"time": "2018-10-14 20:48:13"
"time": "2018-10-14T20:48:13+00:00"
},
{
"name": "symfony/routing",
@@ -2206,38 +2192,65 @@
"uri",
"url"
],
"time": "2017-06-23 06:35:45"
"time": "2017-06-23T06:35:45+00:00"
},
{
"name": "symfony/yaml",
"version": "v2.7.0",
"name": "symfony/translation",
"version": "v4.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/Yaml.git",
"reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3"
"url": "https://github.com/symfony/translation.git",
"reference": "a3aa590ce944afb3434d7a55f81b00927144d5ec"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Yaml/zipball/4a29a5248aed4fb45f626a7bbbd330291492f5c3",
"reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3",
"url": "https://api.github.com/repos/symfony/translation/zipball/a3aa590ce944afb3434d7a55f81b00927144d5ec",
"reference": "a3aa590ce944afb3434d7a55f81b00927144d5ec",
"shasum": ""
},
"require": {
"php": ">=5.3.9"
"php": "^7.1.3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/translation-contracts": "^1.1.6"
},
"conflict": {
"symfony/config": "<3.4",
"symfony/dependency-injection": "<3.4",
"symfony/yaml": "<3.4"
},
"provide": {
"symfony/translation-implementation": "1.0"
},
"require-dev": {
"symfony/phpunit-bridge": "~2.7"
"psr/log": "~1.0",
"symfony/config": "~3.4|~4.0",
"symfony/console": "~3.4|~4.0",
"symfony/dependency-injection": "~3.4|~4.0",
"symfony/finder": "~2.8|~3.0|~4.0",
"symfony/http-kernel": "~3.4|~4.0",
"symfony/intl": "~3.4|~4.0",
"symfony/service-contracts": "^1.1.2",
"symfony/var-dumper": "~3.4|~4.0",
"symfony/yaml": "~3.4|~4.0"
},
"suggest": {
"psr/log-implementation": "To use logging capability in translator",
"symfony/config": "",
"symfony/yaml": ""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.7-dev"
"dev-master": "4.3-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Component\\Yaml\\": ""
}
"Symfony\\Component\\Translation\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2253,9 +2266,66 @@
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony Yaml Component",
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
"time": "2015-05-02 15:21:08"
"time": "2019-10-30T12:53:54+00:00"
},
{
"name": "symfony/translation-contracts",
"version": "v1.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
"reference": "364518c132c95642e530d9b2d217acbc2ccac3e6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/364518c132c95642e530d9b2d217acbc2ccac3e6",
"reference": "364518c132c95642e530d9b2d217acbc2ccac3e6",
"shasum": ""
},
"require": {
"php": "^7.1.3"
},
"suggest": {
"symfony/translation-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Translation\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Generic abstractions related to translation",
"homepage": "https://symfony.com",
"keywords": [
"abstractions",
"contracts",
"decoupling",
"interfaces",
"interoperability",
"standards"
],
"time": "2019-09-17T11:12:18+00:00"
},
{
"name": "tecnickcom/tcpdf",
@@ -2317,7 +2387,7 @@
"pdf417",
"qrcode"
],
"time": "2018-02-24 11:48:20"
"time": "2018-02-24T11:48:20+00:00"
},
{
"name": "true/punycode",
@@ -2363,7 +2433,7 @@
"idna",
"punycode"
],
"time": "2016-11-16 10:37:54"
"time": "2016-11-16T10:37:54+00:00"
},
{
"name": "yzalis/identicon",
@@ -2413,7 +2483,7 @@
"identicon",
"image"
],
"time": "2014-07-13 09:19:12"
"time": "2014-07-13T09:19:12+00:00"
},
{
"name": "zbateson/mail-mime-parser",
@@ -2477,7 +2547,7 @@
"parser",
"php-imap"
],
"time": "2019-03-26 16:52:07"
"time": "2019-03-26T16:52:07+00:00"
},
{
"name": "zbateson/mb-wrapper",
@@ -2535,7 +2605,7 @@
"multibyte",
"string"
],
"time": "2018-09-28 17:43:01"
"time": "2018-09-28T17:43:01+00:00"
},
{
"name": "zbateson/stream-decorators",
@@ -2586,7 +2656,7 @@
"stream",
"uuencode"
],
"time": "2019-03-21 06:13:00"
"time": "2019-03-21T06:13:00+00:00"
},
{
"name": "zendframework/zend-crypt",
@@ -2636,7 +2706,7 @@
"crypt",
"zf2"
],
"time": "2016-02-03 23:46:30"
"time": "2016-02-03T23:46:30+00:00"
},
{
"name": "zendframework/zend-hydrator",
@@ -2694,7 +2764,7 @@
"hydrator",
"zf2"
],
"time": "2016-02-18 22:38:26"
"time": "2016-02-18T22:38:26+00:00"
},
{
"name": "zendframework/zend-ldap",
@@ -2747,7 +2817,7 @@
"ldap",
"zf2"
],
"time": "2016-05-23 19:03:38"
"time": "2016-05-23T19:03:38+00:00"
},
{
"name": "zendframework/zend-loader",
@@ -2791,7 +2861,7 @@
"loader",
"zf2"
],
"time": "2015-06-03 14:05:47"
"time": "2015-06-03T14:05:47+00:00"
},
{
"name": "zendframework/zend-mail",
@@ -2853,7 +2923,7 @@
"mail",
"zf"
],
"time": "2018-06-07 13:37:07"
"time": "2018-06-07T13:37:07+00:00"
},
{
"name": "zendframework/zend-math",
@@ -2903,7 +2973,7 @@
"math",
"zf2"
],
"time": "2016-04-07 16:29:53"
"time": "2016-04-07T16:29:53+00:00"
},
{
"name": "zendframework/zend-mime",
@@ -2954,7 +3024,7 @@
"mime",
"zf"
],
"time": "2018-05-14 19:02:50"
"time": "2018-05-14T19:02:50+00:00"
},
{
"name": "zendframework/zend-servicemanager",
@@ -3022,7 +3092,7 @@
"servicemanager",
"zf"
],
"time": "2018-01-29 16:48:37"
"time": "2018-01-29T16:48:37+00:00"
},
{
"name": "zendframework/zend-stdlib",
@@ -3068,7 +3138,7 @@
"stdlib",
"zf"
],
"time": "2018-08-28 21:34:05"
"time": "2018-08-28T21:34:05+00:00"
},
{
"name": "zendframework/zend-validator",
@@ -3141,7 +3211,7 @@
"validator",
"zf2"
],
"time": "2019-01-29 22:26:39"
"time": "2019-01-29T22:26:39+00:00"
},
{
"name": "zordius/lightncandy",
@@ -3188,7 +3258,7 @@
"php",
"template"
],
"time": "2015-05-08 01:56:46"
"time": "2015-05-08T01:56:46+00:00"
}
],
"packages-dev": [],
@@ -3200,7 +3270,7 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": ">=7.1.0",
"php": ">=7.2.0",
"ext-pdo_mysql": "*",
"ext-openssl": "*",
"ext-json": "*",