Como deixei meu site de jogos de navegador em 8 idiomas (Python, Docker e um LLM gratuito)
Antes de tudo: sou coreano e escrevi com ajuda de tradução, então desculpe algum erro de português.
Eu administro sozinho, na Coreia do Sul, o Yeoul Games (여울게임터). O site está no ar desde setembro de 2026 e serve como um hub onde desenvolvedores indie publicam jogos de navegador que podem ser jogados por qualquer pessoa, sem cadastro e sem instalação. Ele começou como um espaço para hospedar meus próprios jogos e um MUD de texto em coreano; depois outros devs solo coreanos passaram a usar a plataforma.
O Yeoul Games roda em um NAS Synology na minha casa, todo em containers Docker. O servidor web é escrito em Python. Em outubro de 2026 a interface recebeu suporte a oito idiomas – coreano, inglês, japonês, português, espanhol, vietnamita, turco e alemão – com a troca feita pela query string ?lang=pt.
Como fiz o multilíngue
- Tabela de tradução de textos fixos – Um arquivo JSON com as chaves e os valores de todas as frases da interface. Cada resposta HTML passa por um filtro que substitui a chave pela tradução. Quando a frase está dividida por tags HTML, a chave continua sendo a frase completa, para a substituição ser exata.
- Descrição dos jogos – Quando um desenvolvedor envia o jogo, ele marca os idiomas que o próprio jogo suporta. Independente disso, a descrição que ele escreve vai para a API gratuita da Groq, que gera as traduções para os outros sete idiomas. Assim um visitante brasileiro entende do que se trata o jogo, mesmo que o jogo em si só exista em coreano. Uma thread em segundo plano calcula o hash da descrição original; se o desenvolvedor editar o texto, ela é retraduzida.
- Avisos e regras – Escrevo em coreano; são traduzidos por máquina e mostrados nas interfaces não coreanas, sempre com um link para o original em coreano, que é a versão que vale. Posts de outros usuários ficam exatamente como foram escritos.
- Filtro por idioma – Nas versões em inglês, português etc. existe o filtro "jogos jogáveis no meu idioma". Ele usa a marcação feita pelo desenvolvedor; como a maioria dos jogos ainda é só em coreano, o resultado costuma ter poucos itens.
Código (trecho)
Tirei do código real a parte da tradução automática das descrições (leitura da chave da API e gravação em arquivo omitidas).
import hashlib, json, re, timedef src_hash(src, fields): """impressão digital dos campos traduzíveis (nome, descrição...)""" 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): """reprova a tradução se sobrar hangul que não está no original""" 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() # por vez: 1 jogo × 1 grupo de idiomas time.sleep(70 if r else 240) # pausa para não estourar o limite gratuito
Na hora de exibir, a tradução só é usada se o _src salvo (a impressão digital de quando foi traduzida) bater com a do texto atual. Se o dev edita a descrição, o hash muda e o original em coreano aparece até sair a nova tradução — nunca fica uma tradução velha descrevendo outra coisa.
Onde eu travei
O principal problema foi o limite de tokens por minuto do plano gratuito da Groq: comecei a receber HTTP 413 (payload too large) e 429 (too many requests). A solução foi mandar pouco por vez (1 jogo × 1 grupo de idiomas), limitar o max_tokens e esperar 70 segundos entre pedidos (240 quando não há nada a fazer). Mesmo assim algumas traduções chegaram pela metade, com partes ainda em coreano – por exemplo, uma frase em japonês que terminava em caracteres coreanos. No começo eu corrigia à mão; depois coloquei o auto_ok acima, que descarta a tradução se sobrar hangul que não está no original.
O que ainda não funciona
Hoje são 42 jogos publicados, quase todos de desenvolvedores solo coreanos. Os jogos em si continuam em coreano; quase nenhum está marcado como jogável em português. Então só a interface e as descrições são traduzidas. A qualidade da tradução ainda escorrega em alguns trechos.
Para quem faz jogo de navegador
Se você faz um jogo de navegador e quer que jogadores coreanos (e de outros idiomas) o vejam, publicar no Yeoul Games é simples: um único arquivo HTML, ou só o link da página do seu jogo. A descrição é traduzida automaticamente para os outros sete idiomas. Não há anúncios nem taxas, e eu ainda divulgo nas comunidades coreanas.
Qualquer feedback sobre como a tradução para o português está soando é muito bem-vindo.
