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

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

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

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

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

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

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

Solutions Collecting From Web of "Переопределение перевода родительских тегов по дочерней теме"

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

посылка

load_theme_textdomain() и load_child_theme_textdomain() в основном равны, единственное различие – путь по умолчанию, который они используют:

  • они получают текущий язык (используя get_locale() ) и добавляют относительный .mo- файл к пути, переданному как аргумент;
  • то они вызывают load_textdomain() передавая как аргумент как textdomain, так и результирующий путь к файлу .mo.

Затем load_textdomain загружает файл .mo в глобальную переменную textdomain, но, как мы можем прочитать из источника :

Если домен уже существует, переводы будут объединены.

Если оба набора имеют одну и ту же строку, выполняется перевод с исходного значения.

Итак, чтобы переопределить или заменить только те строки родительской темы, которые мы хотим, нам нужно загрузить пользовательский .mo-файл для родительского textdomain, содержащий только те строки, которые были переведены, прежде чем родительская тема загрузит его .mo-файл.


Решение

В конце концов, я просто создал папку с именем родительской темы (только для удобства) в папку дочерних языковых языков и поместил в нее свои собственные .mo-файлы для родительского textdomain (один для языка, в xx_XX.mo form, где xx_XX – код языка).

И затем я добавил строку в файл after_setup_theme дочерней темы во время действия 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 , так как в предположении, что это было бы одинаково.

Вы можете использовать языковые файлы, которые находятся в папке ваших дочерних тем. Сначала вы должны знать, какой текстовый домен использует родительская тема. Затем создайте файлы .po и .mo только с вашим языком в качестве имени файла (например, de_DE.po / de_DE.mo или nl_NL.po / nl_NL.mo) и поместите их в папку в каталоге дочерних тем, «языки», например.

Затем вы можете инициализировать текстовый домен с помощью load_child_theme_textdomain() :

 load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' ); 

Обратите внимание, что текстовый домен можно найти, ища вызовы функций, такие как __() или _e() в родительских файлах PHP. Второй параметр – это текстовый домен: __( 'Translated text string', 'text_domain' );