Диагностика проблемы с переводом статусов и сообщений WooCommerce
Часто при создании мультиязычного WooCommerce-магазина перевод статусов заказов и системных сообщений не происходит автоматически. Это связано с тем, что WooCommerce использует собственные константы и gettext-функции для вывода текста, который не всегда корректно локализуется при стандартных настройках.
Основные признаки проблемы:
- Статусы заказов (например, "processing", "completed") отображаются только на основном языке.
- Системные сообщения WooCommerce (уведомления, ошибки) не переведены или выводятся на языке по умолчанию.
- Плагины мультиязычности не переводят кастомные статусы и сообщения.
Почему WooCommerce не переводит некоторые статусы и сообщения
WooCommerce использует перевод через __() и _e() с доменом 'woocommerce'. Статусы заказов зарегистрированы в коде как slug и отображаются через функции, которые не всегда вызывают стандартные gettext-функции вне контекста перевода. Также WooCommerce хранит некоторые сообщения в массиве или в базе в виде строк, которые не всегда проходят через перевод.
Вторая причина — кеширование перевода и отсутствие актуальных файлов .mo для нужного языка.
Пошаговое решение: как перевести статусы и сообщения WooCommerce
1. Убедитесь, что у вас установлены корректные языковые файлы WooCommerce
Перейдите в wp-content/languages/plugins/ и проверьте наличие файлов woocommerce-<язык>.mo и woocommerce-<язык>.po. Если их нет — обновите переводы в WordPress или скачайте актуальные с официального репозитория.
2. Перевод кастомных статусов заказов
Если вы добавляете собственные статусы заказов, их нужно зарегистрировать с возможностью перевода. Пример регистрации с переводом:
function register_custom_order_status() {
register_post_status( 'wc-awaiting-payment', array(
'label' => _x( 'Awaiting Payment', 'Order status', 'woocommerce' ),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'Awaiting Payment (%s)', 'Awaiting Payment (%s)', 'woocommerce' )
) );
}
add_action( 'init', 'register_custom_order_status' );Обратите внимание на использование _x() и _n_noop() с доменом 'woocommerce'.
3. Перевод системных сообщений WooCommerce через фильтр
Для перевода сообщений, которые не подхватываются автоматически, используйте фильтр gettext. Например, чтобы перевести текст "Your order has been received.":
add_filter( 'gettext', function ( $translated_text, $text, $domain ) {
if ( 'woocommerce' === $domain ) {
if ( 'Your order has been received.' === $text ) {
$translated_text = __( 'Ваш заказ получен.', 'woocommerce' );
}
}
return $translated_text;
}, 20, 3 );Так можно добавить переводы для любых строк, которые не переводятся стандартно.
4. Использование плагина для поддержки мультиязычности WooCommerce
Если вы используете WPML или Polylang, убедитесь, что включена поддержка перевода WooCommerce. В WPML, например, активируйте модуль WooCommerce Multilingual. Это позволит автоматически синхронизировать статусы и сообщения.
Проверка результата после внедрения
- Создайте новый заказ и проверьте, что статус отображается на нужном языке.
- Проверьте системные сообщения в процессе оформления заказа и на странице «Мои заказы».
- Если используете кастомные статусы, убедитесь, что они отображаются и переводятся в админке и на фронтенде.
Для быстрой проверки можно использовать консоль разработчика в браузере и искать строки на другом языке.
Частые ошибки и как их исправить
- Отсутствие языковых файлов WooCommerce: Проверьте наличие актуальных .mo и .po файлов. Исправление — обновить переводы через админку WordPress или вручную.
- Неправильный домен перевода: Всегда используйте домен 'woocommerce' для перевода стандартных строк WooCommerce. Кастомные строки должны иметь свой домен, либо тоже 'woocommerce', если они относятся к плагину.
- Статусы не зарегистрированы с переводом: При добавлении кастомных статусов используйте _x() и _n_noop() с доменом 'woocommerce'.
- Кеш переводов: Очистите кеш сайта и браузера после внесения изменений.
Практические советы по оптимизации и безопасности
- Не добавляйте слишком много фильтров
gettextбез необходимости — они влияют на производительность. - Используйте готовые языковые файлы и официальные плагины мультиязычности для корректного и быстрого перевода.
- Для WooCommerce важно регулярно обновлять переводы и плагин, чтобы не потерять совместимость.
- Если работаете с пользовательскими статусами, придерживайтесь стандартов WordPress и WooCommerce для регистрации и локализации.
Сравнение способов перевода статусов и сообщений WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
| Использование языковых файлов (.po/.mo) | Официальный и быстрый способ, поддержка всеми плагинами | Не всегда покрывает кастомные строки и статусы |
Фильтр gettext | Гибкость для любых строк, быстрое исправление | Нагрузка на производительность при большом количестве замен |
| Плагины мультиязычности (WPML, Polylang) | Автоматизация, синхронизация переводов, поддержка WooCommerce | Может требовать платных модулей, настройка |
| Регистрация кастомных статусов с переводом | Полный контроль, интеграция с WooCommerce | Требует знаний PHP и WordPress API |