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
This commit is contained in:
2026-02-20 15:21:17 -06:00
parent 6a50e64b42
commit a44a64a01f
7 changed files with 347 additions and 117 deletions

View File

@@ -2,9 +2,14 @@
session_start();
require_once __DIR__ . '/../includes/session_check.php';
require_once __DIR__ . '/../includes/url_helper.php';
require_once __DIR__ . '/../includes/i18n.php';
handleLanguageChange();
$currentPage = basename($_SERVER['PHP_SELF']);
$theme = $_COOKIE['theme'] ?? 'light';
$currentLang = getCurrentLanguage();
$activeLanguages = getActiveLanguages();
?>
<!DOCTYPE html>
<html lang="es" data-bs-theme="<?= $theme ?>">
@@ -607,32 +612,32 @@ $theme = $_COOKIE['theme'] ?? 'light';
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link nav-link-main <?= $currentPage === 'index.php' ? 'active' : '' ?>" href="/index.php">
<i class="bi bi-crosshair"></i> Dashboard
<i class="bi bi-crosshair"></i> <?= t('Dashboard') ?>
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-link-main <?= $currentPage === 'create_message.php' ? 'active' : '' ?>" href="/create_message.php">
<i class="bi bi-pencil-square"></i> Crear
<i class="bi bi-pencil-square"></i> <?= t('Crear') ?>
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-link-main <?= $currentPage === 'scheduled_messages.php' ? 'active' : '' ?>" href="/scheduled_messages.php">
<i class="bi bi-stopwatch"></i> Programados
<i class="bi bi-stopwatch"></i> <?= t('Programados') ?>
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-link-main <?= $currentPage === 'recurrentes.php' ? 'active' : '' ?>" href="/recurrentes.php">
<i class="bi bi-collection"></i> Plantillas
<i class="bi bi-collection"></i> <?= t('Plantillas') ?>
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-link-main <?= $currentPage === 'sent_messages.php' ? 'active' : '' ?>" href="/sent_messages.php">
<i class="bi bi-check2-all"></i> Enviados
<i class="bi bi-check2-all"></i> <?= t('Enviados') ?>
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-link-main <?= $currentPage === 'gallery.php' ? 'active' : '' ?>" href="/gallery.php">
<i class="bi bi-images"></i> Galería
<i class="bi bi-images"></i> <?= t('Galería') ?>
</a>
</li>
@@ -640,45 +645,72 @@ $theme = $_COOKIE['theme'] ?? 'light';
<div class="nav-divider d-none d-lg-block"></div>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle-military dropdown-toggle" href="#" data-bs-toggle="dropdown">
<i class="bi bi-shield-lock"></i> COMANDO
<i class="bi bi-shield-lock"></i> <?= t('COMANDO') ?>
</a>
<ul class="dropdown-menu dropdown-menu-military">
<li><a class="dropdown-item <?= $currentPage === 'users.php' ? 'active' : '' ?>" href="/admin/users.php"><i class="bi bi-people"></i> Usuarios</a></li>
<li><a class="dropdown-item <?= $currentPage === 'recipients.php' ? 'active' : '' ?>" href="/admin/recipients.php"><i class="bi bi-person-check"></i> Destinatarios</a></li>
<li><a class="dropdown-item <?= $currentPage === 'languages.php' ? 'active' : '' ?>" href="/admin/languages.php"><i class="bi bi-translate"></i> Idiomas</a></li>
<li><a class="dropdown-item <?= $currentPage === 'comandos.php' ? 'active' : '' ?>" href="/admin/comandos.php"><i class="bi bi-terminal"></i> Comandos</a></li>
<li><a class="dropdown-item <?= $currentPage === 'users.php' ? 'active' : '' ?>" href="/admin/users.php"><i class="bi bi-people"></i> <?= t('Usuarios') ?></a></li>
<li><a class="dropdown-item <?= $currentPage === 'recipients.php' ? 'active' : '' ?>" href="/admin/recipients.php"><i class="bi bi-person-check"></i> <?= t('Destinatarios') ?></a></li>
<li><a class="dropdown-item <?= $currentPage === 'languages.php' ? 'active' : '' ?>" href="/admin/languages.php"><i class="bi bi-translate"></i> <?= t('Idiomas') ?></a></li>
<li><a class="dropdown-item <?= $currentPage === 'comandos.php' ? 'active' : '' ?>" href="/admin/comandos.php"><i class="bi bi-terminal"></i> <?= t('Comandos') ?></a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item <?= $currentPage === 'test_discord_connection.php' ? 'active' : '' ?>" href="/admin/test_discord_connection.php"><i class="bi bi-discord"></i> Test Discord</a></li>
<li><a class="dropdown-item <?= $currentPage === 'ia_agent.php' ? 'active' : '' ?>" href="/admin/ia_agent.php"><i class="bi bi-cpu"></i> Config IA</a></li>
<li><a class="dropdown-item <?= $currentPage === 'test_discord_connection.php' ? 'active' : '' ?>" href="/admin/test_discord_connection.php"><i class="bi bi-discord"></i> <?= t('Test Discord') ?></a></li>
<li><a class="dropdown-item <?= $currentPage === 'ia_agent.php' ? 'active' : '' ?>" href="/admin/ia_agent.php"><i class="bi bi-cpu"></i> <?= t('Config IA') ?></a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item <?= $currentPage === 'set_webhook.php' ? 'active' : '' ?>" href="/set_webhook.php"><i class="bi bi-telegram"></i> Webhook TG</a></li>
<li><a class="dropdown-item <?= $currentPage === 'chat_telegram.php' ? 'active' : '' ?>" href="/chat_telegram.php"><i class="bi bi-chat-dots"></i> Chat TG</a></li>
<li><a class="dropdown-item <?= $currentPage === 'telegram_bot_interactions.php' ? 'active' : '' ?>" href="/telegram/admin/telegram_bot_interactions.php"><i class="bi bi-robot"></i> Bot Telegram</a></li>
<li><a class="dropdown-item <?= $currentPage === 'telegram_welcome.php' ? 'active' : '' ?>" href="/telegram/admin/telegram_welcome.php"><i class="bi bi-person-plus"></i> Bienvenida</a></li>
<li><a class="dropdown-item <?= $currentPage === 'set_webhook.php' ? 'active' : '' ?>" href="/set_webhook.php"><i class="bi bi-telegram"></i> <?= t('Webhook TG') ?></a></li>
<li><a class="dropdown-item <?= $currentPage === 'chat_telegram.php' ? 'active' : '' ?>" href="/chat_telegram.php"><i class="bi bi-chat-dots"></i> <?= t('Chat TG') ?></a></li>
<li><a class="dropdown-item <?= $currentPage === 'telegram_bot_interactions.php' ? 'active' : '' ?>" href="/telegram/admin/telegram_bot_interactions.php"><i class="bi bi-robot"></i> <?= t('Bot Telegram') ?></a></li>
<li><a class="dropdown-item <?= $currentPage === 'telegram_welcome.php' ? 'active' : '' ?>" href="/telegram/admin/telegram_welcome.php"><i class="bi bi-person-plus"></i> <?= t('Bienvenida') ?></a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item <?= $currentPage === 'translate_message.php' ? 'active' : '' ?>" href="/translate_message.php"><i class="bi bi-translate"></i> Traductor</a></li>
<li><a class="dropdown-item <?= $currentPage === 'admin_send_message.php' ? 'active' : '' ?>" href="/admin_send_message.php"><i class="bi bi-lightning"></i> Enviar Directo</a></li>
<li><a class="dropdown-item <?= $currentPage === 'translate_message.php' ? 'active' : '' ?>" href="/translate_message.php"><i class="bi bi-translate"></i> <?= t('Traductor') ?></a></li>
<li><a class="dropdown-item <?= $currentPage === 'admin_send_message.php' ? 'active' : '' ?>" href="/admin_send_message.php"><i class="bi bi-lightning"></i> <?= t('Enviar Directo') ?></a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item <?= $currentPage === 'system.php' ? 'active' : '' ?>" href="/admin/system.php"><i class="bi bi-hdd-stack"></i> Sistema</a></li>
<li><a class="dropdown-item <?= $currentPage === 'system.php' ? 'active' : '' ?>" href="/admin/system.php"><i class="bi bi-hdd-stack"></i> <?= t('Sistema') ?></a></li>
</ul>
</li>
<?php endif; ?>
</ul>
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle-military dropdown-toggle lang-selector" href="#" data-bs-toggle="dropdown" title="<?= t('Idioma') ?>">
<?php
$currentLangData = array_filter($activeLanguages, fn($l) => $l['language_code'] === $currentLang);
$currentLangData = reset($currentLangData);
if ($currentLang === 'es' || !$currentLangData) {
echo '<span>🇲🇽</span>';
} else {
echo '<span>' . htmlspecialchars($currentLangData['flag_emoji']) . '</span>';
}
?>
</a>
<ul class="dropdown-menu dropdown-menu-military dropdown-menu-end">
<li>
<a class="dropdown-item <?= $currentLang === 'es' ? 'active' : '' ?>" href="?lang=es">
🇲🇽 <?= t('Español') ?>
</a>
</li>
<?php foreach ($activeLanguages as $lang): ?>
<li>
<a class="dropdown-item <?= $currentLang === $lang['language_code'] ? 'active' : '' ?>" href="?lang=<?= urlencode($lang['language_code']) ?>">
<?= htmlspecialchars($lang['flag_emoji']) ?> <?= t($lang['language_name']) ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</li>
<li class="nav-item">
<button class="btn" id="theme-toggle" title="Cambiar tema">
<button class="btn" id="theme-toggle" title="<?= t('Cambiar tema') ?>">
<i class="bi bi-moon-fill"></i>
</button>
</li>
<li class="nav-item">
<a class="nav-link nav-link-main <?= $currentPage === 'profile.php' ? 'active' : '' ?>" href="/profile.php">
<i class="bi bi-person"></i> Perfil
<i class="bi bi-person"></i> <?= t('Perfil') ?>
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-link-main" href="/logout.php">
<i class="bi bi-box-arrow-left"></i> Salir
<i class="bi bi-box-arrow-left"></i> <?= t('Salir') ?>
</a>
</li>
</ul>