Files
lastwar/includes/i18n.php
nickpons666 a44a64a01f Feature: Sistema multi-idioma con LibreTranslate
- Nuevo includes/i18n.php con funciones t() para traducción
- Selector de idioma en navbar y login
- Traducciones aplicadas a: dashboard, login, mensajes programados, crear mensaje, sistema
- Usa idiomas activados desde admin/languages.php
- Caché de traducciones incluido
2026-02-20 15:21:17 -06:00

132 lines
3.0 KiB
PHP

<?php
require_once __DIR__ . '/env_loader.php';
require_once __DIR__ . '/../src/Translate.php';
session_start();
function getCurrentLanguage(): string
{
if (isset($_SESSION['user_language'])) {
return $_SESSION['user_language'];
}
if (isset($_COOKIE['user_language'])) {
$_SESSION['user_language'] = $_COOKIE['user_language'];
return $_COOKIE['user_language'];
}
$defaultLang = 'es';
$_SESSION['user_language'] = $defaultLang;
return $defaultLang;
}
function setCurrentLanguage(string $langCode): void
{
$_SESSION['user_language'] = $langCode;
setcookie('user_language', $langCode, [
'expires' => time() + (365 * 24 * 60 * 60),
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
}
function getActiveLanguages(): array
{
static $languages = null;
if ($languages !== null) {
return $languages;
}
try {
$pdo = getDbConnection();
$stmt = $pdo->query("SELECT * FROM supported_languages WHERE is_active = 1 ORDER BY language_name");
$languages = $stmt->fetchAll();
} catch (Exception $e) {
$languages = [];
}
return $languages;
}
function getBaseLanguage(): string
{
return 'es';
}
function t(string $text, ?string $targetLang = null): string
{
if (empty(trim($text))) {
return $text;
}
$targetLang = $targetLang ?? getCurrentLanguage();
$baseLang = getBaseLanguage();
if ($targetLang === $baseLang) {
return $text;
}
static $translator = null;
static $cache = [];
$cacheKey = md5($text . $targetLang);
if (isset($cache[$cacheKey])) {
return $cache[$cacheKey];
}
if ($translator === null) {
$translator = new \src\Translate();
}
try {
$translated = $translator->translate($text, $baseLang, $targetLang);
if ($translated !== null) {
$cache[$cacheKey] = $translated;
return $translated;
}
} catch (Exception $e) {
error_log("Translation error for '$text': " . $e->getMessage());
}
return $text;
}
function ta(array $texts): array
{
$result = [];
foreach ($texts as $key => $text) {
$result[$key] = t($text);
}
return $result;
}
function handleLanguageChange(): void
{
if (isset($_GET['lang'])) {
$lang = $_GET['lang'];
$activeLanguages = getActiveLanguages();
$validLangs = array_column($activeLanguages, 'language_code');
if (in_array($lang, $validLangs) || $lang === 'es') {
setCurrentLanguage($lang);
}
$redirectUrl = strtok($_SERVER['REQUEST_URI'], '?');
$queryParams = $_GET;
unset($queryParams['lang']);
if (!empty($queryParams)) {
$redirectUrl .= '?' . http_build_query($queryParams);
}
header('Location: ' . $redirectUrl);
exit;
}
}