返回介绍

Internationalization

发布于 2019-10-04 14:57:58 字数 8561 浏览 1001 评论 0 收藏 0

This example shows how to internationalize applications. Start it with

# i18n de

to get a german version and with

# i18n en

to get the english version.

Refer also to the internationalization documentation.


Header file:

/****************************************************************************
** $Id:  qt/mywidget.h   3.0.5   edited Oct 12 2001 $
**
** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
**
** This file is part of an example program for Qt.  This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <qmainwindow.h>
#include <qstring.h>

class MyWidget : public QMainWindow
{
    Q_OBJECT

public:
    MyWidget( QWidget* parent=0, const char* name = 0 );

signals:
    void closed();

protected:
    void closeEvent(QCloseEvent*);

private:
    static void initChoices(QWidget* parent);
};

#endif


Implementation:

/****************************************************************************
** $Id:  qt/mywidget.cpp   3.0.5   edited Oct 12 2001 $
**
** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
**
** This file is part of an example program for Qt.  This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/

#include <qbuttongroup.h>
#include <qradiobutton.h>
#include <qlabel.h>
#include <qlistbox.h>
#include <qcombobox.h>
#include <qlabel.h>
#include <qhbox.h>
#include <qvbox.h>
#include <qaccel.h>
#include <qpopupmenu.h>
#include <qmenubar.h>
#include <qstatusbar.h>
#include <qapplication.h>

#include "mywidget.h"

MyWidget::MyWidget( QWidget* parent, const char* name )
        : QMainWindow( parent, name )
{
    QVBox* central = new QVBox(this);
    central->setMargin( 5 );
    central->setSpacing( 5 );
    setCentralWidget(central);

    QPopupMenu* file = new QPopupMenu(this);
    file->insertItem( tr("E&xit"), qApp, SLOT(quit()),
            QAccel::stringToKey(tr("Ctrl+Q")) );
    menuBar()->insertItem( tr("&File"), file );

    setCaption( tr( "Internationalization Example" ) );

    QString l;
    statusBar()->message( tr("Language: English") );

    ( void )new QLabel( tr( "The Main Window" ), central );

    QButtonGroup* gbox = new QButtonGroup( 1, QGroupBox::Horizontal,
                                      tr( "View" ), central );
    (void)new QRadioButton( tr( "Perspective" ), gbox );
    (void)new QRadioButton( tr( "Isometric" ), gbox );
    (void)new QRadioButton( tr( "Oblique" ), gbox );

    initChoices(central);
}

static const char* choices[] = {
    QT_TRANSLATE_NOOP( "MyWidget", "First" ),
    QT_TRANSLATE_NOOP( "MyWidget", "Second" ),
    QT_TRANSLATE_NOOP( "MyWidget", "Third" ),
    0
};

void MyWidget::initChoices(QWidget* parent)
{
    QListBox* lb = new QListBox( parent );
    for ( int i = 0; choices[i]; i++ )
        lb->insertItem( tr( choices[i] ) );
}

void MyWidget::closeEvent(QCloseEvent* e)
{
    QWidget::closeEvent(e);
    emit closed();
}


Main:

/****************************************************************************
** $Id:  qt/main.cpp   3.0.5   edited Dec 6 2001 $
**
** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
**
** This file is part of an example program for Qt.  This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/

#include <qapplication.h>
#include <qtranslator.h>
#include <qfileinfo.h>
#include <qmessagebox.h>
#include <qcheckbox.h>
#include <qvbox.h>
#include <qlayout.h>
#include <qbuttongroup.h>
#include <qpushbutton.h>
#include <qsignalmapper.h>
#include <qtextcodec.h>
#include <stdlib.h>

#if defined(Q_OS_UNIX)
#include <unistd.h>
#endif

#include "mywidget.h"

//#define USE_I18N_FONT

class QVDialog : public QDialog {
public:
    QVDialog(QWidget *parent=0, const char *name=0, bool modal=FALSE,
             WFlags f=0) : QDialog(parent,name,modal,f)
    {
        QVBoxLayout* vb = new QVBoxLayout(this,8);
        vb->setAutoAdd(TRUE);
        hb = 0;
        sm = new QSignalMapper(this);
        connect(sm,SIGNAL(mapped(int)),this,SLOT(done(int)));
    }
    void addButtons( const QString& cancel=QString::null,
                    const QString& ok=QString::null,
                    const QString& mid1=QString::null,
                    const QString& mid2=QString::null,
                    const QString& mid3=QString::null)
    {
        addButton(ok.isNull() ? tr("OK") : ok, 1);
        if ( !mid1.isNull() ) addButton(mid1,2);
        if ( !mid2.isNull() ) addButton(mid2,3);
        if ( !mid3.isNull() ) addButton(mid3,4);
        addButton(cancel.isNull() ? tr("Cancel") : cancel, 0);
    }

    void addButton( const QString& text, int result )
    {
        if ( !hb )
            hb = new QHBox(this);
        QPushButton *c = new QPushButton(text, hb);
        sm->setMapping(c,result);
        connect(c,SIGNAL(clicked()),sm,SLOT(map()));
    }

private:
    QSignalMapper *sm;
    QHBox *hb;
};

MyWidget* showLang(QString lang)
{

    static QTranslator *translator = 0;

    qApp->setPalette(QPalette(QColor(220-rand()%64,220-rand()%64,220-rand()%64)));

    lang = "mywidget_" + lang + ".qm";
    QFileInfo fi( lang );

    if ( !fi.exists() ) {
        QMessageBox::warning( 0, "File error",
                              QString("Cannot find translation for language: "+lang+
                                      "\n(try eg. 'de', 'ko' or 'no')") );
        return 0;
    }
    if ( translator ) {
        qApp->removeTranslator( translator );
        delete translator;
    }
    translator = new QTranslator( 0 );
    translator->load( lang, "." );
    qApp->installTranslator( translator );
    MyWidget *m = new MyWidget;
    m->setCaption("Qt Example - i18n - " + m->caption() );
    return m;
}

int main( int argc, char** argv )
{
    QApplication app( argc, argv );

    const char* qm[]=
        { "cs", "de", "el", "en", "eo", "fr", "it", "jp", "ko", "no", "ru", "zh", 0 };

#if defined(Q_OS_UNIX)
    srand( getpid() << 2 );
#endif

    QString lang;
    if ( argc == 2 )
        lang = argv[1];

    if ( argc != 2 || lang == "all" ) {
        QVDialog dlg(0,0,TRUE);
        QCheckBox* qmb[sizeof(qm)/sizeof(qm[0])];
        int r;
        if ( lang == "all" ) {
            r = 2;
        } else {
            QButtonGroup *bg = new QButtonGroup(4,Qt::Vertical,"Choose Locales",&dlg);
            QString loc = QTextCodec::locale();
            for ( int i=0; qm[i]; i++ ) {
                qmb[i] = new QCheckBox((const char*)qm[i],bg);
                qmb[i]->setChecked( loc == qm[i] );
            }
            dlg.addButtons("Cancel","OK","All");
            r = dlg.exec();
        }
        if ( r ) {
            bool tight = qApp->desktop()->screen()->width() < 1024;
            int x=5;
            int y=25;
            for ( int i=0; qm[i]; i++ ) {
                if ( r == 2 || qmb[i]->isChecked() ) {
                    MyWidget* w = showLang((const char*)qm[i]);

                    if( w == 0 ) exit( 0 );
                    QObject::connect(w, SIGNAL(closed()), qApp, SLOT(quit()));
                    w->setGeometry(x,y,197,356);
                    w->show();
                    if ( tight ) {
                        x += 8;
                        y += 8;
                    } else {
                        x += 205;
                        if ( x > 1000 ) {
                            x = 5;
                            y += 384;
                        }
                    }
                }
            }
        } else {
            exit( 0 );
        }
    } else {
        QString lang = argv[1];
        QWidget* m = showLang(lang);
        app.setMainWidget( m );
        m->setCaption("Qt Example - i18n");
        m->show();
    }

#ifdef USE_I18N_FONT
    memorymanager->savePrerenderedFont(font.handle(),FALSE);
#endif

    // While we run "all", kill them all
    return app.exec();

}

See also Examples.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文