[gelöst] Übersetzungen in main-Routine

Alles rund um die Programmierung mit Qt
Antworten
deedw
Beiträge: 15
Registriert: 19. April 2010 13:09

[gelöst] Übersetzungen in main-Routine

Beitrag 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.
Zuletzt geändert von deedw am 14. September 2010 18:20, insgesamt 1-mal geändert.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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 :)
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Code: Alles auswählen

QT           *= gui 
Absicht, Schreibfehler, Copy/Paste-Fehler? Das sollte eigentlich "+=" sein, gilt für alle Vorkommen.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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?
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
deedw
Beiträge: 15
Registriert: 19. April 2010 13:09

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
deedw
Beiträge: 15
Registriert: 19. April 2010 13:09

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Antworten