Tin tức / ONI Games

Cách chúng tôi xây trang web game 300 trang bằng 16 ngôn ngữ với một script Python

Không CMS, không framework: một file Python viết mọi trang của onirealms.com bằng 16 ngôn ngữ, và một Cloudflare Worker nhỏ phục vụ chúng.

Chúng tôi làm game miễn phí cho Android: hai game nhập vai idle, một game xếp khối và một game tycoon nhà máy robot. Mỗi game cần trang riêng, và mỗi trang phải có ở mọi ngôn ngữ mà game được chơi. Đó là 16 bản ngôn ngữ: tiếng Anh, tiếng Đức, tiếng Tây Ban Nha (Tây Ban Nha và Mỹ Latinh), tiếng Pháp, tiếng Croatia, tiếng Indonesia, tiếng Ý, tiếng Nhật, tiếng Hàn, tiếng Bồ Đào Nha (Brazil và Bồ Đào Nha), tiếng Nga, tiếng Slovenia, tiếng Thổ Nhĩ Kỳ và tiếng Trung phồn thể.

Một CMS có vẻ là quá nhiều máy móc cho một trang web chỉ thay đổi khi game thay đổi. Vì vậy toàn bộ onirealms.com được một script Python viết ra dưới dạng các file tĩnh đơn giản, và một Cloudflare Worker nhỏ đứng phía trước.

Hình hài của nó

Script site.py là một file duy nhất khoảng 3.200 dòng. Nó chứa một từ điển GAMES với một mục cho mỗi game: tên gói, giao diện, hình minh họa chính, các dải hình giữa các phần, thể loại, phân loại độ tuổi và game đã ra mắt hay chưa. Mọi thứ khác đều suy ra từ đó.

Văn bản nằm trong các từ điển Python đơn giản theo từng ngôn ngữ, mỗi khu vực một module: trang chủ, từng game, các câu hỏi thường gặp, tiêu đề và mô tả SEO, hướng dẫn và tin tức. Một trang game là một hàm nhận vào một game và một ngôn ngữ rồi trả về HTML. Bốn game bằng 16 ngôn ngữ, cộng thêm trang chủ, tin tức, hướng dẫn, danh sách cyborg, chính sách quyền riêng tư và bộ tài liệu báo chí, tổng cộng hơn 300 trang. Một lần build đầy đủ mất khoảng 26 giây.

Hình ảnh cửa hàng của Block Brain bằng tiếng Nhật, tiếng Đức và tiếng Nga.
Hình ảnh cửa hàng của Block Brain bằng tiếng Nhật, tiếng Đức và tiếng Nga.

Có ba điều hóa ra quan trọng hơn chính bộ sinh trang.

1. hreflang phải đầy đủ, nếu không thì vô tác dụng

Mỗi trang liên kết đến mọi phiên bản ngôn ngữ khác của chính nó, kể cả chính nó, cùng một x-default. Sitemap lặp lại cùng các nhóm đó. Thiếu một liên kết là công cụ tìm kiếm coi các trang như những bản gần trùng lặp không liên quan. Script tạo các liên kết này từ chính danh sách ngôn ngữ dùng để viết các trang, nên hai thứ không thể lệch nhau.

2. Chuyển hướng ngôn ngữ không được gài bẫy crawler

Worker đưa khách truy cập đến một trang tiếng Anh sang cùng trang đó bằng ngôn ngữ trình duyệt của họ. Điều đó tốt cho người chơi nhưng rất tệ cho tìm kiếm nếu làm một cách ngây thơ, vì crawler sẽ chỉ thấy mỗi lệnh chuyển hướng. Vì vậy việc chuyển hướng được bỏ qua với bot, bỏ qua khi khách đến từ một trang khác của trang web (họ cố ý chọn tiếng Anh), bỏ qua khi địa chỉ có ?lang=, và không đặt cookie nào. Đó là một lệnh 302 với Vary: Accept-Language, không bao giờ là 301.

3. Tài nguyên bất biến cần tên file mới

Mọi thứ trong /assets/ được phục vụ với Cache-Control: max-age=31536000, immutable. Đó là thiết lập đúng, cho đến khi bạn đổi một bức ảnh và cả năm không ai thấy. Các script tạo hình ghi một tên file mới cho mỗi phiên bản mới thay vì ghi đè lên file cũ.

Hình ảnh cửa hàng của cả bốn game: Block Brain bằng tiếng Hàn, Idle AI Factory bằng tiếng Thổ Nhĩ Kỳ, Idle Summoner và Idle Ronin bằng tiếng Anh.
Hình ảnh cửa hàng của cả bốn game: Block Brain bằng tiếng Hàn, Idle AI Factory bằng tiếng Thổ Nhĩ Kỳ, Idle Summoner và Idle Ronin bằng tiếng Anh.

Những phần nhỏ đáng giá

  • Mã QR trên mọi trang game, được tạo trong lúc build. Chúng trỏ đến một liên kết ngắn /go/<game> trên Worker, liên kết này chuyển tiếp sang Google Play kèm thẻ nguồn giới thiệu, nên Play Console hiển thị lượt cài theo từng nguồn.
  • Phân tích tôn trọng sự đồng ý. Thẻ bắt đầu với mọi loại lưu trữ bị từ chối (consent mode v2) và chỉ bật sau khi khách chấp nhận trong banner cookie.
  • IndexNow sau mỗi lần deploy, để Bing và Yandex thấy thay đổi ngay trong ngày.
  • Một nguồn cấp RSS cho mỗi ngôn ngữ, để các trình đọc tin và trang tổng hợp lấy được tin tức.
  • Bộ tài liệu báo chí dạng file ZIP, được một script đóng gói từ hình ảnh game.

Nếu làm lại, chúng tôi sẽ làm khác gì

Viết danh sách ngôn ngữ và các bảng văn bản trước HTML, chứ không phải sau. Nhồi 16 ngôn ngữ vào phần markup vốn mặc định là tiếng Anh là phần chậm nhất của cả dự án: độ dài dòng, font dự phòng cho tiếng Nhật, tiếng Hàn và tiếng Trung, và một font dự phòng Cyrillic cho tiếng Nga đều cần xử lý riêng.

Các game là Idle Ronin: Cyber RPG, Idle Summoner: Pixel RPG, Block Brain và Idle AI Factory: Robot Tycoon, tất cả đều miễn phí trên Google Play.

Tất cả tin tức

Tất cả tin tức
Block Brain đã có mặt trên Google Play

· Block Brain: Block Puzzle Game

Block Brain đã có mặt trên Google Play

Game xếp khối của chúng tôi đã trở lại với người bạn Brain lớn lên cùng bạn, Daily Puzzle, Brain Express, Adventure và giải đấu hằng tuần. Miễn phí trên Android.

Đọc thêm →