Tekst naar Spraak met TranslatePress: Wat werkt

11 min lezen 15 min luisteren
Tekst naar Spraak met TranslatePress: Wat werkt

TranslatePress vertaalt de gerenderde HTML van een pagina op het moment van de aanvraag en slaat elke vertaling op in lokale databasetabellen. Elk artikel heeft één post-ID, en taalwisselingen verlopen via trp_translate(), niet via gedupliceerde berichten. Dat ene gegeven bepaalt hoe tekst naar spraak op een TranslatePress-site moet werken.

Dit is het vijfde en laatste artikel in onze meertalige TTS-serie. We behandelden eerder WPML, Polylang, Weglot en GTranslate. TranslatePress zit technisch gezien tussen deze plugins in, en de audio-opzet weerspiegelt dat.

Hoe TranslatePress verschilt van WPML, Polylang en Weglot

WPML en Polylang maken een apart bericht aan voor elke taal. Elke vertaling heeft zijn eigen post-ID, eigen post_content en eigen permalink. Audiogeneratie is eenvoudig, omdat elke taal een afzonderlijk WordPress-object is.

Weglot werkt precies andersom. Vertalingen staan op Weglot's eigen servers en worden via een proxy of subdomein in de pagina geladen. De originele WordPress-database ziet de vertaalde tekst nooit, waardoor server-side TTS op Weglot moeilijk is zonder JavaScript-hooks.

TranslatePress zit daartussenin. Er is één bericht per artikel, dus post_content bevat alleen de standaardtaal. Maar alle vertalingen staan lokaal in je WordPress-database, in de wp_trp_-tabellen. Je kunt ze uitlezen, opvragen en doorgeven aan een TTS-engine. Dat maakt de audio-aanpak wezenlijk anders dan bij de andere vier plugins.

Waar de vertalingen worden opgeslagen

TranslatePress slaat vertalingen op in aparte tabellen met het prefix wp_trp_. Elk taalpaar krijgt een eigen dictionarytabel, met de naam wp_trp_dictionary_<source>_<target>. Daarnaast is er wp_trp_original_strings voor de bronstrings en gettext-tabellen voor thema- en pluginvertalingen.

Opslag is directioneel. Een Duitse vertaling van een Engelstalige site staat in het Engels-naar-Duits woordenboek. Om die terug te lezen, heb je dezelfde richting nodig. De publieke functie die je nodig hebt is trp_translate(), die een string met inhoud en een taalcode accepteert en de vertaalde versie teruggeeft.

if ( function_exists( 'trp_translate' ) ) {
    $translated = trp_translate( $post->post_content, 'de_DE' );
    // Pass $translated to the TTS engine, not $post->post_content.
}

Voor een TTS-integratie is die functie de enige bron van waarheid. post_content direct uitlezen geeft je altijd de standaardtaal, ongeacht welke URL de bezoeker opent. Zie de TranslatePress-integratiedocs voor hoe TTSWP dit aan onze kant afhandelt.

Diagram van trp_translate() dat één post_content omzet in drie gelokaliseerde audio-uitvoerbestanden
Één post-ID, één post_content, meerdere vertaalde audio-uitvoerbestanden via trp_translate().

De valkuil met landcodes

TranslatePress gebruikt volledige landcodes, geen slugs. Duits is de_DE, niet de. Frans is fr_FR. Braziliaans Portugees is pt_BR. Elke integratie die uitgaat van Polylang-stijl tweeletterige slugs zal stilletjes mislukken op TranslatePress.

De TranslatePress-ontwikkelaarsdocumentatie is hier expliciet over. De taalcode die je doorgeeft aan trp_translate() is de landinstelling uit Instellingen, TranslatePress, Algemeen, en die is niet per se hetzelfde als de taalslug in de URL. Een kale slug zoals de komt overeen met geen enkel woordenboek, waardoor de functie terugvalt op de originele string zonder waarschuwing. Schrijf je eigen code, normaliseer dan je taalcodes vóór je trp_translate() aanroept, en sla hetzelfde landcodeformaat op naast je audiobestanden zodat je ze later kunt terugkoppelen.

URL-structuur en caching

TranslatePress gebruikt standaard een submap per taal. Je Engelstalige pagina staat op site.com/blog/post en de Duitse versie op site.com/de/blog/post. Er is ook een optie om een submap voor de standaardtaal te gebruiken, zodat alle talen symmetrisch zijn.

Dit is de ideale situatie voor caching. Aparte URL's betekenen aparte cachesleutels per taal. WP Rocket, LiteSpeed en CDN-edge-caches behandelen /de/blog/post als een apart resource dan /blog/post, zodat je Duitse audiobestand wordt geserveerd bij de Duitse pagina en je Engelstalige audio bij de Engelstalige pagina. Onze caching-integratiedocs bespreken de uitsluitingsregels als je die nodig hebt.

Het enige risico is de betaalde add-on voor automatische taaldetectie. Die stuurt bezoekers door op basis van browsertaal, wat kan botsen met paginacaches en de verkeerde redirect naar de verkeerde gebruiker sturen. We behandelden hetzelfde patroon in het Polylang-artikel. Minder TranslatePress-sites gebruiken detectie omdat het een betaalde add-on is, maar als je die gebruikt, sluit dan de redirectlogica uit van de cache.

Het vertaalprobleem bij de spelerinterface

Dit probleem is uniek voor TranslatePress. De plugin detecteert en vertaalt strings die door JavaScript worden ingevoegd, wat ongebruikelijk is. De meeste vertaaltools negeren JS-gegenereerde inhoud. TranslatePress pikt het op in de DOM na het renderen en biedt aan het te vertalen.

Het bijeffect is dat labels van de audiospeler zoals "Afspelen", "Pauzeren" en "Luister naar dit artikel" verschijnen als vertaalbare strings in de TranslatePress-editor. Als die strings automatisch worden vertaald zonder controle, kan de speler eindigen met onhandige of foute knopteksten, en erger nog: fout vertaalde toegankelijkheidslabels die schermlezers in de war brengen.

Er zijn twee oplossingen in TranslatePress. Voeg het attribuut data-no-translation toe aan elk element dat je wilt uitsluiten. Of gebruik de uitsluitingsselectoren onder Geavanceerde instellingen om hele containers over te slaan via CSS-selector. Beide staan gedocumenteerd in de eigen instellingen van TranslatePress. Voor de TTSWP-speler specifiek: sluit de speler-wrapper uit op klasse, en laat onze vertaalde spelerlabels doorkomen via de eigen taalbestanden van de plugin.

Wat je moet uitsluiten

  • Het containerelement van de audiospeler
  • ARIA-labels op de bedieningselementen voor afspelen, pauzeren en voortgang
  • Tijdweergaven en duurcounters
  • Eventuele stem- of taalnaamlabels gegenereerd door TTSWP

Wil je de speler opmaken nadat je hem hebt uitgesloten, dan bespreken onze aangepaste CSS-docs de selectors.

Het probleem van desynchronisatie bij inhoudsbewerking

TranslatePress koppelt elke vertaling aan de exacte bronstring. Bewerk het origineel, en TranslatePress maakt een nieuwe bronstring aan en loskoppelt de bestaande vertaling. Vertaalgeheugen stelt de oude vertaling wel weer voor, maar zolang een mens die niet bevestigt, valt de doeltaal terug op de bron.

Voor tekst naar spraak betekent dat dat audio na elke bewerking uit de pas kan lopen met de vertaalde tekst. Een toegevoegde komma in het Engels koppelt de vertaling van elke taal voor die string los. Je Duits audiobestand zegt nog de oude zin, maar de zichtbare Duitse tekst toont al de nieuwe versie.

Praktische checklist na het bewerken van inhoud:

  1. Bevestig de nieuwe bronstring in de TranslatePress-editor voor elke actieve taal.
  2. Genereer audio opnieuw voor het standaardtaalbericht als eerste.
  3. Genereer audio opnieuw voor elke taal, en speel de audio vervolgens af op elke gelokaliseerde URL om te controleren of het nieuwe bestand overeenkomt met de zichtbare tekst.
  4. Leeg je paginacache voor elke gelokaliseerde URL, niet alleen de standaard.

TTSWP instellen op een TranslatePress-site

Dit is de huidige werkwijze. De integratiedocs beschrijven altijd het meest actuele gedrag.

  1. Installeer TTSWP vanuit de WordPress.org-pluginmap. De installatiehandleiding legt het stap voor stap uit.
  2. Verbind de plugin met de TTSWP-backend. Gratis abonnementen bevatten starttegoed zodat je de volledige werking kunt testen vóór je betaalt. Zie je site verbinden.
  3. Controleer of TranslatePress actief is en dat er minimaal één doeltaal is ingesteld met een volledige landcode.
  4. Koppel een stem per taal via de taal-naar-stem-koppeling. Wijs een Duitse stem toe aan de_DE, een Franse stem aan fr_FR, enzovoort. Zie stemselectie voor de stemcatalogus.
  5. Publiceer of werk een bericht bij. Audio wordt eerst gegenereerd voor de standaardtaal.
  6. Speel de audio af op elke vertaalde URL. Generatie vindt op aanvraag plaats. De eerste keer dat een bezoeker audio afspeelt in een tweede taal, geeft TranslatePress aan TTSWP door welke taal actief is, waarna TTSWP het bestand voor die taal genereert en in cache opslaat. Elke volgende keer wordt het gecachte bestand gebruikt.
  7. Sluit de speler uit van TranslatePress met data-no-translation of een selector in Geavanceerde instellingen, zodat spelerlabels worden beheerd door de eigen vertalingen van TTSWP.

TTSWP slaat één audiobestand op per bericht en taal, en de speler volgt de taal van de URL waarop de bezoeker zich bevindt. Op /de/blog/post laadt de speler het Duitse bestand, op de standaard-URL het bestand in de standaardtaal. Met automatische vertaling actief leest TTSWP de vertaalde tekst rechtstreeks uit TranslatePress voordat die naar ElevenLabs wordt verzonden, zodat de audio overeenkomt met wat de bezoeker op de pagina ziet.

Gratis vs. betaald TranslatePress voor TTS

Gratis TranslatePress ondersteunt één extra taal, bevat 2.000 automatisch vertaalde woorden via TranslatePress AI, en laat je Google Translate gebruiken met je eigen API-sleutel. Dat is voldoende voor een tweetalige blog met bijpassende audio in twee talen.

Betaald TranslatePress voegt onbeperkte extra talen toe, het SEO Pack voor vertaalde slugs, meta en hreflang-beheer, DeepL-ondersteuning, vertalersaccounts, de add-on voor automatische taaldetectie en een apart domein per taal. Voor een site die meer dan twee talen nodig heeft, hreflang-tags voor zoekmachines, of vertalingen van DeepL-kwaliteit vóór TTS-generatie, is betaald de praktische keuze. De audiokwaliteit zelf hangt niet af van het abonnement.

SEO en AEO met audio per taal

Met het SEO Pack stel je hreflang-tags in per taal, met opties voor landspecifieke landinstelling, taaloverschrijdende regio, of beide. Voor zoekmachines en AI-antwoordengines signaleert dat welke audio bij welke regio hoort.

Voeg een AudioObject-schema-item toe per taal-URL, met de juiste inLanguage-waarde die overeenkomt met de hreflang. Google en Bing pikken de taalkoppeling op, en uit eigen tests blijkt dat AI-engines zoals Perplexity en ChatGPT Search artikelen met audio vaker citeren als het schema klopt en de audio-URL bereikbaar is. We schreven hier meer over in het AEO en audio-artikel.

Veelvoorkomende problemen en oplossingen

ProbleemOorzaakOplossing
Audio speelt in de verkeerde taal afTekst wordt opgehaald uit post_content in plaats van trp_translate()Stuur tekst via trp_translate( $content, $locale ) met de volledige landcode
Spelerknoppen worden verkeerd vertaaldTranslatePress heeft de door JS ingevoegde spelerlabels opgepaktVoeg data-no-translation toe aan de speler-wrapper of sluit die uit via een selector in Geavanceerde instellingen
Audio ontbreekt na bewerkingBewerken van de bron koppelt vertalingen los en daarmee ook de audio per taalBevestig vertalingen in de TranslatePress-editor en genereer daarna audio opnieuw per taal
Landcode komt niet overeenIntegratie geeft de door in plaats van de_DENormaliseer naar volledige landcode vóór het aanroepen van trp_translate()
RTL-lay-out kapot voor Arabisch of HebreeuwsSpeler-CSS is niet RTL-bewustGebruik aangepaste CSS om spelerbediening te spiegelen voor RTL-talen
Cache stuurt bezoeker naar verkeerde taalAdd-on voor automatische taaldetectie botst met de paginacacheSluit de redirect uit van de cache of schakel detectie uit

Opmerking over toegankelijkheid

Audiovertelling ondersteunt meerdere WCAG-succescriteria als de speler via het toetsenbord te bedienen is en correct is gelabeld. Als je de speler uitsluit van TranslatePress, bewaar dan de ARIA-labels in de eigen vertalingen van TTSWP. Onze WCAG-audiogids behandelt de criteria uitgebreid, en de hoofdinstallatie-tutorial is een goed beginpunt.

Veelgestelde vragen

Werkt TranslatePress samen met tekst naar spraak?

Ja. TranslatePress slaat vertalingen lokaal op in wp_trp_-databasetabellen, en de functie trp_translate() geeft vertaalde inhoud server-side terug. Een TTS-integratie kan de vertaalde tekst uitlezen en audio per taal genereren, zolang audio wordt gekoppeld aan post-ID plus landcode en er volledige landcodes worden gebruikt zoals de_DE in plaats van slugs.

Heb ik de betaalde versie van TranslatePress nodig voor audio?

Nee. Gratis TranslatePress ondersteunt één extra taal en biedt vertaling via TranslatePress AI, Google Translate met je eigen sleutel, of handmatige bewerking. Dat is genoeg voor een tweetalige site met bijpassende audio. Betaald voegt onbeperkte talen, SEO Pack, DeepL en detectie-add-ons toe, wat handig is als je meer dan twee talen of hreflang-beheer nodig hebt.

Waarom worden mijn spelerknoppen verkeerd vertaald?

TranslatePress detecteert door JavaScript ingevoegde strings, waardoor spelerlabels zichtbaar worden in de editor en automatisch vertaald kunnen worden. Los dit op door data-no-translation toe te voegen aan de speler-wrapper, of door de spelerscontainer uit te sluiten in Geavanceerde instellingen via een CSS-selector. Spelerlabels komen dan uit de eigen taalbestanden van TTSWP.

Waarom sluit mijn audio niet meer aan op de vertaling?

Als je de originele string bewerkt in TranslatePress, maakt de plugin een nieuwe bronstring aan en koppelt de bestaande vertaling los. Vertaalgeheugen stelt die wel weer voor, maar totdat je hem bevestigt, valt de doeltaal terug op de bron. Genereer audio opnieuw op het standaardbericht en elke taal na elke inhoudswijziging, en leeg daarna de cache voor elke gelokaliseerde URL.

Wat is het verschil tussen TranslatePress en Weglot voor TTS?

Weglot slaat vertalingen op zijn eigen servers op en injecteert die in de pagina, waardoor WordPress de vertaalde tekst nooit server-side ziet. TranslatePress slaat elke vertaling op in je lokale database en biedt trp_translate() voor server-side toegang. Daardoor is audiogeneratie per taal directer op TranslatePress dan op Weglot.

Volgende stap

Installeer Tekst naar Spraak - TTSWP vanuit de WordPress.org-pluginmap, verbind het met je account en koppel één stem per taal die je al gebruikt in TranslatePress. Publiceer een bericht, speel de audio af op elke vertaalde URL en controleer of de audio overeenkomt met de zichtbare tekst. Als er iets niet klopt, zijn de TranslatePress-integratiedocs de eerste plek om te kijken.