Seite 1 von 1
Sprache zur Programmlaufzeit ändern
Verfasst: 17. Juli 2006 21:59
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:
hinterlegt.
Ich vermute mal dass ich einen Pointer von dem Objekt "a" besorgen muss?!?
Verfasst: 18. Juli 2006 07:36
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.
Verfasst: 18. Juli 2006 11:14
von 24dan
Ja danke so ähnlich habe ich das auch in einem anderem Forum gefunden und folgendes hat jetzt geklappt:
Ich habe jetzt einen neuen Translator erstellt.
Verfasst: 18. Juli 2006 12:37
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?
Verfasst: 18. Juli 2006 12:55
von macman
Einen QTranslator* als Member deines Editors und eine öffentliche Methode setTranslator(translator).
Verfasst: 19. Juli 2006 20:30
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???
Verfasst: 20. Juli 2006 06:58
von macman
Funktioniert es inzwischen?
Verfasst: 21. Juli 2006 12:52
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.
Verfasst: 21. Juli 2006 13:47
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.
Verfasst: 23. Juli 2006 15:13
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?