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. Translation does not work when the text of QLineEdit is modified

Translation does not work when the text of QLineEdit is modified

Scheduled Pinned Locked Moved Solved General and Desktop
translation
13 Posts 4 Posters 3.8k Views
  • 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.
  • sierdzioS sierdzio

    Could it be that static string is built into the binary so it is not being initialized after you load translation QM file?

    ZoltanZ Offline
    ZoltanZ Offline
    Zoltan
    wrote on last edited by
    #3

    @sierdzio I don't know the inner working of Qt. If it is so, then what would you recommend me to modify?

    1 Reply Last reply
    0
    • sierdzioS Offline
      sierdzioS Offline
      sierdzio
      Moderators
      wrote on last edited by
      #4

      This is rather inner working of C++ itself. But I am only guessing to be honest.

      What you can try is to define this string array (btw. you can also use QStringList) in a singleton class that is initialized after translation is loaded, so that it gets correct data.

      (Z(:^

      ZoltanZ 1 Reply Last reply
      0
      • sierdzioS sierdzio

        This is rather inner working of C++ itself. But I am only guessing to be honest.

        What you can try is to define this string array (btw. you can also use QStringList) in a singleton class that is initialized after translation is loaded, so that it gets correct data.

        ZoltanZ Offline
        ZoltanZ Offline
        Zoltan
        wrote on last edited by
        #5

        @sierdzio My constant variable is called from the ui. But the ui class is instantiated after the translation is loaded. Shouldn't it be OK (it isn't)?

        1 Reply Last reply
        0
        • ZoltanZ Zoltan

          I have a desktop application I want to translate. All translations work well except in the following case. I have a QLineEdit object called resultEdit whose text is updated when a pushbutton is clicked on. resultEdit can display the following strings:

          const QString days[7] = {QCoreApplication::tr("Monday"), \
                                   QCoreApplication::tr("Tuesday"), \
                                   QCoreApplication::tr("Wednesday"), \
                                   QCoreApplication::tr("Thursday"), \
                                   QCoreApplication::tr("Friday"), \
                                   QCoreApplication::tr("Saturday"), \
                                   QCoreApplication::tr("Sunday")};
          

          So days is a global array. One callback functions which calculates which day to print is

          void ZellerGUI::on_yearEdit_editingFinished()
          {
              // Calculate the day of the week
              int calculatedDay = some_integer_from_1_to_7;
              ui->resultEdit->setText(days[calculatedDay - 1]);
          }
          

          However, when I select the translation, the names of the days remain in English. It is weird as all other stings are translated well. When I opened the Linguist, it recognised all seven days. What happens in the background that the translations do not work for this global array?

          kshegunovK Offline
          kshegunovK Offline
          kshegunov
          Moderators
          wrote on last edited by
          #6

          Try something like this:

          const char * const days[7] = {
              QT_TR_NOOP("Monday"),
              QT_TR_NOOP("Tuesday"),
              // ... and so on
          }
          
          void ZellerGUI::on_yearEdit_editingFinished()
          {
              // ... calculate day
              QString day = QCoreApplication::tr(days[calculatedDay - 1]);
              ui->resultEdit->setText(day);
          }
          

          Read and abide by the Qt Code of Conduct

          ZoltanZ 1 Reply Last reply
          0
          • kshegunovK kshegunov

            Try something like this:

            const char * const days[7] = {
                QT_TR_NOOP("Monday"),
                QT_TR_NOOP("Tuesday"),
                // ... and so on
            }
            
            void ZellerGUI::on_yearEdit_editingFinished()
            {
                // ... calculate day
                QString day = QCoreApplication::tr(days[calculatedDay - 1]);
                ui->resultEdit->setText(day);
            }
            
            ZoltanZ Offline
            ZoltanZ Offline
            Zoltan
            wrote on last edited by
            #7

            @kshegunov When I call lupdate on the project file, it throws these warnings:

            tr() cannot be called without context
            

            and these strings do not appear in Linguist.

            kshegunovK 1 Reply Last reply
            0
            • ZoltanZ Zoltan

              @kshegunov When I call lupdate on the project file, it throws these warnings:

              tr() cannot be called without context
              

              and these strings do not appear in Linguist.

              kshegunovK Offline
              kshegunovK Offline
              kshegunov
              Moderators
              wrote on last edited by
              #8

              Yes I think my example is rotten. Try with QT_TRANSLATE_NOOP and give it a context:

              const char * const days[7] = {
                  QT_TRANSLATE_NOOP("Weekdays", "Monday"),
                  QT_TRANSLATE_NOOP("Weekdays", "Tuesday"),
                  // ... and so on
              }
              

              Read and abide by the Qt Code of Conduct

              ZoltanZ 1 Reply Last reply
              2
              • kshegunovK kshegunov

                Yes I think my example is rotten. Try with QT_TRANSLATE_NOOP and give it a context:

                const char * const days[7] = {
                    QT_TRANSLATE_NOOP("Weekdays", "Monday"),
                    QT_TRANSLATE_NOOP("Weekdays", "Tuesday"),
                    // ... and so on
                }
                
                ZoltanZ Offline
                ZoltanZ Offline
                Zoltan
                wrote on last edited by Zoltan
                #9

                @kshegunov Thank you. Now Linguist recognizes it but my application doesn't appreciate it yet. In the debugger, I also see the English name.

                kshegunovK 1 Reply Last reply
                0
                • ZoltanZ Zoltan

                  @kshegunov Thank you. Now Linguist recognizes it but my application doesn't appreciate it yet. In the debugger, I also see the English name.

                  kshegunovK Offline
                  kshegunovK Offline
                  kshegunov
                  Moderators
                  wrote on last edited by
                  #10

                  Well, did you translate it?

                  QString day = QCoreApplication::translate("Weekdays", days[calculatedDay - 1]);
                  

                  Read and abide by the Qt Code of Conduct

                  ZoltanZ 1 Reply Last reply
                  2
                  • kshegunovK kshegunov

                    Well, did you translate it?

                    QString day = QCoreApplication::translate("Weekdays", days[calculatedDay - 1]);
                    
                    ZoltanZ Offline
                    ZoltanZ Offline
                    Zoltan
                    wrote on last edited by
                    #11

                    @kshegunov I just used your previous solution:

                    QString day = QCoreApplication::tr(days[calculatedDay - 1]);
                    

                    Using your last command

                    QString day = QCoreApplication::translate("Weekdays", days[calculatedDay - 1]);
                    

                    perfectly works. Now I just have to think it over why it works.

                    Thank you very much for your precious help!

                    kshegunovK ? 2 Replies Last reply
                    0
                    • ZoltanZ Zoltan

                      @kshegunov I just used your previous solution:

                      QString day = QCoreApplication::tr(days[calculatedDay - 1]);
                      

                      Using your last command

                      QString day = QCoreApplication::translate("Weekdays", days[calculatedDay - 1]);
                      

                      perfectly works. Now I just have to think it over why it works.

                      Thank you very much for your precious help!

                      kshegunovK Offline
                      kshegunovK Offline
                      kshegunov
                      Moderators
                      wrote on last edited by kshegunov
                      #12

                      You're welcome.
                      Happy coding!

                      Edit:
                      Btw, moving the keys to the function should also work:

                      void ZellerGUI::on_yearEdit_editingFinished()
                      {
                          // If this is initialized here it should work okay
                          static const char * const days[7] = {
                              QT_TR_NOOP("Monday"),
                              QT_TR_NOOP("Tuesday"),
                              // ... and so on
                          };
                          // ... calculate day
                          QString day = QCoreApplication::tr(days[calculatedDay - 1]);
                          ui->resultEdit->setText(day);
                      }
                      

                      Read and abide by the Qt Code of Conduct

                      1 Reply Last reply
                      3
                      • ZoltanZ Zoltan

                        @kshegunov I just used your previous solution:

                        QString day = QCoreApplication::tr(days[calculatedDay - 1]);
                        

                        Using your last command

                        QString day = QCoreApplication::translate("Weekdays", days[calculatedDay - 1]);
                        

                        perfectly works. Now I just have to think it over why it works.

                        Thank you very much for your precious help!

                        ? Offline
                        ? Offline
                        A Former User
                        wrote on last edited by
                        #13

                        @Zoltan I have the same problem, must I do?

                        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