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...",