功能插件定价资源
更改语言
资源如何编译 .po 文件到 .mo 文件 (4 种方法)

如何编译 .po 文件到 .mo 文件 (4 种方法)

SimplePoTranslate Team2026年5月3日
如何编译 .po 文件到 .mo 文件 (4 种方法)

您花了一个下午的时间来完善德语翻译。您的 de_DE.po 文件中的每个字符串都翻译得很好,占位符完整无缺,复数形式正确。您将其上传到您的网站,将语言切换为德语,然后……什么都没有。页面仍然是英文的。您仔细检查了文件名、文件夹和文本域。一切看起来都正确。那么为什么 WordPress 不显示您的翻译呢?

十有八九答案都是一样的:您编辑了 .po 文件但从未将其编译成 .mo 文件。WordPress 在运行时不读取 .po 文件——它加载已编译的二进制 .mo 文件。如果您希望您的翻译实际显示,每次更改文本时都需要将 po 编译成 mo.po 是您的可编辑源文件;.mo 是网站提供的内容。

本指南将解释为什么需要这个编译步骤,然后介绍四种可靠的方法:WP-CLI、经典的 msgfmt 命令、Poedit 以及一个自动为您生成 .mo 文件的云工具。我们还将涵盖最常见的陷阱——忘记重新编译——以及 WordPress 现在为了提高速度而首选的较新的 .l10n.php 格式。

为什么 WordPress 加载 .mo 而不是 .po?

WordPress 加载 .mo 文件是因为它们是经过编译的二进制文件,已针对快速查找进行了优化,而 .po 文件是为人类阅读和编辑而构建的纯文本文件。在每次页面加载时解析文本会很慢;读取预构建的二进制哈希表几乎是即时的。

.po 文件是基于行的,对人类友好。每个条目都将源 msgid 与翻译的 msgstr 配对,并附带注释说明字符串的来源。这对于编辑来说很棒,但对于性能来说却很糟糕——服务器必须在每次请求时重新解析整个文本文件。

#: includes/cart.php:88
msgid "Your cart is empty"
msgstr "Ihr Warenkorb ist leer"

.mo 文件将相同的字符串对打包成带有内部查找表的二进制格式,因此 WordPress 可以直接跳转到翻译而无需扫描文本。缺点是 .mo 文件对人类不可读,并且每当 .po 文件更改时都必须重新生成。如果 .po.mo 的区别仍然模糊不清,我们关于 .po、.mo 与 .pot 文件解释 的解释器会详细分析每种格式以及它们之间的关系。

将 po 编译成 mo 的四种方法

没有一个“正确”的工具——最佳选择取决于您当前的工作方式。以下是四种可靠的方法,从一行命令到完全自动化的云工作流。所有这四种方法都生成 WordPress 在运行时加载的相同二进制 .mo 文件。

方法 1:WP-CLI

最简洁的现代方法是 WP-CLI,它可以通过一个命令编译整个文件夹的 .po 文件。如果您已经通过命令行管理 WordPress,这会自然地融入您的工作流程。

# Compile every .po file in the languages folder to .mo
wp i18n make-mo languages/

# Compile into a specific destination directory
wp i18n make-mo languages/ build/languages/

make-mo 命令会扫描目标目录,编译它找到的每个 .po 文件,并在其旁边(或您指定的目的地)写入一个匹配的 .mo 文件。它能优雅地处理批量操作,这使得它在您同时维护多种语言时成为理想选择。它是任何已经使用 WP-CLI 的项目的推荐工具。

方法 2:msgfmt

用于此任务的原始 Gettext 实用程序是 msgfmt,它是 GNU gettext 软件包的一部分。它将单个 .po 文件编译成单个 .mo 文件,并且几乎在所有 Linux 和 macOS 系统上都可用。

# Compile one file
msgfmt my-plugin-de_DE.po -o my-plugin-de_DE.mo

# Add statistics about translated, fuzzy, and untranslated strings
msgfmt --statistics my-plugin-de_DE.po -o my-plugin-de_DE.mo

# Install it first if missing
#   macOS:  brew install gettext
#   Debian: sudo apt-get install gettext

-o 标志用于命名输出文件。--statistics 标志非常有用——它会告诉您有多少字符串已翻译、模糊或仍然为空,这样您可以在发布之前发现不完整的翻译。对于一次处理一个文件的脚本,msgfmt 是可靠、简单直接的选择。

由于 msgfmt 是一个纯粹的命令行工具,它可以很好地融入自动化流程。您可以将其封装在 shell 循环中以编译整个文件夹,或者将其连接到 CI 管道中,这样每个涉及 .po 文件的提交都会自动生成一个新的 .mo 文件。一个常见的模式是 for f in languages/*.po; do msgfmt "$f" -o "${f%.po}.mo"; done,它会在一次通过中编译所有语言。--check 标志增加了验证功能,在 msgidmsgstr 之间的格式字符串不匹配到达生产环境之前进行标记——这是防止静默破坏翻译布局的占位符错误的一种廉价保障。

方法 3:Poedit (保存时编译)

如果您在图形编辑器中编辑翻译,Poedit 会自动为您编译。每次您保存 .po 文件时,Poedit 都会在其旁边写入匹配的 .mo 文件——无需单独的命令,也无需额外的步骤。

这是 Poedit 在不熟悉命令行的翻译人员中仍然流行的原因之一。您打开 .po 文件,输入您的翻译,点击保存,然后两个文件会一起更新。您可以在 Poedit 的偏好设置中确认此行为,其中默认启用了保存时自动编译 .mo 文件。Poedit 和类似的桌面工具在 Mac 和 Windows 上编辑和翻译 PO 文件的 5 款免费工具 中进行了评测。

桌面编辑器的问题在于编译只在用户打开文件并保存时发生。这对于单人项目来说没问题,但对于十几种语言或团队之间来回传递文件的情况,它无法扩展。如果有人在不同的工具中编辑 .po 文件并将其复制到存储库中而未打开 Poedit,那么 .mo 文件将永远不会更新。对于大型或协作项目,自动化方法——命令行或云——消除了对记住按保存的依赖。

方法 4:自动为您生成 .mo 的云工具

第四种选项完全消除了编译步骤:使用云服务,它会与翻译后的 .po 文件一起返回已编译的 .mo 文件。您无需运行命令或两次保存文件——您只需上传,然后即可获得已完成的、命名正确的文件。

SimplePoTranslate 正是这样工作的。您上传 .po.pot 文件,它使用上下文感知 AI 翻译字符串,然后返回一个包含并排生成的 .po.mo 的 ZIP 文件——已经编译完成,已经命名以匹配您的文本域和语言环境。没有单独的编译过程,也没有遗漏的可能。

它还处理了会破坏手动工作流的细节。语法锁定在翻译前冻结 %s%1$s{name} 等占位符以及 HTML 标签,因此您的变量在 .mo 文件中保持完整。完整的 Gettext 复数支持意味着复杂的复数形式也能正确编译——这是一个值得深入理解的主题,我们将在 理解 Gettext 复数 中介绍。而且由于它在云端运行,因此无需安装插件,也无需维护构建工具。

最常见的陷阱:您忘记重新编译了

翻译无法显示的最大原因是编辑了 .po 文件却忘记重新编译 .mo 文件。WordPress 会继续加载旧的二进制文件,因此您的新措辞永远不会出现——而且没有任何错误消息会告诉您原因。

要牢记的心智模型是:.po 是您的草稿,.mo 是最终交付的。.po 文件的任何更改对 WordPress 来说都是不可见的,直到您重新生成 .mo 文件。每次编辑后都要养成重新编译的习惯,或者使用自动编译的工具,这样就永远不会跳过该步骤。

这个陷阱在从暂存环境到生产环境的交付中尤其隐蔽。开发人员在本地编辑并重新编译,看到翻译生效,然后只部署了 .po 文件而忘记了 .mo 文件——因此生产环境默默地保留了旧文本。无论何时您在环境之间移动翻译文件,请将 .po 文件和新编译的 .mo 文件一起移动,或者将其作为部署步骤的一部分进行编译,以便始终从当前源重建二进制文件。

如果重新编译后您的翻译仍然拒绝显示,问题通常是命名不匹配、文件夹错误或缓存层保留了旧文件。完整的检查清单可在 为什么您的 WordPress 翻译不显示 中找到。

关于较新的 .l10n.php 格式的说明

最近的 WordPress 版本引入了第三种运行时格式:.l10n.php。翻译不再以二进制 .mo 形式存储,而是作为普通的 PHP 数组存储,PHP 操作码缓存可以将其保存在内存中,从而使在繁忙站点上的查找比 .mo 文件更快。

<?php
return [
	'domain'  => 'my-plugin',
	'messages' => [ 'Your cart is empty' => 'Ihr Warenkorb ist leer' ],
];

当有匹配的 .mo 文件可用时,WordPress 会自动生成 .l10n.php 文件,因此您无需手动构建它们。目前,编译正确的 .mo 文件仍然是基础——性能格式是从它派生的。

总结

要可靠地将 po 编译成 mo,请选择适合您工作方式的方法:WP-CLI 用于命令行批量处理,msgfmt 用于带统计信息的单个文件,Poedit 用于保存时自动编译,或者使用云工具为您构建 .mo 文件,这样就不会跳过该步骤。所有这四种方法都生成 WordPress 在运行时所需的相同二进制文件。

无论您选择哪种方式,请记住黄金法则:编辑 .po,然后编译成 .mo——每次都是如此。这个习惯可以防止 WordPress 中最令人沮丧的翻译错误,即一切看起来都正确但网站顽固地保持英文的情况。

准备好永远跳过手动编译步骤了吗?免费试用 SimplePoTranslate ——无需信用卡。上传您的 .po 文件,在几分钟内即可在免费套餐中下载一个可部署的 .po + .mo 捆绑包。