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. Localization of a library

Localization of a library

Scheduled Pinned Locked Moved General and Desktop
30 Posts 4 Posters 21.2k Views 1 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.
  • S Offline
    S Offline
    soroush
    wrote on last edited by
    #11

    I should also mention that, If you're re-implementing changeEvent(QEvent *e) and you tend to use texts from library in your GUI, you will have two sources for translation. This will prevent your application from extracting text correctly.

    1 Reply Last reply
    0
    • R Offline
      R Offline
      realdarkman
      wrote on last edited by
      #12

      The german.qm is compiled in the lib as resource. The hard coded path above was a test. How can I load german.qm from library resource to load & install the translation? Is there a way?

      1 Reply Last reply
      0
      • S Offline
        S Offline
        soroush
        wrote on last edited by
        #13

        Hmmm
        You're doing it from hard way!
        Ask your library to give you binary data of her translation file (contents of .qm embedded in your library).
        Create a QTranslator in your application. "Load your binary data":http://doc-snapshot.qt-project.org/4.8/qtranslator.html#load-3:
        @translator.load ( const uchar * data, int len)@
        Install your translator to QApplication (outside library)

        1 Reply Last reply
        0
        • R Offline
          R Offline
          realdarkman
          wrote on last edited by
          #14

          Still a little problem: The data of german.qm from lib resource is compressed, so I need to use

          @QByteArray qUncompress(const uchar *data, int nbytes)@

          But how do I get a const uchar* from the QByteArray for QTranslator::load?

          1 Reply Last reply
          0
          • G Offline
            G Offline
            goetz
            wrote on last edited by
            #15

            It should be possible to load the translation directly from the ressource:

            @
            QTranslator trans;
            trans.load(":/path/to/resource/german.qm");
            @

            http://www.catb.org/~esr/faqs/smart-questions.html

            1 Reply Last reply
            0
            • S Offline
              S Offline
              soroush
              wrote on last edited by
              #16

              @
              QByteArray ba;
              ba = ...
              unsigned char data = (unsigned char) ba.data();
              @

              Volker's solution is better.

              1 Reply Last reply
              0
              • G Offline
                G Offline
                giesbert
                wrote on last edited by
                #17

                [quote author="realdarkman" date="1338289960"]MyLib:

                @
                void MyLib::loadTranslation() {
                QTranslator translator;
                QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));

                translator.load("/home/chris/myLib/locale/german.qm");
                
                QApplication::installTranslator(&translator);
                

                }
                @
                [/quote]

                As written earlier, you destroy the translator object after installing it directly. This will lead to no loaded translation again. You have to create it on the heap or create it in main and give it to the function.

                Nokia Certified Qt Specialist.
                Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                1 Reply Last reply
                0
                • R Offline
                  R Offline
                  realdarkman
                  wrote on last edited by
                  #18

                  The german.qm is a ressource of MyLib, Volker's solution will not work!? Or can I access the MyLib resources from MyApp?

                  Is there a better (C++) method to cast the ba.data()? I want to avoid C casts!

                  1 Reply Last reply
                  0
                  • G Offline
                    G Offline
                    giesbert
                    wrote on last edited by
                    #19

                    Volkers solution should work if you don't destroy the translator object.

                    Nokia Certified Qt Specialist.
                    Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                    1 Reply Last reply
                    0
                    • R Offline
                      R Offline
                      realdarkman
                      wrote on last edited by
                      #20

                      [quote author="Gerolf" date="1338366133"]You have to create it on the heap or create it in main and give it to the function.[/quote]

                      Create on heap? I give the translator to loadTranslation, but it doesn't work:

                      [quote]/usr/include/QtCore/qtranslator.h:94: error: 'QTranslator::QTranslator(const QTranslator&)' is private[/quote]

                      1 Reply Last reply
                      0
                      • R Offline
                        R Offline
                        realdarkman
                        wrote on last edited by
                        #21

                        What is the path from MyApp to MyLip german.qm?

                        @
                        libTranslator.load(":/locale/german.qm")
                        libTranslator.load(":/mylib/locale/german.qm")
                        @

                        ...both doesn't work!

                        1 Reply Last reply
                        0
                        • G Offline
                          G Offline
                          giesbert
                          wrote on last edited by
                          #22

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

                          QTranslator libTranslator;
                          ...
                          MyLib::loadTranslation(libTranslator);
                          QApplication::installTranslator(&libTranslator);
                          
                          ...
                          return application.exec();
                          

                          }

                          void loadTranslation(QTranslator& translator)
                          {
                          translator.load("/home/chris/myLib/locale/german.qm");
                          }
                          @

                          LoadTranslator must be exported from the dll.

                          The path to use for the load depends on your resource file. we can't tell you.

                          Nokia Certified Qt Specialist.
                          Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                          1 Reply Last reply
                          0
                          • R Offline
                            R Offline
                            realdarkman
                            wrote on last edited by
                            #23

                            Ok, I made it so, Gerolf! Unfortunately, same behavior: MyApp german, but MyLib english strings/forms!

                            libTranslator.load(...) returns true ... I despair soon!

                            1 Reply Last reply
                            0
                            • R Offline
                              R Offline
                              realdarkman
                              wrote on last edited by
                              #24

                              With local file on hdd it works:

                              @translator.load("/home/chris/mylib/locale/german.qm")@

                              but if I use the resource, it doesn't work:

                              @translator.load(":/locale/german.qm")@

                              Both returns true! (?)

                              1 Reply Last reply
                              0
                              • G Offline
                                G Offline
                                goetz
                                wrote on last edited by
                                #25

                                Your library needs to incorporate the resource file of the library. In order to not clash with names in your application, it's a good idea to put those resources into a virtual directory in the resources, e.g

                                @
                                :/mylibrary/locale/german.qm
                                @

                                Also, it may be necessary to explicitly initialize the library's ressources with "Q_INIT_RESOURCE":/doc/qt-4.8/qdir.html#Q_INIT_RESOURCE. The "Qt Resource System docs":/doc/qt-4.8/resources.html have some infos on that topic too (look at the end of the page).

                                http://www.catb.org/~esr/faqs/smart-questions.html

                                1 Reply Last reply
                                0
                                • R Offline
                                  R Offline
                                  realdarkman
                                  wrote on last edited by
                                  #26

                                  It works now, thanks!

                                  @all:
                                  Big thanks for your help! You're great!

                                  Last thing: I load the Qt translations (qt_de.qm) in MyApp, must this be done also in MyLib for Qt strings (error messages etc.) in the library?

                                  1 Reply Last reply
                                  0
                                  • G Offline
                                    G Offline
                                    goetz
                                    wrote on last edited by
                                    #27

                                    You're welcome - that's what this forums are made for :-)
                                    Please make sure to add [solved] to the title of the topic (the edit link is at the very first post).

                                    Regarding your last question:
                                    No, it's only needed in the application itself.

                                    http://www.catb.org/~esr/faqs/smart-questions.html

                                    1 Reply Last reply
                                    0
                                    • R Offline
                                      R Offline
                                      realdarkman
                                      wrote on last edited by
                                      #28

                                      Ok, but Qt error strings are english only, allthough qt_de.qm is loaded! This returns an english message (it's in the library):

                                      @QIODevice::errorString()@

                                      ...or are these strings english only?

                                      1 Reply Last reply
                                      0
                                      • G Offline
                                        G Offline
                                        giesbert
                                        wrote on last edited by
                                        #29

                                        AFAIK, these translations are only for UI stuff like dialogs etc.
                                        Not for error strings, which you typically do not directly display to the end user.

                                        Nokia Certified Qt Specialist.
                                        Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                                        1 Reply Last reply
                                        0
                                        • R Offline
                                          R Offline
                                          realdarkman
                                          wrote on last edited by
                                          #30

                                          Ok, but I found translations in qt_de.ts for error messages! I load qt_de.qm in MyApp, but my library doesn't use it! If I load qt_de.qm in MyLib, strings are still in english! Any special options to load it for libraries?

                                          1 Reply Last reply
                                          0

                                          • Login

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