Prérequis

sudo dnf install qt6-qtbase-devel
Paquets 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)