2 /* vim: set expandtab sw=4 ts=4 sts=4: */
4 * Hold the PMA\libraries\LanguageManager class
8 namespace PMA\libraries
;
10 use PMA\libraries\Language
;
11 use PMA\libraries\URL
;
14 * Language selection manager
21 * @var array Definition data for languages
23 * Each member contains:
25 * - English language name
26 * - Native language name
27 * - Match regullar expression
30 private static $_language_data = array(
41 'العربية',
62 'Беларуская',
70 'be[-_]lat|be@latin|belarusian latin',
76 'Български',
146 'Ελληνικά',
159 'English (United Kingdom)',
161 'en[_-]gb|english (United Kingdom)',
195 'فارسی',
244 'עברית',
251 'हिन्दी',
307 '日本語',
314 '한국어',
321 'ქართული',
405 'Монгол',
453 'Brazilian Portuguese',
455 'pt[-_]br|brazilian portuguese',
475 'Русский',
482 'සිංහල',
496 'Slovenščina',
511 'sr[-_]lat|sr@latin|serbian latin',
517 'Српски',
545 'ภาษาไทย',
559 'Türkçe',
580 'Українська',
595 'uz[-_]lat|uz@latin|uzbek-latin',
601 'Ўзбекча',
602 'uz[-_]cyr|uz@cyrillic|uzbek-cyrillic',
621 'Chinese traditional',
623 'zh[-_](tw|hk)|chinese traditional',
626 // only TW and HK use traditional Chinese while others (CN, SG, MY)
627 // use simplified Chinese
630 'Chinese simplified',
632 'zh(?![-_](tw|hk))([-_][[:alpha:]]{2,3})?|chinese simplified',
637 private $_available_locales;
638 private $_available_languages;
639 private $_lang_failed_cfg;
640 private $_lang_failed_cookie;
641 private $_lang_failed_request;
642 private static $instance;
645 * Returns LanguageManager singleton
647 * @return LanguageManager
649 public static function getInstance()
651 if (self
::$instance === NULL) {
652 self
::$instance = new LanguageManager
;
654 return self
::$instance;
658 * Returns list of available locales
662 public function listLocaleDir()
664 $result = array('en');
666 /* Check for existing directory */
667 if (!is_dir(LOCALE_PATH
)) {
671 /* Open the directory */
672 $handle = @opendir
(LOCALE_PATH
);
673 /* This can happen if the kit is English-only */
674 if ($handle === false) {
678 /* Process all files */
679 while (false !== ($file = readdir($handle))) {
682 . '/LC_MESSAGES/phpmyadmin.mo';
685 && @file_exists
($path)
690 /* Close the handle */
697 * Returns (cached) list of all available locales
699 * @return array of strings
701 public function availableLocales()
703 if (! $this->_available_locales
) {
705 if (empty($GLOBALS['cfg']['FilterLanguages'])) {
706 $this->_available_locales
= $this->listLocaleDir();
708 $this->_available_locales
= preg_grep(
709 '@' . $GLOBALS['cfg']['FilterLanguages'] . '@',
710 $this->listLocaleDir()
714 return $this->_available_locales
;
718 * Returns (cached) list of all available languages
720 * @return array of Language objects
722 public function availableLanguages()
724 if (! $this->_available_languages
) {
725 $this->_available_languages
= array();
727 foreach($this->availableLocales() as $lang) {
728 $lang = strtolower($lang);
729 if (isset($this::$_language_data[$lang])) {
730 $data = $this::$_language_data[$lang];
731 $this->_available_languages
[$lang] = new Language(
739 $this->_available_languages
[$lang] = new Language(
749 return $this->_available_languages
;
753 * Returns (cached) list of all available languages sorted
756 * @return array of Language objects
758 public function sortedLanguages()
760 $this->availableLanguages();
761 uasort($this->_available_languages
, function($a, $b)
766 return $this->_available_languages
;
770 * Return Language object for given code
772 * @param string $code Language code
774 * @return object|false Language object or false on failure
776 public function getLanguage($code)
778 $code = strtolower($code);
779 $langs = $this->availableLanguages();
780 if (isset($langs[$code])) {
781 return $langs[$code];
787 * Return currently active Language object
789 * @return object Language object
791 public function getCurrentLanguage()
793 return $this->_available_languages
[strtolower($GLOBALS['lang'])];
797 * Activates language based on configuration, user preferences or
802 public function selectLanguage()
804 // check forced language
805 if (! empty($GLOBALS['cfg']['Lang'])) {
806 $lang = $this->getLanguage($GLOBALS['cfg']['Lang']);
807 if ($lang !== false) {
810 $this->_lang_failed_cfg
= true;
813 // Don't use REQUEST in following code as it might be confused by cookies
814 // with same name. Check user requested language (POST)
815 if (! empty($_POST['lang'])) {
816 $lang = $this->getLanguage($_POST['lang']);
817 if ($lang !== false) {
820 $this->_lang_failed_request
= true;
823 // check user requested language (GET)
824 if (! empty($_GET['lang'])) {
825 $lang = $this->getLanguage($_GET['lang']);
826 if ($lang !== false) {
829 $this->_lang_failed_request
= true;
832 // check previous set language
833 if (! empty($_COOKIE['pma_lang'])) {
834 $lang = $this->getLanguage($_COOKIE['pma_lang']);
835 if ($lang !== false) {
838 $this->_lang_failed_cookie
= true;
841 $langs = $this->availableLanguages();
843 // try to find out user's language by checking its HTTP_ACCEPT_LANGUAGE variable;
844 $accepted_languages = PMA_getenv('HTTP_ACCEPT_LANGUAGE');
845 if ($accepted_languages) {
846 foreach (explode(',', $accepted_languages) as $header) {
847 foreach ($langs as $language) {
848 if ($language->matchesAcceptLanguage($header)) {
855 // try to find out user's language by checking its HTTP_USER_AGENT variable
856 $user_agent = PMA_getenv('HTTP_USER_AGENT');
857 if (! empty($user_agent)) {
858 foreach ($langs as $language) {
859 if ($language->matchesUserAgent($user_agent)) {
865 // Didn't catch any valid lang : we use the default settings
866 if (isset($langs[$GLOBALS['cfg']['DefaultLang']])) {
867 return $langs[$GLOBALS['cfg']['DefaultLang']];
870 // Fallback to English
875 * Displays warnings about invalid languages. This needs to be postponed
876 * to show messages at time when language is initialized.
880 public function showWarnings()
882 // now, that we have loaded the language strings we can send the errors
883 if ($this->_lang_failed_cfg
884 ||
$this->_lang_failed_cookie
885 ||
$this->_lang_failed_request
888 __('Ignoring unsupported language code.'),
896 * Returns HTML code for the language selector
898 * @param boolean $use_fieldset whether to use fieldset for selection
899 * @param boolean $show_doc whether to show documentation links
905 public function getSelectorDisplay($use_fieldset = false, $show_doc = true)
907 $_form_params = array(
908 'db' => $GLOBALS['db'],
909 'table' => $GLOBALS['table'],
912 // For non-English, display "Language" with emphasis because it's
913 // not a proper word in the current language; we show it to help
914 // people recognize the dialog
915 $language_title = __('Language')
916 . (__('Language') != 'Language' ?
' - <em>Language</em>' : '');
918 $language_title .= Util
::showDocu('faq', 'faq7-2');
921 $available_languages = $this->sortedLanguages();
923 return Template
::get('select_lang')->render(
925 'language_title' => $language_title,
926 'use_fieldset' => $use_fieldset,
927 'available_languages' => $available_languages,
928 '_form_params' => $_form_params,