Как автоматически перевести динамические сообщения WooCommerce в WordPress

Диагностика проблемы с переводом динамических сообщений 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
Как добавить поддержку мультиязычности в тему WordPress без плагинов
27.12.2025
Как автоматически перевести атрибуты товаров WooCommerce в WordPress
29.04.2026
Как использовать Polylang для автоперевода товаров WooCommerce
06.05.2026
Как использовать кэширование для оптимизации многоязычного контента WordPress
13.06.2026
Автоматический перевод сообщений в формах WordPress
15.03.2026