You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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可以正常抓取字符串:

  1. 在独立函数所在的文件顶部引入该宏,括号内为你自定义的上下文名称:
#include <QCoreApplication>
Q_DECLARE_TR_FUNCTIONS(StandaloneContext)
  1. 直接在独立函数中使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:39:03