今天,我已经花了数小时来研究似乎很简单的事情,那就是为要创建的Wordpress主题创建.pot文件。我已经阅读了Smashing Magazine的文章,Tutsplus的文章以及其他一些关于如何使用Poedit创建主题的.pot文件,然后创建.mo和.po文件的文章,但可悲的是,我仍然停留在第一篇步骤。

我安装了Poedit,发现UI与所有教程中显示的UI完全不同,似乎不再有创建.pot文件的选项。唯一可以做的就是从现有的.pot文件中创建.po和.mo文件,这不是我现在需要的。

所以有人可以告诉我如何创建.pot文件吗?使用Poedit或其他方法,我将非常感激。

谢谢!

评论

尝试创建POT文件。

#1 楼

您可以尝试Eazy Po。


从文件菜单中选择“从源代码文件新建。”。
在xgettext命令管理器窗口中;按“浏览文件夹”选择基本源文件夹。
在“构建”窗格中,按“执行命令”按钮生成Pot文件。


评论


比POEdit更好,更轻松。干净的用户界面。默认情况下,关键字列表中具有所有i18n转换功能。谢谢。

–帕拉沙(Paras Shah)
'18 -10-1在5:21

在意识到POEdit的WordPress功能已付费后使用此功能。工作完美!

– Swen
18年11月30日在16:17

对我来说,工作也非常完美,也比poedit容易得多。

–Loc_rabbirt
20-4-17的7:53

#2 楼

这是在OS X上使用Poedit(免费版,版本1.6.10)为主题创建.pot文件的方法。

最佳做法是将语言文件保存在名为“ languages”的文件夹中在您的主题目录中。如果尚未创建,请在开始之前创建它。

在Poedit中:


在“文件”菜单中,选择“新建”
选择主题中使用的语言(可能是英语)
在“目录”菜单中,选择“属性”
在“翻译属性”选项卡中输入项目信息
转到第3个标签“来源关键字”
单击“新建项目”按钮(第二个按钮)并输入一个关键字,然后对每个关键字(___eesc_attr_e等)重复此操作。
单击底部的“确定”按钮
在“文件”菜单中,选择“另存为..”。
将文件另存为主题目录“语言”文件夹中的“ yourthemename.pot”。您将.pot扩展名添加到文件名中,因为默认情况下它将保存为.po。
在“目录”菜单中再次选择“属性”
转到第二个选项卡“源路径”
将“基本路径”的值设置为../(.pot文件保存在子目录中,因此您可以将基本设置为父目录,即您的主题目录)
在“路径”旁边,单击“新建项目”按钮,然后输入.(这将扫描主题目录及其子目录)
在“目录”上单击“确定”按钮底部
在项目窗口中,单击“更新”(顶部的第二个图标)。
在“文件”菜单中,单击“保存”。

您已经完成了:)

评论


这不适用于WordPress和翻译系统的特定更改。充其量是不完整的。

–奥托
16年1月30日在1:04

对于我的插件来说效果很好

– Pablo S G Pacheco
17年1月17日在15:12

它适用于插件,但不转换标题中的插件描述

–真棒桑迪
18-2-27在6:51

#3 楼

您可以在没有POEdit的情况下使用WordPress工具进行此操作。

首先,对http://develop.svn.wordpress.org/trunk/进行svn检出:

svn co http://develop.svn.wordpress.org/trunk/ wpdev

然后,切换到其中的i18n工具目录:

cd wpdev/tools/i18n/

然后只需在主题目录上运行makepot.php:

php makepot.php wp-theme /path/to/your/theme themename.pot

这将为您创建一个themename.pot文件。在您喜欢的任何标准翻译工具中使用它。

这更好,因为它使用WordPress代码查找i18n函数,因此您不会错过任何一个。另外,它将查找并添加诸如主题标头信息之类的内容,例如名称,描述等。这也允许翻译这些内容。确保在style.css中包含“文本域:”标头,以使其正常工作。

评论


这也适用于插件吗?

– Maruti Mohanty
2014年12月25日下午6:57

是的,只需使用“ wp-plugin”而不是“ wp-theme”,它将为插件生成一个POT文件。

–奥托
2014年12月25日12:39

不使用WordPress专用工具的所有其他方法都在某种程度上被破坏了。

–奥托
16年1月30日在1:03

很棒的工具!尽管即使我对目录进行chmod + x操作,它仍会抛出诸如“无法生成文件”之类的错误。

– Samuel Elh
16/12/22在13:14

为什么chmod + x有帮助?也许您应该尝试使目录可写而不是可执行文件。

–奥托
16 Dec 23'9:25

#4 楼

我发现现在最简单的方法是使用WP-CLI。导航到您的主题或插件并执行以下命令(在安装WP-CLI之后):

wp i18n make-pot . languages/my.pot


(请参阅命令的文档)

然后您可以使用Poedit或任何其他方便的翻译工具来编辑此文件。

评论


这应该是新接受的答案

–maysi
20-05-26在11:54

我必须在命令末尾添加--ignore-domain开关,以便将所有__(和朋友)添加到.pot文件中,因为插件中的文本域是动态生成的。这将添加插件头文件以及转换为.pot所需的字符串

–charlesdeb
20 Dec 31'的16:06

#5 楼

您可以将带有Loco Translate插件的外部工具全部删除。我大约一年前尝试过,从那以后再也没有使用过POEdit。一键将其安装在测试站点上,然后创建POT文件。

评论


这不适用于WordPress和翻译系统的特定更改。充其量是不完整的。

–奥托
16年1月30日,下午1:05

?这是一个WP插件。

–certainlyakey
17-10-16在8:31

#6 楼

对于任何想使用Poedit代替Easy Po的人。



下载(最新版本)Poedit并安装
转到文件>新建。将出现一个新标签,选择翻译语言,然后将(ctrl + s)保存到wordpress主题的根文件夹中。
在页面上,您将看到下一步,单击-“从源中提取”。接下来将看到的选项卡与您粘贴的链接中使用的选项卡相似。 “项目信息”现在是“翻译属性”,“路径”和“关键字”分别是“源路径”和“源关键字”


#7 楼

我有同样的问题,解决方法是在提取目录时在第一个选项卡中,应建议使用UTF8,在第三个选项卡的“ Sources keyword”中,单击“ New item”按钮(第二个按钮),然后输入一个关键字并重复每个关键字(__,_ e)的关键字。

#8 楼

正如Otto所说的那样:

对于Mac用户,我会做以下事情:


svn co http://develop.svn.wordpress.org/trunk/ wpdev安装后


所以...


在主题上添加/languages/目录
lang.command目录中创建类似/languages/的命令文件
lang.command内部

添加类似这样的代码。.

#!/bin/bash
cd $(dirname "q4312078q")
php /Users/YOUNAME/wpdev/tools/i18n/makepot.php wp-theme ../../mytheme mytheme.pot


PS:将正确的makepot.php路径和mytheme更改为主题名称

现在每次要创建一个新的.POT文件,您可以运行lang.command



#9 楼

脚本自动创建.po文件,自动添加代码中的所有文本

添加load_theme_textdomain('my-textdomain',DIR。'/ languages /');
创建文件夹wp-content /主题/ MY_THEME /语言(将您的语言.mo文件添加到此文件夹)
创建po.php并添加以下脚本:

 <?php /*Script by Sien.com.vn */
define('WP_USE_THEMES', true);

require(''.$_SERVER['DOCUMENT_ROOT'].'/wp-load.php' );

function title_p($title) {

$title='Po create';   

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">Error, Textdomain <b>'.$textdomain.'</b> not found!</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">Success</span> -> Saved to: '.__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>Language: <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">Not found 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="Create new.po file"/>
</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复制到语言文件夹

用作回显__('This text','you -textdomain');

#10 楼

为喜欢NPM的人们创建.pot文件的另一种替代解决方案是wp-pot。它带有许多选项,您可以根据自己的喜好进行调整。设置超级简单。

#11 楼

试试这篇文章:使用Poedit创建.pot或.po文件。它描述了工作流程,并指示.po和.pot文件相同。


默认情况下,Poedit将文件另存为.po文件,但是由于两个文件相同,因此您可以只需选择将.po文件另存为.pot文件即可解决此问题


评论


这不适用于WordPress和翻译系统的特定更改。充其量是不完整的。

–奥托
16年1月30日,下午1:05