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

12

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

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

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

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

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

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

D79
источник

Ответы:

9

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

посылка

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

D79
источник
4

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

redelschaap
источник
спасибо @redelschaap, в конце концов, ваше решение будет работать, если вы используете папку для родительского текстового домена, отличную от той, которую вы используете для дочернего текстового домена: это было подвохом! :)
d79
Вы можете загрузить несколько текстовых доменов из вашей дочерней темы. Но вы также можете просто использовать родительский текстовый домен темы для всех переводов, поскольку переводы объединяются при загрузке файлов для одного и того же текстового домена.
redelschaap
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 () - это тема SENT 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' );
Cesar
источник