Sto scrivendo un'API da utilizzare nella creazione di interfacce al lavoro. L'API consente all'utente di scegliere tra una serie di widget e layout predefiniti in modo da creare più interfacce per unità diverse in un breve periodo di tempo. Ci saranno due file di traduzione; uno per i widget API (che vengono forniti con la libreria) e un altro che lo sviluppatore creerà per i dati personalizzati nell'interfaccia. Per semplificare lo sviluppo dello sviluppatore, volevo che l'API gestisse tutte le traduzioni passando il nome dei dati all'API, ma sono arrivato a un ostacolo; Non riesco a far riconoscere al traduttore il testo tradotto inviato, ma riconoscerà le stringhe letterali locali.Come far funzionare la traduzione al di fuori della classe?
Ecco un breve esempio di ciò di cui sto parlando.
class Object
{
public:
Object(QString name) { m_Name = name; };
QString name() { return m_Name; };
private:
QString m_Name;
};
class MyWidget : public QPushButton, public Object
{
Q_OBJECT
public:
MyWidget(QString name);
~MyWidget();
void retranslate();
protected slots:
void buttonPressed();
void changeEvent(QEvent* event);
private:
enum Language { ENGLISH, JAPANESE };
Language m_Language;
QTranslator* m_pTranslator;
};
MyWidget::MyWidget(QString name)
:Object(name) // this does not work, but :Object(tr("TEST")) does
{
m_pTranslator = new QTranslator();
m_Language = ENGLISH;
connect(this, SIGNAL(pressed()), this, SLOT(buttonPressed()));
retranslate();
}
MyWidget::~MyWidget()
{
delete m_pTranslator();
}
void MyWidget::buttonPressed()
{
std::string qm;
m_Language == ENGLISH ? m_Language = JAPANESE : m_Language = ENGLISH;
m_Language == ENGLISH ? qm = "lang_en" : qm = "lang_jp";
qApp->removeTranslator(m_pTranslator);
if(!m_pTranslator->load(qm.c_str()))
std::cout << "Error loading translation file\n";
qApp->installTranslator(m_pTranslator);
}
void MyWidget::retranslate()
{
setText(tr(name().toStdString().c_str()));
}
void MyWidget::changeEvent(QEvent* event)
{
if(event->type() == QEvent::LanguageChange)
retranslate();
else
QWidget::changeEvent(event);
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
~MainWindow();
private:
MyWidget* m_pButton;
};
MainWindow::MainWindow()
{
m_pButton = new MyWidget(tr("TEST")); // this is what I want to do, but this will not translate
setCentralWidget(m_pButton);
}
MainWindow::~MainWindow()
{
delete m_pButton;
}
// main.cpp
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
ho digitato questo fuori mano in modo ci potrebbe essere un paio di errori di battitura, ma il concetto è ancora valido - bisogna chiamare setText nella stessa classe il set la stringa letterale. Se passi un letterale alla classe, come sto facendo qui, sarà ignorato. Se faccio il letterale in classe funziona perfettamente. Questo è un problema perché voglio che lo sviluppatore passi un letterale alla classe e poi lasci che faccia la traduzione. Lo sviluppatore dovrà comunque fare le proprie traduzioni, ma non voglio che si preoccupino di gestire le traduzioni.
Sto facendo qualcosa di sbagliato o si tratta di una limitazione di Qt?
Sì, è stato risolto! Linguist mette ora tutte le traduzioni sotto QObject, invece di suddividerle in classi come in precedenza, ma non è davvero un problema importante e sono più che soddisfatto di questa soluzione. – Richard