'English (Default)', self::Czech => 'čeština', self::German => 'Deutsch', self::Spanish => 'Español', self::French => 'Français', self::Greek => 'ελληνικά', self::Italian => 'Italiano', self::Hungarian => 'magyar', self::Dutch => 'Nederlands', self::Polish => 'Polski', self::Portuguese => 'Português', self::BrazilianPortuguese => 'Português do Brasil', self::Russian => 'Русский язык', self::Swedish => 'Svenska', self::Turkish => 'Türkçe', self::SimplifiedChinese => '簡化字', self::Korean => '한국어', }; } /** * @return string A shortened locale (minus .UTF-8). */ public function getLocaleWithoutEncoding(): string { return self::stripLocaleEncoding($this); } public function register(Environment $environment): void { // Skip translation file reading for default locale. if ($this !== self::default()) { $translator = Loader::getInstance(); $translator->setlocale($this->value); $translator->textdomain('default'); $translator->bindtextdomain('default', $environment->getBaseDirectory() . '/translations'); } Loader::loadFunctions(); } public static function default(): self { return self::English; } public static function getValidLocale(array|string|null $possibleLocales): self { if (null !== $possibleLocales) { if (is_string($possibleLocales)) { $possibleLocales = [$possibleLocales]; } foreach ($possibleLocales as $locale) { $locale = self::ensureLocaleEncoding($locale); // Prefer exact match. $exactLocale = self::tryFrom($locale); if (null !== $exactLocale) { return $exactLocale; } // Use approximate match if available. foreach (self::cases() as $supportedLocale) { if (str_starts_with($locale, substr($supportedLocale->value, 0, 2))) { return $supportedLocale; } } } } return self::default(); } public static function createFromRequest( Environment $environment, ServerRequestInterface $request ): self { $possibleLocales = []; // Prefer user-based profile locale. $user = $request->getAttribute(ServerRequest::ATTR_USER); if (null !== $user && !empty($user->getLocale()) && 'default' !== $user->getLocale()) { $possibleLocales[] = $user->getLocale(); } $server_params = $request->getServerParams(); $browser_locale = Locale::acceptFromHttp($server_params['HTTP_ACCEPT_LANGUAGE'] ?? ''); if (!empty($browser_locale)) { if (2 === strlen($browser_locale)) { $browser_locale = strtolower($browser_locale) . '_' . strtoupper($browser_locale); } $possibleLocales[] = substr($browser_locale, 0, 5) . '.UTF-8'; } // Attempt to load from environment variable. $envLang = $environment->getLang(); if (null !== $envLang) { $possibleLocales[] = $envLang; } $locale = self::getValidLocale($possibleLocales); $locale->register($environment); return $locale; } public static function createForCli( Environment $environment ): self { $locale = self::getValidLocale($environment->getLang()); $locale->register($environment); return $locale; } public static function stripLocaleEncoding(string|self $locale): string { if ($locale instanceof self) { $locale = $locale->value; } if (str_contains($locale, '.')) { return explode('.', $locale, 2)[0]; } return $locale; } public static function ensureLocaleEncoding(string|self $locale): string { return self::stripLocaleEncoding($locale) . '.UTF-8'; } }