应用的国际化就是使应用成为能被非本国的人使用的过程。

有的情况下,国际化很简单,例如,使一个US应用可被Australian或者British用户理解,工作可能少于几个拼写修正。但是使一个US应用可以被Japanese用户使用,或者一个Korean应用可被German用户使用,就会需要软件不仅工作于不同语言下,还要使用不同的输入技术、字符编码和表达习惯。

对所有用户可见的文本使用QString
既然QString内部就使用Unicode编码,那么使用常见的文本处理手段,就可以透彻地处理世界上的每种语言。同时,既然所有向用户呈现文本的Qt函数都把QString作为参数,也就没有了char*到QString的转换的时间开销。
在“程序员空间”(例如QObject的名称和文件格式文本)的字符串不需要使用QString;传统的char*或者QCString类就够用了。
你不大可能注意到你在使用Unicode;QString和QChar就如同早期版本的传统C中的粗糙的const char*和char。

对所有文字形式的文本使用tr()
无论你的程序在哪里对将会呈现给用户的文本使用了"quoted text",要确保它被QApplication::translate()函数处理过。其实做到这一点只需要使用QObject::tr()。例如,假设LoginWidget是QWidget的一个子类:

    LoginWidget::LoginWidget()
{
QLabel *label = new QLabel( tr("Password:"), this );
...
}

这就解决了你可能要写的用户可见的字符串的99%。
如果这些quoted text不是在QObject子类的成员函数中,可以使用一个适当的类的tr()函数,或者直接使用QApplication::translate()函数:

    void some_global_function( LoginWidget *logwid )
{
QLabel *label = new QLabel(
LoginWidget::tr("Password:"), logwid );
} void same_global_function( LoginWidget *logwid )
{
QLabel *label = new QLabel(
qApp->translate("LoginWidget", "Password:"),
logwid );
}

如果你需要不在函数里的可翻译文本,有两个宏可以帮忙:QT_TR_NOOP()和QT_TRANSLATE_NOOP()。它们仅仅标示出文本,以便于被下面描述的lupdate工具提取。宏扩展为只是文本(没有上下文)。

QT_TR_NOOP()的例子:

    QString FriendlyConversation::greeting( int greet_type )
{
static const char* greeting_strings[] = {
QT_TR_NOOP( "Hello" ),
QT_TR_NOOP( "Goodbye" )
};
return tr( greeting_strings[greet_type] );
}
QT_TRANSLATE_NOOP()的例子: static const char* greeting_strings[] = {
QT_TRANSLATE_NOOP( "FriendlyConversation", "Hello" ),
QT_TRANSLATE_NOOP( "FriendlyConversation", "Goodbye" )
}; QString FriendlyConversation::greeting( int greet_type )
{
return tr( greeting_strings[greet_type] );
} QString global_greeting( int greet_type )
{
return qApp->translate( "FriendlyConversation",
greeting_strings[greet_type] );
}

如果你使用定义的宏QT_NO_CAST_ASCII编译你的软件,从而关闭了从const char*到QString的自动转换,你很可能会捕捉到你错过的字符串。更多信息参见QString::fromLatin1()。关闭这个转换会使编程有点儿麻烦。

如果你的源码语言使用Latin-1之外的字符集,你会发现QObject::trUtf8()比QObject::tr()更好用,因为tr()依赖于QApplication::defaultCodec(),这使它比QObject::trUtf8()更脆弱。

对于加速键值(Accelerator value)使用QKeySequence()

加速键值,例如Ctrl+Q或者Alt+F,也需要翻译。 如果你的应用给“Quit”直接编码(hardcode)为CTRL+Key_Q,翻译者就不能重载它了。正确的习惯用法是

    QPopupMenu *file = new QPopupMenu( this );
file->insertItem( tr("&Quit"), this, SLOT(quit()),
QKeySequence(tr("Ctrl+Q", "File|Quit")) );

对简单参数使用QString::arg()

对于国际化的文本,在字符串中类似printf()风格的插入参数一般是不好的选择,因为有时候有必要在翻译时改变参数的顺序。不管怎样,QString::arg()函数为参数替换提供了一种简单的途径:

    void FileCopier::showProgress( int done, int total,
const QString& current_file )
{
label.setText( tr("%1 of %2 files copied.\nCopying: %3")
.arg(done)
.arg(total)
.arg(current_file) );
}

Qt入门(12)——Qt国际化的更多相关文章

  1. Qt入门学习——Qt 5 帮助文档的使用

    Qt入门学习——Qt 5 帮助文档的使用 学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口,图形接口的接口可以用海量来形容,常用的我们可能能记住,其它的真的没有必 ...

  2. Qt入门——使用QT+VS2008开发windows应用程序

    1.文件->新建->项目 Qt4 Projects 右边已安装模板当中选择At Application. 确定 2.选择需要使用的QT库 下一步 3. “class name”:指定类的名 ...

  3. 第15.12节PyQt(Python+Qt)入门学习:可视化设计界面组件布局详解

    一.引言 在Qt Designer中,在左边部件栏的提供了界面布局相关部件,如图: 可以看到共包含有四种布局部件,分别是垂直布局(Vertical Layout).水平布局(Horizontal La ...

  4. Qt入门之基础篇(1):Qt4及Qt5的下载与安装

    转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...

  5. Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装

    转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...

  6. Qt入门(1)——初识Qt

    Qt是一个跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器.Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta ...

  7. Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

    转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...

  8. Qt入门之基础篇(三):掌握Qt4的静态编译基本方法

    转载载请注明出处:CN_Simo. 导语: 前两章都提到过“静态编译”(Static Compilation),在Windows下一次静态编译差不多需要长达三个小时才能完成,而且还非常容易由于各种原因 ...

  9. QT 5.12 安装MinGW 7.3.0 32bit

    一.下载MinGW 7.3.0 32bit for QT 5.12 链接:https://pan.baidu.com/s/1IKDhvxEbKIgmWyQQhpdnTw提取码:ubxc 二.解压缩并将 ...

  10. 1.1 Qt入门

    学习Qt的前提是学好C++. 我刚入门Qt,打算趁着暑假2个月时间来学习<C++ GUI Qt 4>这本书. 现在有Qt4和Qt5,似乎很多公司都还是在使用Qt4,所以我也就选择了学习Qt ...

随机推荐

  1. Android 6.0 Changes

    原文链接:http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html 伴随着新特性和功能,Andr ...

  2. Java基础知识强化之集合框架笔记26:LinkedList的特有功能

    1. LinkedList的特有功能: (1)添加功能  public  void  addFirst(Object   e)  public  void  addLast(Object   e) ( ...

  3. Configuring Robolectric

    There are numerous ways to customize how Robolectric behaves at runtime. Config Annotation The prima ...

  4. URL编码 URLEncoder 示例

    2016-12-27 对字符编码时的规则 通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据. 对于Url来说,之所以要进行编码,一个是因为Url中有些字符 ...

  5. DOM - nodeType 的取值

    DOM 中,共有 12 中不同类型的节点,nodeType 的取值以数值表示. 节点类型 描述 子节点 1  Element  表示元素.  Element, Text, Comment, Proce ...

  6. sql根据'/'截取最后的字符串

    filpath字段值:/DataFile/UpLoad/Logo/NoPhoto.jpg select filpath,REVERSE((SUBSTRING(REVERSE(FilPath),0,CH ...

  7. SQL server 如何附加、还原、分离、备份数据库文件

    No1 : 附加 No2 : 还原            一.(需要 .bak文件)首先建立一个数据库,数据库名称与你的.bak文件名要相同. 当然.这时候的这个数据库还是空的,需要还原回去数据.右键 ...

  8. vim备注

    ① 用户path生效 在~/.bashrc中修改path,在~/.profile中source bashrc ② secureCRT着色方案 底色RGB:43 43 43 前景色RGB:221 221 ...

  9. iOS 中如何监测某段代码运行的时间

    在iOS里面有时间涉及到网络请求,有时间涉及到数据库的查询,我们需要计算该段代码的效率, 以及执行时间方面的问题,为此,可以使用下面方法: double a = CFAbsoluteTimeGetCu ...

  10. Java反射学习(java reflect)(三)

    五.方法指针 据说JAVA方法指针的出现,是作为反射包的附产品 : 使用原理:Invoke被允许调用包装在当前Method对象的方法: 第一个参数为隐式参数,可用null,第二个参数为显示参数. Ex ...