Я думаю, что нашел решение, но прежде чем немного
посылка
load_theme_textdomain()
и load_child_theme_textdomain()
в основном равны, единственная разница - путь по умолчанию, который они используют:
- они получают текущий язык (используя
get_locale()
) и добавляют относительный файл .mo к пути, переданному в качестве аргумента;
- затем они
load_textdomain()
передают в качестве аргумента текстовый домен и результирующий путь к файлу .mo.
Затем load_textdomain
загружает файл .mo в глобальную переменную textdomain, но, как мы можем прочитать из источника :
Если домен уже существует, переводы будут объединены.
Если оба набора имеют одинаковую строку, будет взят перевод с исходного значения.
Итак, чтобы переопределить / заменить только те строки родительского объекта, который мы хотим, нам нужно загрузить собственный .mo-файл для родительского текстового домена, содержащий только переведенные строки, прежде чем родительская тема загрузит свой .mo-файл.
Решение
В конце я просто создал папку с именем родительской темы (просто для удобства) в папке языков дочерней темы и поместил в нее свои пользовательские файлы .mo для родительского текстового домена (один для языка, в xx_XX.mo
форме, где xx_XX
код языка).
И затем я добавил строку в functions.php
файл моей дочерней темы во время after_setup_theme
действия рядом с той, которая загружает файл .mo для моей дочерней темы textdomain:
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' );
} );
Поскольку functions.php
файл дочерней темы загружается раньше родительского, этот набор строк будет иметь приоритет над переводом родительской темы (или я мог бы просто установить приоритет, используя третий параметр add_action
функции).
Примечание: я мог бы использовать load_child_theme_textdomain
вместо load_theme_textdomain
, как сказано в предпосылке, это было бы то же самое.