Переосмислити переклад батьківської теми на дитячу тему


12

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

Потім я створив дочірню тему, яка використовує load_child_theme_textdomain()для досягнення тієї ж речі для її рядків.

Існують певні перекладені рядки для певної мови на батьківській темі, які я хотів би замінити / замінити в дочірній темі.

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

Отже, моє запитання: чи є спосіб замінити перекладені рядки всередині дочірньої теми без необхідності заміни батьківських файлів шаблону чи функцій?

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

Відповіді:


9

Думаю, я знайшов рішення, але раніше трохи

Приміщення

load_theme_textdomain()і load_child_theme_textdomain()вони в основному рівні, єдиною різницею є шлях, який вони використовують за замовчуванням:

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

Потім load_textdomainзавантажує файл .mo у глобальну змінну textdomain, але, як ми можемо прочитати з джерела :

Якщо домен уже існує, переклади будуть об'єднані.

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

Отже, для того, щоб замінити / замінити лише рядки батьківського теми, які ми хочемо, нам потрібно завантажити користувальницький .mo-файл для батьківського textdomain, що містить лише ті перекладені рядки, перш ніж батьківська тема завантажить його .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, як сказано в приміщенні, все було б так само.


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, врешті-решт, ти вирішив би, поки ви використовуєте іншу папку для батьківського textdomain від тієї, яку ви використовуєте для дочірнього textdomain. :)
d79

Ви можете завантажити декілька текстових доменів у межах своєї дочірньої теми. Але ви також можете просто використовувати батьківський текстовий домен теми для всіх перекладів, оскільки переклади об'єднуються під час завантаження файлів для одного текстового домену.
redelschaap

0

Оновлення 2019 року для Wordpress 5.0.1.

  1. Файли НЕ мають містити батьківського або дочірнього кулі. Наприклад, надання мексиканського перекладу з іспанської мови повинно мати файли дочірня тема-ім’я / мови / es_MX.po та /child-theme-name/languages/es_MX.mo
  2. Дочірня тема function.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' );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.