CaracterísticasPluginPreciosRecursos
Cambiar idioma
RecursosCómo compilar archivos .po a .mo (4 Métodos)

Cómo compilar archivos .po a .mo (4 Métodos)

SimplePoTranslate Team3 de mayo de 2026
Cómo compilar archivos .po a .mo (4 Métodos)

Pasaste una tarde perfeccionando una traducción al alemán. Cada cadena en tu archivo de_DE.po se lee a la perfección, los marcadores de posición están intactos, los plurales son correctos. Lo subes a tu sitio, cambias el idioma a alemán y... nada. La página sigue en inglés. Verificas dos veces el nombre del archivo, la carpeta, el dominio de texto. Todo parece estar bien. Entonces, ¿por qué WordPress no muestra tu traducción?

Nueve de cada diez veces la respuesta es la misma: editaste el .po pero nunca lo compilaste a .mo. WordPress no lee archivos .po en tiempo de ejecución, carga el binario .mo compilado. Si quieres que tus traducciones aparezcan realmente, necesitas compilar po a mo cada vez que cambies el texto. El .po es tu fuente editable; el .mo es lo que sirve el sitio.

Esta guía explica por qué existe ese paso de compilación y luego detalla cuatro formas confiables de hacerlo: WP-CLI, el comando clásico msgfmt, Poedit y una herramienta en la nube que produce el .mo automáticamente. También cubriremos el error más común — olvidarse de recompilar — y el formato más reciente .l10n.php que WordPress ahora prefiere para mayor velocidad.

¿Por qué WordPress carga .mo y no .po?

WordPress carga archivos .mo porque son binarios compilados optimizados para búsquedas rápidas, mientras que los archivos .po son texto plano creados para que los humanos los lean y editen. Analizar texto en cada carga de página sería lento; leer una tabla hash binaria preconstruida es casi instantáneo.

Un archivo .po está basado en líneas y es fácil de usar para humanos. Cada entrada empareja un msgid de origen con un msgstr traducido, además de comentarios que indican de dónde proviene la cadena. Esto es excelente para la edición, pero terrible para el rendimiento: el servidor tendría que volver a analizar todo el archivo de texto en cada solicitud.

#: includes/cart.php:88
msgid "Your cart is empty"
msgstr "Ihr Warenkorb ist leer"

Un archivo .mo empaqueta esos mismos pares de cadenas en un formato binario con una tabla de búsqueda interna, para que WordPress pueda saltar directamente a una traducción sin escanear texto. La desventaja es que el .mo es ilegible para los humanos y debe regenerarse cada vez que cambia el .po. Si la distinción entre .po y .mo aún no está clara, nuestra explicación sobre archivos .po vs .mo vs .pot desglosa cada formato y cómo se relacionan.

Cuatro formas de compilar po a mo

No existe una única herramienta "correcta"; la mejor opción depende de cómo trabajes actualmente. A continuación, se presentan cuatro métodos confiables, desde un comando de una sola línea hasta un flujo de trabajo en la nube completamente automatizado. Los cuatro producen el idéntico binario .mo que WordPress carga en tiempo de ejecución.

Método 1: WP-CLI

El enfoque moderno más limpio es WP-CLI, que puede compilar una carpeta entera de archivos .po en un solo comando. Si ya administras WordPress desde la línea de comandos, esto encaja naturalmente en tu flujo de trabajo.

# Compile every .po file in the languages folder to .mo
wp i18n make-mo languages/

# Compile into a specific destination directory
wp i18n make-mo languages/ build/languages/

El comando make-mo escanea el directorio de destino, compila cada .po que encuentra y escribe un .mo coincidente a su lado (o en el destino que especifiques). Maneja lotes con elegancia, lo que lo hace ideal cuando mantienes muchos idiomas a la vez. Es la herramienta recomendada para cualquier proyecto que ya utilice WP-CLI.

Método 2: msgfmt

La utilidad original de Gettext para esta tarea es msgfmt, parte del paquete GNU gettext. Compila un único .po en un único .mo y está disponible en prácticamente todos los sistemas Linux y macOS.

# Compile one file
msgfmt my-plugin-de_DE.po -o my-plugin-de_DE.mo

# Add statistics about translated, fuzzy, and untranslated strings
msgfmt --statistics my-plugin-de_DE.po -o my-plugin-de_DE.mo

# Install it first if missing
#   macOS:  brew install gettext
#   Debian: sudo apt-get install gettext

El flag -o nombra el archivo de salida. El flag --statistics es realmente útil: te dice cuántas cadenas están traducidas, difusas o aún vacías, para que detectes una traducción incompleta antes de lanzarla. Para scripts de un archivo a la vez, msgfmt es la opción confiable y sin florituras.

Dado que msgfmt es una herramienta de línea de comandos sencilla, se integra perfectamente en la automatización. Puedes envolverlo en un bucle de shell para compilar una carpeta completa, o conectarlo a un pipeline de CI para que cada commit que toque un .po produzca un nuevo .mo automáticamente. Un patrón común es for f in languages/*.po; do msgfmt "$f" -o "${f%.po}.mo"; done, que compila todos los idiomas en una sola pasada. El flag --check añade validación, marcando las discrepancias de formato de cadena entre msgid y msgstr antes de que lleguen a producción, una salvaguardia económica contra los errores de marcadores de posición rotos que corrompen silenciosamente los diseños traducidos.

Método 3: Poedit (Compila al guardar)

Si editas traducciones en un editor gráfico, Poedit compila por ti automáticamente. Cada vez que guardas un archivo .po, Poedit escribe el .mo correspondiente justo al lado, sin comandos separados ni pasos adicionales.

Esta es una de las razones por las que Poedit sigue siendo popular entre los traductores que no se sienten cómodos con la línea de comandos. Abres el .po, escribes tus traducciones, guardas, y ambos archivos se actualizan juntos. Puedes confirmar este comportamiento en las preferencias de Poedit, donde la compilación automática de .mo al guardar está habilitada por defecto. Poedit y herramientas de escritorio similares se revisan en las 5 mejores herramientas gratuitas para editar y traducir archivos PO en Mac y Windows.

El inconveniente de un editor de escritorio es que la compilación solo ocurre cuando un humano abre el archivo y lo guarda. Eso está bien para un proyecto de una sola persona, pero no se escala a una docena de idiomas o a un equipo que se pasa archivos. Si alguien edita un .po en una herramienta diferente y lo copia al repositorio sin abrir Poedit, el .mo nunca se actualiza. Para proyectos más grandes o colaborativos, un método automatizado —línea de comandos o en la nube— elimina esa dependencia de recordar guardar.

Método 4: Una herramienta en la nube que genera el .mo por ti

La cuarta opción elimina por completo el paso de compilación: usa un servicio en la nube que devuelve el .mo compilado junto con el .po traducido. Nunca ejecutas un comando ni guardas un archivo dos veces; subes, y los archivos terminados y correctamente nombrados regresan.

SimplePoTranslate funciona exactamente de esta manera. Subes un .po o .pot, traduce las cadenas con IA consciente del contexto, y devuelve un solo ZIP que contiene el .po y el .mo generados lado a lado — ya compilados, ya nombrados para coincidir con tu dominio de texto y configuración regional. No hay un paso de compilación separado y ninguna posibilidad de olvidar uno.

También maneja los detalles que rompen los flujos de trabajo manuales. El Bloqueo de sintaxis congela marcadores de posición como %s, %1$s y {name}, además de etiquetas HTML antes de la traducción, para que tus variables sobrevivan intactas en el .mo. El soporte completo de plurales de Gettext significa que las formas plurales complejas también se compilan correctamente, un tema que vale la pena entender a fondo y que cubrimos en cómo entender los plurales de Gettext. Y como se ejecuta en la nube, no hay un plugin que instalar ni herramientas de compilación que mantener.

El error más común: te olvidaste de recompilar

La razón principal por la que las traducciones no aparecen es editar el .po pero olvidar recompilar el .mo. WordPress sigue cargando el binario antiguo, por lo que tu nueva redacción nunca se muestra, y no hay ningún mensaje de error que te diga por qué.

El modelo mental a fijar: el .po es tu borrador, el .mo es lo que se entrega. Cualquier cambio en el .po es invisible para WordPress hasta que regeneres el .mo. Haz de la recompilación un reflejo después de cada edición, o usa una herramienta que compile automáticamente para que el paso nunca se pueda omitir.

Este error es especialmente insidioso en las entregas de entorno de prueba a producción. Un desarrollador edita y recompila localmente, ve que la traducción funciona, luego despliega solo el .po y olvida el .mo —así, producción conserva silenciosamente el texto antiguo. Siempre que muevas archivos de traducción entre entornos, mueve el .po y el .mo recién compilado juntos, o compila como parte de tu paso de despliegue para que el binario siempre se reconstruya a partir de la fuente actual.

Si tus traducciones aún se niegan a aparecer después de recompilar, el problema suele ser una falta de coincidencia en el nombre, una carpeta incorrecta o una capa de caché que retiene el archivo antiguo. La lista de verificación completa se encuentra en por qué tus traducciones no aparecen en WordPress.

Una nota sobre el nuevo formato .l10n.php

Las versiones recientes de WordPress introdujeron un tercer formato de tiempo de ejecución: .l10n.php. En lugar de un binario .mo, las traducciones se almacenan como un simple array de PHP que la caché de código de operación de PHP puede mantener en memoria, haciendo las búsquedas aún más rápidas que con .mo en sitios con mucho tráfico.

<?php
return [
	'domain'  => 'my-plugin',
	'messages' => [ 'Your cart is empty' => 'Ihr Warenkorb ist leer' ],
];

WordPress genera archivos .l10n.php automáticamente cuando tiene el .mo correspondiente disponible, por lo que no necesitas construirlos a mano. Por ahora, compilar un .mo correcto sigue siendo la base; el formato de rendimiento se deriva de él.

Para resumir

Para compilar po a mo de forma fiable, elige el método que se adapte a tu forma de trabajar: WP-CLI para lotes en línea de comandos, msgfmt para archivos individuales con estadísticas, Poedit para compilación automática al guardar, o una herramienta en la nube que construya el .mo por ti para que el paso nunca se omita. Los cuatro producen el mismo binario que WordPress necesita en tiempo de ejecución.

Elijas la ruta que elijas, recuerda la regla de oro: edita el .po, luego compila a .mo — cada vez. Ese único hábito previene el error de traducción más frustrante en WordPress, aquel en el que todo parece correcto pero el sitio se mantiene obstinadamente en inglés.

¿Listo para saltarte el paso de compilación manual para siempre? Prueba SimplePoTranslate gratis — no se requiere tarjeta de crédito. Sube tu .po y descarga un paquete .po + .mo listo para desplegar en el nivel gratuito en minutos.