diff --git a/ui/localization/messages/da.json b/ui/localization/messages/da.json index 7ddf11bdf..a9161274f 100644 --- a/ui/localization/messages/da.json +++ b/ui/localization/messages/da.json @@ -48,6 +48,7 @@ "access_tls_updated": "TLS-indstillingerne er blevet opdateret", "access_update_tls_settings": "Opdater TLS-indstillinger", "action_bar_connection_stats": "Forbindelsesstatistik", + "action_bar_copy_text": "Kopiér tekst", "action_bar_extension": "Udvidelse", "action_bar_fullscreen": "Fuldskærm", "action_bar_settings": "Indstillinger", @@ -65,7 +66,11 @@ "advanced_developer_mode_warning_risks": "Brug kun hvis du forstår risiciene", "advanced_developer_mode_warning_security": "Sikkerheden svækkes, mens den er aktiv", "advanced_disable_usb_emulation": "Deaktiver USB-emulering", + "advanced_download_diagnostics_button": "Download diagnostik", + "advanced_download_diagnostics_description": "Download systemdiagnostik, nedbrudslogfiler og konfiguration til fejlfinding", + "advanced_download_diagnostics_title": "Download diagnostik", "advanced_enable_usb_emulation": "Aktivér USB-emulering", + "advanced_error_download_diagnostics": "Diagnostik mislykkedes med at downloade: {error}", "advanced_error_loopback_disable": "Kunne ikke deaktivere loopback-only-tilstand: {error}", "advanced_error_loopback_enable": "Kunne ikke aktivere loopback-only-tilstand: {error}", "advanced_error_reset_config": "Konfigurationen kunne ikke nulstilles: {error}", @@ -91,6 +96,7 @@ "advanced_ssh_default_user": "Standard SSH-brugeren er", "advanced_ssh_public_key_label": "Offentlig SSH-nøgle", "advanced_ssh_public_key_placeholder": "Indtast din offentlige SSH-nøgle", + "advanced_success_download_diagnostics": "Diagnostik blev downloadet", "advanced_success_loopback_disabled": "Kun loopback-tilstand er deaktiveret. Genstart din enhed for at anvende den.", "advanced_success_loopback_enabled": "Kun loopback-tilstand aktiveret. Genstart din enhed for at anvende den.", "advanced_success_reset_config": "Konfigurationen er nulstillet til standard", @@ -704,6 +710,14 @@ "not_available": "Ikke tilgængelig", "not_found": "Ikke fundet", "ntp_servers": "NTP-servere", + "ocr_copied": "Kopieret til udklipsholderen", + "ocr_copy_text": "Kopiér tekst", + "ocr_drag_to_select": "Træk for at vælge tekstområde. Tryk på Esc for at annullere.", + "ocr_failed": "OCR mislykkedes. Prøv igen.", + "ocr_no_text_detected": "Ingen tekst fundet i markeringen", + "ocr_processing_description": "Dette kan tage et par sekunder.", + "ocr_recognizing": "Genkender tekst...", + "ocr_result_description": "Gennemgå den genkendte tekst nedenfor.", "oh_no": "Åh nej!", "online": "Online", "other_session_detected": "Endnu en aktiv session registreret", diff --git a/ui/localization/messages/de.json b/ui/localization/messages/de.json index 5f7f54f19..d7aafbb72 100644 --- a/ui/localization/messages/de.json +++ b/ui/localization/messages/de.json @@ -48,6 +48,7 @@ "access_tls_updated": "TLS-Einstellungen erfolgreich aktualisiert", "access_update_tls_settings": "TLS-Einstellungen aktualisieren", "action_bar_connection_stats": "Verbindungsstatistiken", + "action_bar_copy_text": "Text kopieren", "action_bar_extension": "Erweiterung", "action_bar_fullscreen": "Vollbild", "action_bar_settings": "Einstellungen", @@ -65,7 +66,11 @@ "advanced_developer_mode_warning_risks": "Verwenden Sie es nur, wenn Sie die Risiken verstehen", "advanced_developer_mode_warning_security": "Die Sicherheit wird im aktiven Zustand geschwächt", "advanced_disable_usb_emulation": "USB-Emulation deaktivieren", + "advanced_download_diagnostics_button": "Diagnose herunterladen", + "advanced_download_diagnostics_description": "Laden Sie Systemdiagnosedaten, Absturzprotokolle und Konfigurationsdateien zur Fehlerbehebung herunter.", + "advanced_download_diagnostics_title": "Diagnose herunterladen", "advanced_enable_usb_emulation": "USB-Emulation aktivieren", + "advanced_error_download_diagnostics": "Fehler beim Herunterladen der Diagnosedaten: {error}", "advanced_error_loopback_disable": "Der Nur-Loopback-Modus konnte nicht deaktiviert werden: {error}", "advanced_error_loopback_enable": "Der Nur-Loopback-Modus konnte nicht aktiviert werden: {error}", "advanced_error_reset_config": "Konfiguration konnte nicht zurückgesetzt werden: {error}", @@ -91,6 +96,7 @@ "advanced_ssh_default_user": "Der Standard-SSH-Benutzer ist", "advanced_ssh_public_key_label": "Öffentlicher SSH-Schlüssel", "advanced_ssh_public_key_placeholder": "Geben Sie Ihren öffentlichen SSH-Schlüssel ein", + "advanced_success_download_diagnostics": "Diagnosedaten erfolgreich heruntergeladen", "advanced_success_loopback_disabled": "Nur-Loopback-Modus deaktiviert. Starten Sie Ihr Gerät neu, um die Funktion anzuwenden.", "advanced_success_loopback_enabled": "Nur-Loopback-Modus aktiviert. Starten Sie Ihr Gerät neu, um die Funktion anzuwenden.", "advanced_success_reset_config": "Konfiguration erfolgreich auf Standard zurückgesetzt", @@ -704,6 +710,14 @@ "not_available": "N / A", "not_found": "Nicht gefunden", "ntp_servers": "NTP-Server", + "ocr_copied": "In die Zwischenablage kopiert", + "ocr_copy_text": "Text kopieren", + "ocr_drag_to_select": "Ziehen Sie, um den Textbereich auszuwählen. Drücken Sie Esc, um den Vorgang abzubrechen.", + "ocr_failed": "OCR-Fehler. Bitte versuchen Sie es erneut.", + "ocr_no_text_detected": "Im Auswahlbereich wurde kein Text gefunden.", + "ocr_processing_description": "Dies kann einige Sekunden dauern.", + "ocr_recognizing": "Texterkennung...", + "ocr_result_description": "Überprüfen Sie den erkannten Text unten.", "oh_no": "Oh nein!", "online": "Online", "other_session_detected": "Eine weitere aktive Sitzung erkannt", diff --git a/ui/localization/messages/en.json b/ui/localization/messages/en.json index 6ad2c6b62..391c5bbfc 100644 --- a/ui/localization/messages/en.json +++ b/ui/localization/messages/en.json @@ -48,6 +48,7 @@ "access_tls_updated": "TLS settings updated successfully", "access_update_tls_settings": "Update TLS Settings", "action_bar_connection_stats": "Connection Stats", + "action_bar_copy_text": "Copy text", "action_bar_extension": "Extension", "action_bar_fullscreen": "Fullscreen", "action_bar_settings": "Settings", @@ -709,6 +710,14 @@ "not_available": "N/A", "not_found": "Not found", "ntp_servers": "NTP Servers", + "ocr_copied": "Copied to clipboard", + "ocr_copy_text": "Copy text", + "ocr_drag_to_select": "Drag to select text region. Press Esc to cancel.", + "ocr_failed": "OCR failed. Please try again.", + "ocr_no_text_detected": "No text detected in selection", + "ocr_processing_description": "This may take a few seconds.", + "ocr_recognizing": "Recognizing text...", + "ocr_result_description": "Review the recognized text below.", "oh_no": "Oh no!", "online": "Online", "other_session_detected": "Another Active Session Detected", diff --git a/ui/localization/messages/es.json b/ui/localization/messages/es.json index 957e2f5f0..33d11fa3f 100644 --- a/ui/localization/messages/es.json +++ b/ui/localization/messages/es.json @@ -48,6 +48,7 @@ "access_tls_updated": "La configuración de TLS se actualizó correctamente", "access_update_tls_settings": "Actualizar la configuración de TLS", "action_bar_connection_stats": "Estadísticas de conexión", + "action_bar_copy_text": "Copiar texto", "action_bar_extension": "Extensión", "action_bar_fullscreen": "Pantalla completa", "action_bar_settings": "Ajustes", @@ -65,7 +66,11 @@ "advanced_developer_mode_warning_risks": "Úselo solo si comprende los riesgos.", "advanced_developer_mode_warning_security": "La seguridad se debilita mientras está activa", "advanced_disable_usb_emulation": "Deshabilitar la emulación USB", + "advanced_download_diagnostics_button": "Descargar Diagnóstico", + "advanced_download_diagnostics_description": "Descargue diagnósticos del sistema, registros de fallos y configuración para la resolución de problemas", + "advanced_download_diagnostics_title": "Descargar Diagnóstico", "advanced_enable_usb_emulation": "Habilitar emulación USB", + "advanced_error_download_diagnostics": "No se pudieron descargar los diagnósticos: {error}", "advanced_error_loopback_disable": "No se pudo deshabilitar el modo de solo bucle invertido: {error}", "advanced_error_loopback_enable": "No se pudo habilitar el modo de solo bucle invertido: {error}", "advanced_error_reset_config": "No se pudo restablecer la configuración: {error}", @@ -91,6 +96,7 @@ "advanced_ssh_default_user": "El usuario SSH predeterminado es", "advanced_ssh_public_key_label": "Clave pública SSH", "advanced_ssh_public_key_placeholder": "Ingrese su clave pública SSH", + "advanced_success_download_diagnostics": "Diagnóstico descargado exitosamente", "advanced_success_loopback_disabled": "El modo de solo bucle invertido está deshabilitado. Reinicie el dispositivo para aplicarlo.", "advanced_success_loopback_enabled": "Modo de solo bucle invertido habilitado. Reinicie el dispositivo para aplicarlo.", "advanced_success_reset_config": "La configuración se restableció a los valores predeterminados correctamente", @@ -704,6 +710,14 @@ "not_available": "N / A", "not_found": "No encontrado", "ntp_servers": "Servidores NTP", + "ocr_copied": "Copiado al portapapeles", + "ocr_copy_text": "Copiar texto", + "ocr_drag_to_select": "Arrastre para seleccionar la región de texto. Presione Esc para cancelar.", + "ocr_failed": "Error en el OCR. Inténtalo de nuevo.", + "ocr_no_text_detected": "No se detectó texto en la selección", + "ocr_processing_description": "Esto puede tardar unos segundos.", + "ocr_recognizing": "Reconociendo texto...", + "ocr_result_description": "Revise el texto reconocido a continuación.", "oh_no": "¡Oh, no!", "online": "En línea", "other_session_detected": "Otra sesión activa detectada", diff --git a/ui/localization/messages/fr.json b/ui/localization/messages/fr.json index 1e21e0b8a..b3b64580d 100644 --- a/ui/localization/messages/fr.json +++ b/ui/localization/messages/fr.json @@ -48,6 +48,7 @@ "access_tls_updated": "Les paramètres TLS ont été mis à jour avec succès", "access_update_tls_settings": "Mettre à jour les paramètres TLS", "action_bar_connection_stats": "Statistiques de connexion", + "action_bar_copy_text": "Copier le texte", "action_bar_extension": "Extension", "action_bar_fullscreen": "Plein écran", "action_bar_settings": "Paramètres", @@ -65,7 +66,11 @@ "advanced_developer_mode_warning_risks": "À utiliser uniquement si vous comprenez les risques", "advanced_developer_mode_warning_security": "La sécurité est affaiblie lorsqu'elle est active", "advanced_disable_usb_emulation": "Désactiver l'émulation USB", + "advanced_download_diagnostics_button": "Télécharger les diagnostics", + "advanced_download_diagnostics_description": "Téléchargez les diagnostics système, les journaux d'erreurs et la configuration pour le dépannage.", + "advanced_download_diagnostics_title": "Télécharger les diagnostics", "advanced_enable_usb_emulation": "Activer l'émulation USB", + "advanced_error_download_diagnostics": "Échec du téléchargement des diagnostics : {error}", "advanced_error_loopback_disable": "Échec de la désactivation du mode de bouclage uniquement : {error}", "advanced_error_loopback_enable": "Échec de l'activation du mode de bouclage uniquement : {error}", "advanced_error_reset_config": "Échec de la réinitialisation de la configuration : {error}", @@ -91,6 +96,7 @@ "advanced_ssh_default_user": "L'utilisateur SSH par défaut est", "advanced_ssh_public_key_label": "Clé publique SSH", "advanced_ssh_public_key_placeholder": "Entrez votre clé publique SSH", + "advanced_success_download_diagnostics": "Diagnostics téléchargés avec succès", "advanced_success_loopback_disabled": "Mode de bouclage désactivé. Redémarrez votre appareil pour appliquer le mode de bouclage.", "advanced_success_loopback_enabled": "Mode de bouclage activé. Redémarrez votre appareil pour appliquer la fonction.", "advanced_success_reset_config": "La configuration par défaut a été réinitialisée avec succès", @@ -704,6 +710,14 @@ "not_available": "N / A", "not_found": "Non trouvé", "ntp_servers": "Serveurs NTP", + "ocr_copied": "Copié dans le presse-papiers", + "ocr_copy_text": "Copier le texte", + "ocr_drag_to_select": "Faites glisser le curseur pour sélectionner la zone de texte. Appuyez sur Échap pour annuler.", + "ocr_failed": "Échec de la reconnaissance optique de caractères. Veuillez réessayer.", + "ocr_no_text_detected": "Aucun texte détecté dans la sélection", + "ocr_processing_description": "Cela peut prendre quelques secondes.", + "ocr_recognizing": "Reconnaissance de texte...", + "ocr_result_description": "Vérifiez le texte reconnu ci-dessous.", "oh_no": "Oh non !", "online": "En ligne", "other_session_detected": "Une autre session active détectée", diff --git a/ui/localization/messages/it.json b/ui/localization/messages/it.json index 7886685d9..2cffcd4cb 100644 --- a/ui/localization/messages/it.json +++ b/ui/localization/messages/it.json @@ -48,6 +48,7 @@ "access_tls_updated": "Impostazioni TLS aggiornate correttamente", "access_update_tls_settings": "Aggiorna le impostazioni TLS", "action_bar_connection_stats": "Statistiche di connessione", + "action_bar_copy_text": "Copia il testo", "action_bar_extension": "Estensione", "action_bar_fullscreen": "A schermo intero", "action_bar_settings": "Impostazioni", @@ -65,7 +66,11 @@ "advanced_developer_mode_warning_risks": "Utilizzare solo se si comprendono i rischi", "advanced_developer_mode_warning_security": "La sicurezza è indebolita mentre è attiva", "advanced_disable_usb_emulation": "Disabilita l'emulazione USB", + "advanced_download_diagnostics_button": "Scarica Diagnostica", + "advanced_download_diagnostics_description": "Scarica la diagnostica di sistema, i registri degli arresti anomali e la configurazione per la risoluzione dei problemi", + "advanced_download_diagnostics_title": "Scarica Diagnostica", "advanced_enable_usb_emulation": "Abilita emulazione USB", + "advanced_error_download_diagnostics": "Impossibile scaricare la diagnostica: {error}", "advanced_error_loopback_disable": "Impossibile disabilitare la modalità solo loopback: {error}", "advanced_error_loopback_enable": "Impossibile abilitare la modalità solo loopback: {error}", "advanced_error_reset_config": "Impossibile reimpostare la configurazione: {error}", @@ -91,6 +96,7 @@ "advanced_ssh_default_user": "L'utente SSH predefinito è", "advanced_ssh_public_key_label": "Chiave pubblica SSH", "advanced_ssh_public_key_placeholder": "Inserisci la tua chiave pubblica SSH", + "advanced_success_download_diagnostics": "Diagnostica scaricata correttamente", "advanced_success_loopback_disabled": "Modalità loopback-only disattivata. Riavvia il dispositivo per applicare la modifica.", "advanced_success_loopback_enabled": "Modalità loopback abilitata. Riavvia il dispositivo per applicare la modifica.", "advanced_success_reset_config": "Configurazione ripristinata ai valori predefiniti con successo", @@ -704,6 +710,14 @@ "not_available": "N / A", "not_found": "Non trovato", "ntp_servers": "Server NTP", + "ocr_copied": "Copiato negli appunti", + "ocr_copy_text": "Copia testo", + "ocr_drag_to_select": "Trascina per selezionare l'area di testo. Premi Esc per annullare.", + "ocr_failed": "OCR non riuscito. Riprova.", + "ocr_no_text_detected": "Nessun testo rilevato nella selezione", + "ocr_processing_description": "Potrebbe richiedere alcuni secondi.", + "ocr_recognizing": "Riconoscimento del testo...", + "ocr_result_description": "Controlla il testo riconosciuto qui sotto.", "oh_no": "Oh no!", "online": "In linea", "other_session_detected": "Un'altra sessione attiva rilevata", diff --git a/ui/localization/messages/ja.json b/ui/localization/messages/ja.json index dbc98da12..276bc7517 100644 --- a/ui/localization/messages/ja.json +++ b/ui/localization/messages/ja.json @@ -48,6 +48,7 @@ "access_tls_updated": "TLS設定が正常に更新されました", "access_update_tls_settings": "TLS設定を更新", "action_bar_connection_stats": "接続統計", + "action_bar_copy_text": "テキストをコピー", "action_bar_extension": "拡張機能", "action_bar_fullscreen": "全画面", "action_bar_settings": "設定", @@ -709,6 +710,14 @@ "not_available": "N/A", "not_found": "見つかりません", "ntp_servers": "NTPサーバー", + "ocr_copied": "クリップボードにコピーされました", + "ocr_copy_text": "テキストをコピー", + "ocr_drag_to_select": "ドラッグしてテキスト領域を選択します。キャンセルするにはEscキーを押してください。", + "ocr_failed": "OCRに失敗しました。もう一度お試しください。", + "ocr_no_text_detected": "選択範囲にテキストが検出されませんでした", + "ocr_processing_description": "数秒かかる場合があります。", + "ocr_recognizing": "テキストを認識しています...", + "ocr_result_description": "以下の認識されたテキストを確認してください。", "oh_no": "おっと!", "online": "オンライン", "other_session_detected": "別のアクティブなセッションが検出されました", diff --git a/ui/localization/messages/nb.json b/ui/localization/messages/nb.json index 29d2cf83c..62666a585 100644 --- a/ui/localization/messages/nb.json +++ b/ui/localization/messages/nb.json @@ -48,6 +48,7 @@ "access_tls_updated": "TLS-innstillingene er oppdatert", "access_update_tls_settings": "Oppdater TLS-innstillinger", "action_bar_connection_stats": "Tilkoblingsstatistikk", + "action_bar_copy_text": "Kopier tekst", "action_bar_extension": "Forlengelse", "action_bar_fullscreen": "Fullskjerm", "action_bar_settings": "Innstillinger", @@ -65,7 +66,11 @@ "advanced_developer_mode_warning_risks": "Bruk kun hvis du forstår risikoene", "advanced_developer_mode_warning_security": "Sikkerheten svekkes mens den er aktiv", "advanced_disable_usb_emulation": "Deaktiver USB-emulering", + "advanced_download_diagnostics_button": "Last ned diagnostikk", + "advanced_download_diagnostics_description": "Last ned systemdiagnostikk, krasjlogger og konfigurasjon for feilsøking", + "advanced_download_diagnostics_title": "Last ned diagnostikk", "advanced_enable_usb_emulation": "Aktiver USB-emulering", + "advanced_error_download_diagnostics": "Kunne ikke laste ned diagnostikk: {error}", "advanced_error_loopback_disable": "Klarte ikke å deaktivere kun loopback-modus: {error}", "advanced_error_loopback_enable": "Kunne ikke aktivere kun loopback-modus: {error}", "advanced_error_reset_config": "Kunne ikke tilbakestille konfigurasjonen: {error}", @@ -91,6 +96,7 @@ "advanced_ssh_default_user": "Standard SSH-brukeren er", "advanced_ssh_public_key_label": "SSH offentlig nøkkel", "advanced_ssh_public_key_placeholder": "Skriv inn din offentlige SSH-nøkkel", + "advanced_success_download_diagnostics": "Diagnostikken er lastet ned", "advanced_success_loopback_disabled": "Kun tilbakekoblingsmodus deaktivert. Start enheten på nytt for å bruke den.", "advanced_success_loopback_enabled": "Kun tilbakekoblingsmodus aktivert. Start enheten på nytt for å bruke den.", "advanced_success_reset_config": "Konfigurasjonen ble tilbakestilt til standard", @@ -704,6 +710,14 @@ "not_available": "Ikke aktuelt", "not_found": "Ikke funnet", "ntp_servers": "NTP-servere", + "ocr_copied": "Kopiert til utklippstavlen", + "ocr_copy_text": "Kopier tekst", + "ocr_drag_to_select": "Dra for å velge tekstområde. Trykk Esc for å avbryte.", + "ocr_failed": "OCR mislyktes. Prøv på nytt.", + "ocr_no_text_detected": "Ingen tekst funnet i valget", + "ocr_processing_description": "Dette kan ta noen sekunder.", + "ocr_recognizing": "Gjenkjenner tekst...", + "ocr_result_description": "Se gjennom den gjenkjente teksten nedenfor.", "oh_no": "Å nei!", "online": "På nett", "other_session_detected": "En annen aktiv økt oppdaget", diff --git a/ui/localization/messages/pt.json b/ui/localization/messages/pt.json index bd090d86e..852ca2490 100644 --- a/ui/localization/messages/pt.json +++ b/ui/localization/messages/pt.json @@ -48,6 +48,7 @@ "access_tls_updated": "Configurações TLS atualizadas com sucesso", "access_update_tls_settings": "Atualizar Configurações TLS", "action_bar_connection_stats": "Estatísticas de Conexão", + "action_bar_copy_text": "Copiar texto", "action_bar_extension": "Extensão", "action_bar_fullscreen": "Tela Cheia", "action_bar_settings": "Configurações", @@ -709,6 +710,14 @@ "not_available": "N/D", "not_found": "Não encontrado", "ntp_servers": "Servidores NTP", + "ocr_copied": "Copiado para a área de transferência", + "ocr_copy_text": "Copiar texto", + "ocr_drag_to_select": "Arraste para selecionar a região de texto. Pressione Esc para cancelar.", + "ocr_failed": "Falha no OCR. Tente novamente.", + "ocr_no_text_detected": "Nenhum texto detectado na seleção.", + "ocr_processing_description": "Isso pode levar alguns segundos.", + "ocr_recognizing": "Reconhecendo texto...", + "ocr_result_description": "Revise o texto reconhecido abaixo.", "oh_no": "Oh não!", "online": "Online", "other_session_detected": "Outra Sessão Ativa Detectada", diff --git a/ui/localization/messages/sv.json b/ui/localization/messages/sv.json index dfc8ff008..a863b9191 100644 --- a/ui/localization/messages/sv.json +++ b/ui/localization/messages/sv.json @@ -48,6 +48,7 @@ "access_tls_updated": "TLS-inställningarna har uppdaterats", "access_update_tls_settings": "Uppdatera TLS-inställningar", "action_bar_connection_stats": "Anslutningsstatistik", + "action_bar_copy_text": "Kopiera text", "action_bar_extension": "Förlängning", "action_bar_fullscreen": "Helskärm", "action_bar_settings": "Inställningar", @@ -65,7 +66,11 @@ "advanced_developer_mode_warning_risks": "Använd endast om du förstår riskerna", "advanced_developer_mode_warning_security": "Säkerheten försvagas medan den är aktiv", "advanced_disable_usb_emulation": "Inaktivera USB-emulering", + "advanced_download_diagnostics_button": "Ladda ner diagnostik", + "advanced_download_diagnostics_description": "Ladda ner systemdiagnostik, kraschloggar och konfiguration för felsökning", + "advanced_download_diagnostics_title": "Ladda ner diagnostik", "advanced_enable_usb_emulation": "Aktivera USB-emulering", + "advanced_error_download_diagnostics": "Misslyckades med att ladda ner diagnostik: {error}", "advanced_error_loopback_disable": "Misslyckades med att inaktivera endast loopback-läge: {error}", "advanced_error_loopback_enable": "Misslyckades med att aktivera endast loopback-läge: {error}", "advanced_error_reset_config": "Misslyckades med att återställa konfigurationen: {error}", @@ -91,6 +96,7 @@ "advanced_ssh_default_user": "Standard SSH-användaren är", "advanced_ssh_public_key_label": "SSH-publik nyckel", "advanced_ssh_public_key_placeholder": "Ange din offentliga SSH-nyckel", + "advanced_success_download_diagnostics": "Diagnostiken har laddats ner", "advanced_success_loopback_disabled": "Endast loopback-läge inaktiverat. Starta om enheten för att tillämpa det.", "advanced_success_loopback_enabled": "Endast loopback-läge aktiverat. Starta om enheten för att tillämpa.", "advanced_success_reset_config": "Konfigurationen återställdes till standardinställningarna", @@ -704,6 +710,14 @@ "not_available": "Ej tillämpligt", "not_found": "Inte hittad", "ntp_servers": "NTP-servrar", + "ocr_copied": "Kopierad till urklipp", + "ocr_copy_text": "Kopiera text", + "ocr_drag_to_select": "Dra för att markera textregion. Tryck på Esc för att avbryta.", + "ocr_failed": "OCR misslyckades. Försök igen.", + "ocr_no_text_detected": "Ingen text upptäcktes i markeringen", + "ocr_processing_description": "Det kan ta några sekunder.", + "ocr_recognizing": "Tolkar igen text...", + "ocr_result_description": "Granska den igenkända texten nedan.", "oh_no": "nej då!", "online": "Online", "other_session_detected": "En annan aktiv session upptäckt", diff --git a/ui/localization/messages/zh-tw.json b/ui/localization/messages/zh-tw.json index c07fa76d5..95094a810 100644 --- a/ui/localization/messages/zh-tw.json +++ b/ui/localization/messages/zh-tw.json @@ -48,6 +48,7 @@ "access_tls_updated": "TLS 設定已成功更新", "access_update_tls_settings": "更新 TLS 設定", "action_bar_connection_stats": "連線統計", + "action_bar_copy_text": "複製文字", "action_bar_extension": "擴充功能", "action_bar_fullscreen": "全螢幕", "action_bar_settings": "設定", @@ -709,6 +710,14 @@ "not_available": "無法使用", "not_found": "找不到", "ntp_servers": "NTP 伺服器", + "ocr_copied": "已複製到剪貼簿", + "ocr_copy_text": "複製文字", + "ocr_drag_to_select": "拖曳滑鼠選擇文字區域。按 Esc 鍵取消。", + "ocr_failed": "OCR辨識失敗,請重試。", + "ocr_no_text_detected": "選定區域內未偵測到文字", + "ocr_processing_description": "這可能需要幾秒鐘。", + "ocr_recognizing": "辨識文字…", + "ocr_result_description": "請查看下方辨識的文字。", "oh_no": "噢不!", "online": "線上", "other_session_detected": "偵測到另一個有效的工作階段", diff --git a/ui/localization/messages/zh.json b/ui/localization/messages/zh.json index 615276188..bbf3291d6 100644 --- a/ui/localization/messages/zh.json +++ b/ui/localization/messages/zh.json @@ -48,6 +48,7 @@ "access_tls_updated": "TLS 设置更新成功。", "access_update_tls_settings": "更新 TLS 设置", "action_bar_connection_stats": "连接统计", + "action_bar_copy_text": "复制文本", "action_bar_extension": "扩展功能", "action_bar_fullscreen": "全屏", "action_bar_settings": "设置", @@ -65,7 +66,11 @@ "advanced_developer_mode_warning_risks": "确认您已了解相关风险后再使用。", "advanced_developer_mode_warning_security": "启用期间,设备安全性会降低。", "advanced_disable_usb_emulation": "禁用 USB 模拟", + "advanced_download_diagnostics_button": "下载诊断程序", + "advanced_download_diagnostics_description": "下载系统诊断信息、崩溃日志和配置信息以进行故障排除。", + "advanced_download_diagnostics_title": "下载诊断程序", "advanced_enable_usb_emulation": "启用 USB 模拟", + "advanced_error_download_diagnostics": "诊断信息下载失败: {error}", "advanced_error_loopback_disable": "禁用环回模式失败:{error}", "advanced_error_loopback_enable": "启用环回模式失败:{error}", "advanced_error_reset_config": "重置配置失败:{error}", @@ -91,6 +96,7 @@ "advanced_ssh_default_user": "默认 SSH 用户为", "advanced_ssh_public_key_label": "SSH 公钥", "advanced_ssh_public_key_placeholder": "请输入您的 SSH 公钥", + "advanced_success_download_diagnostics": "诊断文件已成功下载", "advanced_success_loopback_disabled": "环回模式已禁用。请重启设备以应用更改。", "advanced_success_loopback_enabled": "环回模式已启用。请重启设备以应用更改。", "advanced_success_reset_config": "配置已成功恢复为默认设置。", @@ -704,6 +710,14 @@ "not_available": "不可用", "not_found": "未找到", "ntp_servers": "NTP 服务器", + "ocr_copied": "已复制到剪贴板", + "ocr_copy_text": "复制文本", + "ocr_drag_to_select": "拖动鼠标选择文本区域。按 Esc 键取消。", + "ocr_failed": "OCR识别失败,请重试。", + "ocr_no_text_detected": "选定区域内未检测到文本", + "ocr_processing_description": "这可能需要几秒钟。", + "ocr_recognizing": "识别文本……", + "ocr_result_description": "请查看下方识别的文本。", "oh_no": "糟糕!", "online": "在线", "other_session_detected": "检测到其他活动会话", diff --git a/ui/package-lock.json b/ui/package-lock.json index 0982f1a6c..1111441f6 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -36,6 +36,7 @@ "recharts": "^3.5.1", "semver": "^7.7.3", "tailwind-merge": "^3.4.0", + "tesseract.js": "^7.0.0", "tslog": "^4.10.2", "usehooks-ts": "^3.1.1", "validator": "^13.15.23", @@ -3127,6 +3128,12 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -4999,6 +5006,12 @@ "human-id": "dist/cli.js" } }, + "node_modules/idb-keyval": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz", + "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==", + "license": "Apache-2.0" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -5406,6 +5419,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "license": "MIT" + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -6025,6 +6044,26 @@ "dev": true, "license": "MIT" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", @@ -6155,6 +6194,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "license": "MIT", + "bin": { + "opencollective-postinstall": "index.js" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -6755,6 +6803,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -7315,6 +7369,30 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tesseract.js": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tesseract.js/-/tesseract.js-7.0.0.tgz", + "integrity": "sha512-exPBkd+z+wM1BuMkx/Bjv43OeLBxhL5kKWsz/9JY+DXcXdiBjiAch0V49QR3oAJqCaL5qURE0vx9Eo+G5YE7mA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "bmp-js": "^0.1.0", + "idb-keyval": "^6.2.0", + "is-url": "^1.2.4", + "node-fetch": "^2.6.9", + "opencollective-postinstall": "^2.0.3", + "regenerator-runtime": "^0.13.3", + "tesseract.js-core": "^7.0.0", + "wasm-feature-detect": "^1.8.0", + "zlibjs": "^0.3.1" + } + }, + "node_modules/tesseract.js-core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tesseract.js-core/-/tesseract.js-core-7.0.0.tgz", + "integrity": "sha512-WnNH518NzmbSq9zgTPeoF8c+xmilS8rFIl1YKbk/ptuuc7p6cLNELNuPAzcmsYw450ca6bLa8j3t0VAtq435Vw==", + "license": "Apache-2.0" + }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -7337,6 +7415,12 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -7804,6 +7888,18 @@ } } }, + "node_modules/wasm-feature-detect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz", + "integrity": "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", @@ -7811,6 +7907,16 @@ "dev": true, "license": "MIT" }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7946,6 +8052,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zlibjs": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/zlibjs/-/zlibjs-0.3.1.tgz", + "integrity": "sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/zod": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", diff --git a/ui/package.json b/ui/package.json index 756f45527..962a0dcc8 100644 --- a/ui/package.json +++ b/ui/package.json @@ -58,6 +58,7 @@ "semver": "^7.7.3", "recharts": "^3.5.1", "tailwind-merge": "^3.4.0", + "tesseract.js": "^7.0.0", "tslog": "^4.10.2", "usehooks-ts": "^3.1.1", "validator": "^13.15.23", diff --git a/ui/src/components/ActionBar.tsx b/ui/src/components/ActionBar.tsx index 364845193..beaaa2301 100644 --- a/ui/src/components/ActionBar.tsx +++ b/ui/src/components/ActionBar.tsx @@ -1,12 +1,18 @@ import { Fragment, useCallback, useRef } from "react"; import { MdOutlineContentPasteGo } from "react-icons/md"; -import { LuCable, LuHardDrive, LuMaximize, LuSettings, LuSignal } from "react-icons/lu"; +import { LuCable, LuHardDrive, LuMaximize, LuScanText, LuSettings, LuSignal } from "react-icons/lu"; import { FaKeyboard } from "react-icons/fa6"; import { Popover, PopoverButton, PopoverPanel } from "@headlessui/react"; import { CommandLineIcon } from "@heroicons/react/20/solid"; import { cx } from "@/cva.config"; -import { useHidStore, useMountMediaStore, useSettingsStore, useUiStore } from "@hooks/stores"; +import { + useHidStore, + useMountMediaStore, + useSettingsStore, + useUiStore, + useVideoStore, +} from "@hooks/stores"; import { useDeviceUiNavigation } from "@hooks/useAppNavigation"; import { Button } from "@components/Button"; import Container from "@components/Container"; @@ -23,9 +29,16 @@ export default function Actionbar({ }) { const { navigateTo } = useDeviceUiNavigation(); const { isVirtualKeyboardEnabled, setVirtualKeyboardEnabled } = useHidStore(); - const { setDisableVideoFocusTrap, terminalType, setTerminalType, toggleSidebarView } = - useUiStore(); + const { + setDisableVideoFocusTrap, + terminalType, + setTerminalType, + toggleSidebarView, + isOcrMode, + setOcrMode, + } = useUiStore(); const { remoteVirtualMediaState } = useMountMediaStore(); + const { width: videoWidth, height: videoHeight } = useVideoStore(); const { developerMode } = useSettingsStore(); // This is the only way to get a reliable state change for the popover @@ -63,6 +76,14 @@ export default function Actionbar({ onClick={() => setTerminalType(terminalType === "kvm" ? "none" : "kvm")} /> )} +