Переопределение перевода родительской темы в дочерней теме
У меня есть родительская тема, которая корректно использует load_theme_textdomain()
для загрузки всех переведенных строк на многих языках.
Затем я создал дочернюю тему, которая использует load_child_theme_textdomain()
для достижения того же самого для своих строк.
Существуют определенные переведенные строки для конкретного языка в родительской теме, которые я хотел бы заменить/переопределить в дочерней теме.
Я знаю, что если бы они были в файле шаблона, я мог бы заменить файл и просто изменить текстовый домен для этих строк, но, к сожалению, те строки, о которых я говорю, используются во многих местах, а также в панели управления (то есть внутри функций фильтров/действий).
Итак, мой вопрос: есть ли способ заменить эти переведенные строки внутри дочерней темы без необходимости замены файлов шаблонов или функций родительской темы?
Возможно, добавление файла parent-theme.mo внутри папки languages дочерней темы только с этими переведенными строками, или что-то в этом роде.

Я думаю, что нашел решение, но сначала небольшое
Введение
load_theme_textdomain()
и load_child_theme_textdomain()
практически идентичны, единственное отличие - путь по умолчанию, который они используют:
- они получают текущий язык (используя
get_locale()
) и добавляют соответствующий файл .mo к переданному пути; - затем они вызывают
load_textdomain()
, передавая в качестве аргументов текстовый домен и результирующий путь к файлу .mo.
Функция load_textdomain
загружает файл .mo в глобальную переменную текстового домена, но, как мы можем прочитать в исходном коде:
Если домен уже существует, переводы будут объединены.
Если оба набора содержат одну и ту же строку, будет использован перевод из исходного значения.
Таким образом, чтобы переопределить/заменить только нужные строки родительской темы, нам нужно загрузить пользовательский файл .mo для текстового домена родителя, содержащий только переведенные строки, до того, как родительская тема загрузит свой файл .mo.
Решение
В итоге я просто создал папку с именем родительской темы (для удобства) в папке languages дочерней темы и поместил в нее свои пользовательские файлы .mo для текстового домена родителя (по одному для каждого языка, в формате xx_XX.mo
, где xx_XX
- код языка).
Затем я добавил строку в файл functions.php
дочерней темы во время действия after_setup_theme
, рядом с той, которая загружает файл .mo для текстового домена моей дочерней темы:
add_action( 'after_setup_theme', function () {
// загружаем пользовательский файл перевода для родительской темы
load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
// загружаем файл перевода для дочерней темы
load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );
Поскольку файл functions.php
дочерней темы загружается раньше родительского, этот набор строк будет иметь приоритет над переводом родительской темы (или я мог бы просто установить приоритет, используя третий параметр функции add_action
).
Примечание: Я мог бы использовать load_child_theme_textdomain
вместо load_theme_textdomain
, как сказано во введении, это было бы то же самое.

Вы можете использовать языковые файлы, находящиеся в папке дочерней темы. Сначала вам нужно узнать, какой текстовый домен использует родительская тема. Затем создайте файлы .po и .mo с названием только вашего языка (например, ru_RU.po/ru_RU.mo) и поместите их в папку внутри директории дочерней темы, например, "languages".
Затем вы можете инициализировать текстовый домен с помощью load_child_theme_textdomain()
:
load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );
Обратите внимание, что текстовый домен можно найти, просмотрев вызовы функций типа __()
или _e()
в PHP-файлах родительской темы. Второй параметр - это текстовый домен: __( 'Переводимая текстовая строка', 'text_domain' );

спасибо @redelschaap, в итоге ваше решение будет работать, если вы используете другую папку для родительского текстового домена, отличную от той, которую используете для дочернего текстового домена: вот в чем была загвоздка! :)

Обновление 2019 года для WordPress 5.0.1.
- Файлы НЕ должны содержать слаг родительской или дочерней темы. Например, для мексиканского испанского перевода должны быть файлы child-theme-name/languages/es_MX.po и /child-theme-name/languages/es_MX.mo
- В functions.php дочерней темы должен быть следующий код. Обратите внимание, что первый параметр функции load_child_theme_textdomain() — это слаг РОДИТЕЛЬСКОЙ темы, а не дочерней:
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' );
