Home | All Classes | Main Classes | Annotated | Grouped Classes | Functions |

# Internationalization

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.3.5   edited Aug 31 12:17 $
    **
    ** Copyright (C) 1992-2005 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.3.5   edited Aug 31 12:13 $
    **
    ** Copyright (C) 1992-2005 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.3.5   edited Aug 31 12:13 $
    **
    ** Copyright (C) 1992-2005 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() ? QObject::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() ? QObject::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[]=
            { "ar", "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 ) {
                QRect screen = qApp->desktop()->availableGeometry();
                bool tight = screen.width() < 1024;
                int x=screen.left()+5;
                int y=screen.top()+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.