如何记录QObject::tr的原始字符串,并仍然向GUI显示翻译
How to log the original string of QObject::tr and still display to the GUI the translation?
在我的项目中,我们希望翻译用户界面,但保留英文技术日志。我同意这两种消息应该保持分离,但有时我们会有一些错误消息,我们想同时显示和记录
使用QObject::tr可以获得已翻译的字符串,而无法检索源字符串。
如何在不复制/粘贴的情况下管理原始版本的日志+翻译版本的显示
我愿意接受任何建议,包括设计限制。
我在自己的一个项目中通过引入一个特殊的helper类来解决这个问题,该类同时包含原始字符串和翻译后的字符串。以下是它的大致外观:
class LocalizedString
{
public:
LocalizedString(const char * str) :
m_originalString(str),
m_localizedString(tr(str))
{}
const char * originalString() const { return m_originalString; }
const QString & localizedString() const { return m_localizedString; }
private:
const char * m_originalString;
QString m_localizedString;
}
然后使用这个类的代码如下所示:
// In one place within the code:
LocalizedString errorDescription = QT_TR_NOOP("Some message which should go both to the log and to the user");
qDebug() << errorDescription.originalString();
<...>
// In some other place within the code which gets errorDescription variable from somewhere and needs to show it to the user
showErrorMessage(errorDescription.localizedString());
该方法的主要部分是QT_TR_NOOP宏的使用。它所做的是将包含在其中的字符串文字标记为在qmake
步骤中需要提取的文字,以便进一步翻译。与QObject::tr
不同,此宏不会将未翻译的文本转换为已翻译的文本。如果您想访问翻译后的文本,您需要稍后手动调用tr
——就像我在LocalizedString
的构造函数中的上例中所做的那样。
注意,QT_TR_NOOP
被设计为在类中使用,即用于翻译的上下文将是存在宏的某个方法中的类的名称。如果您有独立的函数,或者您想自己指定上下文,请改用QT_TRANSLATE_NOOP宏-它的第二个参数是翻译上下文。
更新:还有一个提示:在我的LocalizedString
的实际实现中,它有operator<<
,它打印原始的非本地化字符串。这很方便,因为这样您只需将LocalizedString
类的对象传递给QDebug
,而无需调用其originalString
方法。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 不同翻译单元中不可重载的非内联函数定义
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 显示基于用户输入的整数的字符
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何记录QObject::tr的原始字符串,并仍然向GUI显示翻译
- 模板在翻译单元中的显示方式
- 显示包含头文件后生成的c/c++文件(在翻译为机器语言之前)