Qt文本翻译方法

首先,在代码中将要翻译的字符串使用tr()函数包裹起来。例如:QSting str = tr(“hello world”);

接下来开始制作qm文件:
1)在工程.pro文件中写入: TRANSLATION += <.filename>_ZH_CN.ts #这里语言和区域名字一定要严格,否则之后生成的同名.qm文件无法被Qt翻译器加载#
2)利用命令行工具lupdate -verbose -no-obsolete <.pro’path and name>生成.ts文件。-no-obsolete参数表示生成的.ts文件中检测并剔除代码中不再存在的tr("< 英文文本>")。
使用Qt Creator的“工具”->“外部”->“Qt语言家”->“更新翻译(lupdate)”,等同于上述的lupdate -verbose,即:跳过检测过期的翻译原始文本。
3)使用Qt打开刚刚生成的.ts文件,依次编辑译文;ctrl+enter 保存编辑
4)利用Qt翻译家翻译这个.ts文件并发布为.qm文件
5)把.qm文件添加入资源文件中
6)在main.cpp中写如下语句:QTranslator translator;
translator.load(<资源文件中的.qm文件路径和名字>);
7)如果6)的返回值为true,那么把main.cpp中的QApplication对象执行.installTranslator(&translator); 这样翻译文件就加载完成了。
注意:若qt可以找到正确命名后的qm文件但却无法加载qm文件,可以先删除build目录再编译运行。

### Qt 中实现动态翻译并获取原始文本Qt应用程序中,为了支持多语言环境下的动态翻译以及获取原始未翻译文本,可以利用`QCoreApplication::translate()`函数和自定义机制来完成这一目标。 对于动态翻译的支持,通常是在程序运行期间改变当前使用的翻译文件(.qm),从而立即反映界面上的变化。这可以通过重新加载不同的`.qm`文件,并调用`installTranslator()`方法来实现[^1]。然而,关于如何获取原始文本而不是已经过翻译后的版本,则涉及到更细致的设计考虑。 一种常见做法是维护一份映射表,记录所有通过`tr()`宏标记过的字符串及其对应的上下文信息。当需要显示原始文本时,可以从这份映射表中查询相应的条目;而当执行正常流程即展示已翻译的内容时,则按照常规方式工作即可。具体来说: - 使用`QString tr(const char *sourceText)`形式的重载函数捕获所有的待翻译字符串; - 将这些字符串连同其所在的类名作为键存入全局静态哈希表或其他合适的数据结构内; - 提供接口用于访问该数据结构中的值,以便于随时读取未经转换前的状态。 下面是一个简单的例子说明如何实现这一点: ```cpp #include <QApplication> #include <QWidget> #include <QPushButton> #include <QDebug> // 定义一个全局变量存储原文本映射关系 static QMap<QString, QString> originalStrings; class MyWidget : public QWidget { public: explicit MyWidget(QWidget* parent = nullptr): QWidget(parent){ QPushButton* button = new QPushButton(this); // 记录原始文本到global map const char* text = "Click Me!"; originalStrings.insert(QString("%1.%2").arg(metaObject()->className()).arg(text), text); // 设置按钮上的文字为可翻译的形式 button->setText(tr(text)); } static void showOriginalText(){ qDebug() << "Original Text:"; for(auto it=originalStrings.begin();it!=originalStrings.end();++it) qDebug()<<it.key()<<"="<<it.value(); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget w; w.show(); QTimer::singleShot(0,&w,[&]() {MyWidget::showOriginalText();}); return app.exec(); } ``` 此代码片段展示了如何保存并打印出所有由`tr()`包裹起来的字符串。需要注意的是这种方法适用于小型项目或特定场景的应用场合,在大型复杂应用里可能还需要更加复杂的管理方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值