Language Probleme

Alles rund um die Programmierung mit Qt
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Language Probleme

Beitrag von QtBerserker »

nach vielen Jahren der Programmier Pause möchte ich nun (damals qt3.x) mit qt 4 anfangen. Hat sich einiges geändert ':shock:'

Gleich mein erster Test klappt nicht, obwohl ich imo streng nach Doku vor gegangen bin. Es wird einfach nicht der Button in De angezeigt, obwohl die .qm Dateien lt. sysinternal's filemon geladen werden.

Hier der source:

Code: Alles auswählen

#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>

class MyWidget : public QWidget
{
	Q_OBJECT

public: 
	MyWidget(QWidget* parent = 0);
};


MyWidget::MyWidget(QWidget* parent) 
	: QWidget(parent)
{
	setFixedSize(200, 120);

	QPushButton *quit = new QPushButton(tr("Quit"), this); 
	quit->setGeometry(62, 40, 75, 30); 
	quit->setFont(QFont("Times", 18, QFont::Bold));

	connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
}

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

	QString lang = QLocale::system().name();
    lang.chop(3); // remove country for faster translation file searching
	//lang = lang.left(lang.indexOf("_")); // a saver version of above?

	QTranslator qtTranslator; 
	qtTranslator.load("qt_" + lang, QLibraryInfo::location(QLibraryInfo::TranslationsPath)); 
	app.installTranslator(&qtTranslator);

	QTranslator appTranslator;
	appTranslator.load("QtBoost_" + lang, app.applicationDirPath() + "/i18n");
	app.installTranslator(&appTranslator);

	MyWidget widget; 
	widget.show(); 
	
	return app.exec();
} 
Ich denke, alle *.ts Datei zu posten hat keinen Sinn, zumal Linguist es einem sehr einfach macht. Hier nur die QtBoost_de.ts:

Code: Alles auswählen

<!DOCTYPE TS><TS>
<context>
    <name>MyWidget</name>
    <message>
        <source>Quit</source>
        <translation>Tschüss</translation>
    </message>
</context>
</TS>
BTW, irgendwelche Erfahrungen mit boost.signals als moc Ersatz hier (damit probiere ich derzeit mit VC2k5 Express und win32 patch für Qt4) - bei diesem Bsp. (mit auskommentierten Q_OBJECT) keine Probleme.

Viele Grüße
Olaf[/code]
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

QTranslator::load (...) liefert einen bool-Wert zurück. Da kannst Du schon mal feststellen, ob die Datei erfolgreich geladen wird.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Auf window xp mui (multilanguage) gibt es ein kleinen Bug und das LANG ist nicht sauber gesetzt vom microsoft installer.... es kommen nur die erste 2 letter gross...

ich uebersetze das Qt4DS .. um die sprachen zu testen ......machte ich ein kleinen hack lese ....
http://sourceforge.net/forum/forum.php? ... _id=554668

die sicherste methode ... fuer alle os....
die file als qm als resource hineinpacken...

Code: Alles auswählen

#define _PROGRAM_SHORT_NAME "meinapps"
#ifndef WORK_CACHEDIR
#define WORK_CACHEDIR \
              QString( "%1/.%2/" ).arg( QDir::homePath() , _PROGRAM_SHORT_NAME )
#endif
#define DEFAULT_LANG_FILE \
             QString( "%1_DEFAULT.qm" ).arg( WORK_CACHEDIR )
                    
int main(int argc, char *argv[]) {
    QApplication a( argc, argv );
    QDir dir(WORK_CACHEDIR);
    if ( dir.mkpath(WORK_CACHEDIR) ) { } else {
    QMessageBox::warning( 0, "File error!", "Not possibel to create a work dir on: "+WORK_CACHEDIR);
	return 0;
    }        
    if (!is_file(DEFAULT_LANG_FILE)) {
    QString find;
    QStringList langs;
    langs << "en-English" << "de-Deutsch" << "fr-Français" << "it-Italiano" << "pt-Portuguese";     
    bool ok;
    QString item = QInputDialog::getItem(0,"First small Setup.","Select Your Language:", langs, 0, false, &ok);
           if (ok && !item.isEmpty()) {
           find = item.left(2); 
           QString firstlangfile = QString::fromUtf8(":/locale/locale/app_")+find+".qm";
           QFile fl(firstlangfile); 
               if (!fl.copy(DEFAULT_LANG_FILE)) {
                 QMessageBox::warning( 0, "File error!", "Not possibel to copy file to: "+DEFAULT_LANG_FILE);
	             return 0;  
               }
           } 
    }
    
    QTranslator translator;
    translator.load( DEFAULT_LANG_FILE );
    a.installTranslator(&translator);


QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

wow, das ging ja schnell. Vielen Dank für die Antworten!

Code: Alles auswählen

	QTranslator appTranslator;
	bool langHere =	appTranslator.load("QtBoost_" + lang, 
						app.applicationDirPath() + "/i18n");

	if(!langHere)
		QMessageBox::warning( 0, "No App Language File here!", "too bad ...");
	else
		app.installTranslator(&appTranslator);
sagt impliziet, dass er das language File gefunden hat (sonst käme ja der Requester).

Den hack von patrik08 muss ich mir mal in Ruhe ansehen, z.Zt. ist nur W2k interessant (komme von der Linux Progger Seite her). Evtl. muss man sich auch mal die Implementation von den Trollen zu den Thema mal genauer ansehen, wie sie QLibraryInfo::location(QLibraryInfo::TranslationsPath) realisiert haben. Imo wiederspricht die bedingte Kompilation dem Grundgedanken der OS Unabhängigkeit von Qt (deshalb ja der abstrakte layer), aber evtl. gilt ja auch hier: It's not a bug, it's a feature :lol: (Asche auf mein Haupt)

Z.Zt. versuche ich es mal ohne boost.signals zu kompilieren - evtl. geht ja da etwas verquer. Allerdings bekomme ich den moc nicht in den Griff und bekomme so linker error. Aus VS (qmake vcapp) muss ich den moc ja per Hnad/batch aufrufen und die files in's Projekt einbinden; aber ich dachte, dass bei den qmake pro Dateien der moc selber eingebunden wird, indem nach Q_OBJECT geparst wird. Habe ich hier einen Fehler?:

Code: Alles auswählen

CONFIG += qt 
TEMPLATE = app 
SOURCES += main.cpp 
HEADERS += SignalsLib.hpp 
TRANSLATIONS = QtBoost_de.ts QtBoost_en.ts
Der Pfad zum moc compiler taucht nicht in den Makefiles auf.

Vielen Grüße
Olaf
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

ich vergass: die language files wurden in qt3 mit embed oder so eingebunden. In der qt4 tools Doku [url]ttp://doc.trolltech.com/4.1/tools-list.html[/url] gibt's das tool nicht mehr ... Nun per Resource Compiler (rcc)?
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

meinst du lupdate lrelease? vom qt4?

so wie http://www.lividot.org/man/doc.trolltec ... ual-2.html
die gibt es noch....


See the lupdate and lrelease sections. Qt Linguist Manual: Programmers
doc qt4....
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

patrik08 hat geschrieben:meinst du lupdate lrelease? vom qt4?

so wie http://www.lividot.org/man/doc.trolltec ... ual-2.html
die gibt es noch....


See the lupdate and lrelease sections. Qt Linguist Manual: Programmers
doc qt4....
Nein, http://doc.trolltech.com/3.3/qembed.html ist bei qt4 nicht mehr dabei, damit konnte man (angeblich, nie probiert) auch language files in C++ Arrays wandeln, compilieren und linken und per QTranslator::load() laden.

Viele Grüße
Olaf
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

OK, an boost scheint es wirklich nicht zu liegen; musste MyWidget in eigenen Header/Source auslagern, dann klappte es auch mit dem mo compiler.

Einzig:

Code: Alles auswählen

MSVCRT.lib(cinitexe.obj) : warning LNK4098: Standardbibliothek "libcmt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
dazu habe ich aber auch schon etwas gefunden, allerdings würde mich interessieren, mit wem die lib denn nun konkret im Konfikt steht - gibt's da einen Weg das heraus zu finden?

Tja, das (wirkliche) Problem mit der fehlenden Übersetzung besteht noch immer.

Hier die relevanten Files:
main.cpp:

Code: Alles auswählen

#include <QApplication>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
#include <QMessageBox>

#include <MyWidget.hpp>

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

	QString lang = QLocale::system().name();
    lang.chop(3); // remove country for faster translation file searching

	QTranslator qtTranslator; 
	qtTranslator.load("qt_" + lang,
						QLibraryInfo::location(QLibraryInfo::TranslationsPath)); 
	app.installTranslator(&qtTranslator);

	QTranslator appTranslator;
	bool langHere =	appTranslator.load("QtBoost_" + lang, 
						app.applicationDirPath() + "/i18n");

	if(!langHere)
		QMessageBox::warning( 0, "No App Language File here!", "too bad ...");
	else
		app.installTranslator(&appTranslator);

	MyWidget widget; 
	widget.show(); 
	
	return app.exec();
} 
MyWidget.cpp:

Code: Alles auswählen

#include <QApplication>
#include <QFont>
#include <QPushButton>

#include <MyWidget.hpp>

MyWidget::MyWidget(QWidget* parent) 
	: QWidget(parent)
{
	setFixedSize(200, 120);

	QPushButton *quit = new QPushButton(tr("Quit"), this); 
	quit->setGeometry(62, 40, 75, 30); 
	quit->setFont(QFont("Times", 18, QFont::Bold));

	connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
}
MyWidget.hpp

Code: Alles auswählen

#if !defined(MY_WIDGET_H)
#define MY_WIDGET_H

#include <QWidget>

class MyWidget : public QWidget
{
	Q_OBJECT

public: 
	MyWidget(QWidget* parent = 0);
};
#endif
QtBoost.pro:

Code: Alles auswählen

CONFIG += qt release
TEMPLATE = app 
SOURCES += MyWidget.cpp main.cpp 
HEADERS += MyWidget.hpp 

TRANSLATIONS = QtBoost_de.ts \
							QtBoost_en.ts
und qtboost_de.ts:

Code: Alles auswählen

<!DOCTYPE TS><TS>
<context>
    <name>MyWidget</name>
    <message>
        <source>Quit</source>
        <translation>Tschüss</translation>
    </message>
</context>
</TS>
Ist das nur ein Problem bei mir hier am W2k Wks + Qt4.1.2 + VC2k5 Express?

Viele Grüße
Olaf
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

Bzgl. qembed http://doc.trolltech.com/4.1/resources.html:

The resource system is based on tight cooperation between qmake, rcc (Qt's resource compiler), and QFile. It obsoletes Qt 3's qembed tool and the image collection mechanism.

Somit ist klar, warum es nicht mehr da ist. Leider steht da kein Bsp. da, wie es mit den Lang files nutzt. Ein einfaches angeben:

Code: Alles auswählen

<RCC>
    <qresource prefix="/i18n" >
        <file>i18n/QtBoost_de.qm</file>
        <file>i18n/QtBoost_en.qm</file>
    </qresource>
</RCC>
reicht alleine nicht. Das pro-File benötigt noch das:

Code: Alles auswählen

RESOURCES += QtBoost.qrc
, aber rcc wird nicht aufgerufen (und folglich nicht zugelinkt).

Klappt denn bei jemanden obiges Bsp.?

Olaf
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

QtBerserker hat geschrieben:Leider steht da kein Bsp. da, wie es mit den Lang files nutzt.
Wär ja auch blöd sowas. Wie willst Du dann Sprachdateien nach liefern oder Übersetzungsfehler korrigieren. Extra neu compilieren? Ich weiß nicht wo dein Problem liegt, hier funktioniert das einwandfrei. Die *.qm-Dateien sind doch mit den Qt4-Tools erstellt worden, oder? Ansonsten pack ein Beispiel zusammen und lad es hoch.
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

http://www.boost.org/doc/html/signals/s ... #id2738878 beschreibt, wie man den moc mH. von boost.signals umgehen kann. Bei diesem Bsp. klappt es eben nicht! Wollte eben das archiv ohne boost klar machen, compiliert und - es ging. Nochmals mit boost und - ging nicht. Schade :cry:

CU Olaf
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Hast du dass gelesen?

http://www.boost.org/regression-logs/cs ... s/s04.html

bezuglich qt4 ....

obwohl ich sehe kein sinn um boost zu verwenden... mit allen opensource libs ist doch praktisch viel machbar.... mit qt4...

ich hatte ein paar gehe-versuche mit Wx http://wxwindows.org/ was ich von dort aus vermisse (gegenueber qt4 ) sind die mime erkennung sowie default browser der die applikation gibt mit pfad und alles was dazu sein sollte... (so wie bei linux den "which perl" beim doofen window gibt es halt kein which .. )
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

patrik08 hat geschrieben:beim doofen window gibt es halt kein which .. )
Dafür gibt es UnixUtils :-) War mit das erste was ich auf meinem Arbeitsplatzrechner installiert habe.
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

patrik08 hat geschrieben:Hast du dass gelesen?
http://www.boost.org/regression-logs/cs ... s/s04.html
bezuglich qt4 ....
Wer lesen kann, ist klar im Vorteil :oops:

Aber leider klappt es mit dem qt4.1 spezifischen Teil auch nicht. Ich hänge 'mal mein Bsp. ran. Allerdings muss Boost installiert und wie auf http://www.boost.org/more/getting_start ... ld_Install beschrieben die libs kompiliert werden. Immerhin gibt's keine Linker Errors (was die Frage nach den typ. Qt Meta Infos zum casten etc. ausschliesst und folglich erst'mal nichts zu sagen hat). Ich würde mir also den moc Lauf ersparen.

Auch habe ich bereits meine Erfahrungen mit Boost gesammelt. Ein weiterer Grund für mich ist, dass ich das GUI vom eigentlichen Programm Kern trennen und im Kern kein Qt verwenden wollte, falls aus irgendeinem Grunde ich Qt nicht mehr verwenden möchte oder kann und ich nicht alles neu schreiben muss. Auch verspreche ich mir von boost.signals im Kern eine bessere Performance, beim GUI kann ja ruhig ein String/Hashvergleich durchgeführt werden (wenn die Trolls das heute noch so machen).

Viele Grüße
Olaf
Dateianhänge
QtBoost.rar
(45.46 KiB) 197-mal heruntergeladen
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

langsam nehme ich es persöhnlich, was VC da mit mir macht; heute klappte es, nach dem ich den Beitrag abgeschickt habe. Ich hatte alle VS Dateien gelöscht und das die VC app mit qmake neu erstellen lassen. Alles nicht sehr vertrauenserweckend .... :shock:

http://scottcollins.net/articles/a-deep ... slots.html ist ein interessanter Beitrag über boost.signals und Qt signal/slot.

CU Olaf
Antworten