Add Polish localization and update quality color mapping

Added Polish translations in a new pl.json file and updated all language files to include 'polish' in the language selection. Extended the quality color mapping in ytsage_gui_format_table.py to recognize Polish terms for best, high, medium, and low quality. Updated the default language list in ytsage_localization.py to include Polish.
This commit is contained in:
Your Name
2025-09-30 22:38:29 +03:00
parent fdbb4a6972
commit 828f105c92
13 changed files with 353 additions and 7 deletions
+1
View File
@@ -14,6 +14,7 @@
"hindi": "Hindi",
"indonesian": "Indonesisch",
"turkish": "Türkisch",
"polish": "Polnisch",
"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."
},
+1
View File
@@ -14,6 +14,7 @@
"hindi": "हिन्दी (Hindi)",
"indonesian": "Bahasa Indonesia (Indonesian)",
"turkish": "Türkçe (Turkish)",
"polish": "Polski (Polish)",
"help_text": "Select your preferred language for the interface.",
"restart_notice": "Language change will take effect after restarting the application."
},
+2 -1
View File
@@ -13,7 +13,8 @@
"french": "Français (French)",
"hindi": "Hindi",
"indonesian": "Indonesio",
"turkish": "Turco"
"turkish": "Turco",
"polish": "Polaco"
},
"app": {
"title": "YTSage",
+1
View File
@@ -14,6 +14,7 @@
"hindi": "Hindi",
"indonesian": "Indonésien",
"turkish": "Turc",
"polish": "Polonais",
"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."
},
+1
View File
@@ -14,6 +14,7 @@
"hindi": "हिन्दी",
"indonesian": "इंडोनेशियाई",
"turkish": "तुर्की",
"polish": "पोलिश",
"help_text": "इंटरफेस के लिए अपनी पसंदीदा भाषा चुनें।",
"restart_notice": "भाषा परिवर्तन एप्लिकेशन पुनरारंभ के बाद प्रभावी होगा।"
},
+1
View File
@@ -14,6 +14,7 @@
"hindi": "Bahasa Hindi",
"indonesian": "Bahasa Indonesia",
"turkish": "Bahasa Turki",
"polish": "Bahasa Polandia",
"help_text": "Pilih bahasa yang diinginkan untuk antarmuka.",
"restart_notice": "Perubahan bahasa akan berlaku setelah memulai ulang aplikasi."
},
+335
View File
@@ -0,0 +1,335 @@
{
"language": {
"display_name": "Polski (Polish)",
"select_language": "Wybierz język:",
"current_language": "Aktualny język: {language}",
"restart_required": "Zmiana języka zostanie zastosowana po ponownym uruchomieniu aplikacji.",
"english": "Angielski",
"spanish": "Hiszpański",
"portuguese": "Portugalski",
"russian": "Rosyjski",
"chinese": "Chiński",
"german": "Niemiecki",
"french": "Francuski",
"hindi": "Hindi",
"indonesian": "Indonezyjski",
"turkish": "Turecki",
"polish": "Polski",
"help_text": "Wybierz preferowany język interfejsu.",
"restart_notice": "Zmiana języka zostanie zastosowana po ponownym uruchomieniu aplikacji."
},
"app": {
"title": "YTSage",
"version": "v{version}",
"ready": "Gotowy"
},
"formats": {
"show_formats": "Pokaż formaty:",
"video_format": "Format wideo:",
"audio_format": "Format dźwięku:",
"no_formats": "Brak dostępnych formatów",
"loading": "Ładowanie formatów...",
"select": "Wybierz",
"quality": "Jakość",
"extension": "Rozszerzenie",
"resolution": "Rozdzielczość",
"file_size": "Rozmiar pliku",
"codec": "Kodek",
"audio": "Dźwięk",
"notes": "Notatki",
"will_merge_audio": "Dźwięk zostanie połączony",
"has_audio": "✓ Zawiera dźwięk",
"audio_only": "Tylko dźwięk",
"large_size": "Duży rozmiar",
"medium_size": "Średni rozmiar",
"standard_size": "Standardowy rozmiar",
"compatible": "Zgodny",
"efficient": "Wydajny",
"high_quality": "Wysoka jakość",
"best_4k": "Najlepsza (4K)",
"best_2k": "Najlepsza (2K)",
"high_1080p": "Wysoka (1080p)",
"high_720p": "Wysoka (720p)",
"medium_480p": "Średnia (480p)",
"low_quality": "Niska jakość",
"best_audio": "Najlepszy dźwięk",
"high_audio": "Wysoki dźwięk",
"medium_audio": "Średni dźwięk",
"low_audio": "Niski dźwięk",
"audio_only_resolution": "Tylko dźwięk"
},
"buttons": {
"download": "Pobierz",
"pause": "Wstrzymaj",
"resume": "Wznów",
"cancel": "Anuluj",
"browse": "Przeglądaj",
"clear": "Wyczyść",
"ok": "OK",
"apply": "Zastosuj",
"close": "Zamknij",
"run_command": "Uruchom polecenie",
"custom_command_help": "Pomoc",
"about": "O programie",
"analyze": "Analizuj",
"paste_url": "Wklej URL",
"select_videos": "Wybierz wideo...",
"video": "Wideo",
"audio_only": "Tylko dźwięk",
"custom_options": "Opcje niestandardowe",
"trim_video": "Przytnij wideo",
"download_settings": "Ustawienia pobierania",
"update": "Zaktualizuj yt-dlp",
"select_defaults": "Wybierz domyślne",
"select_all": "Zaznacz wszystko",
"deselect_all": "Odznacz wszystko"
},
"dialogs": {
"custom_options": "Opcje niestandardowe",
"settings": "Ustawienia",
"select_folder": "Wybierz folder pobierania",
"sponsorblock_categories": "Kategorie SponsorBlock",
"sponsorblock_description": "Wybierz typy segmentów wideo do automatycznego usunięcia podczas pobierania.\nSponsorBlock używa danych przesyłanych przez społeczność do identyfikacji tych segmentów.",
"select_subtitles": "Wybierz napisy",
"filter_languages_placeholder": "Filtruj języki (np: pl, en)...",
"no_subtitles_available": "Brak dostępnych napisów",
"matching": "dopasowujące"
},
"tabs": {
"cookies": "Zaloguj za pomocą ciasteczek",
"custom_command": "Polecenie niestandardowe",
"proxy": "Proxy",
"language": "Język"
},
"cookies": {
"help_text": "Wybierz sposób dostarczania ciasteczek do uwierzytelniania.\nUmożliwia to pobieranie prywatnych filmów i wysokiej jakości plików audio.",
"cookie_source": "Źródło ciasteczek",
"use_cookie_file": "Użyj pliku ciasteczek",
"extract_from_browser": "Wyodrębnij z przeglądarki",
"cookie_file": "Plik ciasteczek",
"cookie_file_placeholder": "Ścieżka do pliku cookies.txt...",
"browser_selection": "Wybór przeglądarki",
"browser_help": "Wybierz przeglądarkę do wyodrębnienia ciasteczek:",
"browser_label": "Przeglądarka:",
"profile_label": "Profil:",
"profile_placeholder": "Domyślny",
"browser_extract_message": "Ciasteczka przeglądarki zostaną wyodrębnione po zastosowaniu",
"file_selected_message": "Wybrano plik ciasteczek - Kliknij OK, aby zastosować",
"select_file_title": "Wybierz plik ciasteczek",
"file_filter": "Pliki ciasteczek (*.txt *.lwp)"
},
"custom_command": {
"help_text": "Wprowadź niestandardowe polecenie yt-dlp poniżej. Aktualny URL zostanie automatycznie dodany.<br><br>Aby uzyskać pełną listę opcji i przykładów użycia <a href=\"{docs_url}\">kliknij tutaj, aby zobaczyć oficjalną dokumentację yt-dlp</a>.<br><br>Uwaga: Ścieżka pobierania i szablon nazwy pliku są obsługiwane automatycznie.",
"input_label": "Argumenty yt-dlp:",
"input_placeholder": "Wprowadź argumenty yt-dlp tutaj...\n\nPrzykład: --extract-audio --audio-format mp3",
"output_label": "Wynik polecenia:",
"output_placeholder": "Wynik polecenia pojawi się tutaj...",
"command_placeholder": "Wprowadź niestandardowe polecenie yt-dlp...",
"command_help": "Dostępne placeholdery:\n{url} - URL wideo\n{output} - Folder wyjściowy\n\nPrzykład: --write-info-json --write-thumbnail",
"full_command": "🔧 Pełne polecenie: {command}",
"command_success": "✅ Polecenie niestandardowe wykonane pomyślnie!",
"command_failed": "❌ Polecenie nie powiodło się z kodem wyjścia {code}",
"command_error": "❌ Błąd wykonywania polecenia niestandardowego: {error}"
},
"proxy": {
"help_text": "Skonfiguruj ustawienia proxy dla pobierania. Pozostaw puste dla bezpośredniego połączenia.",
"main_proxy": "Główny proxy",
"main_proxy_help": "Główny serwer proxy dla wszystkich pobierań. Obsługuje protokoły HTTP/HTTPS i SOCKS5.",
"proxy_url_label": "URL Proxy:",
"proxy_url_placeholder": "http://proxy:port lub socks5://proxy:port",
"proxy_examples": "Przykłady:\n• HTTP: http://proxy.example.com:8080\n• SOCKS5: socks5://proxy.example.com:1080",
"geo_proxy": "Proxy omijania geograficznego",
"geo_proxy_help": "Dodatkowy proxy specjalnie do omijania ograniczeń geograficznych.",
"geo_proxy_url_label": "URL proxy omijania geograficznego:",
"geo_proxy_url_placeholder": "http://geo-proxy:port",
"clear_main_proxy": "Wyczyść główny proxy",
"clear_geo_proxy": "Wyczyść proxy geograficzny",
"proxy_url": "URL Proxy",
"proxy_placeholder": "http://proxy:port lub socks5://proxy:port",
"geo_bypass": "Proxy omijania geograficznego (dla ograniczeń geograficznych)",
"geo_bypass_placeholder": "http://proxy:port do omijania geo-blokowania",
"invalid_main_url": "Nieprawidłowy format URL głównego proxy",
"invalid_geo_url": "Nieprawidłowy format URL proxy geograficznego",
"main_configured": "Główny proxy skonfigurowany",
"geo_configured": "Proxy geograficzny skonfigurowany"
},
"download": {
"preparing": "Przygotowywanie pobierania...",
"please_enter_url": "Proszę najpierw wprowadzić URL.",
"please_set_path": "Proszę najpierw ustawić ścieżkę pobierania.",
"please_enter_url_and_path": "Proszę wprowadzić URL i ustawić ścieżkę pobierania.",
"please_select_format": "Proszę najpierw wybrać format."
},
"update": {
"title": "Zaktualizuj yt-dlp",
"checking": "Sprawdzanie aktualizacji...",
"update_available": "Dostępna aktualizacja!\nAktualna wersja: {current}\nNajnowsza wersja: {latest}",
"up_to_date": "yt-dlp jest aktualny (Wersja {version})",
"could_not_determine": "Nie można określić wersji.",
"error_comparing": "Błąd porównywania wersji: {error}",
"update_available_failed": "Dostępna aktualizacja! (Porównanie nie powiodło się)\nAktualna: {current}\nNajnowsza: {latest}",
"updating": "Aktualizowanie...",
"initializing": "🚀 Inicjalizacja procesu aktualizacji...",
"checking_current": "🔍 Sprawdzanie aktualnej instalacji...",
"found_at": "📍 yt-dlp znaleziony w: {path}",
"error_getting_path": "❌ Błąd pobierania ścieżki yt-dlp: {error}",
"updating_binary": "📦 Aktualizowanie binarki yt-dlp zarządzanej przez aplikację...",
"updating_pip": "🐍 Aktualizowanie systemowego yt-dlp przez pip...",
"update_failed": "❌ Aktualizacja yt-dlp nie powiodła się. Spróbuj ponownie lub sprawdź połączenie internetowe.",
"binary_updated": "✅ Binarka została pomyślnie zaktualizowana!",
"update_failed_stderr": "❌ Aktualizacja yt-dlp nie powiodła się: {error}",
"update_timeout": "❌ Limit czasu aktualizacji yt-dlp.",
"unexpected_error": "❌ Nieoczekiwany błąd podczas aktualizacji: {error}",
"checking_pip": "🔍 Sprawdzanie aktualnej instalacji pip...",
"current_version": "📋 Aktualna wersja: {version}",
"not_found_pip": "⚠️ yt-dlp nie znaleziony przez pip, próba instalacji...",
"checking_latest": "🌐 Sprawdzanie najnowszej wersji...",
"failed_check_updates": "❌ Sprawdzanie aktualizacji nie powiodło się",
"latest_version": "🆕 Najnowsza wersja: {version}",
"updating_from_to": "⬆️ Aktualizacja z {current} do {latest}...",
"running_pip_install": "📦 Uruchamianie pip install --upgrade...",
"pip_completed": "✅ Aktualizacja pip zakończona pomyślnie!",
"pip_failed": "❌ Aktualizacja pip nie powiodła się: {error}"
},
"about": {
"title": "O YTSage",
"version": "Wersja {version}",
"description": "Nowoczesny pobieracz YouTube z czystym interfejsem PySide6.",
"author": "Autor: {author}",
"github": "GitHub: {repo}",
"system_info": "Informacje systemowe",
"loading": "🔄 Ładowanie informacji systemowych...",
"refresh": "🔄",
"refreshing": "🔄 Odświeżanie...",
"refresh_failed": "Odświeżanie nie powiodło się",
"refresh_failed_message": "Nie można odświeżyć informacji o wersji.",
"detected": "✓ Wykryto",
"missing": "✗ Brakuje",
"not_available": "Niedostępne"
},
"time_range": {
"title": "Przytnij wideo",
"time_range_group": "Zakres czasu",
"start_time": "Czas rozpoczęcia (GG:MM:SS)",
"end_time": "Czas zakończenia (GG:MM:SS)",
"start_placeholder": "00:00:00",
"end_placeholder": "00:00:00",
"start_time_placeholder": "Czas rozpoczęcia (GG:MM:SS)",
"end_time_placeholder": "Czas zakończenia (GG:MM:SS)",
"force_keyframes": "Wymuś klatki kluczowe w punktach cięcia",
"help_text": "Ustaw czasy rozpoczęcia i zakończenia, aby przyciąć wideo.\nPozostaw puste, aby pobrać pełne wideo.",
"invalid_format": "Nieprawidłowy format czasu. Użyj formatu GG:MM:SS.",
"start_after_end": "Czas rozpoczęcia nie może być po czasie zakończenia."
},
"settings": {
"title": "Ustawienia pobierania",
"download_path": "Ścieżka pobierania",
"browse": "Przeglądaj...",
"speed_limit": "Limit prędkości",
"speed_limit_placeholder": "Brak",
"auto_update_ytdlp": "Automatyczne aktualizacje yt-dlp",
"enable_auto_updates": "Włącz automatyczne aktualizacje yt-dlp",
"update_frequency": "Częstotliwość aktualizacji:",
"check_startup": "Sprawdzaj przy każdym uruchomieniu (minimum 1 godzina między sprawdzeniami)",
"check_daily": "Sprawdzaj codziennie",
"check_weekly": "Sprawdzaj co tydzień",
"check_updates_now": "Sprawdź aktualizacje teraz",
"update_check_title": "Sprawdzanie aktualizacji",
"could_not_determine_version": "Nie można określić aktualnej wersji yt-dlp.",
"update_available_dialog": "Dostępna aktualizacja!\n\nAktualna: {current}\nNajnowsza: {latest}\n\nUżyj przycisku 'Zaktualizuj yt-dlp' w głównym oknie, aby zaktualizować.",
"up_to_date_dialog": "yt-dlp jest aktualny!\n\nAktualna wersja: {version}",
"error_checking_updates": "Błąd sprawdzania aktualizacji: {error}",
"settings_saved_title": "Ustawienia zapisane",
"settings_saved_message": "Ustawienia automatycznych aktualizacji zostały pomyślnie zapisane!",
"error_title": "Błąd",
"failed_save_settings": "Nie udało się zapisać ustawień automatycznych aktualizacji.",
"error_saving_settings": "Błąd zapisywania ustawień automatycznych aktualizacji: {error}",
"auto_update_title": "Ustawienia automatycznych aktualizacji",
"auto_update_header": "🔄 Ustawienia automatycznych aktualizacji",
"auto_update_description": "Skonfiguruj automatyczne aktualizacje dla yt-dlp, aby zapewnić najnowsze funkcje i poprawki błędów.",
"current_status": "Aktualny status",
"current_version_label": "Aktualna wersja yt-dlp: Sprawdzanie...",
"last_check_label": "Ostatnie sprawdzenie aktualizacji: Nigdy",
"next_check_label": "Następne sprawdzenie: Na podstawie ustawień",
"manual_check_button": "🔍 Sprawdź aktualizacje teraz",
"update_frequency_group": "Częstotliwość aktualizacji",
"save_settings": "Zapisz ustawienia",
"settings_saved_successfully": "✅ Ustawienia zapisane pomyślnie!",
"error_saving": "❌ Błąd zapisywania ustawień: {error}"
},
"main_ui": {
"url_placeholder": "Wprowadź URL wideo YouTube lub playlisty",
"merge_subtitles": "Połącz napisy",
"save_thumbnail": "Zapisz miniaturę",
"save_description": "Zapisz opis",
"embed_chapters": "Osadź rozdziały",
"subtitles_selected": "{count} wybrano",
"all_selected": "Wszystkie wybrane",
"select_videos_all": "Wybierz wideo... (Wszystkie wybrane)",
"please_enter_url": "Proszę najpierw wprowadzić URL",
"cookie_file_selected_title": "Wybrano plik ciasteczek",
"cookie_file_selected_message": "Wybrano plik ciasteczek: {path}",
"browser_cookies_selected_title": "Wybrano ciasteczka przeglądarki",
"browser_cookies_selected_message": "Ciasteczka przeglądarki zostaną wyodrębnione z: {browser}",
"error_no_format_info": "Błąd: Brak dostępnych informacji o formacie.",
"error_extract_info": "Błąd: Nie można wyodrębnić podstawowych informacji o wideo. Sprawdź swój link.",
"analyzing_preparing": "Analizowanie (0%)... Przygotowywanie żądania",
"analyzing_extracting_basic": "Analizowanie (15%)... Wyodrębnianie podstawowych informacji",
"analyzing_extracting_detailed": "Analizowanie (30%)... Wyodrębnianie szczegółowych informacji",
"analyzing_processing_video": "Analizowanie (45%)... Przetwarzanie danych wideo",
"analyzing_processing_formats": "Analizowanie (60%)... Przetwarzanie formatów",
"analyzing_loading_thumbnail": "Analizowanie (75%)... Ładowanie miniatury",
"analyzing_processing_subtitles": "Analizowanie (85%)... Przetwarzanie napisów",
"analyzing_updating_table": "Analizowanie (95%)... Aktualizowanie tabeli formatów",
"analysis_complete": "Analiza zakończona!",
"analyzing_extracting_ytdlp": "Analizowanie (30%)... Wyodrębnianie informacji za pomocą pliku wykonywalnego yt-dlp",
"analyzing_processing_data": "Analizowanie (60%)... Przetwarzanie danych",
"analyzing_processing_formats_ytdlp": "Analizowanie (75%)... Przetwarzanie formatów",
"analyzing_loading_thumbnail_ytdlp": "Analizowanie (85%)... Ładowanie miniatury",
"analyzing_processing_subtitles_ytdlp": "Analizowanie (90%)... Przetwarzanie napisów",
"select_subtitles": "Wybierz napisy...",
"sponsorblock_categories": "Kategorie SponsorBlock..."
},
"sponsorblock": {
"sponsor": "Sponsor",
"sponsor_desc": "Płatne reklamy, płatne rekomendacje i bezpośrednie reklamy",
"selfpromo": "Nieobłożona/Samopromocja",
"selfpromo_desc": "Nieobłożona promocja własnych treści twórcy",
"interaction": "Przypomnienie o interakcji",
"interaction_desc": "Widzowie są proszeni o polubienie, subskrypcję lub śledzenie w mediach społecznościowych",
"intro": "Intro",
"intro_desc": "Wprowadzenie do wideo, które można pominąć",
"outro": "Outro/Karty końcowe",
"outro_desc": "Napisy końcowe lub gdy wideo się kończy",
"preview": "Podgląd/Podsumowanie",
"preview_desc": "Krótkie podsumowanie poprzednich wideo lub podgląd nadchodzącej treści",
"music_offtopic": "Sekcja niemuzyczna",
"music_offtopic_desc": "Tylko dla wideo muzycznych. Oznacza sekcje niemuzyczne",
"filler": "Wypełniacz poboczny",
"filler_desc": "Sceny poboczne dodane tylko jako wypełniacz lub dla humoru"
},
"video_info": {
"channel": "Kanał",
"views": "Wyświetlenia",
"likes": "Polubienia",
"upload_date": "Data przesłania",
"duration": "Czas trwania",
"unknown_channel": "Nieznany kanał",
"unknown_date": "Nieznana data",
"unknown_title": "Nieznany tytuł"
},
"command": {
"running": "Uruchamianie...",
"run_command": "Uruchom polecenie"
},
"selection": {
"none_selected": "0 wybrano",
"one_selected": "1 kategoria wybrana",
"count_selected": "{count} wybrano"
},
"status": {
"ready": "Gotowy",
"file_exists": "⚠️ Plik już istnieje",
"cancelling": "Anulowanie pobierania..."
}
}
+1
View File
@@ -14,6 +14,7 @@
"hindi": "Hindi",
"indonesian": "Indonésio",
"turkish": "Turco",
"polish": "Polonês",
"help_text": "Selecione seu idioma preferido para a interface.",
"restart_notice": "A alteração de idioma terá efeito após reiniciar a aplicação."
},
+1
View File
@@ -14,6 +14,7 @@
"hindi": "Хинди",
"indonesian": "Индонезийский",
"turkish": "Турецкий",
"polish": "Польский",
"help_text": "Выберите предпочитаемый язык для интерфейса.",
"restart_notice": "Изменение языка вступит в силу после перезапуска приложения."
},
+1
View File
@@ -14,6 +14,7 @@
"hindi": "Hintçe",
"indonesian": "Endonezce",
"turkish": "Türkçe",
"polish": "Lehçe",
"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."
},
+1
View File
@@ -14,6 +14,7 @@
"hindi": "印地语",
"indonesian": "印尼语",
"turkish": "土耳其语",
"polish": "波兰语",
"help_text": "选择您喜欢的界面语言。",
"restart_notice": "语言更改将在重启应用程序后生效。"
},
+5 -5
View File
@@ -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, and French terms)
# Set color based on quality (check English, Spanish, Portuguese, Russian, Chinese, German, French, Hindi, Indonesian, Turkish, and Polish 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"]):
if any(term.lower() in quality_lower for term in ["Best", "Óptima", "Mejor", "Melhor", "Лучшее", "最佳", "Beste", "Meilleure", "सर्वोत्तम", "Terbaik", "En iyi", "Najlepsza", "Najlepszy", "Najlepsze"]):
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"]):
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"]):
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"]):
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"]):
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"]):
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"]):
quality_item.setForeground(QColor("#ff5555")) # Red for low quality
self.format_table.setItem(row, 1, quality_item)
+2 -1
View File
@@ -89,7 +89,8 @@ class LocalizationManager:
"french": "Français (French)",
"hindi": "हिन्दी (Hindi)",
"indonesian": "Bahasa Indonesia (Indonesian)",
"turkish": "Türkçe (Turkish)"
"turkish": "Türkçe (Turkish)",
"polish": "Polski (Polish)"
},
"download": {
"preparing": "🚀 Preparing your download...",