怎么给没有中文的WordPress插件/主题汉化
有的时候我们下载了一个好看的主题或者牛逼的插件,结果发现作者并没有给出中文翻译,这个时候我们就会很头疼,如果是仅后台的插件还好,要是前台里多出来一堆有的没有的英文你说糟不糟心?
有的时候,我们可以直接修改代码来完成翻译,但是更多时候你是找不到对应的代码的,而且有的时候直接改代码还会破坏CSS样式(比如我之前那个主题的搜索栏)。
好在WordPress采用的是标准的GNU gettext翻译实现,因此我们可以自己撰写并且编译相关的配置。
首先我们要在自己的电脑上安装GNU gettext utils,Linux可以直接拿对应的包管理器装(比如apt、yum这些),Windows请自行上网搜索。我们将会用到msginit和msgfmt这两个命令(虽然msginit其实可以不用)
打开要翻译的对应文件夹,比如我这里要翻译/wp-content/themes/period/这个主题。
可以看到,这个目录下有一个languages文件夹,我们点击打开。
这里面可以看到有三种文件:
- .pot文件,这个是空白的纯文本模版,一会我们要用到。
- .po文件,这个是已经翻译好的文件,还没有经过编译,依然是纯文本的格式。
- .mo文件,这个是编译好的文件,不是纯文本,最终我们要上传的就是这个格式的文件。
我们把.pot格式的文件下载下来,并且在同一个文件夹里输入:
msginit *.pot --locale=zh_CN.po
会先询问你的邮箱地址,然后就会生成一个zh_CN.po文件。当然你也可以直接
cp *.pot zh_CN.po
唯一的差别是这么搞最上方的配置不会自动修改,虽然自动修改的范围本来就极其有限。
下面让我们打开生成的文件看一看里面到底塞了些什么东西。开头是一堆配置,长这样:
# This file is distributed under the GNU General Public License v2 or later.
msgid ""
msgstr ""
"Project-Id-Version: "
"Report-Msgid-Bugs-To: "
"POT-Creation-Date: 2021-04-08 17:03:39+00:00\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2023-10-04 12:58+0000\n"
"Last-Translator: USER <EMAIL>\n"
"Language-Team: Language zh_CN\n"
"X-Generator: grunt-wp-i18n 0.4.9\n"
"Language: zh_CN\n"
为了防止被说打广告(虽然主题名早就出来了),这里我删掉了一些东西,但是结构没有变。
这里我们主要看最后几行,从“Last-Translator”开始一直到最后分别说明了最后一位翻译者的联系方式,翻译小组,框架名,以及语言。如果是用的msginit那么这里的东西是自动写好的,如果是手动复制的那么可能需要自己改一下,不过实际测试下了不影响编译的结果。
后续的内容都是需要翻译的内容,我们再来看看结构:
#: file.php:10
#. A simple example.
msgid "and"
msgstr ""
#: file1.php:10 file2.php:20 dir/file3.php:30
#. A complex example.
msgctxt "xxx results found for xxx"
msgid "%1$s result found for %2$s"
msgid_plural "%1$s results found for %2$s"
msgstr[0] ""
msgstr[1] ""
这里出现了两个例子,下面就来解释一下。
第一个例子里的东西是最最常见的,90%的翻译都是这么定义的:
- #:注释,不需要翻译。一般来讲“#: ”描述的是文件和文本的对应行数,“#. ”则是附加内容。
- msgid:英文原文,这是需要我们翻译的。
- msgstr:这是翻译的结果,我们翻译好往这个地方填就可以了。
第二个例子稍微复杂一点,但总体上大差不差:
- #:依然是注释,跟上面一样。
- msgctxt:依然是注释,但是这个注释的是你要翻译的内容是怎么出现的,在翻译的时候可以参考。
- msgid/msgid_plural:英文原文,其中带_plural的是复数形式。
- %/%s/%1$s…:占位符,对应原文中的动态内容,翻译的时候需要对应着填进去。
- msgstr[*]:翻译好的内容,后面的0对应单数形式,1对应复数形式。
在按照上面的指示全部翻译完成后,就可以开始编译了,使用下面这个命令:
msgfmt zh_CN.po -o zh_CN.mo
会生成一个zh_CN.mo文件,这时候我们只需要把这个文件上传到刚刚的languages文件夹里,翻译就完成啦!
刷新下页面就可以看到东西全部变成中文了。
当然,如果你的主题/插件没有用到.po/.mo的文件,说明作者本来就没有搞多语言支持,这种情况说明你比较倒霉(雾)当然从WordPress官方市场下下来的全部都是支持这么翻译的,毕竟这也是审核标准之一?
此外要说明的是,这么搞完之后你可能会在WordPress后台看到“有翻译更新”的提示,请直接忽略,不要手贱。
其实不用这么麻烦,litepress的文派有插件和主题的翻译版本都是人工翻译的,可以直接下载下来用的?
查了,有的是AI翻译,还是自己写比较放心(doge)
测试,md写的东西不好用?
好吧还是好用的,刚才有点小问题?