Qt i Qt Linguist - problem z lokalizacją

0

Witam,
Stworzyłem bardzo prostą aplikację: kilka wpisów w menu oraz etykieta z klasycznym "Hello World". Na tym uproszczonym programie chcę znaleźć przyczynę niedziałających programów w Qt Linguist.

Kompilator: Visual C++ 2010
Qt: 4.8.1 for Desktop

Mój plik .pro:

QT       += core gui

TARGET = International
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

TRANSLATIONS = International_pl.ts

Na początek stworzyłem tą aplikację, działa.

Procedurę wykonałem następująco:

  1. W IDE wybrałem: lupdate.
  2. Potem stworzony plik International_pl.ts otworzyłem w Linguist i dokonałem tłumaczeń.
  3. W IDE wykonałem lrelease.
Zakończono "C:/QtSDK/Desktop/Qt/4.8.1/msvc2010/bin/lupdate.exe"
Uruchamianie narzędzia zewnętrznego "C:/QtSDK/Desktop/Qt/4.8.1/msvc2010/bin/lrelease.exe" E:/qt/International/International.pro
Updating 'E:/qt/International/International_pl.qm'...
    Generated 7 translation(s) (0 finished and 7 unfinished)

Nazwa katalogu jest nieprawidowa.
Could not find qmake configuration directoryCould not find qmake configuration fileUsing OS scope before setting MAKEFILE_GENERATOR
Zakończono "C:/QtSDK/Desktop/Qt/4.8.1/msvc2010/bin/lrelease.exe"
Uruchamianie narzędzia zewnętrznego "C:/QtSDK/Desktop/Qt/4.8.1/msvc2010/bin/lrelease.exe" E:/qt/International/International.pro
Updating 'E:/qt/International/International_pl.qm'...
    Generated 7 translation(s) (0 finished and 7 unfinished)

Nazwa katalogu jest nieprawidowa.
Could not find qmake configuration directoryCould not find qmake configuration fileUsing OS scope before setting MAKEFILE_GENERATOR
Zakończono "C:/QtSDK/Desktop/Qt/4.8.1/msvc2010/bin/lrelease.exe"

Operacja chyba nie do końca się udała, ale w katalogu projektu uzyskałem plik:
International_pl.qm, czyli skompilowane tłumaczenie. Chyba o to chodziło.

Następnie zabrałem się za poprawki w pliku main:

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTranslator qtTranslator;
    bool load = qtTranslator.load("International_pl");

    a.installTranslator(&qtTranslator);
    MainWindow w;
    w.show();
    if(!load) {
        QMessageBox::critical(&w, "Error", "Failed to load translation");
        exit(1);
    }


    return a.exec();
}

Niestety, load ma wartość fałsz. Załadowanie tłumaczenie nie udaje się.

Gdy do metody load podam ścieżkę bezwzględną: E:/qt/International/International_pl.qm tłumaczenie ładuje się. W jaki sposób zrobić by to zawsze działało?

0

Do load trzeba wskazać ścieżkę bezwzględną. Aby to działało trzeba znać ścieżkę do tłumaczenia. Obiekt QApplication potrafi zwrócić katalog w którym znajduje się aplikacja. Innymi obiektami Qt możesz ponadto otrzymać np. folder gdzie zapisuje się ustawienia użytkownika. Wszystko zależy gdzie zainstalujesz swoje tłumaczenie.

0

Zakładając,że swojego .exe masz w folderze MyProgram,a tłumaczenia siedzą w folderze MyProgram\Translations to weź spróbuj ładować poleceniem:

qtTranslator.load("International_pl","Translations");
0

Moje rozwiązanie przy uwzględnieniu Waszych wskazówek:

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTranslator qtTranslator;
    QString path = QCoreApplication::applicationDirPath();
    bool load = qtTranslator.load("International_pl.qm", path + "/Translations/");

    a.installTranslator(&qtTranslator);
    MainWindow w;
    w.show();
    if(!load) {
        QMessageBox::information(&w, "Current Path", path);
        QMessageBox::critical(&w, "Error", "Failed to load translation");
        exit(1);
    }


    return a.exec();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1