Unity te ofrece tres formas de exportar tus tablas de strings, y la que elijas determinará la estructura de todo el trabajo. No la calidad, ni el coste: la estructura. Una ruta te entrega un único archivo con una columna por idioma. Otra te entrega un archivo por idioma. Elegir la opción incorrecta según tu forma de trabajar es lo que convierte un trabajo de dos horas en uno de quince días.
Esta es una guía sobre las tres opciones, qué contiene exactamente cada exportación y cómo ejecutar la traducción sin tener que editar manualmente ni una sola fila.
Las tres rutas para exportar una String Table Collection
El paquete de Localization de Unity exporta las String Table Collections a CSV, XLIFF y Google Sheets. Ese es todo el menú, y los tres formatos son compatibles con AI Glot de forma nativa, por lo que ninguno requiere un paso de conversión.
Sin embargo, no son intercambiables, y aquí es donde conviene dedicar dos minutos:
- One file for every language
- One column per locale, side by side
- One job fills all of them
- Easy to eyeball in a spreadsheet
- Matches on Key or Id at import
- One file per target language
- Each file is one source and one target
- Ten languages is ten files
- What a translation vendor usually asks for
- Version 1.2 or 2.0, your choice
CSV mantiene los idiomas agrupados. Una tabla puede tener tantas columnas como quieras, así que un solo archivo contiene el inglés, el francés, el japonés y todo lo demás a la vez, y un solo trabajo de traducción puede completar cada columna vacía en una sola pasada.
XLIFF los separa. Por diseño, un archivo XLIFF empareja un idioma de origen con uno de destino, por lo que Unity escribe un archivo independiente por idioma y añade el código del idioma al nombre: una colección llamada MyGame se exporta como MyGame-ru para el ruso, MyGame-ja para el japonés. No es una limitación de Unity, es la naturaleza del formato. Unity es compatible con XLIFF 1.2 y 2.0, y AI Glot lee ambos.
Google Sheets es la estructura de CSV con un botón de sincronización. Envía tu colección a una hoja y recupérala cuando esté completada. Si ya trabajas así, exporta la hoja a CSV o XLSX y el proceso será idéntico a la ruta de CSV.
Así que la recomendación honesta: elige CSV a menos que algo en el flujo de trabajo exija XLIFF. Diez idiomas en un solo archivo significan un solo trabajo a ejecutar, un solo plan a leer y un solo archivo a reimportar.
Qué contiene exactamente la exportación en CSV
Ábrelo una vez y todo el flujo de trabajo dejará de ser misterioso. Una exportación básica tiene una columna Key, una columna Id y una columna por cada locale nombrada según el idioma y su código, como English(en) y French(fr). Si exportas con comentarios, también obtendrás una columna de Shared Comments y una específica por locale, como French(fr) Comments.
Key,Id,English(en),French(fr)MENU_BTN_START,4102,Start game,MENU_BTN_START,4102,Start game,CommencerHUD_AMMO_LEFT,4103,{0} rounds left,HUD_AMMO_LEFT,4103,{0} rounds left,{0} balles restantesNPC_SMITH_GREET,4104,Need something forged?,NPC_SMITH_GREET,4104,Need something forged?,Une pièce à forger ?Dos columnas de ese archivo deciden si la importación funciona o no.
Key e Id son el vínculo. Unity hace coincidir las filas basándose en ellas al reimportar, y utiliza los nombres de los encabezados de las columnas para encontrarlas. Si se traduce una Key, el error no es evidente: la fila simplemente deja de coincidir y una cadena de texto vuelve silenciosamente a su valor por defecto en todos los idiomas. Indica claramente qué columnas traducir y cuáles dejar intactas para evitar que esto ocurra.
Las columnas de comentarios son contexto, no contenido. Si tu equipo escribe notas para los traductores en Shared Comments, esas notas son útiles de leer pero erróneas de traducir. Identifícalas.
Lo que suele fallar, y no es la sincronización
Las Smart Strings de Unity son el verdadero peligro en la String Table de un juego, y son invisibles para cualquier sistema que traduzca palabra por palabra.
Una Smart String contiene lógica dentro del texto. Un marcador de posición vacío es {}. Uno con nombre aporta contexto al traductor, como {PlayerName}. Los plurales siguen las reglas Unicode CLDR a través de un formateador, por lo que una sola entrada puede decir {0:plural:is 1 item|are {} items}. También se pueden anidar: {User.Address:{Street}, {City}}.
Un traductor que no conoce la sintaxis podría reordenar las llaves, traducir la palabra plural o, con buena intención, convertir {PlayerName} en {NomDuJoueur}. Cada uno de estos casos provoca un error en tiempo de ejecución en lugar de una simple errata, y te darás cuenta cuando un jugador envíe una captura de pantalla.
Esto debe ir en la instrucción a nivel de cadena (string-level instruction), y entender bien esta distinción es lo más útil de este artículo.
- Decides WHICH text is translated
- Read once, against the file
- "Fill the empty French column"
- "Leave Key, Id and the comments alone"
- Decides HOW each line is written
- Applied as every single string is written
- "Keep every {curly-brace} placeholder exactly as written"
- "Keep UI labels under 20 characters"
Si pones una regla de marcadores de posición en el plan, no servirá de nada. Si pones una regla de columna en la ranura de nivel de cadena, no hará absolutamente nada y en silencio, porque en ese punto no hay ningún archivo a la vista. Ambos fallos son discretos, por eso merece la pena dedicarles treinta segundos.
Ya que estás ahí, otra regla fundamental para videojuegos: un botón que encaja en inglés puede desbordarse en alemán. El texto traducido suele ser entre un 15 y un 30% más largo, y una instrucción a nivel de cadena puede solicitar un límite de caracteres para que la frase se escriba ajustada en lugar de recortarla después. Indícalo una sola vez para las entradas que vivan en una UI de ancho fijo.
Ejecución, opción uno: el navegador
Sube el CSV en el traductor de CSV o en la aplicación y describe el trabajo en una sola frase. Algo así, y deliberadamente sencillo:
The source is the English(en) column. Fill the empty French(fr), German(de)
and Japanese(ja) columns. Leave Key, Id, English(en) and every Comments
column exactly as they are.
Recibirás un plan antes de gastar nada: las columnas detectadas, el alcance, el recuento de palabras y el coste. Si el sistema leyó mal tu archivo, corrígelo en una frase y volverá a planificar. Todo antes de la aprobación es gratuito, así que una lectura errónea no te cuesta nada más que el tiempo de volver a escribir una cláusula.
Luego descarga un CSV, con las mismas columnas, la misma Key y el mismo Id, y vuélvelo a importar en Unity.
Ejecución, opción dos: tu agente gestiona todo el ciclo
Si trabajas con Claude, Cursor, Copilot o cualquier agente que pueda ejecutar comandos en tu proyecto, puede hacer todo esto sin que tengas que abrir el navegador y puede colocar los resultados donde Unity los espera.
Instala e inicia sesión una vez:
npm install --global @ai-glot/cli
aiglot auth login
- 1ExportString Tables to CSVIn Unity
- 2CreateOne job, all localesFree
- 3Read the planColumns, words, costFree
- 4ApproveYour decision, and the only spendSpends credits
- 5Write backInto the repo, ready to importAgent
Aquí tienes un prompt que puedes darle a tu agente. Está escrito para ser copiado y pegado, y las partes importantes se explican a continuación.
Our Unity String Table export is at Assets/Localization/Export/MyGame.csv.
Columns: Key, Id, English(en), and empty columns for French(fr), German(de)
and Japanese(ja).
Use the aiglot CLI to translate it. Run `aiglot batches create --help` and
`aiglot batches approve --help` first so you use the real flags.
Plan instruction: the source is English(en); fill only the empty French(fr),
German(de) and Japanese(ja) cells; leave Key, Id, English(en) and any
Comments column untouched.
Approval instructions: keep every curly-brace placeholder exactly as written,
including plural formatters and nested ones; never translate a placeholder
name; keep entries whose Key starts with MENU_ or HUD_ under 20 characters.
Use the lite quality tier. Show me the plan and the total cost BEFORE you
approve anything, then wait for me to confirm.
After I confirm, poll until it reaches a terminal status, download the result
over the original path, and tell me the row count so I can re-import in Unity.
Indica al agente que lea la ayuda primero. Un agente que adivina los nombres de los flags falla en la primera llamada y luego inventa una razón del porqué.
Separa explícitamente los dos tipos de instrucciones, que es el objetivo de la sección anterior. Escrito así, el agente coloca cada una en el lugar correcto en vez de fusionarlas en un bloque que solo funciona a medias.
Se detiene antes del gasto. aiglot batches approve es el único comando que consume créditos. Todo lo anterior es gratuito y repetible, por lo que un agente que itere sobre tus locales sin supervisión no puede sorprenderte con una factura. Esa propiedad es lo que hace que delegar esto en un agente sea razonable en lugar de temerario.
Termina con un número para verificar. Pedir el recuento de filas te permite hacer una prueba de coherencia rápida antes de volver a importar.
Como referencia, la secuencia que sigue:
# 1. Create the job. Free. Returns a plan and an id.
id=$(aiglot batches create Assets/Localization/Export/MyGame.csv \
--instruction "The source is English(en). Fill only the empty French(fr), German(de) and Japanese(ja) cells. Leave Key, Id, English(en) and Comments columns unchanged." \
--json | jq -r '.data.id')
# 2. Read the plan for free, and only then commit.
aiglot batches get "$id" --json | jq '.data.plan'
# 3. The only step that spends credits.
aiglot batches approve "$id" --quality lite \
--instructions "Keep every curly-brace placeholder exactly as written. Never translate a placeholder name. Keep MENU_ and HUD_ entries under 20 characters."
# 4. Wait for a TERMINAL status, not for a specific one.
until status=$(aiglot batches get "$id" --json | jq -r '.data.status'); \
[ "$status" = "completed" ] || [ "$status" = "failed" ] || [ "$status" = "cancelled" ]; do
sleep 5
done
# 5. Back into the project.
[ "$status" = "completed" ] && \
aiglot batches download "$id" --output Assets/Localization/Export/MyGame.csv
También hay un servidor MCP, aiglot mcp, si tu agente prefiere herramientas a una shell. Empieza con la CLI: funciona en scripts, funciona en CI y puedes leer exactamente qué se ejecutó.
Si elegiste la ruta XLIFF
Un archivo por idioma significa un trabajo por idioma, y eso está bien hasta que son diez. Hay dos formas de gestionarlo.
Ponlos en un solo ZIP. Hasta 200 archivos y 20 MB, con un máximo de 4 MB por archivo. Cada XLIFF del archivo debe ser la misma versión, 1.2 o 2.0, pero se permite que tengan diferentes idiomas de destino, que es exactamente el formato que produce la exportación de Unity. Un solo trabajo, una instrucción y un glosario aplicado a todo el conjunto.
O itera con la CLI, como hace el prompt anterior, un lote por archivo. Más trabajos, pero cada plan se puede revisar por separado, algo que algunos equipos prefieren en la primera ejecución. De cualquier forma, los archivos se devuelven como XLIFF en la versión en que llegaron, con los segmentos de origen intactos y solo los de destino completados.
El factor que decide la calidad: tu propio vocabulario
Todo lo anterior es infraestructura. El motivo por el cual un juego traducido se lee bien o mal es si tus términos se mantienen consistentes.
Añade una sola vez al glosario del espacio de trabajo las palabras que no deben variar: nombres de personajes, nombres de objetos y hechizos, nombres de facciones o la traducción oficial de una frase recurrente. Al pertenecer al espacio de trabajo y no a un solo trabajo, se aplica a cada String Table que envíes posteriormente, incluida la exportación que hagas dentro de seis meses cuando el juego haya crecido cuatro mil entradas. Eso es lo que hace que el archivo número veinte coincida con el archivo número uno.
Deja que tu agente lo redacte. El glosario es accesible a través de MCP, con herramientas para listar, leer y editar términos. Así, el mismo agente que acaba de leer tus tablas de cadenas puede extraer los nombres propios y las palabras inventadas recurrentes, entregarte la lista y escribir los términos aprobados en el espacio de trabajo antes de que se ejecute la primera traducción. Un glosario que nadie completa no protege nada y, en un juego con mil términos inventados, rellenarlo a mano es la tarea que se pospone indefinidamente.
Aquí es donde un traductor automático general falla, y la razón es mecánica más que una cuestión de estilo. Su glosario sustituye un término siempre que haya una coincidencia, sin reconsiderar la frase que lo rodea. En cambio, aquí el glosario se integra como significado mientras se escribe la línea, por lo que el nombre se flexiona según la gramática en lugar de simplemente insertarse en medio de ella.
El alcance real de esto
No pases tu primera hora de juego por aquí para luego publicarlo. Los primeros treinta minutos de un juego, la página de la tienda y cualquier frase que un jugador sea propenso a citar son escritura, y la escritura merece a una persona. Son unos pocos cientos de palabras que concentran la mayor parte de tu riesgo reputacional, por lo que pagar a un experto nativo es barato en términos absolutos y, obviamente, merece la pena.
Las otras nueve mil entradas son un trabajo distinto, y esta es la distinción que conviene interiorizar: el volumen y la importancia no están correlacionados. Etiquetas de menú, tooltips, descripciones de objetos, registros de misiones, textos de logros, cadenas de error: ahí es donde realmente se invierten las horas, y es un trabajo miserable a mano y mediocre en una sola pasada. Procesa el grueso aquí y luego elige tu propio límite: lánzalo directamente a la versión final, o añade una revisión profesional en tus dos mercados principales, o solo en los textos de las misiones, y deja el resto tal cual. Ninguna de estas opciones es una reparación de una primera pasada fallida, y todas ellas hacen que el tiempo de tu revisor se dedique al lenguaje y no a las hojas de cálculo.
Si quieres probarlo con un archivo real antes de comprometerte con un flujo de trabajo, el traductor de CSV acepta exportaciones sin necesidad de cuenta. Tienes una visión más amplia en nuestra guía para traducir un videojuego, y la página de localización de juegos cubre los formatos más allá de Unity si tu estudio publica en más de un motor.
El comportamiento de exportación de Unity descrito aquí procede de la documentación del paquete de Localization para la versión 1.5: la disposición de las columnas CSV, la coincidencia de Key e Id, las columnas de comentarios, el soporte para XLIFF 1.2 y 2.0, y la nomenclatura de XLIFF por idioma. Comprueba la versión de tu propio paquete si tu exportación es distinta; los límites de archivo citados son los vigentes en el momento de escribir esto.