From 905993d66e86516df3b331f084ffea8ea890d275 Mon Sep 17 00:00:00 2001 From: Tomy Hsieh Date: Thu, 6 Oct 2022 22:21:12 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=20fix:=20Language=20detection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/web/inc/prerequisites.inc.php | 48 +++++++++++++++++++++++++--- data/web/inc/vars.inc.php | 2 +- data/web/templates/base.twig | 2 +- data/web/templates/index.twig | 2 +- helper-scripts/add-new-lang-keys.php | 2 +- helper-scripts/check_translations.rb | 2 +- 6 files changed, 49 insertions(+), 9 deletions(-) diff --git a/data/web/inc/prerequisites.inc.php b/data/web/inc/prerequisites.inc.php index 5800e570..0e294bd0 100644 --- a/data/web/inc/prerequisites.inc.php +++ b/data/web/inc/prerequisites.inc.php @@ -195,10 +195,50 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/sessions.inc.php'; // Set language if (!isset($_SESSION['mailcow_locale']) && !isset($_COOKIE['mailcow_locale'])) { if ($DETECT_LANGUAGE && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - $header_lang = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']); - if (array_key_exists($header_lang, $AVAILABLE_LANGUAGES)) { - $_SESSION['mailcow_locale'] = $header_lang; + preg_match_all('/([a-z]{1,8}-[a-z]{1,8})\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse); + // preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})*)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse); + + error_log(print_r($lang_parse, TRUE)); + error_log(print_r(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2), TRUE)); + error_log(print_r('asdasdasdasdasdasd', TRUE)); + + + $langs = $lang_parse[1]; + $ranks = $lang_parse[3]; + + // (create an associative array 'language' => 'preference') + $lang2pref = array(); + for ($i=0; $i $lang2pref[$b]) + return -1; + elseif ($lang2pref[$a] < $lang2pref[$b]) + return 1; + elseif (strlen($a) > strlen($b)) + return -1; + elseif (strlen($a) < strlen($b)) + return 1; + else + return 0; + }; + + // sort the languages by prefered language and by the most specific region + uksort($lang2pref, $cmpLangs); + + foreach ($lang2pref as $lang => $q) { + error_log(print_r($lang, TRUE)); + if (array_key_exists($lang, $AVAILABLE_LANGUAGES)) { + $_SESSION['mailcow_locale'] = $lang; + break; + } + } + + error_log(print_r($lang2pref, TRUE)); + error_log(print_r($_SESSION['mailcow_locale'], TRUE)); } else { $_SESSION['mailcow_locale'] = strtolower(trim($DEFAULT_LANG)); @@ -215,7 +255,7 @@ if (isset($_GET['lang']) && array_key_exists($_GET['lang'], $AVAILABLE_LANGUAGES /* * load language */ -$lang = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/lang/lang.en.json'), true); +$lang = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/lang/lang.en-gb.json'), true); $langFile = $_SERVER['DOCUMENT_ROOT'] . '/lang/lang.'.$_SESSION['mailcow_locale'].'.json'; if(file_exists($langFile)) { diff --git a/data/web/inc/vars.inc.php b/data/web/inc/vars.inc.php index d3419457..7d319488 100644 --- a/data/web/inc/vars.inc.php +++ b/data/web/inc/vars.inc.php @@ -76,7 +76,7 @@ $autodiscover_config = array( $DETECT_LANGUAGE = true; // Change default language -$DEFAULT_LANG = 'en'; +$DEFAULT_LANG = 'en-gb'; // Available languages // https://www.iso.org/obp/ui/#search diff --git a/data/web/templates/base.twig b/data/web/templates/base.twig index bd1e16d2..ed0d7b05 100644 --- a/data/web/templates/base.twig +++ b/data/web/templates/base.twig @@ -32,7 +32,7 @@