Zastąp tłumaczenie motywu nadrzędnego nad motywem potomnym

12

Mam motyw nadrzędny, który używa poprawnie load_theme_textdomain()do ładowania wszystkich przetłumaczonych ciągów w wielu językach.

Następnie stworzyłem motyw potomny, który wykorzystuje load_child_theme_textdomain()to samo do realizacji swoich ciągów.

Istnieją pewne przetłumaczone ciągi dla określonego języka w motywie nadrzędnym, które chciałbym zastąpić / zastąpić w motywie potomnym.

Wiem, że jeśli były w pliku szablonu, mógłbym go zastąpić i po prostu zmienić domenę tekstową dla tych ciągów, ale niestety te, o których mówię, są używane w wielu miejscach, a także na pulpicie nawigacyjnym (więc w niektórych funkcjach filtru / akcji ).

Więc moje pytanie brzmi: czy istnieje sposób na zastąpienie tych przetłumaczonych ciągów wewnątrz motywu podrzędnego bez konieczności zastępowania nadrzędnych plików szablonów lub funkcji?

Nie wiem, może dodanie pliku parent-theme.mo w folderze języków motywu potomnego z przetłumaczonymi tylko ciągami znaków lub coś w tym rodzaju.

d79
źródło

Odpowiedzi:

9

Myślę, że znalazłem rozwiązanie, ale trochę wcześniej

Przesłanka

load_theme_textdomain()i load_child_theme_textdomain()są w zasadzie równe, jedyną różnicą jest domyślna ścieżka, z której korzystają:

  • pobierają bieżący język (używając get_locale()) i dodają względny plik .mo do ścieżki przekazanej jako argument;
  • następnie nazywają load_textdomain()przekazywanie jako argument zarówno domenę tekstową, jak i wynikową ścieżkę do pliku .mo.

Następnie load_textdomainładuje plik .mo do globalnej zmiennej textdomain, ale jak możemy odczytać ze źródła :

Jeśli domena już istnieje, tłumaczenia zostaną scalone.

Jeśli oba zestawy mają ten sam ciąg, zostanie wykonane tłumaczenie z oryginalnej wartości.

Tak więc, aby zastąpić / zastąpić tylko wybrane przez nas ciągi nadrzędne motywu, musimy załadować niestandardowy plik .mo dla nadrzędnej domeny tekstowej, zawierający tylko te przetłumaczone ciągi, zanim motyw nadrzędny załaduje swój plik .mo.


Rozwiązanie

Na koniec po prostu utworzyłem folder z nazwą motywu nadrzędnego (tylko dla wygody) w folderze języków motywu podrzędnego i umieściłem w nim moje niestandardowe pliki .mo dla nadrzędnej domeny tekstowej (jeden dla języka, w xx_XX.moformie, gdzie xx_XXjest kod języka).

A potem dodałem wiersz w moim functions.phppliku motywu podrzędnego podczas after_setup_themeakcji, w pobliżu tego, który ładuje plik .mo dla mojej domeny tekstowej motywu podrzędnego:

add_action( 'after_setup_theme', function () {
    // load custom translation file for the parent theme
    load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
    // load translation file for the child theme
    load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );

Ponieważ functions.phpplik motywu podrzędnego jest ładowany przed nadrzędnym, ten zestaw ciągów będzie miał pierwszeństwo przed tłumaczeniem motywu nadrzędnego (lub mógłbym właśnie ustawić priorytet za pomocą trzeciego parametru add_actionfunkcji).


Uwaga: Mógłbym użyć load_child_theme_textdomainzamiast load_theme_textdomain, jak powiedziano w założeniu, byłoby tak samo.

d79
źródło
4

Możesz używać plików językowych znajdujących się w folderze motywu podrzędnego. Najpierw musisz wiedzieć, z której domeny tekstowej korzysta motyw nadrzędny. Następnie utwórz pliki .po i .mo, używając tylko swojego języka jako nazwy pliku (np. De_DE.po / de_DE.mo lub nl_NL.po / nl_NL.mo) i umieść je w folderze w katalogu motywów podrzędnych „języki” na przykład.

Następnie możesz zainicjować domenę tekstową za pomocą load_child_theme_textdomain():

load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );

Pamiętaj, że możesz znaleźć domenę tekstową, szukając wywołań funkcji, takich jak __()lub _e()w plikach PHP motywu nadrzędnego. Drugi parametr to domena tekstowa:__( 'Translated text string', 'text_domain' );

redelschaap
źródło
dzięki @redelschaap, w końcu rozwiązanie będzie działać, o ile użyjesz innego folderu dla nadrzędnej domeny tekstowej niż ten, którego używasz dla podrzędnej domeny tekstowej: to był haczyk! :)
d79
Możesz załadować wiele domen tekstowych z poziomu motywu podrzędnego. Ale możesz także użyć nadrzędnej domeny tekstowej motywu dla wszystkich tłumaczeń, ponieważ tłumaczenia są scalane podczas ładowania plików dla tej samej domeny tekstowej.
redelschaap
0

Aktualizacja 2019 dla Wordpress 5.0.1.

  1. Pliki NIE zawierają w sobie ślimaka nadrzędnego ani podrzędnego. Na przykład tłumaczenie hiszpańskiego na meksykański powinno zawierać pliki child-theme-name / languages ​​/ es_MX.po i /child-theme-name/languages/es_MX.mo
  2. Motyw potomny functions.php powinien mieć następujący kod. Zauważ, że pierwszym parametrem funkcji load_child_theme_textdomain () jest ślimak motywu PARENT, a nie potomka:
function child_theme_slug_setup() {
    load_child_theme_textdomain( 'parent-theme-slug', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'child_theme_slug_setup' );
Cesar
źródło