2017-02-08 15 views
1

мне нужно перевести свой английский интерфейс на французском, так что я сделал все необходимое с .ts и qm-файлы, загрузите его в классе QTranslator, и установить его на QApplication:Почему мой C++ Qt UI был переведен, но не мой QStrings в моей программе?

//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 содержит правую переведенную строку.

+2

Что вы печатаете не та же переменная, где хранится переведенной строки. Вы сохранили перевод в «msg», но напечатали «l_sMsg», который не определен нигде, что мы можем видеть, и понятия не имеем, на что он может быть установлен. Если это опечатка, пожалуйста, исправьте вопрос, и мы снова посмотрим на него. – goug

+0

Ах, извините, это была опечатка ... Посмотрите на это – toussa

+0

Имеет ли класс 'ConfigurationTabUI' макрос' Q_OBJECT'? Что происходит, когда вы используете 'QObject :: tr' вместо' ConfigurationTabUI :: tr'? – Mike

ответ

0

Хорошо, я нашел эту проблему, это просто немой контроль:

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); 
} 
+0

Я думаю, что было бы безопаснее создать переводчик в качестве ребенка вашего 'QApplication'. Я, вероятно, сделаю это непосредственно в 'main.cpp' после создания объекта' QApplication'. – smerlin

+0

У меня нет доступа к main.cpp, потому что мой код является плагином framework.Класс InterfaceWidget - это «основной» класс моего плагина. По-прежнему будет 'QTranslator * myappTranslator = новый QTranslator (QApplication :: instance());' лучше? В таком случае ? – toussa

+0

QApplication ссылается на объект транслятора, поэтому вам нужно убедиться, что время жизни объекта QTranslator не заканчивается до того, как объект QApplication будет уничтожен. В Qt вы делаете это, делая QTranslator дочерним элементом QApplication. – smerlin