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" вместо "Логин".

Странно, когда я удаляю msgctxt "beauty" контекст из моего файла PO и сохранить его, чтобы создать новый файл MO, он работает.

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

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

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

Вопрос 2 не так важен, но и озадачивает меня: когда я смотрю на пример темы "двадцать пять раз", у них есть файлы PO и MO в папке wp-content/languages ​​/ themes / как двадцать fiftheen-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-файле имя локали, а не contextname + locale.

В этом хорошем документе ( 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).

ура

1 ответ

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

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

Другие вопросы по тегам