Текстовый домен темы и языковой файл .PO не работают
Я не могу заставить работать переводы в моей теме. Вот что у меня есть
В файле functions.php у меня:
load_theme_textdomain( 'transparent', get_template_directory_uri() .'/languages' );
У меня есть
.../theme/languages/transparent-en_US.po,
который содержит:
# Английские переводы для пакета Transparent.
# Copyright (C) 2014 Steven Doig
# Этот файл распространяется по той же лицензии, что и пакет Transparent.
# Автоматически сгенерировано, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: my-pluginname 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-08-06 13:46-0400\n"
"PO-Revision-Date: 2013-03-21 11:20+0400\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"X-Poedit-SourceCharset: iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.5.4\n"
#: header.php:58
msgid "thanks-for-visiting"
msgstr "Здравствуйте! Спасибо за посещение. Посмотрите вокруг и подпишитесь на "
#: header.php:60
msgid "subscribe-by-email"
msgstr "подписаться по email"
#: header.php:62
msid "for-updates"
msgstr "чтобы получать обновления."
В header.php, начиная со строки 58, у меня:
<p><?php echo __("thanks-for-visiting", 'transparent'); ?><a href="<?php bloginfo('rss2_url'); ?>" title="<?php bloginfo('name'); ?> RSS feed">RSS feed</a>
<?php if (of_get_option('feedburner', '') !== '') {?>
or <a href="http://feedburner.google.com/fb/a/mailverify?uri=<?php echo of_get_option('feedburner', 'no entry');?>&loc=en_US" target="_blank"><?php echo __("subscribe-by-email", 'transparent'); ?></a>
<?php } ?>
<?php echo __("for-updates", 'transparent'); ?></p>
В моем style.css у меня следующее
/*
Theme Name: Transparent
Theme URI: http://websitetechnology.com.au/category/themes/transparent/
Description: Transparent responsive two-column theme.
Tags: green, two-columns, right-sidebar
Author:Steven Doig
Author URI:http://tech.doig.com.au
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Version:1.2
*/
Однако на фронтенде я вижу:
thanks-for-visitingRSS feed for-updates
Можете ли вы понять, почему этот перевод не работает?

После анализа вашей темы я пришел к следующим выводам. Я также включил решение Рубена, чтобы ответ был максимально полным.
Здесь есть несколько проблем:
Проблема 1. load_theme_textdomain( 'transparent', get_template_directory_uri() .'/languages' );
должно быть:
function transparent_theme_setup() {
load_theme_textdomain( 'transparent', get_template_directory() . '/languages' );
$locale = get_locale();
$locale_file = get_template_directory() . "/languages/$locale.php";
if ( is_readable( $locale_file ) ) {
require_once( $locale_file );
}
}
add_action( 'after_setup_theme', 'transparent_theme_setup' );
Файлы перевода всегда должны загружаться с помощью хука after_setup_theme
.
Также get_template_directory_uri()
должно быть
get_template_directory()
.
Проблема 2. <?php echo __("thanks-for-visiting", 'transparent'); ?>
.
совершенно неверно. Во-первых, никогда не используйте "
в строке перевода. Переводчик не распознает её и пропустит эту строку. Всегда используйте '
. Во-вторых, не выводите строку с помощью echo
. В этом случае следует использовать _e
. Таким образом, ваша строка должна выглядеть так:
<?php _e('thanks-for-visiting', 'transparent'); ?>
.
Проблема 3. В заголовке вашего файла стилей не указан текстовый домен. Добавьте Text Domain: transparent
прямо перед закрывающим */
в заголовке. Таким образом, ваш заголовок должен выглядеть так:
/*
Theme Name: Transparent
Theme URI: http://websitetechnology.com.au/category/themes/transparent/
Description: Transparent responsive two-column theme.
Tags: green, two-columns, right-sidebar
Author:Steven Doig
Author URI:http://tech.doig.com.au
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Version:1.2
Text Domain: transparent
*/
Проблема 4. Имя вашего po-файла неверное, как и mo-файла. somename-en_US.po
и somename-en_US.mo
используются только плагинами. Темы используют только имена файлов en_US.po
и en_US.mo
Проблема 5. Ваш po-файл создан неправильно. Чтобы создать po-файл с помощью poedit, выполните следующие шаги. Обратите внимание, что мой poedit на африкаанс.
Откройте poedit и выберите опцию создания каталога. Появится следующее окно
.
Заполните необходимые поля, как показано.
Теперь перейдите на вкладку "Sources paths" и заполните, как показано. Используйте .
в поле "Paths", если ваш языковой файл находится в основной директории, и ..
, если языковой файл находится в папке, например, language
Теперь перейдите на вкладку "Sources keywords" и заполните, как показано.
Теперь сохраните файл poedit как en_US.po
в вашей папке languages. Важно сохранить po-файл именно в том месте, где он должен находиться, иначе он не будет работать. Poedit теперь найдет и добавит все строки для перевода в ваш po-файл. Mo-файл создается автоматически при сохранении po-файла.
В итоге заголовок вашего po-файла должен выглядеть так
msgid ""
msgstr ""
"Project-Id-Version: Transparent v1.2\n"
"POT-Creation-Date: 2014-03-12 16:25+0200\n"
"PO-Revision-Date: 2014-03-12 16:28+0200\n"
"Last-Translator: Pieter Goosen <goosen_p@yahoo.com>\n"
"Language-Team: Transparent <sample@example.com>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.5\n"
"X-Poedit-KeywordsList: gettext;gettext_noop;__;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-SearchPath-0: ..\n"
Для дальнейшего чтения ознакомьтесь с этим руководством. Оно действительно помогло мне, когда я начинал работать с переводами. Надеюсь, это поможет.

Не используйте get_template_directory_uri(). Вместо этого используйте get_template_directory(). Ваш код должен выглядеть так:
load_theme_textdomain( 'transparent', get_template_directory() . '/languages' );
$locale = get_locale();
$locale_file = get_template_directory() . "/languages/$locale.php";
if ( is_readable( $locale_file ) ) {
require_once( $locale_file );
}

-
Убедитесь, что вы добавили этот код внутри фильтра after_setup_theme.
-
Попробуйте использовать этот плагин, он может показать, есть ли ошибка в ваших .po/.mo файлах: http://wordpress.org/plugins/codestyling-localization/

- Я добавил приведенный выше код в функцию под названием
transparent_theme_setup()
, а затем вызвалadd_action( 'after_setup_theme', 'transparent_theme_setup' );
. Вы это имели в виду? 2. Плагин Codestyling показывает, что нет ошибок в .po/.mo файлах.

При использовании load_theme_textdomain
имя вашего языкового файла должно точно соответствовать локали.
Назовите его en_US.mo вместо transparent-en_US.mo
Внимательно ознакомьтесь с инструкциями по ссылке: https://codex.wordpress.org/Function_Reference/load_theme_textdomain
