Por qué la traducción sale en recuadros
Tradujiste el juego, la exportación terminó limpia y el cuadro de diálogo está lleno de □□□. Casi nunca es un problema de traducción: es un problema de fuentes, y tiene un arreglo distinto al de los dos fallos con los que se confunde. Así se distingue un glifo que falta de un carácter descartado y del mojibake, y así se arregla cada uno en Unity, TextMeshPro, Ren'Py y las herramientas en tiempo de ejecución.
La exportación terminó, el juego arrancó y cada línea de diálogo es una fila de rectángulos vacíos idénticos. No hay nada mal en la traducción. El texto del archivo es exactamente lo que devolvió el proveedor, y si abres ese archivo en un editor de texto se lee correctamente. Lo que falló es el último paso de la cadena: la fuente que el juego entrega al renderizador no tiene un dibujo para esos caracteres.
Qué es en realidad un recuadro tofu
Una fuente es una tabla de consulta que va de un punto de código Unicode a una forma. Cuando se le pide a un renderizador que dibuje un punto de código que la fuente no contiene, sustituye el glifo de carácter ausente de la fuente — normalmente un rectángulo vacío o cruzado, llamado formalmente .notdef y conocido en todas partes como recuadro tofu. Un recuadro equivale a un carácter que la fuente no ha podido dibujar. Ese es todo el mecanismo.
De ahí se siguen dos consecuencias, y las dos sirven para diagnosticar. Primera, el número de recuadros coincide con el de caracteres: cinco caracteres tailandeses producen cinco recuadros, no una tirada corta de basura. Segunda, la cadena está intacta en memoria — el juego todavía puede medirla, compararla, guardarla y volver a cargarla. Solo faltan los píxeles. Por eso un menú traducido puede ser completamente ilegible y aun así navegarse correctamente.
Tres síntomas, tres problemas distintos
Casi toda la confusión alrededor de "mi traducción está rota" es gente aplicando a uno de estos el arreglo de otro. Lee la forma del daño antes de cambiar nada.
- Recuadros □□□ — los caracteres son correctos, la fuente no puede dibujarlos. Arregla la fuente.
- ???? — los caracteres han desaparecido. Algo recodificó la cadena a un juego de caracteres más estrecho y sustituyó todo lo que no podía representar. Ninguna fuente puede devolverlos. Arregla la codificación, o elige un idioma de destino que el formato pueda contener.
- Latín ilegible como
テã‚スト, oテキストmostrado comoテキスト— mojibake. Los bytes son correctos, el descodificador no: un texto escrito en una codificación se está leyendo con otra. Arregla qué codificación se está leyendo.
Un separador rápido: los recuadros y el mojibake dejan un número de bytes más o menos proporcional al original, pero el mojibake produce caracteres basura visibles y variados, mientras que el tofu produce rectángulos idénticos y uniformes. Uniforme significa "fuente". Variado significa "codificación".
Recuadros: falta un glifo
El juego se publicó con una fuente que cubría solo lo que necesitaba. Nada del proceso está roto — pediste un punto de código que el artista nunca incluyó. El arreglo es siempre dar al renderizador una fuente que tenga el glifo, ya sea sustituyendo la fuente o añadiendo una de reserva que el renderizador consulte cuando la principal se quede en blanco.
Signos de interrogación: los caracteres se perdieron
Cuando una cadena tiene que escribirse de vuelta en un formato que guarda el texto en una codificación heredada de uno o dos bytes, cada carácter fuera de esa codificación tiene que convertirse en algo. Por convención, ese algo es ?. Shift-JIS y cp932 pueden contener japonés, ASCII y muy poco más; un campo ASCII estricto no puede contener nada del griego, el cirílico, el tailandés o el CJK. Es una propiedad del formato de archivo, no de la fuente, y ocurre al exportar — para cuando el juego lee el archivo, la información ya se ha perdido.
RuneTranslate tiene un motor donde este límite está vivo, y se dice en lugar de esconderse: YU-RIS vuelve a codificar sus cadenas como cp932, algo amable con el inglés y otras salidas latinas, pero que publica el tailandés como ?. Los destinos no representables en cp932 en ese motor necesitan un apaño de fuente que todavía no está hecho.
Latín ilegible: mojibake
Texto japonés escrito como Shift-JIS y luego leído como UTF-8 (o al revés) produce largas tiradas de letras latinas acentuadas y caracteres de dibujo de cajas. Aparece cuando una herramienta escribe un archivo con la codificación equivocada, o cuando el propio cargador de un juego asume una codificación que tu exportación no usó. El arreglo es escribir el archivo en la codificación que el motor espera — nunca cambiar la fuente, que no cambiará nada.
Por qué el CJK y el tailandés se llevan la peor parte
El latín necesita alrededor de cien glifos. El japonés necesita varios miles, el chino más. Los archivos de fuente son grandes, y los juegos incluyen el más pequeño que cubra su propia escritura, así que la cobertura que heredas depende por completo del idioma para el que se construyó el juego.
- Un juego hecho para japonés suele llevar kana, kanji comunes y ASCII. Tradúcelo a ruso, griego, tailandés o coreano y todos los caracteres no ASCII se caen.
- Un juego hecho para inglés suele llevar solo latín, así que el japonés, el chino, el coreano, el tailandés, el griego y el cirílico fallan todos a la vez.
- El tailandés es el peor caso en la práctica: está fuera de toda fuente de juego común, y además necesita marcas de vocal y de tono combinadas colocadas encima y debajo del carácter base, así que una fuente que técnicamente tiene los puntos de código puede renderizarlo mal igualmente.
- El latín no es automáticamente seguro. El polaco, el checo, el húngaro, el turco, el vietnamita y el rumano usan caracteres de Latin-Extended que una fuente hecha para inglés o japonés omite con frecuencia. RuneTranslate incluye una fuente más amplia exactamente para esos destinos en Ren'Py, porque "el latín va bien" resultó ser falso.
Unity y TextMeshPro en concreto
Unity tiene dos sistemas de texto y fallan de forma distinta. El Text heredado de uGUI usa un objeto Font. TextMeshPro — que es lo que usan la mayoría de juegos modernos — no usa ningún archivo de fuente en tiempo de ejecución. Usa un recurso de fuente TMP: un atlas de texturas con imágenes de glifos prerenderizadas, más una tabla que mapea puntos de código a posiciones en ese atlas.
Por eso un recurso de fuente TMP tiene un juego de caracteres fijo. Cuando el desarrollador lo generó, eligió un rango de caracteres — normalmente solo el idioma que iba a publicar — y TMP integró exactamente esos glifos en el atlas. Un recurso de fuente estático nunca podrá renderizar nada fuera de ese conjunto, le des lo que le des. Un recurso de fuente dinámico mantiene una referencia al archivo de fuente de origen y puede rasterizar glifos nuevos bajo demanda, que es el único modo capaz de crecer hasta cubrir un idioma que el desarrollador nunca contempló.
La salida de emergencia de TMP es la lista de reserva. Cada recurso de fuente tiene una lista m_fallbackFontAssets, y TMP Settings tiene una lista de reserva global; cuando el recurso principal no tiene glifo para un punto de código, TMP recorre esas listas buscando uno que sí lo tenga. Este es el sitio correcto para intervenir, porque deja al mando la propia fuente del juego para todo lo que ya sabe dibujar — la interfaz conserva su aspecto previsto y solo los caracteres que no puede manejar vienen de otro sitio.
Arreglarlo con una herramienta en tiempo de ejecución
XUnity.AutoTranslator engancha el juego mientras se ejecuta y puede cambiar fuentes desde su archivo de configuración. Los ajustes relevantes, bajo [Behaviour]:
OverrideFont— sustituye la fuente que usan los componentesTextde la UI heredada de Unity. Toma el nombre de una fuente que el juego o el sistema puedan resolver.OverrideFontTextMeshPro— sustituye el recurso de fuente TMP por completo. Apúntalo a un archivo AssetBundle de fuente TMP, o al nombre de un recurso que el juego ya tenga.FallbackFontTextMeshPro— el más seguro de los dos: añade una fuente que TMP consulta solo para los glifos que le faltan al recurso propio del juego, dejando la tipografía original en su sitio en todo lo demás.- tmp_font_assetbundles — la colección mantenida por la comunidad de AssetBundles de fuentes TMP prefabricados a los que se suelen apuntar
OverrideFontTextMeshProyFallbackFontTextMeshPro. Se compilan por versión de Unity, y un bundle compilado para una versión de Unity distinta a la del juego no cargará: hacer coincidir la versión es el paso que la gente se salta.
Una herramienta en tiempo de ejecución es por máquina y por configuración: arregla el juego en el PC donde está instalada, y cualquier otra persona que ejecute esa compilación necesita el mismo montaje. RuneTranslate puede leer y escribir el propio archivo _AutoGeneratedTranslations.txt del plugin, así que un proyecto que ya lo use no es un callejón sin salida — mira la comparativa para ver dónde encaja cada enfoque.
Arreglarlo a nivel de archivo
RuneTranslate toma la vía de la reserva directamente en los datos del juego. Al exportar en Unity localiza los TMP Settings del juego, un recurso de fuente que pueda usar como plantilla y una Font, y luego construye un recurso de fuente TMP nuevo en modo Dynamic alrededor de una fuente incluida que cubra la escritura de destino, y lo añade a la lista de reserva. Las entradas de reserva existentes se dejan intactas, y la propia fuente del juego sigue siendo la principal — así que un juego japonés traducido al tailandés conserva su estilo original para todo lo latino y saca los glifos tailandeses del recurso inyectado.
Dos apuntes honestos sobre eso. Necesita que existan los TMP Settings, una plantilla de recurso de fuente utilizable y una Font en el mismo contenedor de los recursos del juego; un juego que los coloque de otra forma puede quedarse fuera. Y cuando la inyección se omite, la exportación lo dice en sus avisos en lugar de terminar en verde — una exportación que sale en recuadros no debe parecer idéntica a una que funciona. Si ves ese aviso, la vía de la herramienta en tiempo de ejecución de arriba es el plan alternativo.
Ren'Py consigue el mismo resultado por otro mecanismo, porque Ren'Py no tiene TMP: RuneTranslate puede incluir una fuente CJK o no latina en la compilación exportada y registrarla a través del propio config.font_replacement_map de Ren'Py, de modo que el motor la sustituye allí donde la fuente del juego se quedaría corta.
Lista de comprobación práctica
- Mira el daño. Rectángulos uniformes, caracteres
?o letras ilegibles: decide cuál de los tres tienes antes de tocar nada. - Si son
?, abre el archivo exportado. Si los signos de interrogación están en el archivo, los caracteres se perdieron al escribir y ninguna fuente ayudará; comprueba si la codificación de cadenas del motor puede contener tu idioma de destino. - Si son letras ilegibles, revisa la codificación que el motor espera para ese archivo, no la fuente.
- Si son recuadros, confirma que el contenido del archivo es correcto — casi siempre lo es — y trátalo como un trabajo de fuentes.
- En Unity, prefiere añadir una fuente de reserva antes que sustituir la del juego. Sustituirla cambia el aspecto de todas las cadenas, incluidas las que se renderizaban bien.
- Si usas un AssetBundle de fuente TMP, haz que coincida con la versión de Unity del juego.
- Reexporta y comprueba los caracteres concretos que fallaban, no solo la primera línea de diálogo. El Latin-Extended y las marcas del tailandés a menudo sobreviven a un vistazo rápido y fallan en otro sitio.
Adónde ir ahora
Para el flujo de trabajo completo de Unity — qué texto expone Unity de verdad y qué queda fuera de alcance — lee cómo traducir juegos de Unity y la página del motor Unity. El texto integrado en el arte y no en los datos es un problema aparte con una herramienta aparte: mira traducción de imágenes. Y las preguntas frecuentes cubren el resto de las sorpresas comunes del primer uso.
RuneTranslate es gratuito de usar con todos los motores y todos los proveedores desbloqueados, incluidos tres que no necesitan ninguna clave de API. Analiza los propios archivos del juego y exporta una compilación traducida y jugable que te quedas. Descárgalo o consulta los motores soportados.
¿Listo para probar RuneTranslate?
El plan gratuito desbloquea todos los motores y todos los proveedores de traducción. Supporter ($3/mo) desbloquea la velocidad completa.
Descargar para Windows
