Сегодня обсудим довольно интересный вариант добавления перевод в приложение на 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.