Qt中非Q_OBJECT类的外部函数字符串执行lupdate后未在Qt Linguist显示
问题根因
lupdate提取翻译字符串为静态语法扫描逻辑,不会预处理展开C++宏定义。你将QCoreApplication::translate的第一个上下文参数放在CONTEXT_STRING宏中,lupdate无法识别这是有效字符串字面量,会直接跳过该字符串的提取,因此不会出现在Qt Linguist中。
解决方案
以下三种方案均可解决问题,按需选择即可:
方案1:直接使用字符串字面量作为上下文
不用宏包裹上下文参数,直接传递字符串字面量,lupdate默认可以识别QCoreApplication::translate的调用格式:
// 去掉宏定义,直接传入上下文字符串 msg = QCoreApplication::translate("Context string here", "String to be translated");
方案2:使用Qt官方提供的全局翻译宏
针对非QObject子类的代码场景,Qt专门提供了Q_DECLARE_TR_FUNCTIONS宏简化翻译调用,同时保证lupdate可以正常抓取字符串:
- 在独立函数所在的文件顶部引入该宏,括号内为你自定义的上下文名称:
#include <QCoreApplication> Q_DECLARE_TR_FUNCTIONS(StandaloneContext)
- 直接在独立函数中使用
tr()调用,和QObject子类内的翻译用法完全一致:
void standalonefun() { QString msg = tr("String to be translated"); QMessageBox::information(0, "Message", msg); }
方案3:保留宏定义的额外配置
如果必须用宏统一管理上下文,需要在项目的.pro文件中添加配置,告诉lupdate展开该宏后再扫描:
# 告诉lupdate展开CONTEXT_STRING宏为对应的字符串 EXTRA_TRANSLATOR_ARGS += -D CONTEXT_STRING="Context string here"
验证步骤
修改完成后重新运行lupdate,对应的字符串就会出现在Qt Linguist的对应上下文分类下,完成翻译后运行lrelease即可生效。
内容的提问来源于stack exchange,提问作者Fabius Wiesner
相关产品推荐
相关产品推荐

