Как создать .pot файлы с помощью POedit?
Я потратил сегодня несколько часов на то, что казалось действительно простым - создание .pot файла для WordPress темы, которую я разрабатываю. Я прочитал статью в Smashing Magazine, статью на Tutsplus и несколько других о том, как использовать Poedit для создания .pot файлов темы, а затем создания .mo и .po файлов, но, к сожалению, я всё ещё застрял на первом шаге.
Я установил Poedit и обнаружил, что интерфейс полностью отличается от того, что показано во всех уроках, и похоже, что больше нет опции создания .pot файла. Единственное, что доступно - это создание .po и .mo файлов из существующего .pot файла, что не то, что мне сейчас нужно.
Поэтому, не могли бы вы подсказать, как я могу создавать .pot файлы, используя Poedit или какой-либо другой метод, я был бы очень признателен.
Спасибо!

Я обнаружил, что сейчас самый простой способ — это использовать WP-CLI. Перейдите в папку вашей темы или плагина и выполните следующую команду (после установки WP-CLI):
wp i18n make-pot . languages/my.pot
(Смотрите документацию этой команды)
Затем вы можете редактировать этот файл с помощью Poedit или любого другого удобного инструмента для перевода.

Мне пришлось добавить параметр --ignore-domain
в конец команды, чтобы все __
(и аналогичные функции) были добавлены в файл .pot
, так как текстовый домен в моем плагине генерируется динамически. Это добавляет в .pot
как информацию из заголовка плагина, так и строки, необходимые для перевода.

Это самый простой, лучший и бесплатный способ генерации .pot файла. Этот ответ должен быть на первом месте.

Вот как вы можете создать файл .pot для вашей темы с помощью Poedit (бесплатная версия 1.6.10) на OS X.
Лучшей практикой является сохранение языковых файлов в папке с названием "languages" в директории вашей темы. Если у вас ее еще нет, создайте ее перед началом.
В Poedit:
- В меню "File" выберите "New"
- Выберите язык, который вы использовали в вашей теме (скорее всего, английский)
- В меню "Catalog" выберите "Properties"
- Введите информацию о проекте во вкладке "Translation properties"
- Перейдите на 3-ю вкладку "Sources keywords"
- Нажмите на кнопку "New item" (2-я кнопка) и введите ключевое слово, повторите для каждого из ваших ключевых слов (
__
,_e
,esc_attr_e
и т.д.) - Нажмите кнопку "OK" внизу
- В меню "File" выберите "Save As.."
- Сохраните файл как "yourthemename.pot" в папке "languages" вашей темы (убедитесь, что добавили расширение .pot к имени файла, так как по умолчанию он сохраняется как .po)
- В меню "Catalog" снова выберите "Properties"
- Перейдите на 2-ю вкладку "Sources paths"
- Установите значение для "Base path" как
../
(файл .pot сохранен в поддиректории, поэтому таким образом вы устанавливаете базовый путь на родительскую директорию, то есть директорию вашей темы) - Рядом с "Path" нажмите кнопку "New item" и введите
.
(это позволит сканировать директорию вашей темы и ее поддиректории) - Нажмите кнопку "OK" внизу
- В окне проекта нажмите "Update" (2-я иконка сверху)
- В меню "File" нажмите "Save"
Готово :)

Это не работает для WordPress и специфических изменений в системе перевода. В лучшем случае это неполное решение.

Работает для плагина, но не переводит описание плагина из заголовка

Вы можете сделать это с помощью инструментов WordPress, без использования POEdit.
Сначала выполните svn checkout репозитория http://develop.svn.wordpress.org/trunk/:
svn co http://develop.svn.wordpress.org/trunk/ wpdev
Затем перейдите в директорию инструментов интернационализации (i18n):
cd wpdev/tools/i18n/
После этого просто запустите makepot.php для директории вашей темы:
php makepot.php wp-theme /путь/к/вашей/теме название_темы.pot
Это создаст файл название_темы.pot. Вы можете использовать его в любом стандартном инструменте для перевода.
Этот способ лучше, потому что он использует код WordPress для поиска функций интернационализации (i18n), поэтому вы не пропустите ни одной из них. Кроме того, он найдет и добавит такую информацию, как заголовки темы (название, описание и т.д.), что позволяет переводить и их тоже. Убедитесь, что вы включили заголовок "Text Domain:" в ваш style.css, чтобы это работало.

Да, просто используйте "wp-plugin" вместо "wp-theme", и это сгенерирует POT-файл для плагина.

Любой другой метод, который не использует специальные инструменты WordPress, в чем-то неработоспособен.

Отличные инструменты! Хотя постоянно вылетали ошибки типа "Не удалось создать файл", несмотря на то, что я сделал chmod +x
для директорий..

Почему chmod +x должен помочь? Возможно, стоит сделать директорию доступной для записи, а не исполняемой.

Спасибо, Otto, я не получил уведомления об этом, но теперь я на Ubuntu, и всё работает просто отлично!

Выполнил те же шаги, перевел все, но не смог перевести описание плагина в заголовочной секции плагина.

Вы можете попробовать Eazy Po.
- В меню "Файл" выберите "Создать из файлов исходного кода...".
- В окне "Менеджер команд xgettext" нажмите "Обзор папки", чтобы выбрать основную папку с исходным кодом.
- На панели "Сборка" нажмите кнопку "Выполнить команду" для создания POT-файла.

Намного лучше и проще, чем POEdit. Чистый интерфейс. Все функции перевода i18n уже включены в список ключевых слов по умолчанию. Спасибо.

Начал использовать этот плагин, когда узнал, что функции POEdit для WordPress платные. Работает идеально!

У меня тоже сработало идеально, и это гораздо проще, намного проще, чем poedit.

Вы можете полностью отказаться от внешних инструментов с помощью плагина Loco Translate. Я попробовал его около года назад и больше не использовал POEdit. Установите его на тестовом сайте и создайте POT-файл одним кликом.

Для тех, кто предпочитает использовать Poedit вместо Easy Po.
- Скачайте (последнюю версию) Poedit и установите
Перейдите в Файл>Создать. Появится новая вкладка, выберите язык перевода и сохраните (ctrl + s) в корневую папку вашей темы WordPress.
На следующей странице нажмите на - "Извлечь из исходников". Вкладка, которую вы увидите, похожа на те, что приведены в ссылках выше. "Информация о проекте" теперь называется "Свойства перевода", аналогично "Пути" и "Ключевые слова" теперь называются "Пути исходников" и "Ключевые слова исходников".

У меня такая же проблема, решение находится на первой вкладке при извлечении каталога - нужно выбрать UTF8 (рекомендуется), а на 3-й вкладке "Источники ключевых слов" нажать кнопку "Новый элемент" (вторая кнопка) и ввести ключевое слово, повторя это для каждого из ваших ключевых слов (__, _e).

Как сказал Отто:
Для пользователей Mac я бы сделал следующее:
- После установки через
svn co http://develop.svn.wordpress.org/trunk/ wpdev
Итак...
- Создайте папку
/languages/
в вашей теме - Создайте командный файл, например
lang.command
, в этой папке/languages/
- Внутри файла
lang.command
добавьте код примерно такого содержания:
#!/bin/bash
cd $(dirname "$0")
php /Users/ВАШЕИМЯ/wpdev/tools/i18n/makepot.php wp-theme ../../mytheme mytheme.pot
Примечание: Замените путь к makepot.php и имя темы mytheme на свои значения.
Теперь, когда вам нужно создать новый файл .POT, просто запустите lang.command.

Ещё одно альтернативное решение для создания .pot файлов для тех, кто предпочитает NPM — это wp-pot. Оно предоставляет множество настроек, которые можно адаптировать под свои нужды. Очень просто в настройке.

Попробуйте эту статью: Создание .pot или .po файлов с помощью Poedit. В ней описан рабочий процесс и указано, что файлы .po и .pot одинаковы.
По умолчанию Poedit сохраняет файл как .po, но поскольку эти два файла идентичны, вы можете просто сохранить .po файл как .pot

Скрипт для автоматического создания .po файла, собирает все тексты из вашего кода
- Добавьте load_theme_textdomain('my-textdomain',DIR.'/languages/');
- Создайте папку wp-content/themes/MY_THEME/languages (поместите ваш языковой .mo файл в эту папку)
- Создайте файл po.php и добавьте этот скрипт:
<?php /*Скрипт от Sien.com.vn */
define('WP_USE_THEMES', true);
require(''.$_SERVER['DOCUMENT_ROOT'].'/wp-load.php' );
function title_p($title) {
$title='Создание PO файла';
return $title;}
add_filter( 'pre_get_document_title', 'title_p' );
$robots_p='noindex,nofollow';
get_header();
echo '<div id="content" class="col col-100">';
if(current_user_can('manage_options')){
function write_txt($path,$content,$type){
$file=fopen($path,$type) or die();
fwrite($file,$content);
fclose($file);
return TRUE;
}
if(isset($_POST['lang'])){
$lang_code=pathinfo($_POST['lang'],PATHINFO_FILENAME);
load_textdomain('this_lang',__DIR__.'/'.$lang_code.'.mo');
$textdomain=$_POST['textdomain'];
$txt='';
function sfile($dir, $ext) {
global $textdomain;
$globFiles = glob("$dir".DIRECTORY_SEPARATOR."*.$ext");
$globDirs = glob("$dir/*", GLOB_ONLYDIR);
foreach ($globDirs as $dir) {
sfile($dir, $ext);
}
foreach ($globFiles as $file=>$path) {
$txt.=file_get_contents($path,FILE_USE_INCLUDE_PATH);
}
preg_match_all('/__\(\'(.+?)\',\''.$textdomain.'\'\)/',$txt,$output);
$arr=array();
foreach(array_unique($output[1]) as $v){
if(isset($v)){
write_txt(''.__DIR__.'/po.dat',''.$v.'**$!3|\\/**','a+');
}
}
}
sfile(get_template_directory(),'php');
$get=file_get_contents(''.__DIR__.'/po.dat');
$k=explode('**$!3|\\/**',$get);
foreach(array_unique($k) as $v){
if(!empty($v)){
if($v==__($v,'this_lang')){
write_txt(''.__DIR__.'/po.dat.empty','
msgid "'.$v.'"
msgstr ""
','a+');
}else{
write_txt(''.__DIR__.'/po.dat.isset','
msgid "'.$v.'"
msgstr "'.__($v,'this_lang').'"
','a+');
}
}
}
if(empty(file_get_contents(''.__DIR__.'/po.dat.isset')) && empty(file_get_contents(''.__DIR__.'/po.dat.empty'))){
echo '<div class="error">Ошибка, Textdomain <b>'.$textdomain.'</b> не найден!</div>';
}else{
write_txt(''.__DIR__.'/'.$lang_code.'.po','# '.$lang_code.' LANG
msgid ""
msgstr ""
"PO-Revision-Date: 2017-11-23 22:26+0700\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 2.0.4\n"
"Language: vi_VN\n"
"Project-Id-Version: Sien\n"
"POT-Creation-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
'.file_get_contents(''.__DIR__.'/po.dat.isset').'
'.file_get_contents(''.__DIR__.'/po.dat.empty').'
','w+');
echo '<div class="success"><span style="color:blue">Успешно</span> -> Сохранено в: '.__DIR__.'/ <b>'.$lang_code.'.po</b></div>';
unlink(''.__DIR__.'/po.dat');
unlink(''.__DIR__.'/po.dat.isset');
unlink(''.__DIR__.'/po.dat.empty');
}
}
echo '<form action="" method="POST">
<div class="menu bd text-center"><p>Язык: <select name="lang">';
foreach(glob("".__DIR__."/*.mo") as $path) {echo '<option value="'.$path.'">'.pathinfo($path,PATHINFO_FILENAME).'</option>';}
echo '</select></p>';
$txt='';
function stext($dir, $ext) {
$globFiles = glob("$dir".DIRECTORY_SEPARATOR."*.$ext");
$globDirs = glob("$dir/*", GLOB_ONLYDIR);
foreach ($globDirs as $dir) {stext($dir, $ext);}
foreach ($globFiles as $file=>$path) {
if($path!=__FILE__){
$txt.=(str_replace(' ','',file_get_contents($path,FILE_USE_INCLUDE_PATH)));
}
}
preg_match_all('/load_theme_textdomain\((\'|\")(.+?)(\'|\")/',$txt,$gtextdomain);
$td='';
foreach($gtextdomain[2] as $text){
if(!empty($text)){
$td.='<option value="'.$text.'">'.$text.'</option>';
}
}
write_txt(__DIR__.'/textdomain.dat',$td,'a+');
}
stext(get_template_directory(),'php');
$textdomain=file_get_contents(__DIR__.'/textdomain.dat');
if(empty($textdomain)){echo '<div class="error">Не найден textdomain [ <b>load_theme_textdomain ("you-textdomain","path_to_language_folder");</b> ]</div>';}else{
echo '<p>Textdomain: <select name="textdomain">'.$textdomain.'</select></p>';
}
echo '<p>
<input type="submit" value="Создать новый .po файл"/>
</p>
</div>
</form>';
unlink(__DIR__.'/textdomain.dat');
}
echo '</div>';
get_footer();
- Перейдите по адресу youdomain/wp-content/themes/MY_THEME/languages/po.php и создайте .po файл
- Скопируйте wp-content/themes/MY_THEME/languages/[LANG].po на рабочий стол и откройте в Poedit -> Скомпилируйте MO -> скопируйте [LANG].mo обратно в папку languages
Используйте как echo __('Этот текст','you-textdomain');
