Диагностика проблемы с переводом статусов заказов WooCommerce
Стандартные статусы заказов WooCommerce (например, pending, processing, completed) часто остаются на английском языке после установки мультиязычности или автоперевода. Это связано с тем, что WooCommerce выводит их через gettext функцию, но переводы могут отсутствовать или не поддерживаются выбранным плагином перевода. В итоге клиенты видят непереведённые статусы в личном кабинете и в уведомлениях.
Основные признаки проблемы:
- Статусы заказов в админке и на фронте не меняются при смене языка.
- Переводы отсутствуют в письмах с уведомлениями.
- Попытки добавить переводы через .po/.mo или плагин перевода не дают результата.
Как перевести статусы заказов WooCommerce: пошаговое решение
1. Проверка текущих переводов WooCommerce
Убедитесь, что у вас установлены актуальные языковые файлы WooCommerce для нужных языков. Они хранятся в wp-content/languages/plugins/woocommerce-<язык>.mo. При отсутствии — скачайте с официального репозитория.
2. Добавление пользовательских переводов через фильтр gettext
Если стандартные переводы не работают, можно добавить свой хук для корректного перевода статусов:
add_filter('gettext', 'wptranslate_custom_order_status_translation', 20, 3); function wptranslate_custom_order_status_translation($translated, $text, $domain) {
if ($domain === 'woocommerce') {
$translations = [
'Pending payment' => __('Ожидает оплаты', 'woocommerce'),
'Processing' => __('Обработка', 'woocommerce'),
'Completed' => __('Завершён', 'woocommerce'),
'On hold' => __('В ожидании', 'woocommerce'),
'Cancelled' => __('Отменён', 'woocommerce'),
'Refunded' => __('Возвращён', 'woocommerce'),
'Failed' => __('Неуспешный', 'woocommerce'),
];
if (isset($translations[$text])) {
return $translations[$text];
}
}
return $translated;
}Этот способ подходит для точечного перевода статусов без изменения исходных языковых файлов.
3. Перевод статусов в уведомлениях и шаблонах
Для корректного перевода статусов в шаблонах писем и кастомных функциях используйте функцию wc_get_order_status_name(), которая учитывает локализацию:
$status_name = wc_get_order_status_name($order->get_status());Если перевод не отображается, замените прямое обращение к статусу на эту функцию.
Проверка результата после внедрения
- Перейдите в личный кабинет пользователя, выберите язык и проверьте, что статусы заказов отображаются на нужном языке.
- Создайте тестовый заказ и посмотрите, чтобы статус письма с уведомлением был переведён.
- В админке WooCommerce переключите язык интерфейса и убедитесь, что статусы сменились.
Частые ошибки и способы их исправления
- Использование устаревших .mo файлов. Обновите языковые файлы WooCommerce через админку или вручную.
- Плагины перевода конфликтуют с кастомными фильтрами. Отключите другие плагины перевода, чтобы проверить конфликт.
- Переводы добавлены в неправильный текстовый домен. Проверьте, что
$domain === 'woocommerce'в фильтре. - Статусы переводятся не через
gettext, а жестко прописаны в шаблонах. Используйтеwc_get_order_status_name()для вывода статусов.
Практические советы по безопасности и производительности
- Добавляйте кастомные переводы через фильтр
gettextтолько для точечных задач, чтобы не перегружать систему избыточными проверками. - Храните кастомный код в отдельном плагине или в
functions.phpдочерней темы, чтобы не потерять при обновлении. - Проверяйте языковые файлы на актуальность после обновления WooCommerce.
Сравнительная таблица способов перевода статусов WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Обновление .mo файлов | Нативный способ, поддерживается WooCommerce | Зависит от наличия и актуальности файлов | Для стандартных языков с поддержкой |
Фильтр gettext | Гибкий, не требует правок исходников | Нужно поддерживать вручную при добавлении новых статусов | Когда нет официальных переводов или нужны кастомные |
Использование wc_get_order_status_name() в шаблонах | Автоматический перевод через ядро WooCommerce | Требует правок шаблонов | При кастомизации писем и фронтенда |