Copyright (C) Rodolfo Berrios A. All rights reserved. BY USING THIS SOFTWARE YOU DECLARE TO ACCEPT THE CHEVERETO EULA http://chevereto.com/license --------------------------------------------------------------------- */ namespace CHV; use G, Exception, DirectoryIterator, RegexIterator; class L10n { protected static $instance, $processed; const CHV_DEFAULT_LANGUAGE_EXTENSION = 'po'; const CHV_BASE_LANGUAGE = 'en'; static $gettext, $translation_table, $available_languages, $enabled_languages, $disabled_languages; static $locale = self::CHV_BASE_LANGUAGE; static $forced_locale = FALSE; public function __construct() { try { // Stock the available languages self::$available_languages = []; $directory = new DirectoryIterator(CHV_APP_PATH_CONTENT_LANGUAGES); $regex = new RegexIterator($directory, '/^.+\.'. self::CHV_DEFAULT_LANGUAGE_EXTENSION .'$/i', RegexIterator::GET_MATCH); $locales = self::getLocales(); $missing_locales = []; foreach($regex as $file) { $file = $file[0]; $locale_code = basename($file, '.' . self::CHV_DEFAULT_LANGUAGE_EXTENSION); self::$available_languages[$locale_code] = $locales[$locale_code]; } // Remove any missing lang array self::$available_languages = array_filter(self::$available_languages); // Handle the enabled/disabled languages self::$enabled_languages = self::$available_languages; self::$disabled_languages = []; foreach(getSetting('languages_disable') as $k) { self::$disabled_languages[$k] = $locales[$k]; unset(self::$enabled_languages[$k]); } if(!self::$forced_locale) { // Set default website locale if(array_key_exists(getSetting('default_language'), self::$available_languages)) { $locale = getSetting('default_language'); // Default from DB value } else { $locale = self::$locale; // Default from class static } // Auto-language? if(getSetting('auto_language') and !Login::isLoggedUser()) { foreach(G\get_client_languages() as $k => $v) { $user_locale = str_replace('-', '_', $k); if(array_key_exists($user_locale, self::$available_languages) and !array_key_exists($user_locale, self::$disabled_languages)) { $locale = $user_locale; break; } else { // try to use a base language foreach(self::$available_languages as $k => $v) { if($v['base'] == substr($user_locale, 0, 2)) { $locale = $k; break; } } } if($locale) break; }; } // Override with the user selected lang if(Login::isLoggedUser() || $_COOKIE['USER_SELECTED_LANG']) { $user_lang = Login::getUser() ? Login::getUser()['language'] : $_COOKIE['USER_SELECTED_LANG']; if(array_key_exists($user_lang, self::$available_languages) and !array_key_exists($user_lang, self::$disabled_languages)) { $locale = $user_lang; } } } else { $locale = self::$forced_locale; } // Set some language definitions if(!defined('CHV_LANGUAGE_CODE')) define('CHV_LANGUAGE_CODE', $locale); if(!defined('CHV_LANGUAGE_FILE')) define('CHV_LANGUAGE_FILE', CHV_APP_PATH_CONTENT_LANGUAGES . $locale . '.' . self::CHV_DEFAULT_LANGUAGE_EXTENSION); self::processTranslation($locale); } catch(Exception $e) { throw $e; } } public static function getInstance() { if(is_null(self::$instance)) { self::$instance = new self; } return self::$instance; } public static function setLocale($locale) { if(is_null(self::$instance)) { self::$forced_locale = $locale; } else { self::processTranslation($locale); } } public static function processTranslation($locale) { if(is_null($locale)) { $locale = self::$locale; } // Already did it if($locale == self::$locale and isset(self::$translation_table)) { return; } // If locale isn't available use the default one and if that fails use the first one in the available table if(!array_key_exists($locale, self::$available_languages)) { if(array_key_exists(self::$locale, self::$available_languages)) { $locale = self::$available_languages; } else { $array = self::$available_languages; reset($array); $first_key = key($array); $locale = $first_key; } } // Filename $filename = $locale . '.' . self::CHV_DEFAULT_LANGUAGE_EXTENSION; // Overriding? $language_file = CHV_APP_PATH_CONTENT_LANGUAGES . $filename; $language_override_file = dirname($language_file) . '/overrides/' . $filename; // Stock the static $locale self::$locale = $locale; // Handle translation and its overrides $language_handling = [ 'base' => [ 'file' => $language_file, 'cache_path' => dirname($language_file) . '/cache/', 'table' => [], ], 'override' => [ 'file' => $language_override_file, 'cache_path' => dirname($language_file) . '/cache/overrides/', 'table' => [], ] ]; foreach($language_handling as $k => $v) { $cache_path = $v['cache_path']; $cache_file = basename($v['file']) . '.cache.php'; if(!file_exists($v['file'])) continue; if(!file_exists($cache_path) and !@mkdir($cache_path)) { $cache_path = dirname($cache_path); } try { self::$gettext = new G\Gettext([ 'file' => $v['file'], 'cache_filepath' => $cache_path . $cache_file, 'cache_header' => $k == 'base', ]); if($k == 'base') { $translation_plural = self::$gettext->translation_plural; $translation_header = self::$gettext->translation_header; } $language_handling[$k]['table'] = self::$gettext->translation_table; } catch(GettextException $e) { error_log($e); // Silence } } // Re-stock the base language values self::$gettext->translation_plural = $translation_plural; self::$gettext->translation_header = $translation_header; self::$gettext->translation_table = array_merge($language_handling['base']['table'], $language_handling['override']['table']); self::$translation_table = self::$gettext->translation_table; } // gettext wrapper public static function gettext($msg) { $translation = self::getGettext()->gettext($msg); return $translation; } // ngettext wrapper public static function ngettext($msg, $msg_plural, $count) { $translation = self::getGettext()->ngettext($msg, $msg_plural, $count); return $translation; } public static function setStatic($var, $value) { $instance = self::getInstance(); $instance::${$var} = $value; } public static function getStatic($var) { $instance = self::getInstance(); return $instance::${$var}; } public static function getAvailableLanguages() { return self::getStatic('available_languages'); } public static function getEnabledLanguages() { return self::getStatic('enabled_languages'); } public static function getDisabledLanguages() { return self::getStatic('disabled_languages'); } public static function getGettext() { return self::getStatic('gettext'); } public static function getTranslation() { return self::getStatic('translation_table'); } public static function getLocale() { return self::getStatic('locale'); } // Locales table public static function getLocales() { return [ 'af' => [ 'code' => 'af', 'dir' => 'ltr', 'name' => 'Afrikaans', 'base' => 'af', 'short_name' => 'AF', ], 'af_AF' => [ 'code' => 'af_AF', 'dir' => 'ltr', 'name' => 'Afrikaans', 'base' => 'af', 'short_name' => 'AF (AF)', ], 'am' => [ 'code' => 'am', 'dir' => 'ltr', 'name' => 'āmariññā', 'base' => 'am', 'short_name' => 'AM', ], 'am_AM' => [ 'code' => 'am_AM', 'dir' => 'ltr', 'name' => 'āmariññā', 'base' => 'am', 'short_name' => 'AM (AM)', ], 'an' => [ 'code' => 'an', 'dir' => 'ltr', 'name' => 'Aragonés', 'base' => 'an', 'short_name' => 'AN', ], 'an_AN' => [ 'code' => 'an_AN', 'dir' => 'ltr', 'name' => 'Aragonés', 'base' => 'an', 'short_name' => 'AN (AN)', ], 'ar' => [ 'code' => 'ar', 'dir' => 'rtl', 'name' => 'العربية', 'base' => 'ar', 'short_name' => 'AR', ], 'ar_AE' => [ 'code' => 'ar_AE', 'dir' => 'rtl', 'name' => 'العربية (الإمارات)', 'base' => 'ar', 'short_name' => 'AR (AE)', ], 'ar_BH' => [ 'code' => 'ar_BH', 'dir' => 'rtl', 'name' => 'العربية (البحرين)', 'base' => 'ar', 'short_name' => 'AR (BH)', ], 'ar_DZ' => [ 'code' => 'ar_DZ', 'dir' => 'rtl', 'name' => 'العربية (الجزائر)', 'base' => 'ar', 'short_name' => 'AR (DZ)', ], 'ar_EG' => [ 'code' => 'ar_EG', 'dir' => 'rtl', 'name' => 'العربية (مصر)', 'base' => 'ar', 'short_name' => 'AR (EG)', ], 'ar_IQ' => [ 'code' => 'ar_IQ', 'dir' => 'rtl', 'name' => 'العربية (العراق)', 'base' => 'ar', 'short_name' => 'AR (IQ)', ], 'ar_JO' => [ 'code' => 'ar_JO', 'dir' => 'rtl', 'name' => 'العربية (الأردن)', 'base' => 'ar', 'short_name' => 'AR (JO)', ], 'ar_KW' => [ 'code' => 'ar_KW', 'dir' => 'rtl', 'name' => 'العربية (الكويت)', 'base' => 'ar', 'short_name' => 'AR (KW)', ], 'ar_LB' => [ 'code' => 'ar_LB', 'dir' => 'rtl', 'name' => 'العربية (لبنان)', 'base' => 'ar', 'short_name' => 'AR (LB)', ], 'ar_LY' => [ 'code' => 'ar_LY', 'dir' => 'rtl', 'name' => 'العربية (ليبيا)', 'base' => 'ar', 'short_name' => 'AR (LY)', ], 'ar_MA' => [ 'code' => 'ar_MA', 'dir' => 'rtl', 'name' => 'العربية (المغرب)', 'base' => 'ar', 'short_name' => 'AR (MA)', ], 'ar_OM' => [ 'code' => 'ar_OM', 'dir' => 'rtl', 'name' => 'العربية (سلطنة عمان)', 'base' => 'ar', 'short_name' => 'AR (OM)', ], 'ar_QA' => [ 'code' => 'ar_QA', 'dir' => 'rtl', 'name' => 'العربية (قطر)', 'base' => 'ar', 'short_name' => 'AR (QA)', ], 'ar_SA' => [ 'code' => 'ar_SA', 'dir' => 'rtl', 'name' => 'العربية (السعودية)', 'base' => 'ar', 'short_name' => 'AR (SA)', ], 'ar_SD' => [ 'code' => 'ar_SD', 'dir' => 'rtl', 'name' => 'العربية (السودان)', 'base' => 'ar', 'short_name' => 'AR (SD)', ], 'ar_SY' => [ 'code' => 'ar_SY', 'dir' => 'rtl', 'name' => 'العربية (سوريا)', 'base' => 'ar', 'short_name' => 'AR (SY)', ], 'ar_TN' => [ 'code' => 'ar_TN', 'dir' => 'rtl', 'name' => 'العربية (تونس)', 'base' => 'ar', 'short_name' => 'AR (TN)', ], 'ar_YE' => [ 'code' => 'ar_YE', 'dir' => 'rtl', 'name' => 'العربية (اليمن)', 'base' => 'ar', 'short_name' => 'AR (YE)', ], 'as' => [ 'code' => 'as', 'dir' => 'ltr', 'name' => 'অসমীয়া', 'base' => 'as', 'short_name' => 'AS', ], 'as_AS' => [ 'code' => 'as_AS', 'dir' => 'ltr', 'name' => 'অসমীয়া', 'base' => 'as', 'short_name' => 'AS (AS)', ], 'ast' => [ 'code' => 'ast', 'dir' => 'ltr', 'name' => 'Asturianu', 'base' => 'ast', 'short_name' => 'AST', ], 'ast_AST' => [ 'code' => 'ast_AST', 'dir' => 'ltr', 'name' => 'Asturianu', 'base' => 'ast', 'short_name' => 'AST (AST)', ], 'az' => [ 'code' => 'az', 'dir' => 'ltr', 'name' => 'Azərbaycan', 'base' => 'az', 'short_name' => 'AZ', ], 'az_AZ' => [ 'code' => 'az_AZ', 'dir' => 'ltr', 'name' => 'Azərbaycan', 'base' => 'az', 'short_name' => 'AZ (AZ)', ], 'ba' => [ 'code' => 'ba', 'dir' => 'ltr', 'name' => 'Башҡорт', 'base' => 'ba', 'short_name' => 'BA', ], 'ba_BA' => [ 'code' => 'ba_BA', 'dir' => 'ltr', 'name' => 'Башҡорт', 'base' => 'ba', 'short_name' => 'BA (BA)', ], 'be' => [ 'code' => 'be', 'dir' => 'ltr', 'name' => 'Беларускі', 'base' => 'be', 'short_name' => 'BE', ], 'be_BY' => [ 'code' => 'be_BY', 'dir' => 'ltr', 'name' => 'Беларускі', 'base' => 'be', 'short_name' => 'BE (BY)', ], 'bg' => [ 'code' => 'bg', 'dir' => 'ltr', 'name' => 'Български', 'base' => 'bg', 'short_name' => 'BG', ], 'bg_BG' => [ 'code' => 'bg_BG', 'dir' => 'ltr', 'name' => 'Български', 'base' => 'bg', 'short_name' => 'BG (BG)', ], 'bn' => [ 'code' => 'bn', 'dir' => 'ltr', 'name' => 'Bangla', 'base' => 'bn', 'short_name' => 'BN', ], 'bn_BN' => [ 'code' => 'bn_BN', 'dir' => 'ltr', 'name' => 'Bangla', 'base' => 'bn', 'short_name' => 'BN (BN)', ], 'br' => [ 'code' => 'br', 'dir' => 'ltr', 'name' => 'Brezhoneg', 'base' => 'br', 'short_name' => 'BR', ], 'br_BR' => [ 'code' => 'br_BR', 'dir' => 'ltr', 'name' => 'Brezhoneg', 'base' => 'br', 'short_name' => 'BR (BR)', ], 'bs' => [ 'code' => 'bs', 'dir' => 'ltr', 'name' => 'Bosanski', 'base' => 'bs', 'short_name' => 'BS', ], 'bs_BS' => [ 'code' => 'bs_BS', 'dir' => 'ltr', 'name' => 'Bosanski', 'base' => 'bs', 'short_name' => 'BS (BS)', ], 'ca' => [ 'code' => 'ca', 'dir' => 'ltr', 'name' => 'Сatalà', 'base' => 'ca', 'short_name' => 'CA', ], 'ca_ES' => [ 'code' => 'ca_ES', 'dir' => 'ltr', 'name' => 'Сatalà (Espanya)', 'base' => 'ca', 'short_name' => 'CA (ES)', ], 'ce' => [ 'code' => 'ce', 'dir' => 'ltr', 'name' => 'Нохчийн', 'base' => 'ce', 'short_name' => 'CE', ], 'ce_CE' => [ 'code' => 'ce_CE', 'dir' => 'ltr', 'name' => 'Нохчийн', 'base' => 'ce', 'short_name' => 'CE (CE)', ], 'ch' => [ 'code' => 'ch', 'dir' => 'ltr', 'name' => 'Chamoru', 'base' => 'ch', 'short_name' => 'CH', ], 'ch_CH' => [ 'code' => 'ch_CH', 'dir' => 'ltr', 'name' => 'Chamoru', 'base' => 'ch', 'short_name' => 'CH (CH)', ], 'co' => [ 'code' => 'co', 'dir' => 'ltr', 'name' => 'Corsu', 'base' => 'co', 'short_name' => 'CO', ], 'co_CO' => [ 'code' => 'co_CO', 'dir' => 'ltr', 'name' => 'Corsu', 'base' => 'co', 'short_name' => 'CO (CO)', ], 'cr' => [ 'code' => 'cr', 'dir' => 'ltr', 'name' => 'Cree', 'base' => 'cr', 'short_name' => 'CR', ], 'cr_CR' => [ 'code' => 'cr_CR', 'dir' => 'ltr', 'name' => 'Cree', 'base' => 'cr', 'short_name' => 'CR (CR)', ], 'cs' => [ 'code' => 'cs', 'dir' => 'ltr', 'name' => 'Čeština', 'base' => 'cs', 'short_name' => 'CS', ], 'cs_CZ' => [ 'code' => 'cs_CZ', 'dir' => 'ltr', 'name' => 'Čeština', 'base' => 'cs', 'short_name' => 'CS (CZ)', ], 'cv' => [ 'code' => 'cv', 'dir' => 'ltr', 'name' => 'Чăвашла', 'base' => 'cv', 'short_name' => 'CV', ], 'cv_CV' => [ 'code' => 'cv_CV', 'dir' => 'ltr', 'name' => 'Чăвашла', 'base' => 'cv', 'short_name' => 'CV (CV)', ], 'cy' => [ 'code' => 'cy', 'dir' => 'ltr', 'name' => 'Cymraeg', 'base' => 'cy', 'short_name' => 'CY', ], 'cy_CY' => [ 'code' => 'cy_CY', 'dir' => 'ltr', 'name' => 'Cymraeg', 'base' => 'cy', 'short_name' => 'CY (CY)', ], 'da' => [ 'code' => 'da', 'dir' => 'ltr', 'name' => 'Dansk', 'base' => 'da', 'short_name' => 'DA', ], 'da_DK' => [ 'code' => 'da_DK', 'dir' => 'ltr', 'name' => 'Dansk', 'base' => 'da', 'short_name' => 'DA (DK)', ], 'de' => [ 'code' => 'de', 'dir' => 'ltr', 'name' => 'Deutsch', 'base' => 'de', 'short_name' => 'DE', ], 'de_AT' => [ 'code' => 'de_AT', 'dir' => 'ltr', 'name' => 'Deutsch (Österreich)', 'base' => 'de', 'short_name' => 'DE (AT)', ], 'de_CH' => [ 'code' => 'de_CH', 'dir' => 'ltr', 'name' => 'Deutsch (Schweiz)', 'base' => 'de', 'short_name' => 'DE (CH)', ], 'de_DE' => [ 'code' => 'de_DE', 'dir' => 'ltr', 'name' => 'Deutsch (Deutschland)', 'base' => 'de', 'short_name' => 'DE (DE)', ], 'de_LU' => [ 'code' => 'de_LU', 'dir' => 'ltr', 'name' => 'Deutsch (Luxemburg)', 'base' => 'de', 'short_name' => 'DE (LU)', ], 'el' => [ 'code' => 'el', 'dir' => 'ltr', 'name' => 'Ελληνικά', 'base' => 'el', 'short_name' => 'EL', ], 'el_CY' => [ 'code' => 'el_CY', 'dir' => 'ltr', 'name' => 'Ελληνικά (Κύπρος)', 'base' => 'el', 'short_name' => 'EL (CY)', ], 'el_GR' => [ 'code' => 'el_GR', 'dir' => 'ltr', 'name' => 'Ελληνικά (Ελλάδα)', 'base' => 'el', 'short_name' => 'EL (GR)', ], 'en' => [ 'code' => 'en', 'dir' => 'ltr', 'name' => 'English', 'base' => 'en', 'short_name' => 'EN', ], 'en_AU' => [ 'code' => 'en_AU', 'dir' => 'ltr', 'name' => 'English (Australia)', 'base' => 'en', 'short_name' => 'EN (AU)', ], 'en_CA' => [ 'code' => 'en_CA', 'dir' => 'ltr', 'name' => 'English (Canada)', 'base' => 'en', 'short_name' => 'EN (CA)', ], 'en_GB' => [ 'code' => 'en_GB', 'dir' => 'ltr', 'name' => 'English (UK)', 'base' => 'en', 'short_name' => 'EN (GB)', ], 'en_IE' => [ 'code' => 'en_IE', 'dir' => 'ltr', 'name' => 'English (Ireland)', 'base' => 'en', 'short_name' => 'EN (IE)', ], 'en_IN' => [ 'code' => 'en_IN', 'dir' => 'ltr', 'name' => 'English (India)', 'base' => 'en', 'short_name' => 'EN (IN)', ], 'en_MT' => [ 'code' => 'en_MT', 'dir' => 'ltr', 'name' => 'English (Malta)', 'base' => 'en', 'short_name' => 'EN (MT)', ], 'en_NZ' => [ 'code' => 'en_NZ', 'dir' => 'ltr', 'name' => 'English (New Zealand)', 'base' => 'en', 'short_name' => 'EN (NZ)', ], 'en_PH' => [ 'code' => 'en_PH', 'dir' => 'ltr', 'name' => 'English (Philippines)', 'base' => 'en', 'short_name' => 'EN (PH)', ], 'en_SG' => [ 'code' => 'en_SG', 'dir' => 'ltr', 'name' => 'English (Singapore)', 'base' => 'en', 'short_name' => 'EN (SG)', ], 'en_US' => [ 'code' => 'en_US', 'dir' => 'ltr', 'name' => 'English (US)', 'base' => 'en', 'short_name' => 'EN (US)', ], 'en_ZA' => [ 'code' => 'en_ZA', 'dir' => 'ltr', 'name' => 'English (South Africa)', 'base' => 'en', 'short_name' => 'EN (ZA)', ], 'eo' => [ 'code' => 'eo', 'dir' => 'ltr', 'name' => 'Esperanta', 'base' => 'eo', 'short_name' => 'EO', ], 'eo_EO' => [ 'code' => 'eo_EO', 'dir' => 'ltr', 'name' => 'Esperanta', 'base' => 'eo', 'short_name' => 'EO (EO)', ], 'es' => [ 'code' => 'es', 'dir' => 'ltr', 'name' => 'Español', 'base' => 'es', 'short_name' => 'ES', ], 'es_AR' => [ 'code' => 'es_AR', 'dir' => 'ltr', 'name' => 'Español (Argentina)', 'base' => 'es', 'short_name' => 'ES (AR)', ], 'es_BO' => [ 'code' => 'es_BO', 'dir' => 'ltr', 'name' => 'Español (Bolivia)', 'base' => 'es', 'short_name' => 'ES (BO)', ], 'es_CL' => [ 'code' => 'es_CL', 'dir' => 'ltr', 'name' => 'Español (Chile)', 'base' => 'es', 'short_name' => 'ES (CL)', ], 'es_CO' => [ 'code' => 'es_CO', 'dir' => 'ltr', 'name' => 'Español (Colombia)', 'base' => 'es', 'short_name' => 'ES (CO)', ], 'es_CR' => [ 'code' => 'es_CR', 'dir' => 'ltr', 'name' => 'Español (Costa Rica)', 'base' => 'es', 'short_name' => 'ES (CR)', ], 'es_DO' => [ 'code' => 'es_DO', 'dir' => 'ltr', 'name' => 'Español (República Dominicana)', 'base' => 'es', 'short_name' => 'ES (DO)', ], 'es_EC' => [ 'code' => 'es_EC', 'dir' => 'ltr', 'name' => 'Español (Ecuador)', 'base' => 'es', 'short_name' => 'ES (EC)', ], 'es_ES' => [ 'code' => 'es_ES', 'dir' => 'ltr', 'name' => 'Español (España)', 'base' => 'es', 'short_name' => 'ES (ES)', ], 'es_GT' => [ 'code' => 'es_GT', 'dir' => 'ltr', 'name' => 'Español (Guatemala)', 'base' => 'es', 'short_name' => 'ES (GT)', ], 'es_HN' => [ 'code' => 'es_HN', 'dir' => 'ltr', 'name' => 'Español (Honduras)', 'base' => 'es', 'short_name' => 'ES (HN)', ], 'es_MX' => [ 'code' => 'es_MX', 'dir' => 'ltr', 'name' => 'Español (México)', 'base' => 'es', 'short_name' => 'ES (MX)', ], 'es_NI' => [ 'code' => 'es_NI', 'dir' => 'ltr', 'name' => 'Español (Nicaragua)', 'base' => 'es', 'short_name' => 'ES (NI)', ], 'es_PA' => [ 'code' => 'es_PA', 'dir' => 'ltr', 'name' => 'Español (Panamá)', 'base' => 'es', 'short_name' => 'ES (PA)', ], 'es_PE' => [ 'code' => 'es_PE', 'dir' => 'ltr', 'name' => 'Español (Perú)', 'base' => 'es', 'short_name' => 'ES (PE)', ], 'es_PR' => [ 'code' => 'es_PR', 'dir' => 'ltr', 'name' => 'Español (Puerto Rico)', 'base' => 'es', 'short_name' => 'ES (PR)', ], 'es_PY' => [ 'code' => 'es_PY', 'dir' => 'ltr', 'name' => 'Español (Paraguay)', 'base' => 'es', 'short_name' => 'ES (PY)', ], 'es_SV' => [ 'code' => 'es_SV', 'dir' => 'ltr', 'name' => 'Español (El Salvador)', 'base' => 'es', 'short_name' => 'ES (SV)', ], 'es_US' => [ 'code' => 'es_US', 'dir' => 'ltr', 'name' => 'Español (Estados Unidos)', 'base' => 'es', 'short_name' => 'ES (US)', ], 'es_UY' => [ 'code' => 'es_UY', 'dir' => 'ltr', 'name' => 'Español (Uruguay)', 'base' => 'es', 'short_name' => 'ES (UY)', ], 'es_VE' => [ 'code' => 'es_VE', 'dir' => 'ltr', 'name' => 'Español (Venezuela)', 'base' => 'es', 'short_name' => 'ES (VE)', ], 'et' => [ 'code' => 'et', 'dir' => 'ltr', 'name' => 'Eesti', 'base' => 'et', 'short_name' => 'ET', ], 'et_EE' => [ 'code' => 'et_EE', 'dir' => 'ltr', 'name' => 'Eesti (Eesti)', 'base' => 'et', 'short_name' => 'ET (EE)', ], 'eu' => [ 'code' => 'eu', 'dir' => 'ltr', 'name' => 'Euskera', 'base' => 'eu', 'short_name' => 'EU', ], 'eu_EU' => [ 'code' => 'eu_EU', 'dir' => 'ltr', 'name' => 'Euskera', 'base' => 'eu', 'short_name' => 'EU (EU)', ], 'fa' => [ 'code' => 'fa', 'dir' => 'rtl', 'name' => 'فارسی', 'base' => 'fa', 'short_name' => 'FA', ], 'fa_FA' => [ 'code' => 'fa_FA', 'dir' => 'rtl', 'name' => 'فارسی', 'base' => 'fa', 'short_name' => 'FA (FA)', ], 'fi' => [ 'code' => 'fi', 'dir' => 'ltr', 'name' => 'Suomi', 'base' => 'fi', 'short_name' => 'FI', ], 'fi_FI' => [ 'code' => 'fi_FI', 'dir' => 'ltr', 'name' => 'Suomi', 'base' => 'fi', 'short_name' => 'FI (FI)', ], 'fj' => [ 'code' => 'fj', 'dir' => 'ltr', 'name' => 'Na Vosa Vakaviti', 'base' => 'fj', 'short_name' => 'FJ', ], 'fj_FJ' => [ 'code' => 'fj_FJ', 'dir' => 'ltr', 'name' => 'Na Vosa Vakaviti', 'base' => 'fj', 'short_name' => 'FJ (FJ)', ], 'fo' => [ 'code' => 'fo', 'dir' => 'ltr', 'name' => 'Føroyskt', 'base' => 'fo', 'short_name' => 'FO', ], 'fo_FO' => [ 'code' => 'fo_FO', 'dir' => 'ltr', 'name' => 'Føroyskt', 'base' => 'fo', 'short_name' => 'FO (FO)', ], 'fr' => [ 'code' => 'fr', 'dir' => 'ltr', 'name' => 'Français', 'base' => 'fr', 'short_name' => 'FR', ], 'fr_BE' => [ 'code' => 'fr_BE', 'dir' => 'ltr', 'name' => 'Français (Belgique)', 'base' => 'fr', 'short_name' => 'FR (BE)', ], 'fr_CA' => [ 'code' => 'fr_CA', 'dir' => 'ltr', 'name' => 'Français (Canada)', 'base' => 'fr', 'short_name' => 'FR (CA)', ], 'fr_CH' => [ 'code' => 'fr_CH', 'dir' => 'ltr', 'name' => 'Français (Suisse)', 'base' => 'fr', 'short_name' => 'FR (CH)', ], 'fr_FR' => [ 'code' => 'fr_FR', 'dir' => 'ltr', 'name' => 'Français (France)', 'base' => 'fr', 'short_name' => 'FR (FR)', ], 'fr_LU' => [ 'code' => 'fr_LU', 'dir' => 'ltr', 'name' => 'Français (Luxembourg)', 'base' => 'fr', 'short_name' => 'FR (LU)', ], 'fy' => [ 'code' => 'fy', 'dir' => 'ltr', 'name' => 'Frysk', 'base' => 'fy', 'short_name' => 'FY', ], 'fy_FY' => [ 'code' => 'fy_FY', 'dir' => 'ltr', 'name' => 'Frysk', 'base' => 'fy', 'short_name' => 'FY (FY)', ], 'ga' => [ 'code' => 'ga', 'dir' => 'ltr', 'name' => 'Gaeilge', 'base' => 'ga', 'short_name' => 'GA', ], 'ga_IE' => [ 'code' => 'ga_IE', 'dir' => 'ltr', 'name' => 'Gaeilge (Éire)', 'base' => 'ga', 'short_name' => 'GA (IE)', ], 'gd' => [ 'code' => 'gd', 'dir' => 'ltr', 'name' => 'Gàidhlig', 'base' => 'gd', 'short_name' => 'GD', ], 'gd_GD' => [ 'code' => 'gd_GD', 'dir' => 'ltr', 'name' => 'Gàidhlig', 'base' => 'gd', 'short_name' => 'GD (GD)', ], 'gl' => [ 'code' => 'gl', 'dir' => 'ltr', 'name' => 'Galego', 'base' => 'gl', 'short_name' => 'GL', ], 'gl_GL' => [ 'code' => 'gl_GL', 'dir' => 'ltr', 'name' => 'Galego', 'base' => 'gl', 'short_name' => 'GL (GL)', ], 'gu' => [ 'code' => 'gu', 'dir' => 'ltr', 'name' => 'Gujarati', 'base' => 'gu', 'short_name' => 'GU', ], 'gu_GU' => [ 'code' => 'gu_GU', 'dir' => 'ltr', 'name' => 'Gujarati', 'base' => 'gu', 'short_name' => 'GU (GU)', ], 'he' => [ 'code' => 'he', 'dir' => 'rtl', 'name' => 'עברית', 'base' => 'he', 'short_name' => 'HE', ], 'he_IL' => [ 'code' => 'he_IL', 'dir' => 'rtl', 'name' => 'עברית', 'base' => 'he', 'short_name' => 'HE (IL)', ], 'hi' => [ 'code' => 'hi', 'dir' => 'ltr', 'name' => 'हिंदी', 'base' => 'hi', 'short_name' => 'HI', ], 'hi_IN' => [ 'code' => 'hi_IN', 'dir' => 'ltr', 'name' => 'हिंदी (भारत)', 'base' => 'hi', 'short_name' => 'HI (IN)', ], 'hr' => [ 'code' => 'hr', 'dir' => 'ltr', 'name' => 'Hrvatski', 'base' => 'hr', 'short_name' => 'HR', ], 'hr_HR' => [ 'code' => 'hr_HR', 'dir' => 'ltr', 'name' => 'Hrvatski', 'base' => 'hr', 'short_name' => 'HR (HR)', ], 'hsb' => [ 'code' => 'hsb', 'dir' => 'ltr', 'name' => 'Hornjoserbšćina', 'base' => 'hsb', 'short_name' => 'HSB', ], 'hsb_HSB' => [ 'code' => 'hsb_HSB', 'dir' => 'ltr', 'name' => 'Hornjoserbšćina', 'base' => 'hsb', 'short_name' => 'HSB (HSB)', ], 'ht' => [ 'code' => 'ht', 'dir' => 'ltr', 'name' => 'Kreyòl Ayisyen', 'base' => 'ht', 'short_name' => 'HT', ], 'ht_HT' => [ 'code' => 'ht_HT', 'dir' => 'ltr', 'name' => 'Kreyòl Ayisyen', 'base' => 'ht', 'short_name' => 'HT (HT)', ], 'hu' => [ 'code' => 'hu', 'dir' => 'ltr', 'name' => 'Magyar', 'base' => 'hu', 'short_name' => 'HU', ], 'hu_HU' => [ 'code' => 'hu_HU', 'dir' => 'ltr', 'name' => 'Magyar', 'base' => 'hu', 'short_name' => 'HU (HU)', ], 'hy' => [ 'code' => 'hy', 'dir' => 'ltr', 'name' => 'հայերեն', 'base' => 'hy', 'short_name' => 'HY', ], 'hy_HY' => [ 'code' => 'hy_HY', 'dir' => 'ltr', 'name' => 'հայերեն', 'base' => 'hy', 'short_name' => 'HY (HY)', ], 'ia' => [ 'code' => 'ia', 'dir' => 'ltr', 'name' => 'Interlingua', 'base' => 'ia', 'short_name' => 'IA', ], 'ia_IA' => [ 'code' => 'ia_IA', 'dir' => 'ltr', 'name' => 'Interlingua', 'base' => 'ia', 'short_name' => 'IA (IA)', ], 'id' => [ 'code' => 'id', 'dir' => 'ltr', 'name' => 'Bahasa Indonesia', 'base' => 'id', 'short_name' => 'ID', ], 'id_ID' => [ 'code' => 'id_ID', 'dir' => 'ltr', 'name' => 'Bahasa Indonesia', 'base' => 'id', 'short_name' => 'ID (ID)', ], 'ie' => [ 'code' => 'ie', 'dir' => 'ltr', 'name' => 'Interlingue', 'base' => 'ie', 'short_name' => 'IE', ], 'ie_IE' => [ 'code' => 'ie_IE', 'dir' => 'ltr', 'name' => 'Interlingue', 'base' => 'ie', 'short_name' => 'IE (IE)', ], 'in' => [ 'code' => 'in', 'dir' => 'ltr', 'name' => 'Bahasa Indonesia', 'base' => 'in', 'short_name' => 'IN', ], 'in_ID' => [ 'code' => 'in_ID', 'dir' => 'ltr', 'name' => 'Bahasa Indonesia (Indonesia)', 'base' => 'in', 'short_name' => 'IN (ID)', ], 'is' => [ 'code' => 'is', 'dir' => 'ltr', 'name' => 'Íslenska', 'base' => 'is', 'short_name' => 'IS', ], 'is_IS' => [ 'code' => 'is_IS', 'dir' => 'ltr', 'name' => 'Íslenska (Ísland)', 'base' => 'is', 'short_name' => 'IS (IS)', ], 'it' => [ 'code' => 'it', 'dir' => 'ltr', 'name' => 'Italiano', 'base' => 'it', 'short_name' => 'IT', ], 'it_CH' => [ 'code' => 'it_CH', 'dir' => 'ltr', 'name' => 'Italiano (Svizzera)', 'base' => 'it', 'short_name' => 'IT (CH)', ], 'it_IT' => [ 'code' => 'it_IT', 'dir' => 'ltr', 'name' => 'Italiano (Italia)', 'base' => 'it', 'short_name' => 'IT (IT)', ], 'iu' => [ 'code' => 'iu', 'dir' => 'ltr', 'name' => 'Inuktitut', 'base' => 'iu', 'short_name' => 'IU', ], 'iu_IU' => [ 'code' => 'iu_IU', 'dir' => 'ltr', 'name' => 'Inuktitut', 'base' => 'iu', 'short_name' => 'IU (IU)', ], 'iw' => [ 'code' => 'iw', 'dir' => 'ltr', 'name' => 'עברית', 'base' => 'iw', 'short_name' => 'IW', ], 'iw_IL' => [ 'code' => 'iw_IL', 'dir' => 'ltr', 'name' => 'עברית', 'base' => 'iw', 'short_name' => 'IW (IL)', ], 'ja' => [ 'code' => 'ja', 'dir' => 'ltr', 'name' => '日本語', 'base' => 'ja', 'short_name' => 'JA', ], 'ja_JP' => [ 'code' => 'ja_JP', 'dir' => 'ltr', 'name' => '日本語', 'base' => 'ja', 'short_name' => 'JA (JP)', ], 'ka' => [ 'code' => 'ka', 'dir' => 'ltr', 'name' => 'ქართული', 'base' => 'ka', 'short_name' => 'KA', ], 'ka_KA' => [ 'code' => 'ka_KA', 'dir' => 'ltr', 'name' => 'ქართული', 'base' => 'ka', 'short_name' => 'KA (KA)', ], 'kk' => [ 'code' => 'kk', 'dir' => 'ltr', 'name' => 'Қазақша', 'base' => 'kk', 'short_name' => 'KK', ], 'kk_KK' => [ 'code' => 'kk_KK', 'dir' => 'ltr', 'name' => 'Қазақша', 'base' => 'kk', 'short_name' => 'KK (KK)', ], 'km' => [ 'code' => 'km', 'dir' => 'ltr', 'name' => 'Khmer', 'base' => 'km', 'short_name' => 'KM', ], 'km_KM' => [ 'code' => 'km_KM', 'dir' => 'ltr', 'name' => 'Khmer', 'base' => 'km', 'short_name' => 'KM (KM)', ], 'ko' => [ 'code' => 'ko', 'dir' => 'ltr', 'name' => '한국어', 'base' => 'ko', 'short_name' => 'KO', ], 'ko_KR' => [ 'code' => 'ko_KR', 'dir' => 'ltr', 'name' => '한국어', 'base' => 'ko', 'short_name' => 'KO (KR)', ], 'ky' => [ 'code' => 'ky', 'dir' => 'ltr', 'name' => 'Кыргызча', 'base' => 'ky', 'short_name' => 'KY', ], 'ky_KY' => [ 'code' => 'ky_KY', 'dir' => 'ltr', 'name' => 'Кыргызча', 'base' => 'ky', 'short_name' => 'KY (KY)', ], 'la' => [ 'code' => 'la', 'dir' => 'ltr', 'name' => 'Latina', 'base' => 'la', 'short_name' => 'LA', ], 'la_LA' => [ 'code' => 'la_LA', 'dir' => 'ltr', 'name' => 'Latina', 'base' => 'la', 'short_name' => 'LA (LA)', ], 'lb' => [ 'code' => 'lb', 'dir' => 'ltr', 'name' => 'Lëtzebuergesch', 'base' => 'lb', 'short_name' => 'LB', ], 'lb_LB' => [ 'code' => 'lb_LB', 'dir' => 'ltr', 'name' => 'Lëtzebuergesch', 'base' => 'lb', 'short_name' => 'LB (LB)', ], 'lt' => [ 'code' => 'lt', 'dir' => 'ltr', 'name' => 'Lietuvių', 'base' => 'lt', 'short_name' => 'LT', ], 'lt_LT' => [ 'code' => 'lt_LT', 'dir' => 'ltr', 'name' => 'Lietuvių (Lietuva)', 'base' => 'lt', 'short_name' => 'LT (LT)', ], 'lv' => [ 'code' => 'lv', 'dir' => 'ltr', 'name' => 'Latviešu', 'base' => 'lv', 'short_name' => 'LV', ], 'lv_LV' => [ 'code' => 'lv_LV', 'dir' => 'ltr', 'name' => 'Latviešu (Latvija)', 'base' => 'lv', 'short_name' => 'LV (LV)', ], 'mi' => [ 'code' => 'mi', 'dir' => 'ltr', 'name' => 'Te Reo Māori', 'base' => 'mi', 'short_name' => 'MI', ], 'mi_MI' => [ 'code' => 'mi_MI', 'dir' => 'ltr', 'name' => 'Te Reo Māori', 'base' => 'mi', 'short_name' => 'MI (MI)', ], 'mk' => [ 'code' => 'mk', 'dir' => 'ltr', 'name' => 'Македонски', 'base' => 'mk', 'short_name' => 'MK', ], 'mk_MK' => [ 'code' => 'mk_MK', 'dir' => 'ltr', 'name' => 'Македонски (Македонија)', 'base' => 'mk', 'short_name' => 'MK (MK)', ], 'ml' => [ 'code' => 'ml', 'dir' => 'ltr', 'name' => 'Malayalam', 'base' => 'ml', 'short_name' => 'ML', ], 'ml_ML' => [ 'code' => 'ml_ML', 'dir' => 'ltr', 'name' => 'Malayalam', 'base' => 'ml', 'short_name' => 'ML (ML)', ], 'mo' => [ 'code' => 'mo', 'dir' => 'ltr', 'name' => 'Graiul Moldovenesc', 'base' => 'mo', 'short_name' => 'MO', ], 'mo_MO' => [ 'code' => 'mo_MO', 'dir' => 'ltr', 'name' => 'Graiul Moldovenesc', 'base' => 'mo', 'short_name' => 'MO (MO)', ], 'mr' => [ 'code' => 'mr', 'dir' => 'ltr', 'name' => 'मराठी', 'base' => 'mr', 'short_name' => 'MR', ], 'mr_MR' => [ 'code' => 'mr_MR', 'dir' => 'ltr', 'name' => 'मराठी', 'base' => 'mr', 'short_name' => 'MR (MR)', ], 'ms' => [ 'code' => 'ms', 'dir' => 'ltr', 'name' => 'Bahasa Melayu', 'base' => 'ms', 'short_name' => 'MS', ], 'ms_MY' => [ 'code' => 'ms_MY', 'dir' => 'ltr', 'name' => 'Bahasa Melayu', 'base' => 'ms', 'short_name' => 'MS (MY)', ], 'mt' => [ 'code' => 'mt', 'dir' => 'ltr', 'name' => 'Malti', 'base' => 'mt', 'short_name' => 'MT', ], 'mt_MT' => [ 'code' => 'mt_MT', 'dir' => 'ltr', 'name' => 'Malti', 'base' => 'mt', 'short_name' => 'MT (MT)', ], 'nb' => [ 'code' => 'nb', 'dir' => 'ltr', 'name' => '‪Norsk Bokmål‬', 'base' => 'nb', 'short_name' => 'NB', ], 'nb_NB' => [ 'code' => 'nb_NB', 'dir' => 'ltr', 'name' => '‪Norsk Bokmål‬', 'base' => 'nb', 'short_name' => 'NB (NB)', ], 'ne' => [ 'code' => 'ne', 'dir' => 'ltr', 'name' => 'नेपाली', 'base' => 'ne', 'short_name' => 'NE', ], 'ne_NE' => [ 'code' => 'ne_NE', 'dir' => 'ltr', 'name' => 'नेपाली', 'base' => 'ne', 'short_name' => 'NE (NE)', ], 'ng' => [ 'code' => 'ng', 'dir' => 'ltr', 'name' => 'Oshiwambo', 'base' => 'ng', 'short_name' => 'NG', ], 'ng_NG' => [ 'code' => 'ng_NG', 'dir' => 'ltr', 'name' => 'Oshiwambo', 'base' => 'ng', 'short_name' => 'NG (NG)', ], 'nl' => [ 'code' => 'nl', 'dir' => 'ltr', 'name' => 'Nederlands', 'base' => 'nl', 'short_name' => 'NL', ], 'nl_BE' => [ 'code' => 'nl_BE', 'dir' => 'ltr', 'name' => 'Nederlands (België)', 'base' => 'nl', 'short_name' => 'NL (BE)', ], 'nl_NL' => [ 'code' => 'nl_NL', 'dir' => 'ltr', 'name' => 'Nederlands (Nederland)', 'base' => 'nl', 'short_name' => 'NL (NL)', ], 'nn' => [ 'code' => 'nn', 'dir' => 'ltr', 'name' => 'Norsk', 'base' => 'nn', 'short_name' => 'NN', ], 'nn_NN' => [ 'code' => 'nn_NN', 'dir' => 'ltr', 'name' => 'Norsk (Nynorsk)', 'base' => 'nn', 'short_name' => 'NN (NN)', ], 'no' => [ 'code' => 'no', 'dir' => 'ltr', 'name' => 'Norsk', 'base' => 'no', 'short_name' => 'NO', ], 'no_NO' => [ 'code' => 'no_NO', 'dir' => 'ltr', 'name' => 'Norsk (Norge)', 'base' => 'no', 'short_name' => 'NO (NO)', ], 'nv' => [ 'code' => 'nv', 'dir' => 'ltr', 'name' => 'Diné Bizaad', 'base' => 'nv', 'short_name' => 'NV', ], 'nv_NV' => [ 'code' => 'nv_NV', 'dir' => 'ltr', 'name' => 'Diné Bizaad', 'base' => 'nv', 'short_name' => 'NV (NV)', ], 'oc' => [ 'code' => 'oc', 'dir' => 'ltr', 'name' => 'Lenga d’òc', 'base' => 'oc', 'short_name' => 'OC', ], 'oc_OC' => [ 'code' => 'oc_OC', 'dir' => 'ltr', 'name' => 'Lenga d’òc', 'base' => 'oc', 'short_name' => 'OC (OC)', ], 'om' => [ 'code' => 'om', 'dir' => 'ltr', 'name' => 'Afaan Oromoo', 'base' => 'om', 'short_name' => 'OM', ], 'om_OM' => [ 'code' => 'om_OM', 'dir' => 'ltr', 'name' => 'Afaan Oromoo', 'base' => 'om', 'short_name' => 'OM (OM)', ], 'pa' => [ 'code' => 'pa', 'dir' => 'rtl', 'name' => 'भारत गणराज्य', 'base' => 'pa', 'short_name' => 'PA', ], 'pa_IN' => [ 'code' => 'pa_IN', 'dir' => 'rtl', 'name' => 'भारत गणराज्य (नेपाली)', 'base' => 'pa', 'short_name' => 'PA (IN)', ], 'pa_PK' => [ 'code' => 'pa_PK', 'dir' => 'rtl', 'name' => 'یپنجاب (پنجاب)', 'base' => 'pa', 'short_name' => 'PA (PK)', ], 'pl' => [ 'code' => 'pl', 'dir' => 'ltr', 'name' => 'Polski', 'base' => 'pl', 'short_name' => 'PL', ], 'pl_PL' => [ 'code' => 'pl_PL', 'dir' => 'ltr', 'name' => 'Polski (Polska)', 'base' => 'pl', 'short_name' => 'PL (PL)', ], 'pt' => [ 'code' => 'pt', 'dir' => 'ltr', 'name' => 'Português', 'base' => 'pt', 'short_name' => 'PT', ], 'pt_BR' => [ 'code' => 'pt_BR', 'dir' => 'ltr', 'name' => 'Português (Brasil)', 'base' => 'pt', 'short_name' => 'PT (BR)', ], 'pt_PT' => [ 'code' => 'pt_PT', 'dir' => 'ltr', 'name' => 'Português (Portugal)', 'base' => 'pt', 'short_name' => 'PT (PT)', ], 'qu' => [ 'code' => 'qu', 'dir' => 'ltr', 'name' => 'Runa Simi', 'base' => 'qu', 'short_name' => 'QU', ], 'qu_QU' => [ 'code' => 'qu_QU', 'dir' => 'ltr', 'name' => 'Runa Simi', 'base' => 'qu', 'short_name' => 'QU (QU)', ], 'rm' => [ 'code' => 'rm', 'dir' => 'ltr', 'name' => 'Rumantsch', 'base' => 'rm', 'short_name' => 'RM', ], 'rm_RM' => [ 'code' => 'rm_RM', 'dir' => 'ltr', 'name' => 'Rumantsch', 'base' => 'rm', 'short_name' => 'RM (RM)', ], 'ro' => [ 'code' => 'ro', 'dir' => 'ltr', 'name' => 'Română', 'base' => 'ro', 'short_name' => 'RO', ], 'ro_RO' => [ 'code' => 'ro_RO', 'dir' => 'ltr', 'name' => 'Română (România)', 'base' => 'ro', 'short_name' => 'RO (RO)', ], 'ru' => [ 'code' => 'ru', 'dir' => 'ltr', 'name' => 'Русский', 'base' => 'ru', 'short_name' => 'RU', ], 'ru_RU' => [ 'code' => 'ru_RU', 'dir' => 'ltr', 'name' => 'Русский (Россия)', 'base' => 'ru', 'short_name' => 'RU (RU)', ], 'sa' => [ 'code' => 'sa', 'dir' => 'ltr', 'name' => 'संस्कृत', 'base' => 'sa', 'short_name' => 'SA', ], 'sa_SA' => [ 'code' => 'sa_SA', 'dir' => 'ltr', 'name' => 'संस्कृत', 'base' => 'sa', 'short_name' => 'SA (SA)', ], 'sc' => [ 'code' => 'sc', 'dir' => 'ltr', 'name' => 'Sardu', 'base' => 'sc', 'short_name' => 'SC', ], 'sc_SC' => [ 'code' => 'sc_SC', 'dir' => 'ltr', 'name' => 'Sardu', 'base' => 'sc', 'short_name' => 'SC (SC)', ], 'sd' => [ 'code' => 'sd', 'dir' => 'rtl', 'name' => 'فارسی', 'base' => 'sd', 'short_name' => 'SD', ], 'sd_SD' => [ 'code' => 'sd_SD', 'dir' => 'rtl', 'name' => 'فارسی', 'base' => 'sd', 'short_name' => 'SD (SD)', ], 'sg' => [ 'code' => 'sg', 'dir' => 'ltr', 'name' => 'Sango', 'base' => 'sg', 'short_name' => 'SG', ], 'sg_SG' => [ 'code' => 'sg_SG', 'dir' => 'ltr', 'name' => 'Sango', 'base' => 'sg', 'short_name' => 'SG (SG)', ], 'sk' => [ 'code' => 'sk', 'dir' => 'ltr', 'name' => 'Slovenčina', 'base' => 'sk', 'short_name' => 'SK', ], 'sk_SK' => [ 'code' => 'sk_SK', 'dir' => 'ltr', 'name' => 'Slovenčina (Slovenská republika)', 'base' => 'sk', 'short_name' => 'SK (SK)', ], 'sl' => [ 'code' => 'sl', 'dir' => 'ltr', 'name' => 'Slovenščina', 'base' => 'sl', 'short_name' => 'SL', ], 'sl_SI' => [ 'code' => 'sl_SI', 'dir' => 'ltr', 'name' => 'Slovenščina (Slovenija)', 'base' => 'sl', 'short_name' => 'SL (SI)', ], 'so' => [ 'code' => 'so', 'dir' => 'ltr', 'name' => 'Af Somali', 'base' => 'so', 'short_name' => 'SO', ], 'so_SO' => [ 'code' => 'so_SO', 'dir' => 'ltr', 'name' => 'Af Somali', 'base' => 'so', 'short_name' => 'SO (SO)', ], 'sq' => [ 'code' => 'sq', 'dir' => 'ltr', 'name' => 'Shqipe', 'base' => 'sq', 'short_name' => 'SQ', ], 'sq_AL' => [ 'code' => 'sq_AL', 'dir' => 'ltr', 'name' => 'Shqipe', 'base' => 'sq', 'short_name' => 'SQ (AL)', ], 'sr' => [ 'code' => 'sr', 'dir' => 'ltr', 'name' => 'Српски', 'base' => 'sr', 'short_name' => 'SR', ], 'sr_BA' => [ 'code' => 'sr_BA', 'dir' => 'ltr', 'name' => 'Српски (Босна и Херцеговина)', 'base' => 'sr', 'short_name' => 'SR (BA)', ], 'sr_CS' => [ 'code' => 'sr_CS', 'dir' => 'ltr', 'name' => 'Српски (Србија и Црна Гора)', 'base' => 'sr', 'short_name' => 'SR (CS)', ], 'sr_RS' => [ 'code' => 'sr_RS', 'dir' => 'ltr', 'name' => 'Српски', 'base' => 'sr', 'short_name' => 'SR (RS)', ], 'sv' => [ 'code' => 'sv', 'dir' => 'ltr', 'name' => 'Svenska', 'base' => 'sv', 'short_name' => 'SV', ], 'sv_SE' => [ 'code' => 'sv_SE', 'dir' => 'ltr', 'name' => 'Svenska (Sverige)', 'base' => 'sv', 'short_name' => 'SV (SE)', ], 'sw' => [ 'code' => 'sw', 'dir' => 'ltr', 'name' => 'Kiswahili', 'base' => 'sw', 'short_name' => 'SW', ], 'sw_SW' => [ 'code' => 'sw_SW', 'dir' => 'ltr', 'name' => 'Kiswahili', 'base' => 'sw', 'short_name' => 'SW (SW)', ], 'ta' => [ 'code' => 'ta', 'dir' => 'ltr', 'name' => 'தமிழ', 'base' => 'ta', 'short_name' => 'TA', ], 'ta_TA' => [ 'code' => 'ta_TA', 'dir' => 'ltr', 'name' => 'தமிழ', 'base' => 'ta', 'short_name' => 'TA (TA)', ], 'th' => [ 'code' => 'th', 'dir' => 'ltr', 'name' => 'ไทย', 'base' => 'th', 'short_name' => 'TH', ], 'th_TH' => [ 'code' => 'th_TH', 'dir' => 'ltr', 'name' => 'ไทย (ประเทศไทย)', 'base' => 'th', 'short_name' => 'TH (TH)', ], 'tig' => [ 'code' => 'tig', 'dir' => 'ltr', 'name' => 'Tigré', 'base' => 'tig', 'short_name' => 'TIG', ], 'tig_TIG' => [ 'code' => 'tig_TIG', 'dir' => 'ltr', 'name' => 'Tigré', 'base' => 'tig', 'short_name' => 'TIG (TIG)', ], 'tk' => [ 'code' => 'tk', 'dir' => 'ltr', 'name' => 'Түркмен', 'base' => 'tk', 'short_name' => 'TK', ], 'tk_TK' => [ 'code' => 'tk_TK', 'dir' => 'ltr', 'name' => 'Түркмен', 'base' => 'tk', 'short_name' => 'TK (TK)', ], 'tlh' => [ 'code' => 'tlh', 'dir' => 'ltr', 'name' => 'tlhIngan Hol', 'base' => 'tlh', 'short_name' => 'TLH', ], 'tlh_TLH' => [ 'code' => 'tlh_TLH', 'dir' => 'ltr', 'name' => 'tlhIngan Hol', 'base' => 'tlh', 'short_name' => 'TLH (TLH)', ], 'tr' => [ 'code' => 'tr', 'dir' => 'ltr', 'name' => 'Türkçe', 'base' => 'tr', 'short_name' => 'TR', ], 'tr_TR' => [ 'code' => 'tr_TR', 'dir' => 'ltr', 'name' => 'Türkçe', 'base' => 'tr', 'short_name' => 'TR (TR)', ], 'uk' => [ 'code' => 'uk', 'dir' => 'ltr', 'name' => 'Українська', 'base' => 'uk', 'short_name' => 'UK', ], 'uk_UA' => [ 'code' => 'uk_UA', 'dir' => 'ltr', 'name' => 'Українська', 'base' => 'uk', 'short_name' => 'UK (UA)', ], 've' => [ 'code' => 've', 'dir' => 'ltr', 'name' => 'Tshivenda', 'base' => 've', 'short_name' => 'VE', ], 've_VE' => [ 'code' => 've_VE', 'dir' => 'ltr', 'name' => 'Tshivenda', 'base' => 've', 'short_name' => 'VE (VE)', ], 'vi' => [ 'code' => 'vi', 'dir' => 'ltr', 'name' => 'Tiếng Việt', 'base' => 'vi', 'short_name' => 'VI', ], 'vi_VN' => [ 'code' => 'vi_VN', 'dir' => 'ltr', 'name' => 'Tiếng Việt', 'base' => 'vi', 'short_name' => 'VI (VN)', ], 'vo' => [ 'code' => 'vo', 'dir' => 'ltr', 'name' => 'Volapük', 'base' => 'vo', 'short_name' => 'VO', ], 'vo_VO' => [ 'code' => 'vo_VO', 'dir' => 'ltr', 'name' => 'Volapük', 'base' => 'vo', 'short_name' => 'VO (VO)', ], 'wa' => [ 'code' => 'wa', 'dir' => 'ltr', 'name' => 'Walon', 'base' => 'wa', 'short_name' => 'WA', ], 'wa_WA' => [ 'code' => 'wa_WA', 'dir' => 'ltr', 'name' => 'Walon', 'base' => 'wa', 'short_name' => 'WA (WA)', ], 'xh' => [ 'code' => 'xh', 'dir' => 'ltr', 'name' => 'isiXhosa', 'base' => 'xh', 'short_name' => 'XH', ], 'xh_XH' => [ 'code' => 'xh_XH', 'dir' => 'ltr', 'name' => 'isiXhosa', 'base' => 'xh', 'short_name' => 'XH (XH)', ], 'yi' => [ 'code' => 'yi', 'dir' => 'rtl', 'name' => 'ייִדיש', 'base' => 'yi', 'short_name' => 'YI', ], 'yi_YI' => [ 'code' => 'yi_YI', 'dir' => 'rtl', 'name' => 'ייִדיש', 'base' => 'yi', 'short_name' => 'YI (YI)', ], 'zh' => [ 'code' => 'zh', 'dir' => 'ltr', 'name' => '中文', 'base' => 'zh', 'short_name' => 'ZH', ], 'zh_CN' => [ 'code' => 'zh_CN', 'dir' => 'ltr', 'name' => '中文 (中国)', 'base' => 'zh', 'short_name' => 'ZH (CN)', ], 'zh_HK' => [ 'code' => 'zh_HK', 'dir' => 'ltr', 'name' => '中文 (香港)', 'base' => 'zh', 'short_name' => 'ZH (HK)', ], 'zh_SG' => [ 'code' => 'zh_SG', 'dir' => 'ltr', 'name' => '中文 (新加坡)', 'base' => 'zh', 'short_name' => 'ZH (SG)', ], 'zh_TW' => [ 'code' => 'zh_TW', 'dir' => 'ltr', 'name' => '中文 (台灣)', 'base' => 'zh', 'short_name' => 'ZH (TW)', ], 'zu' => [ 'code' => 'zu', 'dir' => 'ltr', 'name' => 'isiZulu', 'base' => 'zu', 'short_name' => 'ZU', ], 'zu_ZU' => [ 'code' => 'zu_ZU', 'dir' => 'ltr', 'name' => 'isiZulu', 'base' => 'zu', 'short_name' => 'ZU (ZU)', ], ]; } } class L10nException extends Exception {} //error_reporting($error_reporting_level);