WordPress изначально поддерживает локализацию и интернационализацию, позволяя создавать сайты на разных языках с помощью языковых файлов .po и .mo. Но зачастую возникают ситуации, когда нужно добавить или изменить перевод для конкретных строк в шаблоне или плагине, не прибегая к установке дополнительных плагинов. В этой статье рассмотрим, как работать с пользовательскими переводами вручную и программно, чтобы гибко управлять переводами на сайте.
Почему стоит использовать пользовательские переводы без плагинов
Использование плагинов для перевода удобно, но добавляет нагрузку на сайт и порой может вызывать конфликты. Если вам нужно внести небольшие правки в переводы или добавить свои, то лучше сделать это вручную. Такой подход:
- Уменьшает количество подключаемых модулей;
- Позволяет более точно контролировать переводы;
- Облегчает поддержку и перенос сайта между серверами;
- Позволяет автоматизировать изменения через код.
Как WordPress загружает переводы: основы
Основная функция WordPress для загрузки переводов — load_textdomain(). Она считывает .mo-файлы с переводами и подключает их к домену текста (textdomain). По умолчанию темы и плагины регистрируют свой домен вызовами load_theme_textdomain() или load_plugin_textdomain().
Если нужно добавить или переопределить перевод, можно использовать функцию load_textdomain() с указанием своего файла .mo, либо фильтр load_textdomain_mofile, чтобы перенаправить загрузку на кастомный файл.
Создание и подключение пользовательского переводного файла
Для создания пользовательского перевода используйте Poedit или аналогичный редактор. В Poedit открываете исходный .pot файл темы или плагина, делаете перевод, сохраняете в формате .po и .mo с уникальным именем — например, my-wplang-ru_RU.mo.
Далее загружаем этот файл в папку wp-content/languages/custom/ (создайте папку, если её нет). Чтобы WordPress считывал этот файл, добавьте в functions.php вашей темы следующий код:
function wplang_load_custom_textdomain() {
$locale = determine_locale(); // Получаем текущий язык
$mofile = WP_LANG_DIR . '/custom/my-wplang-' . $locale . '.mo';
if ( file_exists( $mofile ) ) {
load_textdomain( 'default', $mofile );
}
}
add_action( 'init', 'wplang_load_custom_textdomain' );
Здесь мы переопределяем домен default, который используется для стандартных строк WordPress. Если нужно переопределить переводы темы или плагина, замените 'default' на нужный домен.
Пример переопределения переводов для темы
Если тема использует домен mytheme, код изменится так:
function wplang_load_custom_theme_textdomain() {
$locale = determine_locale();
$mofile = WP_LANG_DIR . '/custom/mytheme-' . $locale . '.mo';
if ( file_exists( $mofile ) ) {
load_textdomain( 'mytheme', $mofile );
}
}
add_action( 'after_setup_theme', 'wplang_load_custom_theme_textdomain' );
Использование фильтра load_textdomain_mofile для замены файлов перевода
Другой способ — через фильтр load_textdomain_mofile. Он позволяет изменить путь к файлу перевода во время загрузки:
function wplang_filter_load_textdomain_mofile( $mofile, $domain ) {
if ( 'mytheme' === $domain ) {
$custom_mofile = WP_LANG_DIR . '/custom/mytheme-' . determine_locale() . '.mo';
if ( file_exists( $custom_mofile ) ) {
return $custom_mofile;
}
}
return $mofile;
}
add_filter( 'load_textdomain_mofile', 'wplang_filter_load_textdomain_mofile', 10, 2 );
Это удобнее, так как не нужно вручную вызывать load_textdomain(). WordPress автоматически загрузит ваш файл, если он существует.
Редактирование отдельных строк перевода через фильтр gettext
Если нужно изменить пару строк без создания .mo файлов, можно использовать фильтр gettext. Вот пример:
function wplang_custom_gettext( $translated_text, $text, $domain ) {
if ( 'mytheme' === $domain ) {
if ( $translated_text === 'Old string' ) {
$translated_text = 'Новый перевод строки';
}
}
return $translated_text;
}
add_filter( 'gettext', 'wplang_custom_gettext', 20, 3 );
Этот метод хорош для быстрого исправления ошибок или добавления специфичных переводов только для вашего сайта без правки файлов.
Пример: создание пользовательского языкового переключателя без плагинов
Часто нужно не только переводы, но и переключатель языков. Пример простого пользовательского переключателя, который меняет язык сайта через параметр URL:
function wplang_custom_language_switcher() {
$current_url = home_url( add_query_arg( NULL, NULL ) );
$languages = [
'ru_RU' => 'Русский',
'en_US' => 'English',
];
echo '<ul class="wplang-lang-switcher">';
foreach ( $languages as $locale => $name ) {
$url = add_query_arg( 'lang', $locale, $current_url );
echo '<li><a href="' . esc_url( $url ) . '">' . esc_html( $name ) . '</a></li>';
}
echo '</ul>';
}
// Инициализация языка по параметру URL
function wplang_set_locale_from_url() {
if ( isset( $_GET['lang'] ) ) {
$locale = sanitize_text_field( $_GET['lang'] );
switch_to_locale( $locale );
}
}
add_action( 'setup_theme', 'wplang_set_locale_from_url' );
Этот код выводит простой список языков и переключает локаль для текущего запроса. Для полноценного мультиязычного сайта понадобится дополнить этот функционал сохранением выбранного языка в сессии или куках.
Советы по работе с переводами на сайте
- Используйте уникальные домены текстов для своих тем и плагинов, чтобы избежать конфликтов.
- Храните пользовательские .mo файлы в отдельной папке
wp-content/languages/custom/. - Автоматизируйте создание переводов с помощью Poedit или WP CLI.
- Проверяйте изменения переводов после обновления темы или плагина, чтобы не потерять правки.
- Для сложных сайтов лучше использовать специализированные плагины, например, WPML или Polylang.
Заключение
Работа с пользовательскими переводами без плагинов — это мощный и гибкий способ управления локализацией в WordPress. Используя функции load_textdomain(), фильтры load_textdomain_mofile и gettext, можно легко переопределять и добавлять переводы, а также создавать собственные языковые переключатели. Такой подход позволяет уменьшить нагрузку на сайт и сохранить полную свободу настройки.
Если вы хотите расширить функционал мультиязычности, рекомендую посмотреть плагины с хорошей оптимизацией, например, Clearfy Pro для оптимизации и ускорения работы переводов на сайте.