diff --git a/languages/de.json b/languages/de.json index cd5afd5..20ba41e 100644 --- a/languages/de.json +++ b/languages/de.json @@ -13,6 +13,7 @@ "french": "Französisch", "hindi": "Hindi", "indonesian": "Indonesisch", + "turkish": "Türkisch", "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 6afc55d..079a9b1 100644 --- a/languages/en.json +++ b/languages/en.json @@ -13,6 +13,7 @@ "french": "Français (French)", "hindi": "हिन्दी (Hindi)", "indonesian": "Bahasa Indonesia (Indonesian)", + "turkish": "Türkçe (Turkish)", "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 f946981..8b6a406 100644 --- a/languages/es.json +++ b/languages/es.json @@ -12,7 +12,8 @@ "german": "Deutsch (German)", "french": "Français (French)", "hindi": "Hindi", - "indonesian": "Indonesio" + "indonesian": "Indonesio", + "turkish": "Turco" }, "app": { "title": "YTSage", diff --git a/languages/fr.json b/languages/fr.json index 7cb1d51..5bc33b4 100644 --- a/languages/fr.json +++ b/languages/fr.json @@ -13,6 +13,7 @@ "french": "Français", "hindi": "Hindi", "indonesian": "Indonésien", + "turkish": "Turc", "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 24b08b5..13d9abe 100644 --- a/languages/hi.json +++ b/languages/hi.json @@ -13,6 +13,7 @@ "french": "फ्रेंच", "hindi": "हिन्दी", "indonesian": "इंडोनेशियाई", + "turkish": "तुर्की", "help_text": "इंटरफेस के लिए अपनी पसंदीदा भाषा चुनें।", "restart_notice": "भाषा परिवर्तन एप्लिकेशन पुनरारंभ के बाद प्रभावी होगा।" }, diff --git a/languages/id.json b/languages/id.json index 2346e5b..d450e2f 100644 --- a/languages/id.json +++ b/languages/id.json @@ -13,6 +13,7 @@ "french": "Bahasa Prancis", "hindi": "Bahasa Hindi", "indonesian": "Bahasa Indonesia", + "turkish": "Bahasa Turki", "help_text": "Pilih bahasa yang diinginkan untuk antarmuka.", "restart_notice": "Perubahan bahasa akan berlaku setelah memulai ulang aplikasi." }, diff --git a/languages/pt.json b/languages/pt.json index f543a70..44d7b17 100644 --- a/languages/pt.json +++ b/languages/pt.json @@ -13,6 +13,7 @@ "french": "Francês", "hindi": "Hindi", "indonesian": "Indonésio", + "turkish": "Turco", "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 a7957d2..60cb2c7 100644 --- a/languages/ru.json +++ b/languages/ru.json @@ -13,6 +13,7 @@ "french": "Французский", "hindi": "Хинди", "indonesian": "Индонезийский", + "turkish": "Турецкий", "help_text": "Выберите предпочитаемый язык для интерфейса.", "restart_notice": "Изменение языка вступит в силу после перезапуска приложения." }, diff --git a/languages/tr.json b/languages/tr.json new file mode 100644 index 0000000..de30198 --- /dev/null +++ b/languages/tr.json @@ -0,0 +1,334 @@ +{ + "language": { + "display_name": "Türkçe (Turkish)", + "select_language": "Dil Seç:", + "current_language": "Mevcut dil: {language}", + "restart_required": "Dil değişikliği uygulamayı yeniden başlattıktan sonra geçerli olacaktır.", + "english": "İngilizce", + "spanish": "İspanyolca", + "portuguese": "Portekizce", + "russian": "Rusça", + "chinese": "Çince", + "german": "Almanca", + "french": "Fransızca", + "hindi": "Hintçe", + "indonesian": "Endonezce", + "turkish": "Türkç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." + }, + "app": { + "title": "YTSage", + "version": "v{version}", + "ready": "Hazır" + }, + "formats": { + "show_formats": "Formatları göster:", + "video_format": "Video formatı:", + "audio_format": "Ses formatı:", + "no_formats": "Kullanılabilir format yok", + "loading": "Formatlar yükleniyor...", + "select": "Seç", + "quality": "Kalite", + "extension": "Uzantı", + "resolution": "Çözünürlük", + "file_size": "Dosya boyutu", + "codec": "Codec", + "audio": "Ses", + "notes": "Notlar", + "will_merge_audio": "Ses birleştirilecek", + "has_audio": "✓ Ses var", + "audio_only": "Sadece ses", + "large_size": "Büyük boyut", + "medium_size": "Orta boyut", + "standard_size": "Standart boyut", + "compatible": "Uyumlu", + "efficient": "Verimli", + "high_quality": "Yüksek kalite", + "best_4k": "En iyi (4K)", + "best_2k": "En iyi (2K)", + "high_1080p": "Yüksek (1080p)", + "high_720p": "Yüksek (720p)", + "medium_480p": "Orta (480p)", + "low_quality": "Düşük kalite", + "best_audio": "En iyi ses", + "high_audio": "Yüksek ses", + "medium_audio": "Orta ses", + "low_audio": "Düşük ses", + "audio_only_resolution": "Sadece ses" + }, + "buttons": { + "download": "İndir", + "pause": "Duraklat", + "resume": "Devam Et", + "cancel": "İptal", + "browse": "Gözat", + "clear": "Temizle", + "ok": "Tamam", + "apply": "Uygula", + "close": "Kapat", + "run_command": "Komutu çalıştır", + "custom_command_help": "Yardım", + "about": "Hakkında", + "analyze": "Analiz Et", + "paste_url": "URL Yapıştır", + "select_videos": "Video seç...", + "video": "Video", + "audio_only": "Sadece ses", + "custom_options": "Özel seçenekler", + "trim_video": "Videoyu kırp", + "download_settings": "İndirme ayarları", + "update": "yt-dlp'yi güncelle", + "select_defaults": "Varsayılanları seç", + "select_all": "Tümünü seç", + "deselect_all": "Tüm seçimi kaldır" + }, + "dialogs": { + "custom_options": "Özel seçenekler", + "settings": "Ayarlar", + "select_folder": "İndirme klasörünü seç", + "sponsorblock_categories": "SponsorBlock kategorileri", + "sponsorblock_description": "İndirme sırasında otomatik olarak kaldırılacak video bölümlerinin türlerini seçin.\nSponsorBlock bu bölümleri belirlemek için topluluk tarafından gönderilen verileri kullanır.", + "select_subtitles": "Altyazı seç", + "filter_languages_placeholder": "Dilleri filtrele (örn: tr, en)...", + "no_subtitles_available": "Altyazı mevcut değil", + "matching": "eşleşen" + }, + "tabs": { + "cookies": "Çerezlerle giriş yap", + "custom_command": "Özel komut", + "proxy": "Proxy", + "language": "Dil" + }, + "cookies": { + "help_text": "Kimlik doğrulama için çerezlerin nasıl sağlanacağını seçin.\nBu, özel videoları ve yüksek kaliteli ses dosyalarını indirmeyi sağlar.", + "cookie_source": "Çerez kaynağı", + "use_cookie_file": "Çerez dosyası kullan", + "extract_from_browser": "Tarayıcıdan çıkar", + "cookie_file": "Çerez dosyası", + "cookie_file_placeholder": "cookies.txt dosya yolu...", + "browser_selection": "Tarayıcı seçimi", + "browser_help": "Çerezleri çıkaracak tarayıcıyı seçin:", + "browser_label": "Tarayıcı:", + "profile_label": "Profil:", + "profile_placeholder": "Varsayılan", + "browser_extract_message": "Tarayıcı çerezleri uygulandığında çıkarılacak", + "file_selected_message": "Çerez dosyası seçildi - Uygulamak için Tamam'a tıklayın", + "select_file_title": "Çerez dosyası seç", + "file_filter": "Çerez dosyaları (*.txt *.lwp)" + }, + "custom_command": { + "help_text": "Özel yt-dlp komutunuzu aşağıya girin. Mevcut URL otomatik olarak eklenecektir.

Seçeneklerin tam listesi ve kullanım örnekleri için resmi yt-dlp belgelerini görmek için buraya tıklayın.

Not: İndirme yolu ve dosya adı şablonu otomatik olarak işlenir.", + "input_label": "yt-dlp argümanları:", + "input_placeholder": "yt-dlp argümanlarını buraya girin...\n\nÖrnek: --extract-audio --audio-format mp3", + "output_label": "Komut çıktısı:", + "output_placeholder": "Komut çıktısı burada görünecek...", + "command_placeholder": "Özel yt-dlp komutunu girin...", + "command_help": "Mevcut yer tutucular:\n{url} - Video URL'si\n{output} - Çıktı klasörü\n\nÖrnek: --write-info-json --write-thumbnail", + "full_command": "🔧 Tam komut: {command}", + "command_success": "✅ Özel komut başarıyla çalıştırıldı!", + "command_failed": "❌ Komut {code} çıkış koduyla başarısız oldu", + "command_error": "❌ Özel komut çalıştırma hatası: {error}" + }, + "proxy": { + "help_text": "İndirmeler için proxy ayarlarını yapılandırın. Doğrudan bağlantı için boş bırakın.", + "main_proxy": "Ana proxy", + "main_proxy_help": "Tüm indirmeler için birincil proxy sunucusu. HTTP/HTTPS ve SOCKS5 protokollerini destekler.", + "proxy_url_label": "Proxy URL:", + "proxy_url_placeholder": "http://proxy:port veya socks5://proxy:port", + "proxy_examples": "Örnekler:\n• HTTP: http://proxy.example.com:8080\n• SOCKS5: socks5://proxy.example.com:1080", + "geo_proxy": "Coğrafi atlama proxy'si", + "geo_proxy_help": "Coğrafi kısıtlamaları atlamak için ikincil proxy.", + "geo_proxy_url_label": "Coğrafi atlama proxy URL'si:", + "geo_proxy_url_placeholder": "http://geo-proxy:port", + "clear_main_proxy": "Ana proxy'yi temizle", + "clear_geo_proxy": "Coğrafi proxy'yi temizle", + "proxy_url": "Proxy URL", + "proxy_placeholder": "http://proxy:port veya socks5://proxy:port", + "geo_bypass": "Coğrafi atlama proxy'si (coğrafi kısıtlamalar için)", + "geo_bypass_placeholder": "http://proxy:port coğrafi engellemeyi atlamak için", + "invalid_main_url": "Geçersiz ana proxy URL formatı", + "invalid_geo_url": "Geçersiz coğrafi proxy URL formatı", + "main_configured": "Ana proxy yapılandırıldı", + "geo_configured": "Coğrafi proxy yapılandırıldı" + }, + "download": { + "preparing": "İndirme hazırlanıyor...", + "please_enter_url": "Lütfen önce bir URL girin.", + "please_set_path": "Lütfen önce indirme yolunu ayarlayın.", + "please_enter_url_and_path": "Lütfen bir URL girin ve indirme yolunu ayarlayın.", + "please_select_format": "Lütfen önce bir format seçin." + }, + "update": { + "title": "yt-dlp'yi güncelle", + "checking": "Güncellemeler kontrol ediliyor...", + "update_available": "Güncelleme mevcut!\nMevcut sürüm: {current}\nEn son sürüm: {latest}", + "up_to_date": "yt-dlp güncel (Sürüm {version})", + "could_not_determine": "Sürümler belirlenemedi.", + "error_comparing": "Sürüm karşılaştırma hatası: {error}", + "update_available_failed": "Güncelleme mevcut! (Karşılaştırma başarısız)\nMevcut: {current}\nEn son: {latest}", + "updating": "Güncelleniyor...", + "initializing": "🚀 Güncelleme işlemi başlatılıyor...", + "checking_current": "🔍 Mevcut kurulum kontrol ediliyor...", + "found_at": "📍 yt-dlp bulundu: {path}", + "error_getting_path": "❌ yt-dlp yolu alma hatası: {error}", + "updating_binary": "📦 Uygulama yönetimli yt-dlp binary'si güncelleniyor...", + "updating_pip": "🐍 pip aracılığıyla sistem yt-dlp'si güncelleniyor...", + "update_failed": "❌ yt-dlp güncellemesi başarısız. Lütfen tekrar deneyin veya internet bağlantınızı kontrol edin.", + "binary_updated": "✅ Binary başarıyla güncellendi!", + "update_failed_stderr": "❌ yt-dlp güncellemesi başarısız: {error}", + "update_timeout": "❌ yt-dlp güncelleme zaman aşımı.", + "unexpected_error": "❌ Güncelleme sırasında beklenmeyen hata: {error}", + "checking_pip": "🔍 Mevcut pip kurulumu kontrol ediliyor...", + "current_version": "📋 Mevcut sürüm: {version}", + "not_found_pip": "⚠️ yt-dlp pip aracılığıyla bulunamadı, kurulum deneniyor...", + "checking_latest": "🌐 En son sürüm kontrol ediliyor...", + "failed_check_updates": "❌ Güncelleme kontrolü başarısız", + "latest_version": "🆕 En son sürüm: {version}", + "updating_from_to": "⬆️ {current}'den {latest}'e güncelleniyor...", + "running_pip_install": "📦 pip install --upgrade çalıştırılıyor...", + "pip_completed": "✅ Pip güncellemesi başarıyla tamamlandı!", + "pip_failed": "❌ Pip güncellemesi başarısız: {error}" + }, + "about": { + "title": "YTSage Hakkında", + "version": "Sürüm {version}", + "description": "Temiz PySide6 arayüzü ile modern YouTube indiricisi.", + "author": "Yapımcı: {author}", + "github": "GitHub: {repo}", + "system_info": "Sistem bilgileri", + "loading": "🔄 Sistem bilgileri yükleniyor...", + "refresh": "🔄", + "refreshing": "🔄 Yenileniyor...", + "refresh_failed": "Yenileme başarısız", + "refresh_failed_message": "Sürüm bilgileri yenilenemedi.", + "detected": "✓ Algılandı", + "missing": "✗ Eksik", + "not_available": "Mevcut değil" + }, + "time_range": { + "title": "Videoyu kırp", + "time_range_group": "Zaman aralığı", + "start_time": "Başlama zamanı (SS:DD:SS)", + "end_time": "Bitiş zamanı (SS:DD:SS)", + "start_placeholder": "00:00:00", + "end_placeholder": "00:00:00", + "start_time_placeholder": "Başlama zamanı (SS:DD:SS)", + "end_time_placeholder": "Bitiş zamanı (SS:DD:SS)", + "force_keyframes": "Kesim noktalarında anahtar kareleri zorla", + "help_text": "Videoyu kırpmak için başlama ve bitiş zamanlarını ayarlayın.\nTam videoyu indirmek için boş bırakın.", + "invalid_format": "Geçersiz zaman formatı. SS:DD:SS formatını kullanın.", + "start_after_end": "Başlama zamanı bitiş zamanından sonra olamaz." + }, + "settings": { + "title": "İndirme ayarları", + "download_path": "İndirme yolu", + "browse": "Gözat...", + "speed_limit": "Hız sınırı", + "speed_limit_placeholder": "Yok", + "auto_update_ytdlp": "yt-dlp otomatik güncelleme", + "enable_auto_updates": "yt-dlp otomatik güncellemelerini etkinleştir", + "update_frequency": "Güncelleme sıklığı:", + "check_startup": "Her başlangıçta kontrol et (kontroller arası en az 1 saat)", + "check_daily": "Günlük kontrol et", + "check_weekly": "Haftalık kontrol et", + "check_updates_now": "Şimdi güncellemeleri kontrol et", + "update_check_title": "Güncelleme kontrolü", + "could_not_determine_version": "Mevcut yt-dlp sürümü belirlenemedi.", + "update_available_dialog": "Güncelleme mevcut!\n\nMevcut: {current}\nEn son: {latest}\n\nGüncellemek için ana penceredeki 'yt-dlp'yi güncelle' düğmesini kullanın.", + "up_to_date_dialog": "yt-dlp güncel!\n\nMevcut sürüm: {version}", + "error_checking_updates": "Güncelleme kontrol hatası: {error}", + "settings_saved_title": "Ayarlar kaydedildi", + "settings_saved_message": "Otomatik güncelleme ayarları başarıyla kaydedildi!", + "error_title": "Hata", + "failed_save_settings": "Otomatik güncelleme ayarları kaydedilemedi.", + "error_saving_settings": "Otomatik güncelleme ayarları kaydetme hatası: {error}", + "auto_update_title": "Otomatik güncelleme ayarları", + "auto_update_header": "🔄 Otomatik güncelleme ayarları", + "auto_update_description": "En son özelliklere ve hata düzeltmelerine sahip olmak için yt-dlp otomatik güncellemelerini yapılandırın.", + "current_status": "Mevcut durum", + "current_version_label": "Mevcut yt-dlp sürümü: Kontrol ediliyor...", + "last_check_label": "Son güncelleme kontrolü: Hiç", + "next_check_label": "Sonraki kontrol: Ayarlara göre", + "manual_check_button": "🔍 Şimdi güncellemeleri kontrol et", + "update_frequency_group": "Güncelleme sıklığı", + "save_settings": "Ayarları kaydet", + "settings_saved_successfully": "✅ Ayarlar başarıyla kaydedildi!", + "error_saving": "❌ Ayarları kaydetme hatası: {error}" + }, + "main_ui": { + "url_placeholder": "YouTube video veya oynatma listesi URL'sini girin", + "merge_subtitles": "Altyazıları birleştir", + "save_thumbnail": "Küçük resmi kaydet", + "save_description": "Açıklamayı kaydet", + "embed_chapters": "Bölümleri göm", + "subtitles_selected": "{count} seçildi", + "all_selected": "Tümü seçildi", + "select_videos_all": "Video seç... (Tümü seçildi)", + "please_enter_url": "Lütfen önce bir URL girin", + "cookie_file_selected_title": "Çerez dosyası seçildi", + "cookie_file_selected_message": "Çerez dosyası seçildi: {path}", + "browser_cookies_selected_title": "Tarayıcı çerezleri seçildi", + "browser_cookies_selected_message": "Tarayıcı çerezleri şuradan çıkarılacak: {browser}", + "error_no_format_info": "Hata: Format bilgisi mevcut değil.", + "error_extract_info": "Hata: Temel video bilgileri çıkarılamadı. Lütfen bağlantınızı kontrol edin.", + "analyzing_preparing": "Analiz ediliyor (0%)... İstek hazırlanıyor", + "analyzing_extracting_basic": "Analiz ediliyor (15%)... Temel bilgiler çıkarılıyor", + "analyzing_extracting_detailed": "Analiz ediliyor (30%)... Ayrıntılı bilgiler çıkarılıyor", + "analyzing_processing_video": "Analiz ediliyor (45%)... Video verisi işleniyor", + "analyzing_processing_formats": "Analiz ediliyor (60%)... Formatlar işleniyor", + "analyzing_loading_thumbnail": "Analiz ediliyor (75%)... Küçük resim yükleniyor", + "analyzing_processing_subtitles": "Analiz ediliyor (85%)... Altyazılar işleniyor", + "analyzing_updating_table": "Analiz ediliyor (95%)... Format tablosu güncelleniyor", + "analysis_complete": "Analiz tamamlandı!", + "analyzing_extracting_ytdlp": "Analiz ediliyor (30%)... yt-dlp çalıştırılabiliri ile bilgiler çıkarılıyor", + "analyzing_processing_data": "Analiz ediliyor (60%)... Veriler işleniyor", + "analyzing_processing_formats_ytdlp": "Analiz ediliyor (75%)... Formatlar işleniyor", + "analyzing_loading_thumbnail_ytdlp": "Analiz ediliyor (85%)... Küçük resim yükleniyor", + "analyzing_processing_subtitles_ytdlp": "Analiz ediliyor (90%)... Altyazılar işleniyor", + "select_subtitles": "Altyazı seç...", + "sponsorblock_categories": "SponsorBlock kategorileri..." + }, + "sponsorblock": { + "sponsor": "Sponsor", + "sponsor_desc": "Ücretli reklamlar, ücretli öneriler ve doğrudan reklamlar", + "selfpromo": "Ücretsiz/Kendi tanıtımı", + "selfpromo_desc": "Yaratıcının kendi içeriği için ücretsiz tanıtım", + "interaction": "Etkileşim hatırlatıcısı", + "interaction_desc": "İzleyicilerden beğeni, abone olma veya sosyal medya takibi istenir", + "intro": "Giriş", + "intro_desc": "Atlanabilir video girişi", + "outro": "Son/Son kartları", + "outro_desc": "Jenerik veya video bittiğinde", + "preview": "Önizleme/Özet", + "preview_desc": "Önceki videoların kısa özeti veya gelecek içeriğin önizlemesi", + "music_offtopic": "Müzik dışı bölüm", + "music_offtopic_desc": "Sadece müzik videoları için. Müzik dışı bölümleri işaretler", + "filler": "Dolgu teğet", + "filler_desc": "Sadece dolgu veya mizah için eklenen teğet sahneler" + }, + "video_info": { + "channel": "Kanal", + "views": "Görüntülenme", + "likes": "Beğeni", + "upload_date": "Yükleme tarihi", + "duration": "Süre", + "unknown_channel": "Bilinmeyen kanal", + "unknown_date": "Bilinmeyen tarih", + "unknown_title": "Bilinmeyen başlık" + }, + "command": { + "running": "Çalışıyor...", + "run_command": "Komutu çalıştır" + }, + "selection": { + "none_selected": "0 seçildi", + "one_selected": "1 kategori seçildi", + "count_selected": "{count} seçildi" + }, + "status": { + "ready": "Hazır", + "file_exists": "⚠️ Dosya zaten mevcut", + "cancelling": "İndirme iptal ediliyor..." + } +} \ No newline at end of file diff --git a/languages/zh.json b/languages/zh.json index b4f548a..c1cc026 100644 --- a/languages/zh.json +++ b/languages/zh.json @@ -13,6 +13,7 @@ "french": "法语", "hindi": "印地语", "indonesian": "印尼语", + "turkish": "土耳其语", "help_text": "选择您喜欢的界面语言。", "restart_notice": "语言更改将在重启应用程序后生效。" }, diff --git a/src/gui/ytsage_gui_format_table.py b/src/gui/ytsage_gui_format_table.py index 8341b76..07101d7 100644 --- a/src/gui/ytsage_gui_format_table.py +++ b/src/gui/ytsage_gui_format_table.py @@ -266,13 +266,13 @@ class FormatTableMixin: quality_item = QTableWidgetItem(quality_text) # Set color based on quality (check English, Spanish, Portuguese, Russian, Chinese, German, and French 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"]): + if any(term.lower() in quality_lower for term in ["Best", "Óptima", "Mejor", "Melhor", "Лучшее", "最佳", "Beste", "Meilleure", "सर्वोत्तम", "Terbaik", "En iyi"]): 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"]): + 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"]): 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"]): + 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"]): 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"]): + 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"]): 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 767be24..772cc5e 100644 --- a/src/utils/ytsage_localization.py +++ b/src/utils/ytsage_localization.py @@ -88,7 +88,8 @@ class LocalizationManager: "german": "Deutsch (German)", "french": "Français (French)", "hindi": "हिन्दी (Hindi)", - "indonesian": "Bahasa Indonesia (Indonesian)" + "indonesian": "Bahasa Indonesia (Indonesian)", + "turkish": "Türkçe (Turkish)" }, "download": { "preparing": "🚀 Preparing your download...",