Диагностика проблемы с переводом динамических сообщений WooCommerce
Проблема: стандартные средства перевода WooCommerce не охватывают динамические сообщения, которые формируются при изменении статусов заказов, уведомлениях и служебных сообщениях. Часто при использовании плагинов перевода (WPML, Polylang) эти тексты остаются на исходном языке, что ухудшает пользовательский опыт на многоязычном сайте.
Чтобы диагностировать, какие именно сообщения не переводятся, необходимо:
— Проверить уведомления о заказах, статусах и ошибках в разных языковых версиях сайта;
— Использовать консоль разработчика для отслеживания AJAX-запросов WooCommerce;
— Проверить, какие функции отвечают за генерацию сообщений в woocommerce/includes и какие филтры или хуки применяются.
Пошаговое решение: автоматический перевод динамических сообщений WooCommerce
1. Определение хуков для перевода сообщений
Динамические сообщения WooCommerce формируются через фильтры и хуки, например 'woocommerce_email_subject_' . $email_id или 'woocommerce_order_status_changed'. Для перевода нужно перехватить эти сообщения до вывода.
2. Реализация автоперевода через DeepL API (пример)
Пример простого автоперевода темы письма и текста уведомления. В этом примере используется DeepL API, но можно заменить на любой другой сервис.
add_filter('woocommerce_email_subject_new_order', 'auto_translate_woocommerce_email_subject', 10, 2);
function auto_translate_woocommerce_email_subject($subject, $order) {
$target_lang = determine_user_language($order->get_billing_email()); // функция определения языка пользователя
return deepl_translate_text($subject, $target_lang);
}
add_filter('woocommerce_email_heading_new_order', 'auto_translate_woocommerce_email_heading', 10, 2);
function auto_translate_woocommerce_email_heading($heading, $order) {
$target_lang = determine_user_language($order->get_billing_email());
return deepl_translate_text($heading, $target_lang);
}
function deepl_translate_text($text, $target_lang) {
$api_key = 'YOUR_DEEPL_API_KEY';
$url = 'https://api-free.deepl.com/v2/translate';
$data = [
'auth_key' => $api_key,
'text' => $text,
'target_lang' => strtoupper($target_lang)
];
$response = wp_remote_post($url, [
'body' => $data
]);
if (is_wp_error($response)) {
return $text; // fallback
}
$body = json_decode(wp_remote_retrieve_body($response), true);
return $body['translations'][0]['text'] ?? $text;
}
3. Определение языка для перевода
Для правильного выбора языка можно использовать данные пользователя или глобальные параметры мультиязычности:
function determine_user_language($email) {
// Пример: получить язык из пользовательских метаданных или сессии
// Здесь можно интегрировать с Polylang или WPML
if (function_exists('pll_get_post_language')) {
return pll_get_post_language(get_the_ID());
}
// fallback
return 'RU';
}
Проверка результата после внедрения
- Оформите тестовый заказ в WooCommerce на разных языках.
- Проверьте, что тема и тело письма, а также уведомления на фронтенде выводятся на нужном языке.
- Используйте инструменты разработчика для просмотра запросов и ответов API перевода.
- Проверьте логи ошибок WordPress на предмет сбоев при вызове API.
Частые ошибки и как их исправить
- Не срабатывают фильтры: убедитесь, что приоритет фильтров достаточно высокий (10 или ниже), и что хуки применяются к нужным ID писем.
- Проблемы с API переводчика: проверьте корректность ключа API и лимиты запросов; для отладки выводите в лог запросы и ответы.
- Неверное определение языка: проверьте логику функции определения языка, особенно при мультиязычных плагинах.
- Задержка в отправке писем: автоперевод через API увеличивает время генерации сообщений, используйте асинхронные задачи или кэширование.
Практические советы по безопасности и производительности
- Не храните ключи API в коде — используйте
wp-config.phpи функциюgetenv()для загрузки. - Кэшируйте результаты перевода, чтобы снизить количество запросов к API, например, с помощью транзиентов WordPress:
function get_cached_translation($text, $target_lang) {
$cache_key = 'translation_' . md5($text . $target_lang);
$translation = get_transient($cache_key);
if ($translation !== false) {
return $translation;
}
$translation = deepl_translate_text($text, $target_lang);
set_transient($cache_key, $translation, DAY_IN_SECONDS);
return $translation;
}
- Обрабатывайте ошибки API аккуратно, чтобы не нарушить работу платежей и уведомлений.
- Для ускорения загрузки страниц с динамическими сообщениями используйте AJAX для подгрузки перевода после загрузки страницы.
Сравнение подходов к автоматическому переводу динамических сообщений WooCommerce
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин автоперевода (WPML, Polylang) | Легко интегрируется, поддержка всех типов контента | Не всегда переводит динамические сообщения, требует ручной настройки | WPML String Translation |
| Собственный код с API DeepL/Google Translate | Гибкость, возможность кастомизации | Требуется программирование, возможна задержка при переводе | Пример кода выше |
| Кэширование переводов транзиентами | Уменьшение нагрузки на API, ускорение выдачи | Необходима реализация дополнительной логики | Использование set_transient |