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.