Notizie / ONI Games

Come abbiamo creato un sito di 300 pagine in 16 lingue con un solo script Python

Niente CMS e niente framework: un file Python scrive ogni pagina di onirealms.com in 16 lingue e un piccolo Cloudflare Worker le serve.

Creiamo giochi gratuiti per Android: due RPG idle, un puzzle a blocchi e un tycoon di fabbrica di robot. Ognuno aveva bisogno di una sua pagina, e ogni pagina doveva esistere in tutte le lingue in cui si gioca. Sono 16 versioni: inglese, tedesco, spagnolo (Spagna e America Latina), francese, croato, indonesiano, italiano, giapponese, coreano, portoghese (Brasile e Portogallo), russo, sloveno, turco e cinese tradizionale.

Un CMS ci sembrava troppo per un sito che cambia quando cambia un gioco. Così tutto onirealms.com viene scritto da un unico script Python come semplici file statici, con un piccolo Cloudflare Worker davanti.

Com’è fatto

Lo script, site.py, è un unico file di circa 3.200 righe. Contiene un dizionario GAMES con una voce per gioco: nome del pacchetto, tema, key art, le fasce illustrate tra le sezioni, generi, classificazioni d’età e se il gioco è già pubblicato. Tutto il resto deriva da lì.

I testi stanno in normali dizionari Python divisi per lingua, un modulo per area: la home, ogni gioco, le FAQ, titoli e descrizioni SEO, guide e notizie. Una pagina di gioco è una funzione che riceve un gioco e una lingua e restituisce HTML. Quattro giochi in 16 lingue, più home, notizie, guide, un elenco di cyborg, l’informativa sulla privacy e il press kit, fanno più di 300 pagine. Una build completa richiede circa 26 secondi.

La grafica dello store di Block Brain in giapponese, tedesco e russo.
La grafica dello store di Block Brain in giapponese, tedesco e russo.

Alla fine, tre cose hanno contato più del generatore stesso.

1. hreflang deve essere completo, altrimenti non serve a niente

Ogni pagina rimanda a tutte le sue altre versioni linguistiche, compresa sé stessa, più un x-default. La sitemap ripete gli stessi gruppi. Se ne manca uno, i motori di ricerca trattano le pagine come quasi-duplicati scollegati. Lo script costruisce questi link dalla stessa lista di lingue con cui scrive le pagine, quindi non possono andare fuori sincrono.

2. I reindirizzamenti di lingua non devono intrappolare i crawler

Il Worker manda il visitatore che arriva su una pagina inglese alla stessa pagina nella lingua del suo browser. È utile per i giocatori e disastroso per la ricerca se fatto in modo ingenuo, perché un crawler vedrebbe solo il reindirizzamento. Per questo non si reindirizzano i bot, né chi arriva da un’altra pagina del sito (ha scelto l’inglese di proposito), né quando l’indirizzo contiene ?lang=, e non si usa nessun cookie. È un 302 con Vary: Accept-Language, mai un 301.

3. Le risorse immutabili hanno bisogno di nomi nuovi

Tutto ciò che sta sotto /assets/ è servito con Cache-Control: max-age=31536000, immutable. È l’impostazione giusta, finché non cambi un’immagine e nessuno la vede per un anno. Per questo gli script grafici scrivono un nuovo nome di file per ogni nuova versione invece di sovrascrivere quella vecchia.

La grafica dello store di tutti e quattro i giochi: Block Brain in coreano, Idle AI Factory in turco, Idle Summoner e Idle Ronin in inglese.
La grafica dello store di tutti e quattro i giochi: Block Brain in coreano, Idle AI Factory in turco, Idle Summoner e Idle Ronin in inglese.

Piccoli pezzi che valgono la pena

  • Codici QR su ogni pagina di gioco, generati durante la build. Puntano a un link breve /go/<game> sul Worker, che porta a Google Play con un tag di provenienza, così la Play Console mostra le installazioni per fonte.
  • Analytics basate sul consenso. Il tag parte con ogni tipo di archiviazione negato (consent mode v2) e si attiva solo dopo che il visitatore accetta nel banner dei cookie.
  • IndexNow dopo ogni deploy, così Bing e Yandex vedono le modifiche in giornata.
  • Un feed RSS per lingua, così lettori di feed e aggregatori raccolgono le notizie.
  • Press kit in file ZIP, preparati da uno script a partire dalla grafica dei giochi.

Cosa faremmo diversamente

Scrivere la lista delle lingue e le tabelle dei testi prima dell’HTML, non dopo. Adattare 16 lingue a un markup pensato per l’inglese è stata la parte più lenta dell’intero progetto: lunghezza delle righe, font di riserva per giapponese, coreano e cinese e un font cirillico di riserva per il russo hanno richiesto ognuno un passaggio a parte.

I giochi sono Idle Ronin: Cyber RPG, Idle Summoner: Pixel RPG, Block Brain e Idle AI Factory: Robot Tycoon, tutti gratuiti su Google Play.

Tutte le notizie

Tutte le notizie