Вступление
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-сервере перед обновлением на боевом сайте.
Полезные ссылки: