Qt5 tr()宏不翻译文本

Qt5 tr() macro does not translate text

我正在尝试追踪其他人代码中的一个错误,其中一些文本(但不是全部)没有被程序中的 tr() 宏翻译。有问题的未翻译的字符串都在函数中批量翻译,如下所示:

SafeStr extractStringFromContainer(UniContainer* p_uni_container, const SafeStr& key)
{
    SafeStr retval;

    UniObjString* p_str = extractEntry<UniObjString>(p_uni_container, key, false);
    if(p_str)
    {
        retval = p_str->ref();
        
        QString localizeString(QObject::tr(qPrintable(retval.c_str())));
        retval = localizeString.toLatin1().constData();

        localizeString = (QObject::tr("some string to translate"));
        localizeString = (QObject::tr("another string to translate"));
        .
        .
        .
        .
    }

    return retval;
}

None 传递给该部分中的 tr() 宏的字符串在程序中显示已翻译。我已经验证这些字符串与我们所有的翻译一起出现在 .ts 文件中,但我注意到它们出现在与此函数无关的 class 的上下文中。

extractStringFromContainer() 函数不是 class 的一部分,只是在头文件中定义。我尝试将这些字符串添加到 TS 文件中的“QObject”上下文中,但没有任何作用。我还尝试向打印出原始字符串和 tr() 字符串的主 QMainWindow class 构造函数添加调试消息,并正确翻译它。

Q_OBJECT class 之外的 tr() 不能翻译字符串吗?还是有特殊的语法可以这样做?

tr(text) macro 用于文字文本。它不得在任何其他上下文中使用。而 QObject::tr 不是 通用翻译函数,因为它期望有一个已建立的上下文,而这种上下文由封闭的 class 提供。在方法之外使用 QObject::tr 将导致您观察到的问题:上下文不受您的控制并且看似随机。

如果您想在非 QObject class 中使用可翻译的字符串,那么您可以将 Q_DECLARE_TR_FUNCTIONS(context) 添加到 class 声明中(作为第一件事,我是认真的).这样 class 然后提供它自己的 tr 函数,Qt 已经为你实现了,你不能使用例如QObject::tr 取而代之。

对于独立函数,您应该创建一个虚拟静态 class(没有任何实例)作为方便的翻译上下文,使用 Q_DECLARE_TR_FUNCTIONS,或者提供上下文 明确地QCoreApplication::translate。在这种情况下,您将使用 translate 而不是 tr

在这种情况下,您确实应该 read the documentation,因为它很好地解释了该做什么和不该做什么,并提供了完全适合您的场景的示例。您想要的确切示例是(按字面引用):

void same_global_function(LoginWidget *logwid)
{
    QLabel *label = new QLabel(
                QCoreApplication::translate("LoginWidget", "Password:"), logwid);
}