diff --git a/languages/de.json b/languages/de.json index ec5bf7a..4aaf420 100644 --- a/languages/de.json +++ b/languages/de.json @@ -15,6 +15,7 @@ "indonesian": "Indonesisch", "turkish": "Türkisch", "polish": "Polnisch", + "italian": "Italienisch", "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." }, diff --git a/languages/en.json b/languages/en.json index 3703c12..f09eb5b 100644 --- a/languages/en.json +++ b/languages/en.json @@ -15,6 +15,7 @@ "indonesian": "Bahasa Indonesia (Indonesian)", "turkish": "Türkçe (Turkish)", "polish": "Polski (Polish)", + "italian": "Italiano (Italian)", "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 1ac9ea2..4769b72 100644 --- a/languages/es.json +++ b/languages/es.json @@ -14,7 +14,8 @@ "hindi": "Hindi", "indonesian": "Indonesio", "turkish": "Turco", - "polish": "Polaco" + "polish": "Polaco", + "italian": "Italiano" }, "app": { "title": "YTSage", diff --git a/languages/fr.json b/languages/fr.json index 080642f..8e362b4 100644 --- a/languages/fr.json +++ b/languages/fr.json @@ -15,6 +15,7 @@ "indonesian": "Indonésien", "turkish": "Turc", "polish": "Polonais", + "italian": "Italien", "help_text": "Sélectionnez votre langue préférée pour l'interface.", "restart_notice": "Le changement de langue prendra effet après le redémarrage de l'application." }, diff --git a/languages/hi.json b/languages/hi.json index 59a5fd6..bdd349e 100644 --- a/languages/hi.json +++ b/languages/hi.json @@ -15,6 +15,7 @@ "indonesian": "इंडोनेशियाई", "turkish": "तुर्की", "polish": "पोलिश", + "italian": "इतालवी", "help_text": "इंटरफेस के लिए अपनी पसंदीदा भाषा चुनें।", "restart_notice": "भाषा परिवर्तन एप्लिकेशन पुनरारंभ के बाद प्रभावी होगा।" }, diff --git a/languages/id.json b/languages/id.json index 349d0b7..ef9def4 100644 --- a/languages/id.json +++ b/languages/id.json @@ -15,6 +15,7 @@ "indonesian": "Bahasa Indonesia", "turkish": "Bahasa Turki", "polish": "Bahasa Polandia", + "italian": "Bahasa Italia", "help_text": "Pilih bahasa yang diinginkan untuk antarmuka.", "restart_notice": "Perubahan bahasa akan berlaku setelah memulai ulang aplikasi." }, diff --git a/languages/it.json b/languages/it.json new file mode 100644 index 0000000..146c95d --- /dev/null +++ b/languages/it.json @@ -0,0 +1,336 @@ +{ + "language": { + "display_name": "Italiano (Italian)", + "select_language": "Seleziona lingua:", + "current_language": "Lingua attuale: {language}", + "restart_required": "Il cambio di lingua avrà effetto dopo il riavvio dell'applicazione.", + "english": "Inglese", + "spanish": "Spagnolo", + "portuguese": "Portoghese", + "russian": "Russo", + "chinese": "Cinese", + "german": "Tedesco", + "french": "Francese", + "hindi": "Hindi", + "indonesian": "Indonesiano", + "turkish": "Turco", + "polish": "Polacco", + "italian": "Italiano", + "help_text": "Seleziona la lingua preferita per l'interfaccia.", + "restart_notice": "Il cambio di lingua avrà effetto dopo il riavvio dell'applicazione." + }, + "app": { + "title": "YTSage", + "version": "v{version}", + "ready": "Pronto" + }, + "formats": { + "show_formats": "Mostra formati:", + "video_format": "Formato video:", + "audio_format": "Formato audio:", + "no_formats": "Nessun formato disponibile", + "loading": "Caricamento formati...", + "select": "Seleziona", + "quality": "Qualità", + "extension": "Estensione", + "resolution": "Risoluzione", + "file_size": "Dimensione file", + "codec": "Codec", + "audio": "Audio", + "notes": "Note", + "will_merge_audio": "L'audio verrà unito", + "has_audio": "✓ Contiene audio", + "audio_only": "Solo audio", + "large_size": "Dimensione grande", + "medium_size": "Dimensione media", + "standard_size": "Dimensione standard", + "compatible": "Compatibile", + "efficient": "Efficiente", + "high_quality": "Alta qualità", + "best_4k": "Migliore (4K)", + "best_2k": "Migliore (2K)", + "high_1080p": "Alta (1080p)", + "high_720p": "Alta (720p)", + "medium_480p": "Media (480p)", + "low_quality": "Bassa qualità", + "best_audio": "Miglior audio", + "high_audio": "Audio alto", + "medium_audio": "Audio medio", + "low_audio": "Audio basso", + "audio_only_resolution": "Solo audio" + }, + "buttons": { + "download": "Scarica", + "pause": "Pausa", + "resume": "Riprendi", + "cancel": "Annulla", + "browse": "Sfoglia", + "clear": "Cancella", + "ok": "OK", + "apply": "Applica", + "close": "Chiudi", + "run_command": "Esegui comando", + "custom_command_help": "Aiuto", + "about": "Informazioni", + "analyze": "Analizza", + "paste_url": "Incolla URL", + "select_videos": "Seleziona video...", + "video": "Video", + "audio_only": "Solo audio", + "custom_options": "Opzioni personalizzate", + "trim_video": "Taglia video", + "download_settings": "Impostazioni download", + "update": "Aggiorna yt-dlp", + "select_defaults": "Seleziona predefiniti", + "select_all": "Seleziona tutto", + "deselect_all": "Deseleziona tutto" + }, + "dialogs": { + "custom_options": "Opzioni personalizzate", + "settings": "Impostazioni", + "select_folder": "Seleziona cartella di download", + "sponsorblock_categories": "Categorie SponsorBlock", + "sponsorblock_description": "Seleziona i tipi di segmenti video da rimuovere automaticamente durante il download.\nSponsorBlock utilizza dati inviati dalla comunità per identificare questi segmenti.", + "select_subtitles": "Seleziona sottotitoli", + "filter_languages_placeholder": "Filtra lingue (es: it, en)...", + "no_subtitles_available": "Nessun sottotitolo disponibile", + "matching": "corrispondenti" + }, + "tabs": { + "cookies": "Accedi con i cookie", + "custom_command": "Comando personalizzato", + "proxy": "Proxy", + "language": "Lingua" + }, + "cookies": { + "help_text": "Seleziona un metodo per fornire i cookie per l'autenticazione.\nCiò consente di scaricare video privati e file audio di alta qualità.", + "cookie_source": "Fonte cookie", + "use_cookie_file": "Usa file cookie", + "extract_from_browser": "Estrai dal browser", + "cookie_file": "File cookie", + "cookie_file_placeholder": "Percorso al file cookies.txt...", + "browser_selection": "Selezione browser", + "browser_help": "Seleziona il browser da cui estrarre i cookie:", + "browser_label": "Browser:", + "profile_label": "Profilo:", + "profile_placeholder": "Predefinito", + "browser_extract_message": "I cookie del browser verranno estratti dopo l'applicazione", + "file_selected_message": "File cookie selezionato - Clicca OK per applicare", + "select_file_title": "Seleziona file cookie", + "file_filter": "File cookie (*.txt *.lwp)" + }, + "custom_command": { + "help_text": "Inserisci un comando yt-dlp personalizzato qui sotto. L'URL corrente verrà aggiunto automaticamente.

Per l'elenco completo delle opzioni ed esempi di utilizzo clicca qui per vedere la documentazione ufficiale yt-dlp.

Nota: Il percorso di download e il modello del nome file sono gestiti automaticamente.", + "input_label": "Argomenti yt-dlp:", + "input_placeholder": "Inserisci gli argomenti yt-dlp qui...\n\nEsempio: --extract-audio --audio-format mp3", + "output_label": "Output comando:", + "output_placeholder": "L'output del comando apparirà qui...", + "command_placeholder": "Inserisci comando yt-dlp personalizzato...", + "command_help": "Placeholder disponibili:\n{url} - URL del video\n{output} - Cartella di output\n\nEsempio: --write-info-json --write-thumbnail", + "full_command": "🔧 Comando completo: {command}", + "command_success": "✅ Comando personalizzato eseguito con successo!", + "command_failed": "❌ Comando fallito con codice di uscita {code}", + "command_error": "❌ Errore nell'esecuzione del comando personalizzato: {error}" + }, + "proxy": { + "help_text": "Configura le impostazioni proxy per i download. Lascia vuoto per connessione diretta.", + "main_proxy": "Proxy principale", + "main_proxy_help": "Server proxy principale per tutti i download. Supporta protocolli HTTP/HTTPS e SOCKS5.", + "proxy_url_label": "URL Proxy:", + "proxy_url_placeholder": "http://proxy:porta o socks5://proxy:porta", + "proxy_examples": "Esempi:\n• HTTP: http://proxy.example.com:8080\n• SOCKS5: socks5://proxy.example.com:1080", + "geo_proxy": "Proxy geo-bypass", + "geo_proxy_help": "Proxy aggiuntivo specificamente per aggirare le restrizioni geografiche.", + "geo_proxy_url_label": "URL proxy geo-bypass:", + "geo_proxy_url_placeholder": "http://geo-proxy:porta", + "clear_main_proxy": "Cancella proxy principale", + "clear_geo_proxy": "Cancella proxy geo", + "proxy_url": "URL Proxy", + "proxy_placeholder": "http://proxy:porta o socks5://proxy:porta", + "geo_bypass": "Proxy geo-bypass (per restrizioni geografiche)", + "geo_bypass_placeholder": "http://proxy:porta per aggirare il geo-blocking", + "invalid_main_url": "Formato URL proxy principale non valido", + "invalid_geo_url": "Formato URL proxy geo non valido", + "main_configured": "Proxy principale configurato", + "geo_configured": "Proxy geo configurato" + }, + "download": { + "preparing": "Preparazione download...", + "please_enter_url": "Inserisci prima un URL.", + "please_set_path": "Imposta prima un percorso di download.", + "please_enter_url_and_path": "Inserisci un URL e imposta un percorso di download.", + "please_select_format": "Seleziona prima un formato." + }, + "update": { + "title": "Aggiorna yt-dlp", + "checking": "Controllo aggiornamenti...", + "update_available": "Aggiornamento disponibile!\nVersione corrente: {current}\nUltima versione: {latest}", + "up_to_date": "yt-dlp è aggiornato (Versione {version})", + "could_not_determine": "Impossibile determinare la versione.", + "error_comparing": "Errore nel confronto versioni: {error}", + "update_available_failed": "Aggiornamento disponibile! (Confronto fallito)\nCorrente: {current}\nUltima: {latest}", + "updating": "Aggiornamento...", + "initializing": "🚀 Inizializzazione processo di aggiornamento...", + "checking_current": "🔍 Controllo installazione corrente...", + "found_at": "📍 yt-dlp trovato in: {path}", + "error_getting_path": "❌ Errore nel recupero del percorso yt-dlp: {error}", + "updating_binary": "📦 Aggiornamento binario yt-dlp gestito dall'app...", + "updating_pip": "🐍 Aggiornamento yt-dlp di sistema via pip...", + "update_failed": "❌ Aggiornamento yt-dlp fallito. Riprova o controlla la connessione internet.", + "binary_updated": "✅ Binario aggiornato con successo!", + "update_failed_stderr": "❌ Aggiornamento yt-dlp fallito: {error}", + "update_timeout": "❌ Timeout aggiornamento yt-dlp.", + "unexpected_error": "❌ Errore inaspettato durante l'aggiornamento: {error}", + "checking_pip": "🔍 Controllo installazione pip corrente...", + "current_version": "📋 Versione corrente: {version}", + "not_found_pip": "⚠️ yt-dlp non trovato via pip, tentativo di installazione...", + "checking_latest": "🌐 Controllo ultima versione...", + "failed_check_updates": "❌ Controllo aggiornamenti fallito", + "latest_version": "🆕 Ultima versione: {version}", + "updating_from_to": "⬆️ Aggiornamento da {current} a {latest}...", + "running_pip_install": "📦 Esecuzione pip install --upgrade...", + "pip_completed": "✅ Aggiornamento pip completato con successo!", + "pip_failed": "❌ Aggiornamento pip fallito: {error}" + }, + "about": { + "title": "Informazioni su YTSage", + "version": "Versione {version}", + "description": "Downloader YouTube moderno con interfaccia PySide6 pulita.", + "author": "Autore: {author}", + "github": "GitHub: {repo}", + "system_info": "Informazioni sistema", + "loading": "🔄 Caricamento informazioni sistema...", + "refresh": "🔄", + "refreshing": "🔄 Aggiornamento...", + "refresh_failed": "Aggiornamento fallito", + "refresh_failed_message": "Impossibile aggiornare le informazioni sulla versione.", + "detected": "✓ Rilevato", + "missing": "✗ Mancante", + "not_available": "Non disponibile" + }, + "time_range": { + "title": "Taglia video", + "time_range_group": "Intervallo di tempo", + "start_time": "Tempo di inizio (HH:MM:SS)", + "end_time": "Tempo di fine (HH:MM:SS)", + "start_placeholder": "00:00:00", + "end_placeholder": "00:00:00", + "start_time_placeholder": "Tempo di inizio (HH:MM:SS)", + "end_time_placeholder": "Tempo di fine (HH:MM:SS)", + "force_keyframes": "Forza keyframe ai punti di taglio", + "help_text": "Imposta i tempi di inizio e fine per tagliare il video.\nLascia vuoto per scaricare il video completo.", + "invalid_format": "Formato tempo non valido. Usa il formato HH:MM:SS.", + "start_after_end": "Il tempo di inizio non può essere dopo il tempo di fine." + }, + "settings": { + "title": "Impostazioni download", + "download_path": "Percorso download", + "browse": "Sfoglia...", + "speed_limit": "Limite velocità", + "speed_limit_placeholder": "Nessuno", + "auto_update_ytdlp": "Aggiornamenti automatici yt-dlp", + "enable_auto_updates": "Abilita aggiornamenti automatici yt-dlp", + "update_frequency": "Frequenza aggiornamenti:", + "check_startup": "Controlla ad ogni avvio (minimo 1 ora tra i controlli)", + "check_daily": "Controlla giornalmente", + "check_weekly": "Controlla settimanalmente", + "check_updates_now": "Controlla aggiornamenti ora", + "update_check_title": "Controllo aggiornamenti", + "could_not_determine_version": "Impossibile determinare la versione corrente di yt-dlp.", + "update_available_dialog": "Aggiornamento disponibile!\n\nCorrente: {current}\nUltima: {latest}\n\nUsa il pulsante 'Aggiorna yt-dlp' nella finestra principale per aggiornare.", + "up_to_date_dialog": "yt-dlp è aggiornato!\n\nVersione corrente: {version}", + "error_checking_updates": "Errore nel controllo aggiornamenti: {error}", + "settings_saved_title": "Impostazioni salvate", + "settings_saved_message": "Le impostazioni di aggiornamento automatico sono state salvate con successo!", + "error_title": "Errore", + "failed_save_settings": "Impossibile salvare le impostazioni di aggiornamento automatico.", + "error_saving_settings": "Errore nel salvataggio delle impostazioni di aggiornamento automatico: {error}", + "auto_update_title": "Impostazioni aggiornamenti automatici", + "auto_update_header": "🔄 Impostazioni aggiornamenti automatici", + "auto_update_description": "Configura gli aggiornamenti automatici per yt-dlp per garantire le ultime funzionalità e correzioni bug.", + "current_status": "Stato attuale", + "current_version_label": "Versione corrente yt-dlp: Controllo...", + "last_check_label": "Ultimo controllo aggiornamenti: Mai", + "next_check_label": "Prossimo controllo: Basato sulle impostazioni", + "manual_check_button": "🔍 Controlla aggiornamenti ora", + "update_frequency_group": "Frequenza aggiornamenti", + "save_settings": "Salva impostazioni", + "settings_saved_successfully": "✅ Impostazioni salvate con successo!", + "error_saving": "❌ Errore nel salvataggio impostazioni: {error}" + }, + "main_ui": { + "url_placeholder": "Inserisci URL video YouTube o playlist", + "merge_subtitles": "Unisci sottotitoli", + "save_thumbnail": "Salva miniatura", + "save_description": "Salva descrizione", + "embed_chapters": "Incorpora capitoli", + "subtitles_selected": "{count} selezionati", + "all_selected": "Tutti selezionati", + "select_videos_all": "Seleziona video... (Tutti selezionati)", + "please_enter_url": "Inserisci prima un URL", + "cookie_file_selected_title": "File cookie selezionato", + "cookie_file_selected_message": "File cookie selezionato: {path}", + "browser_cookies_selected_title": "Cookie browser selezionati", + "browser_cookies_selected_message": "I cookie del browser verranno estratti da: {browser}", + "error_no_format_info": "Errore: Nessuna informazione formato disponibile.", + "error_extract_info": "Errore: Impossibile estrarre informazioni base del video. Controlla il tuo link.", + "analyzing_preparing": "Analisi (0%)... Preparazione richiesta", + "analyzing_extracting_basic": "Analisi (15%)... Estrazione informazioni base", + "analyzing_extracting_detailed": "Analisi (30%)... Estrazione informazioni dettagliate", + "analyzing_processing_video": "Analisi (45%)... Elaborazione dati video", + "analyzing_processing_formats": "Analisi (60%)... Elaborazione formati", + "analyzing_loading_thumbnail": "Analisi (75%)... Caricamento miniatura", + "analyzing_processing_subtitles": "Analisi (85%)... Elaborazione sottotitoli", + "analyzing_updating_table": "Analisi (95%)... Aggiornamento tabella formati", + "analysis_complete": "Analisi completata!", + "analyzing_extracting_ytdlp": "Analisi (30%)... Estrazione informazioni usando eseguibile yt-dlp", + "analyzing_processing_data": "Analisi (60%)... Elaborazione dati", + "analyzing_processing_formats_ytdlp": "Analisi (75%)... Elaborazione formati", + "analyzing_loading_thumbnail_ytdlp": "Analisi (85%)... Caricamento miniatura", + "analyzing_processing_subtitles_ytdlp": "Analisi (90%)... Elaborazione sottotitoli", + "select_subtitles": "Seleziona sottotitoli...", + "sponsorblock_categories": "Categorie SponsorBlock..." + }, + "sponsorblock": { + "sponsor": "Sponsor", + "sponsor_desc": "Pubblicità a pagamento, raccomandazioni a pagamento e pubblicità dirette", + "selfpromo": "Non remunerata/Autopromozione", + "selfpromo_desc": "Promozione non remunerata dei propri contenuti del creatore", + "interaction": "Promemoria interazione", + "interaction_desc": "Gli spettatori vengono invitati a mettere mi piace, iscriversi o seguire sui social media", + "intro": "Intro", + "intro_desc": "Introduzione al video che può essere saltata", + "outro": "Outro/Schede finali", + "outro_desc": "Titoli di coda o quando il video finisce", + "preview": "Anteprima/Ricapitolazione", + "preview_desc": "Breve ricapitolazione di video precedenti o anteprima di contenuti futuri", + "music_offtopic": "Sezione non musicale", + "music_offtopic_desc": "Solo per video musicali. Indica sezioni non musicali", + "filler": "Riempitivo tangenziale", + "filler_desc": "Scene tangenziali aggiunte solo come riempitivo o per umorismo" + }, + "video_info": { + "channel": "Canale", + "views": "Visualizzazioni", + "likes": "Mi piace", + "upload_date": "Data caricamento", + "duration": "Durata", + "unknown_channel": "Canale sconosciuto", + "unknown_date": "Data sconosciuta", + "unknown_title": "Titolo sconosciuto" + }, + "command": { + "running": "Esecuzione...", + "run_command": "Esegui comando" + }, + "selection": { + "none_selected": "0 selezionati", + "one_selected": "1 categoria selezionata", + "count_selected": "{count} selezionati" + }, + "status": { + "ready": "Pronto", + "file_exists": "⚠️ File già esistente", + "cancelling": "Annullamento download..." + } +} \ No newline at end of file diff --git a/languages/pl.json b/languages/pl.json index 05afb02..f7eb923 100644 --- a/languages/pl.json +++ b/languages/pl.json @@ -15,6 +15,7 @@ "indonesian": "Indonezyjski", "turkish": "Turecki", "polish": "Polski", + "italian": "Włoski", "help_text": "Wybierz preferowany język interfejsu.", "restart_notice": "Zmiana języka zostanie zastosowana po ponownym uruchomieniu aplikacji." }, diff --git a/languages/pt.json b/languages/pt.json index 861ce66..2f53c57 100644 --- a/languages/pt.json +++ b/languages/pt.json @@ -15,6 +15,7 @@ "indonesian": "Indonésio", "turkish": "Turco", "polish": "Polonês", + "italian": "Italiano", "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 1d739ab..a6cb6fd 100644 --- a/languages/ru.json +++ b/languages/ru.json @@ -15,6 +15,7 @@ "indonesian": "Индонезийский", "turkish": "Турецкий", "polish": "Польский", + "italian": "Итальянский", "help_text": "Выберите предпочитаемый язык для интерфейса.", "restart_notice": "Изменение языка вступит в силу после перезапуска приложения." }, diff --git a/languages/tr.json b/languages/tr.json index a8e8642..70c8764 100644 --- a/languages/tr.json +++ b/languages/tr.json @@ -15,6 +15,7 @@ "indonesian": "Endonezce", "turkish": "Türkçe", "polish": "Lehçe", + "italian": "İtalyanca", "help_text": "Arayüz için tercih ettiğiniz dili seçin.", "restart_notice": "Dil değişikliği uygulamayı yeniden başlattıktan sonra geçerli olacaktır." }, diff --git a/languages/zh.json b/languages/zh.json index 860c066..9d18921 100644 --- a/languages/zh.json +++ b/languages/zh.json @@ -15,6 +15,7 @@ "indonesian": "印尼语", "turkish": "土耳其语", "polish": "波兰语", + "italian": "意大利语", "help_text": "选择您喜欢的界面语言。", "restart_notice": "语言更改将在重启应用程序后生效。" }, diff --git a/src/gui/ytsage_gui_format_table.py b/src/gui/ytsage_gui_format_table.py index 6def03f..89f5ed3 100644 --- a/src/gui/ytsage_gui_format_table.py +++ b/src/gui/ytsage_gui_format_table.py @@ -264,15 +264,15 @@ class FormatTableMixin: # Column 1: Quality (Always shown) quality_text = self.get_quality_label(f) quality_item = QTableWidgetItem(quality_text) - # Set color based on quality (check English, Spanish, Portuguese, Russian, Chinese, German, French, Hindi, Indonesian, Turkish, and Polish terms) + # Set color based on quality (check English, Spanish, Portuguese, Russian, Chinese, German, French, Hindi, Indonesian, Turkish, Polish, and Italian terms) quality_lower = quality_text.lower() # Make comparison case-insensitive - if any(term.lower() in quality_lower for term in ["Best", "Óptima", "Mejor", "Melhor", "Лучшее", "最佳", "Beste", "Meilleure", "सर्वोत्तम", "Terbaik", "En iyi", "Najlepsza", "Najlepszy", "Najlepsze"]): + if any(term.lower() in quality_lower for term in ["Best", "Óptima", "Mejor", "Melhor", "Лучшее", "最佳", "Beste", "Meilleure", "सर्वोत्तम", "Terbaik", "En iyi", "Najlepsza", "Najlepszy", "Najlepsze", "Migliore", "Miglior"]): quality_item.setForeground(QColor("#00ff00")) # Green for best quality - elif any(term.lower() in quality_lower for term in ["High", "Alta", "Alto", "Áudio Alto", "Audio Alto", "Высокое", "高清", "高质量", "Hoch", "Haute", "Élevé", "Audio élevé", "उच्च", "उच्च ऑडियो", "Tinggi", "Audio tinggi", "Yüksek", "Yüksek ses", "Wysoka", "Wysoki", "Wysokie"]): + elif any(term.lower() in quality_lower for term in ["High", "Alta", "Alto", "Áudio Alto", "Audio Alto", "Высокое", "高清", "高质量", "Hoch", "Haute", "Élevé", "Audio élevé", "उच्च", "उच्च ऑडियो", "Tinggi", "Audio tinggi", "Yüksek", "Yüksek ses", "Wysoka", "Wysoki", "Wysokie", "Alta", "Audio alto"]): quality_item.setForeground(QColor("#00cc00")) # Light green for high quality - elif any(term.lower() in quality_lower for term in ["Medium", "Media", "Medio", "Média", "Áudio Médio", "Audio Medio", "Среднее", "中等", "Mittel", "Moyenne", "Audio moyen", "मध्यम", "मध्यम ऑडियो", "Sedang", "Audio sedang", "Orta", "Orta ses", "Średnia", "Średni", "Średnie"]): + elif any(term.lower() in quality_lower for term in ["Medium", "Media", "Medio", "Média", "Áudio Médio", "Audio Medio", "Среднее", "中等", "Mittel", "Moyenne", "Audio moyen", "मध्यम", "मध्यम ऑडियो", "Sedang", "Audio sedang", "Orta", "Orta ses", "Średnia", "Średni", "Średnie", "Media", "Audio medio"]): quality_item.setForeground(QColor("#ffaa00")) # Orange for medium quality - elif any(term.lower() in quality_lower for term in ["Low", "Baja", "Bajo", "Baixa", "Áudio Baixo", "Audio Bajo", "Низкое", "低质量", "Niedrig", "Niedriges Audio", "Faible", "Audio faible", "Qualité faible", "निम्न", "निम्न ऑडियो", "निम्न गुणवत्ता", "Rendah", "Audio rendah", "Kualitas rendah", "Düşük", "Düşük ses", "Düşük kalite", "Niska", "Niski", "Niskie"]): + elif any(term.lower() in quality_lower for term in ["Low", "Baja", "Bajo", "Baixa", "Áudio Baixo", "Audio Bajo", "Низкое", "低质量", "Niedrig", "Niedriges Audio", "Faible", "Audio faible", "Qualité faible", "निम्न", "निम्न ऑडियो", "निम्न गुणवत्ता", "Rendah", "Audio rendah", "Kualitas rendah", "Düşük", "Düşük ses", "Düşük kalite", "Niska", "Niski", "Niskie", "Bassa", "Audio basso", "Bassa qualità"]): 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 24df2ca..6b9bb1c 100644 --- a/src/utils/ytsage_localization.py +++ b/src/utils/ytsage_localization.py @@ -90,7 +90,8 @@ class LocalizationManager: "hindi": "हिन्दी (Hindi)", "indonesian": "Bahasa Indonesia (Indonesian)", "turkish": "Türkçe (Turkish)", - "polish": "Polski (Polish)" + "polish": "Polski (Polish)", + "italian": "Italiano (Italian)" }, "download": { "preparing": "🚀 Preparing your download...",