msgmerge
是 GNU gettext 工具集的一部分,用于合并 .po
(Portable Object)文件和 .pot
(Portable Object Template)模板文件。其核心功能是将现有翻译文件(def.po
)与包含最新源代码引用的模板文件(ref.pot
)合并,保留有效的翻译并更新源代码位置信息。该工具广泛应用于国际化(i18n)流程中,确保翻译文件与源代码同步更新。
核心功能
- 合并
.po
与 .pot
文件
- 保留
def.po
中的现有翻译(若匹配),丢弃过时的注释和文件位置信息。 - 从
ref.pot
中获取最新的源代码引用(如 #: filename:line
),替换旧信息。 - 使用模糊匹配(
fuzzy
)处理未完全匹配的条目,提高匹配成功率。
- 支持多种输入格式
- 支持 Java
.properties
和 NeXTstep/GNUstep .strings
格式。
- 灵活输出控制
- 指定输出文件路径、备份策略、颜色高亮、换行控制等。
- 多语言支持
- 通过
--lang
设置目标语言,生成对应的 .mo
文件。
语法
msgmerge [OPTION] def.po ref.pot
选项详解
输入文件位置
选项 | 说明 |
---|
def.po | 现有的 .po 文件(含翻译)。 |
ref.pot | 包含最新源代码引用的 .pot 模板文件(通常由 xgettext 生成)。 |
-D, --directory=DIRECTORY | 添加 DIRECTORY 到输入文件搜索路径。 |
-C, --compendium=FILE | 添加额外的翻译库文件(可多次指定),用于辅助模糊匹配。 |
操作模式
选项 | 说明 |
---|
-U, --update | 更新 def.po ,若文件已为最新则不做操作。 |
--backup=CONTROL | 设置备份策略(none /numbered /existing /simple )。默认使用 simple ,备份后缀为 ~ 。 |
--suffix=SUFFIX | 覆盖默认备份后缀(需与 --backup 一起使用)。 |
输出文件位置
选项 | 说明 |
---|
-o, --output-file=FILE | 将结果写入指定的 FILE 。若未指定或为 - ,输出到标准输出。 |
--multi-domain | 将 ref.pot 应用于 def.po 中的所有域名(多语言支持)。 |
操作修饰符
选项 | 说明 |
---|
-m, --multi-domain | 应用 ref.pot 到 def.po 的所有域名。 |
-N, --no-fuzzy-matching | 禁用模糊匹配,仅使用精确匹配。 |
--previous | 保留已翻译消息的旧 msgid 。 |
输入文件语法
选项 | 说明 |
---|
-P, --properties-input | 输入文件为 Java .properties 格式。 |
--stringtable-input | 输入文件为 NeXTstep/GNUstep .strings 格式。 |
输出细节
选项 | 说明 |
---|
--lang=CATALOGNAME | 设置输出文件头的 Language 字段(如 zh_CN )。 |
--color | 始终使用颜色和文本属性高亮输出。 |
--color=WHEN | 根据 WHEN 控制颜色使用(always /never /auto /html )。 |
--style=STYLEFILE | 指定 CSS 样式文件用于 --color 。 |
-e, --no-escape | 输出时不使用 C 风格转义字符(默认)。 |
-E, --escape | 强制使用 C 风格转义字符,禁用扩展字符。 |
--force-po | 即使输出为空也强制写入 .po 文件。 |
-i, --indent | 使用缩进输出风格。 |
--no-location | 禁用 #: filename:line 行(源代码位置信息)。 |
-n, --add-location | 保留 #: filename:line 行(默认启用)。 |
--strict | 严格 Uniforum 输出风格。 |
-p, --properties-output | 输出为 Java .properties 文件。 |
--stringtable-output | 输出为 NeXTstep/GNUstep .strings 文件。 |
-w, --width=NUMBER | 设置输出页面宽度(默认为终端宽度)。 |
--no-wrap | 不换行处理长消息行(超过页面宽度时保留为单行)。 |
-s, --sort-output | 生成排序后的输出。 |
-F, --sort-by-file | 按文件位置排序输出。 |
信息性输出
选项 | 说明 |
---|
-h, --help | 显示帮助信息并退出。 |
-V, --version | 输出版本信息并退出。 |
-v, --verbose | 增加详细输出级别(显示进度信息)。 |
-q, --quiet, --silent | 抑制进度指示(静默模式)。 |
使用场景与示例
1. 合并 .po
与 .pot
文件
msgmerge -U messages.po messages.pot
- 更新
messages.po
,将 messages.pot
中的最新源代码引用合并到现有翻译中。
2. 指定输出文件
msgmerge -o updated.po old.po new.pot
- 将
old.po
与 new.pot
合并,结果保存为 updated.po
。
3. 启用模糊匹配
msgmerge -N -o merged.po existing.po template.pot
4. 保留旧 msgid
msgmerge --previous -U translations.po updated.pot
5. 多语言支持
msgmerge --lang=zh_CN -U chinese.po chinese_template.pot
- 为中文(
zh_CN
)合并 .po
与 .pot
文件。
6. 生成 Java .properties
文件
msgmerge -p -o messages_fr.properties messages.po messages.pot
- 输出为法语(
fr_FR
)的 Java .properties
文件。
7. 配合 xgettext
更新翻译
xgettext --from-code=UTF-8 -o new.pot source.c
msgmerge -U translations.po new.pot
- 先用
xgettext
生成最新 .pot
模板,再用 msgmerge
更新翻译文件。
8. 静默模式运行
msgmerge -q -U translations.po template.pot
注意事项
- 文件兼容性
def.po
必须为有效 .po
文件,ref.pot
必须为 .pot
或 .po
格式。
- 备份策略
- 使用
--backup
时,需注意备份文件的存储路径和命名规则。
- 模糊匹配
- 模糊匹配(默认启用)可能引入不精确的翻译,需人工审核。
- 多语言支持
- 使用
--lang
时,确保目标语言的 .po
文件存在。
- 格式转换
- 使用
-p
或 --stringtable-output
时,输出文件需符合对应格式规范。
- 颜色高亮限制
--color
依赖终端支持 ANSI 颜色代码,非终端环境可能无效。