Unsolved how to define repeated string with qtranslator?
-
HI,all.
you may use a same string in many cpp. how to translate it for just one time?
here is my example:/res en-US-app.qm en-US-dll.qm /app app.pro /dll dll.pro strings.h
where strings.h is:
#include <QObject> class Strings:public QObject { Q_OBJECT public: #define STR_HELLO Strings::tr("你好") #define STR_HELLO2 Strings::tr("好不好") };
in app:
#include "../strings.h" void App::pbClick() { ui->myLbl->setText(STR_HELLO); ui->myLbl2->setText(STR_HELLO2); }
in dll:
#include "../strings.h" void Dll::pbClick() { ui->myPb->setText(STR_HELLO); ui->myPb2->setText(STR_HELLO2); }
So that dll and app can use the same string for display or comparing.
Unfortunately , I have to translate STR_HELLO and STR_HELLO2 for two times! each projcet needed to be translated!
Is there a better way to translate for once?
here is the code, it can be translated correctly, but need two times to translate the same string.... -
@QtTester Build a static QHash or QMap with the strings, a method that sets the strings where you need them, call that method in changeEvent() right after retranslateUI call. In other words you are overcomplicating this.
Please also note that this only makes sense in the case of avoiding multiple identical strings in the UI or views constructed dynamically (my use case is usually when I need to translate headers of a model), if we are talking unique strings in the UI then that is already covered by built in routines.
-
Please read the documentation on how to translate strings: https://doc.qt.io/qt-5/i18n-source-translation.html#translating-text-that-is-outside-of-a-qobject-subclass
-
@Christian-Ehrlicher
it does not mention how to use a repeated string in multi project.
still , we should make a stand alone project to export the string. and use them in dll1 /dll2 /dll3 /app.
so that people donot need to translate the same strings time and time again. -
@QtTester
I don't think thats a good idea, text is very often context relevant and can in many language result in a different translation.And in cases where it doesn't matter, the
lupdate
tool provides same/similar heuristic translation, that you only have to confirm via the QLinguist (cmd + enter) -
@J-Hilk
Ok,here is my example:/res en-US-app.qm en-US-dll.qm /app app.pro /dll dll.pro strings.h
where strings.h is:
#include <QObject> class Strings:public QObject { Q_OBJECT public: #define STR_HELLO Strings::tr("你好") #define STR_HELLO2 Strings::tr("好不好") };
in app:
#include "../strings.h" void App::pbClick() { ui->myLbl->setText(STR_HELLO); ui->myLbl2->setText(STR_HELLO2); }
in dll:
#include "../strings.h" void Dll::pbClick() { ui->myPb->setText(STR_HELLO); ui->myPb2->setText(STR_HELLO2); }
So that dll and app can use the same string for display or comparing.
Unfortunately , I have to translate STR_HELLO and STR_HELLO2 for two times! each projcet needed to be translated!
Is there a better way to translate for once?
here is the code, it can be translated correctly, but need two times to translate the same string.... -
@QtTester you can define your own context - typically this is the class name - and as long as you specify the context, Qt will use the correct translation.
-
@J-Hilk
Strings already is the context. the point is : I have to translate it for two each project , do the repetitive work。 -
@QtTester said in how to define repeated string with qtranslator?:
Strings already is the context. the point is : I have to translate it for two each project , do the repetitive work。
No.
Strings are the source text. Context is for the translation engine. And you don't have to do the repetitive work, you can shove everything with custom context into their own *qm files and load those additionally to your normal app specific qm file -
@J-Hilk
I have try#define PRODUCT_NAME QT_TRANSLATE_NOOP("QObject", "我的产品")
in string.h ,but still need to do repetitive work.
Could you show me the code? still don't get it :-( -
@QtTester
Sorry I haven't the time right now, for an explicit example.Are you sure this works at all? Because I would say that any call of
lupdate
does not expand /replace your defines before parsing the files.I think you would need an actual "normal " entry of
QT_TRANSLATE_NOOP("QObject", "我的产品")
somewhere too. Btw. QObject is a horrible choice for context. -
@J-Hilk
Could you download my example and make a few change ? :-) -
@J-Hilk said in how to define repeated string with qtranslator?:
Because I would say that any call of lupdate does not expand /replace your defines before parsing the files.
That's correct. lupdate will not grab such mess :)
-
@QtTester said in how to define repeated string with qtranslator?:
#define STR_HELLO QObject::tr("hello")
#define STR_HELLO QObject::tr("hello") is c style code <===avoid using it in C++ code because it is not needed.
Try this:
const QString STR_HELLO( QObject::tr("hello") ); if ( nullptr != ui && nullptr != ui->label ) { ui->label->setText(STR_HELLO); <===this should work. }
Others are right you need proper translation code without hardcoding this.
-
@Christian-Ehrlicher said in how to define repeated string with qtranslator?:
That's correct. lupdate will not grab such mess :)
In this case ,lupdate is stupid , it grab STR_HELLO and STR_HELLO2 all to 'en-us-dll.ts' and 'en-us-app.ts'! and we need the repetitive work! can you show me the right code?
@JoeCFD said in how to define repeated string with qtranslator?:
@QtTester said in how to define repeated string with qtranslator?:
Try this:const QString STR_HELLO( QObject::tr("hello") ); if ( nullptr != ui && nullptr != ui->label ) { ui->label->setText(STR_HELLO); <===this should work. }
still need to input two times in QLinguist, and not work for language change ,because it 's const.
-
@QtTester said in how to define repeated string with qtranslator?:
and not work for language change ,because it 's const.
This is wrong completely wrong...
-
@Christian-Ehrlicher
Donot konwn why ,but I try , it cannot be translated, not just the repetitive issue. const is the reason? -
@QtTester said in how to define repeated string with qtranslator?:
const is the reason?
no, please learn c++
-
@QtTester said in how to define repeated string with qtranslator?:
not just the repetitive issue. const is the reason?
no, every string you set by hand (not via QDesigner) has to be set AGAIN after loading the translation file!
-
@Christian-Ehrlicher
@J-Hilk
Since you donot have time to check the code, I paste below:#include <QObject> #include <QString> // cn encode #ifdef _MSC_VER #pragma execution_character_set("utf-8") #endif class Strings:public QObject { Q_OBJECT public: #define STR_HELLO1 Strings::tr("你好") #define STR_HELLO2 Strings::tr("好不好") }; #define MY_CONTEXT "Strings" #define PRODUCT_NAME QT_TRANSLATE_NOOP(MY_CONTEXT, "我的产品") const QString STR_HELLO3( QObject::tr("你好3") );
#include "mainwindow.h" #include "ui_mainwindow.h" #include "../strings.h" #include "../dll/dll.h" #ifdef _MSC_VER #pragma execution_character_set("utf-8") #endif MainWindow::~MainWindow() { delete ui; } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); initUi(); } void MainWindow::initUi() { setWindowTitle(qApp->translate(MY_CONTEXT,PRODUCT_NAME)); ui->label->setText(STR_HELLO1); ui->label_2->setText(STR_HELLO3); } void MainWindow::changeEvent(QEvent *e) { if(e->type() == QEvent::LanguageChange){ ui->retranslateUi(this); initUi(); qDebug("main:lang change event"); } } void MainWindow::on_pbCn_clicked() { qApp->removeTranslator(&m_transApp); qApp->removeTranslator(&m_transDll); } void MainWindow::on_pbEn_clicked() { qApp->removeTranslator(&m_transApp); if(m_transApp.load(":/en-US-app.qm")){ qApp->installTranslator(&m_transApp); } qApp->removeTranslator(&m_transDll); if(m_transDll.load(":/en-US-dll.qm")){ qApp->installTranslator(&m_transDll); } } void MainWindow::on_pbPop_clicked() { static Dll *d = new Dll(); d->show(); }
#include "dll.h" #include "../strings.h" #include <QApplication> #include <QMessageBox> #include <QPushButton> // #ifdef _MSC_VER #pragma execution_character_set("utf-8") #endif Dll::Dll(QWidget *p):QWidget(p) { QMessageBox::warning(nullptr,"",STR_HELLO2); m_pb = new QPushButton(this); m_pb->move(0,0); initUi(); resize(QSize(200,200)); } void Dll::initUi() { setWindowTitle(qApp->translate(MY_CONTEXT,PRODUCT_NAME)); m_pb->setText(STR_HELLO3); } void Dll::changeEvent(QEvent *e) { if(e->type() == QEvent::LanguageChange){ initUi(); qDebug("dll:lang change event"); } }
here is the result,default language:
after select english, STR_HELLO3 not change in app ,and dll change nothing at all, although the event is triggered.: