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.

Комментарии

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

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 1:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 1:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 11:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 октября 2024 г. 14:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 8:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 7:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 11:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
m
moogo22 ноября 2024 г. 7:17
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi
Evgenii Legotckoi24 июня 2024 г. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 6:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 3:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

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