Prérequis
sudo dnf install qt6-qtbase-develPaquets Qt6Widgets Qt6Network
main.cpp (Fichier main.cpp)
Programme rédigé par un humain qui a la flemme de faire des classes.
Fichier unicode, avec 42 langues utilisables. Il en manque, mais il faut bien commencer par quelque chose
//
// Petite fenêtre de traduction, qui utilise un service json de google
//
// 18-jul-2026
#include <QApplication>
#include <QLineEdit>
#include <QComboBox>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QUrl>
#include <QUrlQuery>
#include "jsondownloader.h"
void FillLanguages(QComboBox &c)
{
c.addItem("ar - العربية");
c.addItem("bg - Български");
c.addItem("bn - বাংলা");
c.addItem("bs - Bosanski");
c.addItem("cs - Čeština");
c.addItem("de - Deutsch");
c.addItem("el - Ελληνικά");
c.addItem("en - English");
c.addItem("es - Español");
c.addItem("fa - فارسی");
c.addItem("fr - Français");
c.addItem("gu - ગુજરાતી");
c.addItem("he - עברית");
c.addItem("hi - हिन्दी");
c.addItem("hr - Hrvatski");
c.addItem("hu - Magyar");
c.addItem("id - Bahasa Indonesia") ;
c.addItem("it - Italiano ");
c.addItem("ja - 日本語");
c.addItem("ko - 한국어");
c.addItem("nl - Nederlands");
c.addItem("ml - മലയാളം");
c.addItem("mr - मराठी");
c.addItem("ms - Bahasa Melayu");
c.addItem("pa - ਪੰਜਾਬੀ");
c.addItem("pt - Português");
c.addItem("pl - Polski");
c.addItem("ro - Română");
c.addItem("ru - Русский");
c.addItem("sk - Slovenčina");
c.addItem("sl - Slovenščina");
c.addItem("sr - Српски / Srpski");
c.addItem("ta - தமிழ்");
c.addItem("te - తెలుగు");
c.addItem("th - ไทย");
c.addItem("tl - Filipino");
c.addItem("tr - Türkçe");
c.addItem("uk - Українська");
c.addItem("ur - اردو");
c.addItem("vi - Tiếng Việt");
c.addItem("zh-CN - Chinois simplifié");
c.addItem("zh-TW - chinois traditionnel");
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget fenetre ;
QComboBox csource , ctranslated ;
QLineEdit ttext ;
QLineEdit ftext ;
ftext.setFrame(false) ;
ftext.setReadOnly(true) ;
QHBoxLayout ligne1 ;
ligne1.addWidget(&csource) ;
ligne1.addWidget(&ctranslated) ;
QVBoxLayout layout ;
layout.addLayout(&ligne1) ;
layout.addWidget(&ttext);
layout.addWidget(&ftext);
fenetre.setLayout(&layout) ;
FillLanguages(csource) ;
csource.setCurrentIndex(7) ;
FillLanguages(ctranslated) ;
ctranslated.setCurrentIndex(10) ;
fenetre.setWindowTitle("Traduction");
fenetre.show() ;
JsonDownloader downloader;
// Quand on change une langue de destination, on simule une édition de texte, pour relancer la traduction
QObject::connect(&ctranslated, &QComboBox::currentIndexChanged, [&]() {
QMetaObject::invokeMethod(&ttext, "editingFinished");} ) ;
// Quand l'objet downloader a fini de télécharger le json, on récupère le texte traduit dans la
// zone de texte non éditable, mais copiable
QObject::connect(&downloader, &JsonDownloader::translationReady, &ftext, &QLineEdit::setText) ;
// quand on saisit du texte, il est traduit par l'API google
QObject::connect(&ttext, &QLineEdit::editingFinished,
[&]() {
QUrl url ;
QUrlQuery query ;
QString text = ttext.text() ;
QByteArray encoded = QUrl::toPercentEncoding(text);
url = "http://translate.googleapis.com/translate_a/single" ;
query.addQueryItem("client", "gtx") ;
query.addQueryItem("sl", csource.currentText().section(" - ", 0, 0)) ; // source language
query.addQueryItem("tl", ctranslated.currentText().section(" - ", 0, 0)) ; // translated language
query.addQueryItem("dt", "t") ;
query.addQueryItem("q", encoded) ;
url.setQuery(query) ;
downloader.download(url) ;
}) ;
return app.exec() ;
}
jsondownloader.h (Fichier jsondownloader.h)
Ce bout de code a été généré par chatgpt. Il va chercher un flux json par internet.
Ce point .h est compilé par le meta object code, le compilateur de Qt pour transformer les .h en classes C++ compilables.
Le fichier intermédiaire .cpp sera ensuite compilé par g++, voir le makefile pour comprendre.
#include <iostream>
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
class JsonDownloader : public QObject
{
Q_OBJECT
public:
JsonDownloader(QObject *parent = nullptr) : QObject(parent)
{
std::cout << "Constructeur JsonDownloader\n";
connect(&manager, &QNetworkAccessManager::finished,
this, &JsonDownloader::onFinished);
}
void download(const QUrl &url)
{
std::cout << "Téléchargement de : "
<< url.toString().toStdString()
<< std::endl;
QNetworkRequest request(url);
manager.get(request);
std::cout << "Requête envoyée\n";
}
private slots:
private slots:
void onFinished(QNetworkReply *reply)
{
std::cout << "Réponse reçue\n";
if (reply->error() != QNetworkReply::NoError) {
std::cout << "Erreur réseau : "
<< reply->errorString().toStdString()
<< std::endl;
reply->deleteLater();
return;
}
QByteArray data = reply->readAll();
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
std::cout << "Erreur JSON : "
<< error.errorString().toStdString()
<< std::endl;
reply->deleteLater();
return;
}
if (!doc.isArray()) {
std::cout << "La racine n'est pas un tableau."
<< std::endl;
reply->deleteLater();
return;
}
QJsonArray root = doc.array();
if (root.isEmpty()) {
std::cout << "Tableau vide." << std::endl;
reply->deleteLater();
return;
}
QJsonArray translations = root[0].toArray();
for (const QJsonValue &value : translations)
{
QJsonArray item = value.toArray();
if (item.size() >= 2)
{
QString translated = item[0].toString();
QString original = item[1].toString();
emit translationReady(translated) ;
std::cout
<< original.toStdString()
<< " -> "
<< translated.toStdString()
<< std::endl;
}
}
reply->deleteLater();
}
signals:
void translationReady(const QString &translated) ;
private:
QNetworkAccessManager manager;
};
Le makefile (fichier makefile)
Pour une application Qt en C++
#paths SRC=.. BIN=bin OBJ=obj #packages PKINCQT6 = `pkg-config --cflags Qt6Widgets Qt6Network` PKLIBQT6 = `pkg-config --libs Qt6Widgets Qt6Network` QTLIBEXEC = `qmake6 -query QT_HOST_LIBEXECS` # En principe c'est le travail de CMake, mais make le fait très bien # g++ le compilateur C++ de gcc # option -g pour le débug avec KDbg ou gdb # moc meta object code, le compilateur de Qt pour transformer les .h en classes C++ compilables target: $(BIN)/translate #compil $(OBJ)/main.o : $(SRC)/main.cpp g++ -g -c -o $(OBJ)/main.o $(PKINCQT6) $(SRC)/main.cpp $(OBJ)/jsondownloader.o: $(SRC)/jsondownloader.h $(QTLIBEXEC)/moc $(SRC)/jsondownloader.h -o $(OBJ)/moc_jsondownloader.cpp g++ -g -c -o $(OBJ)/jsondownloader.o $(PKINCQT6) $(OBJ)/moc_jsondownloader.cpp #link $(BIN)/translate: $(OBJ)/main.o $(OBJ)/jsondownloader.o g++ -g -o $(BIN)/translate $(OBJ)/main.o $(OBJ)/jsondownloader.o $(PKLIBQT6) clean: rm $(OBJ)/*.o
Compilation
On lance la compilation avec make
Exécution
aller dans le répertoire bin (cd bin)
cliquer dessus translate, et le programme se lance...
traduction en anglais

en italien

en persan (fa = farsi)
