<?php
/*
* Jirafeau, your web file repository
- * Copyright (C) 2015 Jerome Jutteau <j.jutteau@gmail.com>
+ * Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
+ * Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
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) {
+function t_in($string_id, $lang)
+{
$trans = t_get_json($lang);
if ($trans === false) {
return false;
return $trans[$string_id];
}
-function t_get_raw_json($lang) {
- $p = JIRAFEAU_ROOT . "lib/locales/$lang.json";
+function t_get_raw_json($lang)
+{
+ $filename = str_replace("-", "_", $lang);
+ if (preg_match('/[^A-Za-z_\w]/', $filename)) {
+ return false;
+ }
+ $p = JIRAFEAU_ROOT . "lib/locales/$filename.json";
if (!file_exists($p)) {
return false;
}
return $json;
}
-function t_get_json($lang) {
+function t_get_json($lang)
+{
$raw_j = t_get_raw_json($lang);
$array = json_decode($raw_j, true);
if ($array === null) {
return $array;
}
-function json_lang_generator($lang) {
- $r = "";
+function json_lang_generator($lang)
+{
+ $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);
}