Add Italian language support and update quality labels

Introduces Italian translations by adding languages/it.json and updating all language files to include 'italian' in the language selection. Updates quality label color logic in ytsage_gui_format_table.py to recognize Italian terms for best, high, medium, and low quality. Also updates the default language list in ytsage_localization.py to include Italian.
This commit is contained in:
Your Name
2025-09-30 22:44:12 +03:00
parent 828f105c92
commit 8d0bcf60c1
14 changed files with 355 additions and 7 deletions
+1
View File
@@ -15,6 +15,7 @@
"indonesian": "Indonesisch", "indonesian": "Indonesisch",
"turkish": "Türkisch", "turkish": "Türkisch",
"polish": "Polnisch", "polish": "Polnisch",
"italian": "Italienisch",
"help_text": "Wählen Sie Ihre bevorzugte Sprache für die Benutzeroberfläche.", "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." "restart_notice": "Die Sprachänderung wird nach dem Neustart der Anwendung wirksam."
}, },
+1
View File
@@ -15,6 +15,7 @@
"indonesian": "Bahasa Indonesia (Indonesian)", "indonesian": "Bahasa Indonesia (Indonesian)",
"turkish": "Türkçe (Turkish)", "turkish": "Türkçe (Turkish)",
"polish": "Polski (Polish)", "polish": "Polski (Polish)",
"italian": "Italiano (Italian)",
"help_text": "Select your preferred language for the interface.", "help_text": "Select your preferred language for the interface.",
"restart_notice": "Language change will take effect after restarting the application." "restart_notice": "Language change will take effect after restarting the application."
}, },
+2 -1
View File
@@ -14,7 +14,8 @@
"hindi": "Hindi", "hindi": "Hindi",
"indonesian": "Indonesio", "indonesian": "Indonesio",
"turkish": "Turco", "turkish": "Turco",
"polish": "Polaco" "polish": "Polaco",
"italian": "Italiano"
}, },
"app": { "app": {
"title": "YTSage", "title": "YTSage",
+1
View File
@@ -15,6 +15,7 @@
"indonesian": "Indonésien", "indonesian": "Indonésien",
"turkish": "Turc", "turkish": "Turc",
"polish": "Polonais", "polish": "Polonais",
"italian": "Italien",
"help_text": "Sélectionnez votre langue préférée pour l'interface.", "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." "restart_notice": "Le changement de langue prendra effet après le redémarrage de l'application."
}, },
+1
View File
@@ -15,6 +15,7 @@
"indonesian": "इंडोनेशियाई", "indonesian": "इंडोनेशियाई",
"turkish": "तुर्की", "turkish": "तुर्की",
"polish": "पोलिश", "polish": "पोलिश",
"italian": "इतालवी",
"help_text": "इंटरफेस के लिए अपनी पसंदीदा भाषा चुनें।", "help_text": "इंटरफेस के लिए अपनी पसंदीदा भाषा चुनें।",
"restart_notice": "भाषा परिवर्तन एप्लिकेशन पुनरारंभ के बाद प्रभावी होगा।" "restart_notice": "भाषा परिवर्तन एप्लिकेशन पुनरारंभ के बाद प्रभावी होगा।"
}, },
+1
View File
@@ -15,6 +15,7 @@
"indonesian": "Bahasa Indonesia", "indonesian": "Bahasa Indonesia",
"turkish": "Bahasa Turki", "turkish": "Bahasa Turki",
"polish": "Bahasa Polandia", "polish": "Bahasa Polandia",
"italian": "Bahasa Italia",
"help_text": "Pilih bahasa yang diinginkan untuk antarmuka.", "help_text": "Pilih bahasa yang diinginkan untuk antarmuka.",
"restart_notice": "Perubahan bahasa akan berlaku setelah memulai ulang aplikasi." "restart_notice": "Perubahan bahasa akan berlaku setelah memulai ulang aplikasi."
}, },
+336
View File
@@ -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.<br><br>Per l'elenco completo delle opzioni ed esempi di utilizzo <a href=\"{docs_url}\">clicca qui per vedere la documentazione ufficiale yt-dlp</a>.<br><br>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..."
}
}
+1
View File
@@ -15,6 +15,7 @@
"indonesian": "Indonezyjski", "indonesian": "Indonezyjski",
"turkish": "Turecki", "turkish": "Turecki",
"polish": "Polski", "polish": "Polski",
"italian": "Włoski",
"help_text": "Wybierz preferowany język interfejsu.", "help_text": "Wybierz preferowany język interfejsu.",
"restart_notice": "Zmiana języka zostanie zastosowana po ponownym uruchomieniu aplikacji." "restart_notice": "Zmiana języka zostanie zastosowana po ponownym uruchomieniu aplikacji."
}, },
+1
View File
@@ -15,6 +15,7 @@
"indonesian": "Indonésio", "indonesian": "Indonésio",
"turkish": "Turco", "turkish": "Turco",
"polish": "Polonês", "polish": "Polonês",
"italian": "Italiano",
"help_text": "Selecione seu idioma preferido para a interface.", "help_text": "Selecione seu idioma preferido para a interface.",
"restart_notice": "A alteração de idioma terá efeito após reiniciar a aplicação." "restart_notice": "A alteração de idioma terá efeito após reiniciar a aplicação."
}, },
+1
View File
@@ -15,6 +15,7 @@
"indonesian": "Индонезийский", "indonesian": "Индонезийский",
"turkish": "Турецкий", "turkish": "Турецкий",
"polish": "Польский", "polish": "Польский",
"italian": "Итальянский",
"help_text": "Выберите предпочитаемый язык для интерфейса.", "help_text": "Выберите предпочитаемый язык для интерфейса.",
"restart_notice": "Изменение языка вступит в силу после перезапуска приложения." "restart_notice": "Изменение языка вступит в силу после перезапуска приложения."
}, },
+1
View File
@@ -15,6 +15,7 @@
"indonesian": "Endonezce", "indonesian": "Endonezce",
"turkish": "Türkçe", "turkish": "Türkçe",
"polish": "Lehçe", "polish": "Lehçe",
"italian": "İtalyanca",
"help_text": "Arayüz için tercih ettiğiniz dili seçin.", "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." "restart_notice": "Dil değişikliği uygulamayı yeniden başlattıktan sonra geçerli olacaktır."
}, },
+1
View File
@@ -15,6 +15,7 @@
"indonesian": "印尼语", "indonesian": "印尼语",
"turkish": "土耳其语", "turkish": "土耳其语",
"polish": "波兰语", "polish": "波兰语",
"italian": "意大利语",
"help_text": "选择您喜欢的界面语言。", "help_text": "选择您喜欢的界面语言。",
"restart_notice": "语言更改将在重启应用程序后生效。" "restart_notice": "语言更改将在重启应用程序后生效。"
}, },
+5 -5
View File
@@ -264,15 +264,15 @@ class FormatTableMixin:
# Column 1: Quality (Always shown) # Column 1: Quality (Always shown)
quality_text = self.get_quality_label(f) quality_text = self.get_quality_label(f)
quality_item = QTableWidgetItem(quality_text) 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 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 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 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 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 quality_item.setForeground(QColor("#ff5555")) # Red for low quality
self.format_table.setItem(row, 1, quality_item) self.format_table.setItem(row, 1, quality_item)
+2 -1
View File
@@ -90,7 +90,8 @@ class LocalizationManager:
"hindi": "हिन्दी (Hindi)", "hindi": "हिन्दी (Hindi)",
"indonesian": "Bahasa Indonesia (Indonesian)", "indonesian": "Bahasa Indonesia (Indonesian)",
"turkish": "Türkçe (Turkish)", "turkish": "Türkçe (Turkish)",
"polish": "Polski (Polish)" "polish": "Polski (Polish)",
"italian": "Italiano (Italian)"
}, },
"download": { "download": {
"preparing": "🚀 Preparing your download...", "preparing": "🚀 Preparing your download...",