'Archivo de datos no encontrado']); exit; } // Helper para normalizar texto (quitar acentos y pasar a minúsculas, con soporte de caracteres kichwa) if (!function_exists('normalizar')) { function normalizar($text) { $text = mb_strtolower($text, 'UTF-8'); $utf8 = array( '/[áàâãªä]/u' => 'a', '/[éèêë]/u' => 'e', '/[íìîï]/u' => 'i', '/[óòôõºö]/u' => 'o', '/[úùûü]/u' => 'u', '/[碩]/u' => 'c', '/[ñ]/u' => 'n', '/[ĉ]/u' => 'c', '/[ʃ]/u' => 'sh', '/[kʼ]/u' => 'k', '/[pʼ]/u' => 'p', '/[tʼ]/u' => 't', '/[ʼ]/u' => '' ); return preg_replace(array_keys($utf8), array_values($utf8), $text); } } // DETECCIÓN DE PALABRA INDIVIDUAL PARA SEO DINÁMICO if (isset($_GET['p']) && trim($_GET['p']) !== '' && !is_numeric($_GET['p'])) { $wordToFind = trim($_GET['p']); $normWordToFind = normalizar($wordToFind); $rawData = json_decode(file_get_contents($jsonPath), true); $foundWord = null; if ($rawData) { foreach ($rawData as $item) { $ki = isset($item['kichwa']) ? $item['kichwa'] : ''; if (normalizar($ki) === $normWordToFind) { // Mapear definición $def = ''; if (isset($item['definicion'])) { $def = $item['definicion']; } elseif (isset($item['espanol'])) { $def = is_array($item['espanol']) ? implode(', ', $item['espanol']) : $item['espanol']; } if (isset($item['notas']) && is_array($item['notas']) && count($item['notas']) > 0) { $def .= ' (' . implode(', ', $item['notas']) . ')'; } $foundWord = [ 'palabra_ki' => $ki, 'definicion' => $def ]; break; } } } if ($foundWord) { // Encontrado: Servir el HTML del diccionario con metas inyectados dinámicamente $htmlPath = __DIR__ . '/diccionario.html'; if (file_exists($htmlPath)) { ob_start(); // Buffer de salida limpio $html = file_get_contents($htmlPath); // Sanitizar y escapar variables de forma segura para atributos HTML $cleanKichwa = htmlspecialchars($foundWord['palabra_ki'], ENT_QUOTES, 'UTF-8'); $cleanDef = htmlspecialchars($foundWord['definicion'], ENT_QUOTES, 'UTF-8'); // Reemplazar metas principales $title = $cleanKichwa . " en kichwa: significado y definición | Rimay"; $snippet = mb_substr($foundWord['definicion'], 0, 150, 'UTF-8'); $cleanSnippet = htmlspecialchars($snippet, ENT_QUOTES, 'UTF-8'); $desc = "¿Qué significa " . $cleanKichwa . " en kichwa? " . $cleanSnippet . ". Diccionario kichwa-español gratuito."; $ogTitle = $cleanKichwa . " en kichwa | Rimay"; $ogUrl = "https://rimay.org/diccionario.html?p=" . urlencode($foundWord['palabra_ki']); // Reemplazar en el HTML $html = preg_replace('/
Explora la riqueza del idioma kichwa y su vocabulario andino ancestral.
', "{$cleanKichwa} en kichwa significa: {$cleanDef}. Explora el diccionario kichwa-español completo a continuación.
", $html ); echo $html; ob_end_flush(); exit; } } else { // Redirigir si no se encuentra header("Location: https://rimay.org/diccionario.html", true, 302); exit; } } // BÚSQUEDAS DINÁMICAS (JSON API) header('Content-Type: application/json; charset=utf-8'); header('Access-Control-Allow-Origin: *'); // 2. Obtener parámetros de búsqueda y paginación (pg en lugar de p) $query = isset($_GET['q']) ? trim($_GET['q']) : ''; $letter = isset($_GET['l']) ? trim($_GET['l']) : 'TODAS'; $page = isset($_GET['pg']) ? (int)$_GET['pg'] : 1; $pageSize = 12; if ($page < 1) $page = 1; // 3. Cargar el JSON en memoria del servidor $rawData = json_decode(file_get_contents($jsonPath), true); if (!$rawData) { echo json_encode(['error' => 'Error al decodificar el archivo JSON']); exit; } $filtered = []; $normQuery = normalizar($query); // 4. Filtrar y ordenar en el servidor foreach ($rawData as $item) { $ki = isset($item['kichwa']) ? $item['kichwa'] : ''; // Mapear definición $def = ''; if (isset($item['definicion'])) { $def = $item['definicion']; } elseif (isset($item['espanol'])) { $def = is_array($item['espanol']) ? implode(', ', $item['espanol']) : $item['espanol']; } if (isset($item['notas']) && is_array($item['notas']) && count($item['notas']) > 0) { $def .= ' (' . implode(', ', $item['notas']) . ')'; } $normKi = normalizar($ki); $normDef = normalizar($def); // Filtro por letra if ($letter !== 'TODAS') { $firstChar = mb_substr($normKi, 0, 1, 'UTF-8'); if (mb_strtoupper($firstChar, 'UTF-8') !== $letter) { continue; } } // Filtro por término de búsqueda if ($normQuery !== '') { if (mb_strpos($normKi, $normQuery, 0, 'UTF-8') === false && mb_strpos($normDef, $normQuery, 0, 'UTF-8') === false) { continue; } } $filtered[] = [ 'palabra_ki' => $ki, 'definicion' => $def ]; } // Ordenar alfabéticamente por palabra_ki usort($filtered, function($a, $b) { return strcoll($a['palabra_ki'], $b['palabra_ki']); }); // 5. Paginación $total = count($filtered); $totalPages = ceil($total / $pageSize); $offset = ($page - 1) * $pageSize; $slice = array_slice($filtered, $offset, $pageSize); // 6. Retornar solo el pedazo necesario (pg en lugar de p) echo json_encode([ 'total' => $total, 'totalPages' => $totalPages, 'page' => $page, 'results' => $slice ]);