Jogo traduzido não abre? Encontre a linha errada
O seu jogo traduzido abre e fecha, ou fica preso para sempre no ecrã de carregamento. Uma das linhas que traduziu nunca foi texto: um id, um caminho, uma flag que o jogo compara. Confirme primeiro que a culpa é da tradução e depois encontre a linha partindo ao meio: cerca de treze exportações reduzem cinco mil linhas a uma.
A janela abre. A janela fecha. Ontem este jogo funcionava, depois passou uma noite a traduzi-lo, e agora está morto.
Algures nessas linhas há uma que nunca foi texto: o nome de uma cena, um caminho de ficheiro, uma flag que o jogo compara. O motor bateu nela e desistiu antes de desenhar seja o que for.
Não vai ler cinco mil linhas para a encontrar. Vai fazer uma pergunta de sim ou não cerca de treze vezes.
A resposta curta. Prove primeiro que a culpa é da tradução e depois parta ao meio: traduza metade das suspeitas, exporte, execute. A metade que falhar contém a sua linha. Repita sobre essa metade até sobrar uma.
Antes de caçar: é mesmo a tradução?
- Execute o jogo original. Não a sua exportação, a cópia intacta. Se essa também falhar, o problema é a sua máquina, a pasta ou o próprio jogo.
- Traduza uma linha curta e inofensiva, exporte e execute. Serve uma palavra de menu que consiga ver no ecrã.
- Só depois disso comece a procurar uma linha.
O passo 2 diz uma linha, não nenhuma, de propósito. Vários adaptadores desistem quando não há nada para escrever, por isso uma exportação vazia testa uma cópia de ficheiros em vez da entrega, e pode passar enquanto o que interessa falha.
Se a versão de uma linha também falhar, nenhuma linha em particular é a culpada e partir ao meio não vai encontrar nada. Exporte de novo para uma pasta nova e vazia, confirme que está a executar a cópia exportada e não a original, e leia os avisos da exportação. Se continuar a falhar, comunique como um problema de entrega.
A triagem custa duas execuções e uma exportação: minutos num projeto pequeno de RPG Maker, mais num jogo grande de Unity. Poupa-lhe uma noite à procura de uma linha que não existe.
Dois casos parecidos que não são isto. Quadrados, pontos de interrogação ou latim estragado com o jogo a correr é um problema de tipo de letra ou codificação. Um crash logo depois de instalar um plugin ou overlay é a ferramenta, não as suas linhas.
Encontrar a linha partindo ao meio
A maioria dos projetos tem muitos ficheiros, e a lista de ficheiros é a coisa mais fácil de cortar em dois.
- Repor todas as traduções na barra de ferramentas.
- Abra Selecionar ficheiros a traduzir, que se explica sozinho: «Escolha que ficheiros traduzir. Os ficheiros não marcados ficam intactos.» Desmarque metade dos ficheiros e traduza o resto.
- Exporte para uma pasta nova e vazia e execute o jogo.
- Se arrancar, a sua linha está na metade que deixou em paz; se não, está na que acabou de traduzir. De qualquer forma a sua lista fica com metade do tamanho, e esquece a outra metade.
- Repor todas as traduções outra vez, parta ao meio a lista que sobrou, exporte, execute.
- Repita até sobrar um ficheiro e depois parta ao meio dentro desse ficheiro até sobrar uma linha.
Partir por ficheiro é mais grosseiro do que partir por linha, por isso o número de rondas acompanha o seu número de ficheiros: quarenta ficheiros são cerca de seis rondas até chegar ao ficheiro, e depois recomeça lá dentro.
Projetos de ficheiro único — um script NScripter, um jogo Kirikiri ou Wolf com um só cenário — não têm lista de ficheiros para cortar. Arraste antes uma caixa pelas linhas: as caixas de seleção e a barra de ações aparecem sozinhas, e Retraduzir selecionadas faz o resto. Para uma passagem maior, reduza primeiro as linhas com o filtro e a pesquisa e depois use Selecionar tudo o que está visível. Cuidado com essa: apanha exatamente o que o filtro está a mostrar, por isso um filtro que se esqueceu de limpar contamina em silêncio todas as rondas seguintes. Aponte que filtro usou.
Um lote partido de cem linhas, jogado até ao fim:
- Ronda 1 — 100 sob suspeita, traduza as primeiras 50: arranca, portanto está nas outras 50.
- Ronda 2 — 50 sob suspeita, traduza as primeiras 25: falha, portanto está nestas 25.
- Ronda 3 — 25 sob suspeita, traduza as primeiras 13: arranca, portanto está nas outras 12.
- Ronda 4 — 12 sob suspeita, traduza as primeiras 6: falha, portanto está nestas 6.
- Ronda 5 — 6 sob suspeita, traduza as primeiras 3: falha, portanto está nestas 3.
- Ronda 6 — 3 sob suspeita, traduza as primeiras 2: arranca, sobra uma linha.
Sete exportações é o pior caso a partir de cem linhas, e cerca de treze o pior a partir de cinco mil.
O que custa uma ronda
Uma exportação, uma execução e o tempo que o jogo demorar a chegar à primeira linha de diálogo. Dois ou três minutos num projeto pequeno de RPG Maker. Num jogo grande de Unity, onde a exportação copia o jogo inteiro e o ecrã de título demora o seu tempo, mais perto de dez.
Ou seja, treze rondas são quase uma noite inteira. Continua a ser a opção barata, porque a alternativa é ler cinco mil linhas e acertar.
Duas coisas correm mal à mão. Exporte para uma pasta nova e vazia em cada ronda, porque alguns motores montam patches de forma acumulativa, e a ronda 3 a cair sobre as rondas 1 e 2 testa as três ao mesmo tempo. Repor significa repor: use Repor todas as traduções, nunca uma edição manual, porque isso restaura o texto capturado quando o projeto foi criado, mesmo que tenha reescrito a pasta de origem entretanto.
Se continuar a falhar depois de reverter a sua linha
Então havia mais do que uma, que é o resultado normal de uma primeira passagem de traduzir-tudo num motor sensível à análise. Deixe a sua linha revertida e volte a correr o ciclo sobre tudo o que continua traduzido. Um segundo culpado é muitas vezes o mesmo tipo de cadeia que o primeiro, no mesmo ficheiro.
Da próxima vez, traduza por lotes
Os lotes não poupam exportações; são exportações que ia fazer de qualquer maneira, e cada falha chega já localizada. Partiu no último lote, portanto partir ao meio começa em cem linhas em vez de cinco mil. Comece em 100 e alargue para 500 ou um ficheiro inteiro quando vários lotes correrem limpos.
Que motores partem se traduzir a linha errada?
Fala-se de motores rígidos e motores tolerantes. O que decide mesmo é onde a sua tradução aterra.
Alguns motores leem-na como dados: um ficheiro à parte e um gancho em tempo de execução no Ren'Py, JSON com escapes no RPG Maker, um valor .locres cujos hashes de chave ficam intactos no Unreal. A estrutura do jogo nunca vê o seu texto, por isso uma linha errada custa-lhe uma linha errada. Outros inserem-na num ficheiro que o jogo analisa como script, marcação ou fluxo de bytes, e a sua frase passa a fazer parte da estrutura desse ficheiro. Aí bastam dois-pontos, um parêntese reto, um byte a mais ou uma cadeia que também era chave de procura para parar o jogo.
É essa a regra toda. Encontre o seu motor, leia a linha dele e siga em frente.
- RPG Maker MV/MZ — nada estrutural: JSON e CSV com escapes, e só um conjunto fixo de comandos de evento é oferecido. O único risco real é um plugin que compara um nome de interlocutor de forma exata, e a exportação reescreve também a chave desse plugin.
- Ren'Py — muito pouco. O código-fonte nunca é reescrito, por isso uma cadeia que também serve de chave lógica está segura.
- Unreal Engine — nenhum modo de falha ao nível da linha que tenhamos visto: as cadeias
.locressão texto visível por construção. Aqui o risco é texto em falta, não uma build morta. - Unity — grave e silencioso: nomes de cenas, chaves de variáveis e callbacks são guardados tal como o diálogo. Conte com carregamento infinito, um botão morto ou um ecrã preto.
- Godot — grave. Caminhos de nós, StringNames e referências
res://são o endereço que o motor consulta; a reescrita recusa-os. - Wolf RPG — o formato mais frágil aqui. Um byte de desvio dessincroniza o fluxo inteiro e o processo aborta antes de existir uma janela.
- Kirikiri / KAG — grave: os parênteses retos são sintaxe e os nomes de armazenamento são nomes de ficheiro. Um nome de etiqueta traduzido, um parêntese convertido ou um nome de imagem traduzido param o jogo de imediato.
- Electron VN — grave. Um marcador de template escrito dentro do JavaScript vivo em
app.asaré um erro de sintaxe, não uma má tradução. - TyranoBuilder / TyranoScript — mesma família do Kirikiri: as etiquetas KAG são marcação, por isso uma etiqueta traduzida é sintaxe. As referências de personagem em linha nunca são reescritas.
- NScripter — grave e de forma única:
?,%e$são sigilos de variável, por isso um perdido é um erro de sintaxe. - YU-RIS — grave, porque muito do que o formato chama cadeia é na verdade um operando. Separá-los levou um jogo de 40 678 linhas ativas para 8 914, sem perder diálogo.
Outros motores têm a sua própria página, cada uma com um guia, em motores.
Três linhas que mataram um jogo
Cada regra de exclusão do RuneTranslate foi paga por um jogo que deixou de arrancar. Estas três estão corrigidas. Em cada uma, a linha partida parecia perfeitamente razoável e a exportação acabou a verde.
Godot: o jogo inventa uma personagem. Uma linha dizia Warning: the door is locked. Inglês perfeito. O Dialogic faz escape a cada dois-pontos no texto guardado, porque uns dois-pontos sem escape são exatamente como ele separa o nome de quem fala. Escrita de volta em bruto, a frase foi relida como uma personagem chamada Warning a dizer the door is locked, e o addon criou-a sem hesitar.
Kirikiri: o jogo procura um ficheiro chamado `End`. A etiqueta de um botão levava um nome de imagem e um destino, e o mascaramento não conseguia abranger uma etiqueta com parênteses próprios, por isso ambos ficaram expostos e foram traduzidos. O analisador agora percebe parênteses: fecha no parêntese correspondente, de modo que uma expressão aninhada fica dentro da etiqueta enquanto uma etiqueta normal termina no seu primeiro ].
RPG Maker: um retrato desaparece sem ruído. Um plugin de retratos escolhe a arte de uma personagem comparando o nome de quem fala, letra a letra, com uma tabela na sua própria configuração. Traduzir o nome é correto; deixar essa configuração em paz também é, porque está cheia de chaves de recursos. Juntas, partiram a igualdade, e os retratos da personagem desapareceram sem nada nos registos.
As três exportações comunicaram sucesso. Uma exportação limpa não é prova de um jogo a funcionar, em motor nenhum. A única prova é executá-lo.
Quando não são as suas linhas de todo
Partir ao meio não encontra estes casos, porque nenhuma metade arranca: o problema é onde a exportação aterrou. Os jogos Wolf RPG leem o seu arquivo .wolf antes de qualquer ficheiro solto ao lado, por isso um deles mostrou o ecrã de título enquanto os dados traduzidos ficavam no disco por ler. Os Addressables do Unity recusam um pacote cujos bytes já não batem certo com a soma de verificação, e dão-lhe um ecrã preto sem nada em registo nenhum. Os jogos RPG Maker empacotados ignoram ficheiros de dados ao lado do executável. Os três já estão tratados, e é por isso que uma falha de entrega merece um relato em vez de uma caçada.
Existe alguma marca que diga que linhas são diálogo?
Não. E desconfie de quem disser o contrário.
Um utilizador contou-nos uma vez que tinha encontrado um jogo Godot que envolvia cada cadeia de diálogo em ||, traduziu só essas e o jogo correu. Genuinamente útil para aquele jogo. É o hábito de um programador, não uma convenção do Godot, e o jogo seguinte fará outra coisa.
O contraexemplo vem do YU-RIS. Num jogo, o canal das plicas invertidas continha a tabela inteira de cadeias da interface, 687 das suas 692 linhas eram texto visível — e mesmo assim a plica invertida não significa nada ali. Os três estilos de aspas compilam para a mesma coisa, por isso uma regra assente no delimitador assinala prosa a sério. Onde o valor vivia dizia-lhe tudo; como estava citado não dizia nada.
Confie antes na posição e na forma, e deixe o jogo ensinar-lhe as duas. Execute-o, leia a primeira linha de diálogo no ecrã e depois encontre essa linha exata no editor: o ficheiro dela, o grupo dela e as vizinhas são o aspeto que o diálogo tem neste jogo. Tudo o que estiver noutro sítio é candidato a não ser diálogo.
O que a aplicação assinala e o que não pode saber
O RuneTranslate marca como excluídas as linhas que julga serem código, caminhos de recursos ou identificadores. Continuam visíveis em vez de escondidas, com um tom laranja atrás de um interruptor mostrar excluídas, para que veja o que foi decidido e possa forçar qualquer linha com traduzir mesmo assim. Também pode acrescentar os seus próprios padrões.
Selecione linhas excluídas e comece uma passagem: ela para para perguntar «12 das 340 linhas que escolheu estão excluídas — assinaladas pelos seus filtros, ou pelo RuneTranslate como código, caminhos de recursos ou IDs. Traduzi-las pode partir o jogo. Ignorá-las mantém-nas excluídas. Traduzi-las inclui-as também em passagens futuras.»
Passar à frente não faz mal. Lembre-se apenas de que o fez, porque é o primeiro sítio onde olhar quando a exportação deixa de arrancar.
Um limite honesto: uma exclusão é um palpite sobre uma cadeia, por isso não pode saber que uma frase do seu jogo serve também de chave de procura nalgum plugin que o jogo traz. Um jogo cuja origem já é inglês tem ainda menos proteção, porque os filtros mais fortes perguntam se uma cadeia contém texto na língua de origem.
Perguntas frequentes
Porque é que o meu jogo não abre depois de o traduzir?
Quase sempre porque uma linha que traduziu era um identificador, um caminho, um nome de cena ou uma flag que o jogo compara por cadeia exata. Alterá-la parte a análise, ou a procura.
Como encontro que linha traduzida partiu o jogo?
Parta ao meio. Reponha todas as traduções, traduza metade, exporte para uma pasta vazia, execute. A metade que falhar contém a linha; parta-a ao meio e repita. Seis ou sete rondas a partir de cem linhas, cerca de treze a partir de cinco mil.
O meu jogo traduzido fecha logo — o que quer isso dizer?
Um erro fatal no arranque. No Kirikiri, nas visual novels Electron e no NScripter, normalmente um erro de sintaxe: um parêntese, uma aspa ou um marcador traduzido ou perdido. No Wolf RPG e no YU-RIS, um fluxo dessincronizado.
Porque é que o meu jogo traduzido abre num ecrã preto?
Normalmente um carregamento que falhou dentro de código que engoliu a exceção; no Unity, um pacote cuja soma de verificação já não bate certo com a entrada de catálogo. Experimente uma build com uma única linha inofensiva traduzida: se também ficar preta, a culpa é da entrega e não de nenhuma linha.
O meu jogo traduzido fica preso no ecrã de carregamento — é a tradução?
Muito provavelmente, no Unity. Um carregamento infinito é o sintoma clássico de um nome de cena ou de uma chave de variável traduzidos: o jogo espera por um nome que já não corresponde, e nada dá erro.
Que tipo de linhas nunca se devem traduzir?
Tudo o que o jogo resolve por cadeia exata: caminhos, nomes de cenas e de nós, nomes de variáveis e de eventos, códigos de idioma, tudo com a forma snake_case ou res://. Se não consegue imaginar um jogador a lê-lo no ecrã, deixe estar.
O jogo corre mas o texto são quadrados ou pontos de interrogação — é o mesmo problema?
Não. Quadrados uniformes significam que o tipo de letra não tem glifo para esses caracteres; um ponto de interrogação literal significa que se perderam quando o ficheiro foi escrito. Ambos são problemas de tipo de letra ou de codificação, com outra solução.
Para onde ir a seguir
Está a começar uma tradução em vez de reparar uma? Como fazer um patch de tradução cobre o trabalho todo.
Quando encontrar a sua linha: deixe-a na língua de origem, traduza tudo à volta, exporte para uma pasta nova e vazia, e execute. Um identificador por traduzir não custa nada ao jogador.
Pronto para experimentar o RuneTranslate?
O plano gratuito libera todos os motores + todos os provedores de tradução. O plano Supporter ($3/mo) libera velocidade total.
Baixar para Windows
