Load localization based on language or locale

This commit is contained in:
Dennis Eichhorn 2018-08-18 09:21:52 +02:00
parent df2bd5b624
commit 1caf381603
4 changed files with 76 additions and 18 deletions

View File

@ -1,6 +1,6 @@
{
"language": "EN",
"country": "USA",
"language": "en",
"country": "US",
"currency": {
"code": "USD",
"position": 0

View File

@ -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;
}

View File

@ -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));
}
}
}

View File

@ -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());