如何(一步步)翻译WordPress插件

您为您的项目找到了完美的WordPress插件。它完全符合您的需求,评价极高,但当您激活它时,却发现所有按钮、标签和错误消息都是英文的。您的德语、法语或日语访客即将遇到一堵他们无法阅读的文字墙。
好消息是,大多数精心构建的插件都支持翻译,这意味着开发者特意将字符串包装在Gettext函数中,以便像您这样的人可以翻译它们。挑战在于了解文件在哪里,您的翻译应该如何命名,以及将其放置在何处才能避免下一次插件更新覆盖您的工作。
本指南将向您展示如何从头到尾翻译WordPress插件:查找文本域和语言文件夹,获取或生成.pot模板,构建正确命名的.po和.mo文件,并将它们放置在WordPress能够可靠加载的位置。我们还将介绍一种这种方法无法完全翻译的插件类型,以避免您在不可能的情况下浪费数小时。
如何查找插件的翻译文件?
在翻译任何内容之前,您需要从插件中获取两部分信息:它的文本域和语言文件夹。文本域是插件用于识别其自身翻译的唯一字符串,而语言文件夹是源模板所在的位置。
定位语言文件夹和文本域
打开插件目录wp-content/plugins/your-plugin/,寻找一个/languages子文件夹。在其中,您通常会找到一个.pot文件,它是包含所有可翻译字符串的空模板。
要确认文本域,请打开插件的主PHP文件并查看其头部块:
/**
* Plugin Name: Awesome Plugin
* Text Domain: awesome-plugin
* Domain Path: /languages
*/
这里的文本域是awesome-plugin。这个值至关重要,因为您的翻译文件名必须包含它,否则WordPress将无法将其与插件匹配。您还会在代码中的每个字符串调用中看到它:
echo __( 'Settings saved successfully.', 'awesome-plugin' );
第二个参数awesome-plugin再次是文本域。使用它的每个字符串都可以通过您的翻译目录进行翻译。如果插件界面中的某个字符串缺少此包装器,例如开发者硬编码echo 'Save'而没有使用__(),那么该字符串根本无法翻译,并且.po文件无法触及它。大多数知名插件都会正确包装所有内容,但如果您发现一两个顽固的字符串拒绝翻译,那么源代码中缺少Gettext包装器很可能是罪魁祸首。
衡量插件是否真正支持翻译的一个快速方法是查看其在WordPress.org目录中的列表,该列表会显示翻译百分比并链接到/languages模板。一个拥有活跃翻译项目的插件比一个已被放弃的插件更有可能拥有清晰、完全包装的字符串。
如果插件没有POT文件怎么办?
有些插件没有附带.pot模板。如果/languages文件夹为空或缺失,您需要通过扫描源代码中的可翻译字符串来自己生成模板。
解决此问题的标准工具是WP-CLI,它将每个Gettext调用提取到一个全新的.pot文件中。
wp i18n make-pot wp-content/plugins/awesome-plugin \
wp-content/plugins/awesome-plugin/languages/awesome-plugin.pot
此命令会遍历插件的PHP和JavaScript文件,找到每个__()、_e()、_n()及相关调用,并写入一个完整的模板。如果您更喜欢图形化方式,Poedit Pro也可以以相同的方式扫描源代码。无论哪种方式,结果都是一个包含所有源字符串和空翻译的.pot文件,准备好转换成真正的语言文件。
生成自己的模板有一个潜在好处:它可以捕获原始开发者可能忘记包含在随附.pot文件中的字符串。插件发展迅速,随2.1版本发布的模板可能缺少2.4版本中添加的字符串。从当前源代码重新生成可以确保您的翻译目录反映插件今天实际显示的内容,而不是两个版本前显示的内容。如果您长期维护插件的翻译,那么在每次重大更新后重新运行make-pot是一个可靠的习惯。
使用正确名称创建PO和MO文件
翻译插件时最常见的错误是文件名。WordPress通过匹配非常特定的模式来查找插件翻译,一个错误的字符意味着您的翻译将被完全忽略。
文件命名公式
对于插件翻译,模式是text-domain-locale。因此,对于翻译成德语的awesome-plugin文本域,文件必须命名为:
awesome-plugin-de_DE.po
awesome-plugin-de_DE.mo
区域设置代码是WordPress站点语言代码:de_DE代表德语,fr_FR代表法语,es_ES代表西班牙语,pt_BR代表巴西葡萄牙语。如果区域设置错误,WordPress会静默跳过您的文件。您可以使用像Poedit这样的编辑器从.pot模板创建这些文件,Poedit会在您保存时自动编译二进制的.mo文件。如果您是该编辑器的新手,Poedit完整指南会一步步指导您如何从模板创建翻译。
将文件放置在哪里以避免更新擦除它们
有两个可能的位置,选择正确的位置很重要。
# RISKY: inside the plugin — wiped on every plugin update
wp-content/plugins/awesome-plugin/languages/awesome-plugin-de_DE.mo
# SAFE: the global languages override folder — survives updates
wp-content/languages/plugins/awesome-plugin-de_DE.mo
始终使用wp-content/languages/plugins/。WordPress会首先检查这个覆盖目录,而且因为它位于插件文件夹之外,所以更新插件绝不会触及您的翻译。放置在插件自身文件夹内的文件会在安装新版本时立即被覆盖。
这种覆盖行为是WordPress本地化中最有用但鲜为人知的功能之一。这意味着您可以为任何第三方插件发布自定义或更正的翻译,而无需分叉它,并且您的更改完全是更新安全的。如果您管理多个运行相同插件的客户端站点,您甚至可以保留一组覆盖.mo文件并将它们部署到所有站点,只要区域设置匹配,每个站点都会自动识别它们。
WordPress如何加载您的翻译
一个支持翻译的插件通过在初始化期间调用load_plugin_textdomain()来告诉WordPress加载其翻译目录:
add_action( 'init', function() {
load_plugin_textdomain(
'awesome-plugin',
false,
dirname( plugin_basename( __FILE__ ) ) . '/languages'
);
} );
对于WordPress 4.6及更高版本上的大多数现代插件,您无需触及此功能。只要您的文件名和站点区域设置匹配,WordPress就会自动从wp-content/languages/plugins/加载翻译。如果您的最终翻译仍然没有出现,原因几乎总是文件名不匹配、过时的.mo文件,或者站点语言设置了错误的区域设置。我们的翻译不显示故障排除指南详细介绍了所有这些故障点。
将字符串存储在数据库中的插件
这里有一个重要的限制。Gettext方法只翻译插件代码中的字符串。有些插件,特别是表单构建器、页面构建器和电子商务扩展,允许您创建保存在WordPress数据库中的内容(表单标签、产品属性、自定义消息)。这些字符串是用户生成的数据,不属于.pot文件,因此.po文件无法触及它们。对于数据库内容,您需要一个多语言插件,如WPML或Polylang,或者插件自身的字符串翻译功能。在假设.po文件可以修复某个字符串之前,请务必测试该字符串是存在于代码中还是数据库中。
一个简单的测试可以告诉您正在处理哪种字符串。如果文本是您输入到设置字段中的内容、您创建的表单标签、自定义感谢消息、产品名称,那么它是数据库内容,.po文件无法触及。如果文本是插件内置界面的一部分,例如按钮标签、验证错误、插件自带的后台通知,那么它存在于代码中,.po文件正是正确的工具。尽早划清这条界限可以节省数小时的挫败感,因为再完美的.po编辑也无法翻译插件在运行时从数据库中提取的字符串。
无需手动操作,实现大规模翻译
手动将一个插件翻译成一种语言是可以管理的。但将其翻译成十种语言,或者为一个客户网站翻译一整套插件,将变成数天的重复工作,而且每次手动编辑都存在弄错%s或%1$s等占位符并破坏输出的风险。
这就是云工作流改变计算方式的地方。将插件的.po或.pot文件上传到SimplePoTranslate,选择您的目标语言,上下文感知AI会翻译整个目录,同时语法锁定会冻结所有占位符、HTML标签和代码标记,以确保没有任何内容会被破坏。智能批处理可在一次操作中处理大型目录,您可以下载一个包含.po、.mo、.json、.php和.xliff的ZIP文件,它们格式正确,可以直接放入wp-content/languages/plugins/。它完全在云端运行,因此无需桌面安装,也不会增加您网站的负担。
请注意,翻译插件与翻译主题不同,后者使用略有不同的文件夹约定和加载函数。如果您的目标是主题,请改为遵循我们关于如何本地化任何WordPress主题,即使您不是开发者的专门指南。
当您只有一个插件和一种语言时,请使用手动路径。当您需要多种语言,且需要快速翻译,同时又不牺牲占位符安全时,请使用云端解决方案。
准备好将您的WordPress插件翻译成您的受众所说的每种语言,而不会破坏任何变量吗? 免费试用SimplePoTranslate ——无需信用卡。免费套餐可让您在几分钟内翻译您的第一个插件
.po文件,并对每个字符串应用语法锁定。