mirror of
https://gitlab.com/mojo42/Jirafeau.git
synced 2025-04-24 13:33:34 +02:00
[BUGFIX] Fix Accept-Language support
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>
This commit is contained in:
parent
0c8f8d01c6
commit
f950bd1463
@ -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';
|
||||
|
||||
|
70
lib/lang.php
70
lib/lang.php
@ -19,26 +19,48 @@
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
$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 $r;
|
||||
return "FIX ME";
|
||||
}
|
||||
|
||||
function t_select_lang() {
|
||||
$cfg = $GLOBALS['cfg'];
|
||||
if (strcmp($cfg['lang'], 'auto') != 0) {
|
||||
return $cfg['lang'];
|
||||
function t_visitor_langs() {
|
||||
$visitor_langs = t_parse_accept_language();
|
||||
array_push($visitor_langs, "en");
|
||||
return $visitor_langs;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user