wpcoding.ru wordpress WP Coding

Как создать динамический файл перевода в WordPress для мультиязычных сайтов

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

Что такое динамический файл перевода в WordPress

Динамический файл перевода — это файл .mo/.po, который создается или изменяется программно в процессе работы сайта, а не статично загружается разработчиком. Это может быть полезно, если перевод зависит от пользовательского ввода, админских настроек или внешних сервисов.

В стандартной практике WordPress использует статичные файлы перевода, расположенные в папках плагинов, тем или в wp-content/languages. Но что делать, если вы хотите, чтобы перевод изменялся на лету или дополнялся?

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

Пример: создание динамического файла перевода с помощью PHP и PHP-расширения gettext

Для начала нужно понять, что файлы .mo — это бинарные файлы, компилированные из .po. Создавать такие файлы вручную неудобно, но можно использовать библиотеку Gettext PHP, которая позволяет работать с файлами перевода на лету.

Установим библиотеку через Composer:

composer require oscarotero/gettext

Далее создадим функцию с префиксом wpcoding_, которая будет генерировать файл перевода из массива и подключать его в WordPress:

function wpcoding_generate_dynamic_translation($locale, $translations_array) {
    $path = WP_CONTENT_DIR . '/languages/wpcoding-dynamic-' . $locale . '.mo';

    // Используем библиотеку Gettext
    $translations = new \Gettext\Translations();

    foreach ($translations_array as $original => $translated) {
        $translations->insert(null, $original)->setTranslation($translated);
    }

    // Сохраняем .mo файл
    $translations->toMoFile($path);

    // Загружаем файл перевода
    load_textdomain('default', $path);
}

Вызовите эту функцию в хуке init или при необходимости обновления перевода:

add_action('init', function() {
    $locale = determine_locale(); // Определяем локаль текущего пользователя или сайта
    $translations = [
        'Hello, World!' => 'Привет, мир!',
        'Read more' => 'Читать далее'
    ];
    wpcoding_generate_dynamic_translation($locale, $translations);
});

Как подключить динамические переводы в плагинах и темах

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

Для этого нужно:

  • Определить нужную локаль — ее можно получить с помощью determine_locale() или через глобальные переменные.
  • Создать массив переводов, которые вы хотите добавить или переопределить.
  • Вызвать функцию генерации и загрузки перевода, как показано выше.

Обратите внимание, что динамические переводы будут перезаписывать стандартные переводы, поэтому их следует использовать аккуратно.

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

function wpcoding_load_dynamic_translations() {
    if (!is_admin()) {
        $locale = determine_locale();
        $custom_translations = [
            'Welcome to my site' => 'Добро пожаловать на мой сайт',
            'Contact Us' => 'Свяжитесь с нами'
        ];
        wpcoding_generate_dynamic_translation($locale, $custom_translations);
    }
}
add_action('after_setup_theme', 'wpcoding_load_dynamic_translations');

Обзор популярных плагинов для мультиязычности с динамическими переводами

Если вы не хотите писать код с нуля, обратите внимание на следующие плагины, которые позволяют гибко управлять переводами и создавать динамические варианты перевода:

  • WPML — мощный плагин с поддержкой множества языков и динамической подгрузкой переводов.
  • Polylang — бесплатный плагин с возможностью добавления пользовательских строк перевода.
  • Loco Translate — позволяет редактировать переводы прямо в админке и экспортировать их в .mo файлы.

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

Советы по оптимизации и безопасности при работе с динамическими переводами

Создание и загрузка файлов перевода на лету требует внимания к безопасности:

  • Не допускайте, чтобы пользователи напрямую управляли содержимым переводов без валидации.
  • Сохраняйте файлы в защищенных папках, чтобы исключить доступ посторонних.
  • Кэшируйте результаты генерации, чтобы уменьшить нагрузку на сервер.

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

Пример кэширования генерации перевода

function wpcoding_generate_dynamic_translation_cached($locale, $translations_array) {
    $cache_key = 'wpcoding_translations_' . $locale;
    $path = get_transient($cache_key);

    if (!$path || !file_exists($path)) {
        $path = WP_CONTENT_DIR . '/languages/wpcoding-dynamic-' . $locale . '.mo';
        $translations = new \Gettext\Translations();
        foreach ($translations_array as $original => $translated) {
            $translations->insert(null, $original)->setTranslation($translated);
        }
        $translations->toMoFile($path);
        set_transient($cache_key, $path, DAY_IN_SECONDS);
    }

    load_textdomain('default', $path);
}

Заключение

Динамические файлы перевода в WordPress — мощный инструмент для создания по-настоящему мультиязычных и адаптивных сайтов. Благодаря программной генерации и загрузке переводов можно создавать гибкие решения для специфических задач, выходящих за рамки стандартных плагинов.

Используйте библиотеку Gettext PHP, понимайте архитектуру локализации WordPress и не забывайте о безопасности и производительности.

Если у вас остались вопросы, вы всегда можете обратиться к документации WordPress и сообществу разработчиков.

×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙