Оглавление

Вступление

WordPress 6.7 подоспел с долгожданными улучшениями для интернационализации (i18n), и разработчики уже бурно обсуждают, как эти изменения скажутся на наших любимых плагинах и темах. Нововведения направлены на оптимизацию переводов и ускорение загрузки страниц, но будьте внимательны: старый код может внезапно вызвать море предупреждений. Давайте разберёмся, как выжить в этой i18n-революции и избежать неприятных сюрпризов.


1. Проверка наличия перевода без загрузки: has_translation()

Если раньше вы изо всех сил пытались проверить, существует ли перевод, без лишней нагрузки на сервер, то теперь с новой функцией has_translation() это можно сделать на раз-два. Больше никакого преждевременного load_textdomain() и танцев с бубном вокруг __().

Пример использования:

if ( has_translation( 'my-awesome-plugin', 'my-text-domain' ) ) {
    echo __( 'Перевод найден!', 'my-text-domain' );
}

Теперь это работает как магия! Ваш код станет легче, как после диеты в Новом году.


2. Отправка писем на языке администратора

С версии 4.7 WordPress позволил пользователям выбирать предпочитаемый язык интерфейса. А теперь, в версии 6.7, появилась умная логика: если ваш email совпадает с admin_email, WordPress автоматически отправит письма на вашем языке, а не на языке сайта.

Это особенно полезно, если ваш сайт работает на испанском, но администратор предпочитает читать всё на английском. Ваша почта теперь будет соответствовать вашему выбору, а не настроениям сайта.

wp_mail( 'admin@example.com', 'Уведомление', 'Привет, это письмо на вашем языке!' );

И никаких больше сюрпризов на китайском!


3. Изменения в обработке переводов: централизованное хранение

С обновлением до WordPress 6.7 произошли изменения в том, как и откуда загружаются переводы для тем. Теперь WordPress будет отдавать приоритет загрузке переводов из центрального каталога wp-content/languages/themes/, а не из папок самой темы. Это сделано для стандартизации и упрощения работы с локализацией.

Где теперь хранить переводы?

Чтобы ваш сайт не потерял локализацию после обновления, следуйте новым рекомендациям:

  • Основное место для хранения переводов: переводные файлы должны быть расположены в каталоге wp-content/languages/themes/ с соглашением об именовании {theme-slug}-{locale}.mo.
    Например:
  wp-content/languages/themes/your-theme-fr_FR.mo
  • Если WordPress обнаружит .mo файлы в этом каталоге, он автоматически их подхватит без необходимости добавлять специальный код.

Использование load_theme_textdomain

Если вам всё же нужно явно указать, откуда загружать переводы, load_theme_textdomain() остаётся вашим верным помощником:

load_theme_textdomain( 'your-theme', WP_LANG_DIR . '/themes' );

Этот подход помогает контролировать процесс загрузки переводов, особенно если вы работаете с кастомными сценариями или отладкой.

Запасной вариант с load_textdomain

Для разработчиков, которым удобнее хранить переводы прямо в папке с темой (например, при разработке или на тестовых сайтах), можно использовать load_textdomain:

load_textdomain( 'your-theme', get_template_directory() . '/languages/your-theme-fr_FR.mo' );

Но будьте осторожны: этот метод может вызвать сложности в рабочих средах, так как WordPress теперь будет искать переводы в своём новом централизованном каталоге.


4. Предупреждения о преждевременной загрузке переводов

WordPress 6.7 добавляет предупреждения для тех, кто загружает переводы слишком рано. Теперь при попытке загрузить переводы до init или after_setup_theme вы рискуете получить предупреждение типа _doing_it_wrong().

Пример ошибки:

define( 'MYPLUGIN_VERSION', get_plugin_data( __FILE__ )['Version'] );

Исправление:

define( 'MYPLUGIN_VERSION', get_plugin_data( __FILE__, false /* $translate */ )['Version'] );

Лучше сразу перенести инициализацию на более поздние хуки, чтобы избежать конфликтов с другими плагинами.


5. Как диагностировать и исправить проблему

Если вы внезапно увидели doing_it_wrong(), WordPress пытается сказать вам: «Эй, так больше нельзя!». Используйте следующий хук для отладки:

add_action(
    'doing_it_wrong_run',
    static function ( $function_name ) {
        if ( '_load_textdomain_just_in_time' === $function_name ) {
            debug_print_backtrace();
        }
    }
);

Не забывайте про Query Monitor — это отличный инструмент для отладки.


Заключение

Эти изменения направлены на упрощение работы с переводами и минимизацию проблем при обновлении WordPress. Убедитесь, что ваши темы и плагины готовы к этому переходу, чтобы избежать неприятных сюрпризов в будущем. Всегда тестируйте свои настройки на staging-сервере перед обновлением на боевом сайте.

Полезные ссылки: