Диагностика проблемы с переводом сообщений WooCommerce
WooCommerce отправляет пользователям и администраторам множество уведомлений — о новых заказах, изменениях статусов, ошибках оплаты и т.д. Эти сообщения часто содержат фиксированный текст, который не всегда корректно переводится при использовании стандартных инструментов мультиязычности. Особенно это заметно, если применяются кастомные статусы заказов или добавлены свои уведомления.
Типичные признаки проблемы:
- Сообщения WooCommerce приходят только на одном языке, несмотря на мультиязычность сайта.
- Автоматический перевод через плагины не затрагивает системные уведомления.
- Невозможно быстро заменить или дополнить тексты уведомлений для разных языков без глубоких правок.
Почему стандартные методы не всегда работают
WooCommerce использует функцию wc_get_email_classes() для загрузки классов уведомлений, а сами тексты сообщений хранятся внутри этих классов. Перевод осуществляется через gettext-подобные функции (__(), _e()), но если задействовать сторонние автопереводчики или кастомные решения, они часто не охватывают эти тексты напрямую.
Кроме того, сообщения могут формироваться динамически, например, включать названия товаров, статусов или пользовательские поля, которые должны быть переведены отдельно.
Пошаговое решение: автоперевод сообщений WooCommerce через хуки
1. Перехват текста сообщения через хук woocommerce_email_heading
Этот хук позволяет изменить заголовок письма. Для автоматического перевода можно использовать сторонний API, например, DeepL или Google Translate (через официальные SDK или REST API).
add_filter('woocommerce_email_heading', 'auto_translate_wc_email_heading', 10, 2);
function auto_translate_wc_email_heading($heading, $email) {
$target_lang = determine_user_language($email->object); // ваша функция определения языка
return auto_translate_text($heading, $target_lang);
}2. Перевод тела письма через woocommerce_mail_content
Этот фильтр позволяет вмешаться в полный HTML-содержимое письма перед отправкой.
add_filter('woocommerce_mail_content', 'auto_translate_wc_email_content', 10, 2);
function auto_translate_wc_email_content($content, $email) {
$target_lang = determine_user_language($email->object);
return auto_translate_text($content, $target_lang);
}3. Пример функции автоперевода на базе Google Translate API
function auto_translate_text($text, $target_lang) {
$api_key = 'ВАШ_GOOGLE_API_KEY';
$url = 'https://translation.googleapis.com/language/translate/v2?key=' . $api_key;
$data = [
'q' => $text,
'target' => $target_lang,
'format' => 'html'
];
$response = wp_remote_post($url, [
'body' => json_encode($data),
'headers' => ['Content-Type' => 'application/json']
]);
if (is_wp_error($response)) {
return $text; // В случае ошибки возвращаем оригинал
}
$body = json_decode(wp_remote_retrieve_body($response), true);
return $body['data']['translations'][0]['translatedText'] ?? $text;
}4. Определение языка пользователя
Для корректного перевода нужно определить язык, на который отправлять сообщение. Это можно сделать на основе языка пользователя, сохранённого в метаданных заказа:
function determine_user_language($order) {
if (!$order) return 'en';
$lang = get_post_meta($order->get_id(), '_user_language', true);
return $lang ? $lang : 'en';
}Проверка результата после внедрения
Чтобы убедиться, что перевод работает:
- Создайте тестовый заказ с языком пользователя, отличным от основного.
- Вызовите отправку уведомления вручную в WooCommerce или измените статус заказа для триггера письма.
- Проверьте письмо — заголовок и тело должны быть переведены на нужный язык.
- При ошибках смотрите логи сервера и WP_DEBUG для отладки вызова API.
Частые ошибки и как их исправить
- API переводчика не отвечает или возвращает ошибку. Проверьте ключ API, лимиты запросов, подключение к интернету.
- Письма приходят на исходном языке. Убедитесь, что функция определения языка возвращает корректное значение, и фильтры применяются к правильным хукам.
- HTML-содержимое письма ломается после перевода. Используйте параметр
format => htmlв API-запросе и тестируйте на небольших фрагментах. - Высокая задержка при отправке писем. Перевод через API — затратная операция. Рассмотрите асинхронную обработку через очереди или кэширование результатов.
Практические советы по безопасности и производительности
- Храните API-ключи в
wp-config.phpили в настройках плагина с правильным доступом. - Кэшируйте переводы в базе данных, чтобы не делать запросы к API повторно при одинаковом тексте.
- Используйте транзиенты или метаполя заказа для хранения переведённых текстов.
- Ограничьте длину текста для перевода, разбивая длинные письма на части.
Сравнение подходов для перевода сообщений WooCommerce
| Подход | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Статический перевод через .po/.mo | Простота, нативная поддержка WordPress | Не переводит динамические данные, сложность с кастомами | Стандартные уведомления, малые сайты |
| Плагины мультиязычности (WPML, Polylang) | Интеграция с интерфейсом, удобство | Не всегда переводят кастомные сообщения, платные | Сайты с фиксированной мультиязычностью |
| Автоперевод через хуки + API | Гибкость, перевод любых текстов, динамичность | Задержки, расходы на API, требуется кодинг | Кастомные проекты, масштабируемость |