Sprache zur Programmlaufzeit ändern

Alles rund um die Programmierung mit Qt
Antworten
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Sprache zur Programmlaufzeit ändern

Beitrag von 24dan »

Hallo ich habe vor über einen Eigenschaftsmenü/Sprache
dem Benutzer die Möglichkeit zur Änderung der Sprache für die Menüführung ändern zu lassen.

Hierzu habe ich hinter einen Menupunkt /sprache:

Code: Alles auswählen

stuff...

	m = new QMenuBar( this, tr("Dateimenu") );

stuff...

	Q3PopupMenu * property = new Q3PopupMenu();
	Q_CHECK_PTR( property );
	m->insertItem( tr("&Eigenschaften"), property );
	int propertyID = property->insertItem( tr("&Sprache"),   this, SLOT(language()),   Qt::ALT+Qt::Key_L );

... die Funktion language() hinterlegt.

Code: Alles auswählen


void Editor::language()
{
        QStringList items;
	int language = 99;
        items << tr("Deutsch") << tr("English") << tr("France") << tr("Spanish");

        bool ok;
        QString item = QInputDialog::getItem(this, tr("Sprache..."),
                                             tr("Ihre Wahl ist:"), items, 0, false, &ok);
        if (ok && !item.isEmpty());
			e->setText(item);
			
		language = items.indexOf(item, 0);
		QString str = QString::number(language, 10); 
		e->setText(str);

		QTranslator translator;
//		if(language==1) //mit entsprechendem Item wird die *.qm datei geladen
	    translator.load(QString("adler_en"),".");
        qApp->installTranslator(&translator);
}
Die Funktion befindet sich in einer source datei für die Funktionen. In meinem main ist die Klasse:

Code: Alles auswählen


    QApplication a( argc, argv );

hinterlegt.
Ich vermute mal dass ich einen Pointer von dem Objekt "a" besorgen muss?!?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Es muss auf jeden Fall eine Abfrage rein, ob translator.load() erfolgreich war. Wenn ja, dann musst Du erst den alten Translator rauswerfen, bevor Du einen Neuen installierst.

Code: Alles auswählen

	app->removeTranslator(currentTranslator);
	app->installTranslator( newTranslator );
Ich glaub es gibt immer noch keine Möglichkeit an einen Pointer auf den aktuellen Translator zu kommen. Den musst Du dir also schon beim installieren merken.
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Ja danke so ähnlich habe ich das auch in einem anderem Forum gefunden und folgendes hat jetzt geklappt:

Code: Alles auswählen

QTranslator *translator = new QTranslator();
Ich habe jetzt einen neuen Translator erstellt.
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Blödsinn damit habe ich jedoch noch keinen Wechsel von tranlator_1 zu translator_2.

Also im meiner main habe ich jetzt einen Translator erstellt:

Code: Alles auswählen


int main( int argc, char **argv )
{
    QApplication a( argc, argv );
	
    QTranslator translator;
//    translator.load(QString("adler_de"),".");
	a.installTranslator(&translator);
    bool isSmall =  qApp->desktop()->size().width() < 450
                  || qApp->desktop()->size().height() < 450;

    int i;
    for ( i= argc <= 1 ? 0 : 1; i<argc; i++ ) {
        Editor *e = new Editor;
        e->setCaption("Adler");
        if ( i > 0 )
            e->load( argv[i] );
        if ( isSmall ) {
            e->showMaximized();
        } else {
            e->resize( 800, 300 );
            e->show();
        }
    }
    a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
    return a.exec();
}

Ich frage mich jetzt nur wie ich den in meiner subfunktion bekannt mache so dass ich Ihn löschen und einen neuen setzten kann?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Einen QTranslator* als Member deines Editors und eine öffentliche Methode setTranslator(translator).
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Okay danke für die Hilfe...
Ich habe jetzt in meine header-file folgendes:

Code: Alles auswählen


# include <qwidget.h>
# include <qmenubar.h>
# include <Q3MultiLineEdit>
# include <QWidget>
# include <QMap>
# include <qprinter.h>
# include <QTranslator>

//Added by qt3to4:
# include <QResizeEvent>
# include <QCloseEvent>

class Editor : public QWidget
{
    Q_OBJECT

public:

	Editor(QWidget *parent=0, const char *name="qwerty");
	~Editor();
    
	void setTranslator(QTranslator& translator);
	void load(const QString& fileName, int code=-1 );

public slots:
    
	void config();
	void language();
	void newDoc();
	void load();
	bool save();
	void print();
	void help();
	void deleteText();
	void evaluation();
	void about();
	void aboutQt();

protected:

	void resizeEvent( QResizeEvent * );
	void closeEvent( QCloseEvent * );

private slots:
    
	void textChanged();

private:
    
	QMenuBar *m;
	Q3MultiLineEdit *e;
	QTranslator *t;
	
#ifndef QT_NO_PRINTER

	QPrinter printer;

#endif
  
  
bool changed;

};



#endif // QWERTY_H
ist das so gemeint???
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Funktioniert es inzwischen?
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Hallo und danke der Nachfrage:
Nein es klappt leider noch nicht.

Hier mal zusammengefasst was ich jetzt angepasst habe:

1. header-file

Code: Alles auswählen


# include <qwidget.h>
# include <qmenubar.h>
# include <Q3MultiLineEdit>
# include <QWidget>
# include <QMap>
# include <qprinter.h>
# include <QTranslator>

//Added by qt3to4:
# include <QResizeEvent>
# include <QCloseEvent>

class Editor : public QWidget
{
    Q_OBJECT

public:

	Editor(QWidget *parent=0, const char *name="qwerty");
	~Editor();
    
	void setTranslator(QTranslator * translator);

stuff...

private:
    
	QMenuBar *m;
	Q3MultiLineEdit *e;
	QTranslator *t;

stuff...

2. main

Code: Alles auswählen

# include <QTranslator>
# include <QApplication>
# include <qapplication.h>
# include <QDesktopWidget>
# include "qwerty.h"


int main( int argc, char **argv )
{
    QApplication a( argc, argv );
	
    QTranslator *t;
    t->load(QString("adler_de"),".");
	a.installTranslator(t);

stuff...
3. source-file

Code: Alles auswählen


# include <inttypes.h>
# include <sys/stat.h>
# include <algorithm>
# include <iostream>
# include <iomanip>
# include <fstream>
# include <unistd.h>
# include <stdlib.h>
# include <ctype.h>
# include <math.h>
# include <stdio.h>
# include <fcntl.h>
# include <string>
# include <list>
# include <set>

# include <qimage.h>
# include <qpixmap.h>
# include <q3toolbar.h>
# include <qtoolbutton.h>
# include <q3popupmenu.h>
# include <qmenubar.h>
# include <qmenudata.h>
# include <q3textedit.h>
# include <qfile.h>
# include <q3filedialog.h>
# include <qstatusbar.h>
# include <qmessagebox.h>
# include <qprinter.h>
# include <qapplication.h>
# include <q3accel.h>
# include <qtextstream.h>
# include <qpainter.h>
# include <q3paintdevicemetrics.h>
# include <q3whatsthis.h>
# include <qaction.h>
# include <q3simplerichtext.h>
# include <QDesktopWidget>
# include <q3ptrlist.h>
# include <qtextcodec.h>
# include <QProgressDialog>


# include "qwerty.h"

//Added by qt3to4:
# include <QCloseEvent>

# include <QResizeEvent>

# include <QDialog>
# include <QInputDialog>
# include <QCoreApplication>
# include <QtGui>
# include <QMap>
# include <QStringList>
# include <QTranslator>
# include <QApplication>

# include "smaragd.h"

const bool no_writing = FALSE;

static Q3PtrList<QTextCodec> *codecList = 0;

enum { Uni = 0, MBug = 1, Lat1 = 2, Local = 3, Guess = 4, Codec = 5 };

Editor::Editor(QWidget * parent , const char * name): QWidget( parent, name, Qt::WDestructiveClose )
{
	m = new QMenuBar( this, tr("Dateimenu") );

stuff...

	Q3PopupMenu * property = new Q3PopupMenu();
	Q_CHECK_PTR( property );
	m->insertItem( tr("&Eigenschaften"), property );
	int propertyID = property->insertItem( tr("&Sprache"),   this, SLOT(setTranslator(t)),   Qt::ALT+Qt::Key_L );

stuff...

void Editor::setTranslator(QTranslator *translatorOld)
{
        QStringList items;

		int language = 99;
        items << tr("Deutsch") << tr("English") << tr("France") << tr("Spanish");

        bool ok;
        QString item = QInputDialog::getItem(this, tr("Sprache..."),
                                             tr("Ihre Wahl ist:"), items, 0, false, &ok);
        if (ok && !item.isEmpty());
			e->setText(item);
			
		language = items.indexOf(item, 0);
		QString str = QString::number(language, 10); 
		e->setText(str);

		QTranslator *translatorNew = new QTranslator();

  		translatorNew->load(QString("adler_en"),"."); 
  		qApp->removeTranslator(translatorOld);
  		qApp->installTranslator(translatorNew);

als Fehlermeldung beim kompilieren bekomme ich:

siehe Anhang.
Dateianhänge
Fehlermeldung beim make unter WinXP
Fehlermeldung beim make unter WinXP
make.jpg (81.69 KiB) 4017 mal betrachtet
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ahhh, ich liebe diesen Qt3/4 Mischmasch :-)
24dan hat geschrieben:

Code: Alles auswählen

	int propertyID = property->insertItem( tr("&Sprache"),   this, SLOT(setTranslator(t)),   Qt::ALT+Qt::Key_L );
Das kann so schon mal nicht funktionieren.

Am besten ich poste mal meine Variante:
main.cpp (heftig gekürzt)

Code: Alles auswählen

int main( int argc, char** argv )
{
	QTranslator translator( 0 );
	if (!translator.load( sprachdatei+sprachkuerzel, "." ))	// default = englisch
		translator.load(sprachdatei+"ENU", ".");

	QApplication app( argc, argv );
	app.installTranslator( &translator );

	myDialog dialog( 0, 0, true); 
	myDialog.setTranslator(&translator);
	myDialog.show();

	app.exec();
	return 0;
}
myDialog.cpp

Code: Alles auswählen

void myDialog::changeLanguage()
{
	QTranslator* translator = new QTranslator(0);
	if (!translator.load( sprachdatei+sprachkuerzel, "." ))
		return;

	qApp->removeTranslator(currentTranslator);
	qApp->installTranslator( translator );
	retranslateUi(this);
}
currentTranslator ist der Translator, den ich in main mit setTranslator gesetzt habe. Am Wichtigsten ist natürlich das retranslateUI, sonst werden die Texte nicht ersetzt.
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

So einige Sachen laufen da noch nicht.

meine main:

Code: Alles auswählen

 QTranslator translator(0);
    translator.load(QString("adler_de"),".");

    QApplication app( argc, argv );
    app.installTranslator(&translator);

    bool isSmall =  qApp->desktop()->size().width() < 450
                  || qApp->desktop()->size().height() < 450;

    int i;
    for ( i= argc <= 1 ? 0 : 1; i<argc; i++ ) {
        Editor *e = new Editor;
 //       e->setTranslator(translator);
        e->setCaption("Adler");
        if ( i > 0 )
            e->load( argv[i] );
        if ( isSmall ) {
            e->showMaximized();
        } else {
            e->resize( 800, 300 );
            e->show();
        }
    }
    app.connect( &app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()) );
    return app.exec();
meine qwerty.h:

Code: Alles auswählen

class Editor : public QWidget
{
    Q_OBJECT

public:

	Editor(QWidget *parent=0, const char *name="qwerty");
	~Editor();
    
	void load(const QString& fileName, int code=-1 );

public slots:
    
	void config();
	void language();
	void newDoc();
	void load();
	bool save();
	void print();
	void help();
	void deleteText();
	void evaluation();
	void about();
	void aboutQt();
	void setTranslator(QTranslator& translator);

 stuff...

private:
	QMenuBar *m;
	Q3MultiLineEdit *e;
	QTranslator *translator;

meine qwerty.cpp:

Code: Alles auswählen

void Editor::language()
{
        QStringList items;

		int language = 99;
        items << tr("Deutsch") << tr("English") << tr("France") << tr("Spanish");

        bool ok;
        QString item = QInputDialog::getItem(this, tr("Sprache..."),
                                             tr("Ihre Wahl ist:"), items, 0, false, &ok);
        if (ok && !item.isEmpty());
			e->setText(item);
			
		language = items.indexOf(item, 0);
		QString str = QString::number(language, 10); 
		e->setText(str);

		QTranslator* translator = new QTranslator(0); 
		
   		translator->load(QString("adler_en"),".");
   		
   		qApp->removeTranslator(currentTranslator); 
  		qApp->installTranslator();
//  	retranslateUi(this);
	    if (ok == TRUE) 
	    	QMessageBox::information(this, tr("Information"),
                                         tr("Neue Spracheinstellungen sind geladen worden."));
        
       	e->setAutoUpdate( TRUE );
    	e->repaint();
}
Also laut Kompiler fehlt mir der Zugang zu:

1. currentTranslator
2. retranslateUi();
3. setTranslator in der main, lässt sich auf editor nicht anwenden:

Kannst Du mir das nochmal genauer erklären?
Antworten