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);
}
我正在尝试追踪其他人代码中的一个错误,其中一些文本(但不是全部)没有被程序中的 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);
}