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 * Checks whether there are some languages available
722 public function hasChoice()
724 return count($this->availableLanguages()) > 1;
728 * Returns (cached) list of all available languages
730 * @return array of Language objects
732 public function availableLanguages()
734 if (! $this->_available_languages
) {
735 $this->_available_languages
= array();
737 foreach($this->availableLocales() as $lang) {
738 $lang = strtolower($lang);
739 if (isset($this::$_language_data[$lang])) {
740 $data = $this::$_language_data[$lang];
741 $this->_available_languages
[$lang] = new Language(
749 $this->_available_languages
[$lang] = new Language(
759 return $this->_available_languages
;
763 * Returns (cached) list of all available languages sorted
766 * @return array of Language objects
768 public function sortedLanguages()
770 $this->availableLanguages();
771 uasort($this->_available_languages
, function($a, $b)
776 return $this->_available_languages
;
780 * Return Language object for given code
782 * @param string $code Language code
784 * @return object|false Language object or false on failure
786 public function getLanguage($code)
788 $code = strtolower($code);
789 $langs = $this->availableLanguages();
790 if (isset($langs[$code])) {
791 return $langs[$code];
797 * Return currently active Language object
799 * @return object Language object
801 public function getCurrentLanguage()
803 return $this->_available_languages
[strtolower($GLOBALS['lang'])];
807 * Activates language based on configuration, user preferences or
812 public function selectLanguage()
814 // check forced language
815 if (! empty($GLOBALS['cfg']['Lang'])) {
816 $lang = $this->getLanguage($GLOBALS['cfg']['Lang']);
817 if ($lang !== false) {
820 $this->_lang_failed_cfg
= true;
823 // Don't use REQUEST in following code as it might be confused by cookies
824 // with same name. Check user requested language (POST)
825 if (! empty($_POST['lang'])) {
826 $lang = $this->getLanguage($_POST['lang']);
827 if ($lang !== false) {
830 $this->_lang_failed_request
= true;
833 // check user requested language (GET)
834 if (! empty($_GET['lang'])) {
835 $lang = $this->getLanguage($_GET['lang']);
836 if ($lang !== false) {
839 $this->_lang_failed_request
= true;
842 // check previous set language
843 if (! empty($_COOKIE['pma_lang'])) {
844 $lang = $this->getLanguage($_COOKIE['pma_lang']);
845 if ($lang !== false) {
848 $this->_lang_failed_cookie
= true;
851 $langs = $this->availableLanguages();
853 // try to find out user's language by checking its HTTP_ACCEPT_LANGUAGE variable;
854 $accepted_languages = PMA_getenv('HTTP_ACCEPT_LANGUAGE');
855 if ($accepted_languages) {
856 foreach (explode(',', $accepted_languages) as $header) {
857 foreach ($langs as $language) {
858 if ($language->matchesAcceptLanguage($header)) {
865 // try to find out user's language by checking its HTTP_USER_AGENT variable
866 $user_agent = PMA_getenv('HTTP_USER_AGENT');
867 if (! empty($user_agent)) {
868 foreach ($langs as $language) {
869 if ($language->matchesUserAgent($user_agent)) {
875 // Didn't catch any valid lang : we use the default settings
876 if (isset($langs[$GLOBALS['cfg']['DefaultLang']])) {
877 return $langs[$GLOBALS['cfg']['DefaultLang']];
880 // Fallback to English
885 * Displays warnings about invalid languages. This needs to be postponed
886 * to show messages at time when language is initialized.
890 public function showWarnings()
892 // now, that we have loaded the language strings we can send the errors
893 if ($this->_lang_failed_cfg
894 ||
$this->_lang_failed_cookie
895 ||
$this->_lang_failed_request
898 __('Ignoring unsupported language code.'),
906 * Returns HTML code for the language selector
908 * @param boolean $use_fieldset whether to use fieldset for selection
909 * @param boolean $show_doc whether to show documentation links
915 public function getSelectorDisplay($use_fieldset = false, $show_doc = true)
917 $_form_params = array(
918 'db' => $GLOBALS['db'],
919 'table' => $GLOBALS['table'],
922 // For non-English, display "Language" with emphasis because it's
923 // not a proper word in the current language; we show it to help
924 // people recognize the dialog
925 $language_title = __('Language')
926 . (__('Language') != 'Language' ?
' - <em>Language</em>' : '');
928 $language_title .= Util
::showDocu('faq', 'faq7-2');
931 $available_languages = $this->sortedLanguages();
933 return Template
::get('select_lang')->render(
935 'language_title' => $language_title,
936 'use_fieldset' => $use_fieldset,
937 'available_languages' => $available_languages,
938 '_form_params' => $_form_params,