Tekst na mowę dla witryn Polylang: Co naprawdę działa

15 min czytania 19 min słuchania
Tekst na mowę dla witryn Polylang: Co naprawdę działa

Prawdziwa obsługa tekstu na mowę w Polylang oznacza jeden plik audio na przetłumaczony wpis, w odpowiednim języku i głosie. Polylang przechowuje każde tłumaczenie jako oddzielny wpis WordPress z własnym ID, więc generowanie audio na poziomie wpisu działa tu natywnie. Pułapki to dobór głosu, przekierowania cookie i pamięć podręczna stron, a nie samo audio.

To czwarty wpis z naszej serii o wielojęzycznym TTS. Omówiliśmy już WPML, Weglot oraz wydanie GTranslate 3.3.0. Polylang jest architektonicznie najbliższy WPML, ale ma swoje specyficzne zachowania. Oto co przetestowaliśmy i co naprawdę działa na produkcyjnych witrynach z wtyczką Tekst na mowę - TTSWP.

Dlaczego Polylang ma znaczenie dla tekstu na mowę

Polylang obsługuje więcej wielojęzycznych witryn WordPress niż jakakolwiek inna darmowa wtyczka. Ma ponad 800 000 aktywnych instalacji i największą darmową bazę użytkowników spośród wszystkich wielojęzycznych wtyczek ogólnego przeznaczenia. Pierwsza wersja ukazała się w 2011 roku, a wtyczka jest nadal aktywnie rozwijana. Nie ma ograniczeń liczby dodawanych języków, a paczki językowe WordPress pobierają się automatycznie. Większość witryn z Polylang to blogi, mali wydawcy i agencje dbające o budżet, które wybrały tę wtyczkę ze względu na darmowy rdzeń i przejrzystą architekturę.

Ta popularność staje się problemem dla wtyczek TTS. Wiele z nich deklaruje obsługę Polylang, ale testuje tylko język domyślny. Przypisują jeden plik audio do wpisu, a potem serwują ten sam plik we wszystkich tłumaczeniach. Wersja hiszpańska odtwarza angielskie audio. Wersja niemiecka milczy. Odwiedzający wychodzą.

Rozwiązanie jest strukturalne. Polylang nie dodaje żadnych dodatkowych tabel do bazy danych ani skrótów. Opiera się na taksonomii WordPress, tej samej funkcji rdzenia, która obsługuje kategorie i tagi. Każde tłumaczenie żyje jako prawdziwy wpis. Generowanie audio na poziomie wpisu, czyli sposób działania TTSWP, jest zgodne z tym, jak Polylang przechowuje treści.

Czym Polylang różni się od Weglot i GTranslate

Polylang duplikuje wpisy. Weglot i GTranslate tłumaczą w czasie renderowania. Ta jedna różnica decyduje o wszystkim w kwestii obsługi TTS.

W witrynie Polylang niemieckie tłumaczenie strony „O nas” to osobny wpis WordPress z ID 412, slugiem języka „de” i własną treścią w bazie danych. Widzi go WordPress, widzi go REST API i widzi go każda wtyczka TTS podpięta pod save_post lub wp_insert_post. Generowanie audio uruchamia się raz na tłumaczenie, w języku tego tłumaczenia, a plik jest przechowywany w pamięci podręcznej powiązany z tym ID wpisu.

Weglot i GTranslate działają inaczej. Przetłumaczony tekst istnieje tylko wtedy, gdy użytkownik zażąda strony. Nie ma drugiego wpisu, do którego można by przypiąć audio. Opisaliśmy sposoby obejścia tego problemu dla Weglot i GTranslate we wcześniejszych wpisach. WPML używa tego samego modelu duplikacji co Polylang, dlatego nasz przewodnik po WPML stosuje się tu z niewielkimi modyfikacjami.

Dla TTS to dobra wiadomość. Polylang daje dokładnie to, czego potrzebujesz: stabilne ID wpisu dla każdego języka, znany slug języka i permalink, który nie zmienia się w czasie renderowania.

Diagram porównujący duplikację wpisów w Polylang z tłumaczeniem w czasie renderowania w Weglot
Polylang tworzy prawdziwy wpis dla każdego języka, co jest dokładnie tym, czego potrzebuje generowanie TTS na poziomie wpisu.

Cztery tryby URL w Polylang i co każdy z nich oznacza dla TTS

Polylang oferuje cztery tryby URL. Każdy zmienia sposób, w jaki pamięci podręczne, CDN i kod wykrywający język widzą Twoje strony. Zły wybór sprawi, że właściwy plik audio znajdzie się pod złym adresem URL.

1. Język tylko z treści (bez kodu języka w URL)

To najtrudniejszy przypadek. Adres example.com/about serwuje angielski jednemu odwiedzającemu i niemiecki drugiemu, na podstawie cookie lub wykrywania języka przeglądarki. Pamięci podręczne widzą jeden URL i przechowują jeden wariant. Wygrywa ten język, który pamięć podręczna złapała jako pierwszy.

Dla TTS sam plik audio jest w porządku, bo jest powiązany z ID wpisu, a nie z URL. Problem leży w stronie osadzającej odtwarzacz. Jeśli zbuforowana angielska strona wczytuje osadzenie z niemieckim audio, odtwarzacz nadal odtwarza po niemiecku, ale odwiedzający spodziewał się angielskiego tekstu. Nie polecamy tego trybu URL na żadnej witrynie z pamięcią podręczną.

2. Adresy URL z katalogami (/en/, /de/)

To domyślna konfiguracja, którą polecamy. Każdy język ma własną ścieżkę. Pamięci podręczne traktują /en/about i /de/about jako oddzielne klucze. Właściwa strona wczytuje się z właściwym odtwarzaczem i właściwym plikiem audio. Żadnych sztuczek z cookie.

Zwróć uwagę na opcję „ukryj informację o języku w URL dla języka domyślnego”. Po włączeniu język domyślny traci prefiks. Adres /about staje się angielski, a /de/about pozostaje niemiecki. Wykrywanie języka z URL w kodzie zewnętrznym zawodzi wtedy na ścieżkach języka domyślnego, bo nie widzi żadnego sluga. Jeśli używasz tej opcji, oprzyj się na pll_current_language() zamiast parsowania URL.

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

Subdomeny dają każdemu językowi własny host i własną przestrzeń nazw pamięci podręcznej. Odtwarzacze TTS wczytują się poprawnie dla każdego języka. Kosztem są konfiguracja DNS, certyfikaty SSL dla każdej subdomeny i nieco bardziej złożona analityka. Sprawdza się dobrze na większą skalę.

4. Osobne domeny dla każdego języka

Pełne rozdzielenie. example.com po angielsku, example.de po niemiecku. TTS nadal wiąże audio z ID wpisu wewnątrz każdej instalacji WordPress, a odtwarzacz działa tak samo. Ten tryb jest typowy dla marek, które posiadają już własne krajowe domeny.

Problem z przekierowaniami cookie

Polylang może wykryć język przeglądarki odwiedzającego przy pierwszej wizycie na stronie głównej. Następnie ustawia cookie pll_language i przekierowuje odwiedzającego do wersji w dopasowanym języku. W połączeniu z pamięcią podręczną stron właśnie tu pojawia się audio w złym języku.

Oto sekwencja błędu, którą odtworzyliśmy. Francuski odwiedzający trafia na stronę główną. Polylang wykrywa francuski, ustawia cookie pll_language i przekierowuje na /fr/. Pamięć podręczna przechowuje tę odpowiedź z przekierowaniem pod URL strony głównej. Następny odwiedzający, anglojęzyczny, żąda strony głównej i dostaje zbuforowane przekierowanie na /fr/. Trafia na stronę po francusku, słyszy francuskie audio i wychodzi.

Przy adresach URL z katalogami szkody ograniczają się do strony głównej, bo każda inna strona ma odrębny klucz pamięci podręcznej dla każdego języka. W trybie „język z treści” ten sam problem rozszerza się na każdy adres URL witryny.

Działają trzy poprawki. Najprostsza to wyłączenie wykrywania języka przeglądarki na każdej witrynie z pamięcią podręczną i pozostawienie wyboru języka odwiedzającemu przez przełącznik języka. Druga to skonfigurowanie wtyczki pamięci podręcznej tak, by uwzględniała cookie pll_language lub pomijała go. Trzecia to wykluczenie strony głównej z pamięci podręcznej, by wykrywanie z przekierowaniem zawsze działało na żywo.

Jeśli używasz WP Rocket, W3 Total Cache lub LiteSpeed, zapoznaj się z naszą dokumentacją integracji z pamięcią podręczną dotyczącą konfiguracji cookie. Polylang działa obok tych wtyczek pamięci podręcznej, ale współistnienie to nie to samo co świadomość językowa. Konfigurację pamięci podręcznej musisz przeprowadzić samodzielnie.

Działanie AJAX na froncie

Polylang automatycznie wykrywa bieżący język przy żądaniach AJAX na froncie i wczytuje ciągi znaków dla tego języka. Możesz też przekazać jawną zmienną lang w żądaniu, by wymusić konkretny język. Dla TTS ma to znaczenie, gdy odtwarzacz audio lub widżet powiązanych wpisów wykonuje żądanie AJAX, by pobrać inny wpis.

W naszych testach Polylang obsługuje to bez problemów. Nie zaobserwowaliśmy regresji AJAX w kwestii języka, które opisaliśmy we wpisie o WPML. Jeśli niestandardowa integracja musi pobrać wpis w języku innym niż bieżący, przekaż lang jawnie i sprawdź function_exists('pll_current_language') przed odczytem wyniku.

Konfiguracja wtyczki Tekst na mowę - TTSWP w witrynie Polylang

Poniższe kroki zakładają, że Polylang jest już zainstalowany i istnieje co najmniej jedno tłumaczenie.

  1. Zainstaluj wtyczkę Tekst na mowę - TTSWP ze strony wtyczki na WordPress.org. Aktywuj ją. Jeśli napotkasz błąd uprawnień, zajrzyj do dokumentacji instalacji.
  2. Połącz wtyczkę z TTSWP, postępując zgodnie z przewodnikiem połączenia. Darmowy plan zawiera kredyty powitalne, dzięki którym możesz przetestować wtyczkę przed wyborem płatnego abonamentu.
  3. Otwórz wpis w języku oryginalnym i wygeneruj audio. Sprawdź, czy odtwarzacz pojawia się na stronie.
  4. Przejdź do przetłumaczonej wersji za pomocą przełącznika języka Polylang w edytorze wpisów. Wygeneruj audio ponownie. Polylang wczytał inny ID wpisu, więc TTSWP traktuje to jako nowe generowanie i zapisuje osobny plik.
  5. Wybierz głos dla każdego tłumaczenia. Wybór głosu odbywa się na poziomie wpisu. Szczegóły znajdziesz w dokumentacji wyboru głosu.
  6. Sprawdź na froncie. Otwórz /en/post-slug i /de/post-slug w osobnych zakładkach. Odtwórz każdy. Głosy i języki powinny się zgadzać.

Obecnie domyślne mapowanie głosów na języki w TTSWP obejmuje najpierw WPML i Weglot. W Polylang wybór głosu odbywa się na poziomie wpisu, a domyślny głos dla danego języka działa przez odczyt języka wpisu opisany poniżej. Dla większości witryn Polylang to wystarczy, bo każde tłumaczenie jest prawdziwym wpisem, a głos ustawia się raz na wpis. Szczegółowe informacje o bieżącym zachowaniu znajdziesz w dokumentacji integracji z Polylang.

Edytor wpisów WordPress z przełącznikiem języka Polylang i panelem audio TTSWP obok siebie
Każde tłumaczenie Polylang to osobny wpis, więc generowanie audio i wybór głosu odbywają się osobno dla każdego tłumaczenia.

Jak pobierać język wpisu przy wyborze głosu

Właściwe API do odczytu języka wpisu w Polylang to pll_get_post_language(). Zawsze sprawdzaj, czy funkcja istnieje przed jej wywołaniem, zgodnie z zaleceniami własnej dokumentacji Polylang dla deweloperów. Wzorzec wygląda następująco:

if ( function_exists( 'pll_get_post_language' ) ) {
    $lang = pll_get_post_language( $post_id, 'slug' );
    // $lang wynosi teraz 'en', 'de', 'fr' itd.
}

W kontekście frontu pll_current_language() zwraca język bieżącego żądania. Obie funkcje są stabilne i od lat stanowią część publicznego API Polylang. Logika mapowania głosów powinna zawsze odczytywać język wpisu, nigdy domyślny język witryny, bo inaczej tłumaczenia dziedziczą zły głos.

Polylang darmowy a Polylang Pro dla TTS

Żadna funkcja Polylang Pro nie jest wymagana do audio. Darmowa wersja Polylang daje TTSWP wszystko, czego potrzebuje: duplikację wpisów na język, slugi języków i opisane wyżej publiczne funkcje API.

Polylang Pro dodaje maszynowe tłumaczenie DeepL, obsługę REST API, tłumaczone slugi URL i eksport XLIFF dla zewnętrznych tłumaczy. Żadna z tych funkcji nie zmienia możliwości TTS dla wpisów i stron. Polylang for WooCommerce to osobny płatny dodatek zarządzający stronami sklepu, kategoriami produktów, atrybutami i mailami transakcyjnymi. Jeśli chcesz lektora na opisach produktów, zapoznaj się z naszym przewodnikiem po TTS dla WooCommerce.

SEO i AEO z audio dla każdego języka

Polylang obsługuje hreflang automatycznie, co stanowi większość pracy SEO dla wielojęzycznych witryn. Dodaj schemat AudioObject dla każdej wersji językowej, wskaż każdy na plik dla tego konkretnego tłumaczenia, a dasz wyszukiwarkom czytelny sygnał.

W naszych własnych testach artykuły z audio i schematem AudioObject są częściej cytowane przez wyszukiwarki AI. Opisaliśmy metodę i wyniki w naszym wpisie o AEO i audio. Krótko: jeden plik audio na tłumaczenie, schemat na tłumaczenie, a korzyść AEO pojawia się sama.

Najczęstsze problemy i rozwiązania

ObjawPrawdopodobna przyczynaRozwiązanie
Tłumaczenie odtwarza się w złym głosieGłos ustawiony globalnie, nie na poziomie wpisuOtwórz przetłumaczony wpis, ustaw głos dla tego wpisu i wygeneruj ponownie
Jeden język nie ma audioAudio nigdy nie zostało wygenerowane dla tego tłumaczeniaOtwórz przetłumaczony wpis w edytorze i kliknij generuj
Zbuforowana strona wyświetla odtwarzacz w złym językuPamięć podręczna przechowuje przekierowanie wykrywające język lub jeden wariant stronyWyłącz wykrywanie języka przeglądarki lub skonfiguruj pamięć podręczną z uwzględnieniem cookie pll_language
Układ odtwarzacza dla arabskiego lub hebrajskiego wygląda źleCSS dla RTL nie jest stosowany do odtwarzaczaDodaj nadpisania RTL przez niestandardowy CSS
Ciągi UI odtwarzacza pozostają w języku domyślnymCiągi wtyczki nie są zarejestrowane do tłumaczeniaZarejestruj ciągi odtwarzacza za pomocą pll_register_string, żeby Polylang pokazał je na ekranie tłumaczeń ciągów
Audio jest generowane w języku domyślnym dla wszystkich wpisówMapowanie głosów odczytuje lokalizację witryny zamiast języka wpisuSprawdź język wpisu przez pll_get_post_language($post_id, 'slug')
Ilustracja trzech ścieżek językowych, każda z odrębnym kluczem pamięci podręcznej i plikiem audio, w tym układ RTL dla arabskiego
Adresy URL z katalogami dają każdemu tłumaczeniu własny klucz pamięci podręcznej, co zapobiega odtwarzaniu złego audio na złej stronie.

Uwaga o dostępności

Dodanie lektora dla każdego języka to również krok ku dostępności. Odwiedzający, którzy lepiej czytają w swoim ojczystym języku, ale wolą słuchać, dostają teraz obie opcje. Jeśli Twoja witryna podlega WCAG 2.2 lub Europejskiemu Aktowi Dostępności, zapoznaj się z naszym przewodnikiem zgodności audio z WCAG, by sprawdzić stosowne kryteria. Szersze omówienie dodawania TTS do WordPress w 2026 roku znajdziesz w głównym poradniku, który obejmuje podstawy.

Najczęściej zadawane pytania

Czy Polylang działa z tekstem na mowę?

Tak. Polylang przechowuje każde tłumaczenie jako osobny wpis WordPress z własnym ID, co jest tą samą architekturą, której TTSWP używa do audio na poziomie wpisu. Wygeneruj audio dla każdego tłumaczenia i uzyskasz jeden plik na język z wybranym głosem. Darmowa wersja Polylang w zupełności wystarczy. Nie jest wymagana żadna specjalna konfiguracja poza standardową konfiguracją TTSWP.

Czy do audio potrzebuję Polylang Pro?

Nie. Darmowa wersja Polylang udostępnia wszystko, czego potrzebuje TTSWP: duplikację wpisów na język, slugi języków oraz publiczne funkcje API pll_get_post_language() i pll_current_language(). Polylang Pro dodaje maszynowe tłumaczenie DeepL, obsługę REST API i tłumaczone slugi URL. Żadna z tych funkcji nie zmienia sposobu generowania ani odtwarzania audio.

Czy każdy język może mieć własny głos?

Tak. Ponieważ każde tłumaczenie to osobny wpis, wybór głosu odbywa się na poziomie wpisu. Wybierz głos niemiecki dla tłumaczenia na język niemiecki, głos hiszpański dla tłumaczenia na język hiszpański i tak dalej. TTSWP zapisuje wybór na poziomie wpisu i używa go przy każdym ponownym generowaniu. Szczegóły znajdziesz w dokumentacji mapowania języków i głosów.

Dlaczego moje audio odtwarza się w złym języku?

Najczęstszą przyczyną jest pamięć podręczna stron w połączeniu z wykrywaniem języka przeglądarki przez Polylang. Pamięć podręczna przechowuje przekierowanie strony głównej lub jeden wariant językowy i serwuje go wszystkim. Sam plik audio jest poprawny dla ID wpisu. Strona, która go wczytuje, już nie. Wyłącz wykrywanie przeglądarki na witrynach z pamięcią podręczną lub skonfiguruj wtyczkę pamięci podręcznej, by uwzględniała cookie pll_language. Adresy URL z katalogami (/en/, /de/) ograniczają problem do strony głównej, bo każda inna strona ma odrębny klucz pamięci podręcznej.

Czym Polylang różni się od WPML pod kątem TTS?

Oba duplikują wpisy na język, więc audio na poziomie wpisu działa tak samo w obu przypadkach. Różnice leżą w obsłudze AJAX, zachowaniu cookie i nazwach funkcji API dla deweloperów. Polylang używa funkcji z prefiksem pll_ i jest ogólnie lżejszy. WPML ma więcej wbudowanych funkcji WooCommerce, ale większy rozmiar wtyczki. Nasz wpis o WPML omawia tę stronę zagadnienia.

Czy mogę przetłumaczyć etykiety odtwarzacza audio?

Tak, z jednym dodatkowym krokiem. Polylang udostępnia ekran tłumaczeń ciągów dla wtyczek, które rejestrują swoje ciągi UI za pomocą pll_register_string(). Jeśli chcesz, żeby przycisk odtwarzania, etykieta timera postępu lub inny tekst odtwarzacza zmieniał się wraz z językiem, zarejestruj te ciągi w motywie potomnym lub małej wtyczce dedykowanej witrynie. Pojawią się wtedy w sekcji Języki > Tłumaczenia ciągów.

Co zrobić dalej

Otwórz jeden z przetłumaczonych wpisów w edytorze WordPress i sprawdź panel audio. Jeśli domyślnie pokazuje właściwy język, konfiguracja jest gotowa. Jeśli nie, ustaw głos dla tego tłumaczenia, wygeneruj ponownie i sprawdź front. Gdy jedno tłumaczenie działa, pozostałe działają tak samo.

Jeśli nie masz jeszcze zainstalowanej wtyczki Tekst na mowę - TTSWP, pobierz ją z WordPress.org i połącz z darmowym kontem TTSWP. Przetestuj na jednym tłumaczeniu, posłuchaj i zdecyduj, czy wdrożyć na pozostałych.

Text na mowę dla stron WPML: Co naprawdę działa

Text na mowę dla stron WPML: Co naprawdę działa

Jak dodać tekst na mowę do strony WPML, by wtyczka dobierała właściwy głos dla każdego języka, generowała osobny plik audio dla każdego tłumaczenia i radziła sobie z błędami wykrywania języka w wywołaniach AJAX.

11 min czytania