From 6e54b5cb0285db5a0c95dca689cd11b0b2adf19d Mon Sep 17 00:00:00 2001 From: David Olowomeye <100958002+greatdaveo@users.noreply.github.com> Date: Tue, 23 Dec 2025 19:29:34 +0000 Subject: [PATCH] Implemented presentation window for live transcripts #1306 (#1323) Co-authored-by: Raivis Dejus --- buzz/assets/icons/color-background.svg | 6 + buzz/assets/icons/fullscreen.svg | 5 + buzz/assets/icons/gui-text-color.svg | 2 + buzz/assets/icons/new-window.svg | 7 + buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 75 ++- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 75 ++- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 75 ++- buzz/locale/en_US/LC_MESSAGES/buzz.po | 70 ++- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 77 ++- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 75 ++- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 75 ++- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 72 ++- buzz/locale/nl/LC_MESSAGES/buzz.po | 75 ++- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 75 ++- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 75 ++- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 75 ++- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 75 ++- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 73 ++- buzz/settings/settings.py | 5 + buzz/transcriber/recording_transcriber.py | 12 +- buzz/transcriber/whisper_cpp.py | 6 +- buzz/widgets/icon.py | 19 + buzz/widgets/icon_presentation.py | 60 +++ buzz/widgets/presentation_window.py | 189 ++++++++ buzz/widgets/recording_transcriber_widget.py | 213 ++++++++- pytest.ini | 2 +- .../io.github.chidiwilliams.Buzz.metainfo.xml | 5 +- tests/widgets/presentation_window_test.py | 324 +++++++++++++ .../recording_transcriber_widget_test.py | 440 +++++++++++++++++- 29 files changed, 2171 insertions(+), 166 deletions(-) create mode 100644 buzz/assets/icons/color-background.svg create mode 100644 buzz/assets/icons/fullscreen.svg create mode 100644 buzz/assets/icons/gui-text-color.svg create mode 100644 buzz/assets/icons/new-window.svg create mode 100644 buzz/widgets/icon_presentation.py create mode 100644 buzz/widgets/presentation_window.py create mode 100644 tests/widgets/presentation_window_test.py diff --git a/buzz/assets/icons/color-background.svg b/buzz/assets/icons/color-background.svg new file mode 100644 index 00000000..c62912ed --- /dev/null +++ b/buzz/assets/icons/color-background.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/buzz/assets/icons/fullscreen.svg b/buzz/assets/icons/fullscreen.svg new file mode 100644 index 00000000..e17e748d --- /dev/null +++ b/buzz/assets/icons/fullscreen.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/buzz/assets/icons/gui-text-color.svg b/buzz/assets/icons/gui-text-color.svg new file mode 100644 index 00000000..929d172c --- /dev/null +++ b/buzz/assets/icons/gui-text-color.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/buzz/assets/icons/new-window.svg b/buzz/assets/icons/new-window.svg new file mode 100644 index 00000000..cfb59177 --- /dev/null +++ b/buzz/assets/icons/new-window.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 49e0a048..27186e5c 100644 --- a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po +++ b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: buzz\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -53,6 +53,11 @@ msgstr "URL no vàlida" msgid "The URL you entered is invalid." msgstr "L'URL que heu introduït no és vàlid." +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "Veure la traducció de transcripció" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "Restableix als valors predeterminats" @@ -578,27 +583,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Enregistrament en directe" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Feu clic a Enregistra per a començar..." -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Esperant la traducció de la IA..." -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Micròfon:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "Fitxers de text" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "Fitxers de text" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "Selecciona la carpeta d'exportació" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "Selecciona un fitxer d'àudio" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "S'ha produït un error en iniciar un enregistrament nou:" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -924,14 +977,14 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "No s'ha pogut desar la clau OpenAI API a l'anell de claus" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" "El servidor Whisper no s'ha pogut iniciar. Consulteu els registres per " "obtenir més informació." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1309,11 +1362,11 @@ msgstr "Cantonès" msgid "A connection error occurred" msgstr "S'ha produït un error de connexió" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "Començant Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "Cancel·la la transcripció" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index 642e76dd..b04893ac 100644 --- a/buzz/locale/da_DK/LC_MESSAGES/buzz.po +++ b/buzz/locale/da_DK/LC_MESSAGES/buzz.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -50,6 +50,11 @@ msgstr "Ugyldig URL" msgid "The URL you entered is invalid." msgstr "Den URL du har angivet er ikke gyldig." +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "Vis transkriberede oversættelse" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "Gendan standard-indstillinger" @@ -575,27 +580,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Live optagelse" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Klik Optage for at begynde..." -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Venter på AI oversættelse..." -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "Tekst filer" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "Tekst filer" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "Vælg eksport-mappe" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "Vælg audio-fil" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "Der skete en fejl ved opstart af en ny optagelse:" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -918,12 +971,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "Kan ikke gemme OpenAI API-nøgle i nøgleringen" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1299,11 +1352,11 @@ msgstr "" msgid "A connection error occurred" msgstr "Der er opstået en forbindelsesfejl" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "Afbryd transkription" diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index 306dcad4..339f7279 100644 --- a/buzz/locale/de_DE/LC_MESSAGES/buzz.po +++ b/buzz/locale/de_DE/LC_MESSAGES/buzz.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -52,6 +52,11 @@ msgstr "Ungültige URL" msgid "The URL you entered is invalid." msgstr "Die von Ihnen eingegebene URL ist ungültig." +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "Übersetzung des Transkripts anzeigen" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "Auf Standardeinstellungen zurücksetzen" @@ -576,27 +581,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Live-Aufnahme" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Auf „Aufnehmen“ klicken um zu beginnen …" -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Warten auf KI-Übersetzung..." -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "Textdateien" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "Textdateien" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "Exportordner auswählen" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "Audiodatei auswählen" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "Beim Starten einer neuen Aufnahme ist ein Fehler aufgetreten:" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -920,12 +973,12 @@ msgstr "" "Der OpenAI-API-Schlüssel kann nicht im Schlüsselbund gespeichert werden" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1301,11 +1354,11 @@ msgstr "Kantonesisch" msgid "A connection error occurred" msgstr "Ein Verbindungsfehler ist aufgetreten" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "Transkription abbrechen" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index 7d4f46d1..803dbab9 100644 --- a/buzz/locale/en_US/LC_MESSAGES/buzz.po +++ b/buzz/locale/en_US/LC_MESSAGES/buzz.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -53,6 +53,10 @@ msgstr "" msgid "The URL you entered is invalid." msgstr "" +#: buzz/widgets/presentation_window.py:23 +msgid "Live Transcript Presentation" +msgstr "" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "" @@ -561,27 +565,71 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +msgid "Text Size:" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +msgid "Text Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +msgid "Select Text Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:373 +msgid "Select Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -898,12 +946,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1278,11 +1326,11 @@ msgstr "" msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 msgid "Starting transcription..." msgstr "" diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index 26767a62..e272d88c 100644 --- a/buzz/locale/es_ES/LC_MESSAGES/buzz.po +++ b/buzz/locale/es_ES/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -53,6 +53,12 @@ msgstr "URL inválido" msgid "The URL you entered is invalid." msgstr "La URL que has introducido no es válida." +# automatic translation +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "Ver la traducción de la transcripción" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "Reestablecer los Valores por Defecto" @@ -609,31 +615,80 @@ msgid "Could not restart transcription: transcriber worker not found." msgstr "" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Grabación en vivo" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Pulse en Grabar para comenzar..." -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "A la espera de la traducción de la IA..." # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Micrófono:" +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "Archivos de texto" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "Archivos de texto" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "Seleccione Exportar carpeta" + # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "Seleccionar archivo de audio" + +# automatic translation +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "Se produjo un error al iniciar una grabación nueva:" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -975,14 +1030,14 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "No se puede guardar la clave de la API de OpenAI en el llavero" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" "El servidor Whisper no se pudo iniciar. Consulta los registros para obtener " "más detalles." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1361,12 +1416,12 @@ msgstr "Cantonés" msgid "A connection error occurred" msgstr "Se ha producido un error de conexión" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." # automatic translation -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "Cancelar transcripción" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index 40ca5aa2..5c4d08ea 100644 --- a/buzz/locale/it_IT/LC_MESSAGES/buzz.po +++ b/buzz/locale/it_IT/LC_MESSAGES/buzz.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: buzz\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: 2025-11-09 20:22+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -52,6 +52,11 @@ msgstr "URL non valido" msgid "The URL you entered is invalid." msgstr "L'URL inserito non è valido." +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "Visualizza la trascrizione della traduzione" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "Ripristina impostazioni predefinite" @@ -579,27 +584,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Registrazione in diretta" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Fai clic su Registra per iniziare..." -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "In attesa della traduzione AI..." -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Microfono:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "File di testo" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "File di testo" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "Seleziona la cartella di esportazione" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "Seleziona file audio" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "Si è verificato un errore durante l'avvio della nuova registrazione:" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -927,13 +980,13 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "Impossibile salvare la chiave API OpenAI nel portachiavi" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" "Impossibile avviare il server Whisper. Controllare i log per i dettagli." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1311,11 +1364,11 @@ msgstr "Cantonese" msgid "A connection error occurred" msgstr "Si è verificato un errore di connessione" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "Avvio di Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 msgid "Starting transcription..." msgstr "Inizio trascrizione..." diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 05fa40d3..6116f6e1 100644 --- a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po +++ b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -48,6 +48,11 @@ msgstr "無効なURL" msgid "The URL you entered is invalid." msgstr "入力されたURLは無効です。" +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "文字起こしの翻訳を表示する" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "デフォルトに戻す" @@ -571,27 +576,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "ライブ録音" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "クリックで録音を開始..." -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "AI翻訳を待っています..." -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "マイク:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "テキストファイル" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "テキストファイル" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "出力フォルダを選択" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "音声ファイルを選択" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "新規録音開始時にエラーが発生しました:" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -913,12 +966,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "OpenAI API キーをkeyringに保存できません" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1294,11 +1347,11 @@ msgstr "" msgid "A connection error occurred" msgstr "接続エラーが発生しました" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "文字起こしをキャンセルする" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 2fa839da..83df9b2a 100644 --- a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po +++ b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" -"PO-Revision-Date: 2025-12-22 09:26+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" +"PO-Revision-Date: 2025-12-23 19:24+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -53,6 +53,10 @@ msgstr "Adrese nav derīga" msgid "The URL you entered is invalid." msgstr "Jūsu ievadītā URL adrese nav derīga." +#: buzz/widgets/presentation_window.py:23 +msgid "Live Transcript Presentation" +msgstr "Dzīvais ieraksts" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "Atjaunot noklusētos" @@ -582,27 +586,71 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "Neizdevās sākt atpazīšanu: Kļūda lietotnē, pārstartējiet." -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Dzīvā ierakstīšana" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Klikšķiniet Ierakstīt, lai sāktu..." -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Gaida MI tulkojumu..." -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Mikrofons:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "Rādīt jaunā logā" + +#: buzz/widgets/recording_transcriber_widget.py:231 +msgid "Text Size:" +msgstr "Teksta izmērs:" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "Stils" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "Gaišais" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "Tumšais" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "Pielāgots" + +#: buzz/widgets/recording_transcriber_widget.py:265 +msgid "Text Color" +msgstr "Teksta krāsa" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "Fona krāsa" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "Pilnekrāns" + +#: buzz/widgets/recording_transcriber_widget.py:355 +msgid "Select Text Color" +msgstr "Izvēlieties teksta krāsu" + +#: buzz/widgets/recording_transcriber_widget.py:373 +msgid "Select Background Color" +msgstr "Izvēlieties fona krāsu" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "Sākot jaunu ierakstu notikusi kļūda:" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -927,14 +975,14 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "Neizdevās saglabāt OpenAI API atslēgu atslēgu saišķī" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" "Whisper serverim neizdevās ieslēgties. Lūdzu pārbaudiet lietotnes žurnāla " "ierakstus." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1312,11 +1360,11 @@ msgstr "Kantonas" msgid "A connection error occurred" msgstr "Notika savienojuma kļūda" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "Palaiž Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 msgid "Starting transcription..." msgstr "Sāk atpazīšanu..." diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 93eafe1a..32ceab84 100644 --- a/buzz/locale/nl/LC_MESSAGES/buzz.po +++ b/buzz/locale/nl/LC_MESSAGES/buzz.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -55,6 +55,11 @@ msgstr "Ongeldige url" msgid "The URL you entered is invalid." msgstr "De ingevoerde url is ongeldig." +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "Getranscribeerde vertaling bekijken" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "Standaardwaarden" @@ -578,27 +583,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Live-opname" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Klik op de opnameknop om te beginnen…" -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Bezig met wachten op AI-vertaling…" -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Microfoon:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "Tekstbestanden" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "Tekstbestanden" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "Kies een exportmap" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "Kies een audiobestand" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "Er is een fout opgetreden tijdens het starten van de opname:" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -919,12 +972,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "De OpenAI-api-sleutel kan niet worden bewaard in de sleutelbos" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1300,11 +1353,11 @@ msgstr "Kantonees" msgid "A connection error occurred" msgstr "Er is een verbindingsfout opgetreden" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "Transcriptie wissen" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index 25d05062..f4e08020 100644 --- a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po +++ b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -53,6 +53,11 @@ msgstr "Nieprawidłowy URL" msgid "The URL you entered is invalid." msgstr "Wprowadzony URL nie jest prawidłowy" +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "Nowa transkrypcja" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "" @@ -583,27 +588,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Nagrywanie na żywo" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Naciśnij Nagraj, aby zacząć..." -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "Pliki tekstowe" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "Pliki tekstowe" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "Wybierz plik audio" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "Wybierz plik audio" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "Wystąpił błąd podczas rozpoczęcia nowego nagrania:" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -931,12 +984,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1313,11 +1366,11 @@ msgstr "" msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "Anuluj transkrypcję" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index a17cc980..e22b0210 100644 --- a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po +++ b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Buzz\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -53,6 +53,11 @@ msgstr "URL inválida" msgid "The URL you entered is invalid." msgstr "A URL inserida é inválida." +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "Ver Tradução da Transcrição" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "Redefinir para o Padrão" @@ -576,27 +581,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Gravação ao Vivo" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Clique em Gravar para começar..." -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Aguardando tradução da IA..." -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Microfone:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "Arquivos de texto" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "Arquivos de texto" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "Selecionar Pasta de Exportação" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "Selecionar arquivo de áudio" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "Ocorreu um erro ao iniciar uma nova gravação:" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -922,12 +975,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "Não foi possível salvar a chave da API OpenAI no cofre de chaves" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "Falha ao iniciar o servidor Whisper. Verifique os logs." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1305,11 +1358,11 @@ msgstr "Cantonês" msgid "A connection error occurred" msgstr "Ocorreu um erro de conexão" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "Iniciando transcrição..." diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 04a43926..6a0b21ab 100644 --- a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po +++ b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -50,6 +50,11 @@ msgstr "Недійсна адреса" msgid "The URL you entered is invalid." msgstr "Адреса, яку ви ввели, є недійсною" +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "Переглянути переклад транскрипції" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "Типові значення" @@ -573,27 +578,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Живий запис" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Натисніть на Запис, щоб розпочати..." -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Очікування перекладу від ШІ..." -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Мікрофон:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "Текстові файли" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "Текстові файли" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "Виберіть теку для експорту" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "Вибрати аудіофайл" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "При старті нового запису виникла помилка:" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -915,12 +968,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "Не вдається додати до звʼязки ключів API-ключ OpenAI" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1296,11 +1349,11 @@ msgstr "" msgid "A connection error occurred" msgstr "Виникла помилка зʼєднання" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "Скасувати транскрипцію" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index 825b23d4..352cec0b 100644 --- a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po +++ b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -53,6 +53,11 @@ msgstr "无效的网址" msgid "The URL you entered is invalid." msgstr "输入的网址无效" +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "查看识别的翻译" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "恢复默认" @@ -586,27 +591,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "实时录制" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "点击开始录制" -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "等待AI翻译..." -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "麦克风:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +#, fuzzy +msgid "Text Size:" +msgstr "文本文件" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +#, fuzzy +msgid "Text Color" +msgstr "文本文件" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "选择输出文件夹" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "选择音频文件" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "开始新录制时出错" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -931,12 +984,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "无法将OpenAI API密钥保存到密钥串" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1313,11 +1366,11 @@ msgstr "" msgid "A connection error occurred" msgstr "连接发生错误" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "取消识别" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index eb4e33af..f8db1a27 100644 --- a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po +++ b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-22 09:24+0200\n" +"POT-Creation-Date: 2025-12-23 19:21+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -53,6 +53,11 @@ msgstr "" msgid "The URL you entered is invalid." msgstr "" +#: buzz/widgets/presentation_window.py:23 +#, fuzzy +msgid "Live Transcript Presentation" +msgstr "新錄製" + #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 msgid "Reset to Defaults" msgstr "" @@ -581,27 +586,73 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:83 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "現場錄製" -#: buzz/widgets/recording_transcriber_widget.py:149 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "點擊開始錄製" -#: buzz/widgets/recording_transcriber_widget.py:152 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:164 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "麥克風:" -#: buzz/widgets/recording_transcriber_widget.py:579 +#: buzz/widgets/recording_transcriber_widget.py:225 +msgid "Show in new window" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:231 +msgid "Text Size:" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:247 +msgid "Theme" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Light" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Dark" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:251 +msgid "Custom" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:265 +msgid "Text Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:275 +msgid "Background Color" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:284 +msgid "Fullscreen" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:355 +#, fuzzy +msgid "Select Text Color" +msgstr "選擇聲音檔案" + +#: buzz/widgets/recording_transcriber_widget.py:373 +#, fuzzy +msgid "Select Background Color" +msgstr "選擇聲音檔案" + +#: buzz/widgets/recording_transcriber_widget.py:788 msgid "An error occurred while starting a new recording:" msgstr "開始新錄製出錯" -#: buzz/widgets/recording_transcriber_widget.py:583 +#: buzz/widgets/recording_transcriber_widget.py:792 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -925,12 +976,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:417 +#: buzz/transcriber/recording_transcriber.py:427 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:431 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1307,11 +1358,11 @@ msgstr "" msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:353 +#: buzz/transcriber/recording_transcriber.py:358 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:408 +#: buzz/transcriber/recording_transcriber.py:418 #, fuzzy msgid "Starting transcription..." msgstr "取消錄製" diff --git a/buzz/settings/settings.py b/buzz/settings/settings.py index a33cead5..7ec768fd 100644 --- a/buzz/settings/settings.py +++ b/buzz/settings/settings.py @@ -26,6 +26,11 @@ class Settings: RECORDING_TRANSCRIBER_EXPORT_FOLDER = "recording-transcriber/export-folder" RECORDING_TRANSCRIBER_MODE = "recording-transcriber/mode" + PRESENTATION_WINDOW_TEXT_COLOR = "presentation-window/text-color" + PRESENTATION_WINDOW_BACKGROUND_COLOR = "presentation-window/background-color" + PRESENTATION_WINDOW_TEXT_SIZE = "presentation-window/text-size" + PRESENTATION_WINDOW_THEME = "presentation-window/theme" + FILE_TRANSCRIBER_TASK = "file-transcriber/task" FILE_TRANSCRIBER_MODEL = "file-transcriber/model" FILE_TRANSCRIBER_LANGUAGE = "file-transcriber/language" diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index 929c12cb..e4f5a850 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -350,6 +350,11 @@ class RecordingTranscriber(QObject): self.process.wait(5000) def start_local_whisper_server(self): + # Reduce verbose HTTP client logging from OpenAI/httpx + logging.getLogger("httpx").setLevel(logging.WARNING) + logging.getLogger("httpcore").setLevel(logging.WARNING) + logging.getLogger("openai").setLevel(logging.WARNING) + self.transcription.emit(_("Starting Whisper.cpp...")) self.process = None @@ -368,7 +373,12 @@ class RecordingTranscriber(QObject): "--threads", str(os.getenv("BUZZ_WHISPERCPP_N_THREADS", (os.cpu_count() or 8) // 2)), "--model", self.model_path, "--no-timestamps", - "--no-context", # on Windows context causes duplications of last message + # on Windows context causes duplications of last message + "--no-context", + # Protections against hallucinated repetition. Seems to be problem on macOS + # https://github.com/ggml-org/whisper.cpp/issues/1507 + "--max-context", "64", + "--entropy-thold", "2.8", "--suppress-nst" ] diff --git a/buzz/transcriber/whisper_cpp.py b/buzz/transcriber/whisper_cpp.py index 8b2195ee..3b609e6d 100644 --- a/buzz/transcriber/whisper_cpp.py +++ b/buzz/transcriber/whisper_cpp.py @@ -96,8 +96,8 @@ class WhisperCpp: # Build the command cmd = [ whisper_cli_path, - "-m", task.model_path, - "-l", language, + "--model", task.model_path, + "--language", language, "--print-progress", "--suppress-nst", # Protections against hallucinated repetition. Seems to be problem on macOS @@ -105,7 +105,7 @@ class WhisperCpp: "--max-context", "64", "--entropy-thold", "2.8", "--output-json-full", - "-t", str(os.getenv("BUZZ_WHISPERCPP_N_THREADS", (os.cpu_count() or 8) // 2)), + "--threads", str(os.getenv("BUZZ_WHISPERCPP_N_THREADS", (os.cpu_count() or 8) // 2)), "-f", file_to_process, ] diff --git a/buzz/widgets/icon.py b/buzz/widgets/icon.py index 1efca875..298232a1 100644 --- a/buzz/widgets/icon.py +++ b/buzz/widgets/icon.py @@ -99,6 +99,25 @@ class ScrollToCurrentIcon(Icon): get_path("assets/visibility_FILL0_wght700_GRAD0_opsz48.svg"), parent ) +class NewWindowIcon(Icon): + def __init__(self, parent: QWidget): + super().__init__(get_path("assets/icons/new-window.svg"), parent) + + +class FullscreenIcon(Icon): + def __init__(self, parent: QWidget): + super().__init__(get_path("assets/icons/fullscreen.svg"), parent) + + +class ColorBackgroundIcon(Icon): + def __init__(self, parent: QWidget): + super().__init__(get_path("assets/icons/color-background.svg"), parent) + + +class TextColorIcon(Icon): + def __init__(self, parent: QWidget): + super().__init__(get_path("assets/icons/gui-text-color.svg"), parent) + BUZZ_ICON_PATH = get_path("assets/buzz.ico") BUZZ_LARGE_ICON_PATH = get_path("assets/buzz-icon-1024.png") diff --git a/buzz/widgets/icon_presentation.py b/buzz/widgets/icon_presentation.py new file mode 100644 index 00000000..6f230971 --- /dev/null +++ b/buzz/widgets/icon_presentation.py @@ -0,0 +1,60 @@ +from PyQt6.QtGui import QIcon, QPixmap, QPainter, QPalette +from PyQt6.QtCore import QSize +from PyQt6.QtSvg import QSvgRenderer +import os +from buzz.assets import APP_BASE_DIR + +class PresentationIcon: + "Icons for presentation window controls" + def __init__(self, parent, svg_path: str, color: str = None): + self.parent = parent + self.svg_path = svg_path + self.color = color or self.get_default_color() + + + def get_default_color(self) -> str: + """Get default icon color based on theme""" + palette = self.parent.palette() + is_dark = palette.window().color().black() > 127 + + return "#EEE" if is_dark else "#555" + + def get_icon(self) -> QIcon: + """Load SVG icon and return as QIcon""" + #Load from asset first + full_path = os.path.join(APP_BASE_DIR, "assets", "icons", os.path.basename(self.svg_path)) + + if not os.path.exists(full_path): + pixmap = QPixmap(24, 24) + pixmap.fill(self.color) + + return QIcon(pixmap) + + #Load SVG + renderer = QSvgRenderer(full_path) + pixmap = QPixmap(24, 24) + pixmap.fill(Qt.GlobalColor.transparent) + painter = QPainter(pixmap) + renderer.render(painter) + painter.end() + + return QIcon(pixmap) + + + + + + + + + + + + + + + + + + + diff --git a/buzz/widgets/presentation_window.py b/buzz/widgets/presentation_window.py new file mode 100644 index 00000000..8aad5ee4 --- /dev/null +++ b/buzz/widgets/presentation_window.py @@ -0,0 +1,189 @@ +import logging +from typing import Optional +from PyQt6.QtCore import Qt +from PyQt6.QtGui import QTextCursor +from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextBrowser +from platformdirs import user_cache_dir + +from buzz.locale import _ +from buzz.settings.settings import Settings + +import os + +class PresentationWindow(QWidget): + """Window for displaying live transcripts in presentation mode""" + + def __init__(self, parent: Optional[QWidget] = None): + super().__init__(parent) + + self.settings = Settings() + self._current_transcript = "" + self._current_translation = "" + self.window_style = "" + self.setWindowTitle(_("Live Transcript Presentation")) + self.setWindowFlag(Qt.WindowType.Window) + + # Window size + self.resize(800, 600) + + # Create layout + layout = QVBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(0) + + # Text display widget + self.transcript_display = QTextBrowser(self) + self.transcript_display.setReadOnly(True) + + # Translation display (hidden first) + self.translation_display = QTextBrowser(self) + self.translation_display.setReadOnly(True) + self.translation_display.hide() + + # Add to layout + layout.addWidget(self.transcript_display) + layout.addWidget(self.translation_display) + + self.load_settings() + + def load_settings(self): + """Load and apply saved presentation settings""" + theme = self.settings.value( + Settings.Key.PRESENTATION_WINDOW_THEME, + "light" + ) + + # Load text size + text_size = self.settings.value( + Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, + 24, + int + ) + + # Load colors based on theme + if theme == "light": + text_color = "#000000" + bg_color = "#FFFFFF" + elif theme == "dark": + text_color = "#FFFFFF" + bg_color = "#000000" + else: + text_color = self.settings.value( + Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, + "#000000" + ) + + bg_color = self.settings.value( + Settings.Key.PRESENTATION_WINDOW_BACKGROUND_COLOR, + "#FFFFFF" + ) + + self.apply_styling(text_color, bg_color, text_size) + + # Refresh content with new styling + if self._current_transcript: + self.update_transcripts(self._current_transcript) + if self._current_translation: + self.update_translations(self._current_translation) + + def apply_styling(self, text_color: str, bg_color: str, text_size: int): + """Apply text color, background color and font size""" + + # Load custom CSS if it exists + css_file_path = self.get_css_file_path() + + if os.path.exists(css_file_path): + try: + with open(css_file_path, "r", encoding="utf-8") as f: + self.window_style = f.read() + except Exception as e: + logging.warning(f"Failed to load custom CSS: {e}") + else: + self.window_style = f""" + body {{ + color: {text_color}; + background-color: {bg_color}; + font-size: {text_size}pt; + font-family: Arial, sans-serif; + padding: 0; + margin: 20px; + }} + """ + + def update_transcripts(self, text: str): + """Update the transcript display with new text""" + if not text: + return + + self._current_transcript = text + escaped_text = text.replace("&", "&").replace("<", "<").replace(">", ">") + html_text = escaped_text.replace("\n", "
") + + html_content = f""" + + + + + + {html_text} + + + """ + + self.transcript_display.setHtml(html_content) + self.transcript_display.moveCursor(QTextCursor.MoveOperation.End) + + def update_translations(self, text: str): + """Update the translation display with new text""" + if not text: + return + + self._current_translation = text + self.translation_display.show() + + escaped_text = text.replace("&", "&").replace("<", "<").replace(">", ">") + html_text = escaped_text.replace("\n", "
") + + html_content = f""" + + + + + + {html_text} + + + """ + + self.translation_display.setHtml(html_content) + self.translation_display.moveCursor(QTextCursor.MoveOperation.End) + + def toggle_fullscreen(self): + """Toggle fullscreen mode""" + if self.isFullScreen(): + self.showNormal() + else: + self.showFullScreen() + + def keyPressEvent(self, event): + """Handle keyboard events""" + # ESC Key exits fullscreen + if event.key() == Qt.Key.Key_Escape and self.isFullScreen(): + self.showNormal() + event.accept() + else: + super().keyPressEvent(event) + + + def get_css_file_path(self) -> str: + """Get path to custom CSS file""" + cache_dir = user_cache_dir("Buzz") + os.makedirs(cache_dir, exist_ok=True) + + return os.path.join(cache_dir, "presentation_window_style.css") + + diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index b036fa03..7a35a06c 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -8,9 +8,20 @@ import sounddevice from enum import auto from typing import Optional, Tuple, Any -from PyQt6.QtCore import QThread, Qt, QThreadPool -from PyQt6.QtGui import QTextCursor, QCloseEvent -from PyQt6.QtWidgets import QWidget, QVBoxLayout, QFormLayout, QHBoxLayout, QMessageBox +from PyQt6.QtCore import QThread, Qt, QThreadPool, QTimer +from PyQt6.QtGui import QTextCursor, QCloseEvent, QColor +from PyQt6.QtWidgets import ( + QWidget, + QVBoxLayout, + QFormLayout, + QHBoxLayout, + QMessageBox, + QPushButton, + QComboBox, + QLabel, + QSpinBox, + QColorDialog +) from buzz.dialogs import show_model_download_error_dialog from buzz.locale import _ @@ -39,6 +50,8 @@ from buzz.widgets.text_display_box import TextDisplayBox from buzz.widgets.transcriber.transcription_options_group_box import ( TranscriptionOptionsGroupBox, ) +from buzz.widgets.presentation_window import PresentationWindow +from buzz.widgets.icon import NewWindowIcon, FullscreenIcon, ColorBackgroundIcon, TextColorIcon REAL_CHARS_REGEX = re.compile(r'\w') NO_SPACE_BETWEEN_SENTENCES = re.compile(r'([.!?。!?])([A-Z])') @@ -190,6 +203,180 @@ class RecordingTranscriberWidget(QWidget): default_value=False, ) + #Presentation window + self.presentation_window: Optional[PresentationWindow] = None + + self.presentation_options_bar = self.create_presentation_options_bar() + layout.insertWidget(3, self.presentation_options_bar) + self.presentation_options_bar.hide() + + def create_presentation_options_bar(self) -> QWidget: + """Crete the presentation options bar widget""" + + bar = QWidget(self) + layout = QHBoxLayout(bar) + layout.setContentsMargins(5, 5, 5, 5) + layout.setSpacing(10) + + self.show_presentation_button = QPushButton(bar) + self.show_presentation_button.setIcon(NewWindowIcon(bar)) + self.show_presentation_button.setToolTip(_("Show in new window")) + self.show_presentation_button.clicked.connect(self.on_show_presentation_clicked) + layout.addWidget(self.show_presentation_button) + + layout.addStretch() #Push other controls to the right + + text_size_label = QLabel(_("Text Size:"), bar) + layout.addWidget(text_size_label) + + self.text_size_spinbox = QSpinBox(bar) + self.text_size_spinbox.setRange(12, 72) #12pt to 72pt + + saved_text_size = self.settings.value( + Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, + 24, + int + ) + self.text_size_spinbox.setValue(saved_text_size) + self.text_size_spinbox.valueChanged.connect(self.on_text_size_changed) + layout.addWidget(self.text_size_spinbox) + + #Theme selector + theme_label = QLabel(_("Theme"), bar) + layout.addWidget(theme_label) + + self.theme_combo = QComboBox(bar) + self.theme_combo.addItems([_("Light"), _("Dark"), _("Custom")]) + #Load saved theme + saved_theme = self.settings.value( + Settings.Key.PRESENTATION_WINDOW_THEME, + "light" + ) + theme_index = {"light": 0, "dark": 1, "custom": 2}.get(saved_theme, 0) + self.theme_combo.setCurrentIndex(theme_index) + self.theme_combo.currentIndexChanged.connect(self.on_theme_changed) + layout.addWidget(self.theme_combo) + + #Color buttons hidden first, show when custom is selected + self.text_color_button = QPushButton(bar) + self.text_color_button.setIcon(TextColorIcon(bar)) + self.text_color_button.setToolTip(_("Text Color")) + self.text_color_button.clicked.connect(self.on_text_color_clicked) + self.text_color_button.hide() + + if saved_theme == "custom": + self.text_color_button.show() + layout.addWidget(self.text_color_button) + + self.bg_color_button = QPushButton(bar) + self.bg_color_button.setIcon(ColorBackgroundIcon(bar)) + self.bg_color_button.setToolTip(_("Background Color")) + self.bg_color_button.clicked.connect(self.on_bg_color_clicked) + self.bg_color_button.hide() + if saved_theme == "custom": + self.bg_color_button.show() + layout.addWidget(self.bg_color_button) + + self.fullscreen_button = QPushButton(bar) + self.fullscreen_button.setIcon(FullscreenIcon(bar)) + self.fullscreen_button.setToolTip(_("Fullscreen")) + self.fullscreen_button.clicked.connect(self.on_fullscreen_clicked) + self.fullscreen_button.setEnabled(False) + layout.addWidget(self.fullscreen_button) + + return bar + + def on_show_presentation_clicked(self): + """Handle click on 'Show in new window' button""" + if self.presentation_window is None or not self.presentation_window.isVisible(): + #Create new presentation window + self.presentation_window = PresentationWindow(self) + self.presentation_window.show() + + #Enable fullscreen button + self.fullscreen_button.setEnabled(True) + + #Sync current content to presentation window + transcript_text = self.transcription_text_box.toPlainText() + if transcript_text: + self.presentation_window.update_transcripts(transcript_text) + + if self.transcription_options.enable_llm_translation: + translation_text = self.translation_text_box.toPlainText() + if translation_text: + self.presentation_window.update_translations(translation_text) + else: + #Window already open, bring to front + self.presentation_window.raise_() + self.presentation_window.activateWindow() + + def on_text_size_changed(self, value: int): + """Handle text size change""" + def save_settings(): + self.settings.set_value(Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, value) + if self.presentation_window: + # reload setting to apply new size + self.presentation_window.load_settings() + #Incase user drags slider, Debounce by waiting 100ms before saving + QTimer.singleShot(100, save_settings) + + def on_theme_changed(self, index: int): + """Handle theme selection change""" + theme = ["light", "dark", "custom"] + selected_theme = theme[index] + self.settings.set_value(Settings.Key.PRESENTATION_WINDOW_THEME, selected_theme) + + #Show/hide color buttons based on selection + if selected_theme == "custom": + self.text_color_button.show() + self.bg_color_button.show() + else: + self.text_color_button.hide() + self.bg_color_button.hide() + + # Apply theme to presentation window + if self.presentation_window: + self.presentation_window.load_settings() + + def on_text_color_clicked(self): + """Handle text color button click""" + + current_color = QColor( + self.settings.value( + Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, + "#000000" + ) + ) + + color = QColorDialog.getColor(current_color, self, _("Select Text Color")) + if color.isValid(): + color_hex = color.name() + self.settings.set_value(Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, color_hex) + if self.presentation_window: + self.presentation_window.load_settings() + + def on_bg_color_clicked(self): + """Handle background color button click""" + + current_color = QColor( + self.settings.value( + Settings.Key.PRESENTATION_WINDOW_BACKGROUND_COLOR, + "#FFFFFF" + ) + ) + + color = QColorDialog.getColor(current_color, self, _("Select Background Color")) + if color.isValid(): + color_hex = color.name() + self.settings.set_value(Settings.Key.PRESENTATION_WINDOW_BACKGROUND_COLOR, color_hex) + if self.presentation_window: + self.presentation_window.load_settings() + + def on_fullscreen_clicked(self): + """Handle fullscreen button click""" + if self.presentation_window: + self.presentation_window.toggle_fullscreen() + def setup_for_export(self): export_folder = self.settings.value( key=Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FOLDER, @@ -276,9 +463,11 @@ class RecordingTranscriberWidget(QWidget): self.record_button.set_recording() self.transcription_options_group_box.setEnabled(False) self.audio_devices_combo_box.setEnabled(False) + self.presentation_options_bar.show() else: # RecordingStatus.RECORDING self.stop_recording() self.set_recording_status_stopped() + self.presentation_options_bar.hide() def start_recording(self): self.record_button.setDisabled(True) @@ -384,6 +573,7 @@ class RecordingTranscriberWidget(QWidget): self.current_status = self.RecordingStatus.STOPPED self.transcription_options_group_box.setEnabled(True) self.audio_devices_combo_box.setEnabled(True) + self.presentation_options_bar.hide() def on_download_model_error(self, error: str): self.reset_model_download() @@ -500,6 +690,12 @@ class RecordingTranscriberWidget(QWidget): elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: self.process_transcription_merge(text, self.transcripts, self.transcription_text_box, self.transcript_export_file) + #Update presentation window if it is open + if self.presentation_window and self.presentation_window.isVisible(): + #Get current merged text from the translation box + current_text = self.transcription_text_box.toPlainText() + self.presentation_window.update_transcripts(current_text) + # Upload to server if self.upload_url: try: @@ -545,6 +741,10 @@ class RecordingTranscriberWidget(QWidget): elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: self.process_transcription_merge(text, self.translations, self.translation_text_box, self.translation_export_file) + if self.presentation_window and self.presentation_window.isVisible(): + current_translation = self.translation_text_box.toPlainText() + self.presentation_window.update_translations(current_translation) + # Upload to server if self.upload_url: try: @@ -612,6 +812,13 @@ class RecordingTranscriberWidget(QWidget): self.audio_meter_widget.update_amplitude(amplitude) def closeEvent(self, event: QCloseEvent) -> None: + #Close presentation window if open + if self.presentation_window: + self.presentation_window.close() + self.presentation_window = None + + self.fullscreen_button.setEnabled(False) + if self.model_loader is not None: self.model_loader.cancel() diff --git a/pytest.ini b/pytest.ini index 0ad2fec7..701a9fff 100644 --- a/pytest.ini +++ b/pytest.ini @@ -5,7 +5,7 @@ qt_api=pyqt6 log_format = %(asctime)s %(levelname)s %(module)s::%(funcName)s %(message)s log_date_format = %Y-%m-%d %H:%M:%S addopts = -x -s -p no:xdist -p no:pytest_parallel -timeout = 600 +timeout = 900 timeout_method = thread testpaths = tests markers = diff --git a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml index 988beeab..0491541d 100644 --- a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml +++ b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml @@ -64,14 +64,15 @@ - + https://github.com/chidiwilliams/buzz/releases/tag/v1.4.0 -

Adding speaker identification on transcriptions and video support for transcription viewer, improvements to transcription table and support for over 1000 of worlds languages via MMS models.

+

Adding speaker identification on transcriptions and video support for transcription viewer, improvements to transcription table and support for over 1000 of worlds languages via MMS models as well as separate window to show live transcripts on a projector.

Release details:

  • Speaker identification on finished transcripts
  • Support for video in transcription viewer
  • +
  • Presentation (projector) window for live transcripts
  • Ability to add notes and restart transcriptions in main table
  • Adding support for more than 1000 languages via MMS model family when transcribing with Huggingface transcription type
  • Adding support for PEFT models when transcribing with Huggingface transcription type
  • diff --git a/tests/widgets/presentation_window_test.py b/tests/widgets/presentation_window_test.py new file mode 100644 index 00000000..2e224272 --- /dev/null +++ b/tests/widgets/presentation_window_test.py @@ -0,0 +1,324 @@ +import os +import pytest +import tempfile + +from unittest.mock import patch, MagicMock +from pytestqt.qtbot import QtBot +from PyQt6.QtCore import Qt +from PyQt6.QtGui import QKeyEvent + +from buzz.widgets.presentation_window import PresentationWindow +from buzz.settings.settings import Settings +from buzz.locale import _ + +class TestPresentationWindow: + def test_should_set_window_title(self, qtbot: QtBot): + """Test that the window title is set correctly""" + window = PresentationWindow() + qtbot.add_widget(window) + + assert _("Live Transcript Presentation") in window.windowTitle() + window.close() + + def test_should_have_window_flag(self, qtbot: QtBot): + """Test that window has the Window flag set""" + window = PresentationWindow() + qtbot.add_widget(window) + + assert window.windowFlags() & Qt.WindowType.Window + window.close() + + def test_should_have_transcript_display(self, qtbot: QtBot): + """Test that the transcript display is created""" + window = PresentationWindow() + qtbot.add_widget(window) + + assert window.transcript_display is not None + assert window.transcript_display.isReadOnly() + window.close() + + def test_should_have_translation_display_hidden(self, qtbot: QtBot): + """Test that the translation display is created but hidden initially""" + window = PresentationWindow() + qtbot.add_widget(window) + + assert window.translation_display is not None + assert window.translation_display.isReadOnly() + assert not window.translation_display.isVisible() + window.close() + + def test_should_have_default_size(self, qtbot: QtBot): + """Test that the window has default size""" + window = PresentationWindow() + qtbot.add_widget(window) + + assert window.width() == 800 + assert window.height() == 600 + window.close() + + +class TestPresentationWindowUpdateTranscripts: + def test_update_transcripts_with_text(self, qtbot: QtBot): + """Test updating transcripts with text""" + window = PresentationWindow() + qtbot.add_widget(window) + + window.update_transcripts("Hello world") + + assert window._current_transcript == "Hello world" + assert "Hello world" in window.transcript_display.toHtml() + window.close() + + def test_update_transcripts_with_empty_text(self, qtbot: QtBot): + """Test that empty text does not update the display""" + window = PresentationWindow() + qtbot.add_widget(window) + + window.update_transcripts("") + + assert window._current_transcript == "" + window.close() + + def test_update_transcripts_escapes_html(self, qtbot: QtBot): + """Test that special HTML characters are escaped""" + window = PresentationWindow() + qtbot.add_widget(window) + + window.update_transcripts("") + + html = window.transcript_display.toHtml() + assert "