123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959 |
- <?php
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * Hold the PhpMyAdmin\LanguageManager class
- *
- * @package PhpMyAdmin
- */
- namespace PhpMyAdmin;
- use PhpMyAdmin\Core;
- use PhpMyAdmin\Language;
- use PhpMyAdmin\Template;
- use PhpMyAdmin\Url;
- use PhpMyAdmin\Util;
- /**
- * Language selection manager
- *
- * @package PhpMyAdmin
- */
- class LanguageManager
- {
- /**
- * @var array Definition data for languages
- *
- * Each member contains:
- * - Language code
- * - English language name
- * - Native language name
- * - Match regullar expression
- * - MySQL locale
- */
- private static $_language_data = array(
- 'af' => array(
- 'af',
- 'Afrikaans',
- '',
- 'af|afrikaans',
- '',
- ),
- 'ar' => array(
- 'ar',
- 'Arabic',
- 'العربية',
- 'ar|arabic',
- 'ar_AE',
- ),
- 'az' => array(
- 'az',
- 'Azerbaijani',
- 'Azərbaycanca',
- 'az|azerbaijani',
- '',
- ),
- 'bn' => array(
- 'bn',
- 'Bangla',
- 'বাংলা',
- 'bn|bangla',
- '',
- ),
- 'be' => array(
- 'be',
- 'Belarusian',
- 'Беларуская',
- 'be|belarusian',
- 'be_BY',
- ),
- 'be@latin' => array(
- 'be@latin',
- 'Belarusian (latin)',
- 'Biełaruskaja',
- 'be[-_]lat|be@latin|belarusian latin',
- '',
- ),
- 'bg' => array(
- 'bg',
- 'Bulgarian',
- 'Български',
- 'bg|bulgarian',
- 'bg_BG',
- ),
- 'bs' => array(
- 'bs',
- 'Bosnian',
- 'Bosanski',
- 'bs|bosnian',
- '',
- ),
- 'br' => array(
- 'br',
- 'Breton',
- 'Brezhoneg',
- 'br|breton',
- '',
- ),
- 'brx' => array(
- 'brx',
- 'Bodo',
- 'बड़ो',
- 'brx|bodo',
- '',
- ),
- 'ca' => array(
- 'ca',
- 'Catalan',
- 'Català',
- 'ca|catalan',
- 'ca_ES',
- ),
- 'ckb' => array(
- 'ckb',
- 'Sorani',
- 'سۆرانی',
- 'ckb|sorani',
- '',
- ),
- 'cs' => array(
- 'cs',
- 'Czech',
- 'Čeština',
- 'cs|czech',
- 'cs_CZ',
- ),
- 'cy' => array(
- 'cy',
- 'Welsh',
- 'Cymraeg',
- 'cy|welsh',
- '',
- ),
- 'da' => array(
- 'da',
- 'Danish',
- 'Dansk',
- 'da|danish',
- 'da_DK',
- ),
- 'de' => array(
- 'de',
- 'German',
- 'Deutsch',
- 'de|german',
- 'de_DE',
- ),
- 'el' => array(
- 'el',
- 'Greek',
- 'Ελληνικά',
- 'el|greek',
- '',
- ),
- 'en' => array(
- 'en',
- 'English',
- '',
- 'en|english',
- 'en_US',
- ),
- 'en_gb' => array(
- 'en_GB',
- 'English (United Kingdom)',
- '',
- 'en[_-]gb|english (United Kingdom)',
- 'en_GB',
- ),
- 'eo' => array(
- 'eo',
- 'Esperanto',
- 'Esperanto',
- 'eo|esperanto',
- '',
- ),
- 'es' => array(
- 'es',
- 'Spanish',
- 'Español',
- 'es|spanish',
- 'es_ES',
- ),
- 'et' => array(
- 'et',
- 'Estonian',
- 'Eesti',
- 'et|estonian',
- 'et_EE',
- ),
- 'eu' => array(
- 'eu',
- 'Basque',
- 'Euskara',
- 'eu|basque',
- 'eu_ES',
- ),
- 'fa' => array(
- 'fa',
- 'Persian',
- 'فارسی',
- 'fa|persian',
- '',
- ),
- 'fi' => array(
- 'fi',
- 'Finnish',
- 'Suomi',
- 'fi|finnish',
- 'fi_FI',
- ),
- 'fil' => array(
- 'fil',
- 'Filipino',
- 'Pilipino',
- 'fil|filipino',
- '',
- ),
- 'fr' => array(
- 'fr',
- 'French',
- 'Français',
- 'fr|french',
- 'fr_FR',
- ),
- 'fy' => array(
- 'fy',
- 'Frisian',
- 'Frysk',
- 'fy|frisian',
- '',
- ),
- 'gl' => array(
- 'gl',
- 'Galician',
- 'Galego',
- 'gl|galician',
- 'gl_ES',
- ),
- 'gu' => array(
- 'gu',
- 'Gujarati',
- 'ગુજરાતી',
- 'gu|gujarati',
- 'gu_IN',
- ),
- 'he' => array(
- 'he',
- 'Hebrew',
- 'עברית',
- 'he|hebrew',
- 'he_IL',
- ),
- 'hi' => array(
- 'hi',
- 'Hindi',
- 'हिन्दी',
- 'hi|hindi',
- 'hi_IN',
- ),
- 'hr' => array(
- 'hr',
- 'Croatian',
- 'Hrvatski',
- 'hr|croatian',
- 'hr_HR',
- ),
- 'hu' => array(
- 'hu',
- 'Hungarian',
- 'Magyar',
- 'hu|hungarian',
- 'hu_HU',
- ),
- 'hy' => array(
- 'hy',
- 'Armenian',
- 'Հայերէն',
- 'hy|armenian',
- '',
- ),
- 'ia' => array(
- 'ia',
- 'Interlingua',
- '',
- 'ia|interlingua',
- '',
- ),
- 'id' => array(
- 'id',
- 'Indonesian',
- 'Bahasa Indonesia',
- 'id|indonesian',
- 'id_ID',
- ),
- 'ig' => array(
- 'ig',
- 'Igbo',
- 'Asụsụ Igbo',
- 'ig|igbo',
- '',
- ),
- 'it' => array(
- 'it',
- 'Italian',
- 'Italiano',
- 'it|italian',
- 'it_IT',
- ),
- 'ja' => array(
- 'ja',
- 'Japanese',
- '日本語',
- 'ja|japanese',
- 'ja_JP',
- ),
- 'ko' => array(
- 'ko',
- 'Korean',
- '한국어',
- 'ko|korean',
- 'ko_KR',
- ),
- 'ka' => array(
- 'ka',
- 'Georgian',
- 'ქართული',
- 'ka|georgian',
- '',
- ),
- 'kab' => array(
- 'kab',
- 'Kabylian',
- 'Taqbaylit',
- 'kab|kabylian',
- '',
- ),
- 'kk' => array(
- 'kk',
- 'Kazakh',
- 'Қазақ',
- 'kk|kazakh',
- '',
- ),
- 'km' => array(
- 'km',
- 'Khmer',
- 'ខ្មែរ',
- 'km|khmer',
- '',
- ),
- 'kn' => array(
- 'kn',
- 'Kannada',
- 'ಕನ್ನಡ',
- 'kn|kannada',
- '',
- ),
- 'ksh' => array(
- 'ksh',
- 'Colognian',
- 'Kölsch',
- 'ksh|colognian',
- '',
- ),
- 'ku' => array(
- 'ku',
- 'Kurdish',
- 'کوردی',
- 'ku|kurdish',
- '',
- ),
- 'ky' => array(
- 'ky',
- 'Kyrgyz',
- 'Кыргызча',
- 'ky|kyrgyz',
- '',
- ),
- 'li' => array(
- 'li',
- 'Limburgish',
- 'Lèmbörgs',
- 'li|limburgish',
- '',
- ),
- 'lt' => array(
- 'lt',
- 'Lithuanian',
- 'Lietuvių',
- 'lt|lithuanian',
- 'lt_LT',
- ),
- 'lv' => array(
- 'lv',
- 'Latvian',
- 'Latviešu',
- 'lv|latvian',
- 'lv_LV',
- ),
- 'mk' => array(
- 'mk',
- 'Macedonian',
- 'Macedonian',
- 'mk|macedonian',
- 'mk_MK',
- ),
- 'ml' => array(
- 'ml',
- 'Malayalam',
- 'Malayalam',
- 'ml|malayalam',
- '',
- ),
- 'mn' => array(
- 'mn',
- 'Mongolian',
- 'Монгол',
- 'mn|mongolian',
- 'mn_MN',
- ),
- 'ms' => array(
- 'ms',
- 'Malay',
- 'Bahasa Melayu',
- 'ms|malay',
- 'ms_MY',
- ),
- 'my' => array(
- 'my',
- 'Burmese',
- 'မြန်မာ',
- 'my|burmese',
- '',
- ),
- 'ne' => array(
- 'ne',
- 'Nepali',
- 'नेपाली',
- 'ne|nepali',
- '',
- ),
- 'nb' => array(
- 'nb',
- 'Norwegian',
- 'Norsk',
- 'nb|norwegian',
- 'nb_NO',
- ),
- 'nl' => array(
- 'nl',
- 'Dutch',
- 'Nederlands',
- 'nl|dutch',
- 'nl_NL',
- ),
- 'pa' => array(
- 'pa',
- 'Punjabi',
- 'ਪੰਜਾਬੀ',
- 'pa|punjabi',
- '',
- ),
- 'pl' => array(
- 'pl',
- 'Polish',
- 'Polski',
- 'pl|polish',
- 'pl_PL',
- ),
- 'pt_br' => array(
- 'pt_BR',
- 'Brazilian Portuguese',
- 'Português',
- 'pt[-_]br|brazilian portuguese',
- 'pt_BR',
- ),
- 'pt' => array(
- 'pt',
- 'Portuguese',
- 'Português',
- 'pt|portuguese',
- 'pt_PT',
- ),
- 'ro' => array(
- 'ro',
- 'Romanian',
- 'Română',
- 'ro|romanian',
- 'ro_RO',
- ),
- 'ru' => array(
- 'ru',
- 'Russian',
- 'Русский',
- 'ru|russian',
- 'ru_RU',
- ),
- 'si' => array(
- 'si',
- 'Sinhala',
- 'සිංහල',
- 'si|sinhala',
- '',
- ),
- 'sk' => array(
- 'sk',
- 'Slovak',
- 'Slovenčina',
- 'sk|slovak',
- 'sk_SK',
- ),
- 'sl' => array(
- 'sl',
- 'Slovenian',
- 'Slovenščina',
- 'sl|slovenian',
- 'sl_SI',
- ),
- 'sq' => array(
- 'sq',
- 'Slbanian',
- 'Shqip',
- 'sq|albanian',
- 'sq_AL',
- ),
- 'sr@latin' => array(
- 'sr@latin',
- 'Serbian (latin)',
- 'Srpski',
- 'sr[-_]lat|sr@latin|serbian latin',
- 'sr_YU',
- ),
- 'sr' => array(
- 'sr',
- 'Serbian',
- 'Српски',
- 'sr|serbian',
- 'sr_YU',
- ),
- 'sv' => array(
- 'sv',
- 'Swedish',
- 'Svenska',
- 'sv|swedish',
- 'sv_SE',
- ),
- 'ta' => array(
- 'ta',
- 'Tamil',
- 'தமிழ்',
- 'ta|tamil',
- 'ta_IN',
- ),
- 'te' => array(
- 'te',
- 'Telugu',
- 'తెలుగు',
- 'te|telugu',
- 'te_IN',
- ),
- 'th' => array(
- 'th',
- 'Thai',
- 'ภาษาไทย',
- 'th|thai',
- 'th_TH',
- ),
- 'tk' => array(
- 'tk',
- 'Turkmen',
- 'Türkmençe',
- 'tk|turkmen',
- '',
- ),
- 'tr' => array(
- 'tr',
- 'Turkish',
- 'Türkçe',
- 'tr|turkish',
- 'tr_TR',
- ),
- 'tt' => array(
- 'tt',
- 'Tatarish',
- 'Tatarça',
- 'tt|tatarish',
- '',
- ),
- 'ug' => array(
- 'ug',
- 'Uyghur',
- 'ئۇيغۇرچە',
- 'ug|uyghur',
- '',
- ),
- 'uk' => array(
- 'uk',
- 'Ukrainian',
- 'Українська',
- 'uk|ukrainian',
- 'uk_UA',
- ),
- 'ur' => array(
- 'ur',
- 'Urdu',
- 'اُردوُ',
- 'ur|urdu',
- 'ur_PK',
- ),
- 'uz@latin' => array(
- 'uz@latin',
- 'Uzbek (latin)',
- 'O‘zbekcha',
- 'uz[-_]lat|uz@latin|uzbek-latin',
- '',
- ),
- 'uz' => array(
- 'uz',
- 'Uzbek (cyrillic)',
- 'Ўзбекча',
- 'uz[-_]cyr|uz@cyrillic|uzbek-cyrillic',
- '',
- ),
- 'vi' => array(
- 'vi',
- 'Vietnamese',
- 'Tiếng Việt',
- 'vi|vietnamese',
- 'vi_VN',
- ),
- 'vls' => array(
- 'vls',
- 'Flemish',
- 'West-Vlams',
- 'vls|flemish',
- '',
- ),
- 'zh_tw' => array(
- 'zh_TW',
- 'Chinese traditional',
- '中文',
- 'zh[-_](tw|hk)|chinese traditional',
- 'zh_TW',
- ),
- // only TW and HK use traditional Chinese while others (CN, SG, MY)
- // use simplified Chinese
- 'zh_cn' => array(
- 'zh_CN',
- 'Chinese simplified',
- '中文',
- 'zh(?)([-_][[:alpha:]]{2,3})?|chinese simplified',
- 'zh_CN',
- ),
- );
- private $_available_locales;
- private $_available_languages;
- private $_lang_failed_cfg;
- private $_lang_failed_cookie;
- private $_lang_failed_request;
- private static $instance;
- /**
- * Returns LanguageManager singleton
- *
- * @return LanguageManager
- */
- public static function getInstance()
- {
- if (self::$instance === null) {
- self::$instance = new LanguageManager;
- }
- return self::$instance;
- }
- /**
- * Returns list of available locales
- *
- * @return array
- */
- public function listLocaleDir()
- {
- $result = array('en');
- /* Check for existing directory */
- if (!is_dir(LOCALE_PATH)) {
- return $result;
- }
- /* Open the directory */
- $handle = @opendir(LOCALE_PATH);
- /* This can happen if the kit is English-only */
- if ($handle === false) {
- return $result;
- }
- /* Process all files */
- while (false !== ($file = readdir($handle))) {
- $path = LOCALE_PATH
- . '/' . $file
- . '/LC_MESSAGES/phpmyadmin.mo';
- if ($file != "."
- && $file != ".."
- && @file_exists($path)
- ) {
- $result[] = $file;
- }
- }
- /* Close the handle */
- closedir($handle);
- return $result;
- }
- /**
- * Returns (cached) list of all available locales
- *
- * @return array of strings
- */
- public function availableLocales()
- {
- if (! $this->_available_locales) {
- if (empty($GLOBALS['cfg']['FilterLanguages'])) {
- $this->_available_locales = $this->listLocaleDir();
- } else {
- $this->_available_locales = preg_grep(
- '@' . $GLOBALS['cfg']['FilterLanguages'] . '@',
- $this->listLocaleDir()
- );
- }
- }
- return $this->_available_locales;
- }
- /**
- * Checks whether there are some languages available
- *
- * @return boolean
- */
- public function hasChoice()
- {
- return count($this->availableLanguages()) > 1;
- }
- /**
- * Returns (cached) list of all available languages
- *
- * @return array of Language objects
- */
- public function availableLanguages()
- {
- if (! $this->_available_languages) {
- $this->_available_languages = array();
- foreach($this->availableLocales() as $lang) {
- $lang = strtolower($lang);
- if (isset($this::$_language_data[$lang])) {
- $data = $this::$_language_data[$lang];
- $this->_available_languages[$lang] = new Language(
- $data[0],
- $data[1],
- $data[2],
- $data[3],
- $data[4]
- );
- } else {
- $this->_available_languages[$lang] = new Language(
- $lang,
- ucfirst($lang),
- ucfirst($lang),
- $lang,
- ''
- );
- }
- }
- }
- return $this->_available_languages;
- }
- /**
- * Returns (cached) list of all available languages sorted
- * by name
- *
- * @return array of Language objects
- */
- public function sortedLanguages()
- {
- $this->availableLanguages();
- uasort($this->_available_languages, function($a, $b)
- {
- return $a->cmp($b);
- }
- );
- return $this->_available_languages;
- }
- /**
- * Return Language object for given code
- *
- * @param string $code Language code
- *
- * @return object|false Language object or false on failure
- */
- public function getLanguage($code)
- {
- $code = strtolower($code);
- $langs = $this->availableLanguages();
- if (isset($langs[$code])) {
- return $langs[$code];
- }
- return false;
- }
- /**
- * Return currently active Language object
- *
- * @return object Language object
- */
- public function getCurrentLanguage()
- {
- return $this->_available_languages[strtolower($GLOBALS['lang'])];
- }
- /**
- * Activates language based on configuration, user preferences or
- * browser
- *
- * @return Language
- */
- public function selectLanguage()
- {
- // check forced language
- if (! empty($GLOBALS['PMA_Config']->get('Lang'))) {
- $lang = $this->getLanguage($GLOBALS['PMA_Config']->get('Lang'));
- if ($lang !== false) {
- return $lang;
- }
- $this->_lang_failed_cfg = true;
- }
- // Don't use REQUEST in following code as it might be confused by cookies
- // with same name. Check user requested language (POST)
- if (! empty($_POST['lang'])) {
- $lang = $this->getLanguage($_POST['lang']);
- if ($lang !== false) {
- return $lang;
- }
- $this->_lang_failed_request = true;
- }
- // check user requested language (GET)
- if (! empty($_GET['lang'])) {
- $lang = $this->getLanguage($_GET['lang']);
- if ($lang !== false) {
- return $lang;
- }
- $this->_lang_failed_request = true;
- }
- // check previous set language
- if (! empty($_COOKIE['pma_lang'])) {
- $lang = $this->getLanguage($_COOKIE['pma_lang']);
- if ($lang !== false) {
- return $lang;
- }
- $this->_lang_failed_cookie = true;
- }
- $langs = $this->availableLanguages();
- // try to find out user's language by checking its HTTP_ACCEPT_LANGUAGE variable;
- $accepted_languages = Core::getenv('HTTP_ACCEPT_LANGUAGE');
- if ($accepted_languages) {
- foreach (explode(',', $accepted_languages) as $header) {
- foreach ($langs as $language) {
- if ($language->matchesAcceptLanguage($header)) {
- return $language;
- }
- }
- }
- }
- // try to find out user's language by checking its HTTP_USER_AGENT variable
- $user_agent = Core::getenv('HTTP_USER_AGENT');
- if (! empty($user_agent)) {
- foreach ($langs as $language) {
- if ($language->matchesUserAgent($user_agent)) {
- return $language;
- }
- }
- }
- // Didn't catch any valid lang : we use the default settings
- if (isset($langs[$GLOBALS['PMA_Config']->get('DefaultLang')])) {
- return $langs[$GLOBALS['PMA_Config']->get('DefaultLang')];
- }
- // Fallback to English
- return $langs['en'];
- }
- /**
- * Displays warnings about invalid languages. This needs to be postponed
- * to show messages at time when language is initialized.
- *
- * @return void
- */
- public function showWarnings()
- {
- // now, that we have loaded the language strings we can send the errors
- if ($this->_lang_failed_cfg
- || $this->_lang_failed_cookie
- || $this->_lang_failed_request
- ) {
- trigger_error(
- __('Ignoring unsupported language code.'),
- E_USER_ERROR
- );
- }
- }
- /**
- * Returns HTML code for the language selector
- *
- * @param boolean $use_fieldset whether to use fieldset for selection
- * @param boolean $show_doc whether to show documentation links
- *
- * @return string
- *
- * @access public
- */
- public function getSelectorDisplay($use_fieldset = false, $show_doc = true)
- {
- $_form_params = array(
- 'db' => $GLOBALS['db'],
- 'table' => $GLOBALS['table'],
- );
- // For non-English, display "Language" with emphasis because it's
- // not a proper word in the current language; we show it to help
- // people recognize the dialog
- $language_title = __('Language')
- . (__('Language') != 'Language' ? ' - <em>Language</em>' : '');
- if ($show_doc) {
- $language_title .= Util::showDocu('faq', 'faq7-2');
- }
- $available_languages = $this->sortedLanguages();
- return Template::get('select_lang')->render(
- array(
- 'language_title' => $language_title,
- 'use_fieldset' => $use_fieldset,
- 'available_languages' => $available_languages,
- '_form_params' => $_form_params,
- )
- );
- }
- }
|