Sty
10
2013

Jak zrobić wielojęzykową witrynę w WordPressie? Wtyczka Polylang

Wprawdzie z natury nie jestem jakimś specjalnym miłośnikiem stosowania gotowych pluginów, ale jest kilka, po które sięgam gdy tylko są potrzebne. Tym oto wpisem postanowiłem zacząć mini cykl wpisów o wtyczkach, których użycia nie powinien się wstydzić żaden wp-developer.

Co jakiś czas trafiam na pytanie jak zrobić wielojęzykową stronę na WordPressie i najczęściej polecany jest WPML. Od dłuższego czasu jest on płatny, ale osoby które go używają (niestety nigdy nie miałem przyjemności) mówią, że wart jest swej ceny.

A ja odpowiadam: zanim kupicie licencję na WPML, sprawdźcie czy przypadkiem PolyLang nie jest tym, czego potrzebujecie. Wtyczka ta nic nie kosztuje, stosowałem ją już w kilku projektach i jak do tej pory nie znalazłem w niej żadnych ograniczeń.

Przetłumaczyć można właściwie wszystko na taką ilość języków, na jaką się chce. Dla różnych języków można wybrać różne podstrony, różne kategorie wpisów, różne obrazki… Naprawdę nie widzę miejsca, które nie dałoby się zinternacjonalizować.

polylang

Jaka jest filozofia działania tego pluginu? Część wtyczek, aby jakiś wpis (strona etc) miała różną treść w zależności od języka dodaje na stronie edycji wpisu dodatkowe pola na tekst i tytuł w każdym języku – na jednym ekranie edytujemy jeden wpis w każdym języku. PolyLang działa inaczej. Tu tworzymy wpis, tak jak to robimy w zwykłym WordPressie i po zakończeniu jego edycji określamy jaki on ma język. Następnie tworzymy kolejny wpis od początku, oznaczamy go jako wpis w kolejnym języku i przez małe pole przy nim tworzymy powiązanie z wpisem poprzednim, tak aby PolyLang zorientował się, że jest to tłumaczenie na kolejny język wpisu pierwszego:

polylang2I tak dla kolejnych języków.

Ten sposób tłumaczenia uważam za lepszy od edycji wpisu we wszystkich językach na raz. Daje bowiem możliwość zastosowania dla różnych języków nie tylko różnych tytułów i jego treści, ale kompletnie wszystkiego, co z wpisem się wiąże. I tak na przykład polskojęzyczny wpis o tytule „Moje wakacje” może być przypisany do kategorii „Podróże”, a jego tłumaczenie na język angielski będzie związane z kategorią „Travels”. Jeśli polskojęzycznemu wpisowi dodamy custom fields ‚dlugosc’ o wartości ‚2 tygodnie’, ten sam custom field w języku angielskim może mieć wartość ‚2 weeks’.

Wiązanie między językami dotyczy nie tylko wpisów. Także wszelkie taksonomie, a nawet obrazki w galerii mogą mieć określony język i być powiązane ze swoim odpowiednikiem. I tak na przykład jeśli ktoś odwiedza naszą podstronę example.com/category/podroze grupującą wszystkie wpisy z kategorii ‚Podróże’ i kliknie na ikonę zmiany języka na angielski, zostanie przeniesiony na podstronę example.com/category/travels grupującą wszystkie wpisy w kategorii ‚Travels’.

polylang3Wykorzystanie wtyczki z punktu widzenia twórców skórek jest banalnie proste, a dzięki rozbudowanej dokumentacji technicznej, zawartej w paczce z wtyczką nie ma żadnych ograniczeń. W podstawowej formie wystarczy skorzystać z gotowego widżeta do przełączania języków. Jeśli komuś to nie wystarczy i chce perfekcyjnie dostosować wygląd „przełącznika” do swojej skórki może skorzystać z temple tag-a, który osadzi w dowolnym miejscu skórki, czy całej masy funkcji dodatkowych. Po szczegóły zapraszam do dokumentacji.

Wiem, że powyższy opis na pewno nie odpowiada na Wasze wszystkie pytania, dlatego zachęcam do zadawania ich w komentarzach pod tym wpisem. Podejrzewam jednak, że jakiego pytania byście nie zadali („Czy PolyLang potrafi…”) odpowiedź będzie twierdząca.

Bo czy PolyLang pozwala na zdefiniowanie różnej nazwy strony w zależności od języka (bloginfo(‚name’))? Tak? Różne opisy opisy strony (description)? Oczywiście. Różne menu (wygląd > menu) w zależności od języka? Jak najbardziej. Jak mówiłem póki co nie trafiłem na ograniczenia tej wtyczki i zapewniam, że i wielu z Was taki przypadek długo nie spotka. :)

Uwaga (dodane we wrześniu 2014): bardzo proszę nie wysyłać do mnie prywatnych pytań jak coś zrobić w polylang. Jak zapewne widzicie w mojej stopce do tego wpisu, obecnie pracuję nad konkurencyjną wtyczką, więc takie porady niestety działały by na szkodę mojego pracodawcy ;) Po drugie, wpis który przeczytałeś jest dość stary: przez ostatnie półtora roku wtyczki polylang nie używałem ani razu, jej kod zapewne znacznie się zmienił, więc moja odpowiedź na pytanie jak zrobić coś w polylang brzmi: nie wiem i niestety nie mogę poświęcić czasu na sprawdzenie jak to teraz jest w tej wtyczce.
Jako bottom line: oczywiście obecnie zamiast polylang, polecam WPML ;) Tu akurat z kodem i wszelkimi niuansami jestem na bieżąco.

O autorze: Konrad Karpieszuk

Jak każdy chyba tutaj zacząłem po prostu od blogowania. WordPress jednak tak mnie zafascynował, że szybko zabrałem się za tworzenie stron na nim opartych. Później przyszedł czas na pisanie poradników z nim związanych, zdarzyła się nawet książka. Współorganizowałem pierwszy polski WordCamp. Opiekuję się serwisem WPzlecenia.pl, a teraz także tym podserwisem, na którym właśnie jesteście: dev.WPzlecenia. Wszystkim życzę jak najwięcej wyniesionej WIEDZY odnośnie WordPressa. Zaparzcie kawę, usiądźcie wygodnie i - do lektury! :)

Obecnie jestem pracownikiem firmy tworzącej wtyczkę WPML (pozwala tworzyć wielojęzykowe strony), gdzie odpowiadam za jej rozwój. Jestem także autorem bardzo popularnej wtyczki sklepowej TradeMatik

29 komentarzy + Dodaj komentarz

  • No dobra, to ja od raz z pytaniem (po tak serdecznej zachęcie z Twojej strony):

    Czy wtyczka ta potrafi przetłumaczyć własne teksty użytkownika ustawione w panelu opcji konfiguracji motywu? W motywach płatnych jest często tak, że dużo napisów ustawia się poprzez ekrany parametrów – np. tekst na stronie głównej może brzmieć domyślnie „Ostatnie wpisy”, ale user sam sobie może zmienić na np. „Najnowsze promocje”. Czy ta wtyczka sobie z tym poradzi?

    • odpowiedz brzmi: tak, choc wymaga umiejetnosci w php, a te masz ;) sluzy do tego funkcja pll_register_string (zajrzyj na 15. strone dokumentacji w katalogu wtyczki)

    • Aga, pozwolę odpowiedzieć na to pytanie, bo akurat kilka tygodni robiłam coś takiego :)

      Owszem pozwala. Należy użyć opcji pll_register_string – opisałam to dokładniej w swoim wpisie o używaniu tej wtyczki: http://brandsites.pl/blog/2012/12/3-funkcje-wtyczki-polylang-o-ktorych-musisz-wiedziec/

      • Konrad i @bastetmilo – dzięki! Dobrze wiedzieć, że są takie możliwości. Wygląda na to, że ta wtyczka faktycznie dużo potrafi. Choć WPML pozwala akurat to zrobić z panelu użytkownika bez modyfikacji kodów źródłowych.

        Ja dla klientów używam WPML-a, bo licencja pozwala mi na darmową instalację na dowolnej witrynie, którą robię dla klienta, ale klient nie ma już dostępu do supportu. Czyli koszt WPML-a w pewnym sensie jest jednorazowy, no chyba że się chce po roku mieć dostęp do kolejnych upgrade’ów.

  • PolyLang daje potężne możliwości :) Właśnie od kilku dni siedzę i szykuję się do odpalenia drugiego języka w Majsterkowie :D

  • Wygląda na to, że obsługuje się to w podobnym sposób jak WPML, a nie to nieszczęsne qTranslate :)
    Mam kilka pytań na początek:
    1) jak działa przełącznik języków – inteligentni przenosi Cię na tłumaczenie wpisu, czy do storny głównej w tym drugim języku?
    2) co się się dzieje jeśli nie ma tłumaczenia?
    3) czy można mieć grafiki bez języka – przypisane do wpisów w dwóch różnych językach?
    4) co z tłumaczeniem fraz osadzonych w szablonie – czy wtyczka ma do tego opcje (jak WPML), czy po prostu trzeba zrobić plik językowy do szablonu?
    5) jak wygląda sprawa struktury slugów?

    Generalnie wtyczka wygląda rzeczywiście według Twojego opisu ciekawe – myślę, że ją przetestuję….

    • 1) przenosi na strone tlumaczenia danego wpisu
      2) to mozesz sobie ustawic. mozesz sprawic ze jesli w daym jezyku nie ma tlumaczenia, nie pojawia sie on na liscie dostepnych tlumaczen, lub przenosi na glowna
      3) jesli cie dobrze rozumiem, to chyba mozna miec. to znaczy ja nigdy nie korzystalem z roznicowania jezykow dla grafik (no, prawie nigdy). wystarczy zdefiniowac grafiki dla jezyka glownego. wtedy gdy ktos wyswietla wpis po angielsku, polylang sprawdza czy sa zwiazane z nim grafiki z ustawionym jezykiem en. jesli sa, uzywa je. jesli nie ma, uzywa grafik jezyka glownego. ale moge Cie tu oszukiwac, bo moze nie zrozumialem pytania. w kazdym badz razie ja tworze wpis po polsku, pisze jego tresc, wstawiam obrazki w tresci jesli trzeba. angielski wpis tworze za pomoca wtyczki ‚duplicate post’. ta wtyczka od rzu tworzy kopie wpisu wraz z wszystkimi jej przyleglosciami (obrazki, custom fields, kategorie…), ustawiam ze ten nowy wpis to tlumaczenie na angielski i potem zmieniam juz tylko tresc na angielska (no i tytul). na obrazki nie zwracam uwagi czy dostaly okreslony jezyk czy nie. pojawiaja sie jak trzeba
      4) tak jak juz Agnieszce napisalem, jest funkcja do rejestrowania takich fraz. oczywiscie tez wtyczka korzysta z standardowych funkcji _e() oraz __()
      5) pozostaje niestety domyslna. tzn i w pl i w en bedzie to example.com/{nieprzetlumaczalna nazwa taksonomii}/{przetlumaczalna wartosc taksnonomii}

      • Dziękuję za odpowiedzi!
        1), 2) OK
        3) Nie do końca o to mi chodziło ale już sobie sam wytłumaczyłem :)
        4) Co masz na myśli pisząc „funkcja do rejestrowania takich fraz”?
        5) Ale można jeszcze wyłączyć slug /category/ i posługiwać się kategoriami. Oczywiście jak zrobisz sobie własne taxonomie to pozamiatane…

        • 3) jest funkcja, ktora w functions.php trzeba zarejestrowac fraze. jak sie ja zarejestruje, pojawi sie w kokpicie interfejs do jej tlumaczenia. nastepnie w skorce trzeba kolejna funkcja odwolac sie do niej, by wyswietlic (polylang wyswietli wtedy odpowiednie tlumaczenie w skorce).

          oczywiscie z powyzszego nie trzeba korzystac. wystarczy wszystkie frazy wyswietlac przez standardowe _e() i jesli mam wgrane pliki tlumaczen to polylang skorzysta z odpowiednich

  • Moim zdaniem to nie jest fajny mechanizm tłumaczeń.
    Idealny sposób żeby zrobić sobie bajzel. już widzę jak 90% moich klientów linkuje co popadnie z czym popadnie bo im się ID pomyliły.
    BTW ta wtyczka robi nic. To znaczy jak by mi zależało na tym żeby zarządzać wersjami osobno czyli stworzyć de facto oddzielne serwisy to no właśnie zrobił bym oddzielne serwisy.

    Więc lista pytań bo może ja nie zrozumiałem.
    1 Czy jakiś język jest uznawany za podstawowy.
    2 Czy może istnieć tłumaczenie nieistniejącego posta tzn wersja niemiecka bez polskiej
    3 Co się dzieje kiedy usuwam post główny tłumaczenia są czy ich nie ma?

    • Wojciech, w polaczeniu tej wtyczki z wtyczka ‚duplicate content’ nigdy ani razu nie musialem wpisywac recznie ID :) klikam ‚kopiuj wpis’, zmieniam mu jezyk i wszystko dziala. nie wiem za bardzo jakim cudem, podejrzwam ze autor polylang sam z tej wtyczki korzysta i jakos wsparł ją.
      co wiecej posty ze sobą mozna sprzegac w widoku listy wpisow/stron. sa specjalne ikonki do tego

      odpowiedzi:
      1. tak
      2. tak
      3. tlumaczenia zostaja

    • Nie jest? Jest 100 razy lepszy, niż tworzenie innych wersji językowych jako Custom Fields…

  • Konrad – a możesz pokazać jakaś stronę, na której wdrażałeś tą wtyczkę? Chciałem sobie popatrzeć na kilka rzeczy, bo nie wiem, czy tylko ja czegoś tu nie rozumiem i źle robię, czy tak ma po prostu być ;)

    • Ja wdrażałem na jednej stronie, ale teraz widzę, że klient w ogóle zrezygnował z innych wersji językowych… więc nie pokażę. :(

    • http://purepoland.com/ choc nie do konca ja wdrazalem (zastalem tam polylang gdy przyszedlem do pracy nad ta strona)

  • Dzięki przyda się – planuję także prowadzić swój blog po angielsku i zastanawiałam się jak to zrobić. Mam odpowiedź.

  • Czy istnieje możliwość określenia osobnej domeny (.pl, .ru itd.) dla poszczególnych języków?

  • Serwus,

    przywitam się jako „świeżak” :)

    Używam nietypowego theme’a. Widget unready, menu ma być domyślnie wyłączone. Poradźcie, jaki kod powinienem wkleić (i gdzie), żeby przełącznik języków Polylang był widoczny gdzieś na stronie, np. w headerze. Próbowałem rozumować zgodnie z dyskusją (* link), ale strona się rozkrzacza po edycji header.php.

    * http://wordpress.org/support/topic/plugin-polylang-language-switcher-in-custom-place-in-template

    • zajrzyj do dokumentacji wtyczki :) nie wiemy jakiego themu uzywasz, z czym masz problem… mysle ze jak ptrzeczytasz, zalapiesz jak to sie robi

  • Witam,
    Wtyczka generalnie daje radę.
    Ale natknąłem się na jeden problem.
    Jeśli nie ma tłumaczenia dla danego postu to po kliknięciu na flagę wyświetla się pusta strona, jak sobie z tym poradzić?
    Jak zrobić tak, jak napisane wyżej, cytuję:

    2) to mozesz sobie ustawic. mozesz sprawic ze jesli w daym jezyku nie ma tlumaczenia, nie pojawia sie on na liscie dostepnych tlumaczen, lub przenosi na główną.

    Pozdrawiam.

    • hmm, ja recznie dodalem template tag do wyswietlania przelacznika jezykow i wtedy jesli nie ma wpisu w danym jezyku, linkuje do strony glownej

  • no to ja tez mam 2 pytania

    1. Powiedzmy, że mam strony, które w języku polskim i angielskim nazywają się dokładnie tak samo np, „x”.

    ustawiamy sobie by wszystkie ang strony miały w url „en”, ale mimo to jedna strona nazywa się /en/x a druga /x-2.

    Da się coś z tym zrobić?

    2. cześć tekstów jest na sztywno wpisane w pliki .php np. „Archive for the ‘News’ Category” jak zrobić by w polskiej wersji było po polsku w angielskiej po angielsku? To samo tyczy się np. itd.

    • 1. Niestety nie. Również się z tym męczyłem, na razie jedyną opcją jest nadawanie innych slugów…

      2. To zależy od tego, czy motyw jest przystosowany do tłumaczeń (ma obsługę plików .po i .mo). W ogóle tutaj masz dobry tutorial dotyczący tłumaczenia szablonów WordPressa, sam się z niego uczyłem podstaw. :)
      Kiedy motyw jest przystosowany do wielojęzyczności, WordPress sam załaduje odpowiednią wersję językową szablonu według języka wybranego przez odwiedzającego.

      • ok, wiedziałem, że to nie będzie takie łatwe.

        mam szablon, który nie jest przygotowany do tłumaczenia. Nie ma plików .mo i .po. Wiem, że mogę sobie szablon przetłumaczyć ręcznie, pytanie tylko jak go przetłumaczyć, ale zachować obie wersje? :)

        • Pozamieniaj po prostu wszystkie angielskie napisy w szablonie na wywołania funkcji _e(‚angielski napis’, ‚nazwaTwojejSkórki’), a dalej postępuj według tutoriala. :)

          • Tak, też o tym pomyślałem, ale mimo to poedit nie wyłapuje mi tych fraz, wyłapuje jedynie te, które wcześniej były już przez autora oznaczone do tłumaczenia.

            Dodatkowo poedit jakoś mi koślawo działa, bo raz zaktualizuje pakiet a raz nie, najczęściej nie, choć za każdym razem wpisuje te same dane.

Uwaga, leci reklama:



Gdzie nas czytać?

Autorzy »
Komentujący »
#wpzlecenia »