Benjamin Renard
6fdc5447f1
* Code cleaning and fix some small errors using Phpstan * Configure pre-commit to run Phpstan before each commit * Some little improvments and logging, mail, smarty & URL libs * Add Sentry integration * Add Webstat JS code inclusion * Install Smarty dependency using composer Breaking changes: * Rename Event class as HookEvent to avoid conflict with PECL event * URL with refresh GET parameter now automatically trigger redirection without it after page loading to avoid to keep it in URL
149 lines
4.7 KiB
PHP
149 lines
4.7 KiB
PHP
<?php
|
|
|
|
// Gettext text domain
|
|
define('TEXT_DOMAIN', 'DEFAULT');
|
|
|
|
/**
|
|
* List available translation languages
|
|
*
|
|
* @param $as_locales boolean If true, locale names will be return instead
|
|
* of primary languages (optional, default: false)
|
|
*
|
|
* @return array Array of available translation languages (or locales)
|
|
*/
|
|
function get_available_langs($as_locales=false) {
|
|
global $root_lang_dir;
|
|
if (!is_dir($root_lang_dir))
|
|
logging('FATAL', "Root land directory not found ($root_lang_dir)");
|
|
$langs = array(($as_locales?'en_US.UTF8':'en'));
|
|
if ($dh = opendir($root_lang_dir)) {
|
|
while (($file = readdir($dh)) !== false) {
|
|
if (!is_dir($root_lang_dir . '/' . $file) || in_array($file, array('.', '..')))
|
|
continue;
|
|
if ($as_locales) {
|
|
$langs[] = $file;
|
|
continue;
|
|
}
|
|
$lang = Locale::getPrimaryLanguage($file);
|
|
if (!in_array($lang, $langs))
|
|
$langs[] = $lang;
|
|
}
|
|
closedir($dh);
|
|
}
|
|
$langs = array_unique($langs);
|
|
logging('TRACE', 'Available '.($as_locales?'locales':'languages').': '.implode(', ', $langs));
|
|
return $langs;
|
|
}
|
|
|
|
/**
|
|
* Get locale name corresponding to specified translation language
|
|
*
|
|
* @param $lang string The translation language
|
|
* @param $default string|null Default locale name to return if any available translation
|
|
* locales matched with the specified language
|
|
* (optional, default: $default_locale)
|
|
* @return string Corresponding locale
|
|
*/
|
|
function lang2locale($lang, $default=null) {
|
|
global $default_locale;
|
|
if (is_null($default))
|
|
$default = $default_locale;
|
|
foreach (get_available_langs(true) as $locale) {
|
|
if (strpos($locale, $lang) === false)
|
|
continue;
|
|
return $locale;
|
|
}
|
|
return $default;
|
|
}
|
|
|
|
/**
|
|
* Helper function: just mark message for translation
|
|
*
|
|
* @param string $msg The message to translate
|
|
*
|
|
* @return string The message without transformation
|
|
*/
|
|
function ___($msg) {
|
|
return $msg;
|
|
}
|
|
|
|
/**
|
|
* Initialize translation system
|
|
*
|
|
* Detect best translation language and configure the translation
|
|
* system.
|
|
*
|
|
* @return void
|
|
*/
|
|
function init_translation() {
|
|
global $root_dir_path, $root_lang_dir, $default_locale, $smarty;
|
|
$root_lang_dir = "$root_dir_path/lang";
|
|
|
|
if (!class_exists('Locale')) {
|
|
logging('ERROR', 'Locale PHP class does not exist. May be php-intl is not installed?');
|
|
return;
|
|
}
|
|
|
|
$available_langs = get_available_langs();
|
|
if (php_sapi_name() != "cli") {
|
|
if (isset($_REQUEST['lang']) && in_array($_REQUEST['lang'], $available_langs)) {
|
|
$lang = $_REQUEST['lang'];
|
|
logging('TRACE', "Select lang from request parameter: '$lang'");
|
|
}
|
|
elseif (isset($_SESSION['lang']) && in_array($_SESSION['lang'], $available_langs) && !isset($_REQUEST['reset_lang'])) {
|
|
$lang = $_SESSION['lang'];
|
|
logging('TRACE', "Restore lang from session: '$lang'");
|
|
}
|
|
else {
|
|
$lang = Locale::lookup(
|
|
get_available_langs(),
|
|
Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']),
|
|
true,
|
|
Locale::getPrimaryLanguage($default_locale)
|
|
);
|
|
logging('TRACE', "Best lang found is '$lang'");
|
|
}
|
|
}
|
|
else {
|
|
$lang = null;
|
|
$sys_current = getenv('LC_ALL');
|
|
if (!$sys_current)
|
|
$sys_current = getenv('LANG');
|
|
if ($sys_current)
|
|
$lang = Locale::getPrimaryLanguage($sys_current);
|
|
if (is_null($lang)) {
|
|
logging('TRACE', 'No configured lang detected from CLI env, use default.');
|
|
$lang = Locale::getPrimaryLanguage($default_locale);
|
|
}
|
|
else
|
|
logging('TRACE', "Lang detected from CLI env : '$lang'");
|
|
}
|
|
|
|
// Keep selected lang in session
|
|
$_SESSION['lang'] = $lang;
|
|
|
|
$locale = lang2locale($lang);
|
|
logging('TRACE', "Matching locale found with language '$lang' is '$locale'");
|
|
|
|
// Gettext firstly look the LANGUAGE env variable, so set it
|
|
if (!putenv("LANGUAGE=$locale"))
|
|
logging('ERROR', "Fail to set LANGUAGE variable in environnement to '$locale'");
|
|
|
|
// Set the locale
|
|
if (setlocale(LC_ALL, $locale) === false)
|
|
logging('ERROR', "An error occured setting locale to '$locale'");
|
|
|
|
// Configure and set the text domain
|
|
$fullpath = bindtextdomain(TEXT_DOMAIN, $root_lang_dir);
|
|
logging('TRACE', "Text domain fullpath is '$fullpath'.");
|
|
logging('TRACE', "Text domain is '".textdomain(TEXT_DOMAIN)."'.");
|
|
logging('TRACE', "Test: "._('Hello world !'));
|
|
|
|
// JS translation file
|
|
$js_translation_file = "translations/$lang.js";
|
|
if (php_sapi_name() != "cli" && is_file("$root_dir_path/public_html/$js_translation_file")) {
|
|
add_js_file(array("lib/babel.js", "js/translation.js", $js_translation_file));
|
|
}
|
|
}
|
|
|
|
# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab
|