From b02ca9ae01c55216985ff496577a0baa5d9c2472 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 30 Sep 2025 22:16:31 +0300 Subject: [PATCH] Add Hindi localization and update language support Introduces a new Hindi translation file (hi.json) and adds Hindi as a selectable language in all existing language files. Updates the format table to recognize Hindi quality terms for color coding, and includes Hindi in the default language list in the localization manager. --- languages/de.json | 1 + languages/en.json | 1 + languages/es.json | 3 +- languages/fr.json | 1 + languages/hi.json | 332 +++++++++++++++++++++++++++++ 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 +- 10 files changed, 346 insertions(+), 6 deletions(-) create mode 100644 languages/hi.json diff --git a/languages/de.json b/languages/de.json index a707cb1..5345c6c 100644 --- a/languages/de.json +++ b/languages/de.json @@ -11,6 +11,7 @@ "chinese": "Chinesisch", "german": "Deutsch", "french": "Französisch", + "hindi": "Hindi", "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 e1b598f..0ba9ccc 100644 --- a/languages/en.json +++ b/languages/en.json @@ -11,6 +11,7 @@ "chinese": "中文 (简体) (Chinese Simplified)", "german": "Deutsch (German)", "french": "Français (French)", + "hindi": "हिन्दी (Hindi)", "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 c3519f0..d83674e 100644 --- a/languages/es.json +++ b/languages/es.json @@ -10,7 +10,8 @@ "russian": "Русский (Russian)", "chinese": "中文 (简体) (Chinese Simplified)", "german": "Deutsch (German)", - "french": "Français (French)" + "french": "Français (French)", + "hindi": "Hindi" }, "app": { "title": "YTSage", diff --git a/languages/fr.json b/languages/fr.json index 439e03a..3bf1b77 100644 --- a/languages/fr.json +++ b/languages/fr.json @@ -11,6 +11,7 @@ "chinese": "Chinois", "german": "Allemand", "french": "Français", + "hindi": "Hindi", "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 new file mode 100644 index 0000000..0e47e0f --- /dev/null +++ b/languages/hi.json @@ -0,0 +1,332 @@ +{ + "language": { + "display_name": "हिन्दी (Hindi)", + "select_language": "भाषा चुनें:", + "current_language": "वर्तमान भाषा: {language}", + "restart_required": "भाषा परिवर्तन एप्लिकेशन पुनरारंभ के बाद प्रभावी होगा।", + "english": "अंग्रेजी", + "spanish": "स्पेनिश", + "portuguese": "पुर्तगाली", + "russian": "रूसी", + "chinese": "चीनी", + "german": "जर्मन", + "french": "फ्रेंच", + "hindi": "हिन्दी", + "help_text": "इंटरफेस के लिए अपनी पसंदीदा भाषा चुनें।", + "restart_notice": "भाषा परिवर्तन एप्लिकेशन पुनरारंभ के बाद प्रभावी होगा।" + }, + "app": { + "title": "YTSage", + "version": "v{version}", + "ready": "तैयार" + }, + "formats": { + "show_formats": "प्रारूप दिखाएं:", + "video_format": "वीडियो प्रारूप:", + "audio_format": "ऑडियो प्रारूप:", + "no_formats": "कोई प्रारूप उपलब्ध नहीं", + "loading": "प्रारूप लोड हो रहे हैं...", + "select": "चुनें", + "quality": "गुणवत्ता", + "extension": "एक्सटेंशन", + "resolution": "रिज़ॉल्यूशन", + "file_size": "फ़ाइल आकार", + "codec": "कोडेक", + "audio": "ऑडियो", + "notes": "नोट्स", + "will_merge_audio": "ऑडियो मर्ज किया जाएगा", + "has_audio": "✓ ऑडियो है", + "audio_only": "केवल ऑडियो", + "large_size": "बड़ा आकार", + "medium_size": "मध्यम आकार", + "standard_size": "मानक आकार", + "compatible": "संगत", + "efficient": "कुशल", + "high_quality": "उच्च गुणवत्ता", + "best_4k": "सर्वोत्तम (4K)", + "best_2k": "सर्वोत्तम (2K)", + "high_1080p": "उच्च (1080p)", + "high_720p": "उच्च (720p)", + "medium_480p": "मध्यम (480p)", + "low_quality": "निम्न गुणवत्ता", + "best_audio": "सर्वोत्तम ऑडियो", + "high_audio": "उच्च ऑडियो", + "medium_audio": "मध्यम ऑडियो", + "low_audio": "निम्न ऑडियो", + "audio_only_resolution": "केवल ऑडियो" + }, + "buttons": { + "download": "डाउनलोड", + "pause": "रोकें", + "resume": "जारी रखें", + "cancel": "रद्द करें", + "browse": "ब्राउज़", + "clear": "साफ़ करें", + "ok": "ठीक है", + "apply": "लागू करें", + "close": "बंद करें", + "run_command": "कमांड चलाएं", + "custom_command_help": "सहायता", + "about": "के बारे में", + "analyze": "विश्लेषण", + "paste_url": "URL पेस्ट करें", + "select_videos": "वीडियो चुनें...", + "video": "वीडियो", + "audio_only": "केवल ऑडियो", + "custom_options": "कस्टम विकल्प", + "trim_video": "वीडियो ट्रिम करें", + "download_settings": "डाउनलोड सेटिंग्स", + "update": "yt-dlp अपडेट करें", + "select_defaults": "डिफ़ॉल्ट चुनें", + "select_all": "सभी चुनें", + "deselect_all": "सभी को अचयनित करें" + }, + "dialogs": { + "custom_options": "कस्टम विकल्प", + "settings": "सेटिंग्स", + "select_folder": "डाउनलोड फ़ोल्डर चुनें", + "sponsorblock_categories": "SponsorBlock श्रेणियां", + "sponsorblock_description": "डाउनलोड के दौरान अपने आप हटाए जाने वाले वीडियो सेगमेंट के प्रकार चुनें।\nSponsorBlock इन सेगमेंट की पहचान के लिए समुदाय द्वारा प्रस्तुत डेटा का उपयोग करता है।", + "select_subtitles": "उपशीर्षक चुनें", + "filter_languages_placeholder": "भाषाएं फ़िल्टर करें (जैसे: hi, en)...", + "no_subtitles_available": "कोई उपशीर्षक उपलब्ध नहीं", + "matching": "मेल खाता" + }, + "tabs": { + "cookies": "कुकीज़ के साथ लॉगिन", + "custom_command": "कस्टम कमांड", + "proxy": "प्रॉक्सी", + "language": "भाषा" + }, + "cookies": { + "help_text": "प्रमाणीकरण के लिए कुकीज़ प्रदान करने का तरीका चुनें।\nयह निजी वीडियो और उच्च गुणवत्ता वाली ऑडियो फ़ाइलें डाउनलोड करने की अनुमति देता है।", + "cookie_source": "कुकी स्रोत", + "use_cookie_file": "कुकी फ़ाइल का उपयोग करें", + "extract_from_browser": "ब्राउज़र से निकालें", + "cookie_file": "कुकी फ़ाइल", + "cookie_file_placeholder": "cookies.txt फ़ाइल का पथ...", + "browser_selection": "ब्राउज़र चयन", + "browser_help": "वह ब्राउज़र चुनें जिससे कुकीज़ निकालनी हैं:", + "browser_label": "ब्राउज़र:", + "profile_label": "प्रोफ़ाइल:", + "profile_placeholder": "डिफ़ॉल्ट", + "browser_extract_message": "लागू करने पर ब्राउज़र कुकीज़ निकाली जाएंगी", + "file_selected_message": "कुकी फ़ाइल चुनी गई - लागू करने के लिए OK दबाएं", + "select_file_title": "कुकी फ़ाइल चुनें", + "file_filter": "कुकी फ़ाइलें (*.txt *.lwp)" + }, + "custom_command": { + "help_text": "नीचे अपना कस्टम yt-dlp कमांड दर्ज करें। वर्तमान URL स्वचालित रूप से जोड़ा जाएगा।

विकल्पों की पूरी सूची और उपयोग के उदाहरणों के लिए आधिकारिक yt-dlp दस्तावेज़ देखने के लिए यहाँ क्लिक करें

नोट: डाउनलोड पथ और फ़ाइलनाम टेम्प्लेट स्वचालित रूप से संभाले जाते हैं।", + "input_label": "yt-dlp आर्गुमेंट्स:", + "input_placeholder": "यहाँ yt-dlp आर्गुमेंट्स दर्ज करें...\n\nउदाहरण: --extract-audio --audio-format mp3", + "output_label": "कमांड आउटपुट:", + "output_placeholder": "कमांड आउटपुट यहाँ दिखाई देगा...", + "command_placeholder": "कस्टम yt-dlp कमांड दर्ज करें...", + "command_help": "उपलब्ध प्लेसहोल्डर:\n{url} - वीडियो URL\n{output} - आउटपुट फ़ोल्डर\n\nउदाहरण: --write-info-json --write-thumbnail", + "full_command": "🔧 पूरा कमांड: {command}", + "command_success": "✅ कस्टम कमांड सफलतापूर्वक निष्पादित!", + "command_failed": "❌ कमांड असफल, एग्जिट कोड {code}", + "command_error": "❌ कस्टम कमांड निष्पादित करने में त्रुटि: {error}" + }, + "proxy": { + "help_text": "डाउनलोड के लिए प्रॉक्सी सेटिंग्स कॉन्फ़िगर करें। प्रत्यक्ष कनेक्शन के लिए खाली छोड़ें।", + "main_proxy": "मुख्य प्रॉक्सी", + "main_proxy_help": "सभी डाउनलोड के लिए प्राथमिक प्रॉक्सी सर्वर। HTTP/HTTPS और SOCKS5 प्रोटोकॉल समर्थित।", + "proxy_url_label": "प्रॉक्सी URL:", + "proxy_url_placeholder": "http://proxy:port या socks5://proxy:port", + "proxy_examples": "उदाहरण:\n• HTTP: http://proxy.example.com:8080\n• SOCKS5: socks5://proxy.example.com:1080", + "geo_proxy": "भू-बाईपास प्रॉक्सी", + "geo_proxy_help": "भौगोलिक प्रतिबंधों को बायपास करने के लिए द्वितीयक प्रॉक्सी।", + "geo_proxy_url_label": "भू-बाईपास प्रॉक्सी URL:", + "geo_proxy_url_placeholder": "http://geo-proxy:port", + "clear_main_proxy": "मुख्य प्रॉक्सी साफ़ करें", + "clear_geo_proxy": "भू-प्रॉक्सी साफ़ करें", + "proxy_url": "प्रॉक्सी URL", + "proxy_placeholder": "http://proxy:port या socks5://proxy:port", + "geo_bypass": "भू-बाईपास प्रॉक्सी (भौगोलिक प्रतिबंधों के लिए)", + "geo_bypass_placeholder": "http://proxy:port भू-ब्लॉकिंग बायपास के लिए", + "invalid_main_url": "अमान्य मुख्य प्रॉक्सी URL प्रारूप", + "invalid_geo_url": "अमान्य भू-प्रॉक्सी URL प्रारूप", + "main_configured": "मुख्य प्रॉक्सी कॉन्फ़िगर की गई", + "geo_configured": "भू-प्रॉक्सी कॉन्फ़िगर की गई" + }, + "download": { + "preparing": "डाउनलोड तैयार हो रहा है...", + "please_enter_url": "कृपया पहले URL दर्ज करें।", + "please_set_path": "कृपया पहले डाउनलोड पथ सेट करें।", + "please_enter_url_and_path": "कृपया URL दर्ज करें और डाउनलोड पथ सेट करें।", + "please_select_format": "कृपया पहले प्रारूप चुनें।" + }, + "update": { + "title": "yt-dlp अपडेट करें", + "checking": "अपडेट की जांच हो रही है...", + "update_available": "अपडेट उपलब्ध!\nवर्तमान संस्करण: {current}\nनवीनतम संस्करण: {latest}", + "up_to_date": "yt-dlp अप टू डेट है (संस्करण {version})", + "could_not_determine": "संस्करण निर्धारित नहीं हो सके।", + "error_comparing": "संस्करण तुलना में त्रुटि: {error}", + "update_available_failed": "अपडेट उपलब्ध! (तुलना असफल)\nवर्तमान: {current}\nनवीनतम: {latest}", + "updating": "अपडेट हो रहा है...", + "initializing": "🚀 अपडेट प्रक्रिया प्रारंभ हो रही है...", + "checking_current": "🔍 वर्तमान इंस्टॉलेशन की जांच हो रही है...", + "found_at": "📍 yt-dlp मिला: {path}", + "error_getting_path": "❌ yt-dlp पथ प्राप्त करने में त्रुटि: {error}", + "updating_binary": "📦 ऐप-प्रबंधित yt-dlp बाइनरी अपडेट हो रही है...", + "updating_pip": "🐍 pip के माध्यम से सिस्टम yt-dlp अपडेट हो रहा है...", + "update_failed": "❌ yt-dlp अपडेट असफल। कृपया पुनः प्रयास करें या अपना इंटरनेट कनेक्शन जांचें।", + "binary_updated": "✅ बाइनरी सफलतापूर्वक अपडेट हुई!", + "update_failed_stderr": "❌ yt-dlp अपडेट असफल: {error}", + "update_timeout": "❌ yt-dlp अपडेट टाइमआउट।", + "unexpected_error": "❌ अपडेट के दौरान अनपेक्षित त्रुटि: {error}", + "checking_pip": "🔍 वर्तमान pip इंस्टॉलेशन की जांच हो रही है...", + "current_version": "📋 वर्तमान संस्करण: {version}", + "not_found_pip": "⚠️ pip के माध्यम से yt-dlp नहीं मिला, इंस्टॉल करने का प्रयास हो रहा है...", + "checking_latest": "🌐 नवीनतम संस्करण की जांच हो रही है...", + "failed_check_updates": "❌ अपडेट जांच असफल", + "latest_version": "🆕 नवीनतम संस्करण: {version}", + "updating_from_to": "⬆️ {current} से {latest} पर अपडेट हो रहा है...", + "running_pip_install": "📦 pip install --upgrade चल रहा है...", + "pip_completed": "✅ Pip अपडेट सफलतापूर्वक पूर्ण!", + "pip_failed": "❌ Pip अपडेट असफल: {error}" + }, + "about": { + "title": "YTSage के बारे में", + "version": "संस्करण {version}", + "description": "साफ PySide6 इंटरफेस के साथ आधुनिक YouTube डाउनलोडर।", + "author": "द्वारा: {author}", + "github": "GitHub: {repo}", + "system_info": "सिस्टम जानकारी", + "loading": "🔄 सिस्टम जानकारी लोड हो रही है...", + "refresh": "🔄", + "refreshing": "🔄 रिफ्रेश हो रहा है...", + "refresh_failed": "रिफ्रेश असफल", + "refresh_failed_message": "संस्करण जानकारी रिफ्रेश करने में असमर्थ।", + "detected": "✓ पता चला", + "missing": "✗ गुम", + "not_available": "उपलब्ध नहीं" + }, + "time_range": { + "title": "वीडियो ट्रिम करें", + "time_range_group": "समय सीमा", + "start_time": "प्रारंभ समय (HH:MM:SS)", + "end_time": "समाप्ति समय (HH:MM:SS)", + "start_placeholder": "00:00:00", + "end_placeholder": "00:00:00", + "start_time_placeholder": "प्रारंभ समय (HH:MM:SS)", + "end_time_placeholder": "समाप्ति समय (HH:MM:SS)", + "force_keyframes": "कट पॉइंट्स पर कीफ्रेम्स को बाध्य करें", + "help_text": "वीडियो ट्रिम करने के लिए प्रारंभ और समाप्ति समय सेट करें।\nपूरा वीडियो डाउनलोड करने के लिए खाली छोड़ें।", + "invalid_format": "अमान्य समय प्रारूप। HH:MM:SS प्रारूप का उपयोग करें।", + "start_after_end": "प्रारंभ समय समाप्ति समय के बाद नहीं हो सकता।" + }, + "settings": { + "title": "डाउनलोड सेटिंग्स", + "download_path": "डाउनलोड पथ", + "browse": "ब्राउज़ करें...", + "speed_limit": "गति सीमा", + "speed_limit_placeholder": "कोई नहीं", + "auto_update_ytdlp": "yt-dlp स्वचालित अपडेट", + "enable_auto_updates": "yt-dlp स्वचालित अपडेट सक्षम करें", + "update_frequency": "अपडेट आवृत्ति:", + "check_startup": "हर स्टार्टअप पर जांचें (जांच के बीच कम से कम 1 घंटा)", + "check_daily": "दैनिक जांचें", + "check_weekly": "साप्ताहिक जांचें", + "check_updates_now": "अभी अपडेट की जांच करें", + "update_check_title": "अपडेट जांच", + "could_not_determine_version": "वर्तमान yt-dlp संस्करण निर्धारित नहीं हो सका।", + "update_available_dialog": "अपडेट उपलब्ध!\n\nवर्तमान: {current}\nनवीनतम: {latest}\n\nअपडेट करने के लिए मुख्य विंडो में 'yt-dlp अपडेट करें' बटन का उपयोग करें।", + "up_to_date_dialog": "yt-dlp अप टू डेट है!\n\nवर्तमान संस्करण: {version}", + "error_checking_updates": "अपडेट जांचने में त्रुटि: {error}", + "settings_saved_title": "सेटिंग्स सेव की गईं", + "settings_saved_message": "स्वचालित अपडेट सेटिंग्स सफलतापूर्वक सेव हुईं!", + "error_title": "त्रुटि", + "failed_save_settings": "स्वचालित अपडेट सेटिंग्स सेव करना असफल।", + "error_saving_settings": "स्वचालित अपडेट सेटिंग्स सेव करने में त्रुटि: {error}", + "auto_update_title": "स्वचालित अपडेट सेटिंग्स", + "auto_update_header": "🔄 स्वचालित अपडेट सेटिंग्स", + "auto_update_description": "yt-dlp के लिए स्वचालित अपडेट कॉन्फ़िगर करें ताकि आपके पास हमेशा नवीनतम सुविधाएं और बग फिक्स हों।", + "current_status": "वर्तमान स्थिति", + "current_version_label": "वर्तमान yt-dlp संस्करण: जांच रहे हैं...", + "last_check_label": "अंतिम अपडेट जांच: कभी नहीं", + "next_check_label": "अगली जांच: सेटिंग्स के आधार पर", + "manual_check_button": "🔍 अभी अपडेट की जांच करें", + "update_frequency_group": "अपडेट आवृत्ति", + "save_settings": "सेटिंग्स सेव करें", + "settings_saved_successfully": "✅ सेटिंग्स सफलतापूर्वक सेव हुईं!", + "error_saving": "❌ सेटिंग्स सेव करने में त्रुटि: {error}" + }, + "main_ui": { + "url_placeholder": "YouTube वीडियो या प्लेलिस्ट URL दर्ज करें", + "merge_subtitles": "उपशीर्षक मर्ज करें", + "save_thumbnail": "थंबनेल सेव करें", + "save_description": "विवरण सेव करें", + "embed_chapters": "चैप्टर एम्बेड करें", + "subtitles_selected": "{count} चुना गया", + "all_selected": "सभी चुने गए", + "select_videos_all": "वीडियो चुनें... (सभी चुने गए)", + "please_enter_url": "कृपया पहले URL दर्ज करें", + "cookie_file_selected_title": "कुकी फ़ाइल चुनी गई", + "cookie_file_selected_message": "कुकी फ़ाइल चुनी गई: {path}", + "browser_cookies_selected_title": "ब्राउज़र कुकीज़ चुनी गईं", + "browser_cookies_selected_message": "ब्राउज़र कुकीज़ निकाली जाएंगी: {browser}", + "error_no_format_info": "त्रुटि: कोई प्रारूप जानकारी उपलब्ध नहीं।", + "error_extract_info": "त्रुटि: बुनियादी वीडियो जानकारी निकालने में असमर्थ। कृपया अपना लिंक जांचें।", + "analyzing_preparing": "विश्लेषण (0%)... अनुरोध तैयार हो रहा है", + "analyzing_extracting_basic": "विश्लेषण (15%)... बुनियादी जानकारी निकाली जा रही है", + "analyzing_extracting_detailed": "विश्लेषण (30%)... विस्तृत जानकारी निकाली जा रही है", + "analyzing_processing_video": "विश्लेषण (45%)... वीडियो डेटा प्रोसेस हो रहा है", + "analyzing_processing_formats": "विश्लेषण (60%)... प्रारूप प्रोसेस हो रहे हैं", + "analyzing_loading_thumbnail": "विश्लेषण (75%)... थंबनेल लोड हो रहा है", + "analyzing_processing_subtitles": "विश्लेषण (85%)... उपशीर्षक प्रोसेस हो रहे हैं", + "analyzing_updating_table": "विश्लेषण (95%)... प्रारूप तालिका अपडेट हो रही है", + "analysis_complete": "विश्लेषण पूर्ण!", + "analyzing_extracting_ytdlp": "विश्लेषण (30%)... yt-dlp executable के साथ जानकारी निकाली जा रही है", + "analyzing_processing_data": "विश्लेषण (60%)... डेटा प्रोसेस हो रहा है", + "analyzing_processing_formats_ytdlp": "विश्लेषण (75%)... प्रारूप प्रोसेस हो रहे हैं", + "analyzing_loading_thumbnail_ytdlp": "विश्लेषण (85%)... थंबनेल लोड हो रहा है", + "analyzing_processing_subtitles_ytdlp": "विश्लेषण (90%)... उपशीर्षक प्रोसेस हो रहे हैं", + "select_subtitles": "उपशीर्षक चुनें...", + "sponsorblock_categories": "SponsorBlock श्रेणियां..." + }, + "sponsorblock": { + "sponsor": "प्रायोजक", + "sponsor_desc": "पेड विज्ञापन, पेड सिफारिशें और प्रत्यक्ष विज्ञापन", + "selfpromo": "अवैतनिक/स्व-प्रचार", + "selfpromo_desc": "निर्माता की अपनी सामग्री के लिए अवैतनिक प्रचार", + "interaction": "इंटरैक्शन रिमाइंडर", + "interaction_desc": "दर्शकों से लाइक, सब्स्क्राइब या सोशल मीडिया फॉलो करने के लिए कहा जाता है", + "intro": "परिचय", + "intro_desc": "वीडियो परिचय जिसे छोड़ा जा सकता है", + "outro": "आउट्रो/एंड कार्ड", + "outro_desc": "क्रेडिट या जब वीडियो समाप्त होता है", + "preview": "पूर्वावलोकन/सारांश", + "preview_desc": "पिछले वीडियो का संक्षिप्त सारांश या आगामी सामग्री का पूर्वावलोकन", + "music_offtopic": "गैर-संगीत खंड", + "music_offtopic_desc": "केवल संगीत वीडियो के लिए। गैर-संगीत खंडों को चिह्नित करता है", + "filler": "फिलर टैंजेंट", + "filler_desc": "केवल फिलर या हास्य के लिए जोड़े गए विचलन दृश्य" + }, + "video_info": { + "channel": "चैनल", + "views": "दृश्य", + "likes": "पसंद", + "upload_date": "अपलोड दिनांक", + "duration": "अवधि", + "unknown_channel": "अज्ञात चैनल", + "unknown_date": "अज्ञात दिनांक", + "unknown_title": "अज्ञात शीर्षक" + }, + "command": { + "running": "चल रहा है...", + "run_command": "कमांड चलाएं" + }, + "selection": { + "none_selected": "0 चुना गया", + "one_selected": "1 श्रेणी चुनी गई", + "count_selected": "{count} चुने गए" + }, + "status": { + "ready": "तैयार", + "file_exists": "⚠️ फ़ाइल पहले से मौजूद है", + "cancelling": "डाउनलोड रद्द हो रहा है..." + } +} \ No newline at end of file diff --git a/languages/pt.json b/languages/pt.json index 6bc935e..51926f9 100644 --- a/languages/pt.json +++ b/languages/pt.json @@ -11,6 +11,7 @@ "chinese": "中文 (简体) (Chinese Simplified)", "german": "Alemão", "french": "Francês", + "hindi": "Hindi", "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 b4db0ca..8496465 100644 --- a/languages/ru.json +++ b/languages/ru.json @@ -11,6 +11,7 @@ "chinese": "中文 (简体) (Chinese Simplified)", "german": "Немецкий", "french": "Французский", + "hindi": "Хинди", "help_text": "Выберите предпочитаемый язык для интерфейса.", "restart_notice": "Изменение языка вступит в силу после перезапуска приложения." }, diff --git a/languages/zh.json b/languages/zh.json index b89adc3..22fbd41 100644 --- a/languages/zh.json +++ b/languages/zh.json @@ -11,6 +11,7 @@ "chinese": "中文", "german": "德语", "french": "法语", + "hindi": "印地语", "help_text": "选择您喜欢的界面语言。", "restart_notice": "语言更改将在重启应用程序后生效。" }, diff --git a/src/gui/ytsage_gui_format_table.py b/src/gui/ytsage_gui_format_table.py index f04f86b..c95f9e5 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", "सर्वोत्तम"]): 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é", "उच्च", "उच्च ऑडियो"]): 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", "मध्यम", "मध्यम ऑडियो"]): 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", "निम्न", "निम्न ऑडियो", "निम्न गुणवत्ता"]): 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 5826694..a424c29 100644 --- a/src/utils/ytsage_localization.py +++ b/src/utils/ytsage_localization.py @@ -86,7 +86,8 @@ class LocalizationManager: "russian": "Русский (Russian)", "chinese": "中文 (简体) (Chinese Simplified)", "german": "Deutsch (German)", - "french": "Français (French)" + "french": "Français (French)", + "hindi": "हिन्दी (Hindi)" }, "download": { "preparing": "🚀 Preparing your download...",