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.mo
formie, gdzie xx_XX
jest kod języka).
A potem dodałem wiersz w moim functions.php
pliku motywu podrzędnego podczas after_setup_theme
akcji, 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.php
plik 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_action
funkcji).
Uwaga: Mógłbym użyć load_child_theme_textdomain
zamiast load_theme_textdomain
, jak powiedziano w założeniu, byłoby tak samo.