Multiidioma: traducciones reales con Gemma 4B local (arreglar fontanería + cola priorizada + on-demand) #11
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Labels: area:content, area:plugin, improvement
Resumen
El multiidioma de feadulta "no está bien": la estructura existe (Polylang, 5 idiomas, selector) pero el corpus de artículos no está traducido ni enlazado entre idiomas, así que cambiar de idioma en un artículo no lleva a ninguna parte útil. Este issue analiza el estado real y propone una solución por fases usando Gemma 4 4B local para generar traducciones, sin intentar traducir los 24k artículos de golpe.
Estado actual verificado
Configuración Polylang
/en/), fr (/fr/), it (/it/), pt (/pt/).force_lang=1(directory mode),hide_default=1,rewrite=1.post_typesytaxonomiesvacíos (built-inpost/pagelos gestiona Polylang por defecto, OK).El dato que lo explica todo
Pero solo hay 189 grupos de traducción (
taxonomy=post_translations), de los cuales 187 enlazan los 5 idiomas. Es decir:Síntomas / lo que está roto
fea-homepage.php:296usapll_the_languages(['raw'=>1,'hide_if_no_translation'=>0])→ muestra los 5 idiomas siempre, aunque el artículo no tenga traducción. Al pulsar EN en un artículo ES sin traducción, Polylang lleva a la portada del idioma (o a la home), no a una traducción → UX confusa.WP_Tax_QuerygeneraAND 0=1conget_posts(['lang'=>$lang,'category__in'=>[$cat]])→ no pasarlangexplícito, Polylang ya filtra.get_term_by('slug',...)devuelve false en idioma ≠ ES → usar$wpdbdirecto.Decisión: motor y modalidad (2026-06-16)
Motor = Gemma 4B local. Modalidad = pre-generar páginas reales (NO traducción on-the-fly).
Se valoró meter un traductor on-the-fly (widget tipo Google Translate / GTranslate free, que traduce en el navegador al vuelo). Descartado por:
→ Conclusión: Gemma 4B local, pre-generando posts reales de Polylang (indexables, con hreflang). La fluidez es algo menor que DeepL/Google pero es gratis, privada y da el SEO que importa. La modalidad "bajo demanda" de abajo sigue generando un post real cacheado (no es on-the-fly de navegador).
Solución propuesta (por fases)
Premisa estratégica: NO traducir los 24.261 artículos × 4 idiomas (= ~97k traducciones; a ~45s/artículo con Gemma serían ~50 días de cómputo y poco valor para la mayoría del archivo histórico). Se prioriza y se traduce bajo demanda + lo central.
Fase 0 — Arreglar la fontanería (lo que falla hoy, sin traducir nada)
hide_if_no_translation=1→ en artículos mono-idioma no se muestra el conmutador (limpio, pero "esconde" el multiidioma).get_term_by/WP_Tax_Query)./en/ /fr/ /it/ /pt/listan el contenido nativo de ese idioma (categorías/archivos por idioma), para que esos 3.755 posts dejen de ser invisibles.<head>para SEO y que no apunta a traducciones inexistentes.Fase 1 — Traducción con Gemma 4B local (priorizada + on-demand)
Pipeline
translate_post.py(patrón debackfill_bilingual.pyde ytsummaries, que ya hace ES→EN con Polylang):post_contentHTML).http://172.19.128.1:1234/v1) traduce preservando: marcado HTML, shortcodes, citas bíblicas (no traducir referencias tipo "Jn 3,16"), nombres propios, y un glosario fijo del proyecto ("fe adulta", términos teológicos, nombres de secciones).pll_set_post_language($id,$lang)+pll_save_post_translations(['es'=>$es,'en'=>$en,...]).traduccion_automatica=1+traduccion_modelo/traduccion_fecha(transparencia + permite regenerar).Priorización (qué traducir, en orden):
Calidad: Gemma 4B validado para traducción feadulta (bench #52, milestone modelos). Para textos doctrinalmente sensibles, considerar revisión humana o escalado puntual a frontier (Opus/GPT-5) en cartas clave. Mostrar badge "traducción automática".
Fase 2 — On-demand en vivo (opcional)
Consideraciones técnicas
/web/wp-nuevo(sin scp →ssh 'cat > ruta'; sinproc_open;mysql --default-character-set=utf8mb4). Decidir si se generan directamente en prod por cron Hermes.wp pll: usarwp eval-filecon funcionespll_*(igual que ytsummaries).Plan de ejecución
translate_post.py+ glosario + idempotencia (validar con 10-20 cartas).Ficheros y referencias
wordpress/wp-content/mu-plugins/fea-homepage.php:231-330(CSS +pll_the_languages).ytsummaries/scripts/backfill_bilingual.py(ES→EN Polylang, estado/reanudable).wp_options(polylang).Criterios de aceptación (incrementales)
translate_post.pytraduce y enlaza correctamente una carta de muestra en los 4 idiomas, preservando HTML/citas/nombres.<head>para los posts traducidos.