Reviviendo Praderas (Día 8) — Fase 5: dos idiomas sin romper URLs históricas
Tras SEO (Fase 4), el siguiente bloque acordado era Phase 5: multilingüe. La restricción principal era no mover de golpe las decenas de entradas en español que ya viven en /blog/...: el modelo adoptado mantiene el español donde está y añade inglés en rutas nuevas y previsibles.
Qué implementamos
-
Árbol de contenido (Opción A, afinada en código)
- Entradas en español: siguen en
content/blog/*.md→ URLs/blog/slug. - Entradas en inglés:
content/blog/en/*.md→/blog/en/slug. - Páginas solo UI/copy en inglés (por ahora):
content/en/*.md→/en/slug(por ejemplo portada y listado/en/blog).
- Entradas en español: siguen en
-
Front matter para emparejar traducciones
Lang: es | en(opcional si el idioma se deduce de la ruta).Translation_Key: misma cadena en el par ES/EN para que el sitio sepa que son la misma pieza editorial.
La portada española (content/index.md) y la inglesa (content/en/index.md) comparten clavepraderas-homepara que el conmutador aparezca también en la home.
-
Plugin
plugins/65-Multilingual.php- Registra metadatos, construye pares por clave y expone a Twig:
content_lang,html_lang,og_locale,og_locale_alternate,alternate_language_page,pradera_home_url,hreflang_alternates. - Inferencia de idioma:
Langexplícito; si no, rutablog/en/o prefijoen/→ inglés; si no, español.
- Registra metadatos, construye pares por clave y expone a Twig:
-
Tema y SEO social
page-meta.twig:og:localedinámico,og:locale:alternatecuando hay par, y<link rel="alternate" hreflang="...">(incluidox-defaulthacia la URL española cuando existen las dos).- Plantillas base:
html lang="..."según página; marca del navbar apunta a la home del idioma actual (pradera_home_url). lang-switcher.twigincluido desdenav.twigcuando existe página alterna.
-
Listados y plugins coherentes con el idioma
- Paginación (
10-Pagination.php): el índice/blogsolo considera postsblog/*excluyendoblog/en/*. El inglés se lista enblog-en.twig(/en/blog). - Vecinos y relacionadas (
50-BlogNeighbors.php): prev/next y relacionadas mismo idioma que el post actual; conteos de etiquetas en Categorías solo desde posts ES. - Series (
60-SeriesCollections.php): mapas por idioma; el hub/seriessigue centrado en la narrativa en español; en posts EN se usa el mapa inglés cuando aplica. - Archivo (
archive.twig): solo entradas españolas (misma URL/archivoque antes). - Búsqueda (
40-PicoSearch.php+config/config.yml): listalow_value_words_enusada cuando la página actual es en.
- Paginación (
-
Sidebar bilingüe
- Etiquetas de widget y “Artículos recientes” en inglés cuando
content_lang == 'en'; recientes EN solo bajoblog/en/.
- Etiquetas de widget y “Artículos recientes” en inglés cuando
Qué queda fuera (por ahora)
- Traducir masivamente el archivo histórico: solo hay una entrada EN de ejemplo emparejada con esta (Día 8); el resto puede ir sumando claves cuando haya criterio editorial.
- Sitemap por idioma y JSON (Phase 6): siguen en el plan; no bloquean el arranque de Phase 5.
- Página “Acerca” en inglés dedicada: el nav EN enlaza aún al markdown español; se puede añadir
content/en/about.mden una iteración pequeña.
Cierre del Día 8
Fase 5 deja un cimiento técnico claro: rutas, metadatos, SEO entre idiomas y UX mínima (conmutador + copy lateral). La deuda editorial es contenido, no el modelo del repo.