diff --git a/Localization/Defaults/Definitions/en_US.json b/Localization/Defaults/Definitions/en_US.json index 6ba33326d..77af7f449 100644 --- a/Localization/Defaults/Definitions/en_US.json +++ b/Localization/Defaults/Definitions/en_US.json @@ -1,6 +1,6 @@ { - "language": "EN", - "country": "USA", + "language": "en", + "country": "US", "currency": { "code": "USD", "position": 0 diff --git a/Localization/Localization.php b/Localization/Localization.php index 83fbc5382..7dc372e46 100644 --- a/Localization/Localization.php +++ b/Localization/Localization.php @@ -17,6 +17,7 @@ namespace phpOMS\Localization; use phpOMS\Stdlib\Base\Exception\InvalidEnumValue; use phpOMS\Utils\Converter\AngleType; use phpOMS\Utils\Converter\TemperatureType; +use phpOMS\System\File\Local\Directory; /** * Localization class. @@ -91,10 +92,10 @@ final class Localization /** * Time format. * - * @var string + * @var array * @since 1.0.0 */ - private $datetime = 'Y-m-d H:i:s'; + private $datetime = []; /** * Weight. @@ -137,12 +138,68 @@ final class Localization private $volume = []; /** - * Constructor. + * Load localization from language code + * + * @param string $langCode Language code + * + * @return void * * @since 1.0.0 */ - public function __construct() + public function loadFromLanguage(string $langCode) : void { + $langCode = \strtolower($langCode); + + if (!ISO639x1Enum::isValidValue($langCode)) { + throw new InvalidEnumValue($langCode); + } + + $files = Directory::list(__DIR__ . '/../Localization/Defaults/Definitions'); + + foreach ($files as $file) { + if (\stripos($file, $langCode) === 0) { + $this->importLocale( + json_decode( + \file_get_contents(__DIR__ . '/../Localization/Defaults/Definitions/' . $file), + true + ) + ); + return; + } + } + + $this->importLocale( + json_decode( + \file_get_contents(__DIR__ . '/../Localization/Defaults/Definitions/en_US.json'), + true + ) + ); + } + + /** + * Load localization from locale + * + * @param array $locale Locale data + * + * @return void + * + * @since 1.0.0 + */ + public function importLocale(array $locale) : void + { + $this->setLanguage($locale['language'] ?? 'en'); + $this->setCountry($locale['country'] ?? 'US'); + $this->setCurrency($locale['currency']['code'] ?? ISO4217Enum::_USD); + $this->setThousands($locale['thousand'] ?? ','); + $this->setDecimal($locale['decimal'] ?? '.'); + $this->setAngle($locale['angle'] ?? AngleType::DEGREE); + $this->setTemperature($locale['temperature'] ?? emperatureType::CELSIUS); + $this->setWeight($locale['weight'] ?? []); + $this->setSpeed($locale['speed'] ?? []); + $this->setLength($locale['length'] ?? []); + $this->setArea($locale['area'] ?? []); + $this->setVolume($locale['volume'] ?? []); + $this->setDatetime($locale['datetime'] ?? []); } /** @@ -232,7 +289,7 @@ final class Localization */ public function setLanguage(string $language) : void { - $language = strtolower($language); + $language = \strtolower($language); if (!ISO639x1Enum::isValidValue($language)) { throw new InvalidEnumValue($language); @@ -264,7 +321,7 @@ final class Localization */ public function setCurrency(string $currency) : void { - if (!ISO4217Enum::isValidValue($currency)) { + if (!ISO4217CharEnum::isValidValue($currency)) { throw new InvalidEnumValue($currency); } @@ -274,11 +331,11 @@ final class Localization /** * get datetime format * - * @return string + * @return array * * @since 1.0.0 */ - public function getDatetime() : string + public function getDatetime() : array { return $this->datetime; } @@ -286,13 +343,13 @@ final class Localization /** * Set datetime format * - * @param string $datetime Datetime format + * @param array $datetime Datetime format * * @return void * * @since 1.0.0 */ - public function setDatetime(string $datetime) : void + public function setDatetime(array $datetime) : void { $this->datetime = $datetime; } diff --git a/Router/Router.php b/Router/Router.php index 25c58af58..cac6691fd 100644 --- a/Router/Router.php +++ b/Router/Router.php @@ -105,7 +105,7 @@ final class Router ) { $bound[] = ['dest' => $d['dest']]; } else { - array_merge($bound, $this->route('/' . $app . '/e403', $verb)); + \array_merge($bound, $this->route('/' . $app . '/e403', $verb)); } } } diff --git a/tests/Localization/LocalizationTest.php b/tests/Localization/LocalizationTest.php index 305c488ce..60739e5a2 100644 --- a/tests/Localization/LocalizationTest.php +++ b/tests/Localization/LocalizationTest.php @@ -16,6 +16,7 @@ namespace phpOMS\tests\Localization; use phpOMS\Localization\ISO3166TwoEnum; use phpOMS\Localization\ISO4217Enum; use phpOMS\Localization\ISO639x1Enum; +use phpOMS\Localization\ISO4217CharEnum; use phpOMS\Localization\L11nManager; use phpOMS\Localization\Localization; use phpOMS\Localization\TimeZoneEnumArray; @@ -55,7 +56,7 @@ class LocalizationTest extends \PHPUnit\Framework\TestCase self::assertTrue(ISO4217Enum::isValidValue($localization->getCurrency())); self::assertEquals('.', $localization->getDecimal()); self::assertEquals(',', $localization->getThousands()); - self::assertEquals('Y-m-d H:i:s', $localization->getDatetime()); + self::assertEquals([], $localization->getDatetime()); self::assertEquals([], $localization->getSpeed()); self::assertEquals([], $localization->getWeight()); @@ -113,11 +114,11 @@ class LocalizationTest extends \PHPUnit\Framework\TestCase $localization->setLanguage(ISO639x1Enum::_DE); self::assertEquals(ISO639x1Enum::_DE, $localization->getLanguage()); - $localization->setCurrency(ISO4217Enum::_EUR); - self::assertEquals(ISO4217Enum::_EUR, $localization->getCurrency()); + $localization->setCurrency(ISO4217CharEnum::_EUR); + self::assertEquals(ISO4217CharEnum::_EUR, $localization->getCurrency()); - $localization->setDatetime('Y-m-d H:i:s'); - self::assertEquals('Y-m-d H:i:s', $localization->getDatetime()); + $localization->setDatetime(['Y-m-d H:i:s']); + self::assertEquals(['Y-m-d H:i:s'], $localization->getDatetime()); $localization->setDecimal(','); self::assertEquals(',', $localization->getDecimal());