i18N Wordpress использует файлы mo, не принимающие контекст

Я немного запутался с загрузкой файла моей темы .MO. Я много искал в Google, и у меня работает версия, но я не понимаю, почему.

Прежде всего, я установил свой текстовый домен в файле CSS тем:

Text Domain:        beauty

Я начал с темы Roots, которая выполняет after_setup_theme, и я загружаю туда файл MO:

  load_theme_textdomain('beauty', get_template_directory() . '/lang');

Этот файл MO имеет контекст «красоты» и контекст «корней». Файл MO загружается, потому что, когда я выгружаю $l10n[$domain], я вижу, что мои 3 значения имеют контекст красоты.

Для экономии места я покажу только одну запись:

array (size=3)
  'beautyInloggen' => 
    object(Translation_Entry)[218]
      public 'is_plural' => boolean false
      public 'context' => string 'beauty' (length=6)
      public 'singular' => string 'Inloggen' (length=8)
      public 'plural' => null
      public 'translations' => 
        array (size=1)
          0 => string 'Login' (length=5)
      public 'translator_comments' => string '' (length=0)
      public 'extracted_comments' => string '' (length=0)
      public 'references' => 
        array (size=0)
          empty
      public 'flags' => 
        array (size=0)
          empty

У меня на сайте 2 местных, nl_NL и en_UK. Они устанавливаются с помощью WPML и загружаются правильно. У меня есть файлы nl_NL.mo и en_UK.mo в папке lang темы.

Итак, все это выглядит хорошо.

Однако в моем header.php у меня есть привязка для входа:

<a href="<?php echo $login_url; ?>" target="_self"><?php _e( 'Inloggen', 'beauty' ); ?></a>

который в моем понимании должен грузить контекст "красота" и ключ "Inloggen".

Итак, это не работает, когда я нахожусь в своей локали nl_UK, я вижу стандартный голландский текст «Inloggen» вместо «Login».

Как ни странно, когда я удаляю контекст msgctxt "beauty" из моего PO-файла и сохраняю его для создания нового MO-файла, он ДЕЙСТВИТЕЛЬНО работает.

Я использовал контексты раньше в своем плагине, где я использую load_textdomain для загрузки файлов MO, и это работает нормально.

Причина, по которой я хочу использовать контексты, заключается в том, что один файл содержит тексты, связанные с корнями и красотой, а меня интересуют только тексты красоты. Я не хочу удалять все записи _e темы Roots, чтобы она не появлялась при загрузке исходников.

Итак, это был один вопрос.

Вопрос 2 менее важен, но также ставит меня в тупик: когда я смотрю на пример с темой двадцать пятый, у них есть файлы PO и MO в папке wp-content/languages/themes/ как двадцать пятый-nl_NL.mo. Я прочитал эту замечательную статью (https://localise.biz/help/wordpress/loading-translations) и этот пост (https://wordpress.stackexchange.com/questions/137427/themes-text-domain-language-po-file-not-working) и понял, что вы всегда должны давать MO-файлу имя локали, а не имя контекста + локаль .

В этом прекрасном документе (https://localise.biz/help/wordpress/loading-translations) я нахожу

So in short, WordPress will look in only two places for a theme's MO file:

{absolute_path}/{locale}.mo
wp-content/languages/themes/{domain}-{locale}.mo
e.g. for twentyfourteen's French translations:

wp-content/themes/twentyfourteen/languages/fr_FR.mo
wp-content/languages/themes/twentyfourteen-fr_FR.mo

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

ваше здоровье


person Mattijs    schedule 10.11.2015    source источник
comment
Если я правильно помню, в вашей языковой папке (английской) должны быть файлы po/mo по умолчанию, а перевод должен иметь только nl.po/.mo (то есть не nl_NL.po/.mo). При этом у вас должны были быть загружены переведенные строки, но даже в этом случае вы могли бы сделать перевод строк в самом WPML, не так ли?   -  person dingo_d    schedule 10.11.2015
comment
да, я могу выполнять перевод строк в WPML, но мне нравится быстрота файлов MO по сравнению с вызовами БД для получения переводов. Во всех документах, которые я прочитал, файлы с определенным указанием должны называться как локаль, nl_NL или uk_GB, uk_IRL и т. д.   -  person Mattijs    schedule 10.11.2015
comment
Я знаю, что когда я пытался перевести тему на хорватский (hr_HR), когда я пытался hr_HR.po/.mo, тема не воспринимала мой перевод. Но когда я переименовал его в hr.po/.mo, это произошло.   -  person dingo_d    schedule 10.11.2015
comment
Кажется, я уже знаю, почему это не работает, потому что я путаю КОНТЕКСТ с ДОМЕНОМ. Я посмотрю на свою ситуацию и реорганизую ее и отпишусь   -  person Mattijs    schedule 10.11.2015


Ответы (1)


Хорошо, я обнаружил, что злоупотреблял атрибутом Context в POEdit, как если бы это был домен. Я был смущен другим постом, думая, что это будет работать так. Ну, это не так.

Поэтому я сделал то, что рекомендовал @Václav Slavík, и обернул функции _e и __ в свои собственные функции, чтобы POEdit мог искать те концы, в которых я не получил бы языковые теги Roots в своих файлах. Задача решена. Он также загружается из языковой папки Wordpress по умолчанию, все это было связано с путаницей контекста / домена.

person Mattijs    schedule 10.11.2015