Seite 1 von 1

[gelöst] Übersetzungen in main-Routine

Verfasst: 14. September 2010 06:35
von deedw
Hallo,

ich müsste in der main-Routine etwas übersetzen (und zwar die Ausgabe, wie man die Programmparameter korrekt nutzt). Leider klappt die Übersetzung da nicht. Mein Beispielcode:

main.pro:

Code: Alles auswählen

TEMPLATE      = app
QT           *= gui
CONFIG       *= qt console warn_on release
TARGET        = main
HEADERS       = dialog.h
SOURCES       = main.cpp
TRANSLATIONS  = main.ts
dialog.h:

Code: Alles auswählen

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QVBoxLayout>

class Dialog : public QDialog
{
Q_OBJECT

public:
    Dialog( QWidget *parent = 0 )
    : QDialog(parent)
    {
        QVBoxLayout *layout = new QVBoxLayout;
        QLabel *label = new QLabel( tr("English3") );
        layout->addWidget(label);
        label = new QLabel( "English2" );
        layout->addWidget(label);
        setLayout(layout);
        setWindowTitle( tr("English1") );
    }
};

#endif
main.cpp:

Code: Alles auswählen

#include <QString>
#include <QCoreApplication>
#include <QApplication>
#include <QTranslator>
#include <QLocale>
#include <QMessageBox>
#include <iostream>
#include "dialog.h"

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

    QTranslator appTranslator;
    appTranslator.load( "main" );
    app.installTranslator( &appTranslator );

    std::cout << app.tr("English1").toStdString() << std::endl;
    QMessageBox::information(0, "English2", app.tr("English3") );

    Dialog dialog;
    return dialog.exec();
}
Mit

Code: Alles auswählen

lupdate main.pro -ts main.ts
linguist-qt4 main.ts
lrelease main.pro
habe ich die vier gefundenen Strings übersetzt (2 in main und 2 in Dialog).

Wenn ich das Programm starte, sind aber nur die Strings im Dialog übersetzt? Was mache ich denn falsch?

Wenn das da oben funktioniert, brauche ich das Ganze dann für eine Konsolenanwendung, sprich ohne "gui" in der QT-Variable und maximal mit QCoreApplication.

Gruß Dee

PS: System ist Ubuntu 9.10, Qt 4.5.2.

Verfasst: 14. September 2010 10:13
von padreigh
Weisst du eigentlich wie COOL die Api ist?

nimm google mit "qtranslator qt 4.5" --> gibts nicht, aber den hier: http://doc.trolltech.com/qtranslator.html

- lies 2 Zeilen, klick auf More
- lies 3 Zeilen und finde Hello tr() example:

Klick aufs Example oder lies einfach weiter :)

Verfasst: 14. September 2010 10:17
von franzf

Code: Alles auswählen

QT           *= gui 
Absicht, Schreibfehler, Copy/Paste-Fehler? Das sollte eigentlich "+=" sein, gilt für alle Vorkommen.

Verfasst: 14. September 2010 10:27
von padreigh
franzf hat geschrieben:Das sollte eigentlich "+=" sein, gilt für alle Vorkommen.
Warum das? += added es, *= added es nur wenn es noch nicht drin ist?

Verfasst: 14. September 2010 10:32
von franzf
padreigh hat geschrieben:
franzf hat geschrieben:Das sollte eigentlich "+=" sein, gilt für alle Vorkommen.
Warum das? += added es, *= added es nur wenn es noch nicht drin ist?
Alles klar, wusste ich nicht. Verwende hauptsächlich cmake, drum ist mir "qmake Advanced Usage" bisher entgangen.

Verfasst: 14. September 2010 18:19
von deedw
@franzf: Wieso *=, hat padreigh ja erklärt.

@padreigh: Ich kenne den QtAssistant schon fast auswendig, aber es hat ein entscheidendes Detail gefehlt: QApplication ist nicht von QObject abgeleitet und kann daher nicht für Übersetzungen herhalten. Das hatte ich irgendwie angenommen.

Mit folgender Änderung klappt es:

Code: Alles auswählen

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

    QTranslator appTranslator;
    appTranslator.load( "main" );
    app.installTranslator( &appTranslator );

    Dialog dialog;

    std::cout << Dialog::tr("English1").toStdString() << std::endl;
    QMessageBox::information(0, "English2", dialog.tr("English3") );

    return dialog.exec();
} 
Danke für den Schubs in die richtige Richtung.

Gruß Dee

Verfasst: 14. September 2010 18:45
von franzf
deedw hat geschrieben:Ich kenne den QtAssistant schon fast auswendig, aber es hat ein entscheidendes Detail gefehlt: QApplication ist nicht von QObject abgeleitet und kann daher nicht für Übersetzungen herhalten.
Dann kennst du ihn noch nicht auswendig genug:
QApplication -> inherits QCoreApplication -> inherits QObject.
Wenn du in der Doku irgendwas mit "Properties" "Slots" oder "Signals" liest müssen alle Rezeptoren schreien "QObject! QObject!" :D
Versuchs doch einfach mal mit "QObject::tr()", das Ding ist statisch und damit unabhängig von irgend welchen Klassen/Anleitungen. Ich hatte damit bisher noch keine Probleme.

Verfasst: 14. September 2010 18:54
von deedw
Hm, hatte ich also doch richtig angenommen. Da mein Problem ja gelöst ist, gehe ich dem nicht weiter nach, aber ggf. lag es ja dran, dass ich eine konkrete Instanz (app) benutzt habe und nicht QApplication direkt.

Gruß Dee

Verfasst: 14. September 2010 19:08
von franzf
deedw hat geschrieben:Hm, hatte ich also doch richtig angenommen. Da mein Problem ja gelöst ist, gehe ich dem nicht weiter nach, aber ggf. lag es ja dran, dass ich eine konkrete Instanz (app) benutzt habe und nicht QApplication direkt.

Gruß Dee
Problem ist wohl, dass app.tr() in den Context von app (also QApplication) schaut. Dort gibt es den Original-String nicht, deshalb wird auch nix übersetzt. QObject::tr() in der main gibt mir im Linguist den Kontext "QObject" mit den Übersetzungen.
Entscheidend ist auch dieser Satz aus der Doku:
For example, the following class definition includes the Q_OBJECT macro, implementing a new tr() that uses the MainWindow (bezieht sich auf das Beispiel) context
Damit existiert ein eigenes "tr" für deine Dialog-Klasse (ebenso für QApplication!). "tr()" in Dialog übersetzt im "Dialog"-Kontext, "QObject::tr()" irgendwo, auch in Dialog, übersetzt im QObject-Context.