Переопределение перевода родительской темы в дочерней теме

1 мая 2015 г., 03:32:14
Просмотры: 22.8K
Голосов: 13

У меня есть родительская тема, которая корректно использует load_theme_textdomain() для загрузки всех переведенных строк на многих языках.

Затем я создал дочернюю тему, которая использует load_child_theme_textdomain() для достижения того же самого для своих строк.

Существуют определенные переведенные строки для конкретного языка в родительской теме, которые я хотел бы заменить/переопределить в дочерней теме.

Я знаю, что если бы они были в файле шаблона, я мог бы заменить файл и просто изменить текстовый домен для этих строк, но, к сожалению, те строки, о которых я говорю, используются во многих местах, а также в панели управления (то есть внутри функций фильтров/действий).

Итак, мой вопрос: есть ли способ заменить эти переведенные строки внутри дочерней темы без необходимости замены файлов шаблонов или функций родительской темы?

Возможно, добавление файла parent-theme.mo внутри папки languages дочерней темы только с этими переведенными строками, или что-то в этом роде.

0
Все ответы на вопрос 3
0
11

Я думаю, что нашел решение, но сначала небольшое

Введение

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, как сказано во введении, это было бы то же самое.

20 мая 2015 г. 01:48:35
2

Вы можете использовать языковые файлы, находящиеся в папке дочерней темы. Сначала вам нужно узнать, какой текстовый домен использует родительская тема. Затем создайте файлы .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' );

15 мая 2015 г. 10:31:29
Комментарии

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

d79 d79
20 мая 2015 г. 01:58:47

Вы можете загружать несколько текстовых доменов из дочерней темы. Но вы также можете просто использовать текстовый домен родительской темы для всех переводов, так как переводы объединяются при загрузке файлов для одного и того же текстового домена.

redelschaap redelschaap
20 мая 2015 г. 07:37:44
0

Обновление 2019 года для WordPress 5.0.1.

  1. Файлы НЕ должны содержать слаг родительской или дочерней темы. Например, для мексиканского испанского перевода должны быть файлы child-theme-name/languages/es_MX.po и /child-theme-name/languages/es_MX.mo
  2. В 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' );
4 апр. 2019 г. 18:25:24