В прошлой заметке написал, что жестко прописывать кодировку для текстовых сообщений – есть моветон. Но сам же и прописал. Исправляюсь. Далее будет пример хранения текстовых ресурсов в отдельном файле.
Но для начала теория.
Для того, что бы указать, что текст будет переведен на русский (или любой другой язык) его надо обозначать в коде с помощью функции tr().
Такой текст может быть «собран» в один файл (с расширением *.ts), а затем переведен с помощью утилиты «Qt Linguist».
Результатом работы с такой утилитой будет файл *.qm. Именно его и будет использовать ваша программа для отображения русских сообщений.
Практика. Я взял проект созданный в предыдущей заметке.
Открываем файл проекта (файл с расширением *.pro) и прописываем в параметр «TRANSLATIONS» имя будущего файла *.ts (в моем случае ru.ts)
Теперь в коде указываем текстовые сообщения которые требуется поместить в файл ru.ts. Вот мой случай:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtCore> #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_butTest_clicked() { // Получаем текст из поля ввода QString str = ui->lineEdit->text(); if(str.isEmpty()){ QMessageBox mbox; mbox.setText(tr("Enter the text")); // <== ТЕКСТ ДЛЯ ПЕРЕВОДА mbox.exec(); return; } // Ищем строчку в listWidget QList<QListWidgetItem *> result_find = ui->listWidget->findItems(str, Qt::MatchExactly); if(result_find.count() == 0){ ui->listWidget->addItem(str); // Добавляем } else{ result_find[0]->setSelected(true); // Выделяем если уже есть } }
Кроме текста «Enter the text» в ts попадет и заголовок кнопки.
Переходим в меню «Инструменты» — «Внешние» — «Linguist» — «Обновить переводы»
В окне «Основные сообщения» видим что файл ru.ts был создан.
Запускаем утилиту «Qt Linguist». И открываем файл ru.ts
Так как файл у меня имеет правильное каноническое название, то редактор сразу понял, что текст будем переводить на русский 🙂
Теперь указываем объект перевода (окно «Context») и переводим нужные строки (окно «Strings») и вводите текст перевода в поле «Russian translation»
Интересно то, что строки и объекты можно помечать, когда они переведены. Для этого нажимается специальная кнопка на панели или клавиша Ctrl+Enter. После этого иконка становиться не в виде вопроса, а галочкой. Удобно.
После того как перевод закончен надо будет поместить его в каталог с программой.
Что бы узнать этот каталог для отладочной версии приложения, вернемся в Qt Create. Открываем панель «Вывод приложения» (например нажатием Alt-3) и запускаем собранное приложением (Ctrl-R).
Сохраняем файл в указанный каталог. Для этого в Qt Linguist выбираем меню
«File» — «Release As..». Сохранили ru.qm
Теперь осталось немного: заставить наш пример читать файл ru.qm и использовать. Переходим в main.cpp и прописывает после объявления QApplication код вызывающий класс QTranslator. Он в ответе за файл *.qm
#include <QtGui/QApplication> #include "mainwindow.h" #include <QtCore> #include <QTextCodec> #include <QTranslator> #include <QtGlobal> int main(int argc, char *argv[]) { QApplication a(argc, argv); // Вызываем поддержку перевода QTranslator * qt_translator = new QTranslator; QString file_translate = QApplication::applicationDirPath () + "/ru.qm"; if ( !qt_translator->load(file_translate)) { delete qt_translator; } else{ qApp->installTranslator( qt_translator ); } MainWindow w; w.show(); return a.exec(); }
У меня путь до файла с переводом почти статичный: ссылается на файл ru.qm в каталоге запуска. Но если у вас в название файла перевода указано имя локали то строчку отвечающая за путь до *.qm можно написать следующую:
QString file_translate = QApplication::applicationDirPath () + "/" + QLocale::system().name();
Компилируем и запускаем. Переведенный текст на русском. Если файла *.qm в каталоге не будет – ничего страшного не случиться: будет все латиницей)
Спасибо!)
Скомпилированный проект есть?
спасибо огромное! благодаря Вашей статье стало все предельно ясно)