Cách tôi đưa trang web game trình duyệt của mình lên 8 ngôn ngữ (Python, Docker và một LLM miễn phí)
Trước hết: tôi là người Hàn Quốc và viết bài này với sự trợ giúp của công cụ dịch, mong các bạn bỏ qua nếu có chỗ chưa tự nhiên.
Tôi tự vận hành một mình Yeoul Games (여울게임터) tại Hàn Quốc từ tháng 9/2026. Đây là nơi các nhà phát triển độc lập đăng game trình duyệt để ai cũng có thể chơi ngay, không cần đăng ký hay cài đặt. Ban đầu trang chỉ để chứa game của tôi và một MUD văn bản tiếng Hàn, sau đó các nhà phát triển cá nhân khác ở Hàn Quốc cũng bắt đầu đăng game lên.
Trang chạy bằng Docker trên một NAS Synology đặt tại nhà, máy chủ web viết bằng Python. Tháng 10/2026, giao diện hỗ trợ 8 ngôn ngữ: tiếng Hàn, tiếng Anh, tiếng Nhật, tiếng Bồ Đào Nha, tiếng Tây Ban Nha, tiếng Việt, tiếng Thổ Nhĩ Kỳ và tiếng Đức — chỉ cần thêm ?lang=vi vào địa chỉ.
Cách làm đa ngôn ngữ
- Bảng dịch cho chữ cố định — Mọi câu trên giao diện nằm trong một file JSON. Mỗi phản hồi HTML đi qua một bộ lọc thay câu gốc bằng bản dịch. Khi một câu bị chia bởi thẻ HTML, khóa vẫn là cả câu để thay thế chính xác.
- Mô tả game — Khi đăng game, nhà phát triển đánh dấu những ngôn ngữ mà chính game hỗ trợ. Dù đánh dấu thế nào, phần mô tả vẫn được gửi tới API miễn phí của Groq để dịch sang 7 ngôn ngữ còn lại, để người chơi Việt Nam ít nhất cũng hiểu game nói về gì, kể cả khi game chỉ có tiếng Hàn. Một luồng nền so sánh mã băm của bản gốc; nếu nhà phát triển sửa mô tả, bản dịch được làm lại.
- Thông báo và quy định — Tôi viết bằng tiếng Hàn, bản dịch máy được hiển thị kèm liên kết tới bản gốc (bản gốc là bản có hiệu lực). Bài viết của người dùng giữ nguyên như khi họ viết.
- Lọc theo ngôn ngữ — Ở giao diện không phải tiếng Hàn, có thể lọc "game chơi được bằng ngôn ngữ của tôi" dựa trên đánh dấu của nhà phát triển.
Đoạn code (trích)
Đây là phần dịch tự động mô tả, lấy từ code thật (bỏ qua phần đọc khóa API và lưu file).
import hashlib, json, re, time
def src_hash(src, fields):
"""dấu vân tay của các trường cần dịch (tên, mô tả...)"""
body = {f: canon(get_field(src, f)) for f in sorted(fields)}
raw = json.dumps(body, ensure_ascii=False, sort_keys=True, separators=(",", ":"))
return hashlib.sha256(raw.encode("utf-8")).hexdigest()[:16]
def auto_ok(src, tr):
"""loại bản dịch nếu còn sót chữ Hàn không có trong bản gốc"""
if isinstance(src, list):
return isinstance(tr, list) and len(tr) == len(src) and all(auto_ok(a, b) for a, b in zip(src, tr))
if not isinstance(tr, str) or not tr.strip():
return False
return all(w in str(src) for w in re.findall(r"[가-힣]+", tr))
def auto_loop():
time.sleep(90)
while True:
r = auto_once() # mỗi lần: 1 game × 1 nhóm ngôn ngữ
time.sleep(70 if r else 240) # nghỉ để không vượt giới hạn miễn phí
Khi hiển thị, bản dịch chỉ được dùng nếu _src đã lưu (dấu vân tay lúc dịch) khớp với văn bản hiện tại. Nếu nhà phát triển sửa mô tả, bản gốc tiếng Hàn sẽ hiện cho đến khi có bản dịch mới — không bao giờ có bản dịch cũ mô tả sai nội dung.
Chỗ tôi bị mắc
Gói miễn phí của Groq có giới hạn token mỗi phút, nên tôi gặp lỗi HTTP 413 và 429. Cách giải quyết: mỗi lần chỉ gửi ít (1 game × 1 nhóm ngôn ngữ), giới hạn max_tokens và nghỉ 70 giây giữa các yêu cầu (240 giây khi không có việc). Dù vậy vẫn có vài bản dịch còn sót chữ Hàn ở cuối câu. Lúc đầu tôi sửa tay, sau đó thêm hàm auto_ok ở trên để tự động loại bỏ.
Những gì chưa làm được
Hiện có 42 game, hầu hết của các nhà phát triển cá nhân Hàn Quốc, và nội dung trong game vẫn là tiếng Hàn. Gần như chưa có game nào chơi được bằng tiếng Việt. Chỉ giao diện và mô tả được dịch, và bản dịch máy đôi chỗ còn vụng.
Dành cho người làm game trình duyệt
Nếu bạn làm game trình duyệt và muốn người chơi Hàn Quốc (và các ngôn ngữ khác) biết đến game của mình, việc đăng lên Yeoul Games rất đơn giản: tải lên một file HTML, hoặc chỉ cần liên kết tới trang game của bạn. Mô tả sẽ tự động được dịch sang 7 ngôn ngữ. Không có quảng cáo, không thu phí, và tôi sẽ giới thiệu game trên mạng xã hội và cộng đồng ở Hàn Quốc.
Mọi góp ý về chất lượng bản dịch tiếng Việt đều rất quý với tôi.
All rights reserved