Текстовый домен темы и языковой файл .PO не работают

10 мар. 2014 г., 08:14:57
Просмотры: 30.3K
Голосов: 2

Я не могу заставить работать переводы в моей теме. Вот что у меня есть

В файле 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');?>&amp;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
Комментарии

Просто проверяю, решена ли ваша проблема. Если моё решение помогло, пожалуйста, отметьте его как принятое. Если нет, дайте мне знать

Pieter Goosen Pieter Goosen
17 мар. 2014 г. 12:42:21
Все ответы на вопрос 3
1
14

После анализа вашей темы я пришел к следующим выводам. Я также включил решение Рубена, чтобы ответ был максимально полным.

Здесь есть несколько проблем:

Проблема 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 и выберите опцию создания каталога. Появится следующее окно

image1.

Заполните необходимые поля, как показано.

Теперь перейдите на вкладку "Sources paths" и заполните, как показано. Используйте . в поле "Paths", если ваш языковой файл находится в основной директории, и .., если языковой файл находится в папке, например, language

image2

Теперь перейдите на вкладку "Sources keywords" и заполните, как показано.

image3

Теперь сохраните файл 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"

Для дальнейшего чтения ознакомьтесь с этим руководством. Оно действительно помогло мне, когда я начинал работать с переводами. Надеюсь, это поможет.

12 мар. 2014 г. 17:24:27
Комментарии

В моем случае ключевым было следующее: Файлы с переводами всегда должны подключаться через хук after_setup_theme. Раньше я подключал их в init, но теперь это не работает.

Attila Fulop Attila Fulop
17 февр. 2016 г. 13:58:04
6

Не используйте 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 );
    }
10 мар. 2014 г. 17:25:07
Комментарии

Спасибо @Ruben. Я внес это изменение, но проблема осталась.

Steve Steve
11 мар. 2014 г. 04:18:18
  1. Убедитесь, что вы добавили этот код внутри фильтра after_setup_theme.

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

Ruben Bristian Ruben Bristian
11 мар. 2014 г. 09:16:10
  1. Я добавил приведенный выше код в функцию под названием transparent_theme_setup(), а затем вызвал add_action( 'after_setup_theme', 'transparent_theme_setup' );. Вы это имели в виду? 2. Плагин Codestyling показывает, что нет ошибок в .po/.mo файлах.
Steve Steve
12 мар. 2014 г. 07:44:27

@Steve, это верно.

Pieter Goosen Pieter Goosen
12 мар. 2014 г. 08:15:00

Хорошо. Проблема осталась после того, как я это сделал.

Steve Steve
13 мар. 2014 г. 09:22:12

Спасибо. Лучшие шаги для реализации i18n

Nephelococcygia Nephelococcygia
8 мар. 2022 г. 12:23:38
Показать остальные 1 комментариев
0

При использовании load_theme_textdomain имя вашего языкового файла должно точно соответствовать локали. Назовите его en_US.mo вместо transparent-en_US.mo

Внимательно ознакомьтесь с инструкциями по ссылке: https://codex.wordpress.org/Function_Reference/load_theme_textdomain

3 сент. 2015 г. 18:43:29