Диагностика проблемы с переводом статусов и сообщений WooCommerce
WooCommerce использует набор стандартных статусов заказов (например, pending, processing, completed), а также генерирует уведомления и сообщения для клиентов и администраторов. При создании мультиязычного сайта на WordPress часто возникает проблема: статусы и сообщения остаются на основном языке, даже если контент сайта переведен. Это вызывает путаницу у пользователей и снижает качество локализации.
Проверьте, что именно не переводится:
- Статусы заказов в админке и на фронтенде
- Тексты уведомлений на почту
- Сообщения в пользовательском кабинете WooCommerce
Если вы используете WPML или Polylang, иногда они корректно не обрабатывают пользовательские строки из WooCommerce. Аналогично, кастомные статусы или сообщения, добавленные через хуки, могут не попадать в стандартные файлы перевода.
Пошаговое решение: как автоматически перевести статусы и сообщения заказов
1. Использование фильтра woocommerce_order_statuses с поддержкой перевода
WooCommerce выводит список статусов через фильтр woocommerce_order_statuses. Для автоматического перевода необходимо обернуть названия статусов функцией __() или _x() с доменом woocommerce.
add_filter('woocommerce_order_statuses', function($order_statuses) {
foreach ($order_statuses as $key => $status) {
$order_statuses[$key] = __($status, 'woocommerce');
}
return $order_statuses;
});Этот код гарантирует, что WooCommerce попытается получить перевод из языковых файлов.
2. Перевод сообщений email с помощью gettext
Для перевода динамических сообщений WooCommerce можно использовать фильтр gettext, который перехватывает любую строку перед выводом. Пример автоматического перевода стандартных сообщений:
add_filter('gettext', function($translated, $text, $domain) {
if ($domain === 'woocommerce') {
if ($text === 'Your order has been received.') {
$translated = __('Ваш заказ получен.', 'woocommerce');
}
// Добавьте другие замены по необходимости
}
return $translated;
}, 20, 3);В реальном проекте лучше использовать Polylang или WPML для строки перевода, но этот метод полезен для кастомных или отсутствующих переводов.
3. Автоматизация перевода через API (DeepL, Google Translate) для кастомных сообщений
Если вам нужно перевести динамические сообщения, которые не попадают в стандартные файлы, можно подключить автоперевод через API. Например, используя хук woocommerce_email_subject_{$email_id} или woocommerce_email_heading_{$email_id} для изменения заголовков писем на лету.
add_filter('woocommerce_email_subject_new_order', function($subject, $order) {
$translated_subject = my_translate_api_call($subject, 'ru'); // Ваша функция перевода
return $translated_subject ?: $subject;
}, 10, 2);Для вызова API используйте CURL или WP HTTP API. Важно кешировать результаты, чтобы не перегружать сервис и не увеличивать время ответа.
Как проверить, что автоматический перевод статусов и сообщений работает
- В админке WooCommerce перейдите в раздел заказы и проверьте, что статусы отображаются на нужном языке.
- Оформите тестовый заказ и проверьте полученное письмо — заголовки и тело письма должны быть на целевом языке.
- В пользовательском кабинете проверьте переводы статусов и сообщений в заказах.
- Для отладки используйте
error_log()или плагин Debug Bar для проверки срабатывания ваших фильтров.
Частые ошибки при переводе статусов и сообщений WooCommerce и их исправление
- Статусы не переводятся, потому что строки не обернуты в функции перевода. Решение: убедитесь, что все статусы передаются через
__()или_x()с правильным доменом. - Кастомные статусы не появляются в переводах. Нужно добавить их в PO-файлы вручную или обеспечить регистрацию с переводами через
register_post_status()с локализацией. - Фильтр
gettextсрабатывает медленно или конфликтует с другими плагинами. Оптимизируйте условия фильтра, чтобы проверять только нужные строки и домен. - Автоперевод увеличивает время загрузки писем. Используйте кеширование результатов API и обрабатывайте переводы асинхронно, если возможно.
Практические советы по безопасности и производительности
- При использовании внешних API перевода храните ключи доступа в
wp-config.phpи не передавайте их публично. - Кешируйте переводы с помощью Transients API или внешних систем кэширования, чтобы снизить нагрузку.
- Избегайте перехвата всех строк через
gettext, ограничьте фильтр конкретным доменом и списком фраз. - Для кастомных статусов добавляйте переводы в PO-файлы тем или плагинов, чтобы избежать проблем при обновлениях.
Сравнение способов перевода статусов и сообщений WooCommerce
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
Фильтр woocommerce_order_statuses |
Простой, работает для стандартных статусов | Не подходит для кастомных сообщений | Перевод стандартных статусов |
Фильтр gettext |
Гибкий, можно перевести любые строки | Может замедлить сайт при плохой оптимизации | Кастомные сообщения и строки без перевода |
| Автоперевод через API | Переводит динамические тексты без ручного труда | Требует кеширования и контроля скорости | Динамически генерируемые сообщения |