Мне нужно было перевести мой английский пользовательский интерфейс на французский, поэтому я сделал все необходимое с помощью файлов .ts и .qm, загрузил его в класс QTranslator и установил в QApplication:
//in the InterfaceWidget constructor:
QTranslator myappTranslator;
bool loaded = myappTranslator.load("myApp_" + QLocale::system().name());
qDebug() << "Is translation file loaded?" << loaded; // RETURNS TRUE
QApplication::installTranslator(&myappTranslator);
ui.setupUi(this);
ui.retranslateUi(this); //works, it translates the UI
Потом, Я создаю и присоединяю к InterfaceWidget другой виджет (во вкладке) с именем ConfigurationTabUI:
m_ConfigurationTabUI = new ConfigurationTabUI(ui.configTab);
Соответствующий интерфейс также переведен на французский, правильно.
И вот моя проблема: в методах ConfigurationTabUI он не работает, когда я пытаюсь перевести простую строку QString:
void ConfigurationTabUI::on_ValidButton_clicked(){
QString msg(ConfigurationTabUI::tr("message to translate"));
qDebug() << "translated string: " << msg; // NOT TRANSLATED
}
Я действительно понятия не имею, почему …
Спасибо за вашу помощь.
Примечание: я использую Qt5.2 и дважды проверил, что файл .ts содержит правильную переведенную строку.
Хорошо, я нашел проблему, это просто тупой недосмотр:
QTranslator создается в стеке, а не динамически (в куче), поэтому объект уничтожается в конце метода.
В результате он переводит пользовательский интерфейс, потому что объект все еще там, но позже, когда вызывается слот, ничего не переводится.
Вот мой код:
//in the InterfaceWidget constructor:
QTranslator* myappTranslator = new QTranslator(QApplication::instance());
bool loaded = myappTranslator->load("myApp_" + QLocale::system().name());
qDebug() << "Is translation file loaded?" << loaded; // RETURNS TRUE
QApplication::installTranslator(myappTranslator);
ui.setupUi(this);
и в ConfigurationTabUI (который наследуется от QWidget):
void ConfigurationTabUI::changeEvent(QEvent *e)
{
if (e->type() == QEvent::LanguageChange) {
ui.retranslateUi(this);
reset(); //my method to reload some data in UI
} else
QWidget::changeEvent(e);
}
Других решений пока нет …