diff --git a/distribution/linux/euler-copilot-shell.spec b/distribution/linux/euler-copilot-shell.spec index 49801d54674c66ce8ee5c83f1bebb2a40e09f372..b0a27fc1d5db6540d2ffc758b88e607ae22f8bc3 100644 --- a/distribution/linux/euler-copilot-shell.spec +++ b/distribution/linux/euler-copilot-shell.spec @@ -4,7 +4,7 @@ Name: euler-copilot-shell Version: 0.10.2 -Release: 1%{?dist} +Release: 1%{?dev_timestamp:.dev%{dev_timestamp}}%{?dist} Summary: openEuler Intelligence 智能命令行工具集 License: MulanPSL-2.0 URL: https://gitee.com/openeuler/euler-copilot-shell diff --git a/scripts/build/build_rpm.sh b/scripts/build/build_rpm.sh index 951e0dfb9e3e9881b81892bed506f0b201cbf3a1..f52c8b300a85b0f9bf8179b84918e9c68d72d265 100755 --- a/scripts/build/build_rpm.sh +++ b/scripts/build/build_rpm.sh @@ -2,12 +2,32 @@ # build_rpm.sh: build RPM package using the tarball created by create_tarball.sh set -euo pipefail +# Parse arguments +DEV_MODE=0 +while [[ $# -gt 0 ]]; do + case "$1" in + --dev) + DEV_MODE=1 + shift + ;; + *) + echo "Unknown parameter: $1" >&2 + echo "Usage: $0 [--dev]" >&2 + exit 1 + ;; + esac +done + # Determine script directory and repo root SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" # Create the tarball and set BUILD_DIR and TARBALL -eval "$("${SCRIPT_DIR}"/create_tarball.sh)" +if [[ ${DEV_MODE} -eq 1 ]]; then + eval "$("${SCRIPT_DIR}"/create_tarball.sh --dev)" +else + eval "$("${SCRIPT_DIR}"/create_tarball.sh)" +fi set +u if [[ -z "${BUILD_DIR:-}" || -z "${TARBALL:-}" ]]; then echo "Error: BUILD_DIR 或 TARBALL 变量未设置,create_tarball.sh 执行失败。" >&2 @@ -27,7 +47,12 @@ cp "${SPEC_FILE}" "${BUILD_DIR}/SPECS/" # Build the RPMs echo "Building RPM using topdir ${BUILD_DIR}" -rpmbuild --define "_topdir ${BUILD_DIR}" -ba "${BUILD_DIR}/SPECS/$(basename "${SPEC_FILE}")" +if [[ ${DEV_MODE} -eq 1 ]]; then + # 在 dev 模式下,传递时间戳给 rpmbuild + rpmbuild --define "_topdir ${BUILD_DIR}" --define "dev_timestamp ${TIMESTAMP}" -ba "${BUILD_DIR}/SPECS/$(basename "${SPEC_FILE}")" +else + rpmbuild --define "_topdir ${BUILD_DIR}" -ba "${BUILD_DIR}/SPECS/$(basename "${SPEC_FILE}")" +fi # Output locations echo "RPM build complete." diff --git a/scripts/build/create_tarball.sh b/scripts/build/create_tarball.sh index baeb4989d493a3590f67985130a2692777808bc5..711e65e50fa99afb9087df66b5f8c0551d9b5785 100755 --- a/scripts/build/create_tarball.sh +++ b/scripts/build/create_tarball.sh @@ -2,6 +2,22 @@ # create_tarball.sh: create a tarball of current repo for RPM build. set -euo pipefail +# Parse arguments +DEV_MODE=0 +while [[ $# -gt 0 ]]; do + case "$1" in + --dev) + DEV_MODE=1 + shift + ;; + *) + echo "Unknown parameter: $1" >&2 + echo "Usage: $0 [--dev]" >&2 + exit 1 + ;; + esac +done + # Locate spec file relative to repo root SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" @@ -11,6 +27,11 @@ SPEC_FILE="${REPO_ROOT}/distribution/linux/euler-copilot-shell.spec" NAME=$(grep -E '^Name:' "$SPEC_FILE" | awk '{print $2}') VERSION=$(grep -E '^Version:' "$SPEC_FILE" | awk '{print $2}') +# 如果是 dev 模式,添加时间戳 +if [[ ${DEV_MODE} -eq 1 ]]; then + TIMESTAMP=$(date +%Y%m%d%H%M%S) +fi + # Create build directory in repo BUILD_DIR="${REPO_ROOT}/build" mkdir -p "${BUILD_DIR}" @@ -23,3 +44,6 @@ git archive --format=tar.gz --prefix="${NAME}-${VERSION}/" -o "${BUILD_DIR}/${TA # 输出变量用于 build_rpm.sh 的 eval echo "BUILD_DIR=${BUILD_DIR}" echo "TARBALL=${TARBALL}" +if [[ ${DEV_MODE} -eq 1 ]]; then + echo "TIMESTAMP=${TIMESTAMP}" +fi diff --git a/src/app/tui.py b/src/app/tui.py index c8f4532b6331155af716766d4fe19dac56b32c31..292662c9ff5501f2d55cbc7d03c5196c4fd8efb5 100644 --- a/src/app/tui.py +++ b/src/app/tui.py @@ -1380,11 +1380,9 @@ class IntelligentTerminal(App): # 启动监控任务 monitor_task = asyncio.create_task(monitor_screen_stack()) - # 等待退出事件或超时(5分钟) + # 等待退出事件 try: - await asyncio.wait_for(exit_event.wait(), timeout=300.0) - except TimeoutError: - self.logger.warning("等待设置页面退出超时") + await exit_event.wait() finally: # 取消监控任务 if not monitor_task.done(): diff --git a/src/i18n/locales/en_US/LC_MESSAGES/messages.po b/src/i18n/locales/en_US/LC_MESSAGES/messages.po index 9502e02172b4cc0f264987f19844c551e04ff1b4..8e5ecdf708c6a62c5869239e4ed18bf90a6769f5 100644 --- a/src/i18n/locales/en_US/LC_MESSAGES/messages.po +++ b/src/i18n/locales/en_US/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: oi-cli\n" "Report-Msgid-Bugs-To: contact@openeuler.org\n" -"POT-Creation-Date: 2025-10-21 10:23+0800\n" +"POT-Creation-Date: 2025-10-21 10:54+0800\n" "PO-Revision-Date: 2025-10-20 19:28+0800\n" "Last-Translator: openEuler Intelligence Team\n" "Language-Team: English\n" @@ -154,7 +154,7 @@ msgstr "Toggle Focus" #: src/app/tui.py:255 #, python-brace-format -msgid "Intelligent CLI Tool {version}" +msgid "Intelligent CLI Assistant {version}" msgstr "Command Line Tool {version}" #: src/app/tui.py:371 @@ -266,7 +266,8 @@ msgstr "Press any key to close" #: src/app/dialogs/agent.py:60 src/app/dialogs/agent.py:130 #: src/app/dialogs/agent.py:185 src/app/dialogs/agent.py:205 -#: src/app/dialogs/agent.py:208 +#: src/app/dialogs/agent.py:208 src/tool/oi_select_agent.py:67 +#: src/tool/oi_select_agent.py:94 msgid "智能问答" msgstr "Smart Chat" @@ -474,3 +475,322 @@ msgstr "✗ Unsupported language: {locale}\n" #: src/main.py:228 msgid "Fatal error in Intelligent Shell application" msgstr "Fatal error in Intelligent Shell application" + +#: src/tool/oi_select_agent.py:29 +msgid "退出" +msgstr "Exit" + +#: src/tool/oi_select_agent.py:123 +#, python-brace-format +msgid "✓ 默认智能体已设置为: {name}\n" +msgstr "✓ Default agent set to: {name}\n" + +#: src/tool/oi_select_agent.py:125 +#, python-brace-format +msgid " App ID: {app_id}\n" +msgstr " App ID: {app_id}\n" + +#: src/tool/oi_select_agent.py:127 +msgid " 已设置为智能问答模式(无智能体)\n" +msgstr " Set to Smart Q&A mode (no agent)\n" + +#: src/tool/oi_select_agent.py:129 +msgid "已取消选择\n" +msgstr "Selection cancelled\n" + +#: src/tool/oi_select_agent.py:143 +msgid "错误: 智能体功能需要使用 openEuler Intelligence 后端\n" +msgstr "Error: Agent functionality requires openEuler Intelligence backend\n" + +#: src/tool/oi_select_agent.py:144 +msgid "请先运行以下命令切换后端:\n" +msgstr "Please run the following command to switch backend:\n" + +#: src/tool/oi_select_agent.py:145 +msgid "" +" oi # 然后按下 Ctrl+S 进入设置界面切换到 openEuler Intelligence 后端\n" +msgstr "" +" oi # Then press Ctrl+S to enter settings and switch to openEuler " +"Intelligence backend\n" + +#: src/tool/oi_select_agent.py:163 +#, python-brace-format +msgid "错误: {error}\n" +msgstr "Error: {error}\n" + +#: src/tool/oi_llm_config.py:77 +msgid "需要管理员权限才能修改 openEuler Intelligence 配置文件" +msgstr "Administrator privileges are required to modify openEuler Intelligence configuration files" + +#: src/tool/oi_llm_config.py:84 +#, python-brace-format +msgid "配置文件不存在: {path}" +msgstr "Configuration file does not exist: {path}" + +#: src/tool/oi_llm_config.py:85 +msgid "请先运行 '(sudo) oi --init' 部署后端服务" +msgstr "Please run '(sudo) oi --init' first to deploy backend services" + +#: src/tool/oi_llm_config.py:89 src/tool/oi_llm_config.py:93 +#, python-brace-format +msgid "配置文件不可写: {path}" +msgstr "Configuration file is not writable: {path}" + +#: src/tool/oi_llm_config.py:96 +#, python-brace-format +msgid "访问配置文件时权限不足: {error}" +msgstr "Insufficient permissions when accessing configuration file: {error}" + +#: src/tool/oi_llm_config.py:98 +#, python-brace-format +msgid "访问配置文件时发生错误: {error}" +msgstr "Error occurred when accessing configuration file: {error}" + +#: src/tool/oi_llm_config.py:127 +#, python-brace-format +msgid "权限不足:无法访问配置文件 {filename},请以管理员身份运行" +msgstr "Insufficient permissions: Cannot access configuration file {filename}, please run as administrator" + +#: src/tool/validators.py:135 src/tool/validators.py:584 +#: src/tool/validators.py:647 +#, python-brace-format +msgid "连接超时 - 无法在 {timeout} 秒内连接到 {endpoint}" +msgstr "Connection timeout - Unable to connect to {endpoint} within {timeout} seconds" + +#: src/tool/validators.py:140 +#, python-brace-format +msgid "LLM 配置验证失败: {error}" +msgstr "LLM configuration validation failed: {error}" + +#: src/tool/validators.py:144 +msgid "LLM 配置验证成功" +msgstr "LLM configuration validation successful" + +#: src/tool/validators.py:146 +#, python-brace-format +msgid " - 支持工具调用,类型: {func_type}" +msgstr " - Tool calling supported, type: {func_type}" + +#: src/tool/validators.py:148 +msgid " - 不支持工具调用" +msgstr " - Tool calling not supported" + +#: src/tool/validators.py:201 +msgid "无法连接到 Embedding 模型服务。" +msgstr "Unable to connect to Embedding model service." + +#: src/tool/validators.py:241 +msgid "基本对话测试失败" +msgstr "Basic chat test failed" + +#: src/tool/validators.py:244 +msgid "基本对话功能正常" +msgstr "Basic chat functionality is working" + +#: src/tool/validators.py:246 +msgid "对话响应为空" +msgstr "Chat response is empty" + +#: src/tool/validators.py:318 +msgid "不支持任何 function_call 格式" +msgstr "No function_call format is supported" + +#: src/tool/validators.py:353 +#, python-brace-format +msgid "tools 格式测试失败: {error}" +msgstr "tools format test failed: {error}" + +#: src/tool/validators.py:358 +msgid "支持 tools 格式的 function_call" +msgstr "tools format function_call is supported" + +#: src/tool/validators.py:360 +msgid "不支持工具调用功能" +msgstr "Tool calling functionality is not supported" + +#: src/tool/validators.py:401 +#, python-brace-format +msgid "structured_output 格式测试失败: {error}" +msgstr "structured_output format test failed: {error}" + +#: src/tool/validators.py:409 +msgid "structured_output 响应不是有效 JSON" +msgstr "structured_output response is not valid JSON" + +#: src/tool/validators.py:411 +msgid "支持 structured_output 格式" +msgstr "structured_output format is supported" + +#: src/tool/validators.py:413 +msgid "structured_output 响应为空" +msgstr "structured_output response is empty" + +#: src/tool/validators.py:439 +#, python-brace-format +msgid "json_mode 格式测试失败: {error}" +msgstr "json_mode format test failed: {error}" + +#: src/tool/validators.py:447 +msgid "json_mode 响应不是有效 JSON" +msgstr "json_mode response is not valid JSON" + +#: src/tool/validators.py:449 +msgid "支持 json_mode 格式" +msgstr "json_mode format is supported" + +#: src/tool/validators.py:451 +msgid "json_mode 响应为空" +msgstr "json_mode response is empty" + +#: src/tool/validators.py:499 +msgid "支持 vLLM 结构化输出(部分支持)" +msgstr "vLLM structured output is supported (partial support)" + +#: src/tool/validators.py:504 +#, python-brace-format +msgid "不支持 vLLM guided_json 格式: {error}" +msgstr "vLLM guided_json format is not supported: {error}" + +#: src/tool/validators.py:508 +msgid "vLLM guided_json 响应无效" +msgstr "vLLM guided_json response is invalid" + +#: src/tool/validators.py:555 +msgid "支持 Ollama function_call 格式" +msgstr "Ollama function_call format is supported" + +#: src/tool/validators.py:558 +#, python-brace-format +msgid "不支持 Ollama function_call 格式: {error}" +msgstr "Ollama function_call format is not supported: {error}" + +#: src/tool/validators.py:561 +msgid "Ollama function_call 响应无效" +msgstr "Ollama function_call response is invalid" + +#: src/tool/validators.py:589 +#, python-brace-format +msgid "OpenAI Embedding 配置验证失败: {error}" +msgstr "OpenAI Embedding configuration validation failed: {error}" + +#: src/tool/validators.py:598 +#, python-brace-format +msgid "OpenAI Embedding 配置验证成功 - 维度: {dimension}" +msgstr "OpenAI Embedding configuration validation successful - Dimension: {dimension}" + +#: src/tool/validators.py:606 +msgid "OpenAI Embedding 响应为空" +msgstr "OpenAI Embedding response is empty" + +#: src/tool/validators.py:634 +#, python-brace-format +msgid "MindIE Embedding 配置验证成功 - 维度: {dimension}" +msgstr "MindIE Embedding configuration validation successful - Dimension: {dimension}" + +#: src/tool/validators.py:644 +msgid "MindIE Embedding 响应格式不正确" +msgstr "MindIE Embedding response format is incorrect" + +#: src/tool/validators.py:652 +#, python-brace-format +msgid "MindIE Embedding 配置验证失败: {error}" +msgstr "MindIE Embedding configuration validation failed: {error}" + +#: src/tool/validators.py:674 +msgid "服务 URL 必须以 http:// 或 https:// 开头" +msgstr "Service URL must start with http:// or https://" + +#: src/tool/validators.py:685 +msgid "访问令牌格式无效" +msgstr "Access token format is invalid" + +#: src/tool/validators.py:710 +msgid "服务返回的数据格式不正确" +msgstr "Service returned data in incorrect format" + +#: src/tool/validators.py:716 +msgid "连接成功" +msgstr "Connection successful" + +#: src/tool/validators.py:718 +#, python-brace-format +msgid "服务返回错误代码: {code}" +msgstr "Service returned error code: {code}" + +#: src/tool/validators.py:721 +msgid "无法连接到服务,请检查 URL 和网络连接" +msgstr "Unable to connect to service, please check URL and network connection" + +#: src/tool/validators.py:723 +msgid "连接超时,请检查网络连接或服务状态" +msgstr "Connection timeout, please check network connection or service status" + +#: src/tool/validators.py:726 +#, python-brace-format +msgid "连接验证失败: {error}" +msgstr "Connection validation failed: {error}" + +#: src/tool/validators.py:732 +msgid "访问令牌无效或已过期" +msgstr "Access token is invalid or expired" + +#: src/tool/validators.py:733 +msgid "访问权限不足" +msgstr "Insufficient access permissions" + +#: src/tool/validators.py:734 +msgid "API 接口不存在,请检查服务版本" +msgstr "API interface does not exist, please check service version" + +#: src/tool/validators.py:737 +#, python-brace-format +msgid "服务响应异常,状态码: {status_code}" +msgstr "Service response error, status code: {status_code}" + +#: src/tool/command_processor.py:56 +msgid "请输入有效命令或问题。" +msgstr "Please enter a valid command or question." + +#: src/tool/command_processor.py:75 +msgid "检测到不安全命令,已阻止执行。" +msgstr "Unsafe command detected, execution blocked." + +#: src/tool/command_processor.py:135 +msgid "[命令启动失败] 无法创建子进程" +msgstr "[Command start failed] Unable to create subprocess" + +#: src/tool/command_processor.py:136 +#, python-brace-format +msgid "无法启动命令 '{command}',请分析可能原因并给出解决建议。" +msgstr "Unable to start command '{command}', please analyze possible causes and provide solutions." + +#: src/tool/command_processor.py:165 +#, python-brace-format +msgid "" +"\n" +"[命令完成] 退出码: {returncode}" +msgstr "" +"\n" +"[Command completed] Exit code: {returncode}" + +#: src/tool/command_processor.py:183 +#, python-brace-format +msgid "[命令失败] 退出码: {returncode}" +msgstr "[Command failed] Exit code: {returncode}" + +#: src/tool/command_processor.py:188 +#, python-brace-format +msgid "" +"命令 '{command}' 以非零状态 {returncode} 退出。\n" +"标准错误输出如下:\n" +"{stderr_text}\n" +"请分析原因并提供解决建议。" +msgstr "" +"Command '{command}' exited with non-zero status {returncode}.\n" +"Standard error output:\n" +"{stderr_text}\n" +"Please analyze the cause and provide solutions." + +#: src/tool/command_processor.py:206 +msgid "读取 stderr 失败" +msgstr "Failed to read stderr" diff --git a/src/i18n/locales/zh_CN/LC_MESSAGES/messages.po b/src/i18n/locales/zh_CN/LC_MESSAGES/messages.po index ed9d1471cd93ce4bc698dc2dec8908d5bc1f858a..c0926a41829e5e31f074479285352f96dc871228 100644 --- a/src/i18n/locales/zh_CN/LC_MESSAGES/messages.po +++ b/src/i18n/locales/zh_CN/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: oi-cli\n" "Report-Msgid-Bugs-To: contact@openeuler.org\n" -"POT-Creation-Date: 2025-10-21 10:23+0800\n" +"POT-Creation-Date: 2025-10-21 10:54+0800\n" "PO-Revision-Date: 2025-10-21 09:40+0800\n" "Last-Translator: openEuler Intelligence Team\n" "Language-Team: Chinese (Simplified)\n" @@ -154,8 +154,8 @@ msgstr "切换焦点" #: src/app/tui.py:255 #, python-brace-format -msgid "Intelligent CLI Tool {version}" -msgstr "智能命令行工具 {version}" +msgid "Intelligent CLI Assistant {version}" +msgstr "智能命令行助手 {version}" #: src/app/tui.py:371 msgid "[Cancelled]" @@ -265,7 +265,8 @@ msgstr "按任意键关闭" #: src/app/dialogs/agent.py:60 src/app/dialogs/agent.py:130 #: src/app/dialogs/agent.py:185 src/app/dialogs/agent.py:205 -#: src/app/dialogs/agent.py:208 +#: src/app/dialogs/agent.py:208 src/tool/oi_select_agent.py:67 +#: src/tool/oi_select_agent.py:94 msgid "智能问答" msgstr "智能问答" @@ -469,3 +470,321 @@ msgstr "✗ 不支持的语言: {locale}\n" #: src/main.py:228 msgid "Fatal error in Intelligent Shell application" msgstr "智能 Shell 应用发生致命错误" + +#: src/tool/oi_select_agent.py:29 +msgid "退出" +msgstr "退出" + +#: src/tool/oi_select_agent.py:123 +#, python-brace-format +msgid "✓ 默认智能体已设置为: {name}\n" +msgstr "✓ 默认智能体已设置为: {name}\n" + +#: src/tool/oi_select_agent.py:125 +#, python-brace-format +msgid " App ID: {app_id}\n" +msgstr " App ID: {app_id}\n" + +#: src/tool/oi_select_agent.py:127 +msgid " 已设置为智能问答模式(无智能体)\n" +msgstr " 已设置为智能问答模式(无智能体)\n" + +#: src/tool/oi_select_agent.py:129 +msgid "已取消选择\n" +msgstr "已取消选择\n" + +#: src/tool/oi_select_agent.py:143 +msgid "错误: 智能体功能需要使用 openEuler Intelligence 后端\n" +msgstr "错误: 智能体功能需要使用 openEuler Intelligence 后端\n" + +#: src/tool/oi_select_agent.py:144 +msgid "请先运行以下命令切换后端:\n" +msgstr "请先运行以下命令切换后端:\n" + +#: src/tool/oi_select_agent.py:145 +msgid "" +" oi # 然后按下 Ctrl+S 进入设置界面切换到 openEuler Intelligence 后端\n" +msgstr "" +" oi # 然后按下 Ctrl+S 进入设置界面切换到 openEuler Intelligence 后端\n" + +#: src/tool/oi_select_agent.py:163 +#, python-brace-format +msgid "错误: {error}\n" +msgstr "错误: {error}\n" + +#: src/tool/oi_llm_config.py:77 +msgid "需要管理员权限才能修改 openEuler Intelligence 配置文件" +msgstr "需要管理员权限才能修改 openEuler Intelligence 配置文件" + +#: src/tool/oi_llm_config.py:84 +#, python-brace-format +msgid "配置文件不存在: {path}" +msgstr "配置文件不存在: {path}" + +#: src/tool/oi_llm_config.py:85 +msgid "请先运行 '(sudo) oi --init' 部署后端服务" +msgstr "请先运行 '(sudo) oi --init' 部署后端服务" + +#: src/tool/oi_llm_config.py:89 src/tool/oi_llm_config.py:93 +#, python-brace-format +msgid "配置文件不可写: {path}" +msgstr "配置文件不可写: {path}" + +#: src/tool/oi_llm_config.py:96 +#, python-brace-format +msgid "访问配置文件时权限不足: {error}" +msgstr "访问配置文件时权限不足: {error}" + +#: src/tool/oi_llm_config.py:98 +#, python-brace-format +msgid "访问配置文件时发生错误: {error}" +msgstr "访问配置文件时发生错误: {error}" + +#: src/tool/oi_llm_config.py:127 +#, python-brace-format +msgid "权限不足:无法访问配置文件 {filename},请以管理员身份运行" +msgstr "权限不足:无法访问配置文件 {filename},请以管理员身份运行" + +#: src/tool/validators.py:135 src/tool/validators.py:584 +#: src/tool/validators.py:647 +#, python-brace-format +msgid "连接超时 - 无法在 {timeout} 秒内连接到 {endpoint}" +msgstr "连接超时 - 无法在 {timeout} 秒内连接到 {endpoint}" + +#: src/tool/validators.py:140 +#, python-brace-format +msgid "LLM 配置验证失败: {error}" +msgstr "LLM 配置验证失败: {error}" + +#: src/tool/validators.py:144 +msgid "LLM 配置验证成功" +msgstr "LLM 配置验证成功" + +#: src/tool/validators.py:146 +#, python-brace-format +msgid " - 支持工具调用,类型: {func_type}" +msgstr " - 支持工具调用,类型: {func_type}" + +#: src/tool/validators.py:148 +msgid " - 不支持工具调用" +msgstr " - 不支持工具调用" + +#: src/tool/validators.py:201 +msgid "无法连接到 Embedding 模型服务。" +msgstr "无法连接到 Embedding 模型服务。" + +#: src/tool/validators.py:241 +msgid "基本对话测试失败" +msgstr "基本对话测试失败" + +#: src/tool/validators.py:244 +msgid "基本对话功能正常" +msgstr "基本对话功能正常" + +#: src/tool/validators.py:246 +msgid "对话响应为空" +msgstr "对话响应为空" + +#: src/tool/validators.py:318 +msgid "不支持任何 function_call 格式" +msgstr "不支持任何 function_call 格式" + +#: src/tool/validators.py:353 +#, python-brace-format +msgid "tools 格式测试失败: {error}" +msgstr "tools 格式测试失败: {error}" + +#: src/tool/validators.py:358 +msgid "支持 tools 格式的 function_call" +msgstr "支持 tools 格式的 function_call" + +#: src/tool/validators.py:360 +msgid "不支持工具调用功能" +msgstr "不支持工具调用功能" + +#: src/tool/validators.py:401 +#, python-brace-format +msgid "structured_output 格式测试失败: {error}" +msgstr "structured_output 格式测试失败: {error}" + +#: src/tool/validators.py:409 +msgid "structured_output 响应不是有效 JSON" +msgstr "structured_output 响应不是有效 JSON" + +#: src/tool/validators.py:411 +msgid "支持 structured_output 格式" +msgstr "支持 structured_output 格式" + +#: src/tool/validators.py:413 +msgid "structured_output 响应为空" +msgstr "structured_output 响应为空" + +#: src/tool/validators.py:439 +#, python-brace-format +msgid "json_mode 格式测试失败: {error}" +msgstr "json_mode 格式测试失败: {error}" + +#: src/tool/validators.py:447 +msgid "json_mode 响应不是有效 JSON" +msgstr "json_mode 响应不是有效 JSON" + +#: src/tool/validators.py:449 +msgid "支持 json_mode 格式" +msgstr "支持 json_mode 格式" + +#: src/tool/validators.py:451 +msgid "json_mode 响应为空" +msgstr "json_mode 响应为空" + +#: src/tool/validators.py:499 +msgid "支持 vLLM 结构化输出(部分支持)" +msgstr "支持 vLLM 结构化输出(部分支持)" + +#: src/tool/validators.py:504 +#, python-brace-format +msgid "不支持 vLLM guided_json 格式: {error}" +msgstr "不支持 vLLM guided_json 格式: {error}" + +#: src/tool/validators.py:508 +msgid "vLLM guided_json 响应无效" +msgstr "vLLM guided_json 响应无效" + +#: src/tool/validators.py:555 +msgid "支持 Ollama function_call 格式" +msgstr "支持 Ollama function_call 格式" + +#: src/tool/validators.py:558 +#, python-brace-format +msgid "不支持 Ollama function_call 格式: {error}" +msgstr "不支持 Ollama function_call 格式: {error}" + +#: src/tool/validators.py:561 +msgid "Ollama function_call 响应无效" +msgstr "Ollama function_call 响应无效" + +#: src/tool/validators.py:589 +#, python-brace-format +msgid "OpenAI Embedding 配置验证失败: {error}" +msgstr "OpenAI Embedding 配置验证失败: {error}" + +#: src/tool/validators.py:598 +#, python-brace-format +msgid "OpenAI Embedding 配置验证成功 - 维度: {dimension}" +msgstr "OpenAI Embedding 配置验证成功 - 维度: {dimension}" + +#: src/tool/validators.py:606 +msgid "OpenAI Embedding 响应为空" +msgstr "OpenAI Embedding 响应为空" + +#: src/tool/validators.py:634 +#, python-brace-format +msgid "MindIE Embedding 配置验证成功 - 维度: {dimension}" +msgstr "MindIE Embedding 配置验证成功 - 维度: {dimension}" + +#: src/tool/validators.py:644 +msgid "MindIE Embedding 响应格式不正确" +msgstr "MindIE Embedding 响应格式不正确" + +#: src/tool/validators.py:652 +#, python-brace-format +msgid "MindIE Embedding 配置验证失败: {error}" +msgstr "MindIE Embedding 配置验证失败: {error}" + +#: src/tool/validators.py:674 +msgid "服务 URL 必须以 http:// 或 https:// 开头" +msgstr "服务 URL 必须以 http:// 或 https:// 开头" + +#: src/tool/validators.py:685 +msgid "访问令牌格式无效" +msgstr "访问令牌格式无效" + +#: src/tool/validators.py:710 +msgid "服务返回的数据格式不正确" +msgstr "服务返回的数据格式不正确" + +#: src/tool/validators.py:716 +msgid "连接成功" +msgstr "连接成功" + +#: src/tool/validators.py:718 +#, python-brace-format +msgid "服务返回错误代码: {code}" +msgstr "服务返回错误代码: {code}" + +#: src/tool/validators.py:721 +msgid "无法连接到服务,请检查 URL 和网络连接" +msgstr "无法连接到服务,请检查 URL 和网络连接" + +#: src/tool/validators.py:723 +msgid "连接超时,请检查网络连接或服务状态" +msgstr "连接超时,请检查网络连接或服务状态" + +#: src/tool/validators.py:726 +#, python-brace-format +msgid "连接验证失败: {error}" +msgstr "连接验证失败: {error}" + +#: src/tool/validators.py:732 +msgid "访问令牌无效或已过期" +msgstr "访问令牌无效或已过期" + +#: src/tool/validators.py:733 +msgid "访问权限不足" +msgstr "访问权限不足" + +#: src/tool/validators.py:734 +msgid "API 接口不存在,请检查服务版本" +msgstr "API 接口不存在,请检查服务版本" + +#: src/tool/validators.py:737 +#, python-brace-format +msgid "服务响应异常,状态码: {status_code}" +msgstr "服务响应异常,状态码: {status_code}" + +#: src/tool/command_processor.py:56 +msgid "请输入有效命令或问题。" +msgstr "请输入有效命令或问题。" + +#: src/tool/command_processor.py:75 +msgid "检测到不安全命令,已阻止执行。" +msgstr "检测到不安全命令,已阻止执行。" + +#: src/tool/command_processor.py:135 +msgid "[命令启动失败] 无法创建子进程" +msgstr "[命令启动失败] 无法创建子进程" + +#: src/tool/command_processor.py:136 +#, python-brace-format +msgid "无法启动命令 '{command}',请分析可能原因并给出解决建议。" +msgstr "无法启动命令 '{command}',请分析可能原因并给出解决建议。" + +#: src/tool/command_processor.py:165 +#, python-brace-format +msgid "" +"\n" +"[命令完成] 退出码: {returncode}" +msgstr "" +"\n" +"[命令完成] 退出码: {returncode}" + +#: src/tool/command_processor.py:183 +#, python-brace-format +msgid "[命令失败] 退出码: {returncode}" +msgstr "[命令失败] 退出码: {returncode}" + +#: src/tool/command_processor.py:188 +#, python-brace-format +msgid "" +"命令 '{command}' 以非零状态 {returncode} 退出。\n" +"标准错误输出如下:\n" +"{stderr_text}\n" +"请分析原因并提供解决建议。" +msgstr "" +"命令 '{command}' 以非零状态 {returncode} 退出。\n" +"标准错误输出如下:\n" +"{stderr_text}\n" +"请分析原因并提供解决建议。" + +#: src/tool/command_processor.py:206 +msgid "读取 stderr 失败" +msgstr "读取 stderr 失败" diff --git a/src/i18n/manager.py b/src/i18n/manager.py index 7a04747ed0c33106d5cfe86b87a73f1bb5b81203..269c7c8461b135e7173a45f0d01ea5684a45bb6b 100644 --- a/src/i18n/manager.py +++ b/src/i18n/manager.py @@ -11,8 +11,40 @@ SUPPORTED_LOCALES = { "zh_CN": "简体中文", } -# 默认语言 - 英语 -DEFAULT_LOCALE = "en_US" +# 备用语言(当系统语言无法检测时使用) +FALLBACK_LOCALE = "en_US" + + +def _detect_default_locale() -> str: + """ + 检测默认语言环境(在模块加载时调用) + + Returns: + 检测到的语言代码,如果不支持则返回备用语言(英语) + + """ + try: + # 获取系统语言设置 + system_locale, _ = locale.getdefaultlocale() + if system_locale: + # 标准化语言代码 (如 zh_CN.UTF-8 -> zh_CN) + locale_code = system_locale.split(".")[0] + if locale_code.startswith("zh"): + locale_code = "zh_CN" + if locale_code.startswith("en"): + locale_code = "en_US" + if locale_code in SUPPORTED_LOCALES: + return locale_code + except (ValueError, TypeError, locale.Error): + # 捕获可能的 locale 相关异常 + pass + + # 无法检测或不支持时,返回备用语言 + return FALLBACK_LOCALE + + +# 默认语言 - 根据系统语言自动检测 +DEFAULT_LOCALE = _detect_default_locale() class I18nManager: @@ -86,25 +118,10 @@ class I18nManager: 检测系统语言环境 Returns: - 检测到的语言代码,如果不支持则返回默认语言(英语) + 检测到的语言代码,如果不支持则返回默认语言 """ - try: - # 获取系统语言设置 - system_locale, _ = locale.getdefaultlocale() - if system_locale: - # 标准化语言代码 (如 zh_CN.UTF-8 -> zh_CN) - locale_code = system_locale.split(".")[0] - if locale_code.startswith("zh"): - locale_code = "zh_CN" - if locale_code in SUPPORTED_LOCALES: - return locale_code - except (ValueError, TypeError, locale.Error): - # 捕获可能的 locale 相关异常 - pass - - # 无法检测或不支持时,返回默认语言 - return DEFAULT_LOCALE + return _detect_default_locale() def translate(self, message: str, **kwargs: str | float) -> str: """ diff --git a/src/main.py b/src/main.py index 85857671320908aec2c12a929fa7127e886b2a35..bc2dd290644bbf969831f75ac19b5174fce0c23e 100644 --- a/src/main.py +++ b/src/main.py @@ -6,7 +6,6 @@ import atexit import sys from __version__ import __version__ -from app.tui import IntelligentTerminal from config.manager import ConfigManager from config.model import LogLevel from i18n.manager import _, get_locale, get_supported_locales, init_i18n, set_locale @@ -222,6 +221,9 @@ def main() -> None: logger = get_logger(__name__) try: + # 延迟导入 IntelligentTerminal,确保在 i18n 初始化之后 + from app.tui import IntelligentTerminal # noqa: PLC0415 + app = IntelligentTerminal() app.run() except Exception: