I need to switch between French and English—but only within the admin area.
I’ve implemented a solution that works well : But there is one thing that really bothers me: I had to add code to the admin's `application_top.php` file to ensure the selected language is preserved when changing pages.
Here is my code:
1) catalog/includes/hooks/admin/siteWide/admin_language_switcher.php
Code: Select all
<?php
class hook_admin_siteWide_admin_language_switcher {
public function listen_injectBodyEnd() {
global $language;
// 1. Détecter proprement la langue en cours
$is_fr = (strtolower($language) == 'french');
$current_page = basename($_SERVER['PHP_SELF']);
$query_params = $_GET;
// Liens propres renvoyant vers le sélecteur d'application_top
$query_params['set_adm_lang'] = 'fr';
$link_fr = $current_page . '?' . http_build_query($query_params);
$query_params['set_adm_lang'] = 'en';
$link_en = $current_page . '?' . http_build_query($query_params);
// Styles de surbrillance Bootstrap 5
$active_fr = $is_fr ? 'fw-bold text-decoration-underline text-white' : 'text-white-50';
$active_en = !$is_fr ? 'fw-bold text-decoration-underline text-white' : 'text-white-50';
// 2. Injection graphique en fin de page dans la navbar native
$html = '
<script>
(function() {
var targetNav = document.querySelector(".navbar-nav.ms-auto");
if (targetNav) {
var langLi = document.createElement("li");
langLi.className = "nav-item d-flex align-items-center px-3 small";
langLi.innerHTML = \'<a href="' . $link_fr . '" class="nav-link p-0 ' . $active_fr . '">FR</a><span class="text-white-50 mx-1">|</span><a href="' . $link_en . '" class="nav-link p-0 ' . $active_en . '">EN</a>\';
targetNav.insertBefore(langLi, targetNav.firstChild);
}
})();
</script>
';
return $html;
}
}2) in admin/includes/application_top.php
Find:
Code: Select all
if (!isset($_SESSION['language']) || isset($_GET['language'])) {
$lng = language::build();
}Code: Select all
// --- LANGUAGE SELECTOR CONFIGURATION (via HOOK) ---
if (isset($_GET['set_adm_lang']) && in_array($_GET['set_adm_lang'], ['fr', 'en'])) {
$_SESSION['language'] = ($_GET['set_adm_lang'] == 'fr') ? 'french' : 'english';
$_SESSION['languages_id'] = ($_GET['set_adm_lang'] == 'fr') ? 2 : 1;
if (isset($lng) && is_object($lng)) {
$lng->language = $_SESSION['language'];
$lng->languages_id = $_SESSION['languages_id'];
}
unset($_GET['set_adm_lang']);
header('Location: ' . basename($_SERVER['PHP_SELF']) . (!empty($_GET) ? '?' . http_build_query($_GET) : ''));
exit;
}
// --- END CONFIGURATION ---Thank you in advance for your help.
