Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Check for QTranslator::load



  • I have an application where I need to internationalize it.
    I have already set up everything and all is working fine. The QTranslator objects all load from the resource file.

    What I want to know is that if I need to check the result of each QTranslator object load operation before installing a translator.

    I guessing that since all the resource files are compiled into executable file I don't need this check beforeinstalling a translator. But I am not sure.


  • Lifetime Qt Champion

    Hi
    When in a resource its unlikely it would fail but
    say you misspelled the filename, later on, it might be nice
    if the code would catch it and show an error.

    I would check it as it might work for a long time but
    then someone changes a filename or similar, and its
    a frustration if it then "just don't work" and the user cannot report
    any errors or indication of that went wrong.



  • @mrjj ok thank you



  • @hbatalha did that reply from @mrjj solve your issue/doubt?
    If so please don't forget to mark your post as solved!



  • @Pablo-J-Rogina yeah I forgot to do that



  • @mrjj

    When in a resource its unlikely it would fail

    Well , it seems that it just failed me or I am doing something wrong. I just deployed my application with windeployqt and the resulting .exe doesn't translate the ui unless I add the .qm file to the same directory as I do when I compile my app.

    I thought that all the files in the resource file are be compiled into the .exe but it is not happening with the .qm file as all the other files added in the resource seem to be working fine.


  • Lifetime Qt Champion

    Hi,

    Can you show your .pro file and the way you use QTranslator ?



  • @SGaist

    QT       += core gui
    QT       += network
    
    win32 {
        LIBS += -lwininet
    }
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    CONFIG += c++11
    
    # You can make your code fail to compile if it uses deprecated APIs.
    # In order to do so, uncomment the following line.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    SOURCES += \
        about.cpp \
        main.cpp \
        mainwindow.cpp \
        settings.cpp 
    
    HEADERS += \
        about.h \
        mainwindow.h \
        settings.h 
    
    FORMS += \
        about.ui \
        mainwindow.ui \
        settings.ui 
    
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    
    RESOURCES += \
        resources.qrc
    
    TRANSLATIONS += Languages/transl_portuguese.ts
    

    mainwindow.cpp

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        if( ! translatorPt.load(":/Languages/transl_portuguese.qm"))
            qDebug() << "not loaded";
    
    ...
    }
    
    void MainWindow::updateLanguage()
    {
        if(preferences.language == Preferences::Language::ENGLISH)
            qApp->removeTranslator(&translatorPt);
        else if(preferences.language == Preferences::Language::PORTUGUESE)
            qApp->installTranslator(&translatorPt);
    }
    

  • Lifetime Qt Champion

    You .pro file has issues, you have several times line endings with a backslash that should not. When listing files vertically, the last one should not have that line.



  • @SGaist

    you have several times line endings with a backslash that should not

    That was a mistake of mine, I deleted some commented lines and I missed those backslashes , I will edit the post.

    The edited post is now as my .pro file I am using in the program.


  • Lifetime Qt Champion

    Ok, can you show your .qrc file ?




  • Lifetime Qt Champion

    Can you show it's text content ?



  • This post is deleted!

  • Lifetime Qt Champion

    No, the .qrc raw content.




  • Lifetime Qt Champion

    From there it looks all good.

    Just for the sake of debugging, you should check the install and remove calls since they return a Boolean.



  • @SGaist I checked them and they are working fine but after deployment they don't unless I add .qm file to the directory.


  • Lifetime Qt Champion

    Did you try to list the content of the .qrc file using QDir at run time just to ensure you have everything in place ?



  • @hbatalha
    I feel you missed the second argument for the load function which is the directory path, where as first is the filename.

    translatorPt.load(":/Languages/transl_portuguese.qm"))
    

    If directory is not specified, the current directory is used (i.e., as currentPath()).
    So in deployment it will search for current path for the .qm file.



  • @SGaist said in Check for QTranslator::load:

    Did you try to list the content of the .qrc file using QDir at run time just to ensure you have everything in place ?

    I will do that and get back to you



  • @nagesh but I am loading from resource file, it shouldn't care for the directory of the .qm file in the deployment since the resource files are supposed to be compiled into the .exe file



  • @SGaist

    Did you try to list the content of the .qrc file using QDir at run time just to ensure you have everything in place ?

    I did, everything seems to fine.

    I don't know where I can possibly be doing something wrong. I created another topic dedicated to this problem as this one contains answer that solves the op.


  • Moderators

    @hbatalha
    what @nagesh meant is:

    translatorPt.load("transl_portuguese.qm", ":/Languages/"))

    file path is now your qrc system and not currentPath



  • I have found out what was the problem. For some reason I don't know every time I build the application Qt Creator will create the binary in the debug folder even though I have it set to release.

    None of the changes I was making was actually taking effect since I was always checking .exe file from the release which was remaining unchanged the whole time.

    So I took the .exe from the debug folder and deployed it and all is working fine. Now I have to check what might me going when building my app cause the .exe is pretty big and I am not sure if is the release or the debug(it is in the debug folder, but I built it with release build set).

    I thank you all for the time and patience. I really appreciated it.


Log in to reply