Unsolved how to define repeated string with qtranslator?
-
@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.:
-
It's because the context is wrong - it's not QObject but your class name ('Dll' in your example).
Still don't understand the reason behind all this. If you want some kind of translation library you should use a proper class with a get() function which takes an enum which represents your stringclass Translator : public QObject { Q_OBJECT public: enum class Id { Hello1, Hello2, } QString translateMe(Id id) const; } ... QString Translator::translateMe(Id id) const { switch (id) { case Id::Hello1: return tr("Hello1"); case Id::Hello2: return tr("Hello2"); } }
-
@Christian-Ehrlicher said in how to define repeated string with qtranslator?:
class Translator : public QObject
{
Q_OBJECT
public:
enum class Id
{
Hello1,
Hello2,
}
QString translateMe(Id id) const;
}QString Translator::translateMe(Id id) const
{
switch (id) {
case Id::Hello1: return tr("Hello1");
case Id::Hello2: return tr("Hello2");
}
}That is what I first said: write a common、 stand alone project and call it's API.
-
@QtTester said in how to define repeated string with qtranslator?:
That is what I first said: write a common、 stand alone project and call it's API.
So what's the actual problem then?
-
@Christian-Ehrlicher said in how to define repeated string with qtranslator?:
@QtTester said in how to define repeated string with qtranslator?:
That is what I first said: write a common、 stand alone project and call it's API.
So what's the actual problem then?
guys said it is overcomplicate or no need to do this , so i try to find another native way .after a long circle way , you give me the same solution. ha-ha-ha
-
I would not use this solution but translate it more than once - it's easier esp. since linguist auto-translates your strings when it already find the exact same match.
-
@Christian-Ehrlicher said in how to define repeated string with qtranslator?:
e
How do you solve this situation:
Project1 dll1 dll2 app Project2 dll3 dll4 app
Project1 and Project2 or other projects need to use the same string. many many string(like ok, yes, no ...)
if you translate each BIg Project, you donot need to do the repetitive work?
and you cannot put dll1.ts to Project2, you mean linguist know it's already translated?