Русская речь в Qt приложениях

В прошлой заметке написал, что жестко прописывать кодировку для текстовых сообщений – есть моветон. Но сам же и прописал. Исправляюсь. Далее будет пример хранения текстовых ресурсов в отдельном файле.

Но для начала теория.
Для того, что бы указать, что текст будет переведен на русский (или любой другой язык) его надо обозначать в коде с помощью функции 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 в каталоге не будет – ничего страшного не случиться: будет все латиницей)

Русская речь в Qt приложениях: 3 комментария

  1. Екатерина

    спасибо огромное! благодаря Вашей статье стало все предельно ясно)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *