如何配置lupdate.exe以保留.ts文件中的手动翻译条目?
解决方案
可行,你可以通过以下几种方式实现保留手动翻译条目,同时让lupdate.exe正常处理自动扫描的条目:
1. 使用Qt翻译上下文文件(.qph)(推荐)
Qt的lupdate支持导入外部的.qph文件,这类文件中的翻译条目会被合并到.ts文件中,且不会被-no-obsolete参数判定为过时条目删除。
操作步骤:
- 创建一个后缀为
.qph的XML文件(比如manual_translations.qph),写入你的手动翻译条目,格式参考:
<!DOCTYPE QPH> <QPH version="1.0"> <context> <name>CustomTranslations</name> <!-- 自定义上下文名称,避免和QML中的上下文冲突 --> <message> <source>你的手动源字符串1</source> <translation>对应翻译1</translation> </message> <message> <source>你的手动源字符串2</source> <translation>对应翻译2</translation> </message> </context> </QPH>
- 修改
lupdate命令,添加-i参数引入这个.qph文件:
lupdate.exe .. -no-obsolete -locations absolute -i manual_translations.qph -ts locale_en.ts locale_fr.ts
每次执行该命令时,lupdate会自动合并.qph中的手动条目到.ts文件,同时正常扫描QML中的qsTr标记条目、清理过时自动条目,不会删除手动添加的内容。
2. 分离自动与手动翻译文件
如果你的手动条目数量较多,可以维护两个独立的.ts文件:
- 一个用于自动扫描(比如
auto_gen.ts),每次用lupdate单独处理它:
lupdate.exe .. -no-obsolete -locations absolute -ts auto_gen.ts
- 另一个专门存放手动翻译条目(比如
manual.ts),完全手动维护,不参与lupdate扫描。 - 最终生成.qm文件时,用
lrelease合并两个.ts文件:
lrelease.exe auto_gen.ts manual.ts -qm locale_en.qm
这种方式的好处是手动条目完全不受lupdate影响,但需要额外管理两个文件,注意避免上下文或字符串冲突。
注意事项
- 不要直接在自动生成的.ts文件中手动添加条目,因为
lupdate会认为这些条目没有对应的源码标记,在-no-obsolete参数下会被删除。 - .qph文件的上下文名称尽量自定义,不要和QML组件的上下文(比如QML文件的文件名)重复,避免翻译冲突。
内容的提问来源于stack exchange,提问作者lvr123
相关产品推荐
相关产品推荐

