Nieuws / ONI Games

Hoe we een gamesite van 300 pagina's in 16 talen bouwden met één Python-script

Geen CMS en geen framework: één Python-bestand schrijft elke pagina van onirealms.com in 16 talen, en een kleine Cloudflare Worker serveert ze.

We maken gratis games voor Android: twee idle RPG's, een blokpuzzel en een robotfabriek-tycoon. Elk ervan had een eigen pagina nodig, en elke pagina moest bestaan in elke taal waarin de games worden gespeeld. Dat zijn 16 taalversies: Engels, Duits, Spaans (Spanje en Latijns-Amerika), Frans, Kroatisch, Indonesisch, Italiaans, Japans, Koreaans, Portugees (Brazilië en Portugal), Russisch, Sloveens, Turks en Traditioneel Chinees.

Een CMS voelde als te veel machinerie voor een site die verandert als een game verandert. Dus heel onirealms.com wordt door één Python-script geschreven als gewone statische bestanden, met een kleine Cloudflare Worker ervoor.

Hoe het in elkaar zit

Het script, site.py, is één bestand van ongeveer 3.200 regels. Het bevat een woordenboek GAMES met één item per game: pakketnaam, thema, key art, de beeldbanden tussen secties, genres, leeftijdsclassificaties en of de game al uit is. Al het andere wordt daarvan afgeleid.

De teksten staan in gewone Python-woordenboeken met de taal als sleutel, één module per onderdeel: de homepage, elke game, de FAQ's, SEO-titels en -beschrijvingen, gidsen en nieuws. Een gamepagina is een functie die een game en een taal krijgt en HTML teruggeeft. Vier games in 16 talen, plus de homepage, nieuws, gidsen, een cyborgoverzicht, het privacybeleid en de perskit, komen samen op meer dan 300 pagina's. Een volledige build duurt ongeveer 26 seconden.

De store-art van Block Brain in het Japans, Duits en Russisch.
De store-art van Block Brain in het Japans, Duits en Russisch.

Drie dingen bleken belangrijker dan de generator zelf.

1. hreflang moet compleet zijn, anders doet het niets

Elke pagina linkt naar elke andere taalversie van zichzelf, inclusief zichzelf, plus een x-default. De sitemap herhaalt dezelfde groepen. Mis je er één, dan behandelen zoekmachines de pagina's als losse, bijna identieke kopieën. Het script bouwt deze links uit dezelfde taallijst die het gebruikt om de pagina's te schrijven, dus de twee kunnen niet uit elkaar groeien.

2. Taalomleidingen mogen crawlers niet vangen

De Worker stuurt een bezoeker die op een Engelse pagina landt naar dezelfde pagina in de taal van de browser. Dat is goed voor spelers en rampzalig voor zoekmachines als je het naïef doet, omdat een crawler dan alleen de omleiding zou zien. Daarom wordt de omleiding overgeslagen voor bots, overgeslagen als de bezoeker van een andere pagina van de site kwam (dan is Engels bewust gekozen), overgeslagen als het adres ?lang= bevat, en zet ze geen cookie. Het is een 302 met Vary: Accept-Language, nooit een 301.

3. Onveranderlijke bestanden hebben nieuwe bestandsnamen nodig

Alles onder /assets/ wordt geserveerd met Cache-Control: max-age=31536000, immutable. Dat is de juiste instelling, tot je een afbeelding verandert en niemand het een jaar lang ziet. De art-scripts schrijven voor elke nieuwe versie een nieuwe bestandsnaam in plaats van de oude te overschrijven.

Store-art voor alle vier de games: Block Brain in het Koreaans, Idle AI Factory in het Turks, Idle Summoner en Idle Ronin in het Engels.
Store-art voor alle vier de games: Block Brain in het Koreaans, Idle AI Factory in het Turks, Idle Summoner en Idle Ronin in het Engels.

Kleine onderdelen die hun waarde bewijzen

  • QR-codes op elke gamepagina, gemaakt tijdens de build. Ze wijzen naar een korte /go/<game>-link op de Worker, die doorstuurt naar Google Play met een referrer-tag, zodat de Play Console installaties per bron laat zien.
  • Analytics die rekening houdt met toestemming. De tag start met elke vorm van opslag geweigerd (consent mode v2) en gaat pas aan nadat de bezoeker de cookiebanner accepteert.
  • IndexNow na elke deploy, zodat Bing en Yandex wijzigingen dezelfde dag zien.
  • Een RSS-feed per taal, zodat feedlezers en aggregators het nieuws oppikken.
  • Perskits als ZIP-bestanden, door een script ingepakt uit de game-art.

Wat we anders zouden doen

De taallijst en de teksttabellen eerst schrijven, vóór de HTML, niet erna. 16 talen achteraf in markup proppen die van Engels uitging, was het traagste deel van het hele project: regellengtes, reserve-lettertypen voor Japans, Koreaans en Chinees, en een Cyrillisch reserve-lettertype voor Russisch hadden elk hun eigen ronde nodig.

De games zijn Idle Ronin: Cyber RPG, Idle Summoner: Pixel RPG, Block Brain en Idle AI Factory: Robot Tycoon, allemaal gratis op Google Play.

Al het nieuws

Al het nieuws