---
title: "Cómo traducir una exportación de WPML (archivos XLIFF en un ZIP)"
description: "WPML exporta tus entradas de WordPress como archivos XLIFF dentro de un ZIP. Esto es lo que contiene realmente ese archivo y cómo traducirlo todo en un solo proyecto."
date: 2026-09-02
language: es
canonical: https://ai-glot.com/es/blog/translate-wpml-export-xliff-zip
source: AI Glot blog
---
**Si acabas de exportar proyectos de traducción desde WPML y tienes un archivo ZIP sin saber qué hacer con él, esta es la guía.** No necesitas descomprimirlo ni abrir ni un solo archivo XLIFF.

## Qué tienes realmente en las manos

La exportación de WPML es un archivo ZIP con una carpeta en su interior, llamada `posts/`, y un archivo `.xliff` por cada entrada. Nada más.

Las cifras que verás a continuación provienen de una exportación real de 44 entradas, medidas y no estimadas, para que puedas compararlas con las tuyas.

*Illustration: Una exportación de WPML es un ZIP que contiene un archivo XLIFF por entrada. Este incluía 44 entradas, 228 unidades traducibles y cuatro idiomas de destino.*

Hay dos cosas sobre ese archivo que suelen sorprender a la mayoría.

**Cada archivo declara su propio par de idiomas.** El elemento `<file>` al principio de cada XLIFF indica el idioma de origen y el de destino:

```xml
<file original="103-3aeb85935a8505760aa368dc691898a7"
      source-language="fr"
      target-language="en"
      datatype="plaintext">
```

Así, una sola exportación puede contener cuatro idiomas de destino a la vez, como ocurre en el ejemplo: del francés al inglés, alemán, español e italiano. El archivo no es un único proyecto de traducción. Son cuatro, entrelazados.

**WPML te indica el tamaño del proyecto.** Cada archivo incluye su propio recuento de palabras en un atributo personalizado:

```xml
tool:wpml-words-to-translate-count="843"
```

Súmalos y sabrás exactamente a qué te enfrentas antes de comprometerte con nada. En el ejemplo: 34.829 palabras.

## Qué hay dentro de un archivo

Un archivo XLIFF es XML. Cada fragmento de texto traducible es un `<trans-unit>` con un `<source>` y un `<target>`, y el contenido está envuelto en `CDATA` para que el HTML interno de una entrada no rompa el XML que lo rodea.

Aquí tienes una unidad completa. Esta ya había pasado por la memoria de traducción, como indican los atributos `state`:

```xml
<trans-unit resname="title" restype="string" datatype="html" id="title">
  <source><![CDATA[Bien ventiler son logement en hiver]]></source>
  <target state="needs-review-translation" state-qualifier="tm-suggestion">
    <![CDATA[Ventilating your home in winter]]>
  </target>
  <tool:extradata unit="Title" type="text" group="Main Content" group_id="Main_Content-0"/>
</trans-unit>
```

Las unidades en ese estado fueron la excepción en la exportación: 18 de 228. **Las otras 210 no tienen ningún atributo `state`**, y su destino contiene el texto de origen palabra por palabra.

**Y aquí está el detalle que determina cómo abordar todo el proyecto.**

*Illustration: WPML copia el origen en el destino como punto de partida, por lo que un archivo lleno de destinos puede no tener nada traducido aún.*

WPML escribe el texto de origen en el destino como punto de partida. Por lo tanto, un archivo XLIFF donde cada `<target>` esté relleno no es un archivo traducido. En la exportación real, 217 de las 228 unidades aún contenían el texto de origen palabra por palabra. Solo 18 incluían una sugerencia real de la memoria de traducción, marcada como `state="needs-review-translation"`.

Si echas un vistazo rápido al archivo, concluirás que ya está terminado. No es así.

### Las unidades que encontrarás

WPML no solo exporta el cuerpo de la entrada. En la exportación de ejemplo, las 228 unidades se desglosaban así:

| ID de unidad | Qué es | Cantidad |
|---|---|---|
| `title` | el título de la entrada | 40 |
| `body` | el contenido de la entrada, como HTML | 36 |
| `URL` | el slug | 32 |
| `t_N` | categorías y etiquetas | 68 |
| `field-_yoast_wpseo_title` | título de Yoast SEO | 16 |
| `field-rank_math_title` | título de Rank Math SEO | 16 |
| `field-_yoast_wpseo_metadesc` | meta descripción de Yoast | 8 |
| `field-rank_math_description` | meta descripción de Rank Math | 8 |
| `package-string-N` | cadenas del constructor de páginas | 4 |

Cada unidad lleva también una etiqueta `<tool:extradata>` que indica qué es y a qué grupo pertenece, lo que permite diferenciar una categoría de un título sin tener que adivinar.

Fíjate en los campos del plugin de SEO. **Tus meta títulos y descripciones están en este archivo**, lo cual es una buena noticia y una decisión pendiente: una meta descripción traducida literalmente rara vez es la que consigue el clic en el idioma de destino.

Fíjate también en `URL`. Tus slugs son traducibles y, en el ejemplo de exportación, se habían dejado deliberadamente en el idioma de origen. Es una decisión real con consecuencias para tus enlaces actuales, y solo tú puedes tomarla.

### Los shortcodes ya están declarados

Esto es lo mejor que hace WPML y casi nadie lo nota. El encabezado de cada archivo contiene una frase que enumera todos los shortcodes registrados en tu sitio:

```xml
<phase phase-name="shortcodes" process-name="Shortcodes identification">
  <note>wp_caption,caption,gallery,playlist,audio,video,embed,
  wpml_language_switcher,product_brand,...</note>
</phase>
```

Tus shortcodes personalizados están ahí junto a los de WordPress. Es una lista legible por máquina de elementos que deben sobrevivir al proceso intactos.

## Por qué las rutas obvias son perjudiciales

*Illustration: Los mismos 44 archivos, gestionados uno a uno o enviados en un único trabajo.*

**Abrirlos uno por uno** implica buscar las líneas de destino dentro del XML, traducir evitando las etiquetas HTML y los shortcodes, guardar y repetir el proceso 43 veces más. Y lo mismo para cada uno de los otros tres idiomas.

**Enviarlos a un traductor o a una agencia** significa que el trabajo lingüístico será correcto, pero el técnico no. Estás pagando una tarifa por hora de experto para que alguien tenga cuidado con el XML, y volverás a pagarlo en la próxima actualización de contenido. El coste es la coordinación, no la tarifa por palabra.

**Pegar el cuerpo en un asistente de chat** funciona para una entrada. Para la décima, habrás perdido la cuenta de qué archivos están listos, la terminología habrá variado y ninguna decisión se trasladará de un archivo al siguiente.

## El proceso completo, en cinco pasos

*Illustration: El proceso completo. Todo lo anterior al paso cuatro es gratuito, por lo que corregir un plan erróneo no tiene coste.*

Todo lo anterior al paso cuatro es gratuito. Esto es más importante de lo que parece: un plan que haya interpretado mal tu archivo no cuesta nada corregirlo, así que no hay motivo para hacer suposiciones.

## Dos formas de ejecutar el proceso intermedio

Los pasos del dos al cuatro pueden realizarse en un navegador o totalmente desde la terminal. La elección cambia quién escribe, no el resultado obtenido.

*Illustration: Dos formas de ejecutar la misma tarea. Elija cualquiera; ambas convergen en el mismo archivo.*

Elige según tu forma habitual de trabajar. Si estás leyendo esto con una terminal abierta, la opción B requiere menos pasos. Si no es así, la opción A no es una versión inferior.

## Ruta 1: enviar el ZIP tal cual

AI Glot acepta tanto XLIFF como ZIP, por lo que una exportación de WPML se sube sin abrir. Sube el archivo y describe el trabajo en una frase.

La instrucción es texto libre, y aquí es donde las peculiaridades de la exportación pasan de ser molestas a ser sencillas:

```
Translate every trans-unit into the target language declared in each file.
Only translate units where the target still holds the same text as the source.
Leave the URL units exactly as they are.
Keep every shortcode, HTML tag and CDATA wrapper untouched.
```

Lee esa segunda línea otra vez, porque es la que importa. **"Traduce solo las unidades donde el destino todavía tenga el mismo texto que el origen"** es exactamente la situación de 217 de 228 descrita anteriormente, y significa que no pagas por rehacer las 18 unidades que tu memoria de traducción ya había gestionado.

Recibes un plan antes de gastar nada: los idiomas detectados, el alcance, el recuento de palabras y el coste. Si el plan ha interpretado algo mal, corrígelo en una frase y volverá a planificar. Después, descargas un ZIP con la misma estructura, listo para importar.

## Ruta 2: dejar que tu agente de IA lo haga

Si trabajas con Claude, ChatGPT, Cursor o cualquier otro agente de programación, no tienes que usar el navegador para nada. Nuestra herramienta de línea de comandos inicia sesión con OAuth y procesa un archivo directamente, permitiendo que un agente ejecute todo el trabajo.

Instala e inicia sesión una vez:

```bash
npm install -g @ai-glot/cli
aiglot auth login
```

Eso abrirá el navegador para autorizar la máquina. En un servidor sin navegador, usa `aiglot auth login --device` para el flujo de código de dispositivo, o `aiglot auth login --key <key>` en CI.

Luego, dale a tu agente la ubicación del archivo y deja que trabaje. Algo como esto es suficiente:

```
My WPML export is at ~/Downloads/my-site-export.zip. It is a ZIP of XLIFF
files, one per WordPress post, and each file declares its own target
language.

Use the aiglot CLI to translate it. Run `aiglot batches create --help` and
`aiglot batches approve --help` first so you use the real flags. Create the
batch from the ZIP with an instruction that translates only the units whose
target still equals the source, and leaves the URL units alone. Show me the
plan and the cost before you approve anything. Use the lite quality tier.
Then poll until it is done and download the result next to the original.
```

Hay dos cosas que hacen que ese prompt funcione, y ambas merecen la pena copiarse.

**Le indica al agente que lea la ayuda primero.** Un agente que adivine los nombres de los flags fallará en la primera llamada y luego inventará una razón. `aiglot help --json` vuelca todos los comandos, flags y códigos de salida de una vez si prefiere una estructura.

**Pone un freno antes del gasto.** `aiglot batches approve` es el único comando que consume créditos. Todo lo anterior es gratuito, por lo que pedir ver el plan primero no cuesta nada y evita el tipo de malentendido más costoso.

Como referencia, esta es la secuencia que el agente acabará ejecutando:

```bash
# 1. Create the batch. Free. Returns a plan and an id.
aiglot batches create ~/Downloads/my-site-export.zip \
  --instruction "Translate every trans-unit into the target language declared in each file. Only translate units whose target still holds the same text as the source. Leave URL units unchanged. Keep shortcodes, HTML and CDATA intact." \
  --json

# 2. Approve. This is the only step that spends credits.
aiglot batches approve <batch-id> --quality lite

# 3. Poll until it finishes.
aiglot batches get <batch-id> --json

# 4. Download the translated archive.
aiglot batches download <batch-id> --output ~/Downloads/my-site-export.translated.zip
```

También hay un servidor MCP (`aiglot mcp`) si tu agente prefiere herramientas en lugar de una shell. La CLI es el mejor punto de partida: funciona en un script, funciona en CI y puedes ver exactamente qué se ejecutó.

## Cómo integrar tu glosario

Si tu sitio tiene términos que no deben variar, como el nombre de un producto o una traducción interna de una frase recurrente, añádelos una vez al glosario del espacio de trabajo. Se aplicarán a cada archivo del archivo y también a la siguiente exportación.

Esta es la parte que un traductor automático gestiona mal. Su glosario sustituye un término dondequiera que aparezca. Aquí, un glosario se trata como un lema, por lo que se inflecta y conjuga según la frase que lo rodea en lugar de soltar una cadena fija en medio de ella.

## Importar de vuelta a WPML

El archivo traducido regresa con la misma estructura: la misma carpeta `posts/`, los mismos nombres de archivo, las mismas unidades en el mismo orden, con los objetivos rellenos. La pantalla de trabajos de traducción de WPML lo acepta de la misma forma que te lo entregó.

*Illustration: La unidad es la misma antes y después. Solo ha cambiado la línea de destino, que es precisamente la promesa de una traducción inversa.*

Dos sugerencias basadas en la forma del propio archivo. **Importa primero un solo archivo** y revisa la entrada en WordPress antes de confirmar todo el archivo, porque una cadena de un constructor de páginas fuera de lugar es mucho más fácil de detectar renderizada que en XML. Y **decide los slugs antes de importar**, no después: cambiar una URL publicada implica una redirección que tendrás que mantener.

## El alcance real de esto

Usa esto para el grueso del trabajo. Cuarenta y cuatro entradas en cuatro idiomas es exactamente la tarea que resulta miserable a mano y banal en una sola pasada. Después, reserva la revisión humana para donde realmente aporte valor: tus páginas con más tráfico y cualquier contenido donde la redacción sea el producto. Muchos equipos usan AI Glot como primera pasada y hacen que un revisor supervise el resultado, lo cual es un buen uso de un experto y un mal uso de una tarde dedicada a analizar XML.

Para una página de inicio, contrata a un traductor. Para el archivo de 44 entradas que exportaste esta mañana, no te pases la semana en ello.

---

*La estructura de exportación descrita aquí se basó en una exportación real de WPML de 44 entradas en cuatro pares de idiomas. Tu exportación puede variar si tu sitio usa un constructor de páginas o un plugin de SEO diferente, y los IDs de las unidades reflejarán tus propios plugins. La carpeta `posts/`, el formato XLIFF 1.2, el par de idiomas por archivo y los objetivos copiados de la fuente son las partes que fueron consistentes en los 44 archivos.*