diff --git a/languages/en.json b/languages/en.json index 8991bbb..2becc63 100644 --- a/languages/en.json +++ b/languages/en.json @@ -8,6 +8,7 @@ "spanish": "Español (Spanish)", "portuguese": "Português (Portuguese)", "russian": "Русский (Russian)", + "chinese": "中文 (简体) (Chinese Simplified)", "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 d42a43b..78411b5 100644 --- a/languages/es.json +++ b/languages/es.json @@ -7,7 +7,8 @@ "english": "Inglés", "spanish": "Español (Spanish)", "portuguese": "Português (Portuguese)", - "russian": "Русский (Russian)" + "russian": "Русский (Russian)", + "chinese": "中文 (简体) (Chinese Simplified)" }, "app": { "title": "YTSage", diff --git a/languages/pt.json b/languages/pt.json index 8a5e27c..9692b3f 100644 --- a/languages/pt.json +++ b/languages/pt.json @@ -8,6 +8,7 @@ "spanish": "Espanhol", "portuguese": "Português", "russian": "Русский (Russian)", + "chinese": "中文 (简体) (Chinese Simplified)", "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 4c63ff6..c29b222 100644 --- a/languages/ru.json +++ b/languages/ru.json @@ -8,6 +8,7 @@ "spanish": "Испанский", "portuguese": "Португальский", "russian": "Русский", + "chinese": "中文 (简体) (Chinese Simplified)", "help_text": "Выберите предпочитаемый язык для интерфейса.", "restart_notice": "Изменение языка вступит в силу после перезапуска приложения." }, diff --git a/languages/zh.json b/languages/zh.json new file mode 100644 index 0000000..ae7910c --- /dev/null +++ b/languages/zh.json @@ -0,0 +1,329 @@ +{ + "language": { + "display_name": "中文 (简体) (Chinese Simplified)", + "select_language": "选择语言:", + "current_language": "当前语言:{language}", + "restart_required": "语言更改将在重启应用程序后生效。", + "english": "英语", + "spanish": "西班牙语", + "portuguese": "葡萄牙语", + "russian": "俄语", + "chinese": "中文", + "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": "粘贴网址", + "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": "过滤语言(例如:en, zh)...", + "no_subtitles_available": "无可用字幕", + "matching": "匹配" + }, + "tabs": { + "cookies": "使用 Cookie 登录", + "custom_command": "自定义命令", + "proxy": "代理", + "language": "语言" + }, + "cookies": { + "help_text": "选择如何提供 cookie 来登录。\n这允许下载私人视频和高级质量音频。", + "cookie_source": "Cookie 来源", + "use_cookie_file": "使用 cookie 文件", + "extract_from_browser": "从浏览器提取", + "cookie_file": "Cookie 文件", + "cookie_file_placeholder": "cookies.txt 文件路径...", + "browser_selection": "浏览器选择", + "browser_help": "选择要从中提取 cookie 的浏览器:", + "browser_label": "浏览器:", + "profile_label": "配置文件:", + "profile_placeholder": "默认", + "browser_extract_message": "应用时将提取浏览器 cookie", + "file_selected_message": "已选择 Cookie 文件 - 点击确定应用", + "select_file_title": "选择 Cookie 文件", + "file_filter": "Cookie 文件 (*.txt *.lwp)" + }, + "custom_command": { + "help_text": "在下面输入您的自定义 yt-dlp 命令。当前网址将自动附加。

有关选项和使用示例的完整列表,点击此处查看官方 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} - 视频网址\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": "代理网址:", + "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": "地理绕过代理网址:", + "geo_proxy_url_placeholder": "http://geo-proxy:port", + "clear_main_proxy": "清除主代理", + "clear_geo_proxy": "清除地理代理", + "proxy_url": "代理网址", + "proxy_placeholder": "http://proxy:port 或 socks5://proxy:port", + "geo_bypass": "地理绕过代理(用于地理限制)", + "geo_bypass_placeholder": "http://proxy:port 用于绕过地理封锁", + "invalid_main_url": "主代理网址格式无效", + "invalid_geo_url": "地理代理网址格式无效", + "main_configured": "主代理已配置", + "geo_configured": "地理代理已配置" + }, + "download": { + "preparing": "正在准备下载...", + "please_enter_url": "请先输入网址。", + "please_set_path": "请先设置下载路径。", + "please_enter_url_and_path": "请输入网址并设置下载路径。", + "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 视频或播放列表网址", + "merge_subtitles": "合并字幕", + "save_thumbnail": "保存缩略图", + "save_description": "保存描述", + "embed_chapters": "嵌入章节", + "subtitles_selected": "已选择 {count} 个", + "all_selected": "全部已选择", + "select_videos_all": "选择视频...(全部已选择)", + "please_enter_url": "请先输入网址", + "cookie_file_selected_title": "已选择 Cookie 文件", + "cookie_file_selected_message": "已选择 Cookie 文件:{path}", + "browser_cookies_selected_title": "已选择浏览器 Cookie", + "browser_cookies_selected_message": "将从以下浏览器提取 Cookie:{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 可执行文件提取信息", + "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": "未选择", + "one_selected": "已选择 1 个分类", + "count_selected": "已选择 {count} 个" + }, + "status": { + "ready": "准备就绪", + "file_exists": "⚠️ 文件已存在", + "cancelling": "正在取消下载..." + } +} \ No newline at end of file diff --git a/src/gui/ytsage_gui_format_table.py b/src/gui/ytsage_gui_format_table.py index 5ff0a66..89529d5 100644 --- a/src/gui/ytsage_gui_format_table.py +++ b/src/gui/ytsage_gui_format_table.py @@ -264,14 +264,14 @@ 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, and Russian terms) - if any(term in quality_text for term in ["Best", "Óptima", "Mejor", "Melhor", "Лучшее"]): + # Set color based on quality (check English, Spanish, Portuguese, Russian, and Chinese terms) + if any(term in quality_text for term in ["Best", "Óptima", "Mejor", "Melhor", "Лучшее", "最佳"]): quality_item.setForeground(QColor("#00ff00")) # Green for best quality - elif any(term in quality_text for term in ["High", "Alta", "Alto", "Áudio Alto", "Audio Alto", "Высокое"]): + elif any(term in quality_text for term in ["High", "Alta", "Alto", "Áudio Alto", "Audio Alto", "Высокое", "高清", "高质量"]): quality_item.setForeground(QColor("#00cc00")) # Light green for high quality - elif any(term in quality_text for term in ["Medium", "Media", "Medio", "Média", "Áudio Médio", "Audio Medio", "Среднее"]): + elif any(term in quality_text for term in ["Medium", "Media", "Medio", "Média", "Áudio Médio", "Audio Medio", "Среднее", "中等"]): quality_item.setForeground(QColor("#ffaa00")) # Orange for medium quality - elif any(term in quality_text for term in ["Low", "Baja", "Bajo", "Baixa", "Áudio Baixo", "Audio Bajo", "Низкое"]): + elif any(term in quality_text for term in ["Low", "Baja", "Bajo", "Baixa", "Áudio Baixo", "Audio Bajo", "Низкое", "低质量"]): 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 10c0b69..79a90bc 100644 --- a/src/utils/ytsage_localization.py +++ b/src/utils/ytsage_localization.py @@ -83,7 +83,8 @@ class LocalizationManager: "english": "English", "spanish": "Español (Spanish)", "portuguese": "Português (Portuguese)", - "russian": "Русский (Russian)" + "russian": "Русский (Russian)", + "chinese": "中文 (简体) (Chinese Simplified)" }, "download": { "preparing": "🚀 Preparing your download...",