Unity exporta las String Tables como CSV, XLIFF o JSON, y el formato que elijas determina cómo se organiza todo el trabajo. No la calidad ni el coste, sino la organización. CSV te da un único archivo con una columna por idioma. XLIFF te da un archivo por idioma. Si eliges el formato que no encaja con tu forma de trabajar, un trabajo de dos horas puede alargarse hasta dos semanas.
Esta guía explica los dos formatos importantes para la traducción, qué contiene realmente cada exportación y cómo traducir sin editar manualmente ni una sola fila. También hablamos de Google Sheets, pero como función de sincronización, no como formato de exportación.
Formatos de exportación y sincronización con Google Sheets
El manual actual de Unity enumera CSV, XLIFF y JSON como formatos de exportación, además de la exportación de un conjunto de caracteres para fuentes. Google Sheets es otra cosa: el paquete permite sincronizar una hoja con una String Table Collection, es decir, sincronizar datos en vez de exportar un archivo. AI Glot admite CSV y XLIFF de forma nativa, así que no hace falta convertirlos.
Sin embargo, no son intercambiables, y aquí es donde conviene dedicar dos minutos:
- Un archivo por idioma
- Una columna por locale, una al lado de la otra
- Un solo trabajo los rellena todos
- Fácil de revisar visualmente en una hoja de cálculo
- Coincidencia por Key o Id al importar
- Un archivo por idioma de destino
- Cada archivo contiene un idioma de origen y uno de destino
- Diez idiomas son diez archivos
- Lo que suele pedir una agencia de traducción
- Versión 1.2 o 2.0, tú eliges
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 texto de origen con uno de destino, así que Unity genera un archivo por idioma y añade el código del idioma al nombre: una colección llamada MyGame se exporta como MyGame-ru para ruso y MyGame-ja para japonés. No es una limitación de Unity, sino una característica del formato. Unity admite XLIFF 1.2 y 2.0, los estándares de OASIS 1.2 y 2.0, y AI Glot lee ambas versiones. En la versión 1.2, cada cadena es un trans-unit con un texto de origen y otro de destino, con esta estructura:
<xliff version="1.2">
<file source-language="en" target-language="fr" datatype="plaintext" original="MyGame">
<body>
<trans-unit id="4102">
<source>Start game</source>
<target>Commencer</target>
</trans-unit>
</body>
</file>
</xliff>
Google Sheets es una forma de sincronizar, no un formato de exportación. Mantienes una hoja sincronizada con tu colección y la vuelves a importar cuando está completa. Si ya trabajas así, exporta la hoja como CSV o XLSX y el proceso será idéntico al de CSV. Cuando preguntaron a un miembro del equipo de Unity cómo exportar todas las tablas a CSV, recomendó usar Google Sheets o XLIFF, y el manual indica que al exportar a XLIFF puedes seleccionar las tablas que quieres incluir.
Por tanto, la recomendación sincera es esta: elige CSV, salvo que algún paso posterior del proceso requiera XLIFF. En la sección siguiente explicamos por qué Smart Strings inclina aún más la balanza. Diez idiomas en un solo archivo implican un solo trabajo que ejecutar, un solo plan que consultar y un solo archivo que volver a importar.
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 los campos que permiten vincular las filas. Unity los utiliza para encontrar las coincidencias al volver a importar y se guía por los nombres de las columnas. Para asociar una fila, Unity necesita que coincida Key o Id. Si cambias Key, la tratará como una entrada distinta, así que una Key traducida no coincidirá con la entrada que utilizan tus otros idiomas. Indica claramente qué columnas hay que traducir y cuáles hay que dejar intactas para evitarlo.
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.
Al volver a importar el archivo, Unity te pide que elijas un modo de importación. Merge actualiza las claves coincidentes, añade las nuevas y conserva todo lo demás. Replace hace que la colección coincida con el archivo y elimina las claves que no aparecen en él. Por eso, usa Merge salvo que quieras eliminar claves.
Qué conserva cada formato
La misma página de la versión 6000.7 indica qué se conserva en cada exportación. XLIFF solo incluye claves, identificadores y valores, sin indicadores Smart, variantes ni comentarios. CSV conserva claves, identificadores, indicadores Smart, valores y comentarios, mientras que JSON conserva claves, identificadores, indicadores Smart, valores y variantes, pero no los comentarios. Si una tabla está llena de Smart Strings, CSV es la opción más segura para hacer el recorrido de ida y vuelta, porque conserva el indicador Smart en cada fila. Si tu proveedor exige XLIFF, conserva la colección original como versión maestra y vuelve a importarla con Merge.
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 incluye lógica en el propio texto. Un marcador de posición vacío es {}. Uno con nombre aporta contexto al traductor, como {PlayerName}. Los plurales siguen las reglas de Unicode CLDR mediante el formateador de plurales de Unity, así que una misma entrada puede ser {0:plural:is 1 item|are {} items}. También se pueden anidar: {User.Address:{Street}, {City}}. Cada idioma necesita un número distinto de formas plurales: el japonés tiene una, mientras que el ruso tiene tres o más (one, few, many y other en CLDR). Por eso, una entrada de plural en inglés adopta una estructura distinta en cada idioma.
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.
- Decide QUÉ texto se traduce
- Se lee una vez, basándose en el archivo
- "Rellenar la columna de francés vacía"
- "No toques la Clave, el Id ni los comentarios"
- Decide CÓMO se escribe cada línea
- Se aplica al escribir cada una de las cadenas
- "Mantén cada marcador de posición {curly-brace} exactamente como está escrito"
- "Mantén las etiquetas de la interfaz de usuario en menos de 20 caracteres"
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 estamos, aquí va la otra regla propia de los videojuegos: un botón que cabe en inglés se sale de su espacio en alemán. El texto traducido suele ser más largo, según la combinación de idiomas, y las cadenas cortas son las que más se expanden: el artículo de la W3C sobre el tamaño del texto cita una recomendación de IBM de entre el 200 y el 300 % para cadenas de hasta 10 caracteres. Puedes indicar un límite para cada cadena, de modo que el texto se redacte para que quepa en vez de recortarlo después. Indícalo una sola vez para las entradas que aparecen en una interfaz 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
- 1ExportarTablas de cadenas a CSVEn Unity
- 2CrearUn solo trabajo, todos los localesGratis
- 3Leer el planColumnas, palabras, costeGratis
- 4AprobarTu decisión, y el único gastoConsume créditos
- 5ResponderEn el repo, listo para importarAgente
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 --yes \
--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.
La información sobre el comportamiento de exportación de Unity que se describe aquí procede de la documentación de la versión 1.5 del paquete Localization: la estructura de columnas de CSV, la correspondencia mediante Key e Id, las columnas de comentarios, la compatibilidad con XLIFF 1.2 y 2.0, los nombres de los archivos XLIFF por idioma, el contenido de cada formato y los modos Merge y Replace del manual actual de la versión 6000.7. Comprueba qué versión del paquete utilizas si la exportación no coincide con lo descrito. Los límites de los archivos indicados son los vigentes cuando se redactó este texto.
