it-swarm.com.ru

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

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

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

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

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

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

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

12
d79

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

Посылка

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

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

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

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

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

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


Решение

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

И затем я добавил строку в файл functions.php своей дочерней темы во время действия after_setup_theme, рядом с той, которая загружает файл .mo для текстового домена моей дочерней темы:

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

10
d79

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

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

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

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

4
redelschaap

Обновление 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 () - это тема, тема PARENT, а не дочерняя тема:
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' );
0
Cesar