
Noticias / ONI Games
Cómo creamos una web de 300 páginas en 16 idiomas con un solo script de Python
Sin CMS ni framework: un archivo de Python escribe cada página de onirealms.com en 16 idiomas y un pequeño Cloudflare Worker las sirve.
Hacemos juegos gratuitos para Android: dos RPG idle, un puzle de bloques y un tycoon de fábrica de robots. Cada uno necesitaba su propia página, y cada página tenía que existir en todos los idiomas en los que se juegan. Son 16 versiones: inglés, alemán, español (España y Latinoamérica), francés, croata, indonesio, italiano, japonés, coreano, portugués (Brasil y Portugal), ruso, esloveno, turco y chino tradicional.
Un CMS nos parecía demasiada maquinaria para una web que cambia cuando cambia un juego. Así que todo onirealms.com lo escribe un único script de Python como archivos estáticos, con un pequeño Cloudflare Worker delante.
Cómo está hecho
El script, site.py, es un único archivo de unas 3.200 líneas. Contiene un diccionario GAMES con una entrada por juego: nombre de paquete, tema, arte principal, las franjas de arte entre secciones, géneros, clasificaciones por edad y si el juego ya está publicado. Todo lo demás se deriva de ahí.
Los textos viven en diccionarios de Python normales, ordenados por idioma, un módulo por sección: la portada, cada juego, las preguntas frecuentes, títulos y descripciones SEO, guías y noticias. Una página de juego es una función que recibe un juego y un idioma y devuelve HTML. Cuatro juegos en 16 idiomas, más la portada, noticias, guías, un catálogo de cíborgs, la política de privacidad y el kit de prensa, suman más de 300 páginas. Una compilación completa tarda unos 26 segundos.

Al final, tres cosas importaron más que el propio generador.
1. hreflang tiene que estar completo o no sirve de nada
Cada página enlaza a todas sus demás versiones de idioma, incluida ella misma, más un x-default. El sitemap repite los mismos grupos. Si falta uno, los buscadores tratan las páginas como casi duplicados sin relación. El script genera estos enlaces a partir de la misma lista de idiomas con la que escribe las páginas, así que no pueden desincronizarse.
2. Las redirecciones de idioma no deben atrapar a los rastreadores
El Worker envía al visitante que llega a una página en inglés a la misma página en el idioma de su navegador. Es bueno para los jugadores y terrible para el SEO si se hace de forma ingenua, porque un rastreador solo vería la redirección. Por eso no se redirige a los bots, ni al visitante que viene de otra página del sitio (eligió el inglés a propósito), ni cuando la dirección lleva ?lang=, y no se usa ninguna cookie. Es un 302 con Vary: Accept-Language, nunca un 301.
3. Los recursos inmutables necesitan nombres nuevos
Todo lo que hay en /assets/ se sirve con Cache-Control: max-age=31536000, immutable. Es la configuración correcta hasta que cambias una imagen y nadie la ve durante un año. Por eso los scripts de arte escriben un nombre de archivo nuevo para cada versión en lugar de sobrescribir el anterior.

Pequeñas piezas que merecen la pena
- Códigos QR en cada página de juego, generados en la compilación. Apuntan a un enlace corto
/go/<game>del Worker, que redirige a Google Play con una etiqueta de referencia, así Play Console muestra las instalaciones por origen. - Analítica con consentimiento. La etiqueta empieza con todo el almacenamiento denegado (consent mode v2) y solo se activa cuando el visitante acepta en el banner de cookies.
- IndexNow tras cada despliegue, para que Bing y Yandex vean los cambios el mismo día.
- Un feed RSS por idioma, para que los lectores de feeds y los agregadores recojan las noticias.
- Kits de prensa en archivos ZIP, empaquetados por un script a partir del arte de los juegos.
Qué haríamos de otra manera
Escribir la lista de idiomas y las tablas de textos antes del HTML, no después. Adaptar 16 idiomas a un marcado pensado para el inglés fue la parte más lenta de todo el proyecto: la longitud de las líneas, las fuentes de respaldo para japonés, coreano y chino, y una de respaldo cirílica para el ruso necesitaron cada una su propia pasada.
Los juegos son Idle Ronin: Cyber RPG, Idle Summoner: Pixel RPG, Block Brain e Idle AI Factory: Robot Tycoon, todos gratis en Google Play.







