首页 > 作文

Qt 多语言程序设计的实现

更新时间:2023-04-04 13:28:53 阅读: 评论:0

目录
简介1.tr()函数使用2.生成语言翻译文件3.使用 qt linguist 翻译 ts 文件4.调用翻译文件改变界面语言

简介

有些软件需要开发多语言界面版本,如中文版和英文版,并且在软件里可以方便地切换界面语言。qt为多语言界面提供了很好的支持,使用qt的一些规则和工具,可以很方便地为应用程序开发提供多界面支持。

使用qt 开发多语言界面应用程序,主要包括以下几个步骤 。

(1)在程序设计阶段,程序代码中每 一 个用户可见的字符串都用 tr()函数封装,以便 qt 提取界面字符串用千生成翻译资源文件。用 ui 设计器可视化设计窗体时统一用 一种语言,如汉语 。

(2) 在项目配置文件 (.pro 文件)中设置需要导出的翻译文件 (.ts 文件)名称,使用lupdate工具扫描项目文件中需要翻译的字符串,并生成翻译文件 。
(3) 使用 qt 的 linguist 程序打开生成的翻译文件,将程序中的字符串翻译为需要的语 言 ,如将所有中文字符串翻译为英文 。
( 4) 使用 lrelea 工具编译翻译好的翻译文件, 生成更为紧凑的 “. qm” 文件 。
( 5) 在应用程序中用 qtranslator 调用不同的 ” .qm” 文件,实现不同的语 言界面。

1.tr()函数使用

为了让 qt 能自动提取程序中用户可见的字符串,对千每个字符串都需要使用 tr()函数封装 。tr()是 qobject 的 一个静态函数 ,在使用了 q—ob五一图图片ject 宏定义的类或 qobject 的子类中,都可以直接使用 tr()函数,否则需要使用 qobject::tr()进行调用。或者在类定义中用 q_declare_tr_functions 宏把 tr()函数添加到类中之后 ,再直接调用 tr()函数 。

tr()函数的定义

qstring qobject::tr(const char *sourcetext, const char *disambiguation=q_nullptr,int n = -1);

其中, sourcetext 是源字符串 disambiguation 是为翻译者提供额外信息的字符串,用于对 些容易混淆的地方作说明,内容如下:

labcellpos = new qlabel(tr( 当前单元格:"), this);qmessagebox::information(this, tr("信息"), tr( "信息提示?"), qmessagebox::yes) ;qstring strl= tr("左右", "大约的意思");qstring str2 = tr("左右", "掌握、控制的意思");

使用 tr()函数,需要注意以下事项。

① 尽量使用常量字符串 不要使用字符串变量。在 tr()函数中应直接传递字符串常量,而不是用变星传递字符串,如下面的代码使用了字符串变量,使用lupdate 工具提取项目中的 字符串时 将不能提取“不能删除 这个好难字符串。

char *errorstr="不能删除记录";qstring str2=tr(errorstr); 

②使用字符串变量时需要用 qt_tr_noop() 宏进行标记 。若要 tr()函数中使用字符串变量 需要在定义字符串的地方用 qt_tr_noop() 宏进行标记,这在使用字符串数组时比较有用。 例如:

canst char *cities[4]={qt_tr_noop("beijing"),    qt_tr_noop(" shanghai"),     qt_tr_noop("qingda三羧酸循环o"),     qt_tr_noop("wuhan")};  for (int i=o; i<4; i++) {    combobox->additem(tr(cities[i])) ;}

③tr()不能使用拼接的动态字符串。 tr()不能使用拼接的动态字符串,例如,下面的用法是错误的:

labcellpos->ttext(tr("第") + qstring::number(current.row())+ tr("行");

正确的方式如下:

labcellpos->ttext(tr(“第%1行”).arg (current.row()));

翻译的字符串是“第%1行 ”, 然后再用 qstring 的arg() 去替换占位符 “%1 “的内容。

④qt_no_cast_from_ ascii 的作用。在一个需要翻译为多语言的应用程序中,如果编写 程序时忘了对某个字符串使用 tr() 函数, lupdate 生成的翻译资源文件就会遗漏这个字符串。 为了避免这种疏忽错误,可以在项目配置文件(. pro 文件)中添加如下的定义:

defines+= qt_no_cast_from_ ascii

这样在编译时,会禁止从 con char* 到qstring 的隐式转换 ,强制每个字符串都必须使用 tr()或 qlatinlstring()封装, 避免出现遗漏未翻译的字符串。

2.生成语言翻译文件

要生成多语言界面相关的翻译文件,除了之前所说的在对每个字符串 都使用 tr()函数封装之外,还需要在项目配置文件 (.pro 文件)中使用 translations 定义语言翻译文件 (. ts 文件), 并使用 lupdate 工具生成语言翻译文件。

在项目的配置文件(*.pro)中增加如下的设置语句:

translations += lang_chs.ts \

lang_eng.ts

在项目设计期间,任何时候都可以使用lupdate 工具生成或更新翻译文件,方法是单击qt creator 主菜单的 “tools”- “external” – “qt 语言家”- “update translations(lupdate)” 菜单项, 若项目的源程序目录下没有lang_chs.ts、lang_eng.ts (具体名称可变)这两个文件,就会自动生成,如果 文件已经存在,则会更新这两个文件的内容。

3.使用 qt linguist 翻译 ts 文件

生成的 lang_chs.ts、lang_eng.ts 文件内包含了项目源程序和 ui 界面里的所有字符 串,使用 qt linguist 可以将这些字符串翻译为需要的语言版本。在 qt 安装后的程序组里可以找到 qt linguist 软件。

lang_chs.ts 是中文界面的翻译文件,由于源程序的界面就是用中文设计的,所以无需再 翻译 lang_eng.ts 是英文翻译文件,需要将提取的所有中文字符串翻译为英文。

在linguist 软件中打开文件lang_eng.ts, 当第一次打开一个 ts 文件时, linguist 会出现如下图所示的语言设置对话框,用千设置目标语言和所在国家和地区。这个对话框也可以通过 linguist 主菜单的“编辑“一“翻译文件设置”菜单项调出。lang_eng.ts 是用于英文界如何填志愿面的翻译文件,所以选择语言 “english”, 国家/地区可选择 “unitedstates”。

打开 lang_eng.ts 文件后的 linguist 软件界面如下图所示。左侧”上下文”列表里列出了项目中的所有窗口或类, 这个项目有4个窗口。”字符串”列表里列出了从项目的 ui 窗口和代码文件中提取的字符串,右侧“短语和表单”会显 示窗口界面的预览或字符串在源程序中出现的代码段。

在”字符串”列表中选择一个源文后,在下方会出现译 文编辑框,在此填写字符串对应的英文译文。 linguist 可以 同时打开项目的多个 ts 文件,在选中一个源文后,在下方会 出现对应的多个语 言的译文编辑框 ,可以同时翻译为多个语言版本。

4.调用翻译文件改变界面语言

4.1. 生成 qm 文件

使用 linguist 软件编辑翻译文件,将所有字符串都翻译后,在 qt creator 中单击主菜单项 “tools” — “external” — “qt 语言家”– “relea translations(lrelea) “,会在项目源程序目录 下生成与 ts 文件对应的 qm 文件,这是更为紧凑的翻译文件。 会生成lang_chs.qm和 lang_eng.qm。

2. 项目启动时设置界面语言

使用 qtranslator 类设置界面的不同语言版本,需在应用程序启动时设置界面语言翻译文件, 即在 main()函数中进行处理 。项目 在main.cpp 的代码如下:

#include "mainwindow.h"#include <qapplication> #include <qtranslator> #include <qttings>  qtranslator *trans=null ; qstring readtting();  int main (int argc , char *argv[]) {     qapplication app(argc, argv);     trans = new qtranslator;      qstring curlang=readtting (); //读取语言设置     if (curlang== "en")     {        trans->load ("lang_eng.qm");      }    el     {        trans->load("lang_chs.qm");     }     app.installtrans有助于学习的音乐lator(trans);      mainwindow w;     w.show();     return app.exec(); } qstring readtting() {    //注册表读取上 次设置的语言    qstring organization = "language";     qstring appname= "test";     qttings ttings(organization, appname) ;     qstri n g language=ttings.value ("language"," en").tostring();     return language ; }

这里定义了 个全局变 trans, main.cpp 里定义了个函数 readtting(), 用千从注册表里读取上次设置的界面语言版本。注册表里数据的读取和写入使用到 qttings 类,在main()函数中,创建 qtranslator 类的对象 trans 后,调用 readtting()函数从注册表里读取 上次的语言版本,若为 “en” ,就用 load()函数载入编译后的英文翻译文件 lang_eng.qm, 否则就载入中文翻译文件lang_chs.qm ,再执行 app.installtranslator(trans) ,就可以给应用程序安装翻译器,实现需要的界面版本。

3. 动态切换语言

在软件运行时可以动态切换语 ,即 启软件就可以切换界面语言,测试程序的主窗 口上有“中文”和 “english” 两个工具栏按钮,用千实现中文和英文界面的切换。 下面是这两个 按钮的响应代码:

void mainwindow::on_actlang_cn_triggered() {//中文界面     qapp->removetranslator(trans);         if (trans)    {        delete trans;        trans = null;    }      trans = new qtranslator;     trans->load("lang_chs.qm");     qapp->installtranslator(trans);      //这一步很关键    ui->retranslateui(this);  //刷新界面字符串     qttings ttings("wwb-qt", "test");     ttings.tvalue ("language ", "cn") ; } void maindow::on_actlang_en_triggered(){//英文界面    qapp->removetranslator(trans) ;     if (trans)    {        delete trans;        trans = null;    }      trans=new qtranslator;     trans->load( " sampl6_l_en.qm");     qapp->installtranslator(trans) ;         //这一步很关键    ui->retranslateui(this) ; //刷新界面字符串    qttings ttings( "wwb-qt","test");     ttings.tvalue ("language", "en");}

一个应用程序只能加载一个翻译器 ,因为在 main()函数里已 经加载了一个翻译器 ,所以需 要先移除当前的翻译器,才能重新创建新的翻译器,加载翻译文件,并为应用程序重新加载新翻译器。

完成这些后还必须调用 ui的retranslateui() 函数来刷新界面。

retranslateui()函数是在窗口的 ui _” 头文件中自动生成的 ,如 mainwindow. ui 主窗口对应的 头文件 ui _mainwindow.h 里就有函数 retranslateui(),这个函数使用 qapplication::translate() 函数将 所有界面字符串进行翻译 ,类似于 tr()函数的功能。

窗口在被创建时会自动调用此 retranslateui() 函数,在程序运行中动态切换界面语言时,必须 手工调用此 retranslateui() 函数,才可以立即更新界面语言。

若不是用 designer 设计的窗口,而是完全由代码实现的窗口界面,需要专门设计一个 retranslateui()函数,将所有界面字符串用 tr() 函数进行翻译,并在动态切换语言时调用此函数。 很显然 这样做比较麻烦,特别是当软件比较大窗口非常多时。所以,大型的软件在重新设置语言版本后 一般要求重新启动软件才生效 ,在程序启动时根据上次的设置加载一次翻译器即可。

按钮响应代码的最后是将设置的语言版本写入本地配置文件 ,以便下次程序启动时自动加载相应的语言。

到此这篇关于qt 多语言程序设计的实现的文章就介绍到这了,更多相关qt 多语言程序设计内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 13:28:52,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/0446a09ad602c206b1db94308c95169d.html

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

本文word下载地址:Qt 多语言程序设计的实现.doc

本文 PDF 下载地址:Qt 多语言程序设计的实现.pdf

标签:字符串   文件   函数   界面
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图