2015-02-13 10 views
3

Я весь день искал для решения проблемы и менял свой код, но не повезло.Перевод не работает в Qt

В принципе, я добавил перевод в свое приложение. Он работает нормально, кроме как здесь:

QString MainWindow::getMessage(Messages msg) { 
    static const char* const messages[] = { 
     QT_TR_NOOP("Setting power on"), 
     QT_TR_NOOP("Reading ID..."), 
     QT_TR_NOOP("Programming..."), 
     QT_TR_NOOP("Setting write-protect"), 
     QT_TR_NOOP("Finished ok"), 
     QT_TR_NOOP("PROGRAMMED OK"), 
     QT_TR_NOOP("ERROR!"), 
     QT_TR_NOOP("OK"), 
     QT_TR_NOOP("The programmer is not connected.\nPlease check the connection."), 
     QT_TR_NOOP("Disconnect the board, it is in short!!"), 
     QT_TR_NOOP("ERROR: Supply voltage too low (1 Volt is required, Measured: 0.0 Volt)."), 
     QT_TR_NOOP("Board is already programmed and write protected."), 
     QT_TR_NOOP("Check device connection or there is short."), 
     QT_TR_NOOP("Unknown error.")  
    }; 

    return tr(messages[msg]); 
} 

Однако я не получаю перевод. Файлы для перевода, похоже, в порядке, переводы пользовательского интерфейса применяются отлично. Я также попытался это:

static const char* const messages[] = { 
    QT_TRANSLATE_NOOP("test", "Setting power on"), 
    QT_TRANSLATE_NOOP("test", "Reading ID..."), 
    QT_TRANSLATE_NOOP("test", "Programming..."), 
    QT_TRANSLATE_NOOP("test", "Setting write-protect"), 
    QT_TRANSLATE_NOOP("test", "Finished ok"), 
    QT_TRANSLATE_NOOP("test", "PROGRAMMED OK"), 
    QT_TRANSLATE_NOOP("test", "ERROR!"), 
    QT_TRANSLATE_NOOP("test", "OK"), 
    QT_TRANSLATE_NOOP("test", "The programmer is not connected.\nPlease check the connection."), 
    QT_TRANSLATE_NOOP("test", "Disconnect the board, it is in short!!"), 
    QT_TRANSLATE_NOOP("test", "ERROR: Supply voltage too low (1 Volt is required, Measured: 0.0 Volt)."), 
    QT_TRANSLATE_NOOP("test", "Board is already programmed and write protected."), 
    QT_TRANSLATE_NOOP("test", "Check device connection or there is short."), 
    QT_TRANSLATE_NOOP("test", "Unknown error.") 
}; 

Тогда у меня есть метод, чтобы получить сообщение:

QString MainWindow::getMessage(Messages msg) { 
    return qApp->translate("test", messages[msg]); 
} 

Но это не работает.

Любые советы или предложения?

+0

Вы делаете свой перевод дважды. Зачем? Предложение: используйте только строки времени компиляции внутри макроса 'tr'. –

+0

@Saz 'QT_TR_NOOP' ничего не переводит. Макрос ничего не делает, но дает инструмент lupdate' подсказку, где можно найти переводный текст. См. Http://qt-project.org/doc/qt-4.8/linguist-programmers.html#using-qt-tr-noop-and-qt-translate-noop –

+0

Вы скомпилировали свой файл '.ts' в '.qm' файл? Не могли бы вы добавить код в свой 'main.cpp', где вы установили' QTranslator'? –

ответ

0

Я готовил более простой источник для загрузки здесь, но теперь он работает нормально! Я перезагрузил свой компьютер вчера, вы знаете, иногда перезагрузка исправляет все (?). В любом случае, вот какой-то источник, поскольку он был запрошен. И, кстати, я делаю перевод на лету, и позволяя пользователю выбрать язык (не обнаруживая локалей):

Это main.cpp (ничего не было добавлено мной):

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

Это mainwindow.cpp:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QDir> 
#include <QTranslator> 


MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 

    ui->setupUi(this); 

    QDir d(":/translations/"); 
    QStringList files = d.entryList(QStringList("*.qm")); 

    qDebug("There are %d files for translation", files.count()); 

    // Now let's fill the combobox 
    this->ui->comboBox->clear(); 
    for (int i = 0; i < files.count(); ++i) { 
     QTranslator translator; 
     translator.load(files[i], ":/translations/"); 
     QString language = translator.translate("MainWindow", 
       "English"); 
     this->ui->comboBox->addItem(language); 
    } 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_comboBox_currentIndexChanged(int index) 
{ 
    // Now, based on the new itemindex, let's change the translator 
    QString selectedLang = this->ui->comboBox->itemText(index); 

    QString language; 
    QDir d(":/translations/"); 
    QStringList files = d.entryList(QStringList("*.qm")); 
    for (int i = 0; i < files.count(); ++i) { 

     QTranslator translator; 
     translator.load(files[i], ":/translations/"); 
     language = translator.translate("MainWindow", 
       "English"); 

     if (language == selectedLang) { 
      if (!qApp->installTranslator(&translator)) { 
       qDebug("ERROR INSTALLING TRANSLATOR !!!"); 
      } 
      this->uiTranslate(); 
      break; 
     } 
    } 
} 

/// This function translates all the UI texts: 
void MainWindow::uiTranslate(void) { 

    this->setWindowTitle(tr("MainWindow")); 

    // Just for testing, also show all the messages 
    for (int i = 0; i < MSG_LAST; ++i) { 
     this->ui->textBrowser->append(this->getMessage((Messages)i)); 
    } 
} 

QString MainWindow::getMessage(Messages idx) { 
    static const char* const messagesText[MSG_LAST] = { 
     QT_TR_NOOP("Hello!"), 
     QT_TR_NOOP("Bye bye"), 
     QT_TR_NOOP("Nice to meet you") 
    }; 

    return (tr(messagesText[idx])); 
} 

в этом тесте приложение, интерфейс просто имеет выпадающий и текстовый браузер. Сопоставление заполнено языками, включенными в файл ресурсов. Когда я изменяю поле со списком, заголовок основного окна изменяется и сообщения печатаются на правильном языке.

В любом случае, спасибо! С уважением,

2

Я нашел настоящую проблему здесь. Обычно переводчики устанавливаются на main.cpp, поэтому объект-переводчик остается в памяти. Однако в моем случае я переключил переводчик после того, как пользователь изменил язык в диалоговом окне настроек, используя локальную переменную, но void QCoreApplication::installTranslator (QTranslator * translationFile) [static] нуждается в указателе. Эта локальная переменная удаляется, как только функция завершается. Итак, я объявил объект QTranslator в своем классе, поэтому он хранится в памяти.

1

Возможно, это неприменимо в этой ситуации, но часто люди забывают поместить макрос Q_OBJECT в объявление класса. В результате (среди прочих) tr() не работает.

+0

Спасибо за ваш ответ - вы спасли мое время! –

Смежные вопросы