Сегодня обсудим довольно интересный вариант добавления перевод в приложение на Qt/C++. А именно добавление переводов для текстов из внешних источников, когда вы отображаете тексты из баз данных, внешнего API или просто каких-то других файлов.
Такая ситуация можно возникнуть в следующем случае, например аналитики в вашем проекте формируют наборы данных и текстов в какой-то внешней базе данных или текстовых файлах, но там отсутствует возможность мультиязычности по какой-то причине. И поэтому у вас нет возможности выбирать язык дополнительным параметром при запросе этих данных. Или например, итоговые данные скачиваются с внешнего ресурса и сохраняются в базу данных SQLite, естественно без дополнительных переводов. Но при этом вы разрабатываете мультиязычное приложение и вам необходимо каким-то образом сформировать файлы переводов и для этих текстов, чтобы команда переводчиков могла их перевести, а вы смогли бы их подключать в приложении.
Но в Qt есть возможноть решить и такую проблему. В таких ситуациях можно точно также сформировать файлы исходных кодов, например сгенерировать при импорте данных во время разработки приложения, после чего сформировать файлы переводов с раширением *.ts , которые используются в QtLinguist для перевода приложения на Qt и после чего сформировать бинарные *.qm файлы переводов, которые будут подключаться в приложении.
Давайте разберёмся, как это работает и что нужно предпринять для этого.
Добавление файлов исходных кодов
Для того, чтобы приложение lupdate смогло создать *.ts файлы, необходимо, чтобы в проекте присутствовали заголовочные файлы и файлы исходных кодов. Но их не обязательно компилировать. Получается такой интересный трюк, при котором в проекте имеются некомпилируемые файлы, но без них не получится сгенерировать *.ts файлы.
pro файл
Давайте посмотрим на содержимое pro файла, чтобы понять, ккакие файлы необходимы в нашем проекте.
TRANSLATIONS = myapp_en.ts \ myapp_cs.ts \ myapp_de.ts \ myapp_es.ts SOURCES += \ translations_generated.cpp HEADERS += \ translations_generated.h
Как видите, здесь имеются
*.ts
файлы переводов, а также два файла
translations_generated.h
и
translations_generated.cpp
.
Эти файлы являются сгенерированными или добавлены вами вручную, это не принципиально, абсолютно неважно, как именно образом вы создадите и добавите эти файлы.
Главное, чтобы эти файлы имели соответсвуюшее содержание.
translations_generated.h
Вы удивитесь, но этот файл оставляем пустым.
translations_generated.cpp
А вот здесь будет самое важное содержание.
#ifdef TRANSLATOR_GUARD // // Uncompiled file, only as source for lupdate.exe // namespace my { namespace translation { namespace example { Q_OBJECT tr("Height"); tr("Total length"); tr("Length"); tr("Home"); } // namespace my } // namespace translation } // namespace example #endif // TRANSLATOR_GUARD
Обратите внимание на несколько важных моментов в этом файле:
- TRANSLATOR_GUARD - который предотвражает компилирование файла, нам это не нужно
- namespace - области имён создают контекст, в котором будет сформирован перевод. В данном случае контекст будет следующий "my::translation::example"
- Q_OBJECT - данный макрос сообщит lupdate, что здесь могут быть функции вызова перевода, с помощью которых и будет сформирован файл переводов.
После того, как вы сгенерируете файлы переводов с помощью программы lupdate, вы сможетее выполнить перевод этих строчек в QtLinguist, а потом скомпилировать бинарный файлы переводов, которые уже останется правильно использовать в вашем приложении.
Использование переводов
Использование переводо будет отличаться тем, что вы будете писать не конкретный текст, а передавать переменную и контекст в функцию перевода QCoreApplication::translate .
Давайте посмотрим, как это будет выглядеть на примере класса. В данном классе есть переменная, которая содержит строчку, которую нужно перевести, а также метод для возврата переведённого значения.
#include <QCoreApplication> #include <QString> class ExampleTranslator { public: QString getTranslatedName() const { return QCoreApplication::translate("my::translation::example", m_name.toUtf8()); } private: QString m_name; }
Метод QCoreApplication::translate с правильно вызванным контекстом попробует отыскать перевод для переданного текста и в случае успеха вернёт переведённое значение для активного языка в приложении.
Заключение
Таким образом можно выполнять переводы любых внешних текстов, причём стандартными средствами Qt.
Oh, he is alive! I started to think you died of covid. Glad to see you! Good lesson.
Thanks! Yes, I returned. But I will be focused on articles and site functionality now.