diff --git a/README.md b/README.md index 6ad8882..9d3335f 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ chat with your Hermes agent from the phone — and use it with your **voice**. QMediaPlayer; optional auto-read of every completed reply - **Voice dialog (hands-free)**: continuous listen → transcribe → send → read-aloud loop, auto-stopping on speech pauses (tunable) +- **Localized UI**: English (source), Italian, French and German — follows + the system language - Cancel a running turn, resync from server state, cover page ## Requirements @@ -47,6 +49,22 @@ requires a server address. > pick another one, leave the voice empty (server default), or add your > language's voices to your own `hermes-webui`. +## Localization + +The UI follows the system language: English is the source language, and +Italian, French and German translations live in `translations/*.ts`. At build +time (`sailfishapp_i18n`) the `.qm` files are generated and installed to +`/usr/share/harbour-hermes/translations`, where the app loads them on startup. +After changing UI strings: + +```bash +lupdate -no-obsolete -recursive src qml \ + -ts translations/harbour-hermes-it.ts \ + translations/harbour-hermes-fr.ts \ + translations/harbour-hermes-de.ts +# then edit the .ts files and rebuild +``` + ## Build See [docs/BUILD.md](docs/BUILD.md) (Sailfish SDK, `sfdk build` / `sfdk deploy`) @@ -55,6 +73,6 @@ speaks (validated live against a real instance). ## Status -Version 0.3.2 — protocol and C++ core validated against a real `hermes-webui` -(login, sessions, streaming chat, TTS, STT, voice dialog); on-device testing -still ongoing. +Version 0.4.0 — protocol and C++ core validated against a real `hermes-webui` +(login, sessions, streaming chat, TTS, STT, voice dialog); UI in English, +Italian, French and German; on-device testing still ongoing. diff --git a/docs/BUILD.md b/docs/BUILD.md index 6e7211f..54e9ca1 100644 --- a/docs/BUILD.md +++ b/docs/BUILD.md @@ -76,14 +76,27 @@ richiede il probe WebUI su :8899). Esito 12/09/2026: unit 9/9, live completo OK. ```bash cd ~/workspace -tar czf harbour-hermes-0.3.2.tar.gz \ - --transform 's,^harbour-hermes,harbour-hermes-0.3.2,' \ +tar czf harbour-hermes-0.4.0.tar.gz \ + --transform 's,^harbour-hermes,harbour-hermes-0.4.0,' \ --exclude='.git' harbour-hermes ``` -Lo spec si aspetta la directory `harbour-hermes-0.3.2/` (pattern degli altri +Lo spec si aspetta la directory `harbour-hermes-0.4.0/` (pattern degli altri progetti: cercato in modo robusto anche per i sorgenti live di sfdk). +## Traduzioni + +Stringhe UI in `qsTr()` (QML) e `tr()` (C++). Dopo modifiche alle stringhe: + +```bash +lupdate -no-obsolete -recursive src qml -ts translations/harbour-hermes-it.ts \ + translations/harbour-hermes-fr.ts translations/harbour-hermes-de.ts +``` + +In build `CONFIG += sailfishapp_i18n` compila i `.qm` e li installa in +`/usr/share/harbour-hermes/translations` (caricati all'avvio in base alla +lingua di sistema). + ## 5. Dipendenze lato server (WebUI) - `/api/transcribe` richiede un provider STT attivo sul server diff --git a/harbour-hermes.pro b/harbour-hermes.pro index 1cd481e..fe0e5e2 100644 --- a/harbour-hermes.pro +++ b/harbour-hermes.pro @@ -49,3 +49,16 @@ icons128.files = $$PWD/icons/128x128/harbour-hermes.png icons172.path = /usr/share/icons/hicolor/172x172/apps icons172.files = $$PWD/icons/172x172/harbour-hermes.png INSTALLS += icons86 icons108 icons128 icons172 + +# Traduzioni: l'inglese e' la lingua sorgente; it/fr/de tradotte. +# Con sailfishapp_i18n i .qm vengono generati in build e installati in +# /usr/share/harbour-hermes/translations, dove l'app li carica all'avvio +# in base alla lingua di sistema (pattern ufficiale Sailfish). +CONFIG += sailfishapp_i18n + +TRANSLATIONS += \ + translations/harbour-hermes-it.ts \ + translations/harbour-hermes-fr.ts \ + translations/harbour-hermes-de.ts + +OTHER_FILES += translations/*.ts diff --git a/qml/cover/CoverPage.qml b/qml/cover/CoverPage.qml index 732f213..a663e4f 100644 --- a/qml/cover/CoverPage.qml +++ b/qml/cover/CoverPage.qml @@ -14,7 +14,7 @@ CoverBackground { Label { anchors.centerIn: parent - text: chat.count + qsTr(" messages") + text: chat.count === 1 ? qsTr("1 message") : qsTr("%1 messages").arg(chat.count) color: Theme.primaryColor } diff --git a/qml/pages/SessionsPage.qml b/qml/pages/SessionsPage.qml index 30176f8..25f32da 100644 --- a/qml/pages/SessionsPage.qml +++ b/qml/pages/SessionsPage.qml @@ -122,6 +122,6 @@ Page { function describe(n, u) { var c = n ? n : 0 var d = new Date((u ? u : 0) * 1000) - return c + qsTr(" messages") + " · " + Qt.formatDateTime(d, "dd/MM HH:mm") + return (c === 1 ? qsTr("1 message") : qsTr("%1 messages").arg(c)) + " · " + Qt.formatDateTime(d, "dd/MM HH:mm") } } diff --git a/rpm/harbour-hermes.spec b/rpm/harbour-hermes.spec index da80409..600ee40 100644 --- a/rpm/harbour-hermes.spec +++ b/rpm/harbour-hermes.spec @@ -1,6 +1,6 @@ Name: harbour-hermes Summary: Client for the Hermes Web UI with voice -Version: 0.3.2 +Version: 0.4.0 Release: 1 Group: Qt/Qt License: MIT @@ -16,6 +16,7 @@ BuildRequires: pkgconfig(Qt5Quick) BuildRequires: pkgconfig(Qt5Network) BuildRequires: pkgconfig(Qt5Multimedia) BuildRequires: desktop-file-utils +BuildRequires: qt5-qttools-linguist %description Native Sailfish OS client for the Hermes Web UI (hermes-webui). @@ -24,6 +25,12 @@ Sessions list, chat with live streaming replies, voice dictation (server-side TTS), plus a hands-free conversation mode. %changelog +* Sat Sep 12 2026 Carlo Baratto - 0.4.0-1 +- Localizzazione dell'interfaccia: italiano, inglese (sorgente), + francese e tedesco (78 stringhe per lingua); .qm generati con + sailfishapp_i18n e installati in /usr/share/harbour-hermes/translations, + caricati in base alla lingua di sistema; stringhe C++ in tr(); + plurali dei messaggi corretti * Sat Sep 12 2026 Carlo Baratto - 0.3.2-1 - README: nota sui limiti delle voci TTS (allowlist del server; 400 invalid voice) e su come gestirli (voce vuota = default del server) @@ -93,3 +100,4 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop || tr %{_datadir}/icons/hicolor/128x128/apps/%{name}.png %{_datadir}/icons/hicolor/172x172/apps/%{name}.png %{_datadir}/%{name}/qml +%{_datadir}/%{name}/translations diff --git a/src/apiclient.cpp b/src/apiclient.cpp index 8e54db6..1ed04ee 100644 --- a/src/apiclient.cpp +++ b/src/apiclient.cpp @@ -65,9 +65,9 @@ QString ApiClient::errorFromReply(QNetworkReply *reply, const QByteArray &body) } const int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (status == 401) - return QStringLiteral("Authentication required"); + return tr("Authentication required"); if (status > 0) - return QStringLiteral("HTTP %1").arg(status); + return tr("HTTP %1").arg(status); return reply->errorString(); } @@ -152,7 +152,7 @@ void ApiClient::checkAuth() void ApiClient::login(const QString &password) { if (m_settings->baseUrl().isEmpty()) { - setLastError(QStringLiteral("Server address not configured")); + setLastError(tr("Server address not configured")); return; } setLastError(QString()); diff --git a/src/chatmodel.cpp b/src/chatmodel.cpp index f926fa7..e9732fb 100644 --- a/src/chatmodel.cpp +++ b/src/chatmodel.cpp @@ -88,12 +88,12 @@ void ChatModel::send(const QString &text) // "non fare nulla" senza che si capisse il perché. if (m_sessionId.isEmpty()) { qDebug() << "[chat] send rifiutato: nessuna sessione aperta"; - emit notice(QStringLiteral("No session open")); + emit notice(tr("No session open")); return; } if (m_busy) { qDebug() << "[chat] send rifiutato: un turno e' gia' in corso"; - emit notice(QStringLiteral("Wait for the current reply")); + emit notice(tr("Wait for the current reply")); return; } qDebug() << "[chat] invio:" << trimmed.size() << "caratteri"; diff --git a/src/main.cpp b/src/main.cpp index 12d522b..cdb4471 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,9 @@ #include +#include #include #include #include +#include #include #include "apiclient.h" @@ -19,9 +21,17 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) // AppConfigLocation = ~/.config/harbour/hermes (zona persistente della sandbox). app->setOrganizationName(QStringLiteral("harbour")); app->setApplicationName(QStringLiteral("hermes")); - app->setApplicationVersion(QStringLiteral("0.3.2")); + app->setApplicationVersion(QStringLiteral("0.4.0")); - qDebug() << "harbour-hermes v0.3.2 build" << __DATE__ << __TIME__; + qDebug() << "harbour-hermes v0.4.0 build" << __DATE__ << __TIME__; + + // Traduzioni: it/fr/de da /usr/share/harbour-hermes/translations, in base + // alla lingua di sistema (l'inglese e' la lingua sorgente: nessun .qm). + QTranslator translator; + if (translator.load(QLocale(), QStringLiteral("harbour-hermes"), + QStringLiteral("-"), + QStringLiteral("/usr/share/harbour-hermes/translations"))) + app->installTranslator(&translator); Settings settings; ApiClient api(&settings); diff --git a/src/recorder.cpp b/src/recorder.cpp index 31c7326..0fccffe 100644 --- a/src/recorder.cpp +++ b/src/recorder.cpp @@ -69,7 +69,7 @@ bool Recorder::start() const QString container = chooseContainer(m_rec->supportedContainers()); const QString codec = chooseCodec(m_rec->supportedAudioCodecs()); if (container.isEmpty() || codec.isEmpty()) { - emit failed(QStringLiteral("No audio format available")); + emit failed(tr("No audio format available")); return false; } m_fallbackTried = false; diff --git a/translations/harbour-hermes-de.ts b/translations/harbour-hermes-de.ts new file mode 100644 index 0000000..42a4fca --- /dev/null +++ b/translations/harbour-hermes-de.ts @@ -0,0 +1,426 @@ + + + + + ApiClient + + + Authentication required + Authentifizierung erforderlich + + + + HTTP %1 + HTTP %1 + + + + Server address not configured + Serveradresse nicht konfiguriert + + + + ChatModel + + + No session open + Keine Sitzung geöffnet + + + + Wait for the current reply + Warte auf die laufende Antwort + + + + ChatPage + + + Chat + Chat + + + + + Hermes is writing… + Hermes schreibt… + + + + + Speaking… + Wiedergabe… + + + + Voice mode: on + Sprachmodus: an + + + + Voice mode: off + Sprachmodus: aus + + + + Read last reply aloud + Letzte Antwort vorlesen + + + + Auto-read: on + Auto-Vorlesen: an + + + + Auto-read: off + Auto-Vorlesen: aus + + + + Stop playback + Wiedergabe stoppen + + + + Cancel run + Antwort abbrechen + + + + Resync + Neu synchronisieren + + + + Recording… %1 — tap Stop to transcribe + Aufnahme… %1 — tippe auf Stop zum Transkribieren + + + + + Transcribing… + Transkription… + + + + Stop + Stop + + + + Mic + Mikro + + + + Message… + Nachricht… + + + + Send + Senden + + + + Voice mode off after repeated errors + Sprachmodus nach wiederholten Fehlern aus + + + + Wait for the current reply first + Warte zuerst auf die laufende Antwort + + + + ● Listening — speak, I stop at the pause (tap to exit) + ● Höre zu — sprich, ich stoppe bei der Pause (tippen zum Beenden) + + + + Sending… + Senden… + + + + Voice mode on + Sprachmodus an + + + + No reply to read yet + Noch keine Antwort zum Vorlesen + + + + CoverPage + + + 1 message + 1 Nachricht + + + + %1 messages + %1 Nachrichten + + + + Recording… + Aufnahme… + + + + Writing… + Schreibt… + + + + LoginPage + + + + Sign in + Anmelden + + + + Use the same password you use in the Hermes Web UI in your browser. + Nutze dasselbe Passwort wie in der Hermes Web UI im Browser. + + + + Server + Server + + + + Password + Passwort + + + + Signing in… + Anmeldung… + + + + Recorder + + + No audio format available + Kein Audioformat verfügbar + + + + SessionsPage + + + Sessions + Sitzungen + + + + New session + Neue Sitzung + + + + Refresh + Aktualisieren + + + + Settings + Einstellungen + + + + Sign out + Abmelden + + + + No sessions + Keine Sitzungen + + + + Pull down to create a new session + Nach unten ziehen, um eine neue Sitzung zu erstellen + + + + 1 message + 1 Nachricht + + + + %1 messages + %1 Nachrichten + + + + SettingsPage + + + Settings + Einstellungen + + + + Server + Server + + + + Web UI address + Web-UI-Adresse + + + + Voice + Stimme + + + + Read-aloud voice + Vorlese-Stimme + + + + + (server default) + (Server-Standard) + + + + Voice presets (comma-separated) + Stimm-Presets (durch Kommas getrennt) + + + + TTS engine + TTS-Engine + + + + Engine presets (comma-separated) + Engine-Presets (durch Kommas getrennt) + + + + Read replies aloud + Antworten vorlesen + + + + Speak every completed reply automatically + Jede fertige Antwort automatisch vorlesen + + + + Voice dialog + Sprachdialog + + + + Send right after dictation + Direkt nach dem Diktat senden + + + + Send the transcribed text automatically, without tapping Send + Den transkribierten Text automatisch senden, ohne Senden zu drücken + + + + Auto-stop pause + Auto-Stopp-Pause + + + + 1.0 second + 1,0 Sekunden + + + + 1.5 seconds + 1,5 Sekunden + + + + 2.0 seconds + 2,0 Sekunden + + + + 3.0 seconds + 3,0 Sekunden + + + + Mic sensitivity + Mikrofon-Empfindlichkeit + + + + High (even soft voices) + Hoch (auch leise Stimmen) + + + + Medium + Mittel + + + + Low (noisy rooms) + Niedrig (laute Umgebung) + + + + Account + Konto + + + + Sign out + Abmelden + + + + About + Über + + + + Native client for the Hermes Web UI (hermes-webui): sessions, live streaming chat, server-side voice dictation and read-aloud. + Nativer Client für die Hermes Web UI (hermes-webui): Sitzungen, Live-Streaming-Chat, server-seitiges Diktat und Vorlesen. + + + + VoiceRecorder + + + No audio input device + Kein Audioeingabegerät + + + + Audio input format not supported + Audioeingabeformat nicht unterstützt + + + + Could not start audio capture + Aufnahme konnte nicht gestartet werden + + + + Could not write the audio file + Audiodatei konnte nicht geschrieben werden + + + diff --git a/translations/harbour-hermes-fr.ts b/translations/harbour-hermes-fr.ts new file mode 100644 index 0000000..9a2d690 --- /dev/null +++ b/translations/harbour-hermes-fr.ts @@ -0,0 +1,426 @@ + + + + + ApiClient + + + Authentication required + Authentification requise + + + + HTTP %1 + HTTP %1 + + + + Server address not configured + Adresse du serveur non configurée + + + + ChatModel + + + No session open + Aucune session ouverte + + + + Wait for the current reply + Attendez la réponse en cours + + + + ChatPage + + + Chat + Discussion + + + + + Hermes is writing… + Hermes écrit… + + + + + Speaking… + Lecture… + + + + Voice mode: on + Mode vocal : activé + + + + Voice mode: off + Mode vocal : désactivé + + + + Read last reply aloud + Lire la dernière réponse + + + + Auto-read: on + Lecture auto : activée + + + + Auto-read: off + Lecture auto : désactivée + + + + Stop playback + Arrêter la lecture + + + + Cancel run + Annuler la réponse + + + + Resync + Resynchroniser + + + + Recording… %1 — tap Stop to transcribe + Enregistrement… %1 — appuyez sur Stop pour transcrire + + + + + Transcribing… + Transcription… + + + + Stop + Stop + + + + Mic + Micro + + + + Message… + Message… + + + + Send + Envoyer + + + + Voice mode off after repeated errors + Mode vocal désactivé après plusieurs erreurs + + + + Wait for the current reply first + Attendez d'abord la réponse en cours + + + + ● Listening — speak, I stop at the pause (tap to exit) + ● À l'écoute — parlez, je m'arrête à la pause (touchez pour quitter) + + + + Sending… + Envoi… + + + + Voice mode on + Mode vocal activé + + + + No reply to read yet + Aucune réponse à lire + + + + CoverPage + + + 1 message + 1 message + + + + %1 messages + %1 messages + + + + Recording… + Enregistrement… + + + + Writing… + Écriture… + + + + LoginPage + + + + Sign in + Se connecter + + + + Use the same password you use in the Hermes Web UI in your browser. + Utilisez le même mot de passe que dans l'Hermes Web UI de votre navigateur. + + + + Server + Serveur + + + + Password + Mot de passe + + + + Signing in… + Connexion… + + + + Recorder + + + No audio format available + Aucun format audio disponible + + + + SessionsPage + + + Sessions + Sessions + + + + New session + Nouvelle session + + + + Refresh + Actualiser + + + + Settings + Paramètres + + + + Sign out + Se déconnecter + + + + No sessions + Aucune session + + + + Pull down to create a new session + Tirez vers le bas pour créer une nouvelle session + + + + 1 message + 1 message + + + + %1 messages + %1 messages + + + + SettingsPage + + + Settings + Paramètres + + + + Server + Serveur + + + + Web UI address + Adresse de la Web UI + + + + Voice + Voix + + + + Read-aloud voice + Voix de lecture + + + + + (server default) + (défaut du serveur) + + + + Voice presets (comma-separated) + Préréglages de voix (séparés par des virgules) + + + + TTS engine + Moteur TTS + + + + Engine presets (comma-separated) + Préréglages de moteurs (séparés par des virgules) + + + + Read replies aloud + Lire les réponses à voix haute + + + + Speak every completed reply automatically + Prononcer automatiquement chaque réponse terminée + + + + Voice dialog + Dialogue vocal + + + + Send right after dictation + Envoyer juste après la dictée + + + + Send the transcribed text automatically, without tapping Send + Envoyer automatiquement le texte transcrit, sans appuyer sur Envoyer + + + + Auto-stop pause + Pause d'arrêt auto + + + + 1.0 second + 1,0 seconde + + + + 1.5 seconds + 1,5 seconde + + + + 2.0 seconds + 2,0 secondes + + + + 3.0 seconds + 3,0 secondes + + + + Mic sensitivity + Sensibilité du micro + + + + High (even soft voices) + Élevée (voix faibles) + + + + Medium + Moyenne + + + + Low (noisy rooms) + Faible (pièces bruyantes) + + + + Account + Compte + + + + Sign out + Se déconnecter + + + + About + À propos + + + + Native client for the Hermes Web UI (hermes-webui): sessions, live streaming chat, server-side voice dictation and read-aloud. + Client natif pour l'Hermes Web UI (hermes-webui) : sessions, chat en streaming, dictée et lecture à voix haute côté serveur. + + + + VoiceRecorder + + + No audio input device + Aucun périphérique d'entrée audio + + + + Audio input format not supported + Format d'entrée audio non pris en charge + + + + Could not start audio capture + Impossible de démarrer l'enregistrement + + + + Could not write the audio file + Impossible d'écrire le fichier audio + + + diff --git a/translations/harbour-hermes-it.ts b/translations/harbour-hermes-it.ts new file mode 100644 index 0000000..e236d53 --- /dev/null +++ b/translations/harbour-hermes-it.ts @@ -0,0 +1,426 @@ + + + + + ApiClient + + + Authentication required + Autenticazione richiesta + + + + HTTP %1 + HTTP %1 + + + + Server address not configured + Indirizzo del server non configurato + + + + ChatModel + + + No session open + Nessuna sessione aperta + + + + Wait for the current reply + Aspetta la risposta in corso + + + + ChatPage + + + Chat + Chat + + + + + Hermes is writing… + Hermes sta scrivendo… + + + + + Speaking… + Lettura… + + + + Voice mode: on + Modalità voce: attiva + + + + Voice mode: off + Modalità voce: disattiva + + + + Read last reply aloud + Leggi l'ultima risposta + + + + Auto-read: on + Auto-lettura: attiva + + + + Auto-read: off + Auto-lettura: disattiva + + + + Stop playback + Interrompi lettura + + + + Cancel run + Annulla risposta + + + + Resync + Risincronizza + + + + Recording… %1 — tap Stop to transcribe + Registrazione… %1 — tocca Stop per trascrivere + + + + + Transcribing… + Trascrizione… + + + + Stop + Stop + + + + Mic + Mic + + + + Message… + Messaggio… + + + + Send + Invia + + + + Voice mode off after repeated errors + Modalità voce disattivata dopo errori ripetuti + + + + Wait for the current reply first + Aspetta prima la risposta in corso + + + + ● Listening — speak, I stop at the pause (tap to exit) + ● In ascolto — parla, mi fermo alla pausa (tocca per uscire) + + + + Sending… + Invio… + + + + Voice mode on + Modalità voce attiva + + + + No reply to read yet + Nessuna risposta da leggere + + + + CoverPage + + + 1 message + 1 messaggio + + + + %1 messages + %1 messaggi + + + + Recording… + Registrazione… + + + + Writing… + Scrittura… + + + + LoginPage + + + + Sign in + Accedi + + + + Use the same password you use in the Hermes Web UI in your browser. + Usa la stessa password dell'Hermes Web UI nel browser. + + + + Server + Server + + + + Password + Password + + + + Signing in… + Accesso in corso… + + + + Recorder + + + No audio format available + Nessun formato audio disponibile + + + + SessionsPage + + + Sessions + Sessioni + + + + New session + Nuova sessione + + + + Refresh + Aggiorna + + + + Settings + Impostazioni + + + + Sign out + Esci + + + + No sessions + Nessuna sessione + + + + Pull down to create a new session + Tira giù per creare una nuova sessione + + + + 1 message + 1 messaggio + + + + %1 messages + %1 messaggi + + + + SettingsPage + + + Settings + Impostazioni + + + + Server + Server + + + + Web UI address + Indirizzo Web UI + + + + Voice + Voce + + + + Read-aloud voice + Voce di lettura + + + + + (server default) + (default del server) + + + + Voice presets (comma-separated) + Preset voci (separati da virgola) + + + + TTS engine + Motore TTS + + + + Engine presets (comma-separated) + Preset motori (separati da virgola) + + + + Read replies aloud + Leggi le risposte ad alta voce + + + + Speak every completed reply automatically + Pronuncia automaticamente ogni risposta completata + + + + Voice dialog + Dialogo vocale + + + + Send right after dictation + Invia subito dopo la dettatura + + + + Send the transcribed text automatically, without tapping Send + Invia il testo trascritto automaticamente, senza premere Invia + + + + Auto-stop pause + Pausa di stop automatico + + + + 1.0 second + 1,0 secondi + + + + 1.5 seconds + 1,5 secondi + + + + 2.0 seconds + 2,0 secondi + + + + 3.0 seconds + 3,0 secondi + + + + Mic sensitivity + Sensibilità microfono + + + + High (even soft voices) + Alta (anche voci flebili) + + + + Medium + Media + + + + Low (noisy rooms) + Bassa (ambienti rumorosi) + + + + Account + Account + + + + Sign out + Esci + + + + About + Informazioni + + + + Native client for the Hermes Web UI (hermes-webui): sessions, live streaming chat, server-side voice dictation and read-aloud. + Client nativo per l'Hermes Web UI (hermes-webui): sessioni, chat in streaming, dettatura e lettura ad alta voce lato server. + + + + VoiceRecorder + + + No audio input device + Nessun dispositivo di ingresso audio + + + + Audio input format not supported + Formato audio di ingresso non supportato + + + + Could not start audio capture + Impossibile avviare la registrazione + + + + Could not write the audio file + Impossibile scrivere il file audio + + +