Как сделать чтобы при обновлении WordPress и его плагинов не ломался перевод?

Ссылка скопирована
1 ответ

Доброго времени суток. Больная тема, но однозначных ответов не нашёл. Как сделать чтобы при обновлении Wordpress и его плагинов не ломался перевод?
Отдельно для Woocommerce работает такой код в functions.php:

add_filter('gettext', 'translate_text'); add_filter('ngettext', 'translate_text'); function translate_text($translated) { $translated = str_ireplace('Подытог', 'Сумма', $translated); $translated = str_ireplace('Возможно Вас также заинтересует…', 'Вместе с этим товаром покупают', $translated); $translated = str_ireplace('Сортировка от последнего', 'Сначала новинки', $translated); $translated = str_ireplace('Нажмите, чтобы ввести код', 'Нажмите, чтобы ввести промокод', $translated); $translated = str_ireplace('Если у вас есть код купона, укажите его ниже.', 'Если у вас есть промокод, укажите его ниже.', $translated); $translated = str_ireplace('Применить купон', 'Применить код', $translated); $translated = str_ireplace('Есть купон?', 'Есть промокод?', $translated); $translated = str_ireplace('Код купона', 'Промокод...', $translated); $translated = str_ireplace('Оплата наличными при доставке заказа.', 'Оплата при получении товара.', $translated); return $translated; }

add_filter('gettext', 'translate_text'); add_filter('ngettext', 'translate_text'); function translate_text($translated) { $translated = str_ireplace('Подытог', 'Сумма', $translated); $translated = str_ireplace('Возможно Вас также заинтересует…', 'Вместе с этим товаром покупают', $translated); $translated = str_ireplace('Сортировка от последнего', 'Сначала новинки', $translated); $translated = str_ireplace('Нажмите, чтобы ввести код', 'Нажмите, чтобы ввести промокод', $translated); $translated = str_ireplace('Если у вас есть код купона, укажите его ниже.', 'Если у вас есть промокод, укажите его ниже.', $translated); $translated = str_ireplace('Применить купон', 'Применить код', $translated); $translated = str_ireplace('Есть купон?', 'Есть промокод?', $translated); $translated = str_ireplace('Код купона', 'Промокод...', $translated); $translated = str_ireplace('Оплата наличными при доставке заказа.', 'Оплата при получении товара.', $translated); return $translated; }

А вот как реализовать его для всего сайта - не известно... Пробовал подставлять нужные слова для перевода - не помогает...

Дополнительные вопросы

Как сделать чтобы при обновлении Wordpress и его плагинов не ломался перевод?

Вова Дружаев @OtshelnikFm Куратор тега WordPress Обо мне расскажет yawncato.com Поставь плагин Say what? от Ademti Software и настрой в нем замену без кода Refguser @Refguser Делаю ИМ и другие решения Поставь loco-translate и используй в нём пользовательский каталог для лангпака. Ответы на вопрос 0

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Юрий Linux Ответ

Если перевод ломается после обновлений, значит вы правите не там, где WordPress ожидает пользовательские переводы. Фильтр gettext работает, но это аварийный способ: он выполняется на каждом переводимом тексте, может тормозить сайт и легко ломается при изменении оригинальной строки.

Правильные варианты:

  1. Хранить свои переводы в wp-content/languages/, а не в папке плагина.
  2. Использовать Loco Translate и сохранять переводы в «System» или «Custom», не в директорию плагина.
  3. Для точечных замен в WooCommerce использовать hooks/templates, если это не перевод, а изменение смысла блока.
  4. Для небольших строк можно оставить gettext, но ограничить его text domain.

Если всё-таки используете gettext, не заменяйте строки глобально. Делайте проверку домена:

add_filter('gettext', function ($translated, $text, $domain) {
    if ($domain !== 'woocommerce') {
        return $translated;
    }
 
    $replacements = [
        'Subtotal' => 'Сумма',
        'You may also like…' => 'Вместе с этим товаром покупают',
    ];
 
    return $replacements[$text] ?? $translated;
}, 10, 3);

add_filter('gettext', function ($translated, $text, $domain) { if ($domain !== 'woocommerce') { return $translated; } $replacements = [ 'Subtotal' => 'Сумма', 'You may also like…' => 'Вместе с этим товаром покупают', ]; return $replacements[$text] ?? $translated; }, 10, 3);

Для множественных форм нужен отдельный фильтр ngettext, но там тоже важно проверять domain и исходные строки.

Если перевод исчезает после обновления, проверьте, где лежит .po/.mo. Файлы внутри wp-content/plugins/plugin-name/languages могут перезаписываться. Пользовательские переводы должны жить в wp-content/languages/plugins/ или кастомной папке, которую не трогают обновления.

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

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно