query("SELECT * FROM supported_languages ORDER BY language_name"); $languages = $stmt->fetchAll(); } catch (Exception $e) { $error = $e->getMessage(); } $syncMessage = ''; $syncError = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { $action = $_POST['action']; if ($action === 'toggle_status') { $id = (int) $_POST['id']; $stmt = $pdo->prepare("UPDATE supported_languages SET is_active = NOT is_active WHERE id = ?"); $stmt->execute([$id]); logActivity(getCurrentUserId(), 'toggle_language', "Idioma ID: $id"); header('Location: languages.php'); exit; } elseif ($action === 'update_flag') { $id = (int) $_POST['id']; $flag = $_POST['flag_emoji']; $stmt = $pdo->prepare("UPDATE supported_languages SET flag_emoji = ? WHERE id = ?"); $stmt->execute([$flag, $id]); header('Location: languages.php'); exit; } elseif ($action === 'add') { $code = $_POST['language_code']; $name = $_POST['language_name']; $flag = $_POST['flag_emoji']; $stmt = $pdo->prepare("INSERT INTO supported_languages (language_code, language_name, flag_emoji, is_active) VALUES (?, ?, ?, FALSE)"); $stmt->execute([$code, $name, $flag]); logActivity(getCurrentUserId(), 'add_language', "Idioma agregado: $name"); header('Location: languages.php'); exit; } elseif ($action === 'sync_libretranslate') { try { $translator = new src\Translate(); $ltLanguages = $translator->getSupportedLanguages(); if (empty($ltLanguages)) { $syncError = "No se pudieron obtener los idiomas de LibreTranslate. Verifica que el servicio esté corriendo en: " . ($_ENV['LIBRETRANSLATE_URL'] ?? 'http://localhost:5000'); } else { $added = 0; foreach ($ltLanguages as $ltLang) { $code = $ltLang['code']; $name = $ltLang['name']; $stmt = $pdo->prepare("SELECT id FROM supported_languages WHERE language_code = ?"); $stmt->execute([$code]); if (!$stmt->fetch()) { $flag = getFlagForLanguage($code); $stmt = $pdo->prepare("INSERT INTO supported_languages (language_code, language_name, flag_emoji, is_active) VALUES (?, ?, ?, FALSE)"); $stmt->execute([$code, $name, $flag]); $added++; } } $syncMessage = "Se sincronizaron $added idiomas desde LibreTranslate"; logActivity(getCurrentUserId(), 'sync_languages', "Sincronizados $added idiomas desde LibreTranslate"); } } catch (Exception $e) { $syncError = "Error al conectar con LibreTranslate: " . $e->getMessage() . ". Verifica que el servicio esté configurado correctamente en el archivo .env"; } } } // Array completo de banderas con variantes regionales $availableFlags = [ // Español - Variantes ['code' => 'es-MX', 'flag' => '🇲🇽', 'name' => 'Español (México)'], ['code' => 'es-ES', 'flag' => '🇪🇸', 'name' => 'Español (España)'], ['code' => 'es-AR', 'flag' => '🇦🇷', 'name' => 'Español (Argentina)'], ['code' => 'es-CO', 'flag' => '🇨🇴', 'name' => 'Español (Colombia)'], ['code' => 'es-CL', 'flag' => '🇨🇱', 'name' => 'Español (Chile)'], ['code' => 'es-PE', 'flag' => '🇵🇪', 'name' => 'Español (Perú)'], ['code' => 'es-VE', 'flag' => '🇻🇪', 'name' => 'Español (Venezuela)'], // Inglés - Variantes ['code' => 'en-US', 'flag' => '🇺🇸', 'name' => 'English (USA)'], ['code' => 'en-GB', 'flag' => '🇬🇧', 'name' => 'English (UK)'], ['code' => 'en-CA', 'flag' => '🇨🇦', 'name' => 'English (Canada)'], ['code' => 'en-AU', 'flag' => '🇦🇺', 'name' => 'English (Australia)'], // Portugués - Variantes ['code' => 'pt-BR', 'flag' => '🇧🇷', 'name' => 'Português (Brasil)'], ['code' => 'pt-PT', 'flag' => '🇵🇹', 'name' => 'Português (Portugal)'], // Francés - Variantes ['code' => 'fr-FR', 'flag' => '🇫🇷', 'name' => 'Français (France)'], ['code' => 'fr-CA', 'flag' => '🇨🇦', 'name' => 'Français (Canada)'], // Alemán ['code' => 'de', 'flag' => '🇩🇪', 'name' => 'Deutsch'], // Italiano ['code' => 'it', 'flag' => '🇮🇹', 'name' => 'Italiano'], // Ruso ['code' => 'ru', 'flag' => '🇷🇺', 'name' => 'Русский'], // Chino - Variantes ['code' => 'zh-CN', 'flag' => '🇨🇳', 'name' => '中文 (简体)'], ['code' => 'zh-TW', 'flag' => '🇹🇼', 'name' => '中文 (繁體)'], // Japonés ['code' => 'ja', 'flag' => '🇯🇵', 'name' => '日本語'], // Coreano ['code' => 'ko', 'flag' => '🇰🇷', 'name' => '한국어'], // Árabe ['code' => 'ar', 'flag' => '🇸🇦', 'name' => 'العربية'], // Hindi ['code' => 'hi', 'flag' => '🇮🇳', 'name' => 'हिन्दी'], // Holandés ['code' => 'nl', 'flag' => '🇳🇱', 'name' => 'Nederlands'], // Polaco ['code' => 'pl', 'flag' => '🇵🇱', 'name' => 'Polski'], // Turco ['code' => 'tr', 'flag' => '🇹🇷', 'name' => 'Türkçe'], // Sueco ['code' => 'sv', 'flag' => '🇸🇪', 'name' => 'Svenska'], // Danés ['code' => 'da', 'flag' => '🇩🇰', 'name' => 'Dansk'], // Finés ['code' => 'fi', 'flag' => '🇫🇮', 'name' => 'Suomi'], // Noruego ['code' => 'no', 'flag' => '🇳🇴', 'name' => 'Norsk'], // Checo ['code' => 'cs', 'flag' => '🇨🇿', 'name' => 'Čeština'], // Griego ['code' => 'el', 'flag' => '🇬🇷', 'name' => 'Ελληνικά'], // Hebreo ['code' => 'he', 'flag' => '🇮🇱', 'name' => 'עברית'], // Tailandés ['code' => 'th', 'flag' => '🇹🇭', 'name' => 'ไทย'], // Vietnamita ['code' => 'vi', 'flag' => '🇻🇳', 'name' => 'Tiếng Việt'], // Indonesio ['code' => 'id', 'flag' => '🇮🇩', 'name' => 'Bahasa Indonesia'], // Malayo ['code' => 'ms', 'flag' => '🇲🇾', 'name' => 'Bahasa Melayu'], // Ucraniano ['code' => 'uk', 'flag' => '🇺🇦', 'name' => 'Українська'], // Catalán ['code' => 'ca', 'flag' => '🇪🇸', 'name' => 'Català'], // Gallego ['code' => 'gl', 'flag' => '🇪🇸', 'name' => 'Galego'], // Rumano ['code' => 'ro', 'flag' => '🇷🇴', 'name' => 'Română'], // Húngaro ['code' => 'hu', 'flag' => '🇭🇺', 'name' => 'Magyar'], // Búlgaro ['code' => 'bg', 'flag' => '🇧🇬', 'name' => 'Български'], // Otros países importantes ['code' => 'other', 'flag' => '🇦🇹', 'name' => 'Austria'], ['code' => 'other', 'flag' => '🇧🇪', 'name' => 'Bélgica'], ['code' => 'other', 'flag' => '🇨🇭', 'name' => 'Suiza'], ['code' => 'other', 'flag' => '🇮🇪', 'name' => 'Irlanda'], ['code' => 'other', 'flag' => '🇳🇿', 'name' => 'Nueva Zelanda'], ['code' => 'other', 'flag' => '🇿🇦', 'name' => 'Sudáfrica'], ['code' => 'other', 'flag' => '🇪🇬', 'name' => 'Egipto'], ['code' => 'other', 'flag' => '🇮🇷', 'name' => 'Irán'], ['code' => 'other', 'flag' => '🇵🇰', 'name' => 'Pakistán'], ['code' => 'other', 'flag' => '🇧🇩', 'name' => 'Bangladesh'], ['code' => 'other', 'flag' => '🇵🇭', 'name' => 'Filipinas'], ['code' => 'other', 'flag' => '🇸🇬', 'name' => 'Singapur'], ['code' => 'other', 'flag' => '🇭🇰', 'name' => 'Hong Kong'], ['code' => 'other', 'flag' => '🇲🇴', 'name' => 'Macao'], ]; function getFlagForLanguage(string $code): string { // Por defecto usar México para español $flags = [ 'en' => '🇺🇸', // USA para inglés general 'es' => '🇲🇽', // México para español (como pidió el usuario) 'pt' => '🇧🇷', // Brasil para portugués 'fr' => '🇫🇷', // Francia 'de' => '🇩🇪', // Alemania 'it' => '🇮🇹', // Italia 'ru' => '🇷🇺', // Rusia 'zh' => '🇨🇳', // China 'ja' => '🇯🇵', // Japón 'ko' => '🇰🇷', // Corea del Sur 'ar' => '🇸🇦', // Arabia Saudita 'hi' => '🇮🇳', // India 'nl' => '🇳🇱', // Países Bajos 'pl' => '🇵🇱', // Polonia 'tr' => '🇹🇷', // Turquía 'sv' => '🇸🇪', // Suecia 'da' => '🇩🇰', // Dinamarca 'fi' => '🇫🇮', // Finlandia 'no' => '🇳🇴', // Noruega 'cs' => '🇨🇿', // República Checa 'el' => '🇬🇷', // Grecia 'he' => '🇮🇱', // Israel 'th' => '🇹🇭', // Tailandia 'vi' => '🇻🇳', // Vietnam 'id' => '🇮🇩', // Indonesia 'ms' => '🇲🇾', // Malasia 'uk' => '🇺🇦', // Ucrania 'ca' => '🇪🇸', // España (Cataluña) 'gl' => '🇪🇸', // España (Galicia) 'ro' => '🇷🇴', // Rumania 'hu' => '🇭🇺', // Hungría 'bg' => '🇧🇬', // Bulgaria ]; return $flags[$code] ?? '🌐'; } require_once __DIR__ . '/../templates/header.php'; ?>
| Bandera | Código | Nombre | Estado | Acciones |
|---|---|---|---|---|
| = htmlspecialchars($lang['flag_emoji']) ?> | = htmlspecialchars($lang['language_code']) ?> |
= htmlspecialchars($lang['language_name']) ?> | Activo Inactivo |