要实现WordPress主题和插件的本地化翻译就需要了解什么是国际化和本地化以及WordPress是如何实现国际化和本地化的。
什么是国际化?
国际化是为软件(在本例中为 WordPress)提供多语言支持的过程。国际化通常缩写为 i18n,其中 18 代表第一个 i 和最后一个 n 之间的字母数。
为您的插件和主题提供 i18n 支持可以使其覆盖尽可能多的受众,即使不需要您提供额外的语言翻译。当您将软件上传到 WordPress.org 时,所有 JS 和 PHP 文件都将自动解析。任何检测到的翻译字符串都会添加到 translate.wordpress.org 中,以允许社区进行翻译,确保 WordPress 插件和主题以尽可能多的语言提供。
对于 PHP,WordPress 有一个由来已久的流程,请参阅如何国际化您的插件。WordPress 5.0 的发布带来了类似的 JavaScript 代码翻译过程。
如何国际化你的插件
为了使字符串在应用程序中可翻译,必须将原始字符串包装在对一组特殊函数之一的调用中。这些函数统称为“gettext”。
什么是本地化?
本地化描述了翻译国际化插件的后续过程。本地化通常缩写为(因为 l 和 n 之间有 10 个字母。l10n
本地化文件
POT(可移植对象模板)文件
此文件包含插件中的原始字符串(英文)。
PO (Portable Object)文件
每个翻译人员都会获取文件并将各个部分翻译成他们自己的语言。结果是一个与 格式相同的文件,但带有翻译和一些特定的标头。每种语言都有一个文件。POT
msgstr
PO
POT
PO
MO (Machine Object)文件
从每个翻译的文件中构建一个文件。这些是 gettext 函数实际使用的机器可读的二进制文件(它们不关心 OR 文件),并且是文件的“编译”版本。转换是使用命令行工具完成的。通常,应用程序可能会相应地使用多个大型逻辑可翻译模块和不同的文件。
以上内容来源于WordPress开发人员资源库,有需要的朋友可以去进行深入的解析和理解。对于新入门的朋友来说可能有些不太好理解,总的来说所谓的国际化就是通过(一系列)函数将文字(字符串、变量、单复数等)标记为可以被翻译的形式,那么相应的本地化就是将已经标记的文字翻译成某种语言。国际化是主题或插件的开发者需要考虑的问题,想要把主题和软件翻译成大美的中文就只需要了解如何本地化即可。
对于如何实现WordPress国际化以及Gettext函数的使用方法可以参考《如何国际化你的插件》
如何实现本地化
本文将着重解释如何实现本地化。
举个例子,当你打开了一个已经完成国际化的主题或者插件的源代码是你应该会看到很多类似
__( 'Blog Options', 'my-plugin' ); 这样的代码。函数的格式:__('文本域',"路径域");其中文本域表示可以被翻译的文本也就是前端将会显示的内容,域路径定义插件翻译的位置。
结合之前所说的.pot为模板.po为可以编辑的翻译文件.mo为编译后的翻译文件,简单理解为,当WordPress看到了__( 'Blog Options', 'my-plugin' );这样一条语句时会在众多的.mo文件中通过my-plugin来进行匹配,当匹配到的mo文件中如果包含了Blog Options的翻译条目时就会把Blog Options替换成翻译后的文本并输出到页面上。
这样是不是就很好理解了呢?那么接下来就看看怎么创建和编辑翻译文件。
当你下载了一个以及国际化的主题或插件,你应该可以找到languages或lang目录,而里面大概率会躺着一个.pot文件或很多.po文件;其他都不重要我们只需要.pot的模板文件,有了翻译模板文件就可以使用Poedit等软件创建对应语言的po文件进行编辑并生成mo文件供WordPress使用了。
解读po翻译文件
如果没有pot文件可以参考本文接下来讲到的如何创建pot模板文件。
接下来展示一个po文件的示例:
# Copyright (C) 2023
# This file is distributed under the GPLv2.
msgid ""
msgstr ""
"Project-Id-Version: Smush Pro 3.14.0\n"
"Report-Msgid-Bugs-To: https://wpmudev.com\n"
"POT-Creation-Date: 2023-07-21 12:47+0800\n"
"PO-Revision-Date: 2023-08-15 15:14+0800\n"
"Last-Translator: cnuu <admin@cnuu.net>\n"
"Language-Team: \n"
"Language: zh_CN\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 3.3.2\n"
"X-Domain: wp-smushit\n"
#. Plugin Name of the plugin
#: app/class-admin.php:285 app/class-admin.php:324
#: app/pages/class-dashboard.php:110 app/pages/class-dashboard.php:353
#: app/views/directory/meta-box.php:43 core/modules/bulk/class-mail.php:65
msgid "Smush Pro"
msgstr "Smush 专业版"
这段代码是一个.pot文件的内容,用于国际化。下面是每一行的解释:
"Project-Id-Version: Smush Pro 3.14.0\n"
: 定义项目的版本号。
"Report-Msgid-Bugs-To: https://wpmudev.com\n"
: 提供报告消息ID和bug的URL。"POT-Creation-Date: 2023-07-21 12:47+0800\n"
: 创建此模板的日期和时间。"PO-Revision-Date: 2023-08-15 15:14+0800\n"
: 上次修订此模板的日期和时间。"Last-Translator: cnuu <admin@cnuu.net>\n"
: 最后翻译此模板的人的名字和电子邮件地址。"Language-Team: \n"
: 语言团队的名称或标识,通常用于指定负责特定语言的翻译团队。"Language: zh_CN\n"
: 指定此模板的语言版本,这里是简体中文。"MIME-Version: 1.0\n"
: MIME版本号。"Content-Type: text/plain; charset=UTF-8\n"
: 内容类型和字符集,这里是纯文本和UTF-8字符集。"Content-Transfer-Encoding: 8bit\n"
: 内容传输编码方式,这里是8位编码。"Plural-Forms: nplurals=1; plural=0;\n"
: 定义复数形式的规则。这里表示该语言只有一种复数形式。"X-Generator: Poedit 3.3.2\n"
: 用于生成此模板的工具的名称和版本号。"X-Domain: wp-smushit\n"
: 指定与这个模板相关的域名或项目名称,这里是wp-smushit插件。然后是双引号包围的字符串,这些是消息ID和对应的原始字符串(
msgid
)以及翻译后的字符串(msgstr
)。例如:msgid "Smush Pro"
表示原始字符串是 "Smush Pro"。
msgstr "Smush 专业版"
表示翻译后的字符串是 "Smush 专业版"。其中,
#: app/class-admin.php:285 app/class-admin.php:324
等行表示这些字符串在哪些源代码文件中出现,以及它们在文件中的具体位置。这对于翻译者来说非常有用,因为他们可以知道这些字符串在哪里使用,以便更好地进行翻译。如果你理解了上面的内容那么不需要借助其他软件也可以手动创建.po文件了。
文件的命名规则:
例如wp-plugin-name-zh_CN.po
不用说,文件名必须是中文,单词间用-分隔连接,最后zh_CN代表使用ISO 639-1标准规定的语言代码,例如:
- en_US(英语)
- zh_CN(简体中文)
- fr_FR(法语)
- de_DE(德语)
- es_ES(西班牙语)
编辑完成后创建的对应.mo文件应放置在主题或插件目录下的languages文件夹内或者wp-content/languages/对应目录下,不同作者写的方法肯定也不一样,区别对待。
有了以上的知识储备本地化翻译已经不再深奥,相信阅读到这里你已经迫不及待跃跃欲试了,别急,下面的内容可能是你在其他地方找寻不到的实用经验总结。
有可能你会遇到这样的问题,一段文字已经在翻译文件中添加了并且翻译都已生效就是某一部分仍旧无法翻译。
这时候你需要找出这段文字在源代码中出现的位置,确定这段文字(文本)是否已经进行了国际化定义,也就是之前提到的函数__('文本域',"路径域");,并且路径域是否和你的翻译文件匹配。
如果没有定义函数那么你可以手动修改源代码添加定义函数,你需要了解函数的实用方法以及__()_e()_x()_ex()_n()_nx()等不同函数的区别和用法。如果路径域和你的翻译文件不匹配你也可以修改路径域或者创建一个对应路径域的翻译文件。
还有一种可能就是这段文字最终确定是由JS文件输出的。
如何在 WordPress中翻译JavaScript 中的内容
WordPress 5.0 引入了 wp-i18n JavaScript 包,它提供了添加可翻译字符串所需的功能,就像在 PHP 中一样。原文链接
简单来说,一般情况下由PHP文件输出的文本内容可以直接由mo文件进行翻译,而由JS文件输出的文本内容则需要生成对应的JSON文件才能翻译。
要生成JSON翻译文件可以使用WP-CLI
安装WP-CLI
WP-CLI 是 WordPress 的命令行界面。该项目的目标是为 WordPress 管理员提供一个完整的替代方案;对于您可能想在 WordPress 管理中执行的任何操作,都应该有一个等效的 WP-CLI 命令。
安装 WP-CLI 的推荐方法是下载 Phar 构建(类似于 Java JAR 文件的存档,有关详细信息,请参阅本文),将其标记为可执行文件,并将其放在 PATH 上。
在安装 WP-CLI 之前,请确保您的环境满足最低要求:
- 类 UNIX 环境(OS X、Linux、FreeBSD、Cygwin);Windows 环境中的有限支持
- PHP 5.6 或更高版本
- WordPress 3.7 或更高版本。早于最新 WordPress 版本的版本可能功能降级
验证要求后,使用 或 下载 wp-cli.phar 文件:
wgetcurl
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
接下来,检查 Phar 文件以验证它是否正常工作:
php wp-cli.phar --info
要从命令行使用 WP-CLI,请键入 ,使文件可执行并将其移动到 PATH 中的某个位置。例如:
wp
chmod +x wp-cli.phar sudo mv wp-cli.phar /usr/local/bin/wp
如果WP-CLI安装成功,则在运行时应看到如下内容:
wp --info
$ wp --info OS: Linux 5.10.60.1-microsoft-standard-WSL2 #1 SMP Wed Aug 25 23:20:18 UTC 2021 x86_64 Shell: /usr/bin/zsh PHP binary: /usr/bin/php8.1 PHP version: 8.1.0 php.ini used: /etc/php/8.1/cli/php.ini MySQL binary: /usr/bin/mysql MySQL version: mysql Ver 8.0.27-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu)) SQL modes: WP-CLI root dir: /home/wp-cli/ WP-CLI vendor dir: /home/wp-cli/vendor WP_CLI phar path: WP-CLI packages dir: /home/wp-cli/.wp-cli/packages/ WP-CLI global config: WP-CLI project config: /home/wp-cli/wp-cli.yml WP-CLI version: 2.9.0
在Windows上安装wp-cli
先安装php然后将php.exe所在的目录添加到系统环境变量Path
然后下载wp-cli.phar放置到指定目录例如我的目录为D:\Tools\wp-cli
在D:\Tools\wp-cli目录下创建wp.bat
输入:
@ECHO OFF php "D:/Tools/wp-cli/wp-cli.phar" %*
最后在环境变量Path中添加D:\Tools\wp-cli\
更新
您可以使用 (doc) 或重复安装步骤来更新 WP-CLI。
wp cli update
如果 WP-CLI 归 root 或其他系统用户所有,则需要运行 .
sudo wp cli update
WP-CLI生成JSON翻译文件
wp i18n make-json <po-file-name>.po --no-purge
其中
<po-file-name>.po
为已经编辑好的po文件。此命令将生成数个类似plugin-name-zh_CN-[md5].json
md5值不可修改,将生成的json文件放置到对应的目录下即可实现对js输出的文本内容的翻译了。
WP-CLI生成POT翻译模板
- 运行以下命令来生成POT文件:
wp i18n make-pot <pot-file-name>.pot <plugin-or-theme-directory>
在上述命令中,将
<pot-file-name>
替换为你想要生成的POT文件的名称,例如myplugin
。将<plugin-or-theme-directory>
替换为你想要提取翻译字符串的插件或主题的目录路径。
2. 执行命令后,WP-CLI将自动扫描你指定的插件或主题目录中的翻译字符串,并将它们提取到指定的POT文件中。
3. 你将得到一个名为<pot-file-name>.pot
的文件,其中包含你的WordPress插件或主题的翻译字符串。你可以使用任何文本编辑器打开该文件进行查看和编辑。wp-cli的安装和使用可访问https://wp-cli.org/进行深度的了解和学习。
本文是作者[@avenjan](https://www.cnuu.net/)对WordPress本地化翻译的一些心得和总结,分享给想要了解此部分知识和技能的朋友,部分内容可能不是十分准确和专业,但也希望能给有需要的朋友带来一些执导和帮助。如有疑问和意见欢迎评论区讨论,感谢关注!