Evgenii Legotckoi
Evgenii Legotckoi7 февраля 2022 г. 8:52

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

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

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

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

Evgenii Legotckoi
  • 7 февраля 2022 г. 16:27

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
e
  • ehot
  • 1 апреля 2024 г. 0:29

C++ - Тест 003. Условия и циклы

  • Результат:78баллов,
  • Очки рейтинга2
B

C++ - Тест 002. Константы

  • Результат:16баллов,
  • Очки рейтинга-10
B

C++ - Тест 001. Первая программа и типы данных

  • Результат:46баллов,
  • Очки рейтинга-6
Последние комментарии
k
kmssr9 февраля 2024 г. 5:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 12:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 21:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 19:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 декабря 2023 г. 8:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
G
Gar22 апреля 2024 г. 15:46
Clipboard Как скопировать окно целиком в clipb?
DA
Dr Gangil Academics20 апреля 2024 г. 17:45
Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
a
a_vlasov14 апреля 2024 г. 16:41
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел Дорофеев14 апреля 2024 г. 12:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex4 апреля 2024 г. 14:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

Следите за нами в социальных сетях