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
QtWS25 Last Chance

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.7k 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.
  • ZoltanZ Offline
    ZoltanZ Offline
    Zoltan
    wrote on last edited by
    #1

    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 1 Reply Last reply
    0
    • 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
      • sierdzioS Offline
        sierdzioS Offline
        sierdzio
        Moderators
        wrote on last edited by
        #2

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

        (Z(:^

        ZoltanZ 1 Reply Last reply
        2
        • 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