[Qt Topic] – 中文化研习,做一个多语言的简易天气预报器

简介:

[Qt Topic] – 中文化研习做一个多语言的简易天气预报器

作者 Jason Lee

日期 2010-04-01 -- 2010-04-02

平台 Qt SDK v2010.02.1 + Windows Xp

声明 文章作者仅在Intel软件网络CSDN博客 发表本文如有转载请注明出处。

 

[1] 简单地使用 QTextCodec tr 配合

在默认情况下我们直接在源码中使用中文比如 setWindowTitle(tr(" 中文化研习 ")); 则会在运行界面发现中文乱码。遇到这种问题如果无需考虑国际化则可以直接使用 QTextCodec 设置编码方式

QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));

该语句需要包含头文件 #include <QTextCodec>

选择 GB18030 而不是 GBK 或者 GB2312 是因为前者的汉字收录更丰富并向下兼容了后两者。但是在嵌入式设备上如手机或 MP3 并不一定支持 GB18030

而既然是 setCodecForTr 那么就应该在第一次对 tr() 的调用之前设置编码方式一般应该在 main() 函数中紧接 Qapplication 对象创建后设置。 tr() 用来返回一个翻译过的文本版本在编写代码的过程中对每一个用户可见的文本都应该加上该函数。

这样设置了以后基本的中文显示如按钮文本、窗口标题以及文本编辑区域都可以得到良好的显示。

值得一提的是如果出现的不是乱码而是问号则可能是字符编码内无该字的编码。另外一种问题是如果出现的是方框正方形而不是乱码则可能是无该指定字体可以通过设置 QFont 尝试解决该问题。

 

[2] 关于使用 QString 来显示中文

一是使用 toLocal8Bit fromLocal8Bit 。比如下述代码就可以良好地显示中文

 

QString gbText; gbText = gbText.fromLocal8Bit("汉化"); btn = new QPushButton(gbText);

通过这种方式可以使用系统的本地 8 位编码格式。

二是通过 QString QTextCodec 结合设置在 const char * Qstring 之间转换时使用的编码格式比如下述代码也可以使得汉字良好显示

 

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB18030")); QString str = "汉化"; textEdit->append(str);  

 

[3] 使用 Qt 翻译家

Qt 提供了外部的翻译文件只要对需要进行翻译的文本使用 tr() 函数然后在 .pro 工程文件中添加 TRANSLATIONS = localizer.ts 这里的文件名自然要根据具体需要设置。之后使用 lupdate 命令如 lupdate localizer.pro 生成 localizer.ts 。接着用 linguist 打开 localizer.ts 并在文件里面进行相应文本的翻译保存后发布生成 localizer.qm

至此在包含了头文件 #include <QTranslator> 后即可以安装翻译家将相应的文本进行翻译

 

QTranslator translator; translator.load(":/localizer"); app.installTranslator(&translator);

此时再运行程序则可以发现界面上的文本已经得到翻译了。

补充在上述代码中 localizer.qm 是由 qrc 文件指定位置的本例中 localizer.qm 相对于 qrc 文件的位置是“ /localizer.qm ”所以添加的时候使用“ :/localizer ”。而如果 qm 文件相对于 qrc 文件的位置是“ /translator/localizer.qm ”则需要指定为“ :/translator/localizer.qm ”。

 

[4] 文件读写中的中文

这里以读取 Google 的天气 API 为例。

Google 的中文天气 API http://www.google.com/ig/api?hl=zh_cn&weather= 等号后面加城市名比如“ beijing ”或者“ hongkong ”。

API 是以 XML 格式给出信息而如果我们不加以修饰地直接读取该 XML 文件的话则会出现如“ é£ åï ¼ ä ¸åã é£ é ”之类的乱码。

针对这种情况可以先使用不一定必须使用 QString 存放信息因为可以用 QTextCodec QString 进行编码格式的设置

       QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

这样的话就可以以相应的编码格式进行文件读取。运行后可以看到中文显示正常。

同样地使用其它方式进行文件读取的话也可以使用类似设置编码格式的方法。比如使用 QTextStream 时如果希望使用特定的编码进行读写则可以使用该类的成员函数 setCodec()

 

[5] 可动态切换语言的天气预报器

       关于这个话题可以精炼成以下几点具体的完整代码将会在后面给出

1 、动态的语言切换的实现是通过在运行时用户进行语言选择时触发的信号引起相应槽的运作。比如可以设置一个语言菜单供用户选择语言我在这里只设置了英语和中文。当用户点击菜单选项的时候利用 QTranslator 进行不同 qm 文件的重新载入然后再重绘可见文本。所以这就要求一是用户可见的文本应该用 tr() 函数处理毕竟这不是一样很大的负担最好将其养成习惯二是生成用户可见文本的代码最好放在一个函数里为了取名有意义可以取做 retranslateUi()

void QWR::retranslateUi(){ enAct->setText(tr("&English")); cnAct->setText(tr("&Chinese")); languageMenu->setTitle(tr("&Language")); cityLabel->setText(tr("City")); runBtn->setText(tr("&Run")); setWindowTitle(tr("QWeatherReporter")); }

2 、天气预报的功能是通过调用 Google API 实现的需要注意的是温度单位在国内外的不同。如果当前用户选择英文就选择英文 API 同样的如果用户选择中文就设置 URL 为中文 API 地址。这就需要在编码的时候进行判断判断的方式有多种。

QString url; if(cnAct->isChecked()){ url = "http://www.google.com/ig/api?hl=zh_cn&weather="; url.append(cityBox->text()); }else{ url = "http://www.google.com/ig/api?hl=en&weather="; url.append(cityBox->text()); } request.setUrl(QUrl(url));

3 Google 天气 API 给的结果是 XML 格式的所以参考 [4] 中提到的要设置编码格式。正确读取 XML 数据后再根据结点名称获取具体的天气数据如最高温、最低温以及日期等。

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QString xmlFile = reply->readAll(); if(xmlFile.size() < 1000){ //Error city information resultBox->setText("No Such City!"); return ; }

4 、最后就是将天气预报的结果呈现出来。

 

[ 结语 ] 这个小程序我给放到了 http://qwr.sf.net 各位如果有兴趣去可以下载完整源码。由于陆续有朋友邮件我说需要源码其实sf.net上有所以我给放到了CSDN资源上地址为http://download.csdn.net/source/2231965


[补充]后来我在写一个程序的时候发现使用GB18030或者GBK、GB2312也一样在我的机子上运行是OK的但是拿到其他机子同样的系统却出现了乱码这令我很是惊讶。不过后来还是寻求了一个解决方案就是设置当前编码为本地编码

QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());

这可能是楼下的朋友提出的不管输什么城市都是“No Such City”的原因可以如此修改一番。

目录
相关文章
|
4月前
|
程序员 定位技术 开发工具
如何使用地图开发相应的产品
如何使用地图开发相应的产品
22 0
|
6月前
|
JSON 前端开发 Java
重生之我在这个世界的文本转音频API工程师的故事
重生之我在这个世界的文本转音频API工程师的故事
35 0
|
8月前
|
JavaScript 前端开发 Java
如何快速开发功能含体育直播+竞猜+视频+社区+新闻+聊天平台?
通过东莞梦幻网络科技的现成“体育赛事直播”源码解决方案,功能涵盖体育直播、竞猜、视频、社区、新闻和聊天等多功能,该方案源码可让平台能快速于3天内上线运营。
|
9月前
|
移动开发 前端开发 JavaScript
参考虎牙斗鱼开发娱乐游戏直播系统示例源码
在当今数字化互联网时代,娱乐游戏直播平台成为了全球范围内备受欢迎的娱乐形式。东莞梦幻网络科技有限公司以其开发的游戏直播系统源码而备受瞩目,该系统仿虎牙斗鱼等知名平台。本文将深入探讨该项目的开发和基础功能模块,以及提供的多种开播方式。
|
JavaScript 前端开发 API
陪伴是最深情的告白,AdminWork框架升级更新摘要(一)
陪伴是最深情的告白,AdminWork框架升级更新摘要(一)
陪伴是最深情的告白,AdminWork框架升级更新摘要(一)
|
Java Unix Linux
开源项目推荐:IM开源即时通讯软件收集,请重点关注Telegram/野火/flamingo
开源项目推荐:IM开源即时通讯软件收集,请重点关注Telegram/野火/flamingo
3375 0
|
JSON 自然语言处理 PHP
MyCms 自媒体系统 v4.1 发布,对接公众号文章排版发布
MyCms 是一款基于 Laravel 开发的开源免费的开源多语言商城 CMS 企业建站系统。
120 24
MyCms 自媒体系统 v4.1 发布,对接公众号文章排版发布
|
JSON 监控 Java
1024共码未来(一览中华风华,API First)
​                              再次渡入繁世,人潮汹涌,眼里茫然,信仰永恒,皆为华夏    10月24日是广大程序员们共同的节日 1024是二进制计数的基本计量单位之一 而每一个程序员都像1024一样 是二进制世界中低调却最重要的主角 💕想要成为这个世界的程序员大神,可不止要有格子衫,过硬的技术和满满的干货更重要,在这个特殊的节日到来之际。学长为所有的程序员送出一波祝福:希望大家脱贫脱单不脱发!!!💕 0 背景 1  快速开发  创建API项目 在 API 接口研发管理产品中,所有的 API 接口都是以项目的方式进行管理,因此
79 0
1024共码未来(一览中华风华,API First)
|
监控 Python
【小硬核】你的聊天记录是怎么被公司监控的?| Python 主题月
【小硬核】你的聊天记录是怎么被公司监控的?| Python 主题月
204 0
|
存储 编解码 缓存
直播带货源码开发之音视频编解码标准简介
AVS(Audio Video coding Standard)即数字音视频编解码技术标准,为中国第二代信源编码标准,此编码技术主要解决数字音视频海量数据(即初始数据、信源)的编码压缩问题,故也称数字音视频编解码技术。

推荐镜像

更多