From 8a0c8bd8d3d0f0d994cac241d8fbefee3dc3b13f Mon Sep 17 00:00:00 2001 From: Olivier PEREZ <olivier@olivierperez.fr> Date: Tue, 20 Jan 2015 00:05:43 +0100 Subject: [PATCH] Make language selection work better --- app/classes/Framadate/Utils.php | 6 ++-- app/inc/i18n.php | 64 +++++++++++++++++---------------- app/inc/smarty.php | 2 +- bandeaux.php | 4 +-- choix_autre.php | 2 +- tpl/head.tpl | 4 +-- tpl/header.tpl | 2 +- 7 files changed, 43 insertions(+), 41 deletions(-) diff --git a/app/classes/Framadate/Utils.php b/app/classes/Framadate/Utils.php index f2358a08..dc14ecaa 100644 --- a/app/classes/Framadate/Utils.php +++ b/app/classes/Framadate/Utils.php @@ -50,10 +50,10 @@ class Utils { * @deprecated */ public static function print_header($title = '') { - global $lang; + global $html_lang; echo '<!DOCTYPE html> - <html lang="' . $lang . '"> + <html lang="' . $html_lang . '"> <head> <meta charset="utf-8" />'; @@ -72,7 +72,7 @@ class Utils { <script type="text/javascript" src="' . self::get_server_name() . 'js/jquery-1.11.1.min.js"></script> <script type="text/javascript" src="' . self::get_server_name() . 'js/bootstrap.min.js"></script> <script type="text/javascript" src="' . self::get_server_name() . 'js/bootstrap-datepicker.js"></script> - <script type="text/javascript" src="' . self::get_server_name() . 'js/locales/bootstrap-datepicker.' . $lang . '.js"></script> + <script type="text/javascript" src="' . self::get_server_name() . 'js/locales/bootstrap-datepicker.' . $html_lang . '.js"></script> <script type="text/javascript" src="' . self::get_server_name() . 'js/core.js"></script>'; if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/nav/nav.js")) { echo '<script src="/nav/nav.js" id="nav_js" type="text/javascript" charset="utf-8"></script><!-- /Framanav -->'; diff --git a/app/inc/i18n.php b/app/inc/i18n.php index 587a7041..e62cd7bf 100644 --- a/app/inc/i18n.php +++ b/app/inc/i18n.php @@ -19,59 +19,61 @@ asort($ALLOWED_LANGUAGES); -if (isset($_POST['lang']) && is_string($_POST['lang']) && in_array($_POST['lang'], array_keys($ALLOWED_LANGUAGES)) ) { - $mlocale = $_POST['lang'] ; - setcookie('lang' , $_POST['lang'], time()+60*5, '/'); -} elseif ( isset($_COOKIE['lang']) && is_string($_COOKIE['lang']) && in_array($_COOKIE['lang'], array_keys($ALLOWED_LANGUAGES)) ) { - $mlocale = $_COOKIE['lang'] ; +if (isset($_POST['lang']) && is_string($_POST['lang']) && in_array($_POST['lang'], array_keys($ALLOWED_LANGUAGES))) { + $mlocale = $_POST['lang']; + $_SESSION['lang'] = $_POST['lang']; +} elseif (isset($_SESSION['lang']) && is_string($_SESSION['lang']) && in_array($_SESSION['lang'], array_keys($ALLOWED_LANGUAGES))) { + $mlocale = $_SESSION['lang']; } else { $mlocale = LANGUE; // Replace config language by browser language if possible - foreach ($ALLOWED_LANGUAGES as $k => $v ) { - if (substr($k,0,2)==substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)) { + foreach ($ALLOWED_LANGUAGES as $k => $v) { + if (substr($k, 0, 2) == substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)) { $mlocale = $k; + break; } } } -$locale = $mlocale . '.utf8';//unix format -if (strtoupper(substr(PHP_OS,0,3))=='WIN'){ +/* Tell PHP which locale to use */ +$domain = 'Studs'; +$locale = $mlocale . '.utf8'; //unix format + +if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { putenv("LC_ALL=$mlocale"); //Windows env. needed to switch between languages - switch ($mlocale){ - case 'fr_FR' : $locale = "fra";break; //$locale in windows locale format, needed to use php function that handle text : strftime() - case 'en_GB' : $locale = "english";break; //see http://msdn.microsoft.com/en-us/library/39cwe7zf%28v=vs.90%29.aspx - case 'de_DE' : $locale = "deu";break; - case 'es_ES' : $locale = "esp";break; + switch ($mlocale) { + case 'fr_FR' : + $locale = "fra"; + break; //$locale in windows locale format, needed to use php function that handle text : strftime() + case 'en_GB' : + $locale = "english"; + break; //see http://msdn.microsoft.com/en-us/library/39cwe7zf%28v=vs.90%29.aspx + case 'de_DE' : + $locale = "deu"; + break; + case 'es_ES' : + $locale = "esp"; + break; } } - -putenv('LANGUAGE=');//sert à quoi? +putenv('LANG=' . $locale); setlocale(LC_ALL, $locale); -setlocale(LC_TIME, $locale); -setlocale(5, $locale); // 5 = LC_MESSAGES (but LC_MESSAGES is not always present) - -$domain = 'Studs'; -bindtextdomain($domain, 'locale'); +bindtextdomain($domain, ROOT_DIR . 'locale'); bind_textdomain_codeset($domain, 'UTF-8'); textdomain($domain); -/* temp, for compatibility :*/ -$a = explode('_', $mlocale); -$_SESSION['langue'] = strtoupper($a[0]); - -/* <html lang="$lang"> */ -$lang = ($_SESSION['langue']!='') ? strtolower($_SESSION['langue']) : 'fr'; - +/* <html lang="$html_lang"> */ +$html_lang = substr($locale, 0, 2); /* Date Format */ $date_format['txt_full'] = _('%A, den %e. %B %Y'); //summary in choix_date.php and removal date in choix_(date|autre).php $date_format['txt_short'] = _('%A %e %B %Y'); // radio title $date_format['txt_day'] = _('%a %e'); $date_format['txt_date'] = _('%Y-%m-%d'); -if (strtoupper(substr(PHP_OS,0,3))=='WIN'){ //%e can't be used on Windows platform, use %#d instead - foreach($date_format as $k => $v) { - $date_format[$k] = preg_replace('#(?<!%)((?:%%)*)%e#','\1%#d', $v); //replace %e by %#d for windows +if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { //%e can't be used on Windows platform, use %#d instead + foreach ($date_format as $k => $v) { + $date_format[$k] = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $v); //replace %e by %#d for windows } } diff --git a/app/inc/smarty.php b/app/inc/smarty.php index 6078fa69..c9bad475 100644 --- a/app/inc/smarty.php +++ b/app/inc/smarty.php @@ -30,7 +30,7 @@ $smarty->assign('SERVER_URL', Utils::get_server_name()); $smarty->assign('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']); $smarty->assign('TITLE_IMAGE', IMAGE_TITRE); $smarty->assign('use_nav_js', file_exists($_SERVER['DOCUMENT_ROOT'] . '/nav/nav.js')); -$smarty->assign('lang', $lang); +$smarty->assign('html_lang', $html_lang); $smarty->assign('langs', $ALLOWED_LANGUAGES); $smarty->assign('date_format', $date_format); diff --git a/bandeaux.php b/bandeaux.php index a2c4caf0..d9c2bd22 100644 --- a/bandeaux.php +++ b/bandeaux.php @@ -57,12 +57,12 @@ function bandeau_titre($titre) function liste_lang() { - global $ALLOWED_LANGUAGES; global $lang; + global $ALLOWED_LANGUAGES; global $html_lang; $str = ''; foreach ($ALLOWED_LANGUAGES as $k => $v ) { - if (substr($k,0,2)==$lang) { + if (substr($k,0,2)==$html_lang) { $str .= '<option lang="'.substr($k,0,2).'" selected value="' . $k . '">' . $v . '</option>' . "\n" ; } else { $str .= '<option lang="'.substr($k,0,2).'" value="' . $k . '">' . $v . '</option>' . "\n" ; diff --git a/choix_autre.php b/choix_autre.php index c16ed507..9c04118e 100644 --- a/choix_autre.php +++ b/choix_autre.php @@ -232,7 +232,7 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || ( <p>' . _("To make a generic poll you need to propose at least two choices between differents subjects.") . '</p> <p>' . _("You can add or remove additional choices with the buttons") . ' <span class="glyphicon glyphicon-minus text-info"></span><span class="sr-only">' . _("Remove") . '</span> <span class="glyphicon glyphicon-plus text-success"></span><span class="sr-only">' . _("Add") . '</span></p>'; if ($config['user_can_add_img_or_link']) { - echo ' <p>' . _("It's possible to propose links or images by using ") . '<a href="http://' . $lang . '.wikipedia.org/wiki/Markdown">' . _("the Markdown syntax") . '</a>.</p>'; + echo ' <p>' . _("It's possible to propose links or images by using ") . '<a href="http://' . $html_lang . '.wikipedia.org/wiki/Markdown">' . _("the Markdown syntax") . '</a>.</p>'; } echo ' </div>' . "\n"; diff --git a/tpl/head.tpl b/tpl/head.tpl index 05c5b588..3b8bbaca 100644 --- a/tpl/head.tpl +++ b/tpl/head.tpl @@ -1,5 +1,5 @@ <!DOCTYPE html> - <html lang="{$lang}"> + <html lang="{$html_lang}"> <head> <meta charset="utf-8"> @@ -17,7 +17,7 @@ <script type="text/javascript" src="{'js/jquery-1.11.1.min.js'|resource}"></script> <script type="text/javascript" src="{'js/bootstrap.min.js'|resource}"></script> <script type="text/javascript" src="{'js/bootstrap-datepicker.js'|resource}"></script> - <script type="text/javascript" src="{"js/locales/bootstrap-datepicker.$lang.js"|resource}"></script> + <script type="text/javascript" src="{"js/locales/bootstrap-datepicker.$html_lang.js"|resource}"></script> <script type="text/javascript" src="{'js/core.js'|resource}"></script> {if !empty($nav_js)} diff --git a/tpl/header.tpl b/tpl/header.tpl index 7dbb582f..1fa06c27 100644 --- a/tpl/header.tpl +++ b/tpl/header.tpl @@ -4,7 +4,7 @@ <div class="input-group input-group-sm pull-right col-md-2 col-xs-4"> <select name="lang" class="form-control" title="{_("Select the language")}" > {foreach $langs as $lang_key=>$lang_value} - <option lang="{substr($lang_key, 0, 2)}" {if substr($lang_key, 0, 2)==$lang}selected{/if} value="{$lang_key|html}">{$lang_value|html}</option> + <option lang="{substr($lang_key, 0, 2)}" {if substr($lang_key, 0, 2)==$html_lang}selected{/if} value="{$lang_key|html}">{$lang_value|html}</option> {/foreach} </select> <span class="input-group-btn"> -- GitLab