<?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
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-global $languages_list;
-$languages_list = array('auto' => 'Automatic',
- 'de' => 'Deutsch',
- 'en' => 'English',
- 'el' => 'Ελληνικά',
- 'es' => 'Español',
- 'hu' => 'Magyar',
- 'fi' => 'Suomi',
- 'fr' => 'Français',
- 'it' => 'Italiano',
- 'nl' => 'Nederlands',
- 'pl' => 'Polszczyzna',
- 'pt' => 'português',
- 'pt_BR' => 'português (Brasil)',
- 'ro' => 'Limba română',
- 'ru' => 'ру́сский',
- 'sk' => 'Slovenčina',
- 'tr' => 'Türkçe',
- 'zh' => '汉语');
-
function t($string_id)
{
- $r = t_in($string_id, t_select_lang());
- if ($r === false) {
- $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_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) {
+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);
}