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