mirror of
https://github.com/chidiwilliams/buzz.git
synced 2026-03-14 22:55:46 +01:00
Co-authored-by: Raivis Dejus <orvils@gmail.com>
This commit is contained in:
parent
47ddc1461c
commit
6e54b5cb02
29 changed files with 2171 additions and 166 deletions
6
buzz/assets/icons/color-background.svg
Normal file
6
buzz/assets/icons/color-background.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.75 1C6.33579 1 6 1.33579 6 1.75V3.50559C5.96824 3.53358 5.93715 3.56276 5.9068 3.59311L1.66416 7.83575C0.883107 8.6168 0.883107 9.88313 1.66416 10.6642L5.19969 14.1997C5.98074 14.9808 7.24707 14.9808 8.02812 14.1997L12.2708 9.95707C13.0518 9.17602 13.0518 7.90969 12.2708 7.12864L8.73522 3.59311C8.39027 3.24816 7.95066 3.05555 7.5 3.0153V1.75C7.5 1.33579 7.16421 1 6.75 1ZM6 5.62123V6.25C6 6.66421 6.33579 7 6.75 7C7.16421 7 7.5 6.66421 7.5 6.25V4.54033C7.56363 4.56467 7.62328 4.60249 7.67456 4.65377L11.2101 8.1893C11.2995 8.27875 11.348 8.39366 11.3555 8.51071H3.11052L6 5.62123ZM6.26035 13.1391L3.132 10.0107H10.0958L6.96746 13.1391C6.77219 13.3343 6.45561 13.3343 6.26035 13.1391Z" fill="#212121"/>
|
||||
<path d="M2 17.5V12.4143L3.5 13.9143V17.5C3.5 18.0523 3.94772 18.5 4.5 18.5H19.5C20.0523 18.5 20.5 18.0523 20.5 17.5V6.5C20.5 5.94771 20.0523 5.5 19.5 5.5H12.0563L10.5563 4H19.5C20.8807 4 22 5.11929 22 6.5V17.5C22 18.8807 20.8807 20 19.5 20H4.5C3.11929 20 2 18.8807 2 17.5Z" fill="#212121"/>
|
||||
<path d="M11 14.375C11 13.8816 11.1541 13.4027 11.3418 12.9938C11.5325 12.5784 11.7798 12.1881 12.0158 11.8595C12.2531 11.5289 12.4888 11.247 12.6647 11.0481C12.7502 10.9515 12.9062 10.7867 12.9642 10.7254L12.9697 10.7197C13.2626 10.4268 13.7374 10.4268 14.0303 10.7197L14.3353 11.0481C14.5112 11.247 14.7469 11.5289 14.9842 11.8595C15.2202 12.1881 15.4675 12.5784 15.6582 12.9938C15.8459 13.4027 16 13.8816 16 14.375C16 15.7654 14.9711 17 13.5 17C12.0289 17 11 15.7654 11 14.375ZM13.7658 12.7343C13.676 12.6092 13.5858 12.4916 13.5 12.3844C13.4142 12.4916 13.324 12.6092 13.2342 12.7343C13.0327 13.015 12.8425 13.32 12.7051 13.6195C12.5647 13.9253 12.5 14.1808 12.5 14.375C12.5 15.0663 12.9809 15.5 13.5 15.5C14.0191 15.5 14.5 15.0663 14.5 14.375C14.5 14.1808 14.4353 13.9253 14.2949 13.6195C14.1575 13.32 13.9673 13.015 13.7658 12.7343Z" fill="#212121"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2 KiB |
5
buzz/assets/icons/fullscreen.svg
Normal file
5
buzz/assets/icons/fullscreen.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M21.7092 2.29502C21.8041 2.3904 21.8757 2.50014 21.9241 2.61722C21.9727 2.73425 21.9996 2.8625 22 2.997L22 3V9C22 9.55228 21.5523 10 21 10C20.4477 10 20 9.55228 20 9V5.41421L14.7071 10.7071C14.3166 11.0976 13.6834 11.0976 13.2929 10.7071C12.9024 10.3166 12.9024 9.68342 13.2929 9.29289L18.5858 4H15C14.4477 4 14 3.55228 14 3C14 2.44772 14.4477 2 15 2H20.9998C21.2749 2 21.5242 2.11106 21.705 2.29078L21.7092 2.29502Z" fill="#000000"/>
|
||||
<path d="M10.7071 14.7071L5.41421 20H9C9.55228 20 10 20.4477 10 21C10 21.5523 9.55228 22 9 22H3.00069L2.997 22C2.74301 21.9992 2.48924 21.9023 2.29502 21.7092L2.29078 21.705C2.19595 21.6096 2.12432 21.4999 2.07588 21.3828C2.02699 21.2649 2 21.1356 2 21V15C2 14.4477 2.44772 14 3 14C3.55228 14 4 14.4477 4 15V18.5858L9.29289 13.2929C9.68342 12.9024 10.3166 12.9024 10.7071 13.2929C11.0976 13.6834 11.0976 14.3166 10.7071 14.7071Z" fill="#000000"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
2
buzz/assets/icons/gui-text-color.svg
Normal file
2
buzz/assets/icons/gui-text-color.svg
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 14 14" role="img" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"><path d="M 7.5291661,11.795909 C 7.4168129,11.419456 7.3406864,10.225625 7.3406864,9.29222 c 0,-0.11438 -0.029767,-0.221667 -0.081573,-0.314893 0.051933,-0.115773 0.08132,-0.24358 0.08132,-0.378226 l 0,-1.709364 c 0,-0.511733 -0.416226,-0.927959 -0.9279585,-0.927959 l -0.8772919,0 C 5.527203,5.856265 5.52163,5.751005 5.518336,5.648406 5.514666,5.556066 5.513396,5.470313 5.513016,5.385826 5.511876,5.296776 5.5132694,5.224073 5.517196,5.160866 5.524666,5.024193 5.541009,4.891827 5.565076,4.773647 5.591043,4.646981 5.619669,4.564774 5.630689,4.535134 c 0.0019,-0.0052 0.0038,-0.01013 0.00557,-0.01533 0.00709,-0.02039 0.0133,-0.03559 0.017227,-0.04446 C 6.0127121,3.789698 5.750766,2.938499 5.0665137,2.5737 4.8642273,2.466034 4.6367344,2.409034 4.4084814,2.408147 4.1801018,2.409034 3.9526089,2.466037 3.7504492,2.5737 3.066197,2.938499 2.8042508,3.789698 3.1634768,4.475344 c 0.00393,0.0087 0.01026,0.02394 0.017227,0.04446 0.00177,0.0052 0.00367,0.01013 0.00557,0.01533 0.01102,0.02951 0.039647,0.111847 0.065613,0.238513 0.024067,0.11818 0.040533,0.250546 0.04788,0.387219 0.00393,0.06321 0.00532,0.135914 0.00418,0.22496 -5.066e-4,0.08449 -0.00165,0.17024 -0.00532,0.26258 -0.00329,0.102599 -0.00887,0.207859 -0.016847,0.313372 l -0.8772919,0 c -0.5117324,0 -0.9279584,0.416226 -0.9279584,0.927959 l 0,1.709364 c 0,0.134646 0.029387,0.262453 0.08132,0.378226 -0.051807,0.09323 -0.081573,0.200513 -0.081573,0.314893 0,0.933278 -0.076126,2.127236 -0.1884796,2.503689 C 1.0571435,11.985782 1.0131902,12.254315 1.0562568,12.453434 1.1748167,13 1.7477291,13 1.9359554,13 c 0.437506,0 1.226258,-0.07676 1.2595712,-0.08005 0.05092,-0.0051 0.1001932,-0.01596 0.1468065,-0.03179 0.049907,0.01241 0.1018398,0.01913 0.1546597,0.01925 l 0.9114918,0.0044 0.9114918,-0.0044 c 0.05282,-1.27e-4 0.1047532,-0.007 0.1546598,-0.01925 0.046613,0.01583 0.095886,0.02673 0.1468064,0.03179 C 5.6547556,12.92315 6.4436346,13 6.8810138,13 c 0.1882264,0 0.7612654,0 0.8796986,-0.546566 0.043067,-0.199119 -7.6e-4,-0.467652 -0.2315463,-0.657525 z m -1.833117,0.502486 -0.3480794,-1.518478 -0.1741664,1.503658 -1.6846638,-7.6e-4 -0.3680927,-0.885399 0,0.900979 c 0,0 -1.7672504,0.173279 -1.3861111,0 0.3811394,-0.173154 0.3811394,-2.980082 0.3811394,-2.980082 l 2.2924095,0 2.2924095,0 c 0,0 0,2.806928 0.3811394,2.980082 0.381266,0.173279 -1.3859844,0 -1.3859844,0 z M 10.219055,1 7.3387864,1 5.8932688,5.377719 l 0.9449318,0 c 0.3536527,0 0.6674055,0.17138 0.8650052,0.434593 l 0.04864,-0.18392 0.9107318,-2.702555 0.2962729,-0.0016 0.9543051,2.889769 -2.2085564,0 C 7.839499,5.994632 7.9204389,6.217692 7.9204389,6.459878 l 0,1.257038 2.3962751,0 0.423193,1.60917 2.218563,0 L 10.219055,1 Z"/></svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
7
buzz/assets/icons/new-window.svg
Normal file
7
buzz/assets/icons/new-window.svg
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="-0.5 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.93994 9.39998V5.48999C8.93994 5.20999 9.15994 4.98999 9.43994 4.98999H20.9999C21.2799 4.98999 21.4999 5.20999 21.4999 5.48999V13.09C21.4999 13.37 21.2799 13.59 20.9999 13.59L17.0599 13.6" stroke="#0F0F0F" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M17.7301 8.72998L16.4301 10.03" stroke="#0F0F0F" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M3 11.4H14.56C14.84 11.4 15.06 11.62 15.06 11.9V19.51C15.06 19.79 14.84 20.01 14.56 20.01H3C2.72 20.01 2.5 19.79 2.5 19.51V11.9C2.5 11.63 2.72 11.4 3 11.4Z" stroke="#0F0F0F" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M19.32 10.03V7.64001C19.32 7.36001 19.1 7.14001 18.82 7.14001H16.42" stroke="#0F0F0F" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -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 <contacto@ericdq.com>\n"
|
||||
"Language-Team: Catalan <jmas@softcatala.org>\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ó"
|
||||
|
|
|
|||
|
|
@ -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 <xalt7x.service@gmail.com>\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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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 <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\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 ""
|
||||
|
||||
|
|
|
|||
|
|
@ -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 <contacto@ericdq.com>\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"
|
||||
|
|
|
|||
|
|
@ -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 <albanobattistella@gmail.com>\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..."
|
||||
|
||||
|
|
|
|||
|
|
@ -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 "文字起こしをキャンセルする"
|
||||
|
|
|
|||
|
|
@ -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..."
|
||||
|
||||
|
|
|
|||
|
|
@ -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 <vistausss@fastmail.com>\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"
|
||||
|
|
|
|||
|
|
@ -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ę"
|
||||
|
|
|
|||
|
|
@ -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 <pschopf@gmail.com>\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..."
|
||||
|
|
|
|||
|
|
@ -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 <xalt7x.service@gmail.com>\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 "Скасувати транскрипцію"
|
||||
|
|
|
|||
|
|
@ -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 "取消识别"
|
||||
|
|
|
|||
|
|
@ -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 "取消錄製"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
60
buzz/widgets/icon_presentation.py
Normal file
60
buzz/widgets/icon_presentation.py
Normal file
|
|
@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
189
buzz/widgets/presentation_window.py
Normal file
189
buzz/widgets/presentation_window.py
Normal file
|
|
@ -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", "<br>")
|
||||
|
||||
html_content = f"""
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
{self.window_style}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
{html_text}
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
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", "<br>")
|
||||
|
||||
html_content = f"""
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
{self.window_style}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
{html_text}
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
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")
|
||||
|
||||
|
||||
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -64,14 +64,15 @@
|
|||
<content_rating type="oars-1.1"/>
|
||||
|
||||
<releases>
|
||||
<release version="1.4.0" date="2025-12-20">
|
||||
<release version="1.4.0" date="2025-12-30">
|
||||
<url type="details">https://github.com/chidiwilliams/buzz/releases/tag/v1.4.0</url>
|
||||
<description>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>Release details:</p>
|
||||
<ul>
|
||||
<li>Speaker identification on finished transcripts</li>
|
||||
<li>Support for video in transcription viewer</li>
|
||||
<li>Presentation (projector) window for live transcripts</li>
|
||||
<li>Ability to add notes and restart transcriptions in main table</li>
|
||||
<li>Adding support for more than 1000 languages via MMS model family when transcribing with Huggingface transcription type</li>
|
||||
<li>Adding support for PEFT models when transcribing with Huggingface transcription type</li>
|
||||
|
|
|
|||
324
tests/widgets/presentation_window_test.py
Normal file
324
tests/widgets/presentation_window_test.py
Normal file
|
|
@ -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("<script>alert('xss')</script>")
|
||||
|
||||
html = window.transcript_display.toHtml()
|
||||
assert "<script>" not in html
|
||||
assert "<script>" in html
|
||||
window.close()
|
||||
|
||||
def test_update_transcripts_preserves_newlines(self, qtbot: QtBot):
|
||||
"""Test that newlines are converted to <br> tags"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
|
||||
window.update_transcripts("Line 1\nLine 2")
|
||||
|
||||
html = window.transcript_display.toHtml()
|
||||
assert "<br>" in html or "<br/>" in html or "Line 1" in html
|
||||
window.close()
|
||||
|
||||
|
||||
class TestPresentationWindowUpdateTranslations:
|
||||
def test_update_translations_with_text(self, qtbot: QtBot):
|
||||
"""Test updating translations with text"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
window.show()
|
||||
|
||||
window.update_translations("Translated text")
|
||||
|
||||
assert window._current_translation == "Translated text"
|
||||
assert window.translation_display.isVisible()
|
||||
assert "Translated text" in window.translation_display.toHtml()
|
||||
window.close()
|
||||
|
||||
def test_update_translations_with_empty_text(self, qtbot: QtBot):
|
||||
"""Test that empty text does not update the display"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
window.show()
|
||||
|
||||
window.update_translations("")
|
||||
|
||||
assert window._current_translation == ""
|
||||
# translation_display should remain hidden when not updated with real text
|
||||
assert window.translation_display.isHidden()
|
||||
window.close()
|
||||
|
||||
def test_update_translations_escapes_html(self, qtbot: QtBot):
|
||||
"""Test that special HTML characters are escaped in translations"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
|
||||
window.update_translations("<b>bold</b>")
|
||||
|
||||
html = window.translation_display.toHtml()
|
||||
assert "<b>" in html
|
||||
window.close()
|
||||
|
||||
|
||||
class TestPresentationWindowLoadSettings:
|
||||
def test_load_settings_light_theme(self, qtbot: QtBot):
|
||||
"""Test loading light theme settings"""
|
||||
settings = Settings()
|
||||
settings.set_value(Settings.Key.PRESENTATION_WINDOW_THEME, "light")
|
||||
settings.set_value(Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, 24)
|
||||
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
|
||||
assert "#000000" in window.window_style or "color:" in window.window_style
|
||||
window.close()
|
||||
|
||||
def test_load_settings_dark_theme(self, qtbot: QtBot):
|
||||
"""Test loading dark theme settings"""
|
||||
settings = Settings()
|
||||
settings.set_value(Settings.Key.PRESENTATION_WINDOW_THEME, "dark")
|
||||
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
|
||||
assert "#FFFFFF" in window.window_style or "#000000" in window.window_style
|
||||
window.close()
|
||||
|
||||
def test_load_settings_custom_theme(self, qtbot: QtBot):
|
||||
"""Test loading custom theme settings"""
|
||||
settings = Settings()
|
||||
settings.set_value(Settings.Key.PRESENTATION_WINDOW_THEME, "custom")
|
||||
settings.set_value(Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, "#FF0000")
|
||||
settings.set_value(Settings.Key.PRESENTATION_WINDOW_BACKGROUND_COLOR, "#00FF00")
|
||||
settings.set_value(Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, 32)
|
||||
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
|
||||
assert "#FF0000" in window.window_style or "#00FF00" in window.window_style
|
||||
window.close()
|
||||
|
||||
def test_load_settings_refreshes_content(self, qtbot: QtBot):
|
||||
"""Test that load_settings refreshes existing content"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
|
||||
window.update_transcripts("Test transcript")
|
||||
window.update_translations("Test translation")
|
||||
|
||||
# Reload settings
|
||||
window.load_settings()
|
||||
|
||||
# Content should still be present
|
||||
assert "Test transcript" in window.transcript_display.toHtml()
|
||||
assert "Test translation" in window.translation_display.toHtml()
|
||||
window.close()
|
||||
|
||||
|
||||
class TestPresentationWindowApplyStyling:
|
||||
def test_apply_styling_creates_css(self, qtbot: QtBot):
|
||||
"""Test that apply_styling creates appropriate CSS"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
|
||||
window.apply_styling("#123456", "#654321", 48)
|
||||
|
||||
assert "#123456" in window.window_style
|
||||
assert "#654321" in window.window_style
|
||||
assert "48pt" in window.window_style
|
||||
window.close()
|
||||
|
||||
def test_apply_styling_with_custom_css_file(self, qtbot: QtBot):
|
||||
"""Test that custom CSS file is loaded when it exists"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
|
||||
css_path = window.get_css_file_path()
|
||||
custom_css = "body { color: red; font-size: 100pt; }"
|
||||
|
||||
try:
|
||||
with open(css_path, "w", encoding="utf-8") as f:
|
||||
f.write(custom_css)
|
||||
|
||||
window.apply_styling("#000", "#FFF", 24)
|
||||
|
||||
assert window.window_style == custom_css
|
||||
finally:
|
||||
if os.path.exists(css_path):
|
||||
os.remove(css_path)
|
||||
|
||||
window.close()
|
||||
|
||||
|
||||
class TestPresentationWindowFullscreen:
|
||||
def test_toggle_fullscreen_enters_fullscreen(self, qtbot: QtBot):
|
||||
"""Test that toggle_fullscreen enters fullscreen mode"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
window.show()
|
||||
|
||||
assert not window.isFullScreen()
|
||||
|
||||
window.toggle_fullscreen()
|
||||
|
||||
assert window.isFullScreen()
|
||||
window.close()
|
||||
|
||||
def test_toggle_fullscreen_exits_fullscreen(self, qtbot: QtBot):
|
||||
"""Test that toggle_fullscreen exits fullscreen mode"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
window.show()
|
||||
|
||||
window.showFullScreen()
|
||||
assert window.isFullScreen()
|
||||
|
||||
window.toggle_fullscreen()
|
||||
|
||||
assert not window.isFullScreen()
|
||||
window.close()
|
||||
|
||||
class TestPresentationWindowKeyPressEvent:
|
||||
def test_escape_exits_fullscreen(self, qtbot: QtBot):
|
||||
"""Test that ESC key exits fullscreen mode"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
window.show()
|
||||
window.showFullScreen()
|
||||
|
||||
assert window.isFullScreen()
|
||||
|
||||
# Simulate ESC key press
|
||||
event = QKeyEvent(
|
||||
QKeyEvent.Type.KeyPress,
|
||||
Qt.Key.Key_Escape,
|
||||
Qt.KeyboardModifier.NoModifier
|
||||
)
|
||||
window.keyPressEvent(event)
|
||||
|
||||
assert not window.isFullScreen()
|
||||
window.close()
|
||||
|
||||
def test_escape_does_not_affect_normal_mode(self, qtbot: QtBot):
|
||||
"""Test that ESC key does nothing in normal mode"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
window.show()
|
||||
|
||||
assert not window.isFullScreen()
|
||||
|
||||
# Simulate ESC key press
|
||||
event = QKeyEvent(
|
||||
QKeyEvent.Type.KeyPress,
|
||||
Qt.Key.Key_Escape,
|
||||
Qt.KeyboardModifier.NoModifier
|
||||
)
|
||||
window.keyPressEvent(event)
|
||||
|
||||
assert not window.isFullScreen()
|
||||
window.close()
|
||||
|
||||
class TestPresentationWindowGetCssFilePath:
|
||||
def test_get_css_file_path_returns_path(self, qtbot: QtBot):
|
||||
"""Test that get_css_file_path returns a valid path"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
|
||||
css_path = window.get_css_file_path()
|
||||
|
||||
assert css_path.endswith("presentation_window_style.css")
|
||||
assert "Buzz" in css_path
|
||||
window.close()
|
||||
|
||||
def test_get_css_file_path_creates_directory(self, qtbot: QtBot):
|
||||
"""Test that get_css_file_path creates the cache directory"""
|
||||
window = PresentationWindow()
|
||||
qtbot.add_widget(window)
|
||||
|
||||
css_path = window.get_css_file_path()
|
||||
parent_dir = os.path.dirname(css_path)
|
||||
|
||||
assert os.path.isdir(parent_dir)
|
||||
window.close()
|
||||
|
|
@ -4,12 +4,15 @@ import pytest
|
|||
import platform
|
||||
import tempfile
|
||||
|
||||
from unittest.mock import patch
|
||||
from unittest.mock import patch, MagicMock
|
||||
from pytestqt.qtbot import QtBot
|
||||
from PyQt6.QtWidgets import QColorDialog
|
||||
from PyQt6.QtGui import QColor
|
||||
|
||||
from buzz.locale import _
|
||||
from buzz.settings.recording_transcriber_mode import RecordingTranscriberMode
|
||||
from buzz.widgets.recording_transcriber_widget import RecordingTranscriberWidget
|
||||
from buzz.widgets.presentation_window import PresentationWindow
|
||||
from buzz.settings.settings import Settings
|
||||
|
||||
from tests.mock_sounddevice import MockSoundDevice, MockInputStream
|
||||
|
|
@ -187,3 +190,438 @@ class TestRecordingTranscriberWidget:
|
|||
qtbot.wait(500)
|
||||
|
||||
widget.close()
|
||||
|
||||
|
||||
class TestRecordingTranscriberWidgetPresentation:
|
||||
"""Tests for presentation window related functionality"""
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_presentation_options_bar_created(self, qtbot: QtBot):
|
||||
"""Test that presentation options bar is created"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
assert widget.presentation_options_bar is not None
|
||||
assert not widget.presentation_options_bar.isVisible()
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_presentation_options_bar_has_buttons(self, qtbot: QtBot):
|
||||
"""Test that presentation options bar has all expected buttons"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
assert widget.show_presentation_button is not None
|
||||
assert widget.fullscreen_button is not None
|
||||
assert widget.text_size_spinbox is not None
|
||||
assert widget.theme_combo is not None
|
||||
assert widget.text_color_button is not None
|
||||
assert widget.bg_color_button is not None
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_presentation_window_initially_none(self, qtbot: QtBot):
|
||||
"""Test that presentation window is None initially"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
assert widget.presentation_window is None
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_show_presentation_clicked_creates_window(self, qtbot: QtBot):
|
||||
"""Test that clicking show presentation button creates the window"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
widget.on_show_presentation_clicked()
|
||||
|
||||
assert widget.presentation_window is not None
|
||||
assert isinstance(widget.presentation_window, PresentationWindow)
|
||||
assert widget.presentation_window.isVisible()
|
||||
assert widget.fullscreen_button.isEnabled()
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_show_presentation_clicked_syncs_content(self, qtbot: QtBot):
|
||||
"""Test that clicking show presentation button syncs existing content"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
# Add some text to the transcription box
|
||||
widget.transcription_text_box.setPlainText("Test transcript text")
|
||||
|
||||
widget.on_show_presentation_clicked()
|
||||
|
||||
assert widget.presentation_window._current_transcript == "Test transcript text"
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_show_presentation_clicked_brings_existing_to_front(self, qtbot: QtBot):
|
||||
"""Test that clicking show presentation button brings existing window to front"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
# Create window first
|
||||
widget.on_show_presentation_clicked()
|
||||
first_window = widget.presentation_window
|
||||
|
||||
# Click again
|
||||
widget.on_show_presentation_clicked()
|
||||
|
||||
# Should be the same window
|
||||
assert widget.presentation_window is first_window
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_text_size_changed(self, qtbot: QtBot):
|
||||
"""Test that text size change updates settings"""
|
||||
settings = Settings()
|
||||
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
widget.on_text_size_changed(36)
|
||||
|
||||
# Wait for debounce
|
||||
qtbot.wait(200)
|
||||
|
||||
saved_size = settings.value(Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, 24, int)
|
||||
assert saved_size == 36
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_theme_changed_light(self, qtbot: QtBot):
|
||||
"""Test that theme change to light works"""
|
||||
settings = Settings()
|
||||
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
widget.on_theme_changed(0) # light theme
|
||||
|
||||
saved_theme = settings.value(Settings.Key.PRESENTATION_WINDOW_THEME, "")
|
||||
assert saved_theme == "light"
|
||||
# Color buttons should be hidden for light theme
|
||||
assert widget.text_color_button.isHidden()
|
||||
assert widget.bg_color_button.isHidden()
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_theme_changed_dark(self, qtbot: QtBot):
|
||||
"""Test that theme change to dark works"""
|
||||
settings = Settings()
|
||||
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
widget.on_theme_changed(1) # dark theme
|
||||
|
||||
saved_theme = settings.value(Settings.Key.PRESENTATION_WINDOW_THEME, "")
|
||||
assert saved_theme == "dark"
|
||||
# Color buttons should be hidden for dark theme
|
||||
assert widget.text_color_button.isHidden()
|
||||
assert widget.bg_color_button.isHidden()
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_theme_changed_custom(self, qtbot: QtBot):
|
||||
"""Test that theme change to custom shows color buttons"""
|
||||
settings = Settings()
|
||||
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
widget.on_theme_changed(2) # custom theme
|
||||
|
||||
saved_theme = settings.value(Settings.Key.PRESENTATION_WINDOW_THEME, "")
|
||||
assert saved_theme == "custom"
|
||||
# Color buttons should NOT be hidden for custom theme
|
||||
assert not widget.text_color_button.isHidden()
|
||||
assert not widget.bg_color_button.isHidden()
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_text_color_clicked(self, qtbot: QtBot):
|
||||
"""Test that text color button opens color dialog and saves selection"""
|
||||
settings = Settings()
|
||||
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings"),
|
||||
patch("buzz.widgets.recording_transcriber_widget.QColorDialog.getColor",
|
||||
return_value=QColor("#FF5500"))):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
widget.on_text_color_clicked()
|
||||
|
||||
saved_color = settings.value(Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, "")
|
||||
assert saved_color == "#ff5500"
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_text_color_clicked_cancel(self, qtbot: QtBot):
|
||||
"""Test that cancelling color dialog does not save"""
|
||||
settings = Settings()
|
||||
original_color = settings.value(Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, "#000000")
|
||||
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings"),
|
||||
patch("buzz.widgets.recording_transcriber_widget.QColorDialog.getColor",
|
||||
return_value=QColor())): # Invalid color = cancelled
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
widget.on_text_color_clicked()
|
||||
|
||||
saved_color = settings.value(Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, "")
|
||||
assert saved_color == original_color
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_bg_color_clicked(self, qtbot: QtBot):
|
||||
"""Test that background color button opens color dialog and saves selection"""
|
||||
settings = Settings()
|
||||
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings"),
|
||||
patch("buzz.widgets.recording_transcriber_widget.QColorDialog.getColor",
|
||||
return_value=QColor("#00AA55"))):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
widget.on_bg_color_clicked()
|
||||
|
||||
saved_color = settings.value(Settings.Key.PRESENTATION_WINDOW_BACKGROUND_COLOR, "")
|
||||
assert saved_color == "#00aa55"
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_fullscreen_clicked(self, qtbot: QtBot):
|
||||
"""Test that fullscreen button toggles presentation window fullscreen"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
# Create presentation window first
|
||||
widget.on_show_presentation_clicked()
|
||||
|
||||
assert not widget.presentation_window.isFullScreen()
|
||||
|
||||
widget.on_fullscreen_clicked()
|
||||
|
||||
assert widget.presentation_window.isFullScreen()
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_on_fullscreen_clicked_without_window(self, qtbot: QtBot):
|
||||
"""Test that fullscreen button does nothing without presentation window"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
# Should not raise exception
|
||||
widget.on_fullscreen_clicked()
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_presentation_window_updates_on_transcription(self, qtbot: QtBot):
|
||||
"""Test that presentation window updates when new transcription arrives"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
widget.on_show_presentation_clicked()
|
||||
|
||||
widget.transcriber_mode = RecordingTranscriberMode.APPEND_BELOW
|
||||
widget.on_next_transcription("Hello world")
|
||||
|
||||
assert "Hello world" in widget.presentation_window._current_transcript
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_close_event_closes_presentation_window(self, qtbot: QtBot):
|
||||
"""Test that closing widget also closes presentation window"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
widget.on_show_presentation_clicked()
|
||||
presentation_window = widget.presentation_window
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
widget.close()
|
||||
|
||||
assert widget.presentation_window is None
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_fullscreen_button_disabled_initially(self, qtbot: QtBot):
|
||||
"""Test that fullscreen button is disabled when no presentation window"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
assert not widget.fullscreen_button.isEnabled()
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_presentation_bar_shown_when_recording(self, qtbot: QtBot):
|
||||
"""Test that presentation bar is shown when recording starts"""
|
||||
with (patch("sounddevice.InputStream", side_effect=MockInputStream),
|
||||
patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate",
|
||||
return_value=16_000),
|
||||
patch("sounddevice.check_input_settings")):
|
||||
widget = RecordingTranscriberWidget(
|
||||
custom_sounddevice=MockSoundDevice()
|
||||
)
|
||||
widget.device_sample_rate = 16_000
|
||||
qtbot.add_widget(widget)
|
||||
|
||||
# Initially hidden
|
||||
assert widget.presentation_options_bar.isHidden()
|
||||
|
||||
# Simulate clicking record by directly calling the handler
|
||||
# This avoids starting actual recording threads
|
||||
widget.current_status = widget.RecordingStatus.RECORDING
|
||||
widget.record_button.set_recording()
|
||||
widget.transcription_options_group_box.setEnabled(False)
|
||||
widget.audio_devices_combo_box.setEnabled(False)
|
||||
widget.presentation_options_bar.show()
|
||||
|
||||
# Should no longer be hidden after recording starts
|
||||
assert not widget.presentation_options_bar.isHidden()
|
||||
|
||||
time.sleep(0.5)
|
||||
widget.close()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue