Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Load .qm file from resource
Forum Updated to NodeBB v4.3 + New Features

Load .qm file from resource

Scheduled Pinned Locked Moved Unsolved General and Desktop
15 Posts 7 Posters 13.1k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • beeckscheB Offline
    beeckscheB Offline
    beecksche
    wrote on last edited by
    #4

    @mrjj , @kshegunov

    So i tried it all, but the QTranslator won't load the file.

    It's strange beacuase i can load and open the file with QFile.

        QFile file;
        file.setFileName(":/translations/resources/qt_de.qm");
        qDebug() << file.open(QIODevice::ReadOnly); // true
        qDebug() << translator.load(":/translations/resources/qt_de.qm"); // false
    
    kshegunovK 1 Reply Last reply
    0
    • beeckscheB beecksche

      @mrjj , @kshegunov

      So i tried it all, but the QTranslator won't load the file.

      It's strange beacuase i can load and open the file with QFile.

          QFile file;
          file.setFileName(":/translations/resources/qt_de.qm");
          qDebug() << file.open(QIODevice::ReadOnly); // true
          qDebug() << translator.load(":/translations/resources/qt_de.qm"); // false
      
      kshegunovK Offline
      kshegunovK Offline
      kshegunov
      Moderators
      wrote on last edited by
      #5

      @beecksche said in Load .qm file from resource:

      qDebug() << translator.load("qt_de", ":/translations/resources");
      

      ?

      Read and abide by the Qt Code of Conduct

      beeckscheB 1 Reply Last reply
      1
      • kshegunovK kshegunov

        @beecksche said in Load .qm file from resource:

        qDebug() << translator.load("qt_de", ":/translations/resources");
        

        ?

        beeckscheB Offline
        beeckscheB Offline
        beecksche
        wrote on last edited by beecksche
        #6

        @kshegunov

        My test results

        QFile file;
        file.setFileName(":/translations/resources/qt_de.qm");
        qDebug() << file.open(QIODevice::ReadOnly);
        qDebug() << translator.load(QLatin1String(":/translations/resources/qt_de"));
        qDebug() << translator.load(QLatin1String(":/translations/resources/qt_de.qm"));
        qDebug() << translator.load(QLatin1String("qt_de"), QLatin1String(":/translations"));
        qDebug() << translator.load(QLatin1String("qt_de"), QLatin1String(":/translations/resources"));
        qDebug() << translator.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLatin1String(":/translations"));
        qDebug() << translator.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLatin1String(":/translations/resources"));
        
        true
        false
        false
        false
        false
        false
        false
        
        kshegunovK 1 Reply Last reply
        0
        • beeckscheB beecksche

          @kshegunov

          My test results

          QFile file;
          file.setFileName(":/translations/resources/qt_de.qm");
          qDebug() << file.open(QIODevice::ReadOnly);
          qDebug() << translator.load(QLatin1String(":/translations/resources/qt_de"));
          qDebug() << translator.load(QLatin1String(":/translations/resources/qt_de.qm"));
          qDebug() << translator.load(QLatin1String("qt_de"), QLatin1String(":/translations"));
          qDebug() << translator.load(QLatin1String("qt_de"), QLatin1String(":/translations/resources"));
          qDebug() << translator.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLatin1String(":/translations"));
          qDebug() << translator.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLatin1String(":/translations/resources"));
          
          true
          false
          false
          false
          false
          false
          false
          
          kshegunovK Offline
          kshegunovK Offline
          kshegunov
          Moderators
          wrote on last edited by
          #7

          Okay. That's information aplenty. Could you try the same, but without putting the translation into a resource? Put them in a regular directory and supply the absolute dir path instead of :/translations/resources?

          Read and abide by the Qt Code of Conduct

          beeckscheB 1 Reply Last reply
          0
          • kshegunovK kshegunov

            Okay. That's information aplenty. Could you try the same, but without putting the translation into a resource? Put them in a regular directory and supply the absolute dir path instead of :/translations/resources?

            beeckscheB Offline
            beeckscheB Offline
            beecksche
            wrote on last edited by
            #8

            @kshegunov

            QFile file;
            file.setFileName("C:/Qt/Qt5.7.0_MSVC2013/5.7/msvc2013/translations/qt_de.qm");
            qDebug() << file.open(QIODevice::ReadOnly);
            qDebug() << translator.load(QLatin1String("C:/Qt/Qt5.7.0_MSVC2013/5.7/msvc2013/translations/qt_de"));
            qDebug() << translator.load(QLatin1String("C:/Qt/Qt5.7.0_MSVC2013/5.7/msvc2013/translations/qt_de.qm"));
            qDebug() << translator.load(QLatin1String("qt_de"), QLatin1String("C:/Qt/Qt5.7.0_MSVC2013/5.7/msvc2013/translations"));
            qDebug() << translator.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLatin1String("C:/Qt/Qt5.7.0_MSVC2013/5.7/msvc2013/translations"));
            
            true
            false
            false
            true
            true
            

            If i use the file outside the resource i can load it!

            raven-worxR 1 Reply Last reply
            0
            • beeckscheB beecksche

              @kshegunov

              QFile file;
              file.setFileName("C:/Qt/Qt5.7.0_MSVC2013/5.7/msvc2013/translations/qt_de.qm");
              qDebug() << file.open(QIODevice::ReadOnly);
              qDebug() << translator.load(QLatin1String("C:/Qt/Qt5.7.0_MSVC2013/5.7/msvc2013/translations/qt_de"));
              qDebug() << translator.load(QLatin1String("C:/Qt/Qt5.7.0_MSVC2013/5.7/msvc2013/translations/qt_de.qm"));
              qDebug() << translator.load(QLatin1String("qt_de"), QLatin1String("C:/Qt/Qt5.7.0_MSVC2013/5.7/msvc2013/translations"));
              qDebug() << translator.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLatin1String("C:/Qt/Qt5.7.0_MSVC2013/5.7/msvc2013/translations"));
              
              true
              false
              false
              true
              true
              

              If i use the file outside the resource i can load it!

              raven-worxR Offline
              raven-worxR Offline
              raven-worx
              Moderators
              wrote on last edited by raven-worx
              #9

              @beecksche
              the problem is the default compression of qrc.
              QTranslator checks for qrc files and only loads them when they are uncompressed (don't ask me whats the reason for that is).

              Try to add the following to your .pro file:

              QMAKE_RESOURCE_FLAGS += -no-compress
              

              --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
              If you have a question please use the forum so others can benefit from the solution in the future

              beeckscheB 1 Reply Last reply
              2
              • raven-worxR raven-worx

                @beecksche
                the problem is the default compression of qrc.
                QTranslator checks for qrc files and only loads them when they are uncompressed (don't ask me whats the reason for that is).

                Try to add the following to your .pro file:

                QMAKE_RESOURCE_FLAGS += -no-compress
                
                beeckscheB Offline
                beeckscheB Offline
                beecksche
                wrote on last edited by
                #10

                @raven-worx
                Thanks for the information. I added

                QMAKE_RESOURCE_FLAGS += -no-compress
                

                Run qmake and build it again, but still not able to load it from resource.

                raven-worxR 1 Reply Last reply
                0
                • VRoninV Offline
                  VRoninV Offline
                  VRonin
                  wrote on last edited by
                  #11

                  As a referense: nice article by @ekkescorner : https://appbus.wordpress.com/2016/04/28/howto-translations-i18n/

                  Try moving the .qm files in the main directory rather than the resources one and see if that works

                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                  ~Napoleon Bonaparte

                  On a crusade to banish setIndexWidget() from the holy land of Qt

                  1 Reply Last reply
                  2
                  • beeckscheB beecksche

                    @raven-worx
                    Thanks for the information. I added

                    QMAKE_RESOURCE_FLAGS += -no-compress
                    

                    Run qmake and build it again, but still not able to load it from resource.

                    raven-worxR Offline
                    raven-worxR Offline
                    raven-worx
                    Moderators
                    wrote on last edited by raven-worx
                    #12

                    @beecksche
                    can you try this workaround:

                    1. create a .rcc file with rcc -no-compress mytranslations.qrc -o mytranslations.rcc
                    2. add this .rcc file to your qrc file
                    3. load the .rcc file with
                    QFile translations(":/mytranslations.rcc");
                    translations.open(QIODevice::ReadOnly);
                    QResource::registerResource( (const uchar *)translations.readAll().constData() );
                    translator.load( ... );
                    

                    --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                    If you have a question please use the forum so others can benefit from the solution in the future

                    1 Reply Last reply
                    1
                    • J Offline
                      J Offline
                      jmg227
                      wrote on last edited by
                      #13

                      I am having the same problem. I found the following page
                      http://doc.qt.io/qt-5/linguist-programmers.html which describes using lconvert to create a qt_de.qm file with only the required modules, e.g.:

                      lconvert -o installation_folder/qt_de.qm qtbase_de.qm qtdeclarative_de.qm
                      

                      I found that if I created the .qm file in my resource file this way, I could then load the qt translation from my resource file.

                      It is interesting that the size of qt_de.qm in C:/Qt/Qt5.7.0/5.7/mingw53_32/translations is 1 KB. The qt_de.qm that is generated by lconvert is 239 KB.

                      1 Reply Last reply
                      1
                      • Dmitiy TyuginD Offline
                        Dmitiy TyuginD Offline
                        Dmitiy Tyugin
                        wrote on last edited by
                        #14

                        Probably the problem in prefix. Here are my files from working project

                        resources.qrc

                        <RCC>
                            <qresource prefix="/">
                                <file>assets/translations/language_ru.qm</file>
                                <file>assets/translations/language_en.qm</file>
                            </qresource>
                        </RCC>
                        

                        Folders structure:

                        ProjectRoot/project.pro
                        ProjectRoot/resources.qrc
                        ProjectRoot/assets/translations/language_ru.qm
                        ProjectRoot/assets/translations/language_ru.qm

                        Code that works ok

                        QTranslator tr;
                        tr.load(":/assets/translations/language_ru.qm")
                        
                        1 Reply Last reply
                        1
                        • J Offline
                          J Offline
                          jmg227
                          wrote on last edited by
                          #15

                          I would like to clarify something. I do not think that the problem the original poster has is in the prefix. As I said, I believe I was having the same problem. My application's translation file, dwb_lang_de.qm, can be loaded by QTranslator without any problem. My problem came about when I tried to load Qt's translation file, qt_de.qm. If you look at the Qt translation files, (I'm running on windows so they are in C:\Qt\Qt5.7.0\5.7\mingw53_32\translations), you will see that qt_de.qm is suspiciously small. In fact, the Qt Linguist Manual (URL is above) states:
                          In Qt 5, the .qm files were split up by module and there is a so-called meta catalog file which includes the .qm files of all modules. The name of the meta catalog file is identical to the name of Qt 4's monolithic .qm file so that existing loader code works as before provided all included .qm files are found.

                          A solution is to use lconvert, as I suggested above, to build your own qt_de.qm that contains the strings for the modules that you need. This can then be added to your resource file and QTranslator can load it without any problem.

                          Since posting that, I have found that an alternate solution is to put all of the .qm files for Qt (assistant_cs.qm, assistant_da.qm, assistant_de.qm, ...) into your resource file. Then when you load the meta-file, qt_de.qm, it will load fine because it will find all the files it references.

                          Either method works fine.

                          1 Reply Last reply
                          2

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved