Evgenii Legotckoi
Evgenii Legotckoi7. Februar 2022 08:52

Qt/C++ Tutorial 092. Übersetzungen für externe Textquellen erstellen

Heute werden wir eine ziemlich interessante Option zum Hinzufügen einer Übersetzung zu einer Qt/C++ - Anwendung diskutieren. Nämlich das Hinzufügen von Übersetzungen für Texte aus externen Quellen, wenn Sie Texte aus Datenbanken, einer externen API oder nur einigen anderen Dateien anzeigen.

Eine solche Situation kann beispielsweise in folgendem Fall auftreten, wenn Analysten in Ihrem Projekt Datensätze und Texte in einer externen Datenbank oder Textdatei bilden, aber aus irgendeinem Grund keine Möglichkeit der Mehrsprachigkeit besteht. Daher haben Sie bei der Abfrage dieser Daten nicht die Möglichkeit, die Sprache als zusätzlichen Parameter auszuwählen. Oder die endgültigen Daten werden beispielsweise von einer externen Ressource heruntergeladen und in einer SQLite-Datenbank gespeichert, natürlich ohne zusätzliche Übersetzungen. Aber gleichzeitig entwickeln Sie eine mehrsprachige Anwendung und müssen irgendwie Übersetzungsdateien für diese Texte generieren, damit das Übersetzungsteam sie übersetzen kann, und Sie können sie in der Anwendung verbinden.

Aber in Qt ist es auch möglich, dieses Problem zu lösen. In solchen Situationen können Sie auf die gleiche Weise auch Quellcodedateien generieren, z. B. beim Importieren von Daten während der Anwendungsentwicklung, und dann Übersetzungsdateien mit der Erweiterung *.ts generieren, die in QtLinguist verwendet werden um die Anwendung in Qt zu übersetzen und dann binäre *.qm Übersetzungsdateien zu generieren, die in die Anwendung aufgenommen werden.

Mal sehen, wie es funktioniert und was dafür getan werden muss.


Quelldateien hinzufügen

Damit die lupdate -Anwendung *.ts -Dateien erstellen kann, muss das Projekt über Header- und Quelldateien verfügen. Sie müssen aber nicht kompiliert werden. Es stellt sich als ein so interessanter Trick heraus, bei dem es nicht kompilierte Dateien im Projekt gibt, aber ohne sie ist es nicht möglich, *.ts -Dateien zu generieren.

pro-Dateien

Schauen wir uns den Inhalt der Profildatei an, um zu verstehen, welche Dateien in unserem Projekt benötigt werden.

TRANSLATIONS = myapp_en.ts \
               myapp_cs.ts \
               myapp_de.ts \
               myapp_es.ts

SOURCES += \
    translations_generated.cpp

HEADERS += \
    translations_generated.h

Wie Sie sehen können, gibt es *.ts -Übersetzungsdateien sowie zwei Dateien translations_generated.h und translations_generated.cpp .
Diese Dateien werden von Ihnen manuell generiert oder hinzugefügt, es spielt keine Rolle, es spielt keine Rolle, wie genau Sie diese Dateien erstellen und hinzufügen.
Die Hauptsache ist, dass diese Dateien einen angemessenen Inhalt haben.

translations_generated.h

Sie werden überrascht sein, aber wir lassen diese Datei leer.

translations_generated.cpp

Und hier die wichtigsten Inhalte.

#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

Beachten Sie einige wichtige Dinge zu dieser Datei:

  • TRANSLATOR_GUARD - was verhindert, dass die Datei kompiliert wird, wir brauchen es nicht
  • namespace - Namensräume erstellen den Kontext, in dem die Übersetzung generiert wird. In diesem Fall lautet der Kontext "my::translation::example"
  • Q_OBJECT - dieses Makro teilt lupdate mit, dass es hier Übersetzungsaufruffunktionen geben kann, mit deren Hilfe die Übersetzungsdatei erzeugt wird.

Nachdem Sie die Übersetzungsdateien mit dem Programm lupdate generiert haben, können Sie diese Zeichenfolgen in QtLinguist übersetzen und dann die binären Übersetzungsdateien kompilieren, die in Ihrer Anwendung korrekt verwendet werden.

Übersetzungen verwenden

Die Verwendung der Übersetzung unterscheidet sich darin, dass Sie keinen bestimmten Text schreiben, sondern eine Variable und einen Kontext an die Übersetzungsfunktion QCoreApplication::translate übergeben.

Mal sehen, wie es mit einer Beispielklasse aussehen würde. Diese Klasse hat eine Variable, die den zu übersetzenden String enthält, sowie eine Methode zur Rückgabe des übersetzten Werts.

#include <QCoreApplication>
#include <QString>

class ExampleTranslator
{
public:
    QString getTranslatedName() const
    {
        return QCoreApplication::translate("my::translation::example", m_name.toUtf8());
    }

private:
    QString m_name;
}

Die QCoreApplication::translate -Methode versucht bei einem ordnungsgemäß aufgerufenen Kontext, eine Übersetzung für den übergebenen Text zu finden, und gibt bei Erfolg den übersetzten Wert für die aktive Sprache in der Anwendung zurück.

Fazit

Damit ist es möglich, Übersetzungen beliebiger externer Texte auch mit Standard-Qt-Tools durchzuführen.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

pasagir
  • 7. Februar 2022 09:38

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

Evgenii Legotckoi
  • 7. Februar 2022 16:27

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

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken