Evgenii Legotckoi
7 февраля 2022 г. 19:52

Qt/C++ Урок 092. Создание переводов для внешних источников текста

Сегодня обсудим довольно интересный вариант добавления перевод в приложение на Qt/C++. А именно добавление переводов для текстов из внешних источников, когда вы отображаете тексты из баз данных, внешнего API или просто каких-то других файлов.

Такая ситуация можно возникнуть в следующем случае, например аналитики в вашем проекте формируют наборы данных и текстов в какой-то внешней базе данных или текстовых файлах, но там отсутствует возможность мультиязычности по какой-то причине. И поэтому у вас нет возможности выбирать язык дополнительным параметром при запросе этих данных. Или например, итоговые данные скачиваются с внешнего ресурса и сохраняются в базу данных SQLite, естественно без дополнительных переводов. Но при этом вы разрабатываете мультиязычное приложение и вам необходимо каким-то образом сформировать файлы переводов и для этих текстов, чтобы команда переводчиков могла их перевести, а вы смогли бы их подключать в приложении.

Но в Qt есть возможноть решить и такую проблему. В таких ситуациях можно точно также сформировать файлы исходных кодов, например сгенерировать при импорте данных во время разработки приложения, после чего сформировать файлы переводов с раширением *.ts , которые используются в QtLinguist для перевода приложения на Qt и после чего сформировать бинарные *.qm файлы переводов, которые будут подключаться в приложении.

Давайте разберёмся, как это работает и что нужно предпринять для этого.


Добавление файлов исходных кодов

Для того, чтобы приложение lupdate смогло создать *.ts файлы, необходимо, чтобы в проекте присутствовали заголовочные файлы и файлы исходных кодов. Но их не обязательно компилировать. Получается такой интересный трюк, при котором в проекте имеются некомпилируемые файлы, но без них не получится сгенерировать *.ts файлы.

pro файл

Давайте посмотрим на содержимое pro файла, чтобы понять, ккакие файлы необходимы в нашем проекте.

  1. TRANSLATIONS = myapp_en.ts \
  2. myapp_cs.ts \
  3. myapp_de.ts \
  4. myapp_es.ts
  5.  
  6. SOURCES += \
  7. translations_generated.cpp
  8.  
  9. HEADERS += \
  10. translations_generated.h
  11.  

Как видите, здесь имеются *.ts файлы переводов, а также два файла translations_generated.h и translations_generated.cpp .
Эти файлы являются сгенерированными или добавлены вами вручную, это не принципиально, абсолютно неважно, как именно образом вы создадите и добавите эти файлы.
Главное, чтобы эти файлы имели соответсвуюшее содержание.

translations_generated.h

Вы удивитесь, но этот файл оставляем пустым.

translations_generated.cpp

А вот здесь будет самое важное содержание.

  1. #ifdef TRANSLATOR_GUARD
  2.  
  3. //
  4. // Uncompiled file, only as source for lupdate.exe
  5. //
  6. namespace my
  7. {
  8. namespace translation
  9. {
  10. namespace example
  11. {
  12. Q_OBJECT
  13. tr("Height");
  14. tr("Total length");
  15. tr("Length");
  16. tr("Home");
  17. } // namespace my
  18. } // namespace translation
  19. } // namespace example
  20.  
  21. #endif // TRANSLATOR_GUARD

Обратите внимание на несколько важных моментов в этом файле:

  • TRANSLATOR_GUARD - который предотвражает компилирование файла, нам это не нужно
  • namespace - области имён создают контекст, в котором будет сформирован перевод. В данном случае контекст будет следующий "my::translation::example"
  • Q_OBJECT - данный макрос сообщит lupdate, что здесь могут быть функции вызова перевода, с помощью которых и будет сформирован файл переводов.

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

Использование переводов

Использование переводо будет отличаться тем, что вы будете писать не конкретный текст, а передавать переменную и контекст в функцию перевода QCoreApplication::translate .

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

  1. #include <QCoreApplication>
  2. #include <QString>
  3.  
  4. class ExampleTranslator
  5. {
  6. public:
  7. QString getTranslatedName() const
  8. {
  9. return QCoreApplication::translate("my::translation::example", m_name.toUtf8());
  10. }
  11.  
  12. private:
  13. QString m_name;
  14. }

Метод QCoreApplication::translate с правильно вызванным контекстом попробует отыскать перевод для переданного текста и в случае успеха вернёт переведённое значение для активного языка в приложении.

Заключение

Таким образом можно выполнять переводы любых внешних текстов, причём стандартными средствами Qt.

Вам это нравится? Поделитесь в социальных сетях!

pasagir
  • 7 февраля 2022 г. 20:38

Oh, he is alive! I started to think you died of covid. Glad to see you! Good lesson.

Evgenii Legotckoi
  • 8 февраля 2022 г. 3:27

Thanks! Yes, I returned. But I will be focused on articles and site functionality now.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь