Поддержка Проблемы и решения Расположение mo файлов

  • Решено Serge Gusev

    (@serge-gusev)


    Добрый день.

    Сделал перевод своей темы на русский, в принципе, работает, но только в том случае, если я располагаю свой *.mo файл в глобальный каталог wp-content/languages/themes/themedomain_ru_RU.mo.

    Если же располагаю локально, то файл перевода не подхватывается, хотя я указываю в functions.php:

    load_theme_textdomain('themedomain', get_template_directory() . '/languages');

    Вызов перевода делается так:

     $labels = array(
         'name' => _x( 'Sliders', 'post type general name', 'themedomain' ),
         'singular_name' => _x( 'Slider', 'post type singular name', 'themedomain' )
      );

    Есть ли возможность уговорить WordPress брать файлы перевода из нужной мне директории?

    • Тема изменена 2 года, 1 месяц назад пользователем Serge Gusev.
Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Модератор Yui

    (@fierevere)

    永子

    Спасибо, вот такой вариант сработал:

    load_textdomain('themedomain', get_template_directory() . '/languages/themedomain-ru_RU.mo');

    Но при этом возникла проблема: когда я размещаю файл в wp-content/languages/themes, это работает корректно — при интерфейсе на английском языке показывается значение по умолчанию, а при смене интерфейса на русский — делается перевод.

    Сейчас же при любом языке интерфейса подтягивается русский вариант. Есть решение этой проблемы?

    Попробовал решить проблему, определяя текущую локаль через get_locale() и подгружать ru_RU файл только в том случае, если текущая локаль русская. Но в functions.php get_locale() всегда возвращает en_US, независимо от фактического языка, установленного в профиле.

    В итоге вот такой код сработал:

    $domain = 'themedomain';
    
    $locale = apply_filters( 'theme_locale', determine_locale(), $domain );
    
    if (strpos($locale, 'ru') !== false){
    	load_textdomain('softaindental', get_template_directory() . '/languages/softaindental-ru_RU.mo');
    }

    То есть ручками самому получать текущую локаль (через apply_filters) и подгружать что нужно.

    Неужели нет автоматического решения, аналогичного load_theme_textdomain , но из локальной папки темы?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    В итоге вот такой код сработал

    А чем это отличается от функции load_theme_textdomain()?

    Неужели нет автоматического решения, аналогичного load_theme_textdomain , но из локальной папки темы?

    В общем случае load_theme_textdomain() именно это и делает: подгружает языковой файл либо из wp-content/languages/themes (если он там есть), либо из локальной папки темы.

    Не работать может по разным причинам: вызывается слишком рано или поздно, неверно определяется путь к файлу или локаль, и т.д.

    В примерах рекомендуется вызывать функцию в привязке к действию after_setup_theme. Как вызывается она у вас?

    Re: А чем это отличается от функции load_theme_textdomain()?

    Два отличия

    1. В load_theme_textdomain() указывается каталог. Откуда автоматически подгружается перевод в нужной локали. А сейчас я подгружаю файл в нужной локали самостоятельно. Вот окончательный код:

    $domain = 'themedomain';
    
    $locale = apply_filters( 'theme_locale', determine_locale(), $domain ); // get_locale() does not work here
    
    load_textdomain($domain , get_template_directory() . '/languages/themedomain-'. $locale . '.mo');

    2. Ищется файл локали в глобальном каталоге wp_content/languages/themes, а не в моём локальном каталоге темы.

    Re: Как вызывается она у вас?

    Прямо в functions.php. Попробую и ваш вариант, спасибо.

    • Ответ изменён 2 года, 1 месяц назад пользователем Serge Gusev.

    Спасибо, Сергей Бирюков, этот вариант самый лучший.

    Вот окончательное решение:

    add_action('after_setup_theme', 'my_theme_setup');
    
    function my_theme_setup(){
    
        $domain = 'themedomain';
    
        load_theme_textdomain($domain, get_template_directory() . '/languages');
    }

    Нужно учитывать нюанс, что имя файла локали не должно включать имени домена, а быть просто ru_RU.mo

Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Тема «Расположение mo файлов» закрыта для новых ответов.