Texto a voz para sitios con Polylang: lo que realmente funciona

16 min de lectura 22 min de escucha
Texto a voz para sitios con Polylang: lo que realmente funciona

El texto a voz real en Polylang implica un archivo de audio por post traducido, en el idioma y la voz correctos. Como Polylang guarda cada traducción como su propio post de WordPress con su propio ID, la generación de audio por post funciona de forma nativa. Los problemas vienen de la selección de voz, las redirecciones por cookie y la caché de páginas, no del audio en sí.

Este es el cuarto artículo de nuestra serie sobre TTS multilingüe. Ya hemos tratado WPML, Weglot y el lanzamiento de GTranslate 3.3.0. Polylang se parece más a WPML en su arquitectura, pero tiene sus propias particularidades. Esto es lo que hemos probado y lo que realmente funciona en sitios en producción con Texto a Voz - TTSWP.

Por qué Polylang importa para el texto a voz

Polylang gestiona más sitios multilingües de WordPress que cualquier otro plugin gratuito. Cuenta con más de 800.000 instalaciones activas y la mayor base de usuarios gratuitos de cualquier plugin multilingüe de propósito general. La primera versión se publicó en 2011 y el plugin sigue con mantenimiento activo. No hay límite en el número de idiomas que puedes añadir, y los paquetes de idiomas de WordPress se descargan automáticamente. La mayoría de los sitios con Polylang son blogs, pequeños editores y agencias que lo eligieron porque el núcleo es gratuito y la arquitectura es limpia.

Esa popularidad es el problema para los plugins de TTS. Muchos dicen ser compatibles con Polylang, pero solo prueban el idioma predeterminado. Asocian un único archivo de audio a un post y luego sirven el mismo archivo en todas las traducciones. La versión en español reproduce el audio en inglés. La versión en alemán no reproduce nada. Los visitantes se van.

La solución es estructural. Polylang no añade tablas adicionales a la base de datos ni shortcodes. Se basa en las taxonomías de WordPress, la misma función principal que gestiona las categorías y las etiquetas. Cada traducción vive como un post real. Por eso la generación de audio por post, que es como funciona TTSWP, encaja perfectamente con la forma en que Polylang almacena el contenido.

Cómo se diferencia Polylang de Weglot y GTranslate

Polylang duplica los posts. Weglot y GTranslate traducen en el momento de renderizar. Esa diferencia lo determina todo en cuanto al soporte de TTS.

En un sitio con Polylang, la traducción al alemán de «Sobre nosotros» es un post independiente de WordPress con el ID de post 412, el slug de idioma «de» y su propio contenido en la base de datos. WordPress lo ve, la API REST lo ve, y cualquier plugin de TTS que enganche save_post o wp_insert_post también lo ve. La generación de audio se ejecuta una vez por traducción, en el idioma de esa traducción, y el archivo queda en caché vinculado al ID de ese post.

Weglot y GTranslate funcionan de otro modo. El texto traducido solo existe cuando un usuario solicita la página. No hay un segundo post al que vincular el audio. Ya tratamos los métodos alternativos para Weglot y GTranslate en artículos anteriores. WPML usa el mismo modelo de duplicación que Polylang, por eso nuestra guía de WPML se aplica aquí con pequeños ajustes.

Para TTS esto es una buena noticia. Polylang te da exactamente lo que necesitas: un ID de post estable por idioma, un slug de idioma conocido y un permalink que no cambia en el momento de renderizar.

Diagrama comparando la duplicación de posts de Polylang con la traducción en tiempo de renderizado de Weglot
Polylang crea un post real por idioma, que es exactamente lo que necesita la generación de TTS por post.

Las cuatro estructuras de URL de Polylang y qué implica cada una para TTS

Polylang ofrece cuatro modos de URL. Cada uno cambia cómo las cachés, las CDN y el código de detección de idioma ven tus páginas. Elige el incorrecto y el archivo de audio correcto acabará detrás de la URL equivocada.

1. Idioma solo por contenido (sin código de idioma en la URL)

Este es el caso más difícil. La URL example.com/about sirve inglés a un visitante y alemán a otro, según la cookie o la detección del navegador. Las cachés de página ven una sola URL y almacenan una única variante. Gana el idioma que la caché capturó primero.

Para TTS, el archivo de audio en sí no presenta problemas porque está vinculado al ID del post, no a la URL. El problema es la página que incluye el reproductor. Si la página en inglés de la caché carga con el audio en alemán, el reproductor sigue reproduciendo alemán, pero los visitantes esperaban texto en inglés. No recomendamos este modo de URL en ningún sitio con caché activa.

2. URLs de directorio (/en/, /de/)

Este es el modo por defecto y la configuración que recomendamos. Cada idioma vive en su propia ruta. Las cachés tratan /en/about y /de/about como claves distintas. La página correcta carga con el reproductor correcto y el archivo de audio correcto. No se necesitan trucos de cookies.

Ojo con la opción «ocultar la información de idioma de la URL para el idioma predeterminado». Cuando está activada, el idioma predeterminado pierde el prefijo. /about pasa a ser inglés y /de/about sigue siendo alemán. La detección de idioma basada en URL en código de terceros falla entonces en las rutas del idioma predeterminado porque no hay slug. Si usas esta opción, apóyate en pll_current_language() en lugar de analizar la URL.

3. Subdominio (en.example.com, de.example.com)

Los subdominios dan a cada idioma su propio host y su propio espacio de caché. Los reproductores de TTS cargan correctamente por idioma. El coste está en el DNS, los certificados SSL por subdominio y un análisis algo más complejo. Funciona bien a escala.

4. Dominios separados por idioma

Separación total. example.com para inglés, example.de para alemán. TTS sigue vinculando el audio al ID del post dentro de cada instalación de WordPress, y el reproductor funciona igual. Este modo es habitual en marcas que ya tienen sus ccTLD.

El problema de las redirecciones por cookie

Polylang puede detectar el idioma del navegador de un visitante en su primera visita a tu página de inicio. Luego establece la cookie pll_language y redirige al visitante a la versión del idioma correspondiente. Combinado con la caché de páginas, aquí es donde aparece el audio en el idioma incorrecto.

Esta es la secuencia de fallo que hemos reproducido. Un visitante francés llega a la página de inicio. Polylang detecta francés, establece la cookie pll_language y redirige a /fr/. La caché almacena esa redirección bajo la URL de la página de inicio. El siguiente visitante, un angloparlante, solicita la página de inicio y recibe la redirección en caché hacia /fr/. Llega a la página en francés, escucha el audio en francés y se va.

Con URLs de directorio, el problema se limita a la página de inicio, porque cualquier otra página tiene una clave de caché distinta por idioma. Con el modo «idioma solo por contenido», el mismo problema se extiende a todas las URLs del sitio.

Hay tres soluciones. La más sencilla es desactivar la detección de idioma del navegador en cualquier sitio con caché y dejar que los visitantes elijan mediante el selector de idioma. La segunda es configurar el plugin de caché para que varíe o ignore la cookie pll_language. La tercera es excluir la página de inicio de la caché para que la redirección de detección siempre se ejecute en tiempo real.

Si usas WP Rocket, W3 Total Cache o LiteSpeed, consulta nuestra documentación de integración con caché para la configuración de cookies. Polylang convive con estos plugins de caché, pero convivir no es lo mismo que ser consciente del idioma. La caché la configuras tú.

Comportamiento de AJAX en el frontend

Polylang detecta automáticamente el idioma actual en las peticiones AJAX del frontend y carga las cadenas de ese idioma. También puedes pasar una variable lang explícita en la petición para forzar un idioma concreto. Para TTS, esto importa cuando el reproductor de audio o el widget de posts relacionados lanza una llamada AJAX para obtener un post diferente.

En nuestras pruebas, Polylang gestiona esto correctamente. No detectamos las regresiones de idioma en AJAX que documentamos en el artículo sobre WPML. Si una integración personalizada necesita obtener un post en un idioma que no es el actual, pasa lang de forma explícita y comprueba que function_exists('pll_current_language') antes de leer el resultado.

Cómo configurar Texto a Voz - TTSWP en un sitio con Polylang

Estos pasos asumen que Polylang ya está instalado y que existe al menos una traducción.

  1. Instala Texto a Voz - TTSWP desde la página del plugin en WordPress.org. Actívalo. Consulta la documentación de instalación si encuentras un error de permisos.
  2. Conecta el plugin a TTSWP siguiendo la guía de conexión. El plan gratuito incluye créditos de bienvenida para que puedas probar antes de decidirte por un plan de pago.
  3. Abre el post en el idioma original y genera el audio. Confirma que el reproductor aparece en el frontend.
  4. Cambia a la versión traducida desde el selector de idioma de Polylang en el editor de posts. Genera el audio de nuevo. Polylang ha cargado un ID de post diferente, así que TTSWP lo trata como una nueva generación y guarda un archivo separado.
  5. Elige la voz para cada traducción. La selección de voz ocurre a nivel de post. Consulta la documentación de selección de voz para la opción de sobreescritura por post.
  6. Verifica en el frontend. Abre /en/post-slug y /de/post-slug en pestañas distintas. Reproduce cada uno. Las voces e idiomas deben coincidir.

Por ahora, la asignación de voz predeterminada por idioma en TTSWP cubre primero WPML y Weglot. En Polylang, la selección de voz vive a nivel de post y la voz predeterminada por idioma funciona a través de la lectura del idioma del post que describimos a continuación. Para la mayoría de sitios con Polylang esto es suficiente, porque cada traducción es un post real y la voz se configura una vez por post. Consulta la documentación de integración con Polylang para conocer el comportamiento actual.

Editor de posts de WordPress mostrando el selector de idioma de Polylang y el panel de audio de TTSWP en paralelo
Cada traducción de Polylang es un post independiente, por lo que la generación de audio y la selección de voz ocurren por traducción.

Cómo la selección de voz debe leer el idioma del post

La API correcta para leer el idioma de un post en Polylang es pll_get_post_language(). Comprueba siempre que la función existe antes de llamarla, tal como recomienda la propia documentación para desarrolladores de Polylang. El patrón es el siguiente:

if ( function_exists( 'pll_get_post_language' ) ) {
    $lang = pll_get_post_language( $post_id, 'slug' );
    // $lang es ahora 'en', 'de', 'fr', etc.
}

Para el contexto del frontend, pll_current_language() devuelve el idioma de la petición actual. Ambas funciones son estables y llevan años formando parte de la API pública de Polylang. La lógica de asignación de voces siempre debe leer el idioma del post, nunca el idioma predeterminado del sitio, de lo contrario las traducciones heredan la voz incorrecta.

Polylang gratuito frente a Polylang Pro para TTS

Nada en Polylang Pro es necesario para el audio. La versión gratuita de Polylang te da todo lo que TTSWP necesita: duplicación por post, slugs de idioma y las funciones de API pública mencionadas arriba.

Polylang Pro añade traducción automática con DeepL, soporte para la API REST, slugs de URL traducidos y exportación XLIFF para trabajos de traducción externalizados. Nada de esto cambia el comportamiento de TTS en blogs y páginas. Polylang para WooCommerce es un complemento de pago independiente que gestiona las páginas de la tienda, las categorías de productos, los atributos y los correos transaccionales. Si quieres narración en las descripciones de productos, consulta nuestra guía de TTS para WooCommerce.

SEO y AEO con audio por idioma

Polylang gestiona los hreflang automáticamente, que es la mayor parte del trabajo de SEO para sitios multilingües. Añade el esquema AudioObject por versión de idioma, apunta cada uno al archivo de esa traducción concreta, y le das a los motores de búsqueda una señal clara.

En nuestras pruebas, los artículos con audio y esquema AudioObject son citados con más frecuencia por los motores de búsqueda con IA. Documentamos el método y los resultados en nuestro artículo sobre AEO y audio. En resumen: un archivo de audio por traducción, esquema por traducción, y el beneficio AEO llega solo.

Problemas frecuentes y cómo resolverlos

SíntomaCausa probableSolución
La traducción suena con la voz incorrectaLa voz está configurada de forma global, no por postAbre el post traducido, establece la voz en ese post y regenera
Un idioma no tiene audioEl audio nunca se generó en esa traducciónAbre el post traducido en el editor y haz clic en generar
La página en caché muestra el reproductor en el idioma incorrectoLa caché almacena la redirección de detección o una única variante de la páginaDesactiva la detección de idioma del navegador, o configura la caché para que varíe con la cookie pll_language
El reproductor en árabe o hebreo se ve malNo se aplica el CSS RTL al reproductorAñade estilos RTL mediante CSS personalizado
Las cadenas de la interfaz del reproductor permanecen en el idioma predeterminadoLas cadenas del plugin no están registradas para traducciónRegistra las cadenas del reproductor con pll_register_string para que Polylang las muestre en la pantalla de traducción de cadenas
El audio se genera en el idioma predeterminado para todos los postsLa asignación de voz lee el idioma del sitio en vez del idioma del postConfirma el idioma del post con pll_get_post_language($post_id, 'slug')
Ilustración de tres rutas de idioma, cada una con su propia clave de caché y archivo de audio, incluyendo la disposición RTL para árabe
Las URLs de directorio dan a cada traducción su propia clave de caché, lo que evita que el audio incorrecto acabe en la página incorrecta.

Una nota sobre accesibilidad

Añadir narración por idioma también mejora la accesibilidad. Los visitantes que leen mejor en su idioma nativo pero prefieren escuchar ahora tienen ambas opciones. Si tu sitio está bajo WCAG 2.2 o la Ley Europea de Accesibilidad, consulta nuestra guía de cumplimiento de audio WCAG para los criterios aplicables. Para un recorrido más completo sobre cómo añadir TTS a WordPress en 2026, el tutorial principal cubre los fundamentos.

Preguntas frecuentes

¿Polylang es compatible con texto a voz?

Sí. Polylang guarda cada traducción como un post independiente de WordPress con su propio ID, que es la misma arquitectura que usa TTSWP para el audio por post. Genera audio en cada traducción y obtendrás un archivo por idioma con la voz que hayas elegido. La versión gratuita de Polylang es suficiente. No se necesita ninguna configuración especial más allá de la instalación estándar de TTSWP.

¿Necesito Polylang Pro para el audio?

No. La versión gratuita de Polylang expone todo lo que TTSWP necesita: duplicación de posts por idioma, slugs de idioma y las funciones de API pública pll_get_post_language() y pll_current_language(). Polylang Pro añade traducción automática con DeepL, soporte para la API REST y slugs de URL traducidos. Nada de eso cambia el funcionamiento de la generación o la reproducción de audio.

¿Puede cada idioma tener su propia voz?

Sí. Como cada traducción es un post independiente, la selección de voz ocurre a nivel de post. Elige una voz alemana en la traducción al alemán, una voz española en la traducción al español, y así sucesivamente. TTSWP guarda la elección por post y la usa cada vez que regeneras. Consulta la documentación de asignación de idioma y voz para conocer el comportamiento actual.

¿Por qué mi audio suena en el idioma incorrecto?

La causa habitual es la caché de páginas combinada con la detección de idioma del navegador de Polylang. La caché almacena la redirección de la página de inicio o una única variante de idioma y la sirve a todos. El archivo de audio en sí es correcto para el ID del post. La página que lo carga no lo es. Desactiva la detección del navegador en sitios con caché, o indica a tu plugin de caché que varíe con la cookie pll_language. Las URLs de directorio (/en/, /de/) limitan el problema a la página de inicio porque todas las demás páginas tienen su propia clave de caché.

¿En qué se diferencia Polylang de WPML para TTS?

Ambos duplican posts por idioma, por lo que el audio por post funciona igual en ambos. Las diferencias están en el manejo de AJAX, el comportamiento de las cookies y los nombres de la API para desarrolladores. Polylang usa funciones con el prefijo pll_ y es generalmente más ligero. WPML tiene más funciones integradas para WooCommerce pero un tamaño de plugin mayor. Nuestro artículo sobre WPML cubre ese lado.

¿Puedo traducir las etiquetas del reproductor de audio?

Sí, con un paso extra. Polylang muestra una pantalla de traducción de cadenas para los plugins que registran sus cadenas de interfaz con pll_register_string(). Si quieres que el botón de reproducción, la etiqueta del temporizador de progreso u otro texto del reproductor cambien con el idioma, registra esas cadenas en tu tema hijo o en un pequeño plugin específico del sitio. Aparecerán entonces en Idiomas, Traducción de cadenas.

Qué hacer a continuación

Abre uno de tus posts traducidos en el editor de WordPress y mira el panel de audio. Si ya muestra el idioma correcto por defecto, la configuración está lista. Si no, establece la voz en esa traducción, regenera y comprueba el frontend. Una vez que una traducción funciona, el resto sigue el mismo patrón.

Si todavía no has instalado Texto a Voz - TTSWP, descárgalo desde WordPress.org y conéctalo a tu cuenta gratuita de TTSWP. Prueba con una traducción, escucha el resultado y decide si quieres activarlo en el resto.