diff --git a/languages/de.json b/languages/de.json new file mode 100644 index 0000000..17fd0ee --- /dev/null +++ b/languages/de.json @@ -0,0 +1,330 @@ +{ + "language": { + "display_name": "Deutsch (German)", + "select_language": "Sprache auswählen:", + "current_language": "Aktuelle Sprache: {language}", + "restart_required": "Sprachänderungen werden nach dem Neustart der Anwendung wirksam.", + "english": "Englisch", + "spanish": "Spanisch", + "portuguese": "Portugiesisch", + "russian": "Russisch", + "chinese": "Chinesisch", + "german": "Deutsch", + "help_text": "Wählen Sie Ihre bevorzugte Sprache für die Benutzeroberfläche.", + "restart_notice": "Die Sprachänderung wird nach dem Neustart der Anwendung wirksam." + }, + "app": { + "title": "YTSage", + "version": "v{version}", + "ready": "Bereit" + }, + "formats": { + "show_formats": "Formate anzeigen:", + "video_format": "Videoformat:", + "audio_format": "Audioformat:", + "no_formats": "Keine Formate verfügbar", + "loading": "Lade Formate...", + "select": "Auswählen", + "quality": "Qualität", + "extension": "Erweiterung", + "resolution": "Auflösung", + "file_size": "Dateigröße", + "codec": "Codec", + "audio": "Audio", + "notes": "Notizen", + "will_merge_audio": "Audio wird zusammengeführt", + "has_audio": "✓ Hat Audio", + "audio_only": "Nur Audio", + "large_size": "Große Größe", + "medium_size": "Mittlere Größe", + "standard_size": "Standardgröße", + "compatible": "Kompatibel", + "efficient": "Effizient", + "high_quality": "Hohe Qualität", + "best_4k": "Beste (4K)", + "best_2k": "Beste (2K)", + "high_1080p": "Hoch (1080p)", + "high_720p": "Hoch (720p)", + "medium_480p": "Mittel (480p)", + "low_quality": "Niedrige Qualität", + "best_audio": "Bestes Audio", + "high_audio": "Hohes Audio", + "medium_audio": "Mittleres Audio", + "low_audio": "Niedriges Audio", + "audio_only_resolution": "Nur Audio" + }, + "buttons": { + "download": "Herunterladen", + "pause": "Pausieren", + "resume": "Fortsetzen", + "cancel": "Abbrechen", + "browse": "Durchsuchen", + "clear": "Löschen", + "ok": "OK", + "apply": "Anwenden", + "close": "Schließen", + "run_command": "Befehl ausführen", + "custom_command_help": "Hilfe", + "about": "Über", + "analyze": "Analysieren", + "paste_url": "URL einfügen", + "select_videos": "Videos auswählen...", + "video": "Video", + "audio_only": "Nur Audio", + "custom_options": "Benutzerdefinierte Optionen", + "trim_video": "Video schneiden", + "download_settings": "Download-Einstellungen", + "update": "yt-dlp aktualisieren", + "select_defaults": "Standard auswählen", + "select_all": "Alle auswählen", + "deselect_all": "Alle abwählen" + }, + "dialogs": { + "custom_options": "Benutzerdefinierte Optionen", + "settings": "Einstellungen", + "select_folder": "Download-Ordner auswählen", + "sponsorblock_categories": "SponsorBlock-Kategorien", + "sponsorblock_description": "Wählen Sie aus, welche Arten von Videosegmenten während des Downloads automatisch entfernt werden sollen.\nSponsorBlock verwendet von der Community übermittelte Daten, um diese Segmente zu identifizieren.", + "select_subtitles": "Untertitel auswählen", + "filter_languages_placeholder": "Sprachen filtern (z.B. en, de)...", + "no_subtitles_available": "Keine Untertitel verfügbar", + "matching": "passend" + }, + "tabs": { + "cookies": "Mit Cookies anmelden", + "custom_command": "Benutzerdefinierter Befehl", + "proxy": "Proxy", + "language": "Sprache" + }, + "cookies": { + "help_text": "Wählen Sie aus, wie Cookies für die Anmeldung bereitgestellt werden sollen.\nDies ermöglicht das Herunterladen privater Videos und hochwertiger Audio-Dateien.", + "cookie_source": "Cookie-Quelle", + "use_cookie_file": "Cookie-Datei verwenden", + "extract_from_browser": "Aus Browser extrahieren", + "cookie_file": "Cookie-Datei", + "cookie_file_placeholder": "Pfad zur cookies.txt-Datei...", + "browser_selection": "Browser-Auswahl", + "browser_help": "Wählen Sie den Browser aus, aus dem Cookies extrahiert werden sollen:", + "browser_label": "Browser:", + "profile_label": "Profil:", + "profile_placeholder": "Standard", + "browser_extract_message": "Browser-Cookies werden beim Anwenden extrahiert", + "file_selected_message": "Cookie-Datei ausgewählt - Klicken Sie OK zum Anwenden", + "select_file_title": "Cookie-Datei auswählen", + "file_filter": "Cookie-Dateien (*.txt *.lwp)" + }, + "custom_command": { + "help_text": "Geben Sie Ihren benutzerdefinierten yt-dlp-Befehl unten ein. Die aktuelle URL wird automatisch angehängt.

Für die vollständige Liste der Optionen und Verwendungsbeispiele klicken Sie hier, um die offizielle yt-dlp-Dokumentation anzuzeigen.

Hinweis: Download-Pfad und Dateinamen-Vorlage werden automatisch behandelt.", + "input_label": "yt-dlp-Argumente:", + "input_placeholder": "Geben Sie yt-dlp-Argumente hier ein...\n\nz.B.: --extract-audio --audio-format mp3", + "output_label": "Befehlsausgabe:", + "output_placeholder": "Die Befehlsausgabe wird hier erscheinen...", + "command_placeholder": "Benutzerdefinierten yt-dlp-Befehl eingeben...", + "command_help": "Verfügbare Platzhalter:\n{url} - Video-URL\n{output} - Ausgabeordner\n\nBeispiel: --write-info-json --write-thumbnail", + "full_command": "🔧 Vollständiger Befehl: {command}", + "command_success": "✅ Benutzerdefinierter Befehl erfolgreich ausgeführt!", + "command_failed": "❌ Befehl fehlgeschlagen mit Exit-Code {code}", + "command_error": "❌ Fehler beim Ausführen des benutzerdefinierten Befehls: {error}" + }, + "proxy": { + "help_text": "Proxy-Einstellungen für Downloads konfigurieren. Leer lassen für direkte Verbindung.", + "main_proxy": "Haupt-Proxy", + "main_proxy_help": "Primärer Proxy-Server für alle Downloads. Unterstützt HTTP/HTTPS- und SOCKS5-Protokolle.", + "proxy_url_label": "Proxy-URL:", + "proxy_url_placeholder": "http://proxy:port oder socks5://proxy:port", + "proxy_examples": "Beispiele:\n• HTTP: http://proxy.example.com:8080\n• SOCKS5: socks5://proxy.example.com:1080", + "geo_proxy": "Geo-Umgehungs-Proxy", + "geo_proxy_help": "Sekundärer Proxy speziell zur Umgehung geografischer Beschränkungen.", + "geo_proxy_url_label": "Geo-Umgehungs-Proxy-URL:", + "geo_proxy_url_placeholder": "http://geo-proxy:port", + "clear_main_proxy": "Haupt-Proxy löschen", + "clear_geo_proxy": "Geo-Proxy löschen", + "proxy_url": "Proxy-URL", + "proxy_placeholder": "http://proxy:port oder socks5://proxy:port", + "geo_bypass": "Geo-Umgehungs-Proxy (für geografische Beschränkungen)", + "geo_bypass_placeholder": "http://proxy:port zur Umgehung von Geo-Blockierungen", + "invalid_main_url": "Ungültiges Haupt-Proxy-URL-Format", + "invalid_geo_url": "Ungültiges Geo-Proxy-URL-Format", + "main_configured": "Haupt-Proxy konfiguriert", + "geo_configured": "Geo-Proxy konfiguriert" + }, + "download": { + "preparing": "Download wird vorbereitet...", + "please_enter_url": "Bitte geben Sie zuerst eine URL ein.", + "please_set_path": "Bitte setzen Sie zuerst einen Download-Pfad.", + "please_enter_url_and_path": "Bitte geben Sie eine URL ein und setzen Sie einen Download-Pfad.", + "please_select_format": "Bitte wählen Sie zuerst ein Format aus." + }, + "update": { + "title": "yt-dlp aktualisieren", + "checking": "Suche nach Updates...", + "update_available": "Update verfügbar!\nAktuelle Version: {current}\nNeueste Version: {latest}", + "up_to_date": "yt-dlp ist aktuell (Version {version})", + "could_not_determine": "Versionen konnten nicht bestimmt werden.", + "error_comparing": "Fehler beim Vergleichen der Versionen: {error}", + "update_available_failed": "Update verfügbar! (Vergleich fehlgeschlagen)\nAktuell: {current}\nNeuest: {latest}", + "updating": "Wird aktualisiert...", + "initializing": "🚀 Update-Prozess wird initialisiert...", + "checking_current": "🔍 Aktuelle Installation wird überprüft...", + "found_at": "📍 yt-dlp gefunden in: {path}", + "error_getting_path": "❌ Fehler beim Abrufen des yt-dlp-Pfads: {error}", + "updating_binary": "📦 App-verwaltete yt-dlp-Binärdatei wird aktualisiert...", + "updating_pip": "🐍 System-yt-dlp wird über pip aktualisiert...", + "update_failed": "❌ yt-dlp-Update fehlgeschlagen. Bitte versuchen Sie es erneut oder überprüfen Sie Ihre Internetverbindung.", + "binary_updated": "✅ Binärdatei erfolgreich aktualisiert!", + "update_failed_stderr": "❌ yt-dlp-Update fehlgeschlagen: {error}", + "update_timeout": "❌ yt-dlp-Update-Zeitüberschreitung.", + "unexpected_error": "❌ Unerwarteter Fehler während des Updates: {error}", + "checking_pip": "🔍 Aktuelle pip-Installation wird überprüft...", + "current_version": "📋 Aktuelle Version: {version}", + "not_found_pip": "⚠️ yt-dlp über pip nicht gefunden, Installation wird versucht...", + "checking_latest": "🌐 Neueste Version wird überprüft...", + "failed_check_updates": "❌ Überprüfung auf Updates fehlgeschlagen", + "latest_version": "🆕 Neueste Version: {version}", + "updating_from_to": "⬆️ Update von {current} auf {latest}...", + "running_pip_install": "📦 pip install --upgrade wird ausgeführt...", + "pip_completed": "✅ Pip-Update erfolgreich abgeschlossen!", + "pip_failed": "❌ Pip-Update fehlgeschlagen: {error}" + }, + "about": { + "title": "Über YTSage", + "version": "Version {version}", + "description": "Moderner YouTube-Downloader mit sauberer PySide6-Oberfläche.", + "author": "Von: {author}", + "github": "GitHub: {repo}", + "system_info": "Systeminformationen", + "loading": "🔄 Systeminformationen werden geladen...", + "refresh": "🔄", + "refreshing": "🔄 Wird aktualisiert...", + "refresh_failed": "Aktualisierung fehlgeschlagen", + "refresh_failed_message": "Versionsinformationen konnten nicht aktualisiert werden.", + "detected": "✓ Erkannt", + "missing": "✗ Fehlend", + "not_available": "Nicht verfügbar" + }, + "time_range": { + "title": "Video schneiden", + "time_range_group": "Zeitbereich", + "start_time": "Startzeit (HH:MM:SS)", + "end_time": "Endzeit (HH:MM:SS)", + "start_placeholder": "00:00:00", + "end_placeholder": "00:00:00", + "start_time_placeholder": "Startzeit (HH:MM:SS)", + "end_time_placeholder": "Endzeit (HH:MM:SS)", + "force_keyframes": "Keyframes an Schnittpunkten erzwingen", + "help_text": "Setzen Sie Start- und Endzeit, um das Video zu schneiden.\nLeer lassen, um das vollständige Video herunterzuladen.", + "invalid_format": "Ungültiges Zeitformat. Verwenden Sie das Format HH:MM:SS.", + "start_after_end": "Startzeit kann nicht nach der Endzeit liegen." + }, + "settings": { + "title": "Download-Einstellungen", + "download_path": "Download-Pfad", + "browse": "Durchsuchen...", + "speed_limit": "Geschwindigkeitsbegrenzung", + "speed_limit_placeholder": "Keine", + "auto_update_ytdlp": "yt-dlp automatisch aktualisieren", + "enable_auto_updates": "Automatische yt-dlp-Updates aktivieren", + "update_frequency": "Update-Häufigkeit:", + "check_startup": "Bei jedem Start prüfen (mindestens 1 Stunde zwischen Prüfungen)", + "check_daily": "Täglich prüfen", + "check_weekly": "Wöchentlich prüfen", + "check_updates_now": "Jetzt nach Updates suchen", + "update_check_title": "Update-Prüfung", + "could_not_determine_version": "Aktuelle yt-dlp-Version konnte nicht bestimmt werden.", + "update_available_dialog": "Update verfügbar!\n\nAktuell: {current}\nNeuest: {latest}\n\nVerwenden Sie die Schaltfläche 'yt-dlp aktualisieren' im Hauptfenster zum Aktualisieren.", + "up_to_date_dialog": "yt-dlp ist aktuell!\n\nAktuelle Version: {version}", + "error_checking_updates": "Fehler bei der Update-Prüfung: {error}", + "settings_saved_title": "Einstellungen gespeichert", + "settings_saved_message": "Auto-Update-Einstellungen wurden erfolgreich gespeichert!", + "error_title": "Fehler", + "failed_save_settings": "Speichern der Auto-Update-Einstellungen fehlgeschlagen.", + "error_saving_settings": "Fehler beim Speichern der Auto-Update-Einstellungen: {error}", + "auto_update_title": "Auto-Update-Einstellungen", + "auto_update_header": "🔄 Auto-Update-Einstellungen", + "auto_update_description": "Konfigurieren Sie automatische Updates für yt-dlp, um sicherzustellen, dass Sie immer die neuesten Funktionen und Fehlerbehebungen haben.", + "current_status": "Aktueller Status", + "current_version_label": "Aktuelle yt-dlp-Version: Wird überprüft...", + "last_check_label": "Letzte Update-Prüfung: Nie", + "next_check_label": "Nächste Prüfung: Basierend auf Einstellungen", + "manual_check_button": "🔍 Jetzt nach Updates suchen", + "update_frequency_group": "Update-Häufigkeit", + "save_settings": "Einstellungen speichern", + "settings_saved_successfully": "✅ Einstellungen erfolgreich gespeichert!", + "error_saving": "❌ Fehler beim Speichern der Einstellungen: {error}" + }, + "main_ui": { + "url_placeholder": "YouTube-Video- oder Playlist-URL eingeben", + "merge_subtitles": "Untertitel zusammenführen", + "save_thumbnail": "Thumbnail speichern", + "save_description": "Beschreibung speichern", + "embed_chapters": "Kapitel einbetten", + "subtitles_selected": "{count} ausgewählt", + "all_selected": "Alle ausgewählt", + "select_videos_all": "Videos auswählen... (Alle ausgewählt)", + "please_enter_url": "Bitte geben Sie zuerst eine URL ein", + "cookie_file_selected_title": "Cookie-Datei ausgewählt", + "cookie_file_selected_message": "Cookie-Datei ausgewählt: {path}", + "browser_cookies_selected_title": "Browser-Cookies ausgewählt", + "browser_cookies_selected_message": "Browser-Cookies werden aus folgendem Browser extrahiert: {browser}", + "error_no_format_info": "Fehler: Keine Formatinformationen verfügbar.", + "error_extract_info": "Fehler: Grundlegende Videoinformationen konnten nicht extrahiert werden. Bitte überprüfen Sie Ihren Link.", + "analyzing_preparing": "Analysiere (0%)... Anfrage wird vorbereitet", + "analyzing_extracting_basic": "Analysiere (15%)... Grundlegende Informationen werden extrahiert", + "analyzing_extracting_detailed": "Analysiere (30%)... Detaillierte Informationen werden extrahiert", + "analyzing_processing_video": "Analysiere (45%)... Videodaten werden verarbeitet", + "analyzing_processing_formats": "Analysiere (60%)... Formate werden verarbeitet", + "analyzing_loading_thumbnail": "Analysiere (75%)... Thumbnail wird geladen", + "analyzing_processing_subtitles": "Analysiere (85%)... Untertitel werden verarbeitet", + "analyzing_updating_table": "Analysiere (95%)... Formattabelle wird aktualisiert", + "analysis_complete": "Analyse abgeschlossen!", + "analyzing_extracting_ytdlp": "Analysiere (30%)... Informationen mit yt-dlp-Ausführbarer Datei werden extrahiert", + "analyzing_processing_data": "Analysiere (60%)... Daten werden verarbeitet", + "analyzing_processing_formats_ytdlp": "Analysiere (75%)... Formate werden verarbeitet", + "analyzing_loading_thumbnail_ytdlp": "Analysiere (85%)... Thumbnail wird geladen", + "analyzing_processing_subtitles_ytdlp": "Analysiere (90%)... Untertitel werden verarbeitet", + "select_subtitles": "Untertitel auswählen...", + "sponsorblock_categories": "SponsorBlock-Kategorien..." + }, + "sponsorblock": { + "sponsor": "Sponsor", + "sponsor_desc": "Bezahlte Werbung, bezahlte Empfehlungen und direkte Werbung", + "selfpromo": "Unbezahlte/Eigenwerbung", + "selfpromo_desc": "Unbezahlte Werbung für eigene Inhalte der Ersteller", + "interaction": "Interaktions-Erinnerung", + "interaction_desc": "Zuschauer werden gebeten zu liken, zu abonnieren oder sozialen Medien zu folgen", + "intro": "Intro", + "intro_desc": "Video-Einleitung, die übersprungen werden kann", + "outro": "Outro/Abspann-Karten", + "outro_desc": "Credits oder wenn das Video endet", + "preview": "Vorschau/Zusammenfassung", + "preview_desc": "Kurze Zusammenfassung vorheriger Videos oder Vorschau auf kommende Inhalte", + "music_offtopic": "Nicht-Musik-Bereich", + "music_offtopic_desc": "Nur für Musikvideos. Markiert Nicht-Musik-Bereiche", + "filler": "Füller-Exkurs", + "filler_desc": "Abschweifende Szenen, die nur als Füller oder für Humor hinzugefügt wurden" + }, + "video_info": { + "channel": "Kanal", + "views": "Aufrufe", + "likes": "Gefällt mir", + "upload_date": "Upload-Datum", + "duration": "Dauer", + "unknown_channel": "Unbekannter Kanal", + "unknown_date": "Unbekanntes Datum", + "unknown_title": "Unbekannter Titel" + }, + "command": { + "running": "Läuft...", + "run_command": "Befehl ausführen" + }, + "selection": { + "none_selected": "0 ausgewählt", + "one_selected": "1 Kategorie ausgewählt", + "count_selected": "{count} ausgewählt" + }, + "status": { + "ready": "Bereit", + "file_exists": "⚠️ Datei existiert bereits", + "cancelling": "Download wird abgebrochen..." + } +} \ No newline at end of file diff --git a/languages/en.json b/languages/en.json index 2becc63..a852430 100644 --- a/languages/en.json +++ b/languages/en.json @@ -9,6 +9,7 @@ "portuguese": "Português (Portuguese)", "russian": "Русский (Russian)", "chinese": "中文 (简体) (Chinese Simplified)", + "german": "Deutsch (German)", "help_text": "Select your preferred language for the interface.", "restart_notice": "Language change will take effect after restarting the application." }, diff --git a/languages/es.json b/languages/es.json index 78411b5..4339bad 100644 --- a/languages/es.json +++ b/languages/es.json @@ -8,7 +8,8 @@ "spanish": "Español (Spanish)", "portuguese": "Português (Portuguese)", "russian": "Русский (Russian)", - "chinese": "中文 (简体) (Chinese Simplified)" + "chinese": "中文 (简体) (Chinese Simplified)", + "german": "Deutsch (German)" }, "app": { "title": "YTSage", diff --git a/languages/pt.json b/languages/pt.json index 9692b3f..29f9727 100644 --- a/languages/pt.json +++ b/languages/pt.json @@ -9,6 +9,7 @@ "portuguese": "Português", "russian": "Русский (Russian)", "chinese": "中文 (简体) (Chinese Simplified)", + "german": "Alemão", "help_text": "Selecione seu idioma preferido para a interface.", "restart_notice": "A alteração de idioma terá efeito após reiniciar a aplicação." }, diff --git a/languages/ru.json b/languages/ru.json index c29b222..e48501d 100644 --- a/languages/ru.json +++ b/languages/ru.json @@ -9,6 +9,7 @@ "portuguese": "Португальский", "russian": "Русский", "chinese": "中文 (简体) (Chinese Simplified)", + "german": "Немецкий", "help_text": "Выберите предпочитаемый язык для интерфейса.", "restart_notice": "Изменение языка вступит в силу после перезапуска приложения." }, diff --git a/languages/zh.json b/languages/zh.json index ae7910c..96ea952 100644 --- a/languages/zh.json +++ b/languages/zh.json @@ -9,6 +9,7 @@ "portuguese": "葡萄牙语", "russian": "俄语", "chinese": "中文", + "german": "德语", "help_text": "选择您喜欢的界面语言。", "restart_notice": "语言更改将在重启应用程序后生效。" }, diff --git a/src/gui/ytsage_gui_format_table.py b/src/gui/ytsage_gui_format_table.py index 89529d5..e3180c0 100644 --- a/src/gui/ytsage_gui_format_table.py +++ b/src/gui/ytsage_gui_format_table.py @@ -265,13 +265,13 @@ class FormatTableMixin: quality_text = self.get_quality_label(f) quality_item = QTableWidgetItem(quality_text) # Set color based on quality (check English, Spanish, Portuguese, Russian, and Chinese terms) - if any(term in quality_text for term in ["Best", "Óptima", "Mejor", "Melhor", "Лучшее", "最佳"]): + if any(term in quality_text for term in ["Best", "Óptima", "Mejor", "Melhor", "Лучшее", "最佳", "Beste"]): quality_item.setForeground(QColor("#00ff00")) # Green for best quality - elif any(term in quality_text for term in ["High", "Alta", "Alto", "Áudio Alto", "Audio Alto", "Высокое", "高清", "高质量"]): + elif any(term in quality_text for term in ["High", "Alta", "Alto", "Áudio Alto", "Audio Alto", "Высокое", "高清", "高质量", "Hoch"]): quality_item.setForeground(QColor("#00cc00")) # Light green for high quality - elif any(term in quality_text for term in ["Medium", "Media", "Medio", "Média", "Áudio Médio", "Audio Medio", "Среднее", "中等"]): + elif any(term in quality_text for term in ["Medium", "Media", "Medio", "Média", "Áudio Médio", "Audio Medio", "Среднее", "中等", "Mittel"]): quality_item.setForeground(QColor("#ffaa00")) # Orange for medium quality - elif any(term in quality_text for term in ["Low", "Baja", "Bajo", "Baixa", "Áudio Baixo", "Audio Bajo", "Низкое", "低质量"]): + elif any(term in quality_text for term in ["Low", "Baja", "Bajo", "Baixa", "Áudio Baixo", "Audio Bajo", "Низкое", "低质量", "Niedrig", "Niedriges Audio"]): quality_item.setForeground(QColor("#ff5555")) # Red for low quality self.format_table.setItem(row, 1, quality_item) diff --git a/src/utils/ytsage_localization.py b/src/utils/ytsage_localization.py index 79a90bc..a31c4c8 100644 --- a/src/utils/ytsage_localization.py +++ b/src/utils/ytsage_localization.py @@ -84,7 +84,8 @@ class LocalizationManager: "spanish": "Español (Spanish)", "portuguese": "Português (Portuguese)", "russian": "Русский (Russian)", - "chinese": "中文 (简体) (Chinese Simplified)" + "chinese": "中文 (简体) (Chinese Simplified)", + "german": "Deutsch (German)" }, "download": { "preparing": "🚀 Preparing your download...",