功能需求:

网盘客户端要能够实现多国语言的切换,第一版要支持中、英文的切换。在实现过程中感觉QT对多国语言的支持还是很不错的,制作多语言包很方便,切换的逻辑也很简单。下面就来看一下QT中如何制作多语言包。

实现方法:

为了支持国际化最关键的地方是制作多国语言包,然后再实现动态切换。QT里面既可以采用命令行也可以采用Qt Creator的界面操作来生成,这里我们利用Qt Creator来生成多国语言包。基本流程是,先生成ts文件,然后生成qm文件,最后通过QTranslator类来加载qm文件,实现多语言包的切换。注意:为了更全面地实现多语言包,在程序中所有涉及到界面中的按钮或者菜单中的文字显示,都必须使用 QObject::tr("...") 的方式将显示的内容包裹起来,这样做的原因是:只有添加了QObject::tr()的标记,生成ts文件的时候程序才会认为被QObject::tr()包裹的地方是需要制作多语言的,从而在ts中预留出位置。

1> 生成ts文件

在QT的项目文件(.pro)中添加:TRANSLATIONS = XXX.ts YYY.ts(如果是多行,则用 \ 分割)

然后执行【工具】-》【外部】-》【QT语言家】-》【更新翻译(lupdate)】,如下图所示,执行完之后项目下就会生成对应的XXX.ts、YYY.ts文件。

注意:如果项目中包含ui文件,如:FORMS += ZZZ.ui,则在生成的ts文件中包含所有ui文件上的字符显示,而且,在制作ui文件时默认情况下界面上的文字显示都是通过QObejct::tr(" ")包裹的,因为在默认情况下ui中的所有控件都存在一个属性:可翻译的,就代表了默认用QObject::tr()嵌套了。

2. 生成qm文件

利用QT语言家:Linguist打开生成的ts文件,将里面需要翻译的地方写上对应的语言,如下图所示:

ts文件翻译完成后,执行Qt Creator中的【工具】-》【外部】-》【QT语言家】-》【部署翻译(lrelease)】就会生成最终要用到的qm文件,如下图所示:

3. 加载qm语言包

到这里qm语言包制作完成,工作就完成了一大半了。接下来的任务就是在代码中实现语言包的加载,即:根据不同的选择加载不同的语言包。

  1. void LHSyncClientPrivate::InitUiByLanguage(const QString strLanguage)
  2. {
  3. if (strLanguage.isEmpty())
  4. {
  5. return;
  6. }
  7. QString strLanguageFile;
  8. if (strLanguage.compare("en") == 0)
  9. {
  10. strLanguageFile = qApp->applicationDirPath() + QString("/languages/%1/%2").arg(LHT_SYNCCLIENT_VERSION_PRODOCUTNAME).arg(LHT_SYNCCLIENT_EN_FILE);
  11. }
  12. else if (strLanguage.compare("zh") == 0)
  13. {
  14. strLanguageFile = qApp->applicationDirPath() + QString("/languages/%1/%2").arg(LHT_SYNCCLIENT_VERSION_PRODOCUTNAME).arg(LHT_SYNCCLIENT_ZH_FILE);
  15. }
  16. if (QFile(strLanguageFile).exists())
  17. {
  18. m_translator->load(strLanguageFile);
  19. qApp->installTranslator(m_translator);
  20. }
  21. else
  22. {
  23. qDebug() << "[houqd] authclient language file does not exists ...";
  24. }
  25. }

其中,m_translator即为QTranslator实例,在类的构造函数中赋值:m_translator = new QTranslator;实现过程很简单,就是取得语言包的绝对路径,然后利用QTranslator来加载它,最后利用qApp->installTranslator(m_translator)来安装。

4. 重新设置界面显示

重新设置界面的显示,这一步是很多人容易忘记的一步,如果这儿被忽略了,往往就无法完成语言的切换,即:重新设置一下需要显示的元素,该过程是在上面InitUiByLanguage过程之后进行的,相关代码如下:

  1. void LHSyncClientPrivate::RetranslateUi()
  2. {
  3. m_wgtSync->setWindowTitle(tr("Drive Client"));
  4. //! 左侧同步信息
  5. m_btnSynchronizing->setText(tr("Synchronizing"));
  6. m_btnSynchronized->setText(tr("Synchronized"));
  7. //! 右侧面板
  8. m_lblSyncStatus->setText(tr("looking for files changes..."));
  9. m_lblShowRecordsNum->setText(tr("There are n records ..."));
  10. m_btnSyncOrPause->setText(tr("Sync Or Pause"));
  11. m_btnClearAll->setText(tr("Clear all"));
  12. m_btnSyncOrPause->setText(tr("Sync Or Pause"));
  13. m_btnClose->setText(tr("Close"));
  14. m_actSync->setText(tr("Sync Info"));
  15. }

实现效果:

好了,到这里整个语言包的制作过程就基本完成了。这里还需要提及一点在网盘客户端实现时的设计思路:由于网盘在登录前和登录后可操作的菜单是不一样的,要涉及一种动态加载的方式,可以实现一个UiLoader的插件,它实现所有的窗体加载(即LoadUi()返回QWidget句柄)、菜单加载、语言切换,在这些功能中可能UiLoader插件并不完成具体的工作,而仅仅是实现信号的转发功能。同样,也需要实现一个逻辑控制插件,它负责所有的菜单逻辑,而对于每个窗体则由各自的窗体插件自行完成。多语言切换的实现效果如下:

切换为中文:

切换后效果:

加油,坚持每天的学习!!

QT实现多语言切换的更多相关文章

  1. 【大话QT之十四】QT实现多语言切换

    功能需求: 网盘client要可以实现多国语言的切换,第一版要支持中.英文的切换. 在实现过程中感觉QT对多国语言的支持还是非常不错的.制作多语言包非常方便.切换的逻辑也非常easy. 以下就来看一下 ...

  2. 在使用Qt5.8完成程序动态语言切换时遇到的问题

    因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文 ...

  3. DataGrid 列头实现国际化语言切换

    <DataGrid> <DataGrid.Columns> <DataGridTextColumn Binding="{x:Null}" Width= ...

  4. Android app应用多语言切换功能实现

    最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...

  5. ABP的语言切换

    在ABP官网http://www.aspnetboilerplate.com/创建一个Multi Page Web Application项目并打开,在Web项目下可以找到一个Controllers/ ...

  6. iOS 语言切换、本地化,国际化

    什么是本地化处理? 本地化处理就是我们的应用程序有可能发布到世界的很多国家去,因为每个国家应用的语言是不一样的,所以我们要把我们的应用程序的语言要进行本地化处理一下. 本地化处理需要处理那些文件? ( ...

  7. 【转】Android 语言切换过程分析

    最近在看一个bug,系统切换语言后,本来退到后台的音乐,会在通知栏上显示通知.为了解决这个bug,我学习了下android的语言切换流程,也参考了大量其他人的资料.(主要参考了http://blog. ...

  8. android 语言切换过程分析

    android 语言切换过程分析 2014-02-27 18:13 1207人阅读 评论(0) 收藏 举报 语言切换android语言切换android改变语言 最近在看一个bug,系统切换语言后,本 ...

  9. Android 应用内多语言切换

    最近公司的 App 里需要用到多语言切换,简单来说,就是如果用户没有选择语言选项时,App 默认跟随系统语言,如果用户在 App 内进行了语言设置,那么就使用用户设置的语言.当然,你会发现,App 的 ...

随机推荐

  1. jQuery预加载插件

      插件描述:jQuery Fadeloader的插件可以让你轻松实现预加载到您的网站或部分使用级联渐显效果来显示特定的内容块(例如,头> MENU>内容>页脚) jQuery Fa ...

  2. form表单提交的方法

    最近研究了下html中,form保单提交的几种方法,现与大家分享一下(注:网上可能已经有好多版本了,这里自己写下来做个总结了,哈!): 方法一:利用form的onsubmit()函数(经常使用) &l ...

  3. SEO 网站URL优化

    很多人都知道URL对SEO的重要之处,但是很多站点却忽略了站点的路径优化.今天本人在这里写几点关于优化路径小篇! 本人结论出关于站点URL在优化中其实也是占为一个相当重要的一个优化!优化站点的URL本 ...

  4. 【Earthquake, 2001 Open 】 0-1 分数规划

    71  奶牛施工队一场地震把约翰家园摧毁了,坚强的约翰决心重建家园.约翰已经修复了 N 个牧场,他需要再修复一些道路把它们连接起来.碰巧的是,奶牛们最近也成立了一个工程队,专门从事道路修复.而然,奶牛 ...

  5. 《unix网络编程》笔记

    inet_pton和inetntop函数.字母p和n代表presentation和numeric.地址的表达presentation格式通常是ASCIL串,数值(numeric)格式则是存在于套接字地 ...

  6. CENTOS6.5 teamviewer安装

    官网https://www.teamviewer.com/en/download/linux.aspx下载此版本:RedHat, CentOS, Fedora, SUSE

  7. 通过 WIN32 API 实现嵌入程序窗体

    写了一个不使用 COM, 而是通过 WIN32 API 实现的示例, 它把写字板程序嵌在了自己的一个面板中. 这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做 ...

  8. jQuery 分步引导 插件

    转自:http://blog.libnav.com/js/57.html 很多时候一个网站或者一个Web应用出品,为了让你的用户知道你的站点(或应用)有些什么?如何操作?为了让你的用户有更好的体验.往 ...

  9. Red and Black

    Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  10. Authorized users only. All activity may be monitored and reported.

    Authorized users only. All activity may be monitored and reported. Directory: /home/oracle 如出现如上问题,是 ...