Haberler / ONI Games

Tek bir Python betiğiyle 16 dilde 300 sayfalık oyun sitesini nasıl kurduk

CMS yok, framework yok: tek bir Python dosyası onirealms.com'un her sayfasını 16 dilde yazıyor, küçük bir Cloudflare Worker da sunuyor.

Android için ücretsiz oyunlar yapıyoruz: iki idle RPG, bir blok bulmaca ve bir robot fabrikası tycoon oyunu. Her birinin kendi sayfası olmalıydı ve her sayfa, oyunların oynandığı tüm dillerde bulunmalıydı. Bu da 16 sürüm demek: İngilizce, Almanca, İspanyolca (İspanya ve Latin Amerika), Fransızca, Hırvatça, Endonezce, İtalyanca, Japonca, Korece, Portekizce (Brezilya ve Portekiz), Rusça, Slovence, Türkçe ve Geleneksel Çince.

Bir oyun değiştiğinde değişen bir site için CMS bize fazla ağır geldi. Bu yüzden onirealms.com sitesinin tamamını tek bir Python betiği düz statik dosyalar olarak yazıyor, önünde de küçük bir Cloudflare Worker duruyor.

Nasıl kurulu

Betik, site.py, yaklaşık 3.200 satırlık tek bir dosya. İçinde her oyun için bir kayıt bulunan bir GAMES sözlüğü var: paket adı, tema, ana görsel, bölümler arasındaki görsel bantlar, türler, yaş derecelendirmeleri ve oyunun yayında olup olmadığı. Geri kalan her şey buradan türetiliyor.

Metinler dile göre ayrılmış sıradan Python sözlüklerinde duruyor, her alan için bir modül: ana sayfa, her oyun, SSS, SEO başlıkları ve açıklamaları, rehberler ve haberler. Bir oyun sayfası, bir oyun ve bir dil alıp HTML döndüren bir fonksiyon. 16 dilde dört oyun, artı ana sayfa, haberler, rehberler, bir siborg listesi, gizlilik politikası ve basın kiti 300'ü aşkın sayfa ediyor. Tam bir derleme yaklaşık 26 saniye sürüyor.

Block Brain'in Japonca, Almanca ve Rusça mağaza görselleri.
Block Brain'in Japonca, Almanca ve Rusça mağaza görselleri.

Sonunda üç şey, jeneratörün kendisinden daha önemli çıktı.

1. hreflang eksiksiz olmalı, yoksa hiçbir işe yaramaz

Her sayfa, kendisi de dahil olmak üzere tüm dil sürümlerine ve bir x-default'a bağlantı veriyor. Site haritası aynı grupları tekrarlıyor. Biri eksik olursa arama motorları sayfaları birbiriyle ilgisiz, neredeyse kopya sayfalar olarak görüyor. Betik bu bağlantıları, sayfaları yazarken kullandığı dil listesinin aynısından üretiyor, bu yüzden ikisi birbirinden kopamıyor.

2. Dil yönlendirmeleri tarayıcı botları hapsetmemeli

Worker, İngilizce bir sayfaya gelen ziyaretçiyi aynı sayfanın tarayıcı dilindeki sürümüne gönderiyor. Bu oyuncular için iyi, ama özensiz yapılırsa arama için felaket, çünkü tarayıcı bot yalnızca yönlendirmeyi görür. Bu yüzden botlar yönlendirilmiyor, sitenin başka bir sayfasından gelen ziyaretçi (İngilizceyi bilerek seçmiştir) yönlendirilmiyor, adreste ?lang= varsa yönlendirme kapanıyor ve çerez kullanılmıyor. Bu, Vary: Accept-Language içeren bir 302, asla 301 değil.

3. Değişmez dosyalar yeni adlar ister

/assets/ altındaki her şey Cache-Control: max-age=31536000, immutable ile sunuluyor. Bir görseli değiştirip bir yıl boyunca kimsenin görmediği ana kadar bu doğru ayar. Bu yüzden görsel betikleri eski dosyanın üzerine yazmak yerine her yeni sürüm için yeni bir dosya adı yazıyor.

Dört oyunun mağaza görselleri: Korece Block Brain, Türkçe Idle AI Factory, İngilizce Idle Summoner ve Idle Ronin.
Dört oyunun mağaza görselleri: Korece Block Brain, Türkçe Idle AI Factory, İngilizce Idle Summoner ve Idle Ronin.

Emeğinin karşılığını veren küçük parçalar

  • Her oyun sayfasında derleme sırasında üretilen QR kodlar. Worker'daki kısa /go/<game> bağlantısına gidiyor, o da bir yönlendiren etiketiyle Google Play'e aktarıyor; böylece Play Console kaynağa göre yüklemeleri gösteriyor.
  • İzne dayalı analitik. Etiket tüm depolama türleri reddedilmiş olarak başlıyor (consent mode v2) ve ancak ziyaretçi çerez bandında onay verince açılıyor.
  • Her yayından sonra IndexNow; böylece Bing ve Yandex değişiklikleri aynı gün görüyor.
  • Her dil için bir RSS akışı; böylece akış okuyucular ve toplayıcılar haberleri alıyor.
  • ZIP dosyası olarak basın kitleri; bir betik bunları oyun görsellerinden hazırlıyor.

Farklı yapacağımız şey

Dil listesini ve metin tablolarını HTML'den önce yazmak, sonra değil. İngilizceye göre yazılmış işaretlemeye sonradan 16 dil eklemek tüm projenin en yavaş kısmıydı: satır uzunlukları, Japonca, Korece ve Çince için yedek yazı tipleri ve Rusça için Kiril yedek yazı tipi her biri ayrı bir tur gerektirdi.

Oyunlarımız Idle Ronin: Cyber RPG, Idle Summoner: Pixel RPG, Block Brain ve Idle AI Factory: Robot Tycoon; hepsi Google Play'de ücretsiz.

Tüm haberler

Tüm haberler