From b9e8e34e8fae34ac457bb375b5d9f574004c4a3e Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 30 Sep 2025 22:22:53 +0300 Subject: [PATCH] Add Indonesian localization and update language support Introduces Indonesian translations by adding languages/id.json and updating all language files to include 'indonesian' in the language selection. Updates format table color logic in ytsage_gui_format_table.py to recognize Indonesian quality terms. Also updates ytsage_localization.py to include Indonesian in the default language list. --- languages/de.json | 1 + languages/en.json | 1 + languages/es.json | 3 +- languages/fr.json | 1 + languages/hi.json | 1 + languages/id.json | 333 +++++++++++++++++++++++++++++ languages/pt.json | 1 + languages/ru.json | 1 + languages/zh.json | 1 + src/gui/ytsage_gui_format_table.py | 8 +- src/utils/ytsage_localization.py | 3 +- 11 files changed, 348 insertions(+), 6 deletions(-) create mode 100644 languages/id.json diff --git a/languages/de.json b/languages/de.json index 5345c6c..cd5afd5 100644 --- a/languages/de.json +++ b/languages/de.json @@ -12,6 +12,7 @@ "german": "Deutsch", "french": "Französisch", "hindi": "Hindi", + "indonesian": "Indonesisch", "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 0ba9ccc..6afc55d 100644 --- a/languages/en.json +++ b/languages/en.json @@ -12,6 +12,7 @@ "german": "Deutsch (German)", "french": "Français (French)", "hindi": "हिन्दी (Hindi)", + "indonesian": "Bahasa Indonesia (Indonesian)", "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 d83674e..f946981 100644 --- a/languages/es.json +++ b/languages/es.json @@ -11,7 +11,8 @@ "chinese": "中文 (简体) (Chinese Simplified)", "german": "Deutsch (German)", "french": "Français (French)", - "hindi": "Hindi" + "hindi": "Hindi", + "indonesian": "Indonesio" }, "app": { "title": "YTSage", diff --git a/languages/fr.json b/languages/fr.json index 3bf1b77..7cb1d51 100644 --- a/languages/fr.json +++ b/languages/fr.json @@ -12,6 +12,7 @@ "german": "Allemand", "french": "Français", "hindi": "Hindi", + "indonesian": "Indonésien", "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 0e47e0f..24b08b5 100644 --- a/languages/hi.json +++ b/languages/hi.json @@ -12,6 +12,7 @@ "german": "जर्मन", "french": "फ्रेंच", "hindi": "हिन्दी", + "indonesian": "इंडोनेशियाई", "help_text": "इंटरफेस के लिए अपनी पसंदीदा भाषा चुनें।", "restart_notice": "भाषा परिवर्तन एप्लिकेशन पुनरारंभ के बाद प्रभावी होगा।" }, diff --git a/languages/id.json b/languages/id.json new file mode 100644 index 0000000..2346e5b --- /dev/null +++ b/languages/id.json @@ -0,0 +1,333 @@ +{ + "language": { + "display_name": "Bahasa Indonesia (Indonesian)", + "select_language": "Pilih Bahasa:", + "current_language": "Bahasa saat ini: {language}", + "restart_required": "Perubahan bahasa akan berlaku setelah memulai ulang aplikasi.", + "english": "Bahasa Inggris", + "spanish": "Bahasa Spanyol", + "portuguese": "Bahasa Portugis", + "russian": "Bahasa Rusia", + "chinese": "Bahasa Mandarin", + "german": "Bahasa Jerman", + "french": "Bahasa Prancis", + "hindi": "Bahasa Hindi", + "indonesian": "Bahasa Indonesia", + "help_text": "Pilih bahasa yang diinginkan untuk antarmuka.", + "restart_notice": "Perubahan bahasa akan berlaku setelah memulai ulang aplikasi." + }, + "app": { + "title": "YTSage", + "version": "v{version}", + "ready": "Siap" + }, + "formats": { + "show_formats": "Tampilkan format:", + "video_format": "Format video:", + "audio_format": "Format audio:", + "no_formats": "Tidak ada format yang tersedia", + "loading": "Memuat format...", + "select": "Pilih", + "quality": "Kualitas", + "extension": "Ekstensi", + "resolution": "Resolusi", + "file_size": "Ukuran file", + "codec": "Codec", + "audio": "Audio", + "notes": "Catatan", + "will_merge_audio": "Audio akan digabungkan", + "has_audio": "✓ Memiliki audio", + "audio_only": "Audio saja", + "large_size": "Ukuran besar", + "medium_size": "Ukuran sedang", + "standard_size": "Ukuran standar", + "compatible": "Kompatibel", + "efficient": "Efisien", + "high_quality": "Kualitas tinggi", + "best_4k": "Terbaik (4K)", + "best_2k": "Terbaik (2K)", + "high_1080p": "Tinggi (1080p)", + "high_720p": "Tinggi (720p)", + "medium_480p": "Sedang (480p)", + "low_quality": "Kualitas rendah", + "best_audio": "Audio terbaik", + "high_audio": "Audio tinggi", + "medium_audio": "Audio sedang", + "low_audio": "Audio rendah", + "audio_only_resolution": "Audio saja" + }, + "buttons": { + "download": "Unduh", + "pause": "Jeda", + "resume": "Lanjutkan", + "cancel": "Batal", + "browse": "Jelajahi", + "clear": "Bersihkan", + "ok": "OK", + "apply": "Terapkan", + "close": "Tutup", + "run_command": "Jalankan perintah", + "custom_command_help": "Bantuan", + "about": "Tentang", + "analyze": "Analisis", + "paste_url": "Tempel URL", + "select_videos": "Pilih video...", + "video": "Video", + "audio_only": "Audio saja", + "custom_options": "Opsi khusus", + "trim_video": "Potong video", + "download_settings": "Pengaturan unduhan", + "update": "Perbarui yt-dlp", + "select_defaults": "Pilih default", + "select_all": "Pilih semua", + "deselect_all": "Batalkan pilihan semua" + }, + "dialogs": { + "custom_options": "Opsi khusus", + "settings": "Pengaturan", + "select_folder": "Pilih folder unduhan", + "sponsorblock_categories": "Kategori SponsorBlock", + "sponsorblock_description": "Pilih jenis segmen video yang akan dihapus secara otomatis selama pengunduhan.\nSponsorBlock menggunakan data yang dikirimkan komunitas untuk mengidentifikasi segmen ini.", + "select_subtitles": "Pilih subtitle", + "filter_languages_placeholder": "Filter bahasa (misalnya: id, en)...", + "no_subtitles_available": "Tidak ada subtitle yang tersedia", + "matching": "yang cocok" + }, + "tabs": { + "cookies": "Masuk dengan cookies", + "custom_command": "Perintah khusus", + "proxy": "Proxy", + "language": "Bahasa" + }, + "cookies": { + "help_text": "Pilih cara memberikan cookies untuk autentikasi.\nIni memungkinkan pengunduhan video pribadi dan file audio berkualitas tinggi.", + "cookie_source": "Sumber cookie", + "use_cookie_file": "Gunakan file cookie", + "extract_from_browser": "Ekstrak dari browser", + "cookie_file": "File cookie", + "cookie_file_placeholder": "Jalur ke file cookies.txt...", + "browser_selection": "Pilihan browser", + "browser_help": "Pilih browser untuk mengekstrak cookies:", + "browser_label": "Browser:", + "profile_label": "Profil:", + "profile_placeholder": "Default", + "browser_extract_message": "Cookies browser akan diekstrak saat diterapkan", + "file_selected_message": "File cookie dipilih - Klik OK untuk menerapkan", + "select_file_title": "Pilih file cookie", + "file_filter": "File cookie (*.txt *.lwp)" + }, + "custom_command": { + "help_text": "Masukkan perintah yt-dlp khusus Anda di bawah. URL saat ini akan ditambahkan secara otomatis.

Untuk daftar lengkap opsi dan contoh penggunaan klik di sini untuk melihat dokumentasi resmi yt-dlp.

Catatan: Jalur unduhan dan template nama file ditangani secara otomatis.", + "input_label": "Argumen yt-dlp:", + "input_placeholder": "Masukkan argumen yt-dlp di sini...\n\nContoh: --extract-audio --audio-format mp3", + "output_label": "Output perintah:", + "output_placeholder": "Output perintah akan muncul di sini...", + "command_placeholder": "Masukkan perintah yt-dlp khusus...", + "command_help": "Placeholder yang tersedia:\n{url} - URL video\n{output} - Folder output\n\nContoh: --write-info-json --write-thumbnail", + "full_command": "🔧 Perintah lengkap: {command}", + "command_success": "✅ Perintah khusus berhasil dijalankan!", + "command_failed": "❌ Perintah gagal dengan kode keluar {code}", + "command_error": "❌ Kesalahan menjalankan perintah khusus: {error}" + }, + "proxy": { + "help_text": "Konfigurasi pengaturan proxy untuk unduhan. Biarkan kosong untuk koneksi langsung.", + "main_proxy": "Proxy utama", + "main_proxy_help": "Server proxy utama untuk semua unduhan. Mendukung protokol HTTP/HTTPS dan SOCKS5.", + "proxy_url_label": "URL Proxy:", + "proxy_url_placeholder": "http://proxy:port atau socks5://proxy:port", + "proxy_examples": "Contoh:\n• HTTP: http://proxy.example.com:8080\n• SOCKS5: socks5://proxy.example.com:1080", + "geo_proxy": "Proxy bypass geografis", + "geo_proxy_help": "Proxy sekunder khusus untuk mem-bypass pembatasan geografis.", + "geo_proxy_url_label": "URL proxy bypass geografis:", + "geo_proxy_url_placeholder": "http://geo-proxy:port", + "clear_main_proxy": "Hapus proxy utama", + "clear_geo_proxy": "Hapus proxy geografis", + "proxy_url": "URL Proxy", + "proxy_placeholder": "http://proxy:port atau socks5://proxy:port", + "geo_bypass": "Proxy bypass geografis (untuk pembatasan geografis)", + "geo_bypass_placeholder": "http://proxy:port untuk mem-bypass geo-blocking", + "invalid_main_url": "Format URL proxy utama tidak valid", + "invalid_geo_url": "Format URL proxy geografis tidak valid", + "main_configured": "Proxy utama dikonfigurasi", + "geo_configured": "Proxy geografis dikonfigurasi" + }, + "download": { + "preparing": "Mempersiapkan unduhan...", + "please_enter_url": "Silakan masukkan URL terlebih dahulu.", + "please_set_path": "Silakan atur jalur unduhan terlebih dahulu.", + "please_enter_url_and_path": "Silakan masukkan URL dan atur jalur unduhan.", + "please_select_format": "Silakan pilih format terlebih dahulu." + }, + "update": { + "title": "Perbarui yt-dlp", + "checking": "Memeriksa pembaruan...", + "update_available": "Pembaruan tersedia!\nVersi saat ini: {current}\nVersi terbaru: {latest}", + "up_to_date": "yt-dlp sudah terbaru (Versi {version})", + "could_not_determine": "Tidak dapat menentukan versi.", + "error_comparing": "Kesalahan membandingkan versi: {error}", + "update_available_failed": "Pembaruan tersedia! (Perbandingan gagal)\nSaat ini: {current}\nTerbaru: {latest}", + "updating": "Memperbarui...", + "initializing": "🚀 Menginisialisasi proses pembaruan...", + "checking_current": "🔍 Memeriksa instalasi saat ini...", + "found_at": "📍 yt-dlp ditemukan di: {path}", + "error_getting_path": "❌ Kesalahan mendapatkan jalur yt-dlp: {error}", + "updating_binary": "📦 Memperbarui binary yt-dlp yang dikelola aplikasi...", + "updating_pip": "🐍 Memperbarui yt-dlp sistem melalui pip...", + "update_failed": "❌ Pembaruan yt-dlp gagal. Silakan coba lagi atau periksa koneksi internet Anda.", + "binary_updated": "✅ Binary berhasil diperbarui!", + "update_failed_stderr": "❌ Pembaruan yt-dlp gagal: {error}", + "update_timeout": "❌ Timeout pembaruan yt-dlp.", + "unexpected_error": "❌ Kesalahan tak terduga selama pembaruan: {error}", + "checking_pip": "🔍 Memeriksa instalasi pip saat ini...", + "current_version": "📋 Versi saat ini: {version}", + "not_found_pip": "⚠️ yt-dlp tidak ditemukan melalui pip, mencoba menginstal...", + "checking_latest": "🌐 Memeriksa versi terbaru...", + "failed_check_updates": "❌ Gagal memeriksa pembaruan", + "latest_version": "🆕 Versi terbaru: {version}", + "updating_from_to": "⬆️ Memperbarui dari {current} ke {latest}...", + "running_pip_install": "📦 Menjalankan pip install --upgrade...", + "pip_completed": "✅ Pembaruan pip berhasil diselesaikan!", + "pip_failed": "❌ Pembaruan pip gagal: {error}" + }, + "about": { + "title": "Tentang YTSage", + "version": "Versi {version}", + "description": "Pengunduh YouTube modern dengan antarmuka PySide6 yang bersih.", + "author": "Oleh: {author}", + "github": "GitHub: {repo}", + "system_info": "Informasi sistem", + "loading": "🔄 Memuat informasi sistem...", + "refresh": "🔄", + "refreshing": "🔄 Menyegarkan...", + "refresh_failed": "Gagal menyegarkan", + "refresh_failed_message": "Tidak dapat menyegarkan informasi versi.", + "detected": "✓ Terdeteksi", + "missing": "✗ Hilang", + "not_available": "Tidak tersedia" + }, + "time_range": { + "title": "Potong video", + "time_range_group": "Rentang waktu", + "start_time": "Waktu mulai (HH:MM:SS)", + "end_time": "Waktu selesai (HH:MM:SS)", + "start_placeholder": "00:00:00", + "end_placeholder": "00:00:00", + "start_time_placeholder": "Waktu mulai (HH:MM:SS)", + "end_time_placeholder": "Waktu selesai (HH:MM:SS)", + "force_keyframes": "Paksa keyframe pada titik potong", + "help_text": "Atur waktu mulai dan selesai untuk memotong video.\nBiarkan kosong untuk mengunduh video penuh.", + "invalid_format": "Format waktu tidak valid. Gunakan format HH:MM:SS.", + "start_after_end": "Waktu mulai tidak boleh setelah waktu selesai." + }, + "settings": { + "title": "Pengaturan unduhan", + "download_path": "Jalur unduhan", + "browse": "Jelajahi...", + "speed_limit": "Batas kecepatan", + "speed_limit_placeholder": "Tidak ada", + "auto_update_ytdlp": "Pembaruan otomatis yt-dlp", + "enable_auto_updates": "Aktifkan pembaruan otomatis yt-dlp", + "update_frequency": "Frekuensi pembaruan:", + "check_startup": "Periksa setiap startup (minimal 1 jam antara pemeriksaan)", + "check_daily": "Periksa harian", + "check_weekly": "Periksa mingguan", + "check_updates_now": "Periksa pembaruan sekarang", + "update_check_title": "Pemeriksaan pembaruan", + "could_not_determine_version": "Tidak dapat menentukan versi yt-dlp saat ini.", + "update_available_dialog": "Pembaruan tersedia!\n\nSaat ini: {current}\nTerbaru: {latest}\n\nGunakan tombol 'Perbarui yt-dlp' di jendela utama untuk memperbarui.", + "up_to_date_dialog": "yt-dlp sudah terbaru!\n\nVersi saat ini: {version}", + "error_checking_updates": "Kesalahan memeriksa pembaruan: {error}", + "settings_saved_title": "Pengaturan disimpan", + "settings_saved_message": "Pengaturan pembaruan otomatis berhasil disimpan!", + "error_title": "Kesalahan", + "failed_save_settings": "Gagal menyimpan pengaturan pembaruan otomatis.", + "error_saving_settings": "Kesalahan menyimpan pengaturan pembaruan otomatis: {error}", + "auto_update_title": "Pengaturan pembaruan otomatis", + "auto_update_header": "🔄 Pengaturan pembaruan otomatis", + "auto_update_description": "Konfigurasi pembaruan otomatis untuk yt-dlp untuk memastikan Anda selalu memiliki fitur dan perbaikan bug terbaru.", + "current_status": "Status saat ini", + "current_version_label": "Versi yt-dlp saat ini: Memeriksa...", + "last_check_label": "Pemeriksaan pembaruan terakhir: Tidak pernah", + "next_check_label": "Pemeriksaan berikutnya: Berdasarkan pengaturan", + "manual_check_button": "🔍 Periksa pembaruan sekarang", + "update_frequency_group": "Frekuensi pembaruan", + "save_settings": "Simpan pengaturan", + "settings_saved_successfully": "✅ Pengaturan berhasil disimpan!", + "error_saving": "❌ Kesalahan menyimpan pengaturan: {error}" + }, + "main_ui": { + "url_placeholder": "Masukkan URL video atau playlist YouTube", + "merge_subtitles": "Gabungkan subtitle", + "save_thumbnail": "Simpan thumbnail", + "save_description": "Simpan deskripsi", + "embed_chapters": "Sematkan bab", + "subtitles_selected": "{count} dipilih", + "all_selected": "Semua dipilih", + "select_videos_all": "Pilih video... (Semua dipilih)", + "please_enter_url": "Silakan masukkan URL terlebih dahulu", + "cookie_file_selected_title": "File cookie dipilih", + "cookie_file_selected_message": "File cookie dipilih: {path}", + "browser_cookies_selected_title": "Cookies browser dipilih", + "browser_cookies_selected_message": "Cookies browser akan diekstrak dari: {browser}", + "error_no_format_info": "Kesalahan: Tidak ada informasi format yang tersedia.", + "error_extract_info": "Kesalahan: Tidak dapat mengekstrak informasi video dasar. Silakan periksa tautan Anda.", + "analyzing_preparing": "Menganalisis (0%)... Mempersiapkan permintaan", + "analyzing_extracting_basic": "Menganalisis (15%)... Mengekstrak informasi dasar", + "analyzing_extracting_detailed": "Menganalisis (30%)... Mengekstrak informasi detail", + "analyzing_processing_video": "Menganalisis (45%)... Memproses data video", + "analyzing_processing_formats": "Menganalisis (60%)... Memproses format", + "analyzing_loading_thumbnail": "Menganalisis (75%)... Memuat thumbnail", + "analyzing_processing_subtitles": "Menganalisis (85%)... Memproses subtitle", + "analyzing_updating_table": "Menganalisis (95%)... Memperbarui tabel format", + "analysis_complete": "Analisis selesai!", + "analyzing_extracting_ytdlp": "Menganalisis (30%)... Mengekstrak informasi dengan executable yt-dlp", + "analyzing_processing_data": "Menganalisis (60%)... Memproses data", + "analyzing_processing_formats_ytdlp": "Menganalisis (75%)... Memproses format", + "analyzing_loading_thumbnail_ytdlp": "Menganalisis (85%)... Memuat thumbnail", + "analyzing_processing_subtitles_ytdlp": "Menganalisis (90%)... Memproses subtitle", + "select_subtitles": "Pilih subtitle...", + "sponsorblock_categories": "Kategori SponsorBlock..." + }, + "sponsorblock": { + "sponsor": "Sponsor", + "sponsor_desc": "Iklan berbayar, rekomendasi berbayar dan iklan langsung", + "selfpromo": "Promosi diri tidak berbayar", + "selfpromo_desc": "Iklan tidak berbayar untuk konten kreator sendiri", + "interaction": "Pengingat interaksi", + "interaction_desc": "Pemirsa diminta untuk menyukai, berlangganan atau mengikuti media sosial", + "intro": "Intro", + "intro_desc": "Intro video yang dapat dilewati", + "outro": "Outro/Kartu akhir", + "outro_desc": "Kredit atau saat video berakhir", + "preview": "Pratinjau/Ringkasan", + "preview_desc": "Ringkasan singkat video sebelumnya atau pratinjau konten mendatang", + "music_offtopic": "Bagian non-musik", + "music_offtopic_desc": "Hanya untuk video musik. Menandai bagian non-musik", + "filler": "Tangensial pengisi", + "filler_desc": "Adegan tangensial yang ditambahkan hanya sebagai pengisi atau untuk humor" + }, + "video_info": { + "channel": "Saluran", + "views": "Tayangan", + "likes": "Suka", + "upload_date": "Tanggal upload", + "duration": "Durasi", + "unknown_channel": "Saluran tidak diketahui", + "unknown_date": "Tanggal tidak diketahui", + "unknown_title": "Judul tidak diketahui" + }, + "command": { + "running": "Berjalan...", + "run_command": "Jalankan perintah" + }, + "selection": { + "none_selected": "0 dipilih", + "one_selected": "1 kategori dipilih", + "count_selected": "{count} dipilih" + }, + "status": { + "ready": "Siap", + "file_exists": "⚠️ File sudah ada", + "cancelling": "Membatalkan unduhan..." + } +} \ No newline at end of file diff --git a/languages/pt.json b/languages/pt.json index 51926f9..f543a70 100644 --- a/languages/pt.json +++ b/languages/pt.json @@ -12,6 +12,7 @@ "german": "Alemão", "french": "Francês", "hindi": "Hindi", + "indonesian": "Indonésio", "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 8496465..a7957d2 100644 --- a/languages/ru.json +++ b/languages/ru.json @@ -12,6 +12,7 @@ "german": "Немецкий", "french": "Французский", "hindi": "Хинди", + "indonesian": "Индонезийский", "help_text": "Выберите предпочитаемый язык для интерфейса.", "restart_notice": "Изменение языка вступит в силу после перезапуска приложения." }, diff --git a/languages/zh.json b/languages/zh.json index 22fbd41..b4f548a 100644 --- a/languages/zh.json +++ b/languages/zh.json @@ -12,6 +12,7 @@ "german": "德语", "french": "法语", "hindi": "印地语", + "indonesian": "印尼语", "help_text": "选择您喜欢的界面语言。", "restart_notice": "语言更改将在重启应用程序后生效。" }, diff --git a/src/gui/ytsage_gui_format_table.py b/src/gui/ytsage_gui_format_table.py index c95f9e5..8341b76 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", "सर्वोत्तम"]): + if any(term.lower() in quality_lower for term in ["Best", "Óptima", "Mejor", "Melhor", "Лучшее", "最佳", "Beste", "Meilleure", "सर्वोत्तम", "Terbaik"]): 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é", "उच्च", "उच्च ऑडियो"]): + 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"]): 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", "मध्यम", "मध्यम ऑडियो"]): + 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"]): 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", "निम्न", "निम्न ऑडियो", "निम्न गुणवत्ता"]): + 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"]): 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 a424c29..767be24 100644 --- a/src/utils/ytsage_localization.py +++ b/src/utils/ytsage_localization.py @@ -87,7 +87,8 @@ class LocalizationManager: "chinese": "中文 (简体) (Chinese Simplified)", "german": "Deutsch (German)", "french": "Français (French)", - "hindi": "हिन्दी (Hindi)" + "hindi": "हिन्दी (Hindi)", + "indonesian": "Bahasa Indonesia (Indonesian)" }, "download": { "preparing": "🚀 Preparing your download...",