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

@@ -6,6 +6,7 @@ require_once __DIR__ . '/includes/message_handler.php';
require_once __DIR__ . '/includes/schedule_helpers.php';
require_once __DIR__ . '/common/helpers/sender_factory.php';
require_once __DIR__ . '/common/helpers/converter_factory.php';
require_once __DIR__ . '/includes/i18n.php';
function getTranslationButtons(PDO $pdo, string $text): array
{
@@ -69,7 +70,7 @@ function buildDiscordTranslationButtons(array $languages, string $text): array
];
}
$pageTitle = 'Crear Mensaje - Sistema de Mensajería';
$pageTitle = t('Crear Mensaje');
$recipients = [];
$templates = [];
@@ -202,10 +203,10 @@ require_once __DIR__ . '/templates/header.php';
?>
<div class="d-flex justify-content-between align-items-center mb-4">
<h2><i class="bi bi-plus-circle"></i> Crear Mensaje</h2>
<h2><i class="bi bi-pencil-square"></i> <?= t('Crear Mensaje') ?></h2>
<div class="btn-group">
<a href="preview_message.php" class="btn btn-outline-secondary" target="_blank">
<i class="bi bi-eye"></i> Previsualizar
<i class="bi bi-eye"></i> <?= t('Previsualizar') ?>
</a>
</div>
</div>
@@ -220,14 +221,14 @@ require_once __DIR__ . '/templates/header.php';
<div class="row">
<div class="col-md-8">
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-white border-0">
<h5 class="mb-0">Contenido del Mensaje</h5>
<div class="card-header border-0">
<h5 class="mb-0"><?= t('Contenido del Mensaje') ?></h5>
</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">Plantilla (opcional)</label>
<label class="form-label"><?= t('Plantilla (opcional)') ?></label>
<select class="form-select" id="templateSelect">
<option value="">-- Seleccionar plantilla --</option>
<option value="">-- <?= t('Seleccionar plantilla') ?> --</option>
<?php foreach ($templates as $template): ?>
<option value="<?= htmlspecialchars($template['message_content']) ?>">
<?= htmlspecialchars($template['name']) ?>
@@ -237,7 +238,7 @@ require_once __DIR__ . '/templates/header.php';
</div>
<div class="mb-3">
<label class="form-label">Mensaje</label>
<label class="form-label"><?= t('Mensaje') ?></label>
<textarea name="content" id="messageContent" class="form-control" rows="12"></textarea>
</div>
</div>
@@ -246,62 +247,62 @@ require_once __DIR__ . '/templates/header.php';
<div class="col-md-4">
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-white border-0">
<h5 class="mb-0">Destinatario</h5>
<div class="card-header border-0">
<h5 class="mb-0"><?= t('Destinatario') ?></h5>
</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">Plataforma</label>
<label class="form-label"><?= t('Plataforma') ?></label>
<select name="platform" id="platformSelect" class="form-select" required>
<option value="">-- Seleccionar --</option>
<option value="">-- <?= t('Seleccionar') ?> --</option>
<option value="discord">Discord</option>
<option value="telegram">Telegram</option>
</select>
</div>
<div class="mb-3">
<label class="form-label">Destinatario</label>
<label class="form-label"><?= t('Destinatario') ?></label>
<select name="recipient_id" id="recipientSelect" class="form-select" required disabled>
<option value="">Selecciona una plataforma primero</option>
<option value=""><?= t('Selecciona una plataforma primero') ?></option>
</select>
</div>
</div>
</div>
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-white border-0">
<h5 class="mb-0">Programación</h5>
<div class="card-header border-0">
<h5 class="mb-0"><?= t('Programación') ?></h5>
</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">Tipo de envío</label>
<label class="form-label"><?= t('Tipo de envío') ?></label>
<select name="send_type" id="sendType" class="form-select" required>
<option value="now">Enviar ahora</option>
<option value="later">Programar para después</option>
<option value="recurring">Recurrente</option>
<option value="now"><?= t('Enviar ahora') ?></option>
<option value="later"><?= t('Programar para después') ?></option>
<option value="recurring"><?= t('Recurrente') ?></option>
</select>
</div>
<div class="mb-3" id="datetimeField" style="display: none;">
<label class="form-label">Fecha y hora</label>
<label class="form-label"><?= t('Fecha y hora') ?></label>
<input type="datetime-local" name="send_datetime" class="form-control">
</div>
<div id="recurringFields" style="display: none;">
<div class="mb-3">
<label class="form-label">Días</label>
<label class="form-label"><?= t('Días') ?></label>
<select name="recurring_days" class="form-select">
<option value="monday">Lunes</option>
<option value="tuesday">Martes</option>
<option value="wednesday">Miércoles</option>
<option value="thursday">Jueves</option>
<option value="friday">Viernes</option>
<option value="saturday">Sábado</option>
<option value="sunday">Domingo</option>
<option value="monday"><?= t('Lunes') ?></option>
<option value="tuesday"><?= t('Martes') ?></option>
<option value="wednesday"><?= t('Miércoles') ?></option>
<option value="thursday"><?= t('Jueves') ?></option>
<option value="friday"><?= t('Viernes') ?></option>
<option value="saturday"><?= t('Sábado') ?></option>
<option value="sunday"><?= t('Domingo') ?></option>
</select>
</div>
<div class="mb-3">
<label class="form-label">Hora</label>
<label class="form-label"><?= t('Hora') ?></label>
<input type="time" name="recurring_time" class="form-control" value="09:00">
</div>
</div>
@@ -310,9 +311,9 @@ require_once __DIR__ . '/templates/header.php';
<div class="d-grid gap-2">
<button type="submit" class="btn btn-primary btn-lg">
<i class="bi bi-send"></i> Enviar
<i class="bi bi-send"></i> <?= t('Enviar') ?>
</button>
<a href="index.php" class="btn btn-outline-secondary">Cancelar</a>
<a href="index.php" class="btn btn-outline-secondary"><?= t('Cancelar') ?></a>
</div>
</div>
</div>
@@ -323,7 +324,7 @@ require_once __DIR__ . '/templates/header.php';
<div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><i class="bi bi-images"></i> Galería de Imágenes</h5>
<h5 class="modal-title"><i class="bi bi-images"></i> <?= t('Galería de Imágenes') ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
@@ -331,7 +332,7 @@ require_once __DIR__ . '/templates/header.php';
<?php if (empty($galleryImages)): ?>
<div class="col-12 text-center text-muted py-5">
<i class="bi bi-images" style="font-size: 3rem;"></i>
<p class="mt-3">No hay imágenes en la galería</p>
<p class="mt-3"><?= t('No hay imágenes en la galería') ?></p>
</div>
<?php else: ?>
<?php foreach ($galleryImages as $image): ?>