MotoresGuíasFAQPatreonDiscordDescargar
Iniciar sesión
RuneTranslate · traduce juegos japoneses de principio a fin
MotoresGuíasCompararTexto en imágenesEditor de partidasModo trucosFAQDescargarPatreonDiscordYouTubePrivacidadTérminosContacto
Todas las publicaciones
unity · xunity-autotranslator · troubleshooting

XUnity.AutoTranslator no traduce

18 ago 2026·9 min de lectura

XUnity.AutoTranslator es el mejor traductor en tiempo de ejecución que tiene Unity, y cuando se queda callado la razón casi siempre es una de cinco cosas concretas: el juego es una compilación IL2CPP, el texto se fija por una vía que el hook no intercepta, el framework de UI que lo dibuja no está habilitado, la línea supera el límite de caracteres, o el endpoint se ha apagado solo. Así se sabe cuál tienes.

XUnity.AutoTranslator es gratuito, con licencia MIT, se mantiene activamente y es la mejor herramienta de traducción en tiempo de ejecución que tiene Unity. Funciona enganchando el momento en que un juego entrega una cadena a un componente de texto y sustituyéndola por una traducción antes de que se dibuje. Ese diseño es la razón de que no necesite ningún conocimiento de los formatos de archivo del juego — y también la razón de que, cuando falla, falle en silencio. Nada se cierra. El juego simplemente sigue en japonés.

Las cinco cosas de abajo explican casi todos los informes de "no traduce". Repásalas en orden; cada una tiene un arreglo distinto, y adivinar entre ellas cuesta muchas tardes.

Primero: lee el log, no la pantalla

El plugin es explícito sobre lo que está haciendo, y el log es el único sitio donde lo dice. Con una instalación de BepInEx, mira BepInEx/LogOutput.log. El log del propio Unity está al lado, en <Game>_Data/output_log.txt en compilaciones antiguas, o en %APPDATA%/../LocalLow/<Company>/<Game>/Player.log en las más nuevas.

  • ¿El log menciona siquiera que XUnity.AutoTranslator se ha cargado? Si no, el problema es el cargador, no el traductor: estás en el modo de fallo uno.
  • ¿Aparece un endpoint inicializándose y, más tarde, uno que se apaga tras errores repetidos? Ese es el modo de fallo cinco.
  • ¿Se están escribiendo traducciones en BepInEx/Translation/<lang>/Text/_AutoGeneratedTranslations.txt? Si ese archivo se llena de traducciones correctas que nunca aparecen en pantalla, la parte de red está bien y la parte de visualización no.
  • Pulsa ALT+1 en el juego para abrir la ventana del agregador de traducciones. Si muestra las líneas que estás mirando, el hook las ve. Si sigue vacía, el hook nunca las ve.

Esa última división — "traducido pero no mostrado" frente a "nunca visto" — es la bifurcación del camino. Todo lo de abajo depende de ella.

1. El juego es una compilación IL2CPP

Unity publica juegos con dos entornos de ejecución muy distintos. Mono mantiene el C# del juego como ensamblados .NET normales en <Game>_Data/Managed/, Assembly-CSharp.dll entre ellos, con los nombres de tipos y métodos intactos. IL2CPP convierte ese C# a C++ por adelantado y lo compila en una GameAssembly.dll nativa; lo que sobrevive del sistema de tipos queda empaquetado en <Game>_Data/il2cpp_data/Metadata/global-metadata.dat.

Un hook en tiempo de ejecución necesita encontrar un método y reemplazarlo. En Mono eso es un problema normal de reflexión. En IL2CPP no hay método gestionado sobre el que reflexionar — el código es nativo, y la única vía de vuelta a los nombres, los campos y las direcciones de método es analizar global-metadata.dat y reconstruir la disposición. Eso es un cargador completamente distinto, no un ajuste.

  • Cómo saberlo en cinco segundos: una GameAssembly.dll junto al ejecutable del juego, más una carpeta il2cpp_data, significa IL2CPP. Una carpeta Managed/ llena de DLL significa Mono.
  • IL2CPP necesita el BepInEx de sabor IL2CPP, y la versión de XUnity.AutoTranslator compilada contra él. La compilación para Mono no se cargará — simplemente no aparecerá en el log, que se lee exactamente igual que "el plugin está roto".
  • La arquitectura también importa. Un juego de 64 bits necesita el cargador de 64 bits. Un par mal emparejado falla del mismo modo silencioso.
  • Algunos juegos publican un archivo de metadatos que no se puede analizar. Los empaquetadores y las capas antimanipulación cifran o reestructuran global-metadata.dat, y toda herramienta que dependa de leerlo — el hook incluido — se queda ahí.

2. El plugin carga y el texto nunca aparece

El plugin está en el log, el endpoint se inicializó, _AutoGeneratedTranslations.txt va creciendo — y la pantalla sigue igual. O el hook está traduciendo una cadena que el juego luego descarta, o el juego está fijando el texto por una vía que el hook no intercepta.

TextGetterCompatibilityMode

Muchos juegos vuelven a leer el texto que acaban de fijar: para medirlo, para añadirle algo, para compararlo con otra cosa. En cuanto el componente contiene una cadena traducida, esa lectura devuelve la traducción, la propia lógica del juego opera sobre un texto que no escribió, y el resultado va desde una línea que revierte hasta un diseño que se desmonta. TextGetterCompatibilityMode, en AutoTranslatorConfig.ini, hace que el getter devuelva al juego su cadena original mientras el jugador sigue viendo la traducida. Está desactivado por defecto porque cuesta trabajo en cada lectura, y es el primer interruptor que probar cuando el texto parpadea, revierte o se niega a fijarse.

La otra mitad de este grupo es el texto que nunca se fija a través de una API enganchada: un juego que renderiza con su propio motor de texto, que vuelca caracteres directamente en una malla, o que integra el diálogo dentro de un sprite. Para eso no hay configuración — el punto de interceptación no existe. El texto integrado en el arte es un problema aparte por completo, y necesita traducción de imágenes en lugar de cualquier hook.

3. Solo se traduce parte del texto

Los menús se traducen, el diálogo no. O el diálogo se traduce y todos los botones siguen en japonés. Casi siempre es un framework de UI que no está habilitado, porque el plugin engancha cada uno por separado y no todos vienen activados.

  • Activados por defecto: UGUI (la UI integrada de Unity), NGUI, TextMeshPro y UIElements (EnableUGUI, EnableNGUI, EnableTextMeshPro, EnableUIElements). Entre todos cubren la mayoría de juegos modernos, incluidos los frameworks de novela visual como Utage, que dibujan a través de ellos en lugar de tener un interruptor propio.
  • Desactivados por defecto: IMGUI y el componente heredado TextMesh. IMGUI es la GUI de modo inmediato de Unity — se redibuja en cada fotograma, así que engancharlo significa traducir en cada fotograma, y está desactivado por rendimiento, no porque no funcione.
  • Los flags viven en `AutoTranslatorConfig.ini` como EnableIMGUI, EnableTextMesh y hermanos. Pon a True el que use tu juego y reinicia.
  • Los juegos de Unity antiguos y los doujin japoneses son los casos típicos de IMGUI. Un juego cuyos menús parecen simples cajas grises con el estilo por defecto es una pista fuerte.

Si habilitarlo todo no cambia nada, el texto no está pasando por un componente de texto de Unity en absoluto — de vuelta al modo de fallo dos.

4. Las líneas largas se omiten, no se traducen

MaxCharactersPerTranslation vale 200 por defecto. Cualquier cosa más larga se omite. Ni se trunca, ni se reintenta, ni se registra de forma que lo notes mientras juegas: se omite, así que la línea se muestra en el idioma original y nada parece roto.

Este es el modo de fallo que la gente persigue durante más tiempo, porque la evidencia es muy débil: casi todo el juego se traduce, y luego un párrafo no. Las novelas visuales son la víctima habitual — un bloque largo de narración o un monólogo sin ningún salto de línea supera los 200 caracteres con facilidad, y es precisamente el texto que más querías traducido.

Sube el valor en AutoTranslatorConfig.ini y reinicia. Ten en cuenta que también estás subiendo lo que cuesta cada petición: los endpoints gratuitos tienen sus propios topes de longitud por petición y empezarán a rechazar las que los superen, así que un valor muy alto cambia una omisión silenciosa por un error visible del endpoint. Un valor entre 500 y 1000 cubre la prosa habitual de una novela visual.

5. El endpoint falló o te limitó

Los endpoints por defecto de XUnity son servicios de traducción públicos y gratuitos a los que se accede como lo haría un navegador. No son contractuales, y cambian. Cuando una serie de peticiones falla seguidas, el plugin apaga el endpoint durante el resto de la sesión en lugar de insistir — una decisión deliberada y acertada que también significa que todo lo que venga después se queda sin traducir en silencio hasta que reinicies el juego.

  • Busca la línea de apagado en el log. Si está ahí, el arreglo es reiniciar más cambiar algo, no esperar más.
  • Baja el ritmo de la cola. MaxTranslationsQueuedPerSecond y los ajustes de retardo existen porque son las ráfagas las que disparan los límites. Pasar rápido por una novela visual envía cientos de peticiones en segundos.
  • Cambia de endpoint. Si un servicio gratuito está teniendo un mal día, otro normalmente no.
  • Usa un endpoint con clave. Una clave de API real de DeepL o de una API de pago elimina toda esta categoría de problema, a cambio de ser una clave de API de pago.
  • Actualiza el plugin. Cuando cambia el protocolo de un endpoint gratuito, el arreglo llega en forma de versión nueva. Ejecutar una compilación de hace dos años contra un servicio que se ha movido es una causa común de "antes funcionaba".

Extra: el texto se traduce y se ve como recuadros

Esto no es un fallo de traducción en absoluto. El juego incluye un atlas de fuente que contiene exactamente los glifos que necesitaba su idioma original, y tu idioma de destino necesita glifos que no están, así que cada carácter que falta se dibuja como un recuadro o un hueco. XUnity tiene OverrideFont y OverrideFontTextMeshPro exactamente para esto. Fíjate en la huella: los recuadros significan un glifo que falta; los caracteres `?` literales significan un problema de codificación en algún punto anterior de la cadena. Son fallos distintos, y el ajuste de fuente solo arregla el primero.

El orden en que hay que repasarlo

  1. Confirma si es Mono o IL2CPP buscando GameAssembly.dll, y confirma que instalaste el cargador correspondiente.
  2. Abre BepInEx/LogOutput.log y confirma que el plugin se cargó y que se inicializó un endpoint.
  3. Pulsa ALT+0 en el juego para abrir la ventana propia del plugin — si no aparece nada, el plugin no está cargado. ALT+1 abre el Translation Aggregator: vacío significa que el hook nunca ve el texto; poblado significa que sí lo ve.
  4. Si el hook lo ve pero la pantalla no cambia, activa TextGetterCompatibilityMode.
  5. Si solo se traduce parte del juego, habilita IMGUI y el TextMesh heredado.
  6. Si hay líneas largas concretas que siguen sin traducir, sube MaxCharactersPerTranslation desde su valor por defecto de 200.
  7. Si todo se detuvo a mitad de sesión, busca la línea de apagado del endpoint y reinicia con una cola más lenta o con otro endpoint.

Cuando un hook no es la forma adecuada para el trabajo

Todos los fallos anteriores se remontan a la misma raíz: un hook en tiempo de ejecución solo puede traducir el texto que está presente para interceptar. Si el juego no fija la cadena a través de una API que el plugin conozca, o el texto se dibujó antes de que el plugin cargara, o el entorno de ejecución no expone el método que enganchar, no hay nada que configurar. La herramienta está haciendo bien su trabajo y el texto sencillamente queda fuera de alcance.

La alternativa estructural es trabajar sobre los archivos en lugar de sobre el fotograma. Una herramienta a nivel de archivo abre los propios recursos del juego, saca las cadenas, las traduce y escribe una copia traducida del juego — así que el texto ya está en el idioma de destino antes de que el motor lo cargue siquiera. Sin hook, sin punto de interceptación, sin flags por framework, y el límite de caracteres es el que soporte el formato. Eso es lo que hace RuneTranslate, en Unity y otros 16 motores y formatos.

Las contrapartidas son reales y van en la otra dirección. Una herramienta a nivel de archivo solo alcanza el texto que está en los archivos — en Unity eso significa TextAssets, campos de cadena de MonoBehaviour, scripts de StreamingAssets, tablas de localización y asset bundles, incluidos los bundles Addressable cifrados con AES. Necesita un paso de exportación antes de jugar, en lugar de traducir sobre la marcha. Y no puede hacer nada con el texto que tu juego genera en tiempo de ejecución a partir de fragmentos. Unity es un motor de mejor esfuerzo exactamente por esto: lo que cada juego externaliza varía enormemente, y abrir el proyecto es lo que te dice cuál tienes.

  • El texto compilado dentro del código C# es la frontera dura. En compilaciones Mono, RuneTranslate lee los literales de cadena del ensamblado del juego con un sidecar incluido, filtrando según lo que hace el punto de llamada con ellos, para no traducir nunca el nombre de una escena o un parámetro de animator. En compilaciones IL2CPP, el código compilado queda fuera de alcance.
  • El texto de los recursos en IL2CPP sí funciona, en cambio. Los campos de cadena de los componentes se leen en IL2CPP reconstruyendo la información de tipos a partir de los metadatos del juego — el mismo global-metadata.dat que necesita el hook, usado con otro fin.
  • Lee la propia salida de XUnity. Si ya tienes un _AutoGeneratedTranslations.txt con contenido, RuneTranslate analiza ese archivo y puede traducir los valores, sin tocar las claves. El trabajo que ya hiciste no se tira.
  • Las fuentes se resuelven al exportar, inyectando en el juego un recurso de fuente de reserva para que un idioma de destino que la fuente original nunca cubrió se siga renderizando.

Nueve proveedores, tres de los cuales no necesitan ninguna clave de API — Google, DeepL gratuito y los modelos Classic / Next-gen de DeepL — más la API de DeepL, OpenAI, Anthropic, DeepSeek, cualquier endpoint compatible con OpenAI y un modelo local a través de Ollama o LM Studio. El nivel gratuito desbloquea todos los motores y todos los proveedores; limita el rendimiento y mantiene un proyecto a la vez. Windows 10/11, o Linux y la Steam Deck con Wine o Proton. Se requiere un inicio de sesión gratuito de Patreon en el primer arranque. La salida es una compilación traducida y jugable que te quedas.

Ninguno de los dos enfoques es universalmente correcto. Un juego cuyo guion entero está en una tabla JSON incluida es un trabajo a nivel de archivo y siempre lo fue. Un juego que compone su diálogo en código en tiempo de ejecución es un trabajo para un hook y siempre lo será. Saber cuál tienes entre manos es la mayor parte del trabajo.

Adónde ir ahora

  • Cómo traducir juegos de Unity — el recorrido completo, incluido qué externaliza Unity y qué no.
  • La página del motor Unity — los formatos soportados y los límites actuales en un solo sitio.
  • RuneTranslate frente a XUnity.AutoTranslator — los dos enfoques uno al lado del otro, con los casos que gana cada uno.
  • Elegir un proveedor de traducción — qué motores manejan bien la prosa japonesa y cuáles no cuestan nada.
  • Fundamentos del glosario — mantener coherentes los nombres de personajes y la terminología en todo un guion.
  • Todos los motores soportados — por si al final el juego no era Unity.
Lecturas relacionadas
01

Por qué la traducción sale en recuadros

unitytextmeshprofontstroubleshooting18 ago 2026 · 9 min
Leer →
02

Cómo traducir un juego de Unity al inglés

unitytutorialengine9 jun 2026 · 6 min
Leer →
03

Cómo traducir juegos de RPG Maker

rpg-makerhow-toenginecontrol-codes18 ago 2026 · 10 min
Leer →

¿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