On a un programme qui traduit des textes, on va essayer de les faire prononcer par la synthèse vocale

Prérequis

sudo dnf install qt6-qtbase-devel
sudo dnf install qt6-qtspeech-devel
Paquets Qt6Widgets Qt6Network Qt6TextToSpeech

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 <QTextToSpeech>

#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;
  QTextToSpeech speech ;
  
  // 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
  // on utilise une fonction lambda qui va faire parler...
  QObject::connect(&downloader, &JsonDownloader::translationReady,
                 &ftext,
                 [&ftext, &speech, &ctranslated](const QString &text) {
                     ftext.setText(text) ;

                     speech.setLocale(QLocale(ctranslated.currentText().section(" - ", 0, 0))) ;
                     speech.say(text) ;
                 });
  
  // 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.
Fichier identique au programme translate.

Le makefile (fichier makefile)
Pour une application Qt en C++

#paths
SRC=..
BIN=bin
OBJ=obj

#packages
PKINCQT6  = `pkg-config --cflags Qt6Widgets Qt6Network Qt6TextToSpeech`
PKLIBQT6  = `pkg-config --libs Qt6Widgets Qt6Network Qt6TextToSpeech`
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, et il parle !


en italien, et il parle avec l'accent italien.


en persan (fa = farsi) il parle aussi

il n'y a qu'en japonais que le programme plante un peu.