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.8   edited Jan 11 14:37 $
    **
    ** Copyright (C) 1992-2007 Trolltech ASA.  All rights reserved.
    **
    ** This file is part of an example program for TQt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #ifndef MYWIDGET_H
    #define MYWIDGET_H

    #include <ntqmainwindow.h>
    #include <ntqstring.h>

    class MyWidget : public TQMainWindow
    {
        TQ_OBJECT

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

    signals:
        void closed();

    protected:
        void closeEvent(TQCloseEvent*);

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

    #endif

Implementation:

    /****************************************************************************
    ** $Id: qt/mywidget.cpp   3.3.8   edited Jan 11 14:37 $
    **
    ** Copyright (C) 1992-2007 Trolltech ASA.  All rights reserved.
    **
    ** This file is part of an example program for TQt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #include <ntqbuttongroup.h>
    #include <ntqradiobutton.h>
    #include <ntqlabel.h>
    #include <ntqlistbox.h>
    #include <ntqcombobox.h>
    #include <ntqlabel.h>
    #include <ntqhbox.h>
    #include <ntqvbox.h>
    #include <ntqaccel.h>
    #include <ntqpopupmenu.h>
    #include <ntqmenubar.h>
    #include <ntqstatusbar.h>
    #include <ntqapplication.h>

    #include "mywidget.h"

    MyWidget::MyWidget( TQWidget* parent, const char* name )
            : TQMainWindow( parent, name )
    {
        TQVBox* central = new TQVBox(this);
        central->setMargin( 5 );
        central->setSpacing( 5 );
        setCentralWidget(central);

        TQPopupMenu* file = new TQPopupMenu(this);
        file->insertItem( tr("E&xit"), tqApp, TQ_SLOT(quit()),
                TQAccel::stringToKey(tr("Ctrl+Q")) );
        menuBar()->insertItem( tr("&File"), file );

        setCaption( tr( "Internationalization Example" ) );

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

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

        TQButtonGroup* gbox = new TQButtonGroup( 1, TQGroupBox::Horizontal,
                                          tr( "View" ), central );
        (void)new TQRadioButton( tr( "Perspective" ), gbox );
        (void)new TQRadioButton( tr( "Isometric" ), gbox );
        (void)new TQRadioButton( tr( "Oblique" ), gbox );

        initChoices(central);
    }

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

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

    void MyWidget::closeEvent(TQCloseEvent* e)
    {
        TQWidget::closeEvent(e);
        emit closed();
    }

Main:

    /****************************************************************************
    ** $Id: qt/main.cpp   3.3.8   edited Jan 11 14:37 $
    **
    ** Copyright (C) 1992-2007 Trolltech ASA.  All rights reserved.
    **
    ** This file is part of an example program for TQt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #include <ntqapplication.h>
    #include <ntqtranslator.h>
    #include <ntqfileinfo.h>
    #include <ntqmessagebox.h>
    #include <ntqcheckbox.h>
    #include <ntqvbox.h>
    #include <ntqlayout.h>
    #include <ntqbuttongroup.h>
    #include <ntqpushbutton.h>
    #include <ntqsignalmapper.h>
    #include <ntqtextcodec.h>
    #include <stdlib.h>

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

    #include "mywidget.h"

    //#define USE_I18N_FONT

    class TQVDialog : public TQDialog {
    public:
        TQVDialog(TQWidget *parent=0, const char *name=0, bool modal=false,
                 WFlags f=0) : TQDialog(parent,name,modal,f)
        {
            TQVBoxLayout* vb = new TQVBoxLayout(this,8);
            vb->setAutoAdd(true);
            hb = 0;
            sm = new TQSignalMapper(this);
            connect(sm,TQ_SIGNAL(mapped(int)),this,TQ_SLOT(done(int)));
        }
        void addButtons( const TQString& cancel=TQString::null,
                        const TQString& ok=TQString::null,
                        const TQString& mid1=TQString::null,
                        const TQString& mid2=TQString::null,
                        const TQString& mid3=TQString::null)
        {
            addButton(ok.isNull() ? TQObject::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() ? TQObject::tr("Cancel") : cancel, 0);
        }

        void addButton( const TQString& text, int result )
        {
            if ( !hb )
                hb = new TQHBox(this);
            TQPushButton *c = new TQPushButton(text, hb);
            sm->setMapping(c,result);
            connect(c,TQ_SIGNAL(clicked()),sm,TQ_SLOT(map()));
        }

    private:
        TQSignalMapper *sm;
        TQHBox *hb;
    };

    MyWidget* showLang(TQString lang)
    {

        static TQTranslator *translator = 0;

        tqApp->setPalette(TQPalette(TQColor(220-rand()%64,220-rand()%64,220-rand()%64)));

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

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

    int main( int argc, char** argv )
    {
        TQApplication 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

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

        if ( argc != 2 || lang == "all" ) {
            TQVDialog dlg(0,0,true);
            TQCheckBox* qmb[sizeof(qm)/sizeof(qm[0])];
            int r;
            if ( lang == "all" ) {
                r = 2;
            } else {
                TQButtonGroup *bg = new TQButtonGroup(4,TQt::Vertical,"Choose Locales",&dlg);
                TQString loc = TQTextCodec::locale();
                for ( int i=0; qm[i]; i++ ) {
                    qmb[i] = new TQCheckBox((const char*)qm[i],bg);
                    qmb[i]->setChecked( loc == qm[i] );
                }
                dlg.addButtons("Cancel","OK","All");
                r = dlg.exec();
            }
            if ( r ) {
                TQRect screen = tqApp->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 );
                        TQObject::connect(w, TQ_SIGNAL(closed()), tqApp, TQ_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 {
            TQString lang = argv[1];
            TQWidget* m = showLang(lang);
            app.setMainWidget( m );
            m->setCaption("TQt 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.