diff --git a/index.php b/index.php
index 09ee1c8104..14a6832ac2 100644
--- a/index.php
+++ b/index.php
@@ -231,7 +231,7 @@ echo '
' , __('Appearance settings') , '
';
echo ' ';
// Displays language selection combo
-if (empty($cfg['Lang']) && count($GLOBALS['available_languages']) > 1) {
+if (empty($cfg['Lang'])) {
echo '- ';
include_once 'libraries/display_select_lang.lib.php';
echo PMA\libraries\Util::getImage('s_lang.png') , " "
diff --git a/libraries/Header.php b/libraries/Header.php
index 49c8df8740..d9f6114042 100644
--- a/libraries/Header.php
+++ b/libraries/Header.php
@@ -620,7 +620,7 @@ class Header
*/
private function _getHtmlStart()
{
- $lang = $GLOBALS['available_languages'][$GLOBALS['lang']][1];
+ $lang = $GLOBALS['lang'];
$dir = $GLOBALS['text_dir'];
$retval = "";
diff --git a/libraries/Language.php b/libraries/Language.php
new file mode 100644
index 0000000000..1704cd8a9d
--- /dev/null
+++ b/libraries/Language.php
@@ -0,0 +1,187 @@
+code = $code;
+ $this->name = $name;
+ $this->native = $native;
+ if (strpos($regex, '[-_]') === false) {
+ $regex = str_replace('|', '([-_][[:alpha:]]{2,3})?|', $regex);
+ }
+ $this->regex = $regex;
+ }
+
+ /**
+ * Returns native name for language
+ *
+ * @return string
+ */
+ public function getNativeName()
+ {
+ return $this->native;
+ }
+
+ /**
+ * Returns English name for language
+ *
+ * @return string
+ */
+ public function getEnglishName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Returns verbose name for language
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ if (! empty($this->native)) {
+ return $this->native . ' - ' . $this->name;
+ } else {
+ return $this->name;
+ }
+ }
+
+ /**
+ * Returns language code
+ *
+ * @return string
+ */
+ public function getCode()
+ {
+ return $this->code;
+ }
+
+ /**
+ * Compare function used for sorting
+ *
+ * @param Language $other Other object to compare
+ *
+ * @return int same as strcmp
+ */
+ public function cmp($other)
+ {
+ return strcmp($this->name, $other->name);
+ }
+
+ /**
+ * Checks whether language is currently active.
+ *
+ * @return bool
+ */
+ public function isActive()
+ {
+ return $GLOBALS['lang'] == $this->code;
+ }
+
+ /**
+ * Checks whether language matches HTTP header Accept-Language.
+ *
+ * @param string $header Header content
+ *
+ * @return bool
+ */
+ public function matchesAcceptLanguage($header)
+ {
+ $pattern = '/^('
+ . addcslashes($this->regex, '/')
+ . ')(;q=[0-9]\\.[0-9])?$/i';
+ return preg_match($pattern, $header);
+ }
+
+ /**
+ * Checks whether language matches HTTP header User-Agent
+ *
+ * @param string $header Header content
+ *
+ * @return bool
+ */
+ public function matchesUserAgent($header)
+ {
+ $pattern = '/(\(|\[|;[[:space:]])('
+ . addcslashes($this->regex, '/')
+ . ')(;|\]|\))/i';
+ return preg_match($pattern, $header);
+ }
+
+ /**
+ * Checks whether langauge is RTL
+ *
+ * @return bool
+ */
+ public function isRTL()
+ {
+ return in_array($this->code, array('ar', 'fa', 'he', 'ur'));
+ }
+
+ /**
+ * Activates given translation
+ *
+ * @return bool
+ */
+ public function activate()
+ {
+ $GLOBALS['lang'] = $this->code;
+
+ // Set locale
+ _setlocale(LC_MESSAGES, $this->code);
+ _bindtextdomain('phpmyadmin', LOCALE_PATH);
+ _bind_textdomain_codeset('phpmyadmin', 'UTF-8');
+ _textdomain('phpmyadmin');
+
+ /* Text direction for language */
+ if ($this->isRTL()) {
+ $GLOBALS['text_dir'] = 'rtl';
+ } else {
+ $GLOBALS['text_dir'] = 'ltr';
+ }
+
+ /* TCPDF */
+ $GLOBALS['l'] = array();
+
+ /* TCPDF settings */
+ $GLOBALS['l']['a_meta_charset'] = 'UTF-8';
+ $GLOBALS['l']['a_meta_dir'] = $GLOBALS['text_dir'];
+ $GLOBALS['l']['a_meta_language'] = $this->code;
+
+ /* TCPDF translations */
+ $GLOBALS['l']['w_page'] = __('Page number:');
+
+ /* Show possible warnings from langauge selection */
+ LanguageManager::getInstance()->showWarnings();
+ }
+}
diff --git a/libraries/LanguageManager.php b/libraries/LanguageManager.php
new file mode 100644
index 0000000000..cce10d1a2b
--- /dev/null
+++ b/libraries/LanguageManager.php
@@ -0,0 +1,687 @@
+ array(
+ 'Afrikaans',
+ '',
+ 'af|afrikaans',
+ ),
+ 'ar' => array(
+ 'Arabic',
+ 'العربية',
+ 'ar|arabic',
+ ),
+ 'az' => array(
+ 'Azerbaijani',
+ 'Azərbaycanca',
+ 'az|azerbaijani',
+ ),
+ 'bn' => array(
+ 'Bangla',
+ 'বাংলা',
+ 'bn|bangla',
+ ),
+ 'be' => array(
+ 'Belarusian',
+ 'Беларуская',
+ 'be|belarusian',
+ ),
+ 'be@latin' => array(
+ 'Belarusian (latin)',
+ 'Biełaruskaja',
+ 'be[-_]lat|be@latin|belarusian latin',
+ ),
+ 'bg' => array(
+ 'Bulgarian',
+ 'Български',
+ 'bg|bulgarian',
+ ),
+ 'bs' => array(
+ 'Bosnian',
+ 'Bosanski',
+ 'bs|bosnian',
+ ),
+ 'br' => array(
+ 'Breton',
+ 'Brezhoneg',
+ 'br|breton',
+ ),
+ 'brx' => array(
+ 'Bodo',
+ 'बड़ो',
+ 'brx|bodo',
+ ),
+ 'ca' => array(
+ 'Catalan',
+ 'Català',
+ 'ca|catalan',
+ ),
+ 'ckb' => array(
+ 'Sorani',
+ 'سۆرانی',
+ 'ckb|sorani',
+ ),
+ 'cs' => array(
+ 'Czech',
+ 'Čeština',
+ 'cs|czech',
+ ),
+ 'cy' => array(
+ 'Welsh',
+ 'Cymraeg',
+ 'cy|welsh',
+ ),
+ 'da' => array(
+ 'Danish',
+ 'Dansk',
+ 'da|danish',
+ ),
+ 'de' => array(
+ 'German',
+ 'Deutsch',
+ 'de|german',
+ ),
+ 'el' => array(
+ 'Greek',
+ 'Ελληνικά',
+ 'el|greek',
+ ),
+ 'en' => array(
+ 'English',
+ '',
+ 'en|english',
+ ),
+ 'en_gb' => array(
+ 'English (United Kingdom)',
+ '',
+ 'en[_-]gb|english (United Kingdom)',
+ ),
+ 'eo' => array(
+ 'Esperanto',
+ 'Esperanto',
+ 'eo|esperanto',
+ ),
+ 'es' => array(
+ 'Spanish',
+ 'Español',
+ 'es|spanish',
+ ),
+ 'et' => array(
+ 'Estonian',
+ 'Eesti',
+ 'et|estonian',
+ ),
+ 'eu' => array(
+ 'Basque',
+ 'Euskara',
+ 'eu|basque',
+ ),
+ 'fa' => array(
+ 'Persian',
+ 'فارسی',
+ 'fa|persian',
+ ),
+ 'fi' => array(
+ 'Finnish',
+ 'Suomi',
+ 'fi|finnish',
+ ),
+ 'fr' => array(
+ 'French',
+ 'Français',
+ 'fr|french',
+ ),
+ 'fy' => array(
+ 'Frisian',
+ 'Frysk',
+ 'fy|frisian',
+ ),
+ 'gl' => array(
+ 'Galician',
+ 'Galego',
+ 'gl|galician',
+ ),
+ 'gu' => array(
+ 'Gujarati',
+ 'ગુજરાતી',
+ 'gu|gujarati',
+ ),
+ 'he' => array(
+ 'Hebrew',
+ 'עברית',
+ 'he|hebrew',
+ ),
+ 'hi' => array(
+ 'Hindi',
+ 'हिन्दी',
+ 'hi|hindi',
+ ),
+ 'hr' => array(
+ 'Croatian',
+ 'Hrvatski',
+ 'hr|croatian',
+ ),
+ 'hu' => array(
+ 'Hungarian',
+ 'Magyar',
+ 'hu|hungarian',
+ ),
+ 'hy' => array(
+ 'Armenian',
+ 'Հայերէն',
+ 'hy|armenian',
+ ),
+ 'ia' => array(
+ 'Interlingua',
+ '',
+ 'ia|interlingua',
+ ),
+ 'id' => array(
+ 'Indonesian',
+ 'Bahasa Indonesia',
+ 'id|indonesian',
+ ),
+ 'it' => array(
+ 'Italian',
+ 'Italiano',
+ 'it|italian',
+ ),
+ 'ja' => array(
+ 'Japanese',
+ '日本語',
+ 'ja|japanese',
+ ),
+ 'ko' => array(
+ 'Korean',
+ '한국어',
+ 'ko|korean',
+ ),
+ 'ka' => array(
+ 'Georgian',
+ 'ქართული',
+ 'ka|georgian',
+ ),
+ 'kk' => array(
+ 'Kazakh',
+ 'Қазақ',
+ 'kk|kazakh',
+ ),
+ 'km' => array(
+ 'Khmer',
+ 'ខ្មែរ',
+ 'km|khmer',
+ ),
+ 'kn' => array(
+ 'Kannada',
+ 'ಕನ್ನಡ',
+ 'kn|kannada',
+ ),
+ 'ksh' => array(
+ 'Colognian',
+ 'Kölsch',
+ 'ksh|colognian',
+ ),
+ 'ky' => array(
+ 'Kyrgyz',
+ 'Кыргызча',
+ 'ky|kyrgyz',
+ ),
+ 'li' => array(
+ 'Limburgish',
+ 'Lèmbörgs',
+ 'li|limburgish',
+ ),
+ 'lt' => array(
+ 'Lithuanian',
+ 'Lietuvių',
+ 'lt|lithuanian',
+ ),
+ 'lv' => array(
+ 'Latvian',
+ 'Latviešu',
+ 'lv|latvian',
+ ),
+ 'mk' => array(
+ 'Macedonian',
+ 'Macedonian',
+ 'mk|macedonian',
+ ),
+ 'ml' => array(
+ 'Malayalam',
+ 'Malayalam',
+ 'ml|malayalam',
+ ),
+ 'mn' => array(
+ 'Mongolian',
+ 'Монгол',
+ 'mn|mongolian',
+ ),
+ 'ms' => array(
+ 'Malay',
+ 'Bahasa Melayu',
+ 'ms|malay',
+ ),
+ 'ne' => array(
+ 'Nepali',
+ 'नेपाली',
+ 'ne|nepali',
+ ),
+ 'nl' => array(
+ 'Dutch',
+ 'Nederlands',
+ 'nl|dutch',
+ ),
+ 'nb' => array(
+ 'Norwegian',
+ 'Norsk',
+ 'nb|norwegian',
+ ),
+ 'pa' => array(
+ 'Punjabi',
+ 'ਪੰਜਾਬੀ',
+ 'pa|punjabi',
+ ),
+ 'pl' => array(
+ 'Polish',
+ 'Polski',
+ 'pl|polish',
+ ),
+ 'pt_br' => array(
+ 'Brazilian Portuguese',
+ 'Português',
+ 'pt[-_]br|brazilian portuguese',
+ ),
+ 'pt' => array(
+ 'Portuguese',
+ 'Português',
+ 'pt|portuguese',
+ ),
+ 'ro' => array(
+ 'Romanian',
+ 'Română',
+ 'ro|romanian',
+ ),
+ 'ru' => array(
+ 'Russian',
+ 'Русский',
+ 'ru|russian',
+ ),
+ 'si' => array(
+ 'Sinhala',
+ 'සිංහල',
+ 'si|sinhala',
+ ),
+ 'sk' => array(
+ 'Slovak',
+ 'Slovenčina',
+ 'sk|slovak',
+ ),
+ 'sl' => array(
+ 'Slovenian',
+ 'Slovenščina',
+ 'sl|slovenian',
+ ),
+ 'sq' => array(
+ 'Slbanian',
+ 'Shqip',
+ 'sq|albanian',
+ ),
+ 'sr@latin' => array(
+ 'Serbian (latin)',
+ 'Srpski',
+ 'sr[-_]lat|sr@latin|serbian latin',
+ ),
+ 'sr' => array(
+ 'Serbian',
+ 'Српски',
+ 'sr|serbian',
+ ),
+ 'sv' => array(
+ 'Swedish',
+ 'Svenska',
+ 'sv|swedish',
+ ),
+ 'ta' => array(
+ 'Tamil',
+ 'தமிழ்',
+ 'ta|tamil',
+ ),
+ 'te' => array(
+ 'Telugu',
+ 'తెలుగు',
+ 'te|telugu',
+ ),
+ 'th' => array(
+ 'Thai',
+ 'ภาษาไทย',
+ 'th|thai',
+ ),
+ 'tk' => array(
+ 'Turkmen',
+ 'Türkmençe',
+ 'tk|turkmen',
+ ),
+ 'tr' => array(
+ 'Turkish',
+ 'Türkçe',
+ 'tr|turkish',
+ ),
+ 'tt' => array(
+ 'Tatarish',
+ 'Tatarça',
+ 'tt|tatarish',
+ ),
+ 'ug' => array(
+ 'Uyghur',
+ 'ئۇيغۇرچە',
+ 'ug|uyghur',
+ ),
+ 'uk' => array(
+ 'Ukrainian',
+ 'Українська',
+ 'uk|ukrainian',
+ ),
+ 'ur' => array(
+ 'Urdu',
+ 'اُردوُ',
+ 'ur|urdu',
+ ),
+ 'uz@latin' => array(
+ 'Uzbek (latin)',
+ 'O‘zbekcha',
+ 'uz[-_]lat|uz@latin|uzbek-latin',
+ ),
+ 'uz' => array(
+ 'Uzbek (cyrillic)',
+ 'Ўзбекча',
+ 'uz[-_]cyr|uz@cyrillic|uzbek-cyrillic',
+ ),
+ 'vi' => array(
+ 'Vietnamese',
+ 'Tiếng Việt',
+ 'vi|vietnamese',
+ ),
+ 'vls' => array(
+ 'Flemish',
+ 'West-Vlams',
+ 'vls|flemish',
+ ),
+ 'zh_tw' => array(
+ 'Chinese traditional',
+ '中文',
+ 'zh[-_](tw|hk)|chinese traditional',
+ ),
+ // only TW and HK use traditional Chinese while others (CN, SG, MY)
+ // use simplified Chinese
+ 'zh_cn' => array(
+ 'Chinese simplified',
+ '中文',
+ 'zh(?)([-_][[:alpha:]]{2,3})?|chinese simplified',
+ ),
+ );
+
+ 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;
+ }
+
+ /**
+ * 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(
+ $lang,
+ $data[0],
+ $data[1],
+ $data[2]
+ );
+ } 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)
+ {
+ $langs = $this->availableLanguages();
+ if (isset($langs[$code])) {
+ return $langs[$code];
+ }
+ return false;
+ }
+
+ /**
+ * Activates language based on configuration, user preferences or
+ * browser
+ *
+ * @return Language
+ */
+ public function selectLanguage()
+ {
+ $langs = $this->availableLanguages();
+
+ // check forced language
+ if (! empty($GLOBALS['cfg']['Lang'])) {
+ if (isset($langs[$GLOBALS['cfg']['Lang']])) {
+ return $langs[$GLOBALS['cfg']['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'])) {
+ if (isset($langs[$_POST['lang']])) {
+ return $langs[$_POST['lang']];
+ }
+ $this->_lang_failed_request = true;
+ }
+
+ // check user requested language (GET)
+ if (! empty($_GET['lang'])) {
+ if (isset($langs[$_GET['lang']])) {
+ return $langs[$_GET['lang']];
+ }
+ $this->_lang_failed_request = true;
+ }
+
+ // check previous set language
+ if (! empty($_COOKIE['pma_lang'])) {
+ if (isset($langs[$_COOKIE['pma_lang']])) {
+ return $langs[$_COOKIE['pma_lang']];
+ }
+ $this->_lang_failed_cookie = true;
+ }
+
+ // try to find out user's language by checking its HTTP_ACCEPT_LANGUAGE variable;
+ // prevent XSS
+ $accepted_languages = PMA_getenv('HTTP_ACCEPT_LANGUAGE');
+ if ($accepted_languages && false === mb_strpos($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 = PMA_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['cfg']['DefaultLang']])) {
+ return $langs[$GLOBALS['cfg']['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
+ );
+ }
+ }
+}
diff --git a/libraries/common.inc.php b/libraries/common.inc.php
index fa4785387a..0680cf472b 100644
--- a/libraries/common.inc.php
+++ b/libraries/common.inc.php
@@ -41,6 +41,7 @@ use PMA\libraries\Tracker;
use PMA\libraries\Response;
use PMA\libraries\TypesMySQL;
use PMA\libraries\Util;
+use PMA\libraries\LanguageManager;
/**
* block attempts to directly run this script
@@ -473,10 +474,16 @@ if (PMA_isValid($_REQUEST['sql_query'])) {
/******************************************************************************/
/* loading language file LABEL_loading_language_file */
+/**
+ * Load gettext functions.
+ */
+require_once GETTEXT_INC;
+
/**
* lang detection is done here
*/
-require './libraries/select_lang.inc.php';
+$language = LanguageManager::getInstance()->selectLanguage();
+$language->activate();
// Defines the cell alignment values depending on text direction
if ($GLOBALS['text_dir'] == 'ltr') {
@@ -1089,3 +1096,32 @@ if (! defined('PMA_MINIMUM_COMMON')) {
include 'libraries/config/user_preferences.forms.php';
include_once 'libraries/config/page_settings.forms.php';
}
+
+/**
+ * @global array MySQL charsets map
+ */
+$GLOBALS['mysql_charset_map'] = array(
+ 'big5' => 'big5',
+ 'cp-866' => 'cp866',
+ 'euc-jp' => 'ujis',
+ 'euc-kr' => 'euckr',
+ 'gb2312' => 'gb2312',
+ 'gbk' => 'gbk',
+ 'iso-8859-1' => 'latin1',
+ 'iso-8859-2' => 'latin2',
+ 'iso-8859-7' => 'greek',
+ 'iso-8859-8' => 'hebrew',
+ 'iso-8859-8-i' => 'hebrew',
+ 'iso-8859-9' => 'latin5',
+ 'iso-8859-13' => 'latin7',
+ 'iso-8859-15' => 'latin1',
+ 'koi8-r' => 'koi8r',
+ 'shift_jis' => 'sjis',
+ 'tis-620' => 'tis620',
+ 'utf-8' => 'utf8',
+ 'windows-1250' => 'cp1250',
+ 'windows-1251' => 'cp1251',
+ 'windows-1252' => 'latin1',
+ 'windows-1256' => 'cp1256',
+ 'windows-1257' => 'cp1257',
+);
diff --git a/libraries/core.lib.php b/libraries/core.lib.php
index 47d3262ba3..16313b931f 100644
--- a/libraries/core.lib.php
+++ b/libraries/core.lib.php
@@ -246,7 +246,7 @@ function PMA_fatalError(
} else {
$error_header = 'Error';
}
- $lang = $GLOBALS['available_languages'][$GLOBALS['lang']][1];
+ $lang = $GLOBALS['lang'];
$dir = $GLOBALS['text_dir'];
// on fatal errors it cannot hurt to always delete the current session
diff --git a/libraries/display_select_lang.lib.php b/libraries/display_select_lang.lib.php
index 1318c8b10d..295894e574 100644
--- a/libraries/display_select_lang.lib.php
+++ b/libraries/display_select_lang.lib.php
@@ -5,20 +5,7 @@
*
* @package PhpMyAdmin
*/
-
-/**
- * Compares the names of two languages.
- * Used by uasort in PMA_getLanguageSelectorHtml()
- *
- * @param array $a The first language being compared
- * @param array $b The second language being compared
- *
- * @return int the sorted array
- */
-function PMA_languageCmp($a, $b)
-{
- return strcmp($a[1], $b[1]);
-}
+use PMA\libraries\LanguageManager;
/**
* Returns HTML code for the language selector
@@ -32,13 +19,12 @@ function PMA_languageCmp($a, $b)
*/
function PMA_getLanguageSelectorHtml($use_fieldset = false, $show_doc = true)
{
- global $lang;
-
$retval = '';
+ $available_languages = LanguageManager::getInstance()->sortedLanguages();
// Display language selection only if there
// is more than one language to choose from
- if (count($GLOBALS['available_languages']) > 1) {
+ if (count($available_languages) > 1) {
$retval .= '