tr()函数

本文介绍了Qt中的tr()函数,探讨了其在国际化中的应用,包括不同场景下的使用方法及注意事项,例如设置编码方式来避免乱码问题。

函数tr()简单了解

用tr的有两类人:
(1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr
(2)另一类人,确实是出于国际化的需要,将需要在界面上显示的文件都用tr包起来,这有分两种:
(2a) 用tr包住英文(推荐的用法,源码英文,然后提供英文到其他语言的翻译包)
(2b) 用tr包住中文(源码用中文,然后提供中文到其他语言的翻译包)

tr 是做什么的?下面二者的区别是什么?

QString text1 = QObject::tr("hello");
QString text2 = QString("hello");

tr是用来实现国际化,如果你为这个程序提供了中文翻译包(其中hello被翻译成中文”你好”),那么text1的内容将是中文”你好”;如果你为程序提供且使用日文翻译包,那么text1的内容将是日文。

tr是经过多级函数调用才实现了翻译操作,是有代价的,所以不该用的时候最好不要用。

QObject::tr
说实话,在tr中使用中文不是个好主意。不过既然总有人用(无论是(1)还是(2b)),而且总有人遇到问题,所以还是简单整理一下吧。

tr(“我是中文”);
与QString(“我是中文”)完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。

如何告诉tr你写的这几个汉字在磁盘中保存的是何种编码呢?这正是

QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

所做的。这两个选择的原则,究竟何种编码主要取决于我们的源代码文件的编码(windows上一般是gbk,其他平台一般utf-8)
如果你的编码采用的utf8,可以直接使用trUtf8而不必设置setCodecForTr。

### Qt 中 tr 函数的作用 `tr` 是 Qt 提供的一个用于国际化和本地化的函数,主要用于字符串的翻译。通过 `tr` 函数定义的字符串可以在运行时被替换为其他语言版本的内容,从而实现应用程序的多语言支持[^1]。 以下是关于 `QString text1 = QObject::tr("hello");` 和 `QString text2 = QString("hello");` 的具体分析: - **`QObject::tr("hello")`**: 这里的 `tr` 调用了全局的静态方法 `QObject::tr` 来标记字符串 `"hello"` 可以被翻译。该字符串会被加入到 Qt Linguist 工具中以便后续进行翻译处理[^3]。 - **`QString("hello")`**: 此处创建了一个普通的 `QString` 对象,其内容固定为英文单词 `"hello"`,不会参与任何翻译过程,因此无法动态切换成其他语言[^2]。 #### 如何正确使用 tr 函数? 要使程序具备国际化的功能,需遵循以下原则编写代码并配置环境: 1. **调用方式**:对于非静态上下文中可以直接写成 `this->tr("string to translate")` 或者简化形式 `tr("string to translate")`;而在静态成员函数或者无继承自 `QObject` 类的情况下,则应改用 `QCoreApplication::translate(context, sourceString)` 方法替代。 ```cpp class MyClass : public QObject { Q_OBJECT public: explicit MyClass(QObject *parent = nullptr); void sayHello(); }; MyClass::MyClass(QObject *parent) : QObject(parent) {} void MyClass::sayHello(){ qDebug() << tr("Hello World!"); } ``` 2. **提取待翻译文本**:利用 lupdate 工具扫描源文件中的所有 `tr()` 表达式,并将其记录至 .ts 文件里作为基础数据提供给译员操作。 3. **执行实际转换工作流**:借助 Qt Linguist 手动完成各目标语种下的文字映射任务之后保存成果回传至项目目录下形成最终版 .qm 文件。 4. **加载对应资源包**:启动阶段由开发者负责安装合适的 translator 实例并将之注册进入应用级事件循环体系之中生效。 ```cpp #include <QTranslator> #include <QLocale> int main(int argc, char *argv[]) { QApplication app(argc, argv); QTranslator translator; const QStringList uiLanguages = QLocale::system().uiLanguages(); for (const QString &locale : uiLanguages) { const QString filename = QString("myapp_%1").arg(locale); if (translator.load(filename, ":/i18n")) { app.installTranslator(&translator); break; // Break after first successful load. } } MainWindow w; w.show(); return app.exec(); } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值