]> git.p6c8.net - jirafeau_project.git/commitdiff
[BUGFIX] Fix Accept-Language support
authorJerome Jutteau <jerome@jutteau.fr>
Fri, 22 Nov 2019 21:43:34 +0000 (22:43 +0100)
committerJerome Jutteau <jerome@jutteau.fr>
Fri, 22 Nov 2019 21:47:18 +0000 (22:47 +0100)
Accept-Language was partially supported.
It now make the difference between zh and zh_TW for instance.
It is also able to fallback to next user supported language.

Fix #204

Signed-off-by: Jerome Jutteau <jerome@jutteau.fr>
lib/config.original.php
lib/lang.php

index 913f3acb0eb385ca753074184abd465840007897..7b1d4ec8e4135003ec149bff8884cb17a4aaad77 100644 (file)
@@ -36,6 +36,7 @@ $cfg['var_root'] = '';
 /* Language - choice between 'auto' or any language located in the /lib/locales/ folder.
  * The mode »auto« will cause the script to detect the user's browser information
  * and offer a matching language, and use »en« if it is not available.
+ * Forcing to a specific lang lightly reduce lang computation.
  */
 $cfg['lang'] = 'auto';
 
index 45b1a2e481e1095743fdd471531495c4363a30a7..48e247c0ab492f06b6a663ae6cda01b065cdf86a 100644 (file)
 
 function t($string_id)
 {
-    $r = t_in($string_id, t_select_lang());
-    if ($r === false || $r === "") {
-        $r = t_in($string_id, "en");
-        if ($r === false) {
-            return "FIX ME: " . $string_id;
+    $lang_config = $GLOBALS['cfg']['lang'];
+    if ($lang_config != "auto") {
+        $r = t_in($string_id, $lang_config);
+        if ($r === false || $r === "") {
+            return "FIX ME";
         }
+        return $r;
     }
-    return $r;
+
+    $visitor_langs = t_visitor_langs();
+    foreach ($visitor_langs as $lang) {
+        $r = t_in($string_id, $lang);
+        if ($r === false || $r === "") {
+            continue;
+        } else {
+            return $r;
+        }
+    }
+    return "FIX ME";
+}
+
+function t_visitor_langs() {
+    $visitor_langs = t_parse_accept_language();
+    array_push($visitor_langs, "en");
+    return $visitor_langs;
 }
 
-function t_select_lang() {
-    $cfg = $GLOBALS['cfg'];
-    if (strcmp($cfg['lang'], 'auto') != 0) {
-        return $cfg['lang'];
+function t_parse_accept_language() {
+    if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+        return [];
     }
-    else if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
-        return substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
-    } else {
-        return "en";
+    // Example: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
+    $langs = [];
+    $cols = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+    foreach ($cols as $i => $semicols) {
+        $lang = explode(';', $semicols);
+        if (count($lang) === 0) {
+            continue;
+        }
+        array_push($langs, $lang[0]);
     }
+    return $langs;
 }
 
 function t_in($string_id, $lang) {
@@ -53,7 +75,11 @@ function t_in($string_id, $lang) {
 }
 
 function t_get_raw_json($lang) {
-    $p = JIRAFEAU_ROOT . "lib/locales/$lang.json";
+    $filename = str_replace("-", "_", $lang);
+    if (preg_match('/[^A-Za-z_\w]/', $input)) {
+        return false;
+    }
+    $p = JIRAFEAU_ROOT . "lib/locales/$filename.json";
     if (!file_exists($p)) {
         return false;
     }
@@ -74,9 +100,19 @@ function t_get_json($lang) {
 }
 
 function json_lang_generator($lang) {
-    $r = "";
+    $r = false;
     if ($lang === null) {
-        $r = t_get_raw_json(t_select_lang());
+        $lang_config = $GLOBALS['cfg']['lang'];
+        if ($lang_config != "auto") {
+            $r = t_get_raw_json($lang_config);
+        } else {
+            foreach(t_visitor_langs() as $lang) {
+                $r = t_get_raw_json($lang);
+                if (!($r === false)) {
+                    break;
+                }
+            }
+        }
     } else {
         $r = t_get_raw_json($lang);
     }

patrick-canterino.de