Евгений Легоцкой7 февраля 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 хостинг.
- блог компании
Поддержать автора Donate

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.

Комментарии

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

Проект для путешественников от EVILEG.

Перейти
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
Поделиться в социальных сетях
Donate

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

Спасибо за вашу поддержку

Доступные способы поддержки проекта

PayPal

PatreonYooMoneyПодробнее
s

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

  • Результат:50баллов,
  • Очки рейтинга-4
s

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

  • Результат:66баллов,
  • Очки рейтинга-1
r

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

  • Результат:58баллов,
  • Очки рейтинга-2
Последние комментарии

Qt/C++ - Урок 061. Добавление изображений в приложение методом Drag And Drop из файлового менеджера

Доброго времени суток. А если нужно и изображение и текст? Что-то потерялся немного.... // Вместо отрисовки иконки и текста будем отрисовывать только одно изображение // с н…
АС

Qt/C++ - Урок 004. QSqlTableModel или Как представить таблицу из БД в Qt?

error insert into TableExample " Количество параметров не совпадает" Я путь свой прописывала и даже бд удаляла, чтобы заново сделать, не работает. (всё остальное как у вас... Вроде ка…
i
ЛД

GameDev на Qt - Урок 1. Отслеживание перемещения мыши в QGraphicsScene

Вполне возможно, что ты не закинул graphicsView в дизайнере в виджет
ЛД

GameDev на Qt - Урок 1. Отслеживание перемещения мыши в QGraphicsScene

Кому интересно, поворот в slotTarget можно в одну строку организовать this->setRotation(90 + rotation() + qRadiansToDegrees(qAtan2(mapFromScene(point).y(), mapFromScene(point).x())));
Сейчас обсуждают на форуме
K

Sorting the added QML elements in the ListModel

buy accutane online forum https://isotretinoinxp.top
  • Nomad
  • 30 июля 2022 г. 5:42

Как работать с HTMX?

Приветствую колеги. На днях наткнулся на вот это : https://htmx.org/ На офф сайте написанно вот такая фраза: htmx gives you access to AJAX, CSS Transitions, We…
h
  • harisr
  • 25 июля 2022 г. 2:56

QT - Native App Integration

Привет, у нас уже есть собственное приложение для Android. Можем ли мы интегрировать пользовательское представление QT в приложение со всем приложением QT внутри представления. Если да, ука…

Правильный запуск сервера на vps - Django

О я как то себе дома локальный сервер создавал. Вам же нужно просто сделать ручками конфигурацию системы. Настроить Nginx ну либо Apache (тут кому что нравится). Соответственно БД и всё остально…
o

Распознание объектов

Я к тому, что, возможно, софт уже есть.
О нас
Услуги
© EVILEG 2015-2022
Рекомендует хостинг TIMEWEB