QT中文乱码与国际化支持

摘要:
本文讨论以下几个方面内容:1、QT中解决中文乱码的方法;2、QT中实现国家化支持。returnapp.exec();}这样在程序中使用tr或者直接使用“中文”了;2、解决读取ini文件中中文乱码QSettingssettings;settings.setIniCodec;settings.beginGroup;3、解决读取中文文件中文的乱码[cpp]viewplaincopyQFilefile;QTextStreamstream;stream.setCodeC;stream.readAll();二、国际化支持QT中实现多国语言,建议在程序中直接英文,而后通过不同的翻译文件实现多语言的支持。比如中命名为myapp_zh_CN.ts,zh表示简体中文,而CN表示的就是中华人名共和国。QApplication支持多个翻译文件,并根据后加入先使用的搜索顺序进行搜索。

转自:http://blog.csdn.net/alicehyxx/article/details/4960571

QT国际化支持

Qt内部采用的全Unicode编码,这从根本上保证了多国语界面实现的正确性和便捷性。Qt本身提供的linguist工具,用来实现翻译过程十分方便。MFC中利用资源DLL切换资源,或使用多个RC文件进行不同语言版本编译等方法都十分麻烦,如果你曾经使用过MFC,QT解决多语言问题的便捷性绝对会让你感觉是一种享受。本文讨论以下几个方面内容:

1、QT中解决中文乱码的方法;

2、QT中实现国家化支持。

3、对话框实现多语言

一、中文乱码

1、在程序中直接使用中文,需要在程序中加入以下代码:

  1. #include<QTextCodec>
  2. intmain(intargc,char**argv)
  3. {
  4. QApplicationapp(argc,argv);
  5. QTextCodec*codec=QTextCodec::codecForName("GB2312");
  6. QTextCodec::setCodecForLocale(codec);
  7. QTextCodec::setCodecForCStrings(codec);
  8. QTextCodec::setCodecForTr(codec);
  9. …………
  10. returnapp.exec();
  11. }

这样在程序中使用tr(“中文”)或者直接使用“中文”了;

2、解决读取ini文件中中文乱码

QSettings settings("xxxx.ini",QSettings::IniFormat);

settings.setIniCodec(QTextCodec::codecForName("GB2312")); settings.beginGroup("company");

3、解决读取中文文件中文的乱码

  1. QFilefile("xxxx.txt");
  2. QTextStreamstream(file,QIODevice::ReadOnly);
  3. stream.setCodeC(QTextCodec::codecForName("GB2312"));
  4. stream.readAll();

二、国际化支持

QT中实现多国语言,建议在程序中直接英文,而后通过不同的翻译文件实现多语言的支持。实现多国语的步骤有如下几步(提及的工具均为QT自带):

Ø在需要被翻译的字符串前面加标识tr,如QString str=tr(“hello,world!”);这很重要,因为翻译工具会把源码中tr标识的字符串提取出来,翻译成其他语言,如果没有用tr标识的,不会被工具提取。在界面中输入的文字,默认已经是加上tr的了,所以在翻译时也能看见。

Ø在QT工程文件*.pro中增加一项:TRANSLATIONS+=*.ts,扩展名为.ts是翻译的源文件。一般会在命名中把区域加进去,更好的注释这些文件是用于什么语言的,可以根据“语言_国家”的形式形成文件名。比如中命名为myapp_zh_CN.ts,zh表示简体中文,而CN表示的就是中华人名共和国。可以参照ISO语言与国家代码标准:http://blog.csdn.net/alicehyxx/archive/2009/12/06/4952318.aspx

Ø使用lupdate工具提取翻译源文件,【运行】中输入CMD,打开命令行窗口,利用CD命令切换到QT安装目录的BIN目录中,而后输入:

lupdate *.pro

*.pro包含pro文件的全路径。lupdate会解析*.pro文件,生成TRANSLATIONS中的*.ts文件,这些文件可以被linguist工具打开,按照提示一个一个的翻译成需要的文件并保存。

Ø重复以上两步!
(针对以上两步,VS2005中可以直接使用菜单【QT】à【Create new translations File】创建,如果文件已经存在,可以通过图1.1菜单进行更新。)

QT中文乱码与国际化支持第1张

图1.1 VS2005_lupdate

Ø使用lrelease工具发布翻译文件的二进制文件,这样在程序运行时载入会大大的加快速度。在命令行窗口中继续输入:

lrelease *.ts

*.ts包含ts文件的全路径。这个工具会提示你多少语句被翻译,多少被忽略了等。生成的文件是*.qm,与同名的*.ts只是换了一个扩展名。这个就是我们程序需要使用到的文件。

(VS2005中可以使用图1.1中的菜单lrelease来实现该步骤)

Ø使用*.qm文件。程序可以通过两种方式加载翻译文件,一种硬编码方式,直接指定加载的语言,代码如下:

int main(int argc,char* argv[])

{

QApplication app(arcg,argv);

QTranslator translator;

translator.load(“basicdraw_zh_CN”);

app.installTranslator(&translator);

}

另外一种是自动判断翻译当前的locale,再装入相应的翻译文件,如下所示:

int main(int argc,char* argv[])

{

QApplication app(arcg,argv);

QString locale = QLocale::system().name();

QTranslator translator;

translator.load(QString(“basicdraw_”) + locale);

app.installTranslator(&translator);

}

其中QLocale::system().name()返回以“语言_国家”形式形成的字符串,比如zh_CN。

至于通过控件,比如ComboBox选择语言,并实现动态切换,以后再讨论。

三、对话框实现多语言

在实际程序中实现多语言切换,需要生成的qm文件应该包含两个:

ØQT运行库相关的qm文件:在QT安装目录的translations目录下,存在需要*.ts文件,利用lrelease命令生成对应的qm文件。

Ø利用“二”中的步骤生成程序本身需要的*.ts文件,并生成qm文件。

QApplication支持多个翻译文件,并根据后加入先使用的搜索顺序进行搜索。

具体代码如下:
main.cpp

  1. #include"stdafx.h"
  2. #include<QtGui/QApplication>
  3. #include<QtGui/QtGui>
  4. #include"DialogLogin.h"
  5. intmain(intargc,char*argv[])
  6. {
  7. QApplicationapp(argc,argv);
  8. QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
  9. //安装QT运行库翻译器
  10. QTranslatortranslatorQT;
  11. {
  12. QStringListenvironment=QProcess::systemEnvironment();
  13. QStringstr;
  14. boolbFinded=false;
  15. foreach(str,environment)
  16. {
  17. if(str.startsWith("QTDIR="))
  18. {
  19. bFinded=true;
  20. break;
  21. }
  22. }
  23. if(bFinded)
  24. {
  25. str=str.mid(6);
  26. bFinded=translatorQT.load("qt_"+QLocale::system().name(),str.append("/translations/"));
  27. if(bFinded)
  28. app.installTranslator(&translatorQT);
  29. else
  30. qDebug()<<QObject::tr("Can'tfindthetranslationfileforChinese!");
  31. }
  32. else
  33. {
  34. qDebug()<<QObject::tr("PleasesettheenvironmentvariableQTDIR");
  35. }
  36. }
  37. //安装程序自身翻译器
  38. QTranslatortranslatorApp;
  39. {
  40. QStringstrLanguageDir=QCoreApplication::applicationDirPath();
  41. strLanguageDir.append("/Language/");
  42. QStringstrFilePath=QApplication::applicationFilePath();
  43. QStringstrFileName=strFilePath.right(strFilePath.size()-strFilePath.lastIndexOf('/')-1);
  44. strFileName=strFileName.left(strFileName.indexOf('.'));
  45. strFileName.append('_');
  46. strFileName.append(QLocale::system().name());
  47. boolbFinded=translatorApp.load(strFileName,strLanguageDir);
  48. if(bFinded)
  49. app.installTranslator(&translatorApp);
  50. else
  51. {
  52. qDebug()<<QObject::tr("Can'tFindTheTranslation'sFileForChinese!");
  53. }
  54. }
  55. CDialogLogindlg;
  56. returndlg.exec();
  57. }

DialogLogin.h
  1. #pragmaonce
  2. #include<QtGui/QDialog>
  3. classQLineEdit;
  4. classCDialogLogin:publicQDialog
  5. {
  6. Q_OBJECT
  7. public:
  8. CDialogLogin(QWidget*parent=0);
  9. ~CDialogLogin(void);
  10. publicslots:
  11. virtualvoidaccept();
  12. private:
  13. QLineEdit*m_pUsrLineEdit;
  14. QLineEdit*m_pPwdLineEdit;
  15. };

程序中使用了两个QTranslator对象,在app利用函数installTranslator()进行翻译器安装时,并没有拷贝qm文件,而是在需要的时候在qm文件中进行查找。也即是说:QTranslator在load以后,并没有把qm文件中的数据拷贝一份。如果qm在这期间被删除或修改,对程序都是有影响的。扩展开来,QTranslator必须保证要一直有效,如果在函数中定义的局部变量,函数结束后就自动释放掉了,那么翻译工作就不能正常进行。
DialogLogin.cpp

  1. #include"stdafx.h"
  2. #include"DialogLogin.h"
  3. #include<QtGui/QtGui>
  4. CDialogLogin::CDialogLogin(QWidget*parent/*=0*/)
  5. :QDialog(parent)
  6. {
  7. QLabel*pUsrLabel=newQLabel(tr("UserName:"));
  8. QLabel*pPwdLabel=newQLabel(tr("Password:"));
  9. m_pUsrLineEdit=newQLineEdit();
  10. m_pPwdLineEdit=newQLineEdit();
  11. m_pPwdLineEdit->setEchoMode(QLineEdit::Password);
  12. QGridLayout*pGridLayout=newQGridLayout();
  13. pGridLayout->addWidget(pUsrLabel,0,0,1,1);
  14. pGridLayout->addWidget(m_pUsrLineEdit,0,1,1,3);
  15. pGridLayout->addWidget(pPwdLabel,1,0,1,1);
  16. pGridLayout->addWidget(m_pPwdLineEdit,1,1,1,3);
  17. pGridLayout->setSpacing(25);
  18. QPushButton*pBtnOK=newQPushButton(tr("Login"));
  19. QPushButton*pBtnCancel=newQPushButton(tr("Cancel"));
  20. QHBoxLayout*pBtnLayout=newQHBoxLayout();
  21. pBtnLayout->setSpacing(60);
  22. pBtnLayout->addWidget(pBtnOK);
  23. pBtnLayout->addWidget(pBtnCancel);
  24. QVBoxLayout*pDlgLayout=newQVBoxLayout();
  25. pDlgLayout->setMargin(30);
  26. pDlgLayout->addLayout(pGridLayout);
  27. pDlgLayout->addStretch(40);
  28. pDlgLayout->addLayout(pBtnLayout);
  29. pDlgLayout->setSpacing(40);
  30. setLayout(pDlgLayout);
  31. connect(pBtnOK,SIGNAL(clicked()),this,SLOT(accept()));
  32. connect(pBtnCancel,SIGNAL(clicked()),this,SLOT(reject()));
  33. setWindowTitle(tr("Login"));
  34. resize(300,200);
  35. }
  36. CDialogLogin::~CDialogLogin(void)
  37. {
  38. }
  39. voidCDialogLogin::accept()
  40. {
  41. if(m_pUsrLineEdit->text().trimmed()==tr("lcf")&&m_pPwdLineEdit->text().trimmed()==tr("lcf"))
  42. {
  43. QDialog::accept();
  44. }
  45. else
  46. {
  47. QMessageBox::warning(this,tr("Warning"),tr("UserNameorPasswordiswrong!"),QMessageBox::Yes);
  48. m_pUsrLineEdit->setFocus();
  49. }
  50. }

其中英文界面如图:

图1.2英文界面

QT中文乱码与国际化支持第2张
中文界面如图:

图1.3中文界面

QT中文乱码与国际化支持第3张


免责声明:文章转载自《QT中文乱码与国际化支持》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JBOSS未授权访问漏洞复现Unity3D学习笔记(四) 脚本内访问其他对象,组件或脚本成员方法总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java学习总结--1.起源

           javaoo已经学完一段时间了,感觉这些知识没有通过系统的归总,忘记是很容易的。为了不浪费这段学习时间,并且为了以后自己的温故而知新,故抽空出来将javaoo以自己的方式总结一下(不求优美,但求完整)。     尊重原创,转载请注明,哈哈哈。随意啦  一、初识java   1.java起源     网上都是以1995年5月23日sun...

ASP.NET网站实现多语言版本 【转】

一、项目概述      1、目的            利用资源文件解决网站多语言版本的问题,在制作网站的时候,经常会遇到多种语言的版本,早期在asp的系统当中,很多网站开发师都会用传统的方法来开发,就是将同一套程序复制两份,功能是实现了,但往往后期的维护带来很大的麻烦,而在asp.net的时代,做这样的事情,原来是那么的简单.      2、概念    ...

Qt的翻译文件QTranslator不能使用问题总结(原)

笔者今天在自己工程中使用翻译文件,发现没有起作用,反复查找,发现是用宏定义了命名空间,生成.ts文件时,不会加上命名空间,所以生成的.qm文件在实际使用时,会无法找到对应的语句。 如果将宏定义的命名空间修改为普通字符,则没有上述问题。 刚才是namespace MyProject{ 是用#define USNS namespace MyProject{定义...

神经机器翻译(NMT)相关资料整理

作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明。谢谢! 1 简介 自2013年提出了神经机器翻译系统之后,神经机器翻译系统取得了很大的进展。最近几年相关的论文,开源系统也是层出不穷。本文主要梳理了神经机器翻译入门、进阶所需要阅读的资料和论文,并提供了相关链接以及简单的介绍,以及总...

Qt Linguist介绍

简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具。发布者、翻译者和开发者可以使用这款工具来完成他们的任务。 发布者:承担了全面发布应用程序的责任。通常,他们协调开发者和翻译者的工作,可以使用lupdate工具同步源代码,进行翻译,使用lrelease同步工具为发布应用程序创建运行时使用的翻译文件。 翻译者:可以使用Qt Li...

19. Vue+i18n 实现多语言翻译

1. npm 安装   npm install vue-i18n 2. src/assets文件夹下穿件文件夹i18n,   然后再在i18n文件夹中创建langs文件夹和i18n.js文件,   最后再在langs文件夹下创建相应语言文件,我这里是cn.js中文文件,en.js英文文件。   如图所示(相应文件的代码在下面):    3.main.js...