| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- <?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();
- }
- }
|