Jak zrobić tłumaczenie motywu WordPressa w motywie potomnym

WordPress tłumaczenie motywu potomnego
Kiedyś dostałam takie zgłoszenie od klienta: „Zniknęło mi tłumaczenie motywu, które Pani kiedyś zrobiła. Dodam, że żadnych plików nie kasowałem”. Wchodzę na stronę i faktycznie widzę „posted in” zamiast „opublikowano w” itd. Załóżmy, że klient mówi prawdę i rzeczywiście żadnych plików nie kasował. Co się w takim razie stało z polskim tłumaczeniem? I kto tu zawinił? Otóż najprawdopodobniej zostało ono usunięte, gdy klient wykonał aktualizację motywu do nowszej wersji. A winna byłam ja, bo wykonałam je w katalogu motywu zamiast w motywie potomnym.

Jedna taka wpadka, brak kopii bezpieczeństwa i ponowne tłumaczenie 70 fraz motywu na język polski wystarczy, aby raz na zawsze zapamiętać, że własne tłumaczenie gotowego motywu robimy w motywie potomnym. Nawet jeśli w skórce nie wykonywaliśmy żadnych innych zmian w stosunku do oryginału.

Dzisiaj o tym, jak wykonać tłumaczenie motywu WordPressa w ramach motywu potomnego.

Co chcemy uzyskać

Na pierwszym z poniższych obrazków widzimy motyw, który nie zawiera polskiego tłumaczenia (brak plików pl_PL.po.pl_PL.mo w katalogu languages). Na obrazku drugim widzimy efekt, do którego dążymy – wszystkie frazy są w języku polskim. Trzecia ilustracja pokazuje, że zależy nam na wykorzystaniu motywu potomnego.

Wersja oryginalna motywu
Przed
Wersja spolszczona motywu
Po
Motyw potomny
Motyw potomny

Przygotowanie motywu potomnego na tłumaczenie

Oto graficzne ujęcie problemu tłumaczenia motywu w motywie potomnym.

WordPress tłumaczenie motywu w motywie potomnym

Przygotowanie motywu potomnego na tłumaczenie

  • Krok 1. Tworzymy motyw potomny. Na rysunku wyżej pokazano, jak wygląda poprawnie utworzony motyw potomny. Jeśli nie wiesz, jak tworzy się motywy potomne, przeczytaj ten tutorial.
  • Krok 2. Przygotowujemy tłumaczenie motywu w formie plików po i mo. Możemy do tego celu wykorzystać np. program poedit. Jeśli nie wiesz, na czym polega tłumaczenie motywu i jak tłumaczy się motyw za pomocą pliku poedit odwiedź ten tutorial.
  • Krok 3. Wywołujemy funkcję load_child_theme_textdomain. W motywie potomnym tworzymy plik functions.php i wywołujemy w nim funkcję load_child_theme_textdomain. Dzięki tej funkcji pobierane zostaną wszystkie przetłumaczone frazy motywu zgromadzone w pliku pl_PL.mo motywu potomnego.Funkcja load_child_theme_textdomain powinna być wywołana z wykorzystaniem hooka after_setup_theme:
    <?php
    
    add_action( 'after_setup_theme', 'my_child_theme_setup' );
    
    function my_child_theme_setup() {
        load_child_theme_textdomain( 'textdomain', get_stylesheet_directory() . '/languages' );
    }
    
    ?>
    

    textdomain – W przypadku gdy w motywie rodzica nie istniały w ogóle pliki pl_PL.po/pl_PL.mo identyfikator textdomain powinien odpowiadać identyfikatorowi textdomain zdefiniowanemu w motywie rodzica (poszukaj w plikach motywu rodzica wywołania funkcji load_theme_textdomain lub sprawdź, jaki identyfikator używany jest podczas wyświetlania fraz za pomocą funkcji _e lub __ – tu pomocny będzie przykład z plikiem header.php na rysunku wyżej).

    W przypadku gdy w motywie rodzica istniały już pliki pl_PL.po/pl_PL.mo (dostarczył je autor motywu), a my w motywie potomnym wprowadziliśmy nowe frazy wymagające tłumaczenia, textdomain powinien dostać zupełnie nową nazwę i to za jej pomocą powinniśmy się odwoływać podczas wyświetlania nowych fraz dodanych w plikach motywu potomnego. Gdy dodatkowo dokonaliśmy zmiany w którymś z plików już istniejących w motywie rodzica (np. single.php), w kopii tego pliku w motywie potomnym powinniśmy – zgodnie z radą WordPress Codex Internationalization – zmienić textdomain na textdomain nadany za pomocą funkcji load_child_theme_textdomain dla motywu potomnego.

Wpisy o podobnej tematyce

19 przemyśleń nt. „Jak zrobić tłumaczenie motywu WordPressa w motywie potomnym”

  1. Alternatywnie można jeszcze wrzucić tłumaczenie do katalogu wp-contentlanguagesthemes instalacji WordPressa. Trzeba tylko wcześniej zmienić nazwę pliku tłumaczenia, np. z pl_PL.po na twentytwelve-pl_PL.po (to samo dla .mo), czyli poprzedzić kod języka textdomain(jak to będzie po polsku? 🙂 ) motywu. Przykład – motyw TwentyTwelve 🙂

    1. Ola, oświeciłaś mnie tym co napisałaś. Dzięki! Ja już właśnie zauważyłam, że w tym katalogu, o którym piszesz siedzą tłumaczenia domyślnych motywów, ale jakoś nie wpadłam na to, że tam mogę wrzucić swoje tłumaczenie.

      Wiesz co mnie zastanawia? Codex wyraźnie instruuje, żeby tłumaczeniem motywu dawać nazwy czysto językowo np. pl_PL.po, es_ES.po itd. a tutaj łączą to z textdomain. Rozumiem, że w tym kontekście inaczej by to nie mogło działać (bo niby skąd wiadomo by było które pliki są do czego), ale mimo wszystko widzę tu jakaś niekonsekwencję.

    2. Co do strony – to jeśli chcemy miec prostą stronę to łatwiej będzie zrobić ją w Webwave CMS, niż tłumaczyć motywy z wordpressa.

  2. Ha, z tym motywem to jakaś ciekawa sprawa jest.
    Ostatnio na forum spotkałem się z przypadkiem, że nie łykał tłumaczenia zupełnie plików pl_PL.mo/.po, ani (częściowo) z retro-fitted-pl_PL.mo/.po (na co by wskazywała textdomain i pliki w katalogu languages) …w pełni działało jedynie tłumaczenie hybrid-core-pl_PL.mo/.po -czyli z textdomain zastosowaną w samym frameworku Hybrid Core.

    Pojęcia nie mam z czego to wynikało, lipna wersja motywu czy co – nie miałem wówczas zbytnio czasu na szukanie przyczyny.

    Teraz z ciekawości sobie znowu pobrałem ten motyw i sprawdzam, działa w pełni z retro-fitted-pl_PL.mo/.po, a z hybrid-core-pl_PL.mo/.po tylko częściowo – czyli prawidłowo ….ale odwrotnie ;p
    Ot ciekawostka.

    1. Paweł, dzięki za podzielenie się doświadczeniami. Tak, zgadza się, dziwne rzeczy były (i może nadal są) z tym motywem. Co więcej, jego autor to znaczy twórca wtyczek i w ogóle postać w społeczności WP. Dlatego tym bardziej jest dla mnie zagadką, dlaczego tak a nie inaczej podszedł do tematu. Tym bardziej, że kodeks wyraźnie zabrania używać textdomain dla nazw po/mo.

  3. W pewnym stopniu jestem współsprawcą pojawienia się tego instruktażu, więc pozwolę sobie na parę uwag.

    Poradnik jest napisany bardzo przejrzyście, wiedza jest skoncentrowana i w dużej części zrozumiała. Ale… ja w międzyczasie sporo się dowiedziałem o motywach potomnych, więc na pewno dzięki temu wykład jest dla mnie przystępniejszy. Nie wiem jednak, ile bym zrozumiał, gdybym był zupełnym „świeżakiem”.

    Jednak jasność wykładu nie jest całkowita. Aga, dla ludzi obeznanych z tematem pewne zdania są trywialnie proste, ale dla niefachowców np. zdanie „W motywie potomnym tworzymy plik functions.php i wywołujemy w nim funkcję load_child_theme_textdomain” to tragedia. Jak się tworzy pliki php i jak wywołuje w nich funkcje? Nie dla wszystkich jest to oczywiste. Podobnie niejasne jest dla niefachowca zdanie „Funkcja load_child_theme_textdomain powinna być wywołana z wykorzystaniem hooka after_setup_theme” czy fragment „W przypadku gdy w motywie rodzica nie istniały w ogóle pliki pl_PL.po/pl_PL.mo identyfikator textdomain powinien odpowiadać identyfikatorowi textdomain zdefiniowanemu w motywie rodzica (poszukaj w plikach motywu rodzica wywołania funkcji load_theme_textdomain lub sprawdź, jaki identyfikator używany jest podczas wyświetlania fraz za pomocą funkcji _e lub __ – tu pomocny będzie przykład z plikiem header.php na rysunku wyżej).” Wierz mi, nie wszyscy wiedzą, co to jest „identyfikator textdomain” i skąd wiadomo, czemu on odpowiada 🙂

    Po tych uwagach ogólnych podam kilka uwag szczegółowych, z zastosowania w praktyce Twoich porad. (Niestety, w międzyczasie przerzuciłem się na inny motyw i to właśnie na nim ćwiczyłem. To Catch Evolution – http://catchthemes.com/themes/catch-evolution .)

    Motyw ma plik .pot. W ramach eksperymentu nie utworzyłem katalogu potomka, a jedynie wykorzystałem .pot do stworzenia przy pomocy poEdita plików .po i .mo, w których przetłumaczyłem tylko wybrane frazy. Następnie wgrałem .po i .mo (jako pl_PL) do podkatalogu /languages rodzica. Nie ruszałem żadnego pliku php. Większość fraz została przetłumaczona, z czego wnoszę, że tworzenie nowego pliku functions.php (w katalogu potomnym) nie zawsze jest niezbędne.

    Wszystko byłoby fajnie, gdyby nie pewne drobiazgi, które się nie przetłumaczyły. Oto szczegóły:

    – na str. głównej: „Continue reading →”; ta fraza jest przetłumaczona w .po, ale na stronie pojawia się w oryginale

    – w formularzu komentarzy na stronach poszczególnych wpisów widzę „Dodaj komentarz. Zalogowano się jako (xxx). Wylogować się?” – albo, jeżeli wchodzę tam anonimowo: „Dodaj komentarz. Twój adres e-mail nie zostanie opublikowany.” W pliku .pot, a więc i stworzonym na jego podstawie .po, nie ma tej frazy. Musiała zostać narzucona przez pliki lokalizacyjne samego WordPressa – jak to można zmienić? Jak wyczaić, w którym pliku .php jest zakodowana? A może sensowniej byłoby poszukać odpowiedniego pliku .po?

    A co robić w przypadku wyrażeń niewystępujących w pliku .pot ani w tłumaczeniu WordPressa? Czy (a jeśli tak, to w jaki sposób) można dodać do .pot-a jakiś nowy termin? Nie widzę takiej opcji w poEdicie, ale może źle szukam. A jeśli nie można, to co zrobić z tymi wyrażeniami? U mnie jest to np. cała strona błędu czy uwaga „x thoughts on (tytuł wpisu)” na stronach poszczególnych wpisów. (Tu jeszcze dodatkowa ciekawa rzecz: w pliku .pot jest wyrażenie „One thoungt on %2$s”, ale odpowiednika dla liczby mnogiej nie ma.)

    Na wszystkich stronach pojawia się notka copyrightowa oraz informacja „Powered by WordPress , Theme: Catch Evolution”. Tego też nie ma w pliku .pot i też nie wiem, jak to ugryźć. (Autor nie pomaga, bo się boi, że ktoś może zechcieć wyrzucić to całkowicie.)

    Na gorąco tyle, będę jeszcze dłubał. Może do czegoś dojdę, to się podzielę.

    Miłego weekendu.

    Jaime

    1. Hej Jaime.
      Dziękuję za poświęcenie czasu i Twój obszerny komentarz. Bardzo sobie cenię, jak coś co tworzę/opisuję zostanie skomentowane oczami czytelnika. Dzięki temu mogę robić, to co lubię jeszcze lepiej. Dzięki za wgryzienie się w szczegóły. Mało kto mi daje taki dobry feedback, nawet jeśli jest krytyczny. Ale zawsze sobie to cenię.

      Widzę, że Paweł na część rzeczy Ci odpowiedział. Żeby się nie dublować najpierw wczytam się co napisał Paweł i ewentualnie wrócę do nierozwiązanych kwestii.

    2. Na wszystkich stronach pojawia się notka copyrightowa oraz informacja „Powered by WordPress , Theme: Catch Evolution”. Tego też nie ma w pliku .pot i też nie wiem, jak to ugryźć. (Autor nie pomaga, bo się boi, że ktoś może zechcieć wyrzucić to całkowicie.)

      Wszystkie motywy udostępniane w repozytorium WP muszą być na licencji GPL. To oznacza, że można wprowadzić dowolne zmiany, nawet całkowicie usunąć notkę o autorze motywu.

  4. @Jaime, wydaje mi się, że gdzieś musi być ta płynna granica do jakiego stopnia się coś tłumaczy, inaczej z prostych tutków wyjdą długaśne instrukcje dublujące się w 90%. A bardziej złożony temat to chyba w formie encyklopedii.

    Wracając jednak do Twoich pytań:
    -ten tutek odnosi się do motywu potomnego, a z Twojego opisu wnioskuję że takowego nie tworzyłeś dla swojego motywu – zatem zabawa z functions.php Cię nie dotyczy. Tym bardziej nie musisz tego pliku tworzyć, bo go jusz masz w motywie 😉
    -„Continue reading” ustawiasz sobie w opcjach motywu i czyta takie, jakie sobie tam wpiszesz.
    -odnośnie komentarzy i „Dodaj komentarz. Zalogowano się jako (xxx)” – to są tłumaczenia wordpressowe, wynikają z użycia funkcji z core wordpressa jak np. comment_form() i wielu innych.
    Wpływ na nie możesz mieć wywołując te funkcję w motywie (plik comments.php) z odpowiednimi argumentami – więcej: http://codex.wordpress.org/Function_Reference/comment_form
    -w przypadku braku tłumaczenia możesz sobie takie dodać – czyli np. wspomniane wcześniej __( czy _e(
    więcej: http://codex.wordpress.org/I18n_for_WordPress_Developers ….a i Aga zdaje się pisała wcześniej gdzieś poradnik tłumaczenia.
    -z liczbą mnoga można sobie na kilka sposobów poradzić, o tłumaczeniu Aga pisała tutaj http://webfaces.pl/blog/rozwiazany-problem-liczby-mnogiej-w-tlumaczeniu-motywu-wordpressa/
    -odnośnie zaś stopki, jej treść jest zdefiniowana w pliku catch-evolution/inc/catchevolution-themeoptions-defaults.php w tablicy $catchevolution_options_defaults

    1. @Jaime, wydaje mi się, że gdzieś musi być ta płynna granica do jakiego stopnia się coś tłumaczy, inaczej z prostych tutków wyjdą długaśne instrukcje dublujące się w 90%. A bardziej złożony temat to chyba w formie encyklopedii.

      Paweł, tu się z Tobą trochę zgodzę, ale tak sobie myślę, że może by dało radę upiec dwie pieczenie na jednym ogniu. Np. gdybym miała gdzieś z boku stronę/wpis o pliku functions.php (jaka jest jego rola, jak go założyć od zera, gdzie umieści…), a potem za każdym razem, gdy w jakimkolwiek artykule wspominam o tym pliku były link do tego wpisu z instrukcją. Kto chce, sobie kliknie i doczyta szczegóły. Jaime, co Ty o tym myślisz?

      -”Continue reading” ustawiasz sobie w opcjach motywu i czyta takie, jakie sobie tam wpiszesz.

      Nie sprawdzałam, ale potwierdzam z doświadczenia, że faktycznie czasami niektóre opcje są przetłumaczalne na poziomie opcji motywu

      Wpływ na nie możesz mieć wywołując te funkcję w motywie (plik comments.php)…

      Dokładnie. Jestem pod wrażeniem, ze to wiesz. Ja kiedyś tez tego nie wiedziała. A tak w ogóle jak zadałam to pytanie podczas mojej prezentacji na WordCamp Europe o to, to nikt na sali nie wiedział.

      Pozostałe Twoje komentarze – zgadzam się, chociaż zdaję sobie sprawę, że są to już raczej bardziej zaawansowane rzeczy i przeciętnego użytkownikowi WP trudno będzie w to wejść.

      Dzięki tak w ogóle za odpowiedzi. Ja ostatnio nie nadążam z odpowiadaniem na czas, tym bardziej dzięki.

  5. Paweł, tu się z Tobą trochę zgodzę, ale tak sobie myślę, że może by dało radę upiec dwie pieczenie na jednym ogniu.

    Dokładnie, ale wymagało by to właśnie przygotowania specjalnej serii „zielonych” poradników wprowadzających w konkretny temat ….do których można by potem linkować. Inaczej chyba się nie da.

    Dokładnie. Jestem pod wrażeniem, ze to wiesz. Ja kiedyś tez tego nie wiedziała. A tak w ogóle jak zadałam to pytanie podczas mojej prezentacji na WordCamp Europe o to, to nikt na sali nie wiedział.

    Cóż, wie się to i owo – nie sposób inaczej. Ale to ja jestem pod wrażeniem, że Ty jesteś pod wrażeniem.
    Ja rozumiem wywrzeć wrażenie jakimś bardziej wyrafinowanym mykiem, ale tym? 🙂
    Wiesz, z WC-E to mogło być i inaczej, czasem człowiek wie …ale nie kojarzy w danym momencie.
    -wiem, bo mam podobnie. Widzę – wiem, nie widzę – zwyczajnie mogę nie pamiętać nazwy głupiej wtyczki, a już tym bardziej plików czy elementów kodu ;p

    Pozostałe Twoje komentarze – zgadzam się, chociaż zdaję sobie sprawę, że są to już raczej bardziej zaawansowane rzeczy i przeciętnego użytkownikowi WP trudno będzie w to wejść.

    Oczywiście, ale też lepiej czasem nakierować niż dawać gotowca. Szukając rozwiązania uczysz się, dostając je na tacy rozleniwiasz. 😉
    To już jednak kwestia na oddzielną dyskusję i po części zahacza też o temat „Czy WordPress jest trudny?”

  6. Aga i Paweł: BARDZO dziękuję za wskazówki. Widzę, że na podstawie tego i poprzedniego tutoriala mogłaby się wywiązać ciekawa (również dla mnie) dyskusja; niestety, raczej nie będę w stanie wziąć w niej udziału – i tak już ujarzmianie WordPressa zajęło mi o wiele więcej czasu, niż początkowo sądziłem. Lubię te rzeczy (na poziomie zupełnie amatorskim), niestety, inne sprawy już czekają, aż wreszcie raczę się za nie zabrać. Ale na bloga webfaces.pl na pewno będę zaglądał, nie tylko po kolejną poradę, lecz także po porcję fajnie wyłożonej ogólnej wiedzy o technicznej stronie blogowania 🙂

    Teraz jeszcze parę uwag do uwag:

    @Aga:
    -) „Wszystkie motywy udostępniane w repozytorium WP muszą być na licencji GPL. To oznacza, że można wprowadzić dowolne zmiany, nawet całkowicie usunąć notkę o autorze motywu.” Tak, ale ja nie napisałem, że autor zabrania, lecz jedynie, że nie pomaga 🙂

    -) „Np. gdybym miała gdzieś z boku stronę/wpis o pliku functions.php (jaka jest jego rola, jak go założyć od zera, gdzie umieści…), a potem za każdym razem, gdy w jakimkolwiek artykule wspominam o tym pliku były link do tego wpisu z instrukcją. Kto chce, sobie kliknie i doczyta szczegóły. Jaime, co Ty o tym myślisz?” Stanowczo jestem ZA i podpisuję się obiema rękami i nogami.

    @Paweł:

    -) „odnośnie zaś stopki, jej treść jest zdefiniowana w pliku catch-evolution/inc/catchevolution-themeoptions-defaults.php w tablicy $catchevolution_options_defaults” Tak, już wcześniej to tam znalazłem (w części ‚footer_code’) i frazy anglojęzyczne zastąpiłem polskimi. I nic. Być może gdzieś jeszcze trzeba coś zmienić (jak choćby, ja wiem?, np. kawałek ‚reset_footer’ => ‚2’) – ale tego już nie mam czasu zgłębiać, pewnie zostanie po angielsku.

    Na koniec chciałem jeszcze wspomnieć o translatorskiej wtyczce CodeStyling Localization, która jest dość intuicyjna (no, może nie w 100%, ale też nie jest nie do ogarnięcia) i w bardzo wielu przypadkach powinna być wystarczająca (zastępuje poEdita, który np. u mnie nie bardzo chce działać tak, jak powinien). Niestety, „w bardzo wielu” ≠ „zawsze” – domyślam, się, że wtyczka skanuje pliki php i szuka „__” i „_e”, a więc tego mojego nieszczęsnego copyrighta nie pomoże mi przetłumaczyć, bo autor motywu nie przewidział tej opcji.

    Pozdrawiam wszystkich,

    Jaime

    PS dla Agi: w stopce Twoich stron wordpress.html i o-mnie.html jest niedziałający link do VIM-a (w adresie przed „vim.org” brakuje „www”).

    1. @Jaime, no niech Ci już będzie z ta stopką.

      W functions.php pod 97 linijką, tj. pod tą

      require( get_template_directory() . '/inc/catchevolution-themeoptions-defaults.php' );

      dodaj sobie takie dwie

      $catchevolution_options_defaults['footer_code'] = '&lt;div class=&quot;copyright&quot;&gt;Copyright &amp;copy; [the-year] [site-link]. All Rights Reserved.&lt;/div&gt;';
      $catchevolution_options_settings['footer_code'] - $catchevolution_options_defaults['footer_code'];

      -zostawiłem samą sekcje copyright, możesz sobie tam przetłumaczyć lub co tam chcesz.

      1. Dzięki za podpowiedź, ale… Wpisałem dokładnie to, co podałeś (z poprawieniem literówki), ale efektu brak. A może w Twoim tekście oprócz przetłumaczonego fragmentu jeszcze coś trzeba zmienić – i dla fachowca konieczność tej zmiany jest tak oczywista, że nawet o niej nie wspomniał…? 🙂

        1. Na efekt trzeba trochę zaczekać, bo stopka jest keszowana na ciut ponad 24h.
          -da się to oczywiście obejść, tylko po co kombinować – skoro ma być prosto 😉

  7. Dzięki Paweł troszeczkę mi rozjaśniłeś w głowie z tym tłumaczeniem WP. A czy ta stopka z licencja GPL musi być obowiązkowa nawet po dostosowaniu szablonu pod siebie? Bo przyznam się że zawsze ją usuwam.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *