feat(notes): Add audio recording and playback features

This commit is contained in:
cogwheel
2026-01-12 21:48:43 +05:30
parent a7e5bb3704
commit a371556a1c
73 changed files with 2296 additions and 125 deletions

View File

@@ -896,5 +896,28 @@
"continueButton": "Weiter",
"proxyAuthRequired": "Dieser Server erfordert Proxy-Authentifizierung",
"proxyAuthRequiredDescription": "Ihr Server scheint hinter einem Authentifizierungs-Proxy (wie oauth2-proxy) zu sein. Sie müssen sich zuerst über den Proxy anmelden.",
"authenticateThroughProxy": "Authentifizieren"
"authenticateThroughProxy": "Authentifizieren",
"voiceOptions": "Sprachoptionen",
"dictation": "Diktat",
"dictationDescription": "Sprechen und in Echtzeit in Text umwandeln",
"recordAudio": "Audio aufnehmen",
"recordAudioDescription": "Audio zur späteren Transkription speichern",
"recordingAudio": "Aufnahme...",
"preparingRecording": "Vorbereitung...",
"recordingHint": "Tippe auf Stopp wenn fertig",
"stopAndSaveRecording": "Stopp & Speichern",
"processingRecording": "Verarbeitung...",
"audioRecordingSaved": "Audioaufnahme gespeichert",
"microphonePermissionDenied": "Mikrofonzugriff verweigert",
"recordingFailed": "Aufnahme fehlgeschlagen",
"removeFileConfirm": "Diese Datei aus der Notiz entfernen?",
"fileRemoved": "Datei entfernt",
"playAudio": "Audio abspielen",
"removeFile": "Datei entfernen",
"audioFileType": "Audio",
"imageFileType": "Bild",
"failedToUploadAudio": "Audio hochladen fehlgeschlagen",
"audioAttachment": "Audio-Anhang",
"loadingAudio": "Audio wird geladen...",
"failedToLoadAudio": "Audio konnte nicht geladen werden"
}

View File

@@ -1763,6 +1763,62 @@
"@failedToStartDictation": {
"description": "Error when starting dictation fails."
},
"voiceOptions": "Voice options",
"@voiceOptions": {
"description": "Tooltip for voice/recording options button."
},
"dictation": "Dictation",
"@dictation": {
"description": "Option for real-time speech to text."
},
"dictationDescription": "Speak and convert to text in real-time",
"@dictationDescription": {
"description": "Description for dictation option."
},
"recordAudio": "Record Audio",
"@recordAudio": {
"description": "Option for recording audio files."
},
"recordAudioDescription": "Save audio for later transcription",
"@recordAudioDescription": {
"description": "Description for audio recording option."
},
"recordingAudio": "Recording...",
"@recordingAudio": {
"description": "Status text while recording audio."
},
"preparingRecording": "Preparing...",
"@preparingRecording": {
"description": "Status text while preparing to record."
},
"recordingHint": "Tap stop when finished",
"@recordingHint": {
"description": "Hint shown during audio recording."
},
"stopAndSaveRecording": "Stop & Save",
"@stopAndSaveRecording": {
"description": "Button to stop and save an audio recording."
},
"processingRecording": "Processing...",
"@processingRecording": {
"description": "Status while processing a recording."
},
"audioRecordingSaved": "Audio recording saved",
"@audioRecordingSaved": {
"description": "Success message after saving audio recording."
},
"failedToUploadAudio": "Failed to upload audio",
"@failedToUploadAudio": {
"description": "Error when audio upload fails."
},
"microphonePermissionDenied": "Microphone permission denied",
"@microphonePermissionDenied": {
"description": "Error when microphone access is denied."
},
"recordingFailed": "Recording failed",
"@recordingFailed": {
"description": "Error when audio recording fails."
},
"noteNotFound": "Note not found",
"@noteNotFound": {
"description": "Error message when a note cannot be found."
@@ -1956,5 +2012,41 @@
"or": "or",
"@or": {
"description": "Separator text between authentication options."
},
"audioAttachment": "Audio Attachment",
"@audioAttachment": {
"description": "Label for audio file attachments in notes."
},
"loadingAudio": "Loading audio...",
"@loadingAudio": {
"description": "Loading message while audio file loads."
},
"failedToLoadAudio": "Failed to load audio",
"@failedToLoadAudio": {
"description": "Error message when audio file fails to load."
},
"removeFileConfirm": "Remove this file from the note?",
"@removeFileConfirm": {
"description": "Confirmation message when removing a file attachment."
},
"fileRemoved": "File removed",
"@fileRemoved": {
"description": "Success message after removing a file attachment."
},
"playAudio": "Play audio",
"@playAudio": {
"description": "Tooltip for audio play button."
},
"removeFile": "Remove file",
"@removeFile": {
"description": "Tooltip for remove file button."
},
"audioFileType": "Audio",
"@audioFileType": {
"description": "Label for audio file type."
},
"imageFileType": "Image",
"@imageFileType": {
"description": "Label for image file type."
}
}

View File

@@ -896,5 +896,28 @@
"continueButton": "Continuar",
"proxyAuthRequired": "Este servidor requiere autenticación de proxy",
"proxyAuthRequiredDescription": "Su servidor parece estar detrás de un proxy de autenticación (como oauth2-proxy). Deberá iniciar sesión a través del proxy primero.",
"authenticateThroughProxy": "Autenticar"
"authenticateThroughProxy": "Autenticar",
"voiceOptions": "Opciones de voz",
"dictation": "Dictado",
"dictationDescription": "Habla y convierte a texto en tiempo real",
"recordAudio": "Grabar audio",
"recordAudioDescription": "Guardar audio para transcripción posterior",
"recordingAudio": "Grabando...",
"preparingRecording": "Preparando...",
"recordingHint": "Toca detener cuando termines",
"stopAndSaveRecording": "Detener y guardar",
"processingRecording": "Procesando...",
"audioRecordingSaved": "Grabación de audio guardada",
"microphonePermissionDenied": "Permiso de micrófono denegado",
"recordingFailed": "Grabación fallida",
"removeFileConfirm": "¿Eliminar este archivo de la nota?",
"fileRemoved": "Archivo eliminado",
"playAudio": "Reproducir audio",
"removeFile": "Eliminar archivo",
"audioFileType": "Audio",
"imageFileType": "Imagen",
"failedToUploadAudio": "Error al subir el audio",
"audioAttachment": "Archivo de audio",
"loadingAudio": "Cargando audio...",
"failedToLoadAudio": "Error al cargar el audio"
}

View File

@@ -896,5 +896,28 @@
"continueButton": "Continuer",
"proxyAuthRequired": "Ce serveur nécessite une authentification proxy",
"proxyAuthRequiredDescription": "Votre serveur semble être derrière un proxy d'authentification (comme oauth2-proxy). Vous devrez d'abord vous connecter via le proxy.",
"authenticateThroughProxy": "S'authentifier"
"authenticateThroughProxy": "S'authentifier",
"voiceOptions": "Options vocales",
"dictation": "Dictée",
"dictationDescription": "Parlez et convertissez en texte en temps réel",
"recordAudio": "Enregistrer l'audio",
"recordAudioDescription": "Enregistrer l'audio pour transcription ultérieure",
"recordingAudio": "Enregistrement...",
"preparingRecording": "Préparation...",
"recordingHint": "Appuyez sur arrêt quand terminé",
"stopAndSaveRecording": "Arrêter et sauvegarder",
"processingRecording": "Traitement...",
"audioRecordingSaved": "Enregistrement audio sauvegardé",
"microphonePermissionDenied": "Accès au microphone refusé",
"recordingFailed": "Enregistrement échoué",
"removeFileConfirm": "Retirer ce fichier de la note ?",
"fileRemoved": "Fichier retiré",
"playAudio": "Lire l'audio",
"removeFile": "Retirer le fichier",
"audioFileType": "Audio",
"imageFileType": "Image",
"failedToUploadAudio": "Échec du téléchargement audio",
"audioAttachment": "Pièce jointe audio",
"loadingAudio": "Chargement audio...",
"failedToLoadAudio": "Impossible de charger l'audio"
}

View File

@@ -896,5 +896,28 @@
"continueButton": "Continua",
"proxyAuthRequired": "Questo server richiede l'autenticazione proxy",
"proxyAuthRequiredDescription": "Il tuo server sembra essere dietro un proxy di autenticazione (come oauth2-proxy). Dovrai prima accedere tramite il proxy.",
"authenticateThroughProxy": "Autentica"
"authenticateThroughProxy": "Autentica",
"voiceOptions": "Opzioni vocali",
"dictation": "Dettatura",
"dictationDescription": "Parla e converti in testo in tempo reale",
"recordAudio": "Registra audio",
"recordAudioDescription": "Salva l'audio per la trascrizione successiva",
"recordingAudio": "Registrazione...",
"preparingRecording": "Preparazione...",
"recordingHint": "Tocca stop quando hai finito",
"stopAndSaveRecording": "Ferma e salva",
"processingRecording": "Elaborazione...",
"audioRecordingSaved": "Registrazione audio salvata",
"microphonePermissionDenied": "Accesso al microfono negato",
"recordingFailed": "Registrazione fallita",
"removeFileConfirm": "Rimuovere questo file dalla nota?",
"fileRemoved": "File rimosso",
"playAudio": "Riproduci audio",
"removeFile": "Rimuovi file",
"audioFileType": "Audio",
"imageFileType": "Immagine",
"failedToUploadAudio": "Caricamento audio fallito",
"audioAttachment": "Allegato audio",
"loadingAudio": "Caricamento audio...",
"failedToLoadAudio": "Impossibile caricare l'audio"
}

View File

@@ -674,5 +674,28 @@
"continueButton": "계속",
"proxyAuthRequired": "이 서버는 프록시 인증이 필요합니다",
"proxyAuthRequiredDescription": "서버가 인증 프록시(예: oauth2-proxy) 뒤에 있는 것 같습니다. 먼저 프록시를 통해 로그인해야 합니다.",
"authenticateThroughProxy": "인증"
"authenticateThroughProxy": "인증",
"voiceOptions": "음성 옵션",
"dictation": "받아쓰기",
"dictationDescription": "말하면 실시간으로 텍스트로 변환",
"recordAudio": "오디오 녹음",
"recordAudioDescription": "나중에 텍스트 변환을 위해 오디오 저장",
"recordingAudio": "녹음 중...",
"preparingRecording": "준비 중...",
"recordingHint": "완료되면 정지를 누르세요",
"stopAndSaveRecording": "정지 및 저장",
"processingRecording": "처리 중...",
"audioRecordingSaved": "오디오 녹음 저장됨",
"microphonePermissionDenied": "마이크 권한이 거부되었습니다",
"recordingFailed": "녹음 실패",
"removeFileConfirm": "이 파일을 노트에서 제거하시겠습니까?",
"fileRemoved": "파일 제거됨",
"playAudio": "오디오 재생",
"removeFile": "파일 제거",
"audioFileType": "오디오",
"imageFileType": "이미지",
"failedToUploadAudio": "오디오 업로드 실패",
"audioAttachment": "오디오 첨부 파일",
"loadingAudio": "오디오 로드 중...",
"failedToLoadAudio": "오디오를 로드할 수 없습니다"
}

View File

@@ -896,5 +896,28 @@
"continueButton": "Doorgaan",
"proxyAuthRequired": "Deze server vereist proxy-authenticatie",
"proxyAuthRequiredDescription": "Uw server lijkt achter een authenticatieproxy (zoals oauth2-proxy) te staan. U moet eerst inloggen via de proxy.",
"authenticateThroughProxy": "Authenticeren"
"authenticateThroughProxy": "Authenticeren",
"voiceOptions": "Spraakopties",
"dictation": "Dicteren",
"dictationDescription": "Spreek en converteer naar tekst in realtime",
"recordAudio": "Audio opnemen",
"recordAudioDescription": "Audio opslaan voor latere transcriptie",
"recordingAudio": "Opnemen...",
"preparingRecording": "Voorbereiden...",
"recordingHint": "Tik op stop wanneer klaar",
"stopAndSaveRecording": "Stop en opslaan",
"processingRecording": "Verwerken...",
"audioRecordingSaved": "Audio-opname opgeslagen",
"microphonePermissionDenied": "Microfoontoegang geweigerd",
"recordingFailed": "Opname mislukt",
"removeFileConfirm": "Dit bestand uit de notitie verwijderen?",
"fileRemoved": "Bestand verwijderd",
"playAudio": "Audio afspelen",
"removeFile": "Bestand verwijderen",
"audioFileType": "Audio",
"imageFileType": "Afbeelding",
"failedToUploadAudio": "Audio uploaden mislukt",
"audioAttachment": "Audiobijlage",
"loadingAudio": "Audio laden...",
"failedToLoadAudio": "Audio laden mislukt"
}

View File

@@ -896,5 +896,28 @@
"continueButton": "Продолжить",
"proxyAuthRequired": "Этот сервер требует аутентификацию через прокси",
"proxyAuthRequiredDescription": "Ваш сервер, похоже, находится за прокси аутентификации (например, oauth2-proxy). Сначала необходимо войти через прокси.",
"authenticateThroughProxy": "Аутентифицировать"
"authenticateThroughProxy": "Аутентифицировать",
"voiceOptions": "Голосовые опции",
"dictation": "Диктовка",
"dictationDescription": "Говорите и конвертируйте в текст в реальном времени",
"recordAudio": "Записать аудио",
"recordAudioDescription": "Сохранить аудио для последующей транскрипции",
"recordingAudio": "Запись...",
"preparingRecording": "Подготовка...",
"recordingHint": "Нажмите стоп когда закончите",
"stopAndSaveRecording": "Остановить и сохранить",
"processingRecording": "Обработка...",
"audioRecordingSaved": "Аудиозапись сохранена",
"microphonePermissionDenied": "Доступ к микрофону запрещён",
"recordingFailed": "Ошибка записи",
"removeFileConfirm": "Удалить этот файл из заметки?",
"fileRemoved": "Файл удалён",
"playAudio": "Воспроизвести аудио",
"removeFile": "Удалить файл",
"audioFileType": "Аудио",
"imageFileType": "Изображение",
"failedToUploadAudio": "Не удалось загрузить аудио",
"audioAttachment": "Аудио вложение",
"loadingAudio": "Загрузка аудио...",
"failedToLoadAudio": "Не удалось загрузить аудио"
}

View File

@@ -896,5 +896,28 @@
"continueButton": "继续",
"proxyAuthRequired": "此服务器需要代理认证",
"proxyAuthRequiredDescription": "您的服务器似乎位于认证代理(如 oauth2-proxy后面。您需要先通过代理登录。",
"authenticateThroughProxy": "认证"
"authenticateThroughProxy": "认证",
"voiceOptions": "语音选项",
"dictation": "听写",
"dictationDescription": "说话并实时转换为文字",
"recordAudio": "录制音频",
"recordAudioDescription": "保存音频以便稍后转录",
"recordingAudio": "录音中...",
"preparingRecording": "准备中...",
"recordingHint": "完成后点击停止",
"stopAndSaveRecording": "停止并保存",
"processingRecording": "处理中...",
"audioRecordingSaved": "音频录制已保存",
"microphonePermissionDenied": "麦克风权限被拒绝",
"recordingFailed": "录音失败",
"removeFileConfirm": "从笔记中移除此文件?",
"fileRemoved": "文件已移除",
"playAudio": "播放音频",
"removeFile": "移除文件",
"audioFileType": "音频",
"imageFileType": "图片",
"failedToUploadAudio": "音频上传失败",
"audioAttachment": "音频附件",
"loadingAudio": "正在加载音频...",
"failedToLoadAudio": "无法加载音频"
}

View File

@@ -896,5 +896,28 @@
"continueButton": "繼續",
"proxyAuthRequired": "此伺服器需要代理認證",
"proxyAuthRequiredDescription": "您的伺服器似乎位於認證代理(如 oauth2-proxy後面。您需要先透過代理登入。",
"authenticateThroughProxy": "認證"
"authenticateThroughProxy": "認證",
"voiceOptions": "語音選項",
"dictation": "聽寫",
"dictationDescription": "說話並即時轉換為文字",
"recordAudio": "錄製音訊",
"recordAudioDescription": "儲存音訊以便稍後轉錄",
"recordingAudio": "錄音中...",
"preparingRecording": "準備中...",
"recordingHint": "完成後點擊停止",
"stopAndSaveRecording": "停止並儲存",
"processingRecording": "處理中...",
"audioRecordingSaved": "音訊錄製已儲存",
"microphonePermissionDenied": "麥克風權限被拒絕",
"recordingFailed": "錄音失敗",
"removeFileConfirm": "從筆記中移除此檔案?",
"fileRemoved": "檔案已移除",
"playAudio": "播放音訊",
"removeFile": "移除檔案",
"audioFileType": "音訊",
"imageFileType": "圖片",
"failedToUploadAudio": "音訊上傳失敗",
"audioAttachment": "音訊附件",
"loadingAudio": "正在載入音訊...",
"failedToLoadAudio": "無法載入音訊"
}