# Módulos de idioma

Cada subdirectorio es un módulo autocontenido:

- `manifest.json` declara código, nombre nativo, idioma de respaldo y catálogo.
- `catalog.json` relaciona el texto canónico en español con su traducción.
- `es` es el idioma canónico del código y no necesita duplicar sus textos.
- `en` contiene el catálogo inglés completo y puede regenerarse con
  `python scripts/generate_language_catalog.py en`.

El servidor descubre los módulos automáticamente; no hay una lista de idiomas
codificada en las rutas o las plantillas. El orden de selección es:

1. elección explícita del usuario;
2. preferencia guardada en su cuenta;
3. idioma compatible indicado por el navegador;
4. idioma predeterminado de la administración.

La preferencia de interfaz es independiente de `language_policy` y
`communication_language` en la configuración de cada universo. En modo
`single`, informes y mensajes se generan en el idioma del universo aunque la
interfaz personal esté en otro idioma. En modo `mixed`, se generan para el
idioma del destinatario.

El catálogo se aplica en el servidor al HTML y a las respuestas JSON. El
cliente carga el mismo módulo para traducir nodos creados después por
JavaScript, sin recargar la página ni cambiar el foco.
