eesyphp/includes/translation.php
Benjamin Renard 6fdc5447f1 Some improvments from recent works on apps based on its "framework"
* 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
2023-01-29 11:51:41 +01:00

150 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