343 lines
7.1 KiB
PHP
343 lines
7.1 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* This file is part of the Carbon package.
|
||
|
*
|
||
|
* (c) Brian Nesbitt <brian@nesbot.com>
|
||
|
*
|
||
|
* For the full copyright and license information, please view the LICENSE
|
||
|
* file that was distributed with this source code.
|
||
|
*/
|
||
|
|
||
|
namespace Carbon;
|
||
|
|
||
|
use JsonSerializable;
|
||
|
use ReturnTypeWillChange;
|
||
|
|
||
|
class Language implements JsonSerializable
|
||
|
{
|
||
|
/**
|
||
|
* @var array
|
||
|
*/
|
||
|
protected static $languagesNames;
|
||
|
|
||
|
/**
|
||
|
* @var array
|
||
|
*/
|
||
|
protected static $regionsNames;
|
||
|
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $id;
|
||
|
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $code;
|
||
|
|
||
|
/**
|
||
|
* @var string|null
|
||
|
*/
|
||
|
protected $variant;
|
||
|
|
||
|
/**
|
||
|
* @var string|null
|
||
|
*/
|
||
|
protected $region;
|
||
|
|
||
|
/**
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $names;
|
||
|
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $isoName;
|
||
|
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $nativeName;
|
||
|
|
||
|
public function __construct(string $id)
|
||
|
{
|
||
|
$this->id = str_replace('-', '_', $id);
|
||
|
$parts = explode('_', $this->id);
|
||
|
$this->code = $parts[0];
|
||
|
|
||
|
if (isset($parts[1])) {
|
||
|
if (!preg_match('/^[A-Z]+$/', $parts[1])) {
|
||
|
$this->variant = $parts[1];
|
||
|
$parts[1] = $parts[2] ?? null;
|
||
|
}
|
||
|
if ($parts[1]) {
|
||
|
$this->region = $parts[1];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the list of the known languages.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function all()
|
||
|
{
|
||
|
if (!static::$languagesNames) {
|
||
|
static::$languagesNames = require __DIR__.'/List/languages.php';
|
||
|
}
|
||
|
|
||
|
return static::$languagesNames;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the list of the known regions.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function regions()
|
||
|
{
|
||
|
if (!static::$regionsNames) {
|
||
|
static::$regionsNames = require __DIR__.'/List/regions.php';
|
||
|
}
|
||
|
|
||
|
return static::$regionsNames;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get both isoName and nativeName as an array.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function getNames(): array
|
||
|
{
|
||
|
if (!$this->names) {
|
||
|
$this->names = static::all()[$this->code] ?? [
|
||
|
'isoName' => $this->code,
|
||
|
'nativeName' => $this->code,
|
||
|
];
|
||
|
}
|
||
|
|
||
|
return $this->names;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the original locale ID.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getId(): string
|
||
|
{
|
||
|
return $this->id;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the code of the locale "en"/"fr".
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getCode(): string
|
||
|
{
|
||
|
return $this->code;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the variant code such as cyrl/latn.
|
||
|
*
|
||
|
* @return string|null
|
||
|
*/
|
||
|
public function getVariant(): ?string
|
||
|
{
|
||
|
return $this->variant;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the variant such as Cyrillic/Latin.
|
||
|
*
|
||
|
* @return string|null
|
||
|
*/
|
||
|
public function getVariantName(): ?string
|
||
|
{
|
||
|
if ($this->variant === 'Latn') {
|
||
|
return 'Latin';
|
||
|
}
|
||
|
|
||
|
if ($this->variant === 'Cyrl') {
|
||
|
return 'Cyrillic';
|
||
|
}
|
||
|
|
||
|
return $this->variant;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the region part of the locale.
|
||
|
*
|
||
|
* @return string|null
|
||
|
*/
|
||
|
public function getRegion(): ?string
|
||
|
{
|
||
|
return $this->region;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the region name for the current language.
|
||
|
*
|
||
|
* @return string|null
|
||
|
*/
|
||
|
public function getRegionName(): ?string
|
||
|
{
|
||
|
return $this->region ? (static::regions()[$this->region] ?? $this->region) : null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the long ISO language name.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getFullIsoName(): string
|
||
|
{
|
||
|
if (!$this->isoName) {
|
||
|
$this->isoName = $this->getNames()['isoName'];
|
||
|
}
|
||
|
|
||
|
return $this->isoName;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the ISO language name.
|
||
|
*
|
||
|
* @param string $isoName
|
||
|
*/
|
||
|
public function setIsoName(string $isoName): self
|
||
|
{
|
||
|
$this->isoName = $isoName;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return the full name of the language in this language.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getFullNativeName(): string
|
||
|
{
|
||
|
if (!$this->nativeName) {
|
||
|
$this->nativeName = $this->getNames()['nativeName'];
|
||
|
}
|
||
|
|
||
|
return $this->nativeName;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the name of the language in this language.
|
||
|
*
|
||
|
* @param string $nativeName
|
||
|
*/
|
||
|
public function setNativeName(string $nativeName): self
|
||
|
{
|
||
|
$this->nativeName = $nativeName;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the short ISO language name.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getIsoName(): string
|
||
|
{
|
||
|
$name = $this->getFullIsoName();
|
||
|
|
||
|
return trim(strstr($name, ',', true) ?: $name);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the short name of the language in this language.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getNativeName(): string
|
||
|
{
|
||
|
$name = $this->getFullNativeName();
|
||
|
|
||
|
return trim(strstr($name, ',', true) ?: $name);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a string with short ISO name, region in parentheses if applicable, variant in parentheses if applicable.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getIsoDescription()
|
||
|
{
|
||
|
$region = $this->getRegionName();
|
||
|
$variant = $this->getVariantName();
|
||
|
|
||
|
return $this->getIsoName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : '');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a string with short native name, region in parentheses if applicable, variant in parentheses if applicable.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getNativeDescription()
|
||
|
{
|
||
|
$region = $this->getRegionName();
|
||
|
$variant = $this->getVariantName();
|
||
|
|
||
|
return $this->getNativeName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : '');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a string with long ISO name, region in parentheses if applicable, variant in parentheses if applicable.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getFullIsoDescription()
|
||
|
{
|
||
|
$region = $this->getRegionName();
|
||
|
$variant = $this->getVariantName();
|
||
|
|
||
|
return $this->getFullIsoName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : '');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a string with long native name, region in parentheses if applicable, variant in parentheses if applicable.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getFullNativeDescription()
|
||
|
{
|
||
|
$region = $this->getRegionName();
|
||
|
$variant = $this->getVariantName();
|
||
|
|
||
|
return $this->getFullNativeName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : '');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the original locale ID.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function __toString()
|
||
|
{
|
||
|
return $this->getId();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a string with short ISO name, region in parentheses if applicable, variant in parentheses if applicable.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
#[ReturnTypeWillChange]
|
||
|
public function jsonSerialize()
|
||
|
{
|
||
|
return $this->getIsoDescription();
|
||
|
}
|
||
|
}
|