diff --git a/adminer/include/bootstrap.inc.php b/adminer/include/bootstrap.inc.php index cf1ae9f4..050e6a45 100644 --- a/adminer/include/bootstrap.inc.php +++ b/adminer/include/bootstrap.inc.php @@ -39,7 +39,7 @@ if ($_GET["script"] == "version") { exit; } -global $adminer, $connection, $driver, $drivers, $error, $HTTPS, $langs, $permanent, $has_token, $token, $translations; // allows including Adminer inside a function +global $adminer, $connection, $driver, $drivers, $error, $HTTPS, $permanent, $has_token, $token, $translations; // allows including Adminer inside a function if (!$_SERVER["REQUEST_URI"]) { // IIS 5 compatibility $_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"]; diff --git a/adminer/include/lang.inc.php b/adminer/include/lang.inc.php index 40a3da5c..e4f2a920 100644 --- a/adminer/include/lang.inc.php +++ b/adminer/include/lang.inc.php @@ -3,53 +3,58 @@ namespace Adminer; // not used in a single language version -$langs = array( - 'en' => 'English', // Jakub Vrána - https://www.vrana.cz - 'ar' => 'العربية', // Y.M Amine - Algeria - nbr7@live.fr - 'bg' => 'Български', // Deyan Delchev - 'bn' => 'বাংলা', // Dipak Kumar - dipak.ndc@gmail.com, Hossain Ahmed Saiman - hossain.ahmed@altscope.com - 'bs' => 'Bosanski', // Emir Kurtovic - 'ca' => 'Català', // Joan Llosas - 'cs' => 'Čeština', // Jakub Vrána - https://www.vrana.cz - 'da' => 'Dansk', // Jarne W. Beutnagel - jarne@beutnagel.dk - 'de' => 'Deutsch', // Klemens Häckel - http://clickdimension.wordpress.com - 'el' => 'Ελληνικά', // Dimitrios T. Tanis - jtanis@tanisfood.gr - 'es' => 'Español', // Klemens Häckel - http://clickdimension.wordpress.com - 'et' => 'Eesti', // Priit Kallas - 'fa' => 'فارسی', // mojtaba barghbani - Iran - mbarghbani@gmail.com, Nima Amini - http://nimlog.com - 'fi' => 'Suomi', // Finnish - Kari Eveli - http://www.lexitec.fi/ - 'fr' => 'Français', // Francis Gagné, Aurélien Royer - 'gl' => 'Galego', // Eduardo Penabad Ramos - 'he' => 'עברית', // Binyamin Yawitz - https://stuff-group.com/ - 'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu - 'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org - 'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti - 'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/ - 'ka' => 'ქართული', // Saba Khmaladze skhmaladze@uglt.org - 'ko' => '한국어', // dalli - skcha67@gmail.com - 'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt - 'lv' => 'Latviešu', // Kristaps Lediņš - https://krysits.com - 'ms' => 'Bahasa Melayu', // Pisyek - 'nl' => 'Nederlands', // Maarten Balliauw - http://blog.maartenballiauw.be - 'no' => 'Norsk', // Iver Odin Kvello, mupublishing.com - 'pl' => 'Polski', // Radosław Kowalewski - http://srsbiz.pl/ - 'pt' => 'Português', // André Dias - 'pt-br' => 'Português (Brazil)', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br, RobertoPC - http://www.robertopc.com.br - 'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com - 'ru' => 'Русский', // Maksim Izmaylov; Andre Polykanine - https://github.com/Oire/ - 'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz - 'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com - 'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com - 'sv' => 'Svenska', // rasmusolle - https://github.com/rasmusolle - 'ta' => 'தமிழ்', // G. Sampath Kumar, Chennai, India, sampathkumar11@gmail.com - 'th' => 'ภาษาไทย', // Panya Saraphi, elect.tu@gmail.com - http://www.opencart2u.com/ - 'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com - 'uk' => 'Українська', // Valerii Kryzhov - 'uz' => 'Oʻzbekcha', // Junaydullaev Inoyatullokhon - https://av.uz/ - 'vi' => 'Tiếng Việt', // Giang Manh @ manhgd google mail - 'zh' => '简体中文', // Mr. Lodar, vea - urn2.net - vea.urn2@gmail.com - 'zh-tw' => '繁體中文', // http://tzangms.com -); +/** Get available languages +* @return string[] +*/ +function langs(): array { + return array( + 'en' => 'English', // Jakub Vrána - https://www.vrana.cz + 'ar' => 'العربية', // Y.M Amine - Algeria - nbr7@live.fr + 'bg' => 'Български', // Deyan Delchev + 'bn' => 'বাংলা', // Dipak Kumar - dipak.ndc@gmail.com, Hossain Ahmed Saiman - hossain.ahmed@altscope.com + 'bs' => 'Bosanski', // Emir Kurtovic + 'ca' => 'Català', // Joan Llosas + 'cs' => 'Čeština', // Jakub Vrána - https://www.vrana.cz + 'da' => 'Dansk', // Jarne W. Beutnagel - jarne@beutnagel.dk + 'de' => 'Deutsch', // Klemens Häckel - http://clickdimension.wordpress.com + 'el' => 'Ελληνικά', // Dimitrios T. Tanis - jtanis@tanisfood.gr + 'es' => 'Español', // Klemens Häckel - http://clickdimension.wordpress.com + 'et' => 'Eesti', // Priit Kallas + 'fa' => 'فارسی', // mojtaba barghbani - Iran - mbarghbani@gmail.com, Nima Amini - http://nimlog.com + 'fi' => 'Suomi', // Finnish - Kari Eveli - http://www.lexitec.fi/ + 'fr' => 'Français', // Francis Gagné, Aurélien Royer + 'gl' => 'Galego', // Eduardo Penabad Ramos + 'he' => 'עברית', // Binyamin Yawitz - https://stuff-group.com/ + 'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu + 'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org + 'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti + 'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/ + 'ka' => 'ქართული', // Saba Khmaladze skhmaladze@uglt.org + 'ko' => '한국어', // dalli - skcha67@gmail.com + 'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt + 'lv' => 'Latviešu', // Kristaps Lediņš - https://krysits.com + 'ms' => 'Bahasa Melayu', // Pisyek + 'nl' => 'Nederlands', // Maarten Balliauw - http://blog.maartenballiauw.be + 'no' => 'Norsk', // Iver Odin Kvello, mupublishing.com + 'pl' => 'Polski', // Radosław Kowalewski - http://srsbiz.pl/ + 'pt' => 'Português', // André Dias + 'pt-br' => 'Português (Brazil)', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br, RobertoPC - http://www.robertopc.com.br + 'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com + 'ru' => 'Русский', // Maksim Izmaylov; Andre Polykanine - https://github.com/Oire/ + 'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz + 'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com + 'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com + 'sv' => 'Svenska', // rasmusolle - https://github.com/rasmusolle + 'ta' => 'தமிழ்', // G. Sampath Kumar, Chennai, India, sampathkumar11@gmail.com + 'th' => 'ภาษาไทย', // Panya Saraphi, elect.tu@gmail.com - http://www.opencart2u.com/ + 'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com + 'uk' => 'Українська', // Valerii Kryzhov + 'uz' => 'Oʻzbekcha', // Junaydullaev Inoyatullokhon - https://av.uz/ + 'vi' => 'Tiếng Việt', // Giang Manh @ manhgd google mail + 'zh' => '简体中文', // Mr. Lodar, vea - urn2.net - vea.urn2@gmail.com + 'zh-tw' => '繁體中文', // http://tzangms.com + ); +} /** Translate string * @param literal-string $idf @@ -84,9 +89,8 @@ function lang(string $idf, $number = null): string { } function switch_lang(): void { - global $langs; echo "
\n"; @@ -100,10 +104,10 @@ if (isset($_POST["lang"]) && verify_token()) { // $error not yet available } $LANG = "en"; -if (isset($langs[$_COOKIE["adminer_lang"]])) { +if (idx(langs(), $_COOKIE["adminer_lang"])) { cookie("adminer_lang", $_COOKIE["adminer_lang"]); $LANG = $_COOKIE["adminer_lang"]; -} elseif (isset($langs[$_SESSION["lang"]])) { +} elseif (idx(langs(), $_SESSION["lang"])) { $LANG = $_SESSION["lang"]; } else { $accept_language = array(); @@ -113,12 +117,12 @@ if (isset($langs[$_COOKIE["adminer_lang"]])) { } arsort($accept_language); foreach ($accept_language as $key => $q) { - if (isset($langs[$key])) { + if (idx(langs(), $key)) { $LANG = $key; break; } $key = preg_replace('~-.*~', '', $key); - if (!isset($accept_language[$key]) && isset($langs[$key])) { + if (!isset($accept_language[$key]) && idx(langs(), $key)) { $LANG = $key; break; } diff --git a/compile.php b/compile.php index c9e8274a..c8d27602 100755 --- a/compile.php +++ b/compile.php @@ -161,12 +161,12 @@ function lzw_compress($string) { } function put_file_lang($match) { - global $lang_ids, $project, $langs; + global $lang_ids, $project; if ($_SESSION["lang"]) { return ""; } $return = ""; - foreach ($langs as $lang => $val) { + foreach (Adminer\langs() as $lang => $val) { include __DIR__ . "/adminer/lang/$lang.inc.php"; // assign $translations $translation_ids = array_flip($lang_ids); // default translation foreach ($translations as $key => $val) { @@ -269,8 +269,9 @@ if (file_exists(__DIR__ . $driver_path)) { unset($_COOKIE["adminer_lang"]); $_SESSION["lang"] = $_SERVER["argv"][1]; // Adminer functions read language from session +include __DIR__ . "/adminer/include/functions.inc.php"; include __DIR__ . "/adminer/include/lang.inc.php"; -if (isset($langs[$_SESSION["lang"]])) { +if (Adminer\idx(Adminer\langs(), $_SESSION["lang"])) { include __DIR__ . "/adminer/lang/$_SESSION[lang].inc.php"; array_shift($_SERVER["argv"]); } diff --git a/lang.php b/lang.php index 972d96c3..72b35802 100755 --- a/lang.php +++ b/lang.php @@ -6,7 +6,7 @@ unset($_COOKIE["adminer_lang"]); $_SESSION["lang"] = $_SERVER["argv"][1]; // Adminer functions read language from session if (isset($_SESSION["lang"])) { include __DIR__ . "/adminer/include/lang.inc.php"; - if (isset($_SERVER["argv"][2]) || (!isset($langs[$_SESSION["lang"]]) && $_SESSION["lang"] != "xx")) { + if (isset($_SERVER["argv"][2]) || (!idx(Adminer\langs(), $_SESSION["lang"]) && $_SESSION["lang"] != "xx")) { echo "Usage: php lang.php [lang]\nPurpose: Update adminer/lang/*.inc.php from source code messages.\n"; exit(1); } diff --git a/phpstan.neon b/phpstan.neon index 0e1c05a2..5b519550 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -12,7 +12,7 @@ parameters: - identifier: includeOnce.fileNotFound # ./adminer-plugins.php - "~^Function (set_magic_quotes_runtime|mysql_)~" # PHP < 7 functions - "~an unknown class OCI-?Lob~" # this looks like PHPStan bug - - "~^Variable \\$(adminer|connection|driver|drivers|error|HTTPS|langs|permanent|has_token|token|translations) might not be defined~" # declared in bootstrap.inc.php + - "~^Variable \\$(adminer|connection|driver|drivers|error|HTTPS|permanent|has_token|token|translations) might not be defined~" # declared in bootstrap.inc.php - "~expects int, float given~" # this will work - "~expects bool~" # truthy values - "~fread expects int<1, max>, 100000~" # 1e6