Files
proxycast/scripts/translate_all.py
T
budi 157db3fd78 fix: improve i18n translations and fix DOM replacement order
- Fixed 20 translation entries with concatenated words and incorrect formatting
- Fixed critical bug in DOM replacer that caused partial translations
- Sort translation patches by length (longest first) to prevent substring replacement issues
- Fixed TypeScript and ESLint errors
- Added comprehensive documentation of fixes
2026-01-08 04:32:05 +07:00

1500 lines
63 KiB
Python

#!/usr/bin/env python3
"""
Comprehensive AI-Assisted Translation Script
Translates all [TODO: Translate] entries from Chinese to English
"""
import json
import re
from pathlib import Path
EN_FILE = Path(__file__).parent.parent / 'src' / 'i18n' / 'patches' / 'en.json'
# Comprehensive translation dictionary organized by context
TRANSLATIONS = {
# === Core Actions ===
"加载": "Load", "已加载": "Loaded", "加载中": "Loading", "加载完成": "Loading complete",
"加载失败": "Failed to load", "保存": "Save", "已保存": "Saved", "保存中": "Saving",
"保存失败": "Failed to save", "删除": "Delete", "已删除": "Deleted", "删除失败": "Failed to delete",
"添加": "Add", "已添加": "Added", "编辑": "Edit", "已编辑": "Edited",
"取消": "Cancel", "确认": "Confirm", "确定": "OK", "关闭": "Close",
"打开": "Open", "刷新": "Refresh", "重置": "Reset", "清空": "Clear All",
"清除": "Clear", "复制": "Copy", "已复制": "Copied", "粘贴": "Paste",
"搜索": "Search", "过滤": "Filter", "排序": "Sort", "导入": "Import",
"导出": "Export", "上传": "Upload", "下载": "Download", "发送": "Send",
"创建": "Create", "更新": "Update", "修改": "Modify", "查看": "View",
"选择": "Select", "输入": "Input", "输出": "Output",
# === Status & Messages ===
"成功": "Success", "失败": "Failed", "错误": "Error", "警告": "Warning",
"提示": "Tips", "信息": "Information", "详情": "Details", "帮助": "Help",
"处理中": "Processing", "已完成": "Completed", "进行中": "In Progress",
"等待": "Waiting", "暂无": "None", "未知": "Unknown", "其他": "Other",
"正常": "Normal", "异常": "Abnormal", "启用": "Enable", "禁用": "Disable",
# === Common UI ===
"设置": "Settings", "配置": "Configuration", "选项": "Options",
"关于": "About", "版本": "Version", "更新": "Update", "检查": "Check",
"列表": "List", "表格": "Table", "图表": "Chart", "视图": "View",
"模式": "Mode", "类型": "Type", "状态": "Status", "名称": "Name",
"描述": "Description", "标签": "Tags", "分类": "Category",
"管理": "Manage", "操作": "Actions", "工具": "Tools", "功能": "Features",
# === Input/Output ===
"输入": "Input", "输出": "Output", "请输入": "Please enter",
"输入框": "Input box", "文本": "Text", "内容": "Content",
"消息": "Message", "数据": "Data", "文件": "File", "图片": "Image",
# === Navigation ===
"返回": "Back", "下一步": "Next", "上一步": "Previous", "完成": "Complete",
"跳过": "Skip", "继续": "Continue", "展开": "Expand", "收起": "Collapse",
"显示": "Show", "隐藏": "Hide", "全部": "All", "更多": "More",
"左侧": "Left", "右侧": "Right", "顶部": "Top", "底部": "Bottom",
# === Time & Date ===
"时间": "Time", "日期": "Date", "创建时间": "Created at",
"更新时间": "Updated at", "最近": "Recent", "历史": "History",
"小时": "hour", "天": "day", "分钟": "minute", "秒": "second",
"小时前": "hours ago", "天前": "days ago",
# === Model & AI ===
"模型": "Model", "提供商": "Provider", "凭证": "Credentials",
"API": "API", "密钥": "Key", "令牌": "Token", "认证": "Authentication",
"请求": "Request", "响应": "Response", "延迟": "Latency",
# === Flow Monitor ===
"加载差异失败": "Failed to load diff",
"配置面板": "Configuration panel",
"差异摘要": "Diff summary",
"对比": "Compare",
"并排": "Side by side",
"统一": "Unified",
"显示差异": "Show differences",
"显示全部": "Show all",
"忽略空白": "Ignore whitespace",
"请求差异": "Request diff",
"响应差异": "Response diff",
"元数据差异": "Metadata diff",
"无差异": "No differences",
"两个": "Two",
"完全相同": "are identical",
"修改的字段": "Modified fields",
"删除的字段": "Deleted fields",
"新增的字段": "Added fields",
"修改的消息": "Modified messages",
"删除的消息": "Deleted messages",
"新增的消息": "Added messages",
"不自动请求权限": "Don't auto-request permissions",
"让用户手动控制": "Let user control manually",
"暂无数据": "No data",
"尝试调整过滤条件": "Try adjusting filter conditions",
"或": "or",
"清除过滤": "clear filters",
"查看所有记录": "to view all records",
"加载更多数据": "Load more data",
"已加载全部": "All loaded",
"条记录": "records",
"点击查看详情": "Click to view details",
"双击复制": "Double-click to copy",
"内容预览": "Content preview",
"响应内容预览": "Response content preview",
"已复制请求": "Request copied",
"复制为": "Copy as",
"导出为": "Export as",
"正在获取统计数据": "Fetching statistics",
"获取到的基础统计数据": "Retrieved basic statistics",
"个模型未显示": "models not shown",
"图例": "Legend",
"暂无时间线数据": "No timeline data",
"请求时间线": "Request timeline",
"时间分布": "Time distribution",
"进度条": "Progress bar",
"拦截的": "Intercepted",
"不存在或已处理": "does not exist or already processed",
"方法": "Method",
"路径": "Path",
"加载拦截配置失败": "Failed to load intercept configuration",
"加载拦截列表失败": "Failed to load intercept list",
"拦截器已启用": "Interceptor enabled",
"等待匹配的": "Waiting for matching",
"加载通知配置失败": "Failed to load notification configuration",
"更新通知配置失败": "Failed to update notification configuration",
"测试按钮": "Test button",
"发送测试通知": "Send test notification",
"预设": "Preset",
"加载快速过滤器失败": "Failed to load quick filters",
"编辑快速过滤器": "Edit quick filter",
"过滤器": "Filter",
"多获取一个": "Fetch one more",
"因为可能包含当前": "because it may contain current",
"没有指定要重放的": "No specified to replay",
"重放失败": "Replay failed",
"重放成功": "Replay successful",
"查看重放结果": "View replay result",
"更新会话失败": "Failed to update session",
"归档操作失败": "Failed to archive",
"响应预览": "Response preview",
"评论": "Comments",
"加载会话列表失败": "Failed to load session list",
"创建会话失败": "Failed to create session",
"会话": "Session",
"包含": "Contains",
"结构化数据格式": "Structured data format",
"适合报告": "suitable for reports",
# === FlowFilters ===
"过滤模式切换": "Filter mode toggle",
"流式传输中": "Streaming",
"已取消": "Cancelled",
# === Provider & Credentials ===
"目标": "Target",
"路由规则": "Routing rules",
"负载均衡策略": "Load balancing strategy",
"注入参数": "Injected parameters",
# === Flow Monitor (Extended) ===
"流式响应": "Streaming response",
"流式传输": "Streaming",
"流式接收": "Streaming receive",
"流式传输中": "Streaming",
"状态过滤": "Status filter",
"特性": "Features",
"标签过滤": "Tag filter",
"请求耗时": "Request duration",
"首字节到达": "First byte arrival",
"响应完成": "Response complete",
"时间点标记": "Time point markers",
"请求发送": "Request sent",
"等待响应": "Waiting for response",
"响应接收": "Response received",
"监控和分析": "Monitor and analyze",
"提供详细的流量分析和调试功能": "Provides detailed traffic analysis and debugging features",
"提供详细的流量分析": "Provides detailed traffic analysis",
"修改和管理系统机器码": "Modify and manage system machine ID",
"支持跨平台操作": "Supports cross-platform operations",
"多凭证池管理": "Multi-credential pool management",
"自动轮换": "Auto-rotation",
"等主流": "and other mainstream",
"主流": "Mainstream",
"插件扩展": "Plugin extensions",
"按需安装": "Install on demand",
"监控和分析网络请求": "Monitor and analyze network requests",
"在多个设备间同步": "Sync across multiple devices",
"更多实用工具正在开发中": "More utility tools are under development",
"响应流量": "Response traffic",
"视图切换": "View toggle",
"窗口大小调整下拉菜单": "Window size adjustment dropdown",
# === Provider & Relay ===
"等客户端": "and other clients",
"数量验证": "Quantity validation",
"总数应至少为": "Total should be at least",
"分组应有": "Group should have",
"国内": "Domestic",
# === OAuth & Auth ===
"请重启应用后重试": "Please restart the app and try again",
"登录超时": "Login timeout",
"授权流程超时": "Authorization flow timeout",
"请在": "Please",
"分钟内完成登录操作": "complete login within minutes",
"请重试登录": "Please retry login",
"请尝试使用系统浏览器模式": "Please try using system browser mode",
"检查是否有浏览器扩展干扰了登录流程": "Check if browser extensions are interfering with login flow",
"授权成功但": "Authorization successful but",
"可能是服务器暂时不可用": "Server may be temporarily unavailable",
# === Common Patterns ===
"个": "items",
"条": "records",
"次": "times",
"项": "items",
"位": "digits",
"个模型": "models",
"个文件": "files",
"个凭证": "credentials",
"个工具": "tools",
"个插件": "plugins",
"个过滤器": "filters",
"条记录": "records",
# === Directions & Positions ===
"上": "Up",
"下": "Down",
"左": "Left",
"右": "Right",
"前": "Front",
"后": "Back",
"中": "Middle",
"内": "Inside",
"外": "Outside",
# === Size & Quantity ===
"大": "Large",
"中": "Medium",
"小": "Small",
"多": "Many",
"少": "Few",
"高": "High",
"低": "Low",
# === Quality & State ===
"好": "Good",
"差": "Poor",
"新": "New",
"旧": "Old",
"快": "Fast",
"慢": "Slow",
"强": "Strong",
"弱": "Weak",
"不存在": "does not exist",
"返回列表": "Back to list",
"代码模式": "Code mode",
"显示原始": "Show raw",
"标签页": "Tabs",
"元数据": "Metadata",
"时间线": "Timeline",
"导出状态提示": "Export status prompt",
"正在导出": "Exporting",
"可选": "Optional",
"必填": "Required",
"默认": "Default",
"自定义": "Custom",
"标准": "Standard",
"高级": "Advanced",
"基础": "Basic",
# === Additional Base Words ===
"拦截": "Intercept",
"归档": "Archive",
"认证": "Authentication",
"粘贴": "Paste",
"检查": "Check",
"起个名字": "give it a name",
"给这个": "Give this",
"开头": "start with",
"必须以": "Must start with",
"安装": "Install",
"本地": "Local",
"直接": "Direct",
"下载": "Download",
"链接": "Link",
"即将推出": "Coming soon",
"功能": "Feature",
"检查更新": "Check for updates",
"重新抛出": "Re-throw",
"以便": "so that",
"显示": "display",
"该": "This",
"没有提供": "does not provide",
"行为": "behavior",
"参数": "parameters",
"此": "This",
"暂无": "No",
"可配置的": "configurable",
"设置项": "settings",
"不允许": "not allowed",
"关闭": "close",
"结果": "result",
"方式": "method",
"格式的": "format",
"或其他": "or other",
"更新": "Update",
"刷新": "Refresh",
"最后": "Last",
"使用": "Use",
"内容": "content",
"模态框": "modal",
"头部": "header",
"已配置的": "Configured",
"开始": "Start",
"配置": "Configure",
"自定义": "custom",
"项": "items",
"无效": "invalid",
"格式": "format",
"点击": "Click",
"卸载": "Uninstall",
"确认": "Confirm",
"对话框": "dialog",
"终端": "Terminal",
"模拟器": "emulator",
"支持": "Support",
"多": "Multiple",
"标签页": "tabs",
"和": "and",
"搜索": "search",
"功能": "features",
"最后使用": "Last used",
"格式无效": "Invalid format",
"粘贴凭证": "Paste credentials",
"给这个凭证起个名字": "Give this credential a name",
"凭证已删除": "Credential deleted",
"点击": "Click",
"开始配置": "Start configuration",
"该插件没有提供自定义": "This plugin does not provide custom",
"配置插件的行为和参数": "Configure plugin behavior and parameters",
"此插件暂无可配置的设置项": "This plugin has no configurable settings",
"添加凭证模态框": "Add credential modal",
"安装中不允许关闭": "Cannot close during installation",
"安装结果显示": "Installation result display",
"安装方式选择": "Installation method selection",
"本地文件安装": "Local file installation",
"或其他直接下载链接": "or other direct download links",
"检查更新功能即将推出": "Check for updates feature coming soon",
"卸载确认对话框": "Uninstall confirmation dialog",
"终端模拟器": "Terminal emulator",
"支持多标签页和搜索功能": "Supports multiple tabs and search features",
# === Batch 2: Common Phrases ===
"状态概览": "Status overview",
"插件系统": "Plugin system",
"重新加载插件": "Reload plugins",
"通过安装器安装的": "Installed via installer",
"按钮添加新插件": "button to add new plugin",
"安装对话框": "Installation dialog",
"无描述": "No description",
"卸载插件": "Uninstall plugin",
"作者": "Author",
"钩子": "Hooks",
"执行次数": "Execution count",
"错误次数": "Error count",
"超时时间": "Timeout",
"管理和配置": "Manage and configure",
"内置插件组件渲染": "Built-in plugin component rendering",
"应该正确渲染": "Should render correctly",
"应该为未知插件显示": "Should display for unknown plugin",
"插件未找到": "Plugin not found",
"应该为空字符串": "Should be empty string",
"应该为随机": "Should be random",
"大小写敏感性": "Case sensitivity",
"应该区分大小写": "Should be case sensitive",
"应该显示未找到": "Should display not found",
"无法加载插件": "Cannot load plugin",
"的用户界面": "user interface",
"此操作将删除插件文件和相关配置": "This operation will delete plugin files and related configuration",
"无法撤销": "Cannot be undone",
"无法删除已启用的提示词": "Cannot delete enabled prompt",
"输入系统提示词内容": "Enter system prompt content",
"管理不同应用的系统提示词": "Manage system prompts for different applications",
"工具的系统提示词": "System prompt for tools",
"定义": "Define",
"的行为和风格": "behavior and style",
"可创建多个提示词模板": "Can create multiple prompt templates",
"一键切换不同场景": "One-click switch between different scenarios",
"如代码审查": "such as code review",
"文档编写等": "documentation writing, etc.",
"个提示词": "prompts",
"当前启用": "Currently enabled",
"创建第一个": "Create first",
"创建新的提示词": "Create new prompt",
"新建提示词": "New prompt",
"编辑提示词": "Edit prompt",
"现在有自己的表单": "now has its own form",
"留空使用默认": "Leave empty to use default",
"或输入自定义代理地址": "or enter custom proxy address",
"排除模型": "Exclude models",
"获取授权": "Get authorization",
"授权": "Authorization",
"获取设备码": "Get device code",
"根据类型渲染不同表单": "Render different forms based on type",
"配置已保存": "Configuration saved",
"集成": "Integration",
"的路由和模型映射": "routing and model mapping",
"消息提示": "Message prompt",
"上游": "Upstream",
"管理端点的上游服务器地址": "Manage upstream server address for endpoint",
"限制管理端点为本地访问": "Restrict management endpoint to local access",
"仅允许": "Only allow",
"访问": "access",
"管理端点": "Management endpoint",
"模型映射": "Model mapping",
"将不可用的模型请求映射到可用的替代模型": "Map unavailable model requests to available alternative models",
"源模型": "Source model",
"目标模型": "Target model",
"添加模型映射": "Add model mapping",
"表单验证": "Form validation",
"有效表单验证": "Valid form validation",
"有效的表单状态应通过验证": "Valid form state should pass validation",
"有效的表单状态": "Valid form state",
"缺少名称验证": "Missing name validation",
"缺少名称的表单": "Form missing name",
"缺少": "Missing",
"验证": "Validation",
"的表单应返回": "form should return",
"的表单": "form",
"名称长度验证": "Name length validation",
"名称超过": "Name exceeds",
"名称正好": "Name exactly",
"个字符应通过验证": "characters should pass validation",
"多个缺失字段验证": "Multiple missing fields validation",
"兼容": "Compatible",
"百川智能": "Baichuan AI",
"名称不能为空": "Name cannot be empty",
"名称不能超过": "Name cannot exceed",
"个字符": "characters",
"不能为空": "Cannot be empty",
"默认使用": "Use by default",
"添加自定义": "Add custom",
"搜索厂商": "Search provider",
"快速选择厂商": "Quick select provider",
"或直接手动填写下方表单": "or manually fill in the form below",
"大多数第三方": "Most third-party",
"服务使用": "services use",
"兼容格式": "compatible format",
"从未使用": "Never used",
"别名或掩码": "Alias or mask",
"总使用次数": "Total usage count",
"调用错误次数": "Call error count",
"最后使用时间": "Last used time",
"等工具": "and other tools",
"导出的报告将包含当前时间范围内的所有统计数据": "Exported report will contain all statistics for current time range",
"包括请求趋势": "including request trends",
"延迟直方图等": "latency histograms, etc.",
"文件系统访问": "File system access",
"数据库访问": "Database access",
"自定义配置": "Custom configuration",
"成功导入": "Successfully imported",
"服务器配置": "Server configuration",
"没有找到": "Not found",
"配置可导入": "configuration available for import",
"同步完成": "Sync complete",
"请输入服务器名称": "Please enter server name",
"无法保存": "Cannot save",
"同步到外部应用": "Sync to external apps",
"从外部导入按钮": "Import from external button",
"从外部应用导入": "Import from external apps",
"全部导入": "Import all",
"同步到外部按钮": "Sync to external button",
"同步配置到所有外部应用": "Sync configuration to all external apps",
"同步": "Sync",
"什么是": "What is",
"工具扩展协议": "Tool extension protocol",
"能访问文件系统": "Can access file system",
"数据库等外部资源": "databases and other external resources",
"在此添加": "Add here",
"服务器后": "After server",
"可同步到": "Can sync to",
"也可从这些工具导入已有的": "Can also import existing from these tools",
"统一管理": "Unified management",
"主内容区域": "Main content area",
"左右分栏": "Left-right split",
"左侧列表": "Left list",
"服务器列表": "Server list",
"新建": "New",
"启用的应用标签": "Enabled app tags",
"右侧编辑面板": "Right edit panel",
"选择一个": "Select one",
"服务器进行编辑": "server to edit",
"或点击": "or click",
"添加新的服务器": "add new server",
"仅新建时显示": "Show only when creating new",
"名称和描述": "Name and description",
"横排": "Horizontal",
"服务器名称": "Server name",
"可选描述": "Optional description",
"同步到哪些应用": "Sync to which apps",
"同步到": "Sync to",
"服务器吗": "server",
# === Batch 3: UI & Form Elements ===
"点击禁用": "Click to disable",
"点击启用": "Click to enable",
"删除按钮": "Delete button",
"删除此": "Delete this",
"标题和添加按钮": "Title and add button",
"添加表单": "Add form",
"别名输入": "Alias input",
"别名": "Alias",
"主账号": "Main account",
"测试账号": "Test account",
"点击上方": "Click above",
"按钮添加第一个": "button to add first",
"选中的": "Selected",
"应与设置面板显示的": "should match what's displayed in settings panel",
"设置面板应显示该": "Settings panel should display this",
"设置面板应显示空状态": "Settings panel should display empty state",
"选中状态变化时应保持同步": "Should stay in sync when selection state changes",
"边界情况": "Edge cases",
"空字符串": "Empty string",
"应被视为有效选择": "should be treated as valid selection",
"应被视为不同步": "should be treated as out of sync",
"一个为": "One is",
"一个不为": "One is not",
"状态提取": "State extraction",
"应正确提取选择状态": "Should correctly extract selection state",
"应处理": "Should handle",
"列表选择": "List selection",
"列表中选择任意": "Select any from list",
"应同步到设置面板": "Should sync to settings panel",
"切换选择不同": "Switch to select different",
"应正确同步": "Should sync correctly",
"没有可用的": "No available",
"没有启用的": "No enabled",
"设置面板": "Settings panel",
"确认对话框": "Confirmation dialog",
"导入导出对话框": "Import/Export dialog",
"检查连接": "Check connection",
"错误详情": "Error details",
"显示可用模型": "Show available models",
"可用模型": "Available models",
"强制为": "Force to",
"删除保护": "Delete protection",
"不可删除": "Cannot be deleted",
"属性应为": "Property should be",
"可删除": "Can be deleted",
"互斥": "Mutually exclusive",
"应互斥": "Should be mutually exclusive",
"属性决定删除权限": "Property determines delete permission",
"处理": "Handle",
"时仍遵循删除规则": "still follows delete rules when",
"时可删除": "can be deleted when",
"无法删除系统预设": "Cannot delete system preset",
"警告图标和提示": "Warning icon and message",
"确定要删除": "Are you sure you want to delete",
"数量警告": "Quantity warning",
"删除后将一并移除": "Will be removed together after deletion",
"无效的": "Invalid",
"导出当前": "Export current",
"配置或从文件导入配置": "configuration or import configuration from file",
"不包含实际": "Does not contain actual",
"生成导出配置": "Generate export configuration",
"或粘贴配置": "or paste configuration",
"导入结果": "Import result",
"导入完成": "Import complete",
"导入部分完成": "Import partially complete",
"类型处理正确性": "Type handling correctness",
"每个": "Each",
"字段对所有": "field for all",
"类型都是必需的": "types is required",
"类型应需要": "Type should require",
"具体": "Specific",
"类型字段验证": "Type field validation",
"类型只需要": "Type only requires",
"类型需要": "Type requires",
"所有": "All",
"类型都应被支持": "types should be supported",
"不存在的字段应返回": "Non-existent field should return",
"服务的基础": "Service base",
"项目": "Project",
"服务位置": "Service location",
"都有": "All have",
"保存状态指示": "Save state indicator",
"分组标题": "Group title",
"折叠图标": "Collapse icon",
"必须在": "Must be in",
"分组正确性": "Grouping correctness",
"应被分配到其": "Should be assigned to its",
"应正确判断": "Should correctly determine",
"是否属于指定分组": "whether it belongs to specified group",
"分组后的": "After grouping",
"总数应等于原始列表长度": "Total count should equal original list length",
"每个分组内的": "Within each group",
"应按": "Should be sorted by",
"所有有效分组都应在结果中存在": "All valid groups should exist in result",
"搜索正确性": "Search correctness",
"过滤后的": "After filtering",
"应都匹配搜索查询": "Should all match search query",
"数量应小于等于原始数量": "Count should be less than or equal to original count",
"空查询应返回所有": "Empty query should return all",
"空白查询应返回所有": "Blank query should return all",
"名称搜索应返回该": "Name search should return this",
"搜索应返回该": "Search should return this",
"搜索应不区分大小写": "Search should be case insensitive",
"应对空查询返回": "Should return for empty query",
"分组显示": "Group display",
"应被分配到": "Should be assigned to",
"应正确识别自定义": "Should correctly identify custom",
"属于": "Belongs to",
"混合列表中自定义": "Custom in mixed list",
"应只出现在": "Should only appear in",
"空的自定义": "Empty custom",
"列表应返回空的": "List should return empty",
"列表项显示完整性": "List item display completeness",
"列表项应包含图标": "List item should contain icon",
"名称和启用状态": "Name and enabled state",
"应为非空字符串": "Should be non-empty string",
"用于图标显示": "For icon display",
"名称应为非空字符串": "Name should be non-empty string",
"数量徽章正确性": "Count badge correctness",
"数量应等于": "Count should equal",
"数组长度": "Array length",
"数量应为非负整数": "Count should be non-negative integer",
"不同数量的": "Different count of",
"数组应返回": "Array should return",
"数量徽章": "Count badge",
"支持工具调用": "Supports tool calls",
"支持的模型": "Supported models",
"显示更多提示": "Show more prompt",
"设置面板字段完整性": "Settings panel field completeness",
"应为有效": "Should be valid",
"空状态处理": "Empty state handling",
"具体字段验证": "Specific field validation",
"应包含有效的分组": "Should contain valid grouping",
"应标记为": "Should be marked as",
"数组验证": "Array validation",
"应为数组": "Should be array",
"系统预设": "System preset",
"仅自定义": "Custom only",
"分隔线": "Divider",
"配置表单": "Configuration form",
"连接测试": "Connection test",
"后再进行连接测试": "before performing connection test",
"的代理": "proxy",
"通过": "Via",
"认证使用": "Authentication using",
"服务": "Service",
"按钮添加凭证": "button to add credentials",
"登录": "Login",
"点击下方按钮获取授权": "Click button below to get authorization",
"然后复制到浏览器": "Then copy to browser",
# === Batch 4: Authentication & Browser ===
"支持指纹浏览器": "Supports fingerprint browser",
"完成登录": "Complete login",
"授权成功后": "After successful authorization",
"凭证将自动保存并添加到凭证池": "Credentials will be automatically saved and added to credential pool",
"名称输入": "Name input",
"表单内容": "Form content",
"按钮区域": "Button area",
"系统浏览器选项": "System browser option",
"系统浏览器": "System browser",
"指纹浏览器选项": "Fingerprint browser option",
"指纹浏览器": "Fingerprint browser",
"指纹": "Fingerprint",
"需安装": "Requires installation",
"不可用警告图标": "Unavailable warning icon",
"授权表单": "Authorization form",
"使用浏览器": "Use browser",
"中的": "in",
"自动完成": "Auto-complete",
"无需手动复制授权码": "No need to manually copy authorization code",
"获取方式": "Acquisition method",
"登录后": "After login",
"的值": "value",
"粘贴从浏览器": "Paste from browser",
"中获取的": "obtained from",
"只需推理权限": "Only requires inference permission",
"登录表单": "Login form",
"授权成功后会自动完成": "Will auto-complete after successful authorization",
"文件导入表单": "File import form",
"导入已有的": "Import existing",
"导入凭证": "Import credentials",
"从页面复制授权码粘贴回应用": "Copy authorization code from page and paste back to app",
"云驿代理默认": "Cloud proxy default",
"留空则使用凭证文件中的配置": "Leave empty to use configuration from credential file",
"收到授权": "Received authorization",
"然后复制到浏览器完成": "Then copy to browser to complete",
"复制页面显示的授权码粘贴到下方输入框": "Copy authorization code displayed on page and paste to input box below",
"授权码输入": "Authorization code input",
"授权码": "Authorization code",
"粘贴浏览器页面显示的授权码": "Paste authorization code displayed on browser page",
"在浏览器中完成授权后": "After completing authorization in browser",
"复制页面显示的授权码": "Copy authorization code displayed on page",
"提交按钮": "Submit button",
"验证授权码": "Verify authorization code",
"认证方式选择": "Authentication method selection",
"文件导入选项": "File import option",
"进行认证": "Perform authentication",
"留空使用官方": "Leave empty to use official",
"过期": "Expired",
"授权已过期": "Authorization expired",
"用户取消登录": "User cancelled login",
"在线登录": "Online login",
"安装引导": "Installation guide",
"当选择指纹浏览器但未安装时显示": "Display when fingerprint browser is selected but not installed",
"当有错误且不在登录中时显示": "Display when there's an error and not logging in",
"登录中状态": "Logging in state",
"并输入以下代码": "and enter the following code",
"复制代码": "Copy code",
"重新打开浏览器": "Reopen browser",
"取消登录": "Cancel login",
"正在使用指纹浏览器登录": "Logging in using fingerprint browser",
"登录完成后会自动返回": "Will automatically return after login completes",
"显示登录选项": "Show login options",
"第一行": "First line",
"第二行": "Second line",
"直接粘贴": "Paste directly",
"通常包含": "Usually contains",
"登录模式不需要手动提交": "Login mode doesn't require manual submission",
"到浏览器完成登录": "to browser to complete login",
"正在等待授权回调": "Waiting for authorization callback",
"错误标题和关闭按钮": "Error title and close button",
"故障排除建议": "Troubleshooting suggestions",
"建议操作": "Suggested actions",
"使用系统浏览器": "Use system browser",
"开发模式下显示": "Display in development mode",
"正在准备安装": "Preparing installation",
"重试安装": "Retry installation",
"正在安装": "Installing",
"重新检测": "Re-detect",
"点击下方按钮获取设备码": "Click button below to get device code",
"然后在浏览器中完成": "Then complete in browser",
"登录授权": "Login authorization",
"用户码显示": "User code display",
"验证链接": "Verification link",
"检测健康": "Check health",
"凭证卡片信息完整性": "Credential card information completeness",
"凭证卡片应包含健康状态": "Credential card should contain health status",
"使用次数和操作按钮": "Usage count and action buttons",
"健康状态应为": "Health status should be",
"之一": "one of",
"使用次数应为非负整数": "Usage count should be non-negative integer",
"错误次数应为非负整数": "Error count should be non-negative integer",
"凭证应包含刷新": "Credentials should contain refresh",
"所有凭证应包含基本操作按钮": "All credentials should contain basic action buttons",
"健康凭证": "Healthy credentials",
"应显示为": "Should display as",
"不健康凭证": "Unhealthy credentials",
"凭证卡片边界情况": "Credential card edge cases",
"使用次数为": "Usage count is",
"的凭证应正确显示": "credentials should display correctly",
"高使用次数的凭证应正确显示": "Credentials with high usage count should display correctly",
# === Extended Translations (Batch 1) ===
"时间戳": "Timestamp",
"请求开始": "Request start",
"请求结束": "Request end",
"响应开始": "Response start",
"响应结束": "Response end",
"总耗时": "Total duration",
"提供商信息": "Provider information",
"凭证名称": "Credential name",
"重试次数": "Retry count",
"上下文使用率": "Context usage rate",
"客户端信息": "Client information",
"路由信息": "Routing information",
"差异内容": "Diff content",
"视图模式切换": "View mode toggle",
"并排视图": "Side-by-side view",
"统一视图": "Unified view",
"配置按钮": "Configuration button",
"关闭按钮": "Close button",
"差异配置": "Diff configuration",
"忽略时间戳": "Ignore timestamps",
"忽略": "Ignore",
"差异": "Difference",
"没有差异": "No differences",
"路径头部": "Path header",
"值对比": "Value comparison",
"左侧值": "Left value",
"右侧值": "Right value",
"值显示": "Value display",
"删除的值": "Deleted value",
"新增的值": "Added value",
"消息列表没有差异": "Message list has no differences",
"左侧消息": "Left message",
"右侧消息": "Right message",
"简单过滤": "Simple filter",
"表达式": "Expression",
"仅在表达式模式显示": "Show only in expression mode",
"表达式模式": "Expression mode",
"帮助面板": "Help panel",
"当前表达式状态": "Current expression status",
"当前表达式": "Current expression",
"搜索栏": "Search bar",
"搜索内容": "Search content",
"快捷过滤器": "Quick filters",
"两种模式都显示": "Show in both modes",
"时间预设": "Time presets",
"收藏过滤": "Favorites filter",
"收起高级过滤器": "Collapse advanced filters",
"仅简单模式": "Simple mode only",
"高级过滤": "Advanced filters",
"清除过滤器": "Clear filters",
"高级过滤器面板": "Advanced filter panel",
"仅简单模式且展开时显示": "Show only in simple mode when expanded",
"提供商过滤": "Provider filter",
"范围": "Range",
"最小": "Minimum",
"最大": "Maximum",
"延迟范围": "Latency range",
"模型过滤": "Model filter",
"输入模型名称": "Enter model name",
"支持通配符": "Supports wildcards",
"等待中": "Waiting",
"查询": "Query",
"查询结果": "Query results",
"实时连接状态": "Real-time connection status",
"连接中": "Connecting",
"实时更新": "Real-time updates",
"已暂停": "Paused",
"离线": "Offline",
"活跃": "Active",
"数量": "Count",
"请求速率显示": "Request rate display",
"阈值警告数量": "Threshold warning count",
"通知设置按钮": "Notification settings button",
"通知权限被拒绝": "Notification permission denied",
"右键打开设置": "Right-click to open settings",
"点击启用通知": "Click to enable notifications",
"通知已启用": "Notifications enabled",
"通知已禁用": "Notifications disabled",
"通知": "Notifications",
"暂停": "Pause",
"恢复按钮": "Resume button",
"恢复实时更新": "Resume real-time updates",
"暂停实时更新": "Pause real-time updates",
"恢复": "Resume",
"按耗时": "By duration",
"降序": "Descending",
"升序": "Ascending",
"记录": "Records",
"分页": "Pagination",
"上一页": "Previous page",
"下一页": "Next page",
"通知设置面板": "Notification settings panel",
"主行": "Main row",
"展开按钮": "Expand button",
"状态图标": "Status icon",
"特性标记": "Feature markers",
"包含工具调用": "Contains tool calls",
"包含思维链": "Contains chain of thought",
"发生错误": "Error occurred",
"阈值警告": "Threshold warning",
"延迟超限": "Latency exceeded",
"超限": "Exceeded",
"收藏按钮": "Favorite button",
"阈值警告详情": "Threshold warning details",
"展开详情": "Expand details",
"基本信息": "Basic information",
"已导出": "Exported",
"复制请求": "Copy request",
"获取到的增强统计数据": "Retrieved enhanced statistics",
"头部工具栏": "Header toolbar",
"统计仪表板": "Statistics dashboard",
"调试按钮": "Debug button",
"调试信息": "Debug information",
"内存中没有": "Not in memory",
"创建测试数据": "Create test data",
"已创建": "Created",
"个测试": "test items",
"调试": "Debug",
"时间范围选择": "Time range selection",
"更新于": "Updated at",
"标签页切换": "Tab switching",
"概览": "Overview",
"趋势": "Trends",
"分布": "Distribution",
"概览标签页": "Overview tab",
"趋势标签页": "Trends tab",
"分布标签页": "Distribution tab",
"核心指标卡片": "Core metrics cards",
"总请求数": "Total requests",
"成功率": "Success rate",
"平均延迟": "Average latency",
"请求速率": "Request rate",
"如果有增强统计": "If enhanced statistics available",
"失败统计": "Failure statistics",
"请求状态": "Request status",
"平均输入": "Average input",
"平均输出": "Average output",
"总输入": "Total input",
"总输出": "Total output",
"按提供商分布": "Distribution by provider",
"按模型分布": "Distribution by model",
"按状态分布": "Distribution by status",
"请求趋势图": "Request trend chart",
"请求趋势": "Request trends",
"成功率趋势": "Success rate trends",
"按提供商": "By provider",
"按提供商成功率": "Success rate by provider",
"延迟直方图": "Latency histogram",
"延迟分布": "Latency distribution",
"错误分布": "Error distribution",
"轴标签": "Axis labels",
"图表区域": "Chart area",
"网格线": "Grid lines",
"数据条": "Data bars",
"时间间隔": "Time interval",
"项未显示": "items not shown",
"直方图": "Histogram",
"统计概览": "Statistics overview",
"分布条": "Distribution bars",
"详细列表": "Detailed list",
"只显示前": "Show only first",
"时间线可视化": "Timeline visualization",
"时间轴背景": "Timeline background",
"事件列表": "Event list",
"时间分布条": "Time distribution bar",
"请求发送完成": "Request sent complete",
"事件内容": "Event content",
"解析错误": "Parse error",
"请检查格式": "Please check format",
"等待处理": "Waiting for processing",
"编辑中": "Editing",
"已继续": "Continued",
"已超时": "Timed out",
"拦截请求": "Intercept request",
"拦截响应": "Intercept response",
"信息栏": "Information bar",
"已修改": "Modified",
"解析错误提示": "Parse error message",
"编辑区域": "Edit area",
"底部操作栏": "Bottom action bar",
"修改后的内容将用于继续处理": "Modified content will be used for continued processing",
"可以编辑内容后继续处理": "Can edit content and continue processing",
"取消请求": "Cancel request",
"应用修改并继续": "Apply changes and continue",
"继续处理": "Continue processing",
"无法解析": "Cannot parse",
"请切换到原始视图编辑": "Please switch to raw view to edit",
"拦截器": "Interceptor",
"个待处理": "pending items",
"快速切换按钮": "Quick toggle button",
"已启用": "Enabled",
"拦截类型选择": "Intercept type selection",
"拦截类型": "Intercept type",
"过滤表达式": "Filter expression",
"留空则拦截所有匹配类型的": "Leave empty to intercept all matching types",
"超时设置": "Timeout settings",
"超时后继续": "Continue after timeout",
"超时后取消": "Cancel after timeout",
"被拦截的": "Intercepted",
"待处理的拦截": "Pending intercepts",
"空状态": "Empty state",
"测试通知": "Test notification",
"这是一条测试通知": "This is a test notification",
"用于验证通知功能是否正常工作": "Used to verify notification functionality",
"标题栏": "Title bar",
"通知设置": "Notification settings",
"权限状态": "Permission status",
"通知权限": "Notification permission",
"已授权": "Authorized",
"已拒绝": "Denied",
"重新授权": "Re-authorize",
"请求权限": "Request permission",
"基本设置": "Basic settings",
"启用通知": "Enable notifications",
"通知类型": "Notification types",
"桌面通知": "Desktop notifications",
"声音提示": "Sound alerts",
"错误通知": "Error notifications",
"阈值警告通知": "Threshold warning notifications",
"警告通知": "Warning notifications",
"无法删除预设过滤器": "Cannot delete preset filter",
"确定要删除此过滤器吗": "Are you sure you want to delete this filter",
"没有导入任何过滤器": "No filters imported",
"可能已存在同名过滤器": "Filter with same name may already exist",
"快速过滤器": "Quick filters",
"创建过滤器": "Create filter",
"导出过滤器": "Export filters",
"导入过滤器": "Import filters",
"过滤器列表": "Filter list",
"创建第一个过滤器": "Create first filter",
"创建过滤器对话框": "Create filter dialog",
"编辑过滤器对话框": "Edit filter dialog",
"创建快速过滤器": "Create quick filter",
"输入过滤器名称": "Enter filter name",
"例如": "For example",
"等过滤器": "and other filters",
"输入过滤器描述": "Enter filter description",
"创建中": "Creating",
"同一会话": "Same session",
"相似请求": "Similar requests",
"会话信息": "Session information",
"刚刚": "Just now",
"分钟前": "minutes ago",
"批量重放": "Batch replay",
"重放": "Replay",
"重放数量提示": "Replay count prompt",
"将重放": "Will replay",
"将重放选中的": "Will replay selected",
"结果显示": "Result display",
"进度显示": "Progress display",
"重放进度": "Replay progress",
"修改请求选项": "Modify request options",
"仅单个重放时显示": "Show only for single replay",
"修改请求参数": "Modify request parameters",
"修改模型": "Modify model",
"输入新的模型名称": "Enter new model name",
"重放间隔": "Replay interval",
"避免触发速率限制": "Avoid triggering rate limits",
"重放会创建新的": "Replay will create new",
"并标记为": "and mark as",
"重放完成后可以对比原始": "After replay, can compare original",
"和重放": "and replay",
"批量重放会按顺序执行": "Batch replay will execute sequentially",
"每个请求之间有间隔": "Interval between each request",
"重放中": "Replaying",
"批量结果摘要": "Batch result summary",
"总数": "Total",
"详细结果列表": "Detailed result list",
"确定要删除此会话吗": "Are you sure you want to delete this session",
"取消归档": "Unarchive",
"归档": "Archive",
"输入会话描述": "Enter session description",
"创建于": "Created on",
"区域": "Area",
"到会话": "to session",
"搜索结果": "Search results",
"此会话暂无": "This session has no",
"添加第一个": "Add first",
"从会话移除": "Remove from session",
"时间信息": "Time information",
"会话管理": "Session management",
"创建会话": "Create session",
"搜索会话": "Search sessions",
"显示已归档": "Show archived",
"会话列表": "Session list",
"活跃会话": "Active sessions",
"创建第一个会话": "Create first session",
"已归档会话": "Archived sessions",
"创建会话对话框": "Create session dialog",
"编辑会话对话框": "Edit session dialog",
"会话名称": "Session name",
"输入会话名称": "Enter session name",
"编辑会话": "Edit session",
"等工具": "and other tools",
"导出的报告将包含当前时间范围内的所有统计数据": "Exported report will contain all statistics for current time range",
"包括请求趋势": "including request trends",
"延迟直方图等": "latency histograms, etc.",
"文件系统访问": "File system access",
"数据库访问": "Database access",
"自定义配置": "Custom configuration",
"成功导入": "Successfully imported",
"服务器配置": "Server configuration",
"没有找到": "Not found",
"配置可导入": "configuration available for import",
"同步完成": "Sync complete",
"请输入服务器名称": "Please enter server name",
"无法保存": "Cannot save",
"同步到外部应用": "Sync to external apps",
"从外部导入按钮": "Import from external button",
"从外部应用导入": "Import from external apps",
"全部导入": "Import all",
"同步到外部按钮": "Sync to external button",
"同步配置到所有外部应用": "Sync configuration to all external apps",
"同步": "Sync",
"什么是": "What is",
"工具扩展协议": "Tool extension protocol",
"能访问文件系统": "Can access file system",
"数据库等外部资源": "databases and other external resources",
"在此添加": "Add here",
"服务器后": "After server",
"可同步到": "Can sync to",
"也可从这些工具导入已有的": "Can also import existing from these tools",
"统一管理": "Unified management",
"主内容区域": "Main content area",
"左右分栏": "Left-right split",
"左侧列表": "Left list",
"服务器列表": "Server list",
"新建": "New",
"启用的应用标签": "Enabled app tags",
"右侧编辑面板": "Right edit panel",
"选择一个": "Select one",
"服务器进行编辑": "server to edit",
"或点击": "or click",
"添加新的服务器": "add new server",
"仅新建时显示": "Show only when creating new",
"名称和描述": "Name and description",
"横排": "Horizontal",
"服务器名称": "Server name",
"可选描述": "Optional description",
"同步到哪些应用": "Sync to which apps",
"同步到": "Sync to",
"服务器吗": "server",
"请等待模型数据加载": "Please wait for model data to load",
"无搜索结果": "No search results",
"未找到匹配的模型": "No matching models found",
"尝试其他搜索词": "Try other search terms",
"选中指示器": "Selection indicator",
"模型信息": "Model information",
"能力标签和操作": "Capability tags and actions",
"全部模型": "All models",
"请先添加凭证": "Please add credentials first",
"状态和能力标签": "Status and capability tags",
"视觉": "Vision",
"模式切换和刷新": "Mode toggle and refresh",
"统计信息": "Statistics",
"可用": "Available",
"刷新按钮": "Refresh button",
"等级选择器": "Tier selector",
"专家模式": "Expert mode",
"显示模型列表": "Show model list",
"简单模式": "Simple mode",
"显示当前选择": "Show current selection",
"简单": "Simple",
"专家": "Expert",
"时清除模型选择": "Clear model selection when",
"已配置凭证的": "With configured credentials",
"的模型": "models",
"请选择": "Please select",
"程序员": "Programmer",
"编程工具": "Programming tools",
"普通用户": "Regular user",
"日常使用": "Daily use",
"聊天和其他功能": "Chat and other features",
"拦截桌面应用的浏览器启动": "Intercept browser launches from desktop apps",
"支持手动复制": "Support manual copying",
"到指纹浏览器": "to fingerprint browser",
"直接跳到完成页": "Skip directly to completion page",
"开始安装": "Start installation",
"跳过安装": "Skip installation",
"设置完成": "Setup complete",
"所有插件已成功安装": "All plugins installed successfully",
"您可以开始使用": "You can start using",
"个安装失败": "installation failed",
"您可以稍后在插件中心重试": "You can retry later in Plugin Center",
"您已跳过插件安装": "You skipped plugin installation",
"可以稍后在插件中心安装需要的插件": "Can install needed plugins later in Plugin Center",
"您可以在左侧导航栏的": "You can find in the left navigation bar",
"随时安装插件": "install plugins anytime",
"开始使用": "Get started",
"等待安装": "Waiting to install",
"准备下载": "Preparing download",
"请稍候": "Please wait",
"正在为您安装选中的插件": "Installing selected plugins for you",
"已为程序员推荐配置管理和": "Configuration management recommended for programmers and",
"您可以根据需要选择插件": "You can select plugins as needed",
"或稍后在插件中心安装": "or install later in Plugin Center",
"您是哪类用户": "What type of user are you",
"欢迎使用": "Welcome to",
"聚合代理": "Aggregation proxy",
"让我们花一分钟时间": "Let's take a minute",
"根据您的使用场景推荐合适的插件": "to recommend suitable plugins based on your use case",
"提升您的使用体验": "to enhance your experience",
}
def translate_text(chinese_text, context_key=""):
"""Translate Chinese text to English based on context"""
# Direct match
if chinese_text in TRANSLATIONS:
return TRANSLATIONS[chinese_text]
# Context-based patterns (order matters - most specific first)
# Pattern: "加载X" → "Load X" / "Loading X"
if chinese_text.startswith("加载"):
rest = chinese_text[2:]
if rest in TRANSLATIONS:
return f"Load {TRANSLATIONS[rest].lower()}"
return f"Load {rest}"
# Pattern: "X失败" → "Failed to X" / "X failed"
if chinese_text.endswith("失败"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
trans = TRANSLATIONS[base]
# If it's a verb, use "Failed to X"
if trans in ["Load", "Save", "Delete", "Add", "Edit", "Update", "Create", "Import", "Export"]:
return f"Failed to {trans.lower()}"
return f"{trans} failed"
# Try to translate the base
base_trans = translate_text(base, context_key)
if base_trans:
return f"{base_trans} failed"
return f"{base} failed"
# Pattern: "X成功" → "X successful" / "X successfully"
if chinese_text.endswith("成功"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} successful"
base_trans = translate_text(base, context_key)
if base_trans:
return f"{base_trans} successful"
return f"{base} successful"
# Pattern: "已X" → "X" / "Already X" / "Xed"
if chinese_text.startswith("已"):
rest = chinese_text[1:]
if rest in TRANSLATIONS:
trans = TRANSLATIONS[rest]
# If it's a verb, add "ed" or use past tense
if trans in ["Archive", "Delete", "Add", "Edit", "Save", "Load", "Copy", "Export"]:
return f"{trans}d" if not trans.endswith("e") else f"{trans}d"
return trans
return rest
# Pattern: "X中" → "Xing" / "In progress"
if chinese_text.endswith("中"):
base = chinese_text[:-1]
if base in TRANSLATIONS:
trans = TRANSLATIONS[base]
# Add "ing" for verbs
if trans in ["Load", "Save", "Add", "Edit", "Create", "Export", "Install"]:
return f"{trans}ing" if not trans.endswith("e") else f"{trans[:-1]}ing"
return f"{trans} in progress"
return f"{base}ing"
# Pattern: "未X" → "Not X" / "Unused"
if chinese_text.startswith("未"):
rest = chinese_text[1:]
if rest in TRANSLATIONS:
return f"Not {TRANSLATIONS[rest].lower()}"
if rest == "使用":
return "Unused"
return f"Not {rest}"
# Pattern: "请X" → "Please X"
if chinese_text.startswith("请"):
rest = chinese_text[1:]
if rest in TRANSLATIONS:
return f"Please {TRANSLATIONS[rest].lower()}"
rest_trans = translate_text(rest, context_key)
if rest_trans:
return f"Please {rest_trans.lower()}"
return f"Please {rest}"
# Pattern: "暂无X" → "No X"
if chinese_text.startswith("暂无"):
rest = chinese_text[2:]
if rest in TRANSLATIONS:
return f"No {TRANSLATIONS[rest].lower()}"
return f"No {rest}"
# Pattern: "X列表" → "X list"
if chinese_text.endswith("列表"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} list"
base_trans = translate_text(base, context_key)
if base_trans:
return f"{base_trans} list"
return f"{base} list"
# Pattern: "X设置" → "X settings"
if chinese_text.endswith("设置"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} settings"
base_trans = translate_text(base, context_key)
if base_trans:
return f"{base_trans} settings"
return f"{base} settings"
# Pattern: "X模式" → "X mode"
if chinese_text.endswith("模式"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} mode"
return f"{base} mode"
# Pattern: "X类型" → "X type"
if chinese_text.endswith("类型"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} type"
return f"{base} type"
# Pattern: "X文件" → "X file"
if chinese_text.endswith("文件"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} file"
base_trans = translate_text(base, context_key)
if base_trans:
return f"{base_trans} file"
return f"{base} file"
# Pattern: "X选择器" → "X selector"
if chinese_text.endswith("选择器"):
base = chinese_text[:-3]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} selector"
return f"{base} selector"
# Pattern: "X字段" → "X field"
if chinese_text.endswith("字段"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} field"
return f"{base} field"
# Pattern: "X路径" → "X path"
if chinese_text.endswith("路径"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} path"
base_trans = translate_text(base, context_key)
if base_trans:
return f"{base_trans} path"
return f"{base} path"
# Pattern: "选择X" → "Select X"
if chinese_text.startswith("选择"):
rest = chinese_text[2:]
if rest in TRANSLATIONS:
return f"Select {TRANSLATIONS[rest].lower()}"
rest_trans = translate_text(rest, context_key)
if rest_trans:
return f"Select {rest_trans.lower()}"
return f"Select {rest}"
# Pattern: "打开X" → "Open X"
if chinese_text.startswith("打开"):
rest = chinese_text[2:]
if rest in TRANSLATIONS:
return f"Open {TRANSLATIONS[rest].lower()}"
rest_trans = translate_text(rest, context_key)
if rest_trans:
return f"Open {rest_trans.lower()}"
return f"Open {rest}"
# Pattern: "X名称" → "X name"
if chinese_text.endswith("名称"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} name"
base_trans = translate_text(base, context_key)
if base_trans:
return f"{base_trans} name"
return f"{base} name"
# Pattern: "X信息" → "X information"
if chinese_text.endswith("信息"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} information"
base_trans = translate_text(base, context_key)
if base_trans:
return f"{base_trans} information"
return f"{base} information"
# Pattern: "X错误" → "X error"
if chinese_text.endswith("错误"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} error"
return f"{base} error"
# Pattern: "X包" → "X package"
if chinese_text.endswith("包"):
base = chinese_text[:-1]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} package"
return f"{base} package"
# Pattern: "X目录" → "X directory"
if chinese_text.endswith("目录"):
base = chinese_text[:-2]
if base in TRANSLATIONS:
return f"{TRANSLATIONS[base]} directory"
base_trans = translate_text(base, context_key)
if base_trans:
return f"{base_trans} directory"
return f"{base} directory"
# Pattern: "启用X" → "Enable X"
if chinese_text.startswith("启用"):
rest = chinese_text[2:]
if rest in TRANSLATIONS:
return f"Enable {TRANSLATIONS[rest].lower()}"
rest_trans = translate_text(rest, context_key)
if rest_trans:
return f"Enable {rest_trans.lower()}"
return f"Enable {rest}"
# Pattern: "禁用X" → "Disable X"
if chinese_text.startswith("禁用"):
rest = chinese_text[2:]
if rest in TRANSLATIONS:
return f"Disable {TRANSLATIONS[rest].lower()}"
rest_trans = translate_text(rest, context_key)
if rest_trans:
return f"Disable {rest_trans.lower()}"
return f"Disable {rest}"
# Pattern: "X的Y" → "Y of X" / "X's Y"
if "的" in chinese_text:
parts = chinese_text.split("的", 1)
if len(parts) == 2:
left, right = parts
left_trans = translate_text(left, context_key) or TRANSLATIONS.get(left, left)
right_trans = translate_text(right, context_key) or TRANSLATIONS.get(right, right)
# Common patterns
if right in ["值", "内容", "配置", "设置", "信息", "状态", "名称", "类型", "列表", "文件"]:
return f"{right_trans} of {left_trans}"
return f"{left_trans}'s {right_trans}"
# Pattern: "X和Y" → "X and Y"
if "和" in chinese_text:
parts = chinese_text.split("和", 1)
if len(parts) == 2:
left, right = parts
left_trans = translate_text(left, context_key) or TRANSLATIONS.get(left, left)
right_trans = translate_text(right, context_key) or TRANSLATIONS.get(right, right)
return f"{left_trans} and {right_trans}"
# Pattern: "X或Y" → "X or Y"
if "或" in chinese_text:
parts = chinese_text.split("或", 1)
if len(parts) == 2:
left, right = parts
left_trans = translate_text(left, context_key) or TRANSLATIONS.get(left, left)
right_trans = translate_text(right, context_key) or TRANSLATIONS.get(right, right)
return f"{left_trans} or {right_trans}"
# Pattern: "X后Y" → "Y after X"
if "后" in chinese_text and not chinese_text.endswith("后"):
parts = chinese_text.split("后", 1)
if len(parts) == 2:
left, right = parts
left_trans = translate_text(left, context_key) or TRANSLATIONS.get(left, left)
right_trans = translate_text(right, context_key) or TRANSLATIONS.get(right, right)
return f"{right_trans} after {left_trans}"
# Pattern: "X中Y" → "Y in X" (when not ending with 中)
if "中" in chinese_text and not chinese_text.endswith("中"):
parts = chinese_text.split("中", 1)
if len(parts) == 2:
left, right = parts
left_trans = translate_text(left, context_key) or TRANSLATIONS.get(left, left)
right_trans = translate_text(right, context_key) or TRANSLATIONS.get(right, right)
return f"{right_trans} in {left_trans}"
# Return None if no translation found
return None
def main():
print("=" * 60)
print(" AI-Assisted Translation Script")
print("=" * 60)
print()
print(f"Loading {EN_FILE}...")
with open(EN_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
count = 0
total = sum(1 for v in data.values() if isinstance(v, str) and v.startswith('[TODO: Translate]'))
print(f"Found {total} entries to translate...")
print()
current_section = ""
for key, value in data.items():
# Track current section
if key.startswith("// ==="):
current_section = key
if isinstance(value, str) and value.startswith('[TODO: Translate]'):
chinese = value.replace('[TODO: Translate] ', '')
translation = translate_text(chinese, current_section)
if translation:
data[key] = translation
count += 1
if count % 100 == 0:
print(f"Progress: {count}/{total} ({round(count/total*100)}%)")
# Save
print()
print("Saving translations...")
with open(EN_FILE, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print()
print("=" * 60)
print(f"✓ Translation complete!")
print(f" Translated: {count} entries")
print(f" Remaining: {total - count} entries")
print(f" Coverage: {round(count/total*100 if total > 0 else 0)}%")
print("=" * 60)
if __name__ == '__main__':
main()