Novice / ONI Games

Kako smo z eno Python skripto zgradili spletno stran s 300 stranmi v 16 jezikih

Brez CMS-ja in brez ogrodja: ena Python datoteka napiše vsako stran onirealms.com v 16 jezikih, majhen Cloudflare Worker pa jih streže.

Delamo brezplačne igre za Android: dve idle RPG igri, blokovno uganko in tycoon s tovarno robotov. Vsaka je potrebovala svojo stran in vsaka stran je morala obstajati v vseh jezikih, v katerih se igre igrajo. To je 16 jezikovnih različic: angleščina, nemščina, španščina (Španija in Latinska Amerika), francoščina, hrvaščina, indonezijščina, italijanščina, japonščina, korejščina, portugalščina (Brazilija in Portugalska), ruščina, slovenščina, turščina in tradicionalna kitajščina.

CMS se nam je zdel preveč mašinerije za stran, ki se spremeni, ko se spremeni igra. Zato celoten onirealms.com napiše ena Python skripta kot navadne statične datoteke, pred njimi pa stoji majhen Cloudflare Worker.

Kako je sestavljena

Skripta site.py je ena datoteka s približno 3.200 vrsticami. V njej je slovar GAMES z enim vnosom za vsako igro: ime paketa, tema, glavna ilustracija, ilustrirani pasovi med razdelki, žanri, starostne oznake in ali je igra že objavljena. Vse ostalo izhaja iz tega.

Besedila so v navadnih Python slovarjih po jezikih, en modul za vsako področje: domača stran, vsaka igra, pogosta vprašanja, SEO naslovi in opisi, vodiči in novice. Stran igre je funkcija, ki dobi igro in jezik ter vrne HTML. Štiri igre v 16 jezikih, skupaj z domačo stranjo, novicami, vodiči, seznamom kiborgov, politiko zasebnosti in novinarskim kompletom, dajo več kot 300 strani. Celotna gradnja traja približno 26 sekund.

Slike iz trgovine za Block Brain v japonščini, nemščini in ruščini.
Slike iz trgovine za Block Brain v japonščini, nemščini in ruščini.

Na koncu so bile tri stvari pomembnejše od samega generatorja.

1. hreflang mora biti popoln, sicer ne naredi nič

Vsaka stran se poveže na vse svoje jezikovne različice, tudi nase, in še na x-default. Sitemap ponovi iste skupine. Če ena manjka, iskalniki strani obravnavajo kot nepovezane skoraj-dvojnike. Skripta te povezave zgradi iz istega seznama jezikov, s katerim piše strani, zato se ne moreta razhajati.

2. Jezikovne preusmeritve ne smejo ujeti pajkov

Worker obiskovalca, ki pride na angleško stran, pošlje na isto stran v jeziku njegovega brskalnika. Za igralce je to dobro, za iskalnike pa pogubno, če je narejeno naivno, saj bi pajek vedno videl le preusmeritev. Zato se preusmeritev ne zgodi za bote, ne za obiskovalca, ki pride z druge strani našega spletišča (angleščino je izbral namenoma), ne, ko naslov vsebuje ?lang=, in ne uporablja piškotka. Gre za 302 z Vary: Accept-Language, nikoli za 301.

3. Nespremenljive datoteke potrebujejo nova imena

Vse pod /assets/ se streže s Cache-Control: max-age=31536000, immutable. To je prava nastavitev, dokler ne zamenjaš slike in je leto dni nihče ne vidi. Zato skripte za grafiko za vsako novo različico zapišejo novo ime datoteke, namesto da bi prepisale staro.

Slike iz trgovine za vse štiri igre: Block Brain v korejščini, Idle AI Factory v turščini, Idle Summoner in Idle Ronin v angleščini.
Slike iz trgovine za vse štiri igre: Block Brain v korejščini, Idle AI Factory v turščini, Idle Summoner in Idle Ronin v angleščini.

Malenkosti, ki se splačajo

  • QR kode na vsaki strani igre, ustvarjene med gradnjo. Kažejo na kratko povezavo /go/<game> na Workerju, ki preusmeri na Google Play z oznako vira, zato Play Console pokaže namestitve po virih.
  • Analitika s privolitvijo. Oznaka se začne z vsemi vrstami shranjevanja zavrnjenimi (consent mode v2) in se vklopi šele, ko obiskovalec pritrdi v pasici za piškotke.
  • IndexNow po vsaki objavi, da Bing in Yandex spremembe vidita še isti dan.
  • RSS vir za vsak jezik, da bralniki virov in agregatorji poberejo novice.
  • Novinarski kompleti kot ZIP datoteke, ki jih skripta zapakira iz grafik iger.

Kaj bi naredili drugače

Seznam jezikov in tabele besedil napisati pred HTML-jem, ne za njim. Naknadno vstavljanje 16 jezikov v kodo, ki je predvidevala angleščino, je bil najpočasnejši del celotnega projekta: dolžina vrstic, nadomestne pisave za japonščino, korejščino in kitajščino ter nadomestna cirilična pisava za ruščino so vsaka zahtevale svoj krog.

Igre so Idle Ronin: Cyber RPG, Idle Summoner: Pixel RPG, Block Brain in Idle AI Factory: Robot Tycoon, vse brezplačne na Google Playu.

Vse novice

Vse novice