<?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',
- 'pt' => 'português',
- 'pt_BR' => 'português (Brasil)',
- 'ro' => 'Limba română',
- 'ru' => 'ру́сский',
- 'sk' => 'Slovenčina',
- 'tr' => 'Türkçe',
- 'zh' => '汉语');
-
-/* Translation */
-function t($text)
+function t($string_id)
{
- $cfg = $GLOBALS['cfg'];
- $languages_list = $GLOBALS['languages_list'];
+ $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;
+ }
- /* Detect user's langage if we are in automatic mode. */
- if (strcmp($cfg['lang'], 'auto') == 0) {
- if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
- $l = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
+ $visitor_langs = t_visitor_langs();
+ foreach ($visitor_langs as $lang) {
+ $r = t_in($string_id, $lang);
+ if ($r === false || $r === "") {
+ continue;
} else {
- $l = "en";
+ return $r;
}
- } else {
- $l = $cfg['lang'];
}
+ return "FIX ME";
+}
+
+function t_visitor_langs()
+{
+ $visitor_langs = t_parse_accept_language();
+ array_push($visitor_langs, "en");
+ return $visitor_langs;
+}
- /* Is the langage in the list ? */
- $found = false;
- foreach ($languages_list as $key => $v) {
- if (strcmp($l, $key) == 0) {
- $found = true;
+function t_parse_accept_language()
+{
+ if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+ return [];
+ }
+ // 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;
+}
- /* Don't translate english. */
- if (!($found && strcmp($l, "en"))) {
- return $text;
+function t_in($string_id, $lang)
+{
+ $trans = t_get_json($lang);
+ if ($trans === false) {
+ return false;
}
-
- /* Open translation file. */
- $trans_j = file_get_contents(JIRAFEAU_ROOT . "lib/locales/$l.json");
- if ($trans_j === false) {
- return $text;
+ if (!array_key_exists($string_id, $trans)) {
+ return false;
}
+ return $trans[$string_id];
+}
- /* Decode JSON. */
- $trans = json_decode($trans_j, true);
- if ($trans === null) {
- return $text;
+function t_get_raw_json($lang)
+{
+ $filename = str_replace("-", "_", $lang);
+ if (preg_match('/[^A-Za-z_\w]/', $filename)) {
+ return false;
}
-
- /* Try to find translation. */
- if (!array_key_exists($text, $trans)) {
- return $text;
+ $p = JIRAFEAU_ROOT . "lib/locales/$filename.json";
+ if (!file_exists($p)) {
+ return false;
}
-
- return $trans[$text];
+ $json = file_get_contents($p);
+ if ($json === false) {
+ return false;
+ }
+ return $json;
}
-function json_lang_generator()
+function t_get_json($lang)
{
- $cfg = $GLOBALS['cfg'];
- $languages_list = $GLOBALS['languages_list'];
+ $raw_j = t_get_raw_json($lang);
+ $array = json_decode($raw_j, true);
+ if ($array === null) {
+ return false;
+ }
+ return $array;
+}
- /* Detect user's langage if we are in automatic mode. */
- if (strcmp($cfg['lang'], 'auto') == 0) {
- if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
- $l = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
+function json_lang_generator($lang)
+{
+ $r = false;
+ if ($lang === null) {
+ $lang_config = $GLOBALS['cfg']['lang'];
+ if ($lang_config != "auto") {
+ $r = t_get_raw_json($lang_config);
} else {
- $l = "en";
+ foreach (t_visitor_langs() as $lang) {
+ $r = t_get_raw_json($lang);
+ if (!($r === false)) {
+ break;
+ }
+ }
}
} else {
- $l = $cfg['lang'];
+ $r = t_get_raw_json($lang);
}
-
- /* Is the langage in the list ? */
- $found = false;
- foreach ($languages_list as $key => $v) {
- if (strcmp($l, $key) == 0) {
- $found = true;
- }
- }
-
- /* Don't translate english. */
- if (!($found && strcmp($l, "en"))) {
- return "{}";
- }
-
- /* Open translation file. */
- $trans_j = file_get_contents(JIRAFEAU_ROOT . "lib/locales/$l.json");
- return $trans_j;
+ return $r === false ? "{}" : $r;
}