Qt 语言家的使用(二)

更新时间:2023-06-05 06:59:04 阅读: 评论:0

太空绘画
Qt 语言家的使用(二)
一个简单的用Qt语言家(Qt Linguist)翻译应用程序的例子,在上一次已经给大家介绍了。这次我们要做一个稍微复杂点的应用程序,并看看Qt语言家是怎样完成程序翻译工作的。由于我也是最近才发现的,所以如有错误,请指出,我会尽快更改的。
应用程序,并且命名为[指导]Qt语言家的使用”。目标为桌面应用程首先同样的,建立一个空的Qt“
序,建立好的截图如下所示:
新建一个main.cpp文件,并且输入如下的代码:
//main.cpp主函数所在的位置
//20:27:24最后编辑
#include<QApplication>
#include<QtGui>
#include<QTranslator>
int main(int argc,char**argv)
{
以爱为话题的作文600字QApplication app(argc,argv);
QTranslator translator;
translator.load("zh_CN");
app.installTranslator(&translator);
//绘制界面
QLabel*label=new QLabel(QLabel::tr("Input value"));
QSpinBox*spinBox=new QSpinBox;
QPushButton*button=new QPushButton(QPushButton::tr("OK"));
QDial*dial=new QDial;
QWidget*window=new QWidget;
spinBox->tRange(0,65535);
献血的危害dial->tRange(0,65535);
QGridLayout*layout=new QGridLayout;
layout->addWidget(label,0,0);
layout->addWidget(spinBox,0,1);
layout->addWidget(button,1,0);
layout->addWidget(dial,1,1);
window->tWindowTitle(QWidget::tr("--Set Value--"));
window->tLayout(layout);
window->show();
/
/连接信号和槽
QObject::connect(button,SIGNAL(presd()),
qApp,SLOT(quit()));
QObject::connect(dial,SIGNAL(valueChanged(int)),
spinBox,SLOT(tValue(int)));
QObject::connect(spinBox,SIGNAL(valueChanged(int)),
dial,SLOT(tValue(int)));
();
}
我们先运行一下,运行结果是这样的:
让我们来看一下一些关键代码。QT ranslator translator;表明建立一个QT ranslator对象,translator.load( "zh_CN" );表明载入一个语言脚本,app.installT ranslator( &translator );的意思是应用程序载入该translator对象。它是Qt语言家重要的组成部分。
为了正确地载入zh_CN这个翻译文件,我们必须在.pro文件后面添加一句:TRANSLATIONS +=
),让Qt语言家自动产zh_CN.ts”
。随后点击菜单上的工具->外部->Qt语言家->更新翻译(lupdate”
生.ts文件。产生了翻译文件后,我们点击Ctrl+O打开它,看看它的内容是不是这个样子:
<?xml version="1.0"encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0">
<context>
<name>QLabel</name>
<message>
<location filename="main.cpp"line="16"/>
<source>Input value</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QPushButton</name>
<message>
<location filename="main.cpp"line="18"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QWidget</name>
<message>
<location filename="main.cpp"line="31"/>
<source>--Set Value--</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>如何设置电脑自动关机
如果是这样的话,那么恭喜你,成功了。不是的话回头看看你哪步出错了。接下来我们要做一些小动作,看看Qt语言家是如何察觉出来的。
我们在源代码中添加两句话,如下蓝色所示:
//main.cpp主函数所在的位置
//20:27:24最后编辑
#include<QApplication>
#include<QtGui>
#include<QTranslator>
int main(int argc,char**argv)
{
QApplication app(argc,argv);
QTranslator translator;
translator.load("zh_CN");
app.installTranslator(&translator);
//绘制界面
QLabel*label=new QLabel(QLabel::tr("Input value"));
QSpinBox*spinBox=new QSpinBox;
QPushButton*button=new QPushButton(QPushButton::tr("OK"));
QDial*dial=new QDial;
QWidget*window=new QWidget;
QLabel*desc=new QLabel(QLabel::tr("Set your favourite value."));
spinBox->tRange(0,65535);
dial->tRange(0,65535);
QGridLayout*layout=new QGridLayout;
layout->addWidget(label,0,0);
layout->addWidget(spinBox,0,1);
layout->addWidget(button,1,0);
layout->addWidget(dial,1,1);
layout->addWidget(desc,2,0);
window->tWindowTitle(QWidget::tr("--Set Value--"));
狮子女和摩羯男
window->tLayout(layout);
window->show();
//连接信号和槽
QObject::connect(button,SIGNAL(presd()),
qApp,SLOT(quit()));
QObject::connect(dial,SIGNAL(valueChanged(int)),
spinBox,SLOT(tValue(int)));
QObject::connect(spinBox,SIGNAL(valueChanged(int)),
dial,SLOT(tValue(int)));
();
}
此时我们再运行更新翻译,概要信息栏出现了这样的文字:
“”
Updating 'zh_CN.ts'...Found 4 source text(s) (1 new and 3 already existing)
如果以前打开了zh_CN.ts ,那么会出现下面界面:
选择是,再看看zh_CN.ts ,是不是多了一项?
<message>        <location  filename="main.cpp" line="21"/>
<source>Set  your  favourite  value.</source>        <translation  type="unfinished"></translation>
</message>我们知道了,如果更新了源代码,那么也要更新.ts 文件,这样Qt 语言家才能根据新的控件更新新的代码。随后我们再来看看下一种情况。
将源代码新添加的两句话注释掉,保存,再运行更新翻译(lupdate ),输出的信息最后两句是:Updating 'zh_CN.ts'...
Found 3 source text(s) (0 new and 3 already existing)Kept 1 obsolete entries
表明我们需要翻译的地方只剩下3“处了,另外有一处由于不存在对应的控件,所以被标记为过时(obsolete ”)的了。看看zh_CN.ts 文件,是不是删除了上面的内容?
理论上说,将QLabel::tr()和QPushButton::tr()改写为QObject::tr()并且部署翻译是行得通的,我们就试试看。
哎呀,我们的.ts 文件变成这样了,尽管仍能做翻译,但是无法辨别控件属性,翻译起来有那么点不方便啊。
<?xml  version="1.0" encoding="utf-8"?><!DOCTYPE  TS >
<TS  version="2.0"><context>
<name>QObject </name>    <message>
<location  filename="main.cpp" line="16"/>        <source>Input  value </source>
<translation  type="unfinished"></translation>    </message>
买奶粉
<message>        <location  filename="main.cpp" line="18"/>
<source>OK </source>        <translation  type="unfinished"></translation>
</message>    <message>
<location  filename="main.cpp" line="33"/>        <source>-- Set  Value  --</source>
<translation  type="unfinished"></translation>    </message>
</context></TS>
现在我们开始手工翻译了。将此xml 文件改成如下的样子:
<?xml  version="1.0" encoding="utf-8"?><!DOCTYPE  TS >
<TS  version="2.0"><context>
<name>QObject </name>    <message>
<location filename="main.cpp"line="16"/>
<source>Input value</source>
<translation>输入值</translation>
</message>
<message>
<location filename="main.cpp"line="18"/>
<source>OK</source>
<translation>确定</translation>
</message>
<message>
<location filename="main.cpp"line="33"/>
<source>--Set Value--</source>
<translation>--设置数值--</translation>
</message>
</context>
</TS>
),生成.qm文件,并且放在应用程序同一文件语言家的部署编译(lrelea”
保存,随后选择Qt“
夹中,运行结果如下所示:
好了,我们再修改一下源代码,将QLabel* label = new QLabel( QObject::tr( "Input value" ) );改为QLabel* label = new QLabel( QLabel::tr( "Input value" ) );,编译、运行,我们看到输入值退回Input Value英文了。
“”
再试试使用更新翻译(lupdate)看看,我们看到出现了这样的信息:
Found 3 source text(s) (1 new and 2 already existing)
Kept 1 obsolete entries
羽毛丰满
Same-text heuristic provided 1 translation(s)
heuristic,启发式地,表示Qt语言家启发式地找到了一个翻译,但它不确定。我们看看究竟是什么翻译。打开zh_CN.ts文件看看:
<?xml version="1.0"encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0">
<context>
<name>QLabel</name>
<message>
<location filename="main.cpp"line="16"/>
<source>Input value</source>
<translation type="unfinished">输入值</translation>
今夜月色很美
</message>
</context>
<context>
<name>QObject</name>
<message>
<source>Input value</source>
<translation type="obsolete">输入值</translation>
</message>
<message>
<location filename="main.cpp"line="18"/>
<source>OK</source>
<translation>确定</translation>
</message>
<message>
<location filename="main.cpp"line="33"/>
<source>--Set Value--</source>
<translation>--设置数值--</translation>
</message>
</context>
</TS>
我们看到,一个QLabel提供了翻译:Input value->输入值,但是标记了unfinished,而原来的QObject下面的Input value的翻译却标记了Obsolete。大家知道是什么原因吗?
原来,我们执行更新翻译(lupdate)时,Qt语言家查找tr()函数的位置,并且写入.ts文件中,这样以便翻译的时候替换。当修改源代码执行更新翻译后,Qt语言家会智能地决定哪些应该翻译、哪些不应该翻译。类型unfinished表明这是需要翻译但未完成的,类型obsolete表明这条翻译在现有程序是找不到对应控件的,俗称过时的。而lrelea是根据.ts文件,产生体积更小,更为紧凑的二进制
“”
的.qm文件。了解了这些后我们对Qt语言家有了更为深入的了解。

本文发布于:2023-06-05 06:59:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/869320.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:翻译   语言   文件
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图