Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct


    Qt World Summit: Early-Bird Tickets

    Solved Translation does not work when the text of QLineEdit is modified

    General and Desktop
    translation
    4
    13
    3085
    Loading More Posts
    • 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.
    • Zoltan
      Zoltan last edited by

      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?

      kshegunov 1 Reply Last reply Reply Quote 0
      • Zoltan
        Zoltan @kshegunov last edited by

        @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!

        kshegunov ? 2 Replies Last reply Reply Quote 0
        • sierdzio
          sierdzio Moderators last edited by

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

          (Z(:^

          Zoltan 1 Reply Last reply Reply Quote 2
          • Zoltan
            Zoltan @sierdzio last edited by

            @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 Reply Quote 0
            • sierdzio
              sierdzio Moderators last edited by

              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(:^

              Zoltan 1 Reply Last reply Reply Quote 0
              • Zoltan
                Zoltan @sierdzio last edited by

                @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 Reply Quote 0
                • kshegunov
                  kshegunov Moderators @Zoltan last edited by

                  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

                  Zoltan 1 Reply Last reply Reply Quote 0
                  • Zoltan
                    Zoltan @kshegunov last edited by

                    @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.

                    kshegunov 1 Reply Last reply Reply Quote 0
                    • kshegunov
                      kshegunov Moderators @Zoltan last edited by

                      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

                      Zoltan 1 Reply Last reply Reply Quote 2
                      • Zoltan
                        Zoltan @kshegunov last edited by 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.

                        kshegunov 1 Reply Last reply Reply Quote 0
                        • kshegunov
                          kshegunov Moderators @Zoltan last edited by

                          Well, did you translate it?

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

                          Read and abide by the Qt Code of Conduct

                          Zoltan 1 Reply Last reply Reply Quote 2
                          • Zoltan
                            Zoltan @kshegunov last edited by

                            @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!

                            kshegunov ? 2 Replies Last reply Reply Quote 0
                            • kshegunov
                              kshegunov Moderators @Zoltan last edited by kshegunov

                              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 Reply Quote 3
                              • ?
                                A Former User @Zoltan last edited by

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

                                1 Reply Last reply Reply Quote 0
                                • First post
                                  Last post