• Qt入门(12)——Qt国际化


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


    有的情况下,国际化很简单,例如,使一个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.
    Copying: %3")
                            .arg(done)
                            .arg(total)
                            .arg(current_file) );
        }


  • 相关阅读:
    仅当使用了列的列表并且 IDENTITY_INSERT 为 ON 时,才能为表'SpeType'中的标识列指定显式值
    SQL Server 创建作业系列问题
    常用WebService收集
    SQL Server中调用WebService的实例
    本地时间与格林威治时间相互转换
    $route和$router的区别?
    超详细的Canal入门,看这篇就够了!
    linux 安装redis 完整步骤
    什么是JSON
    The expression 'list' evaluated to a null value
  • 原文地址:https://www.cnblogs.com/new0801/p/6176888.html
Copyright © 2020-2023  润新知