跳转至主要内容
晴雨技术笔记

怎么给没有中文的WordPress插件/主题汉化

杏川铭心 杏川铭心
发表于 2023年10月6日
  • 本文最后编辑于 859 天前,部分信息可能已严重过时,请注意甄别。
  • 有的时候我们下载了一个好看的主题或者牛逼的插件,结果发现作者并没有给出中文翻译,这个时候我们就会很头疼,如果是仅后台的插件还好,要是前台里多出来一堆有的没有的英文你说糟不糟心?

    有的时候,我们可以直接修改代码来完成翻译,但是更多时候你是找不到对应的代码的,而且有的时候直接改代码还会破坏CSS样式(比如我之前那个主题的搜索栏)。

    好在WordPress采用的是标准的GNU gettext翻译实现,因此我们可以自己撰写并且编译相关的配置。

    首先我们要在自己的电脑上安装GNU gettext utils,Linux可以直接拿对应的包管理器装(比如apt、yum这些),Windows请自行上网搜索。我们将会用到msginit和msgfmt这两个命令(虽然msginit其实可以不用)

    打开要翻译的对应文件夹,比如我这里要翻译/wp-content/themes/period/这个主题。

    /wp-content/themes/period/文件夹下内容
    (因为是拿手机写的所以大概看看就好)

    可以看到,这个目录下有一个languages文件夹,我们点击打开。

    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后台看到“有翻译更新”的提示,请直接忽略,不要手贱。

    • 特别提醒:

      评论看到就会回,但是不保证速度,有的时候站长忘记看的话就会出现审核好几天也没有动静的情况……

      有垃圾评论检查,如果评论之后直接消失、没反应说明被识别为垃圾评论了。

      如果等不及的话,可以加群!

    杏川铭心
    杏川铭心

    群号:1101838302,欢迎友好交流 :P 曾用名Frank419(现在也是我在很多地方的用户名),网站站长。

    分类:

    怎么给没有中文的WordPress插件/主题汉化」上有 4 条评论

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注