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

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

Texto a voz real en Polylang significa 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 el caché de páginas, no del audio en sí.

Este es el cuarto artículo de nuestra serie sobre TTS multilingüe. Ya cubrimos 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 probamos 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 impulsa más sitios multilingües en WordPress que cualquier otro plugin gratuito. Tiene más de 800,000 instalaciones activas y es el plugin multilingüe de propósito general con la mayor base de instalaciones gratuitas. La primera versión salió en 2011 y el plugin sigue con mantenimiento activo. No hay límite en la cantidad de idiomas que puedes agregar, y los paquetes de idioma de WordPress se descargan solos. La mayoría de los sitios con Polylang son blogs, editores pequeños 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 por defecto. Adjuntan un único archivo de audio a un post y luego sirven ese mismo archivo en todas las traducciones. La versión en español reproduce audio en inglés. La versión en alemán no tiene sonido. Los visitantes se van.

La solución es estructural. Polylang no agrega tablas extra a la base de datos ni shortcodes. Se apoya en las taxonomías de WordPress, la misma función principal que gestiona categorías y 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.

En qué se diferencia Polylang de Weglot y GTranslate

Polylang duplica los posts. Weglot y GTranslate traducen al momento del renderizado. Esa diferencia lo decide todo sobre el soporte de TTS.

En un sitio con Polylang, la traducción al alemán de «Sobre nosotros» es un post de WordPress independiente con el ID de post 412, el slug de idioma «de» y su propio contenido en la base de datos. WordPress lo ve, la REST API lo ve, y cualquier plugin de TTS que se enganche a 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 se almacena en caché vinculado al ID de ese post.

Weglot y GTranslate funcionan diferente. El texto traducido solo existe cuando un usuario solicita la página. No hay un segundo post al que adjuntar el audio. Cubrimos las alternativas 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 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 al momento del renderizado.

Diagrama que compara 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 la forma en que los cachés, las CDN y el código de detección de idioma ven tus páginas. Si eliges el incorrecto, el archivo de audio correcto termina 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 complicado. 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. Los cachés de páginas ven una sola URL y guardan una sola variante. Gana el idioma que el caché capturó primero.

Para TTS, el archivo de audio en sí está bien 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 cacheada carga con el embed de audio en alemán, el reproductor sigue reproduciendo en alemán, pero los visitantes esperaban texto en inglés. No recomendamos este modo de URL en ningún sitio con caché.

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

Esta es la opción por defecto y la que recomendamos. Cada idioma vive en su propia ruta. Los 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 con cookies.

Presta atención a la opción «ocultar información del idioma en la URL para el idioma predeterminado». Cuando está activa, el idioma por defecto 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 ve ningún 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 le dan a cada idioma su propio host y su propio espacio de caché. Los reproductores de TTS cargan limpiamente por idioma. El costo es en DNS, certificados SSL por subdominio y análisis algo más complejos. Funciona bien a gran 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 común en marcas que ya tienen ccTLDs propios.

El problema de la redirección 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 el 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 de habla francesa llega a la página de inicio. Polylang detecta francés, establece la cookie pll_language y redirige a /fr/. El caché guarda esa respuesta de 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 cacheada a /fr/. Llega a la página en francés, escucha audio en francés y se va.

Con URLs de directorio, el daño se limita a la página de inicio, porque todas las demás páginas tienen 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 que funcionan. La más simple 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 indicarle a tu plugin de caché que varíe o ignore la cookie pll_language. La tercera es excluir la página de inicio del caché de páginas para que la redirección de detección siempre se ejecute en vivo.

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 coexistir no es lo mismo que ser consciente del idioma. Igual tienes que configurar el caché tú mismo.

Comportamiento de AJAX en el frontend

Polylang detecta automáticamente el idioma actual en las solicitudes AJAX del frontend y carga los strings de ese idioma. También puedes pasar una variable lang explícita en la solicitud para forzar un idioma específico. Para TTS, esto importa cuando el reproductor de audio o el widget de posts relacionados dispara una llamada AJAX para obtener un post diferente.

En nuestras pruebas, Polylang lo maneja sin problemas. No vimos 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 distinto al actual, pasa lang de forma explícita y verifica que function_exists('pll_current_language') antes de leer el resultado.

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 nuevamente. 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 ver cómo sobreescribirla por post.
  6. Verifica en el frontend. Abre /en/post-slug y /de/post-slug en distintas pestañas. 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 el valor predeterminado por idioma funciona mediante la detección del idioma del post que describimos más abajo. Para la mayoría de los sitios con Polylang, esto es suficiente, ya que 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 ver el comportamiento actual.

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

Cómo leer el idioma del post para asignar la voz

La API correcta para leer el idioma de un post en Polylang es pll_get_post_language(). Siempre verifica que la función exista 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 ahora es 'en', 'de', 'fr', etc.
}

Para el contexto del frontend, pll_current_language() devuelve el idioma de la solicitud actual. Ambas funciones son estables y llevan años siendo 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 por defecto del sitio, de lo contrario las traducciones heredan la voz incorrecta.

Polylang gratuito vs. Polylang Pro para TTS

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

Polylang Pro agrega traducción automática con DeepL, soporte para la REST API, slugs de URL traducidos y exportación XLIFF para trabajos de traducción externalizados. Nada de esto cambia el panorama de TTS para blogs y páginas. Polylang for WooCommerce es un complemento de pago separado que gestiona páginas de la tienda, categorías de productos, atributos y 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. Agrega el esquema AudioObject por versión de idioma, apunta cada uno al archivo de esa traducción específica y le das a los motores de búsqueda una señal clara.

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

Problemas frecuentes y cómo resolverlos

SíntomaCausa probableSolución
La traducción suena con la voz incorrectaVoz configurada globalmente, no por postAbre el post traducido, asigna la voz en ese post y vuelve a generar
Un idioma no tiene audioEl audio nunca fue generado en esa traducciónAbre el post traducido en el editor y haz clic en generar
La página cacheada muestra el reproductor en el idioma incorrectoEl caché guarda la redirección de detección o una sola variante de la páginaDesactiva la detección de idioma del navegador, o configura el caché para que varíe según la cookie pll_language
El reproductor en árabe o hebreo se ve malCSS RTL no aplicado al reproductorAgrega sobreescrituras RTL mediante CSS personalizado
Los textos del reproductor se quedan en el idioma por defectoLos strings del plugin no están registrados para traducciónRegistra los strings del reproductor con pll_register_string para que Polylang los muestre en la pantalla de traducción de strings
El audio se genera en el idioma por defecto para todos los postsLa asignación de voces lee el locale del sitio en lugar 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 diseño RTL para árabe
Las URLs con directorio le dan a cada traducción su propia clave de caché, lo que evita que el audio incorrecto aparezca en la página incorrecta.

Accesibilidad

Agregar narración por idioma también es una mejora de accesibilidad. Los visitantes que leen mejor en su idioma nativo pero prefieren escuchar ahora tienen las dos opciones. Si tu sitio cae bajo WCAG 2.2 o la Ley Europea de Accesibilidad, consulta nuestra guía de cumplimiento de audio WCAG para ver los criterios que aplican. Para una guía más completa sobre cómo agregar TTS a WordPress en 2026, el tutorial principal cubre los fundamentos.

Preguntas frecuentes

¿Polylang funciona con texto a voz?

Sí. Polylang guarda cada traducción como un post de WordPress independiente con su propio ID, que es la misma arquitectura que usa TTSWP para el audio por post. Genera audio en cada traducción y obtienes un archivo por idioma con la voz que elegiste. 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 la API pública pll_get_post_language() y pll_current_language(). Polylang Pro agrega traducción automática con DeepL, soporte para la REST API y slugs de URL traducidos. Nada de eso cambia cómo funciona la generación o 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 en alemán para la traducción al alemán, una voz en español para la traducción al español, y así sucesivamente. TTSWP guarda la elección por post y la usa cada vez que vuelves a generar. Consulta la documentación de asignación de idioma y voz para ver el comportamiento actual.

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

La causa más común es el caché de páginas combinado con la detección de idioma del navegador de Polylang. El caché guarda la redirección de la página de inicio o una variante de un solo idioma y la sirve a todos. El archivo de audio en sí es correcto para el ID del post. Lo que no es correcto es la página que lo carga. Desactiva la detección del navegador en sitios con caché, o indica a tu plugin de caché que varíe según la cookie pll_language. Las URLs con directorio (/en/, /de/) limitan el daño a la página de inicio porque todas las demás páginas tienen una clave de caché distinta.

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

Ambos duplican posts por idioma, por lo que el audio por post funciona igual en los dos. Las diferencias están en el manejo de AJAX, el comportamiento de las cookies y los nombres de las funciones en la API del desarrollador. Polylang usa funciones con prefijo pll_ y en general es más liviano. WPML tiene más funciones integradas para WooCommerce pero un mayor peso en el sitio. 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 strings para los plugins que registran sus strings de interfaz usando pll_register_string(). Si quieres que el botón de reproducción, la etiqueta del temporizador u otro texto del reproductor cambie con el idioma, registra esos strings en tu tema hijo o en un plugin pequeño específico del sitio. Luego aparecerán en Idiomas, Traducción de strings.

Qué hacer ahora

Abre uno de tus posts traducidos en el editor de WordPress y revisa el panel de audio. Si ya muestra el idioma correcto por defecto, la configuración está lista. Si no, asigna la voz en esa traducción, vuelve a generar y verifica el frontend. Una vez que una traducción funciona, el resto sigue el mismo proceso.

Si aún no instalaste Texto a Voz - TTSWP, descárgalo desde WordPress.org y conéctalo a tu cuenta gratuita de TTSWP. Prueba en una traducción, escucha y decide si quieres extenderlo al resto.