2011-10-06 20 views
7

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?

risposta

4

ho il sospetto questo è dovuto al fatto che:

m_pButton = new MyWidget(tr("TEST")); 

definisce una stringa nel contesto di MainWindow, e si tenta di tradurre TEST nel contesto di MyWidget. È possibile aggirare questo problema utilizzando il metodo statico tr() su QObject. Questo definirà TEST come una traduzione nel contesto globale QObject. Questo può essere fatto adattando il codice di creazione widget di pulsante come segue:

m_pButton = new MyWidget(QObject::tr("TEST")); 

e in MyWidget::retranslate():

setText(QObject::tr(name().toStdString().c_str())); 

Nota che è necessario per rigenerare i vostri file di traduzione per questo lavoro!

+0

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

Problemi correlati