* @license https://files.froxlor.org/misc/COPYING.txt GPLv2 */ namespace Froxlor; use RecursiveArrayIterator; use RecursiveIteratorIterator; class Language { protected static ?array $lng = null; protected static string $defaultLanguage = 'en'; protected static ?string $requestedLanguage = null; /** * @return array */ public static function getLanguages(): array { $languages = []; $directory = dirname(__DIR__, 2) . '/lng'; foreach (array_diff(scandir($directory), ['..', '.', 'index.html']) as $language) { $iso = explode('.', $language)[0]; $languages[$iso] = self::getTranslation('languages.' . $iso); } return $languages; } public static function getTranslation(string $identifier, array $arguments = []) { // initialize if (is_null(self::$lng)) { // load fallback language self::$lng = self::loadLanguage(self::$defaultLanguage); // load user requested language if (self::$requestedLanguage) { self::$lng = array_merge(self::$lng, self::loadLanguage(self::$requestedLanguage)); } // load fallback from browser if nothing requested $iso = trim(substr(strtok(strtok(($_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'en'), ','), ';'), 0, 5)); if (!self::$requestedLanguage && strlen($iso) == 2 && $iso !== self::$defaultLanguage) { self::$lng = array_merge(self::$lng, self::loadLanguage($iso)); } } // shortcut for identifier with => [title, description] if (!isset(self::$lng[$identifier]) && isset(self::$lng[$identifier . '.title'])) { return [ 'title' => vsprintf(self::$lng[$identifier . '.title'] ?? $identifier, $arguments), 'description' => vsprintf(self::$lng[$identifier . '.description'] ?? $identifier, $arguments), ]; } // search by identifier return vsprintf(self::$lng[$identifier] ?? $identifier, $arguments); } /** * @TODO: Possible iso: de, de-DE, de-AT (fallback to de) * * @param $iso * @return array */ private static function loadLanguage($iso): array { $languageFile = dirname(__DIR__, 2) . sprintf('/lng/%s.lng.php', $iso); if (!file_exists($languageFile)) { return []; } // load default language $lng = require $languageFile; // multidimensional array to dot notation keys $reItIt = new RecursiveIteratorIterator(new RecursiveArrayIterator($lng)); $result = []; foreach ($reItIt as $leafValue) { $keys = []; foreach (range(0, $reItIt->getDepth()) as $depth) { $keys[] = $reItIt->getSubIterator($depth)->key(); } $result[join('.', $keys)] = $leafValue; } return $result; } public static function setDefaultLanguage(string $string) { self::$defaultLanguage = $string; } public static function setLanguage(string $string) { self::$requestedLanguage = $string; self::$lng = null; } }