From eae677f846f20930ea7fb5435ae0a697d02327dd Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Thu, 7 Nov 2019 15:57:29 +0200 Subject: [PATCH] date time language support --- application/Espo/Core/Container.php | 3 +- application/Espo/Core/Htmlizer/Htmlizer.php | 5 +- application/Espo/Core/Utils/DateTime.php | 127 +++---- composer.json | 4 +- composer.lock | 374 ++++++++++++-------- 5 files changed, 279 insertions(+), 234 deletions(-) diff --git a/application/Espo/Core/Container.php b/application/Espo/Core/Container.php index ac29a30aae..304818aad4 100644 --- a/application/Espo/Core/Container.php +++ b/application/Espo/Core/Container.php @@ -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') ); } diff --git a/application/Espo/Core/Htmlizer/Htmlizer.php b/application/Espo/Core/Htmlizer/Htmlizer.php index ab64922cab..386c2987a9 100644 --- a/application/Espo/Core/Htmlizer/Htmlizer.php +++ b/application/Espo/Core/Htmlizer/Htmlizer.php @@ -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(); diff --git a/application/Espo/Core/Utils/DateTime.php b/application/Espo/Core/Utils/DateTime.php index f3ac24e2d8..7cd56706e1 100644 --- a/application/Espo/Core/Utils/DateTime.php +++ b/application/Espo/Core/Utils/DateTime.php @@ -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) diff --git a/composer.json b/composer.json index 966821993f..99169e61cd 100644 --- a/composer.json +++ b/composer.json @@ -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": { diff --git a/composer.lock b/composer.lock index 6c34d27bcc..6b246f926b 100644 --- a/composer.lock +++ b/composer.lock @@ -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": "*",