# 基础错误
ErrInvalidParams: "参数错误: {{ .detail }}"
ErrMcpGatewayArgsParse: "MCP 自定义参数格式错误"
ErrMcpGatewayArgsConflict: "参数 {{ .name }} 由 1Panel 管理，不能在自定义参数中设置"
ErrTokenParse: "Token 错误: {{ .detail }}"
ErrInitialPassword: "原密码错误"
ErrInternalServer: "服务错误: {{ .detail }}"
ErrRecordExist: "记录已存在"
ErrRecordNotFound: "记录不存在"
WafLogExport: "WAF 日志导出"
MonitorLogExport: "网站监控日志导出"
LogExportNoData: "没有符合条件的日志"
LogExportDiskSpace: "可用磁盘空间不足 1 GiB，导出任务已停止"
LogExportRetentionInvalid: "导出记录保留天数必须在 1 到 30 天之间"
ErrSystemLogKeywordFilterUnsupported: "当前系统版本不支持系统日志关键词过滤（需要 systemd 237 或更高版本）"
ErrStructTransform: "类型转换失败: {{ .err }}"
ErrNotSupportType: "不支持当前类型: {{ .name }}"

# 文件 AI
ErrFileAINotEnabled: "生成 AI 总结需在文件管理中启用并保存文件 AI 账号。关闭 AI 时仍可使用纯内容检索。"
ErrFileAISearchBadPattern: "搜索条件无效（正则或全词匹配）: {{ .detail }}"
FileAISearchEmptyDir: "当前目录下没有可列出的文件或文件夹（或均被过滤）。"

# 远程下载
ErrWgetRemoteFailed: "远程下载地址无效或无法访问：{{ .detail }}"
ErrWgetInvalidContentType: "远程地址返回的不是文件内容（可能是错误页），{{ .detail }}"
ErrWgetProxyNotConfigured: "请先在面板设置中配置代理服务器"
ErrWgetProxyInvalid: "代理服务器地址无效：{{ .detail }}"

# 登录与安全
ErrNotLogin: "用户未登录: {{ .detail }}"
ErrPasswordExpired: "当前密码已过期: {{ .detail }}"

# 请求与 API
ErrProxy: "请求失败，请检查节点状态: {{ .detail }}"
ErrApiConfigStatusInvalid: "API 禁止访问: {{ .detail }}"
ErrApiConfigKeyInvalid: "API 接口密钥错误: {{ .detail }}"
ErrApiConfigIPInvalid: "调用 API 接口 IP 不在白名单: {{ .detail }}"
ErrApiConfigDisable: "此接口禁止 API 调用: {{ .detail }}"
ErrApiConfigKeyTimeInvalid: "API 时间戳错误: {{ .detail }}"
ErrCreateHttpClient: "创建请求失败 {{ .err }}"
ErrHttpReqTimeOut: "请求超时 {{ .err }}"
ErrHttpReqFailed: "请求失败 {{ .err }}"
ErrNoSuchHost: "无法找到请求的服务器 {{ .err }}"
ErrHttpReqNotFound: "无法找到请求的资源 {{ .err }}"

# 快速跳转
ErrMinQuickJump: "至少设置 1 个快速跳转入口"
ErrMaxQuickJump: "最多设置 4 个快速跳转入口"

# 通用
ErrShutDown: "命令已手动终止"
ErrUsernameIsExist: "用户名已存在"
ErrNameIsExist: "名称已存在"
ErrDemoEnvironment: "演示环境，禁止操作"
ErrCmdTimeout: "命令超时"
ErrCmdIllegal: "命令含非法字符，请修改后重试"
ErrPortExist: '{{ .port }} 端口已被 {{ .type }} [{{ .name }}] 占用'
TYPE_APP: "应用"
TYPE_RUNTIME: "运行环境"
TYPE_DOMAIN: "域名"
ErrTypePort: '端口 {{ .name }} 格式错误'
ErrTypePortRange: '端口范围需要在 1-65535 之间'
Success: "成功"
Failed: "失败"
SystemRestart: "系统重启，任务中断"
ErrGroupIsDefault: "默认分组不可删除"
ErrGroupIsInWebsiteUse: "分组正在被其他网站使用，无法删除"
Decrypt: "解密"

# 智能体
ErrAgentAccountBound: "该账号已绑定智能体，无法删除"
ErrTerminalAIAccountInUse: "该模型账号正被终端 AI 使用，请在终端 AI 设置中更换账号或关闭终端 AI 后重试"
ErrFileAIAccountInUse: "该模型账号正被文件管理 AI 使用，请在文件管理 AI 设置中更换账号或关闭文件管理 AI 后重试"
ErrAgentAccountUnavailable: "账号连接信息不可用: {{ .err }}"
ErrAgentProviderNotSupported: "不支持该智能体提供商"
ErrAgentAccountRequired: "请选择智能体账号后重试"
ErrAgentAccountNotVerified: "账号未通过验证"
ErrAgentAccountModelsRequired: "请至少配置一个模型"
ErrAgentAccountSingleInitialModel: "创建账号时只能配置一个初始模型"
ErrAgentModelNotInAccount: "所选模型未配置在当前账号中"
ErrAgentVerifyModelInUse: "该模型正用于验证账号，请先选择其他验证模型后再删除"
ErrAgentFallbackModelDuplicate: "备用模型不能重复"
ErrAgentFallbackModelPrimary: "备用模型不能与主模型相同"
ErrAgentModelInUse: "仍有智能体正在使用该模型: {{ .name }}"
ErrAgentBaseURLRequired: "Base URL 不能为空"
ErrAgentApiKeyRequired: "API Key 不能为空"
ErrAgentComposeRequired: "自定义编排内容不能为空"
ErrAgentIDRequired: "智能体 ID 不能为空"
ErrAgentAccountIDRequired: "账号 ID 不能为空"
ErrAgentLimitReached: "社区版最多支持创建 {{ .max }} 个智能体，升级至商业版无数量限制"
ErrAgentWebsiteBound: "该智能体已关联网站"
ErrAgentWebsiteTypeUnsupported: "只能关联反向代理或静态网站"
ErrAgentWebsiteInUse: "该网站已被其他智能体关联"
ErrAgentWebsiteUnbindUnsupported: "一键部署网站不支持手动解绑"
ErrQwenPawAuthRequest: "QwenPaw 认证信息更新失败: {{ .err }}"
ErrQwenPawAuthOutOfSync: "QwenPaw 当前凭据与 1Panel 记录不一致，请先重置 QwenPaw 密码或恢复应用 .env 中的凭据"
ErrQwenPawAuthDisabled: "QwenPaw 尚未启用登录认证"
ErrHermesPairingCodeUnavailable: "配对码在 hermes 中暂时不存在，可能是由于网络原因，请稍后尝试"
ErrHermesFeishuGroupAllowlistRequiresAllowlist: "飞书群组策略为白名单时，私聊策略不能为配对码"

# 备份与告警配置
Localhost: '本机'
ErrBackupInUsed: "该备份账号已在计划任务中使用，无法删除"
ErrBackupCheck: "备份账号测试连接失败 {{ .err }}"
ErrBackupLocalDelete: "暂不支持删除本地服务器备份账号"
ErrBackupLocalCreate: "暂不支持创建本地服务器备份账号"
ErrAlertConfigInUse: "告警配置正在使用中，无法删除"
ErrAlertConfigPhoneExist: "手机号已存在"

# 应用
ErrPortInUsed: "{{ .detail }} 端口已被占用！"
ErrAppLimit: "应用安装数量超限"
ErrNotInstall: "应用未安装"
ErrPortInOtherApp: "{{ .port }} 端口已被应用 {{ .apps }} 占用！"
ErrDbUserNotValid: "存量数据库用户名或密码不匹配"
ErrMysqlUserUsedByApps: "该数据库用户已被【{{ .detail }}】应用使用，无法修改 Host、删除或者撤销授权"
ErrUpdateBuWebsite: '应用更新成功，但网站配置文件修改失败，请检查配置'
Err1PanelNetworkFailed: '默认容器网络创建失败！{{ .detail }}'
ErrFileParse: '应用 docker-compose 解析失败'
ErrInstallDirNotFound: '安装目录不存在，如需卸载请选强制卸载'
AppStoreIsUpToDate: '应用商店已是最新版本'
LocalAppVersionNull: '{{ .name }} 应用未同步到版本！无法添加到应用列表'
LocalAppVersionErr: '{{ .name }} 同步版本 {{ .version }} 失败！{{ .err }}'
ErrFileNotFound: '{{ .name }} 文件不存在'
ErrFileParseApp: '{{ .name }} 文件解析失败 {{ .err }}'
ErrAppDirNull: '版本文件夹不存在'
LocalAppErr: "应用 {{ .name }} 同步失败！{{ .err }}"
ErrContainerName: "容器名称已存在"
ErrContainerNotFound: '{{ .name }} 容器不存在'
ErrContainerMsg: '{{ .name }} 容器异常，具体请在容器页面查看日志'
ErrAppBackup: '{{ .name }} 应用备份失败 {{ .err }}'
ErrVersionTooLow: '当前 1Panel 版本过低，无法更新应用商店，请升级版本之后操作'
ErrAppNameExist: '应用名称已存在'
ErrAppInstallNameExist: '应用安装名称 {{ .name }} 已存在'
AppStoreIsSyncing: '应用商店同步中，请稍后重试'
ErrGetCompose: "docker-compose.yml 文件获取失败！{{ .detail }}"
ErrComposeProjectNameParse: "解析 Docker Compose 配置输出中的项目名称失败：{{ .detail }}"
ErrComposeProjectNameEmpty: "无法从 Docker Compose 配置或文件父目录中推导出项目名称，请填写名称后重试"
ErrComposeNameInvalid: "Compose 项目名称格式错误：必须以小写字母或数字开头，仅支持小写字母、数字、- 和 _，长度为 1-256 个字符"
ErrAppVersionUnavailable: "当前应用版本已从远程服务下架，请选择其他版本后重试"
ErrAppWarn: "状态异常，请查看日志"
ErrAppParamKey: "参数 {{ .name }} 字段异常"
ErrAppUpgrade: "应用 {{ .name }} 升级失败 {{ .err }}"
AppRecover: "应用 {{ .name }} 回滚"
PullImageStart: "开始拉取镜像 [{{ .name }}]"
PullImageSuccess: "镜像拉取成功"
AppStoreSyncSuccess: "应用商店同步成功"
SyncAppDetail: "同步应用配置"
AppVersionNotMatch: "{{ .name }} 应用需要更高的 1Panel 版本，跳过"
MoveSiteDir: "检测到网站目录变更，需迁移 OpenResty 网站目录到 {{ .name }}"
MoveSiteDirSuccess: "迁移网站目录成功"
DeleteRuntimePHP: "删除 PHP 运行环境"
CustomAppStoreFileValid: "应用商店包需要 .tar.gz 格式"
PullImageTimeout: "拉取镜像超时，请调整镜像加速配置"
ErrAppIsDown: "{{ .name }} 应用状态异常，请检查"
ErrCustomApps: "存在已安装应用，请先卸载"
ErrCustomRuntimes: "存在已安装运行环境，请先删除"
ErrAppVersionDeprecated: "{{ .name }} 应用不适配当前 1Panel 版本，跳过"
ErrDockerFailed: "Docker 状态异常，请检查服务状态"
ErrDockerComposeCmdNotFound: "Docker Compose 命令不存在，请先在宿主机安装"
UseExistImage: "镜像已存在，使用存量镜像"
UpgradePrepare: "准备应用升级"
UpgradeStop: "停止原应用"
UpgradeWaitReady: "等待应用就绪"
UpgradeBackupDisabled: "未启用升级备份，升级脚本产生的数据变更无法完整回滚"
UpgradeRollbackFailed: "回滚失败"
ErrDatabaseNotFound: "数据库 {{ .name }} 不存在"

# SSH
ExportIP: "登录 IP"
ExportArea: "归属地"
ExportPort: "端口"
ExportAuthMode: "登录方式"
ExportUser: "用户"
ExportStatus: "登录状态"
ExportDate: "时间"

# 文件
ErrFileCanNotRead: "此文件不支持预览"
ErrSensitiveFileRead: "不允许读取敏感文件"
ErrFileToLarge: "文件超过 10M，无法打开"
ErrPathNotFound: "目录不存在"
ErrMovePathFailed: "目标路径不能包含原路径！"
ErrLinkPathNotFound: "目标路径不存在！"
ErrFileIsExist: "文件或文件夹已存在！"
ErrFileUpload: "{{ .name }} 上传文件失败 {{ .detail }}"
ErrFileDownloadDir: "不支持下载目录"
ErrFileSharePath: "无效的分享路径或目标不是文件"
ErrFileShareInvalid: "分享链接无效或已失效"
ErrFileShareExpired: "分享链接已过期"
ErrFileSharePassword: "访问密码错误"
ErrFileShareExhausted: "该分享链接的下载次数已用尽"
ErrFileSharePasswordPolicy: "访问密码至少 4 位"
ErrFileShareRateLimit: "访问过于频繁，请稍后再试"
ErrCmdNotFound: "{{ .name }} 命令不存在，请先在宿主机安装此命令"
ErrSourcePathNotFound:  "源目录不存在"
ErrFavoriteExist: "已收藏此路径"
ErrInvalidChar: "禁止使用非法字符"
ErrPathNotDelete: "所选目录不可删除"
ErrLogFileToLarge: "日志文件超过 500M，无法打开"
FileDropFailed: "清理文件 {{ .name }} 失败 {{ .err }}"
FileDropSuccess: "清理 {{ .name }} 成功，文件 {{ .count }}，释放 {{ .size }}"
FileDropSum: "文件清理完成，共 {{ .count }}，释放 {{ .size }}"
ErrBadDecrypt: "压缩包密码错误，解压失败，请检查后重试"

# 网站
ErrAliasIsExist: "标识已存在"
ErrBackupMatch: '该备份文件与当前网站部分数据不匹配 {{ .detail }}'
ErrBackupExist: '该备份文件对应部分源数据不存在 {{ .detail }}'
ErrPHPResource: '本地运行环境不支持切换！'
ErrPathPermission: 'index 目录存在非 1000:1000 权限目录，可能导致 Access denied，请点击上方保存'
ErrDomainIsUsed: "域名已被网站【{{ .name }}】使用"
ErrDomainFormat: "{{ .name }} 域名格式不正确"
ErrDefaultAlias: "default 为保留代号，请使用其他代号"
ErrParentWebsite: "需要先删除子网站 {{ .name }}"
ErrBuildDirNotFound: "构建目录不存在"
ErrImageNotExist: "运行环境 {{ .name }} 镜像不存在，请重新编辑运行环境"
ErrProxyIsUsed: "负载均衡已被反向代理使用，无法删除"
ErrSSLValid: '证书文件异常，请检查证书状态！'
ErrWebsiteDir: '请选择网站目录下的目录'
ErrComposerFileNotFound: 'composer.json 文件不存在'
ErrRuntimeNoPort: '运行环境未设置端口，请先编辑运行环境'
ErrRuntimeProjectDirContainsCodeDir: '运行环境目录包含所选项目目录，请先更换项目目录后再重新创建'
Status: '状态'
start: '开启'
stop: '关闭'
restart: '重启'
kill: '强制停止'
pause: '暂停'
unpause: '恢复'
remove: '删除'
delete: '删除'
ErrDefaultWebsite: "已设置默认网站，请先取消再设置"
SSL: '证书'
Set: '设置'

# SSL 证书
ErrSSLCannotDelete: "{{ .name }} 证书正在被网站使用，无法删除"
ErrAccountCannotDelete: "账号关联证书，无法删除"
ErrSSLApply: "证书续签成功，但 OpenResty reload 失败，请检查配置"
ErrEmailIsExist: '邮箱已存在'
ErrSSLKeyNotFound: '私钥文件不存在'
ErrSSLCertificateNotFound: '证书文件不存在'
ErrSSLKeyFormat: '私钥文件校验失败'
ErrSSLCertificateFormat: '证书文件格式错误，请使用 pem 格式'
ErrEabKidOrEabHmacKeyCannotBlank: 'EabKid 或 EabHmacKey 不能为空'
ErrOpenrestyNotFound: 'Http 模式需要首先安装 Openresty'
ApplySSLStart: '开始申请证书，域名 [{{ .domain }}]，方式 [{{ .type }}]'
dnsAccount: "DNS 自动"
dnsManual: "DNS 手动"
http: "HTTP"
ApplySSLFailed: '申请 [{{ .domain }}] 证书失败，{{ .detail }}'
ApplySSLSuccess: '申请 [{{ .domain }}] 证书成功'
DNSAccountName: 'DNS 账号 [{{ .name }}] 厂商 [{{ .type }}]'
PushDirLog: '证书推送到目录 [{{ .path }}] {{ .status }}'
ErrDeleteCAWithSSL: "当前机构下存在已签发证书，无法删除"
ErrDeleteWithPanelSSL: "面板 SSL 配置使用此证书，无法删除"
ErrDefaultCA: "默认机构不能删除"
ApplyWebSiteSSLLog: "开始更新网站证书 {{ .name }}"
ErrUpdateWebsiteSSL: "{{ .name }} 网站更新证书失败: {{ .err }}"
ApplyWebSiteSSLSuccess: "更新网站证书成功"
ErrExecShell: "执行脚本失败 {{ .err }}"
ExecShellStart: "开始执行脚本"
ExecShellSuccess: "脚本执行成功"
StartUpdateSystemSSL: "开始更新系统证书"
UpdateSystemSSLSuccess: "更新系统证书成功"
ErrWildcardDomain: "HTTP 模式无法申请泛域名证书"
ErrApplySSLCanNotDelete: "正在申请的证书{{ .name }}无法删除，请稍后重试"
StartPushSSLToNode: "开始推送证书到节点"
PushSSLToNodeFailed: "推送证书到节点失败: {{ .err }}"
PushSSLToNodeSuccess: "推送证书到节点成功"

# MySQL
ErrUserIsExist: "用户已存在，请重新输入"
ErrDatabaseIsExist: "数据库已存在，请重新输入"
ErrExecTimeOut: "SQL 执行超时，请检查数据库"
ErrRemoteExist: "远程数据库已存在该名称，请修改后重试"
ErrLocalExist: "本地数据库已存在该名称，请修改后重试"
RemoteBackup: "备份远程数据库前需先用镜像 {{ .name }} 启动本地容器数据库服务，请稍候"
RemoteRecover: "恢复远程数据库前需先用镜像 {{ .name }} 启动本地容器数据库服务，请稍候"
Arg: "参数"

# Redis
ErrTypeOfRedis: "恢复文件类型与当前持久化方式不符，请修改后重试"

# 容器
ErrInUsed: "{{ .detail }} 正被使用，无法删除！"
ErrObjectInUsed: "该对象正被使用，无法删除！"
ErrObjectBeDependent: "该镜像正被其他镜像所依赖，无法删除！"
ErrPortRules: "端口数目不匹配，请重新输入！"
ErrPgImagePull: "镜像拉取超时，请配置镜像加速或手动拉取 {{ .name }} 后重试"
PruneHelper: "本次清理 {{ .name }} 释放磁盘空间 {{ .size }}"
ImageRemoveHelper: "删除镜像 {{ .name }} ，释放磁盘空间 {{ .size }}"
BuildCache: "构建缓存"
Volume: "存储卷"
Network: "网络"
PruneStart: "清理中，请稍候..."
ContainerBackupPrepare: "准备容器备份工作目录"
ContainerBackupStop: "备份前停止容器"
ContainerBackupInspect: "备份容器 Inspect 与网络信息"
ContainerBackupMounts: "备份容器挂载数据"
ContainerBackupMeta: "写入容器备份元信息"
ContainerBackupStart: "备份后启动容器"
ContainerRecoverPrepare: "准备容器恢复工作目录"
ContainerRecoverExtract: "解压容器备份文件"
ContainerRecoverParse: "加载容器备份元信息"
ContainerRecoverCreate: "重建容器"
ContainerRecoverMounts: "恢复容器挂载数据"
ContainerRecoverStart: "启动已恢复容器"
ContainerRecoverCleanup: "清理容器恢复工作目录"
ComposeBackupPrepare: "准备编排备份工作目录"
ComposeBackupStop: "备份前停止编排"
ComposeBackupFiles: "备份编排文件"
ComposeBackupContainers: "备份编排容器"
ComposeBackupMeta: "写入编排备份元信息"
ComposeBackupStart: "备份后启动编排"
ComposeBackupCleanup: "清理编排备份工作目录"
ComposeRecoverPrepare: "准备编排恢复工作目录"
ComposeRecoverExtract: "解压编排备份文件"
ComposeRecoverMeta: "加载编排备份元信息"
ComposeRecoverMetaLogName: "编排恢复元信息：名称={{ .name }}"
ComposeRecoverMetaLogPath: "编排恢复元信息：备份路径={{ .backupPath }} 目标路径={{ .targetDir }}"
ComposeRecoverMetaLogCount: "编排恢复元信息：文件数={{ .files }} 容器数={{ .containers }}"
ComposeRecoverFiles: "恢复编排文件"
ComposeRecoverContainers: "恢复编排容器"
ComposeRecoverRecord: "保存编排记录"
ComposeRecoverCleanup: "清理编排恢复工作目录"

# 运行环境
ErrFileNotExist: "{{ .detail }} 文件不存在！请检查源文件完整性！"
ErrImageBuildErr: "镜像 build 失败"
ErrImageExist: "镜像已存在！请修改镜像名称"
ErrDelWithWebsite: "运行环境已经关联网站，无法删除"
ErrRuntimeStart: "启动失败"
ErrPackageJsonNotFound: "package.json 文件不存在"
ErrScriptsNotFound: "没有在 package.json 中找到 scripts 配置项"
ErrContainerNameNotFound: "无法获取容器名称，请检查 .env 文件"
ErrNodeModulesNotFound: "node_modules 文件夹不存在！请编辑运行环境或等待运行环境启动成功"
ErrContainerNameIsNull: "容器名称不存在"
ErrPHPPortIsDefault: "9000 端口为默认端口，请修改后重试"
ErrPHPRuntimePortFailed: "{{ .name }} 端口已被当前运行环境使用，请修改后重试"

# 工具
ErrConfigNotFound: "配置文件不存在"
ErrConfigParse: "配置文件格式有误"
ErrConfigIsNull: "配置文件不允许为空"
ErrConfigDirNotFound: "运行目录不存在"
ErrConfigAlreadyExist: "已存在同名配置文件"
ErrUserFindErr: "用户 {{ .name }} 查找失败 {{ .err }}"

# 计划任务
CutWebsiteLogSuccess: "{{ .name }} 网站日志切割成功，备份路径 {{ .path }}"
HandleShell: "执行脚本 {{ .name }}"
HandleCurl: "访问 URL {{ .name }}"
HandleNtpSync: "系统时间同步"
HandleSystemClean: "系统缓存清理"
SystemLog: "系统日志"
CutWebsiteLog: "切割网站日志"
FileOrDir: "目录 / 文件"
UploadFile: "上传备份文件 {{ .file }} 到 {{ .backup }}"
Upload: "上传"
IgnoreBackupErr: "备份失败，错误：{{ .detail }}，忽略本次错误..."
IgnoreUploadErr: "上传失败，错误：{{ .detail }}，忽略本次错误..."
LoadBackupFailed: "获取备份账号连接失败，错误：{{ .detail }}"
InExecuting: "任务执行中，请勿重复执行"
NoSuchResource: "数据库未查询到备份内容，跳过"
CleanLog: "清理日志"
CleanLogByName: "清理 {{ .name }} 日志"
WafIpGroupNotFound: "WAF IP组未找到，请先到【高级功能-WAF-黑白名单-IP组】添加远程下载方式的IP组"

# 工具箱
ErrNotExistUser: "当前用户不存在，请修改后重试！"
ErrBanAction: "设置失败，{{ .name }} 服务不可用，请检查后重试"
ErrClamdscanNotFound: "未检测到 clamdscan 命令，请按文档安装"
TaskSwapSet: "设置 Swap"
SetSwap: "设置 Swap {{ .path }} - {{ .size }}"
CreateSwap: "创建 Swap 文件"
FormatSwap: "格式化 Swap 文件"
EnableSwap: "启用 Swap"

# 防篡改
CleanTamperSetting: "清理历史防护设置"
SetTamperWithRules: "根据规则启动目录防护"
ProtectDir: "防护目录 {{ .name }}"
IgnoreFile: "保护文件 {{ .name }}"
TamperSetSuccessful: "防护设置完成，开始监听以下目录："

# WAF
ErrScope: "不支持修改此配置"
ErrStateChange: "状态修改失败"
ErrRuleExist: "规则已存在"
ErrRuleNotExist: "规则不存在"
ErrParseIP: "IP 格式错误"
ErrDefaultIP: "default 为保留名称，请更换其他名称"
ErrGroupInUse: "IP 组被黑/白名单使用，无法删除"
ErrIPGroupAclUse: "IP 组被网站 {{ .name }} 自定义规则使用，无法删除"
ErrIPGroupOriginProtectionUse: "IP 组被网站 {{ .name }} 的 CDN 源站保护使用，无法删除"
ErrOriginProtectionIPGroupRequired: "开启源站保护时必须选择至少一个非空 IP 组"
ErrOriginProtectionIPGroupInvalid: "IP 组 {{ .name }} 不存在或为空"
ErrGroupExist: "IP 组名称已存在"
ErrIPRange: "IP 范围错误"
ErrIPExist: "IP 已存在"
urlDefense: 'URL 规则'
urlHelper: '禁止访问的 URL'
dirFilter: '目录过滤'
xss: 'XSS'
phpExec: 'PHP 脚本执行'
oneWordTrojan: '一句话木马'
appFilter: '应用危险目录过滤'
webShell: 'WebShell'
args: '参数规则'
protocolFilter: '协议过滤'
javaFilter: 'Java 危险文件过滤'
scannerFilter: '扫描器过滤'
escapeFilter: '转义过滤'
customRule: '自定义规则'
httpMethod: 'HTTP 方法过滤'
fileExt: '文件上传限制'
defaultIpBlack: '恶意 IP 组'
cookie: 'Cookie 规则'
urlBlack: 'URL 黑名单'
uaBlack: 'User-Agent 黑名单'
attackCount: '攻击频率限制'
fileExtCheck: '文件上传限制'
geoRestrict: '地区访问限制'
unknownWebsite: '未授权域名访问'
notFoundCount: '404 频率限制'
headerDefense: 'Header 规则'
defaultUaBlack: 'User-Agent 规则'
methodWhite: 'HTTP 规则'
captcha: '人机验证'
fiveSeconds: '5 秒验证'
vulnCheck: '补充规则'
acl: '自定义规则'
sql: 'SQL 注入'
cc: '访问频率限制'
defaultUrlBlack: 'URL 规则'
sqlInject: 'SQL 注入'
ErrDBNotExist: "数据库不存在"
allow: "允许"
deny: "禁止"
OpenrestyNotFound: "Openresty 未安装"
remoteIpIsNull: "IP 列表为空"
OpenrestyVersionErr: "OpenResty 版本过低，请升级到 1.27.1.2-2-2-focal"
ErrFileTooLarge: "文件超过 1MB，无法上传"

# 任务
TaskStart: "{{ .name }} 任务开始 [START]"
TaskEnd: "{{ .name }} 任务结束 [COMPLETED]"
TaskFailed: "{{ .name }} 任务失败"
TaskTimeout: "{{ .name }} 超时"
TaskSuccess: "{{ .name }} 任务成功"
TaskRetry: "开始第 {{ .name }} 次重试"
SubTaskSuccess: "{{ .name }} 成功"
SubTaskFailed: "{{ .name }} 失败: {{ .err }}"
TaskInstall: "安装"
TaskUninstall: "卸载"
TaskCreate: "创建"
TaskDelete: "删除"
TaskUpgrade: "升级"
TaskUpdate: "更新"
AgentPluginInstall: "安装插件"
AgentPluginEnable: "启用插件"
AgentPluginDisable: "禁用插件"
AgentPluginUpdate: "更新插件"
AgentPluginUninstall: "卸载插件"
TaskRestart: "重启"
TaskProtect: "防护"
TaskBackup: "备份"
TaskRecover: "恢复"
TaskRollback: "回滚"
TaskPull: "拉取"
TaskCommit: "制作"
TaskBuild: "构建"
TaskPush: "推送"
TaskClean: "清理"
TaskHandle: "执行"
TaskImport: "导入"
TaskExport: "导出"
Website: "网站"
App: "应用"
Runtime: "运行环境"
Database: "数据库"
ConfigFTP: "创建 FTP 用户 {{ .name }}"
ConfigOpenresty: "创建 Openresty 配置文件"
InstallAppSuccess: "应用 {{ .name }} 安装成功"
ConfigRuntime: "配置运行环境"
ConfigApp: "配置应用"
SuccessStatus: "{{ .name }} 成功"
FailedStatus: "{{ .name }} 失败 {{ .err }}"
HandleLink: "处理应用关联"
HandleDatabaseApp: "处理应用参数"
ExecShell: "执行 {{ .name }} 脚本"
PullImage: "拉取镜像"
Start: "开始"
Run: "启动"
Stop: "停止"
Image: "镜像"
Compose: "编排"
Container: "容器"
AppLink: "关联应用"
EnableSSL: "开启 HTTPS"
AppStore: "应用商店"
TaskSync: "同步"
LocalApp: "本地应用"
SubTask: "子任务"
RuntimeExtension: "运行环境扩展"
TaskIsExecuting: "任务运行中"
CustomAppstore: "自定义应用仓库"
TaskExec: "执行"
TaskBatch: "批量操作"
FileConvert: "文件格式转换"

# 任务 - ClamAV
Clamscan: "扫描 {{ .name }}"
TaskScan: "扫描"

# 任务 - AI
OllamaModelPull: "拉取 Ollama 模型 {{ .name }}"
OllamaModelSize: "获取 Ollama 模型 {{ .name }} 大小"
AIBenchmarkRun: "执行 AI 基准测试"

# 任务 - 快照
Snapshot: "快照"
SnapDBInfo: "写入 1Panel 数据库信息"
SnapCopy: "复制文件/目录 {{ .name }}"
SnapNewDB: "初始化数据库 {{ .name }} 连接"
SnapDeleteOperationLog: "删除操作日志"
SnapDeleteLoginLog: "删除访问日志"
SnapDeleteMonitor: "删除监控数据"
SnapRemoveSystemIP: "移除系统 IP"
SnapBaseInfo: "写入 1Panel 基本信息"
SnapInstallAppImageEmpty: "当前未勾选应用镜像，跳过..."
SnapInstallApp: "备份 1Panel 已安装应用"
SnapDockerSave: "压缩已安装应用"
SnapLocalBackup: "备份 1Panel 本地备份目录"
SnapCompressBackup: "压缩本地备份目录"
SnapPanelData: "备份 1Panel 数据目录"
SnapCompressPanel: "压缩数据目录"
SnapWebsite: "备份 1Panel 网站目录"
SnapCloseDBConn: "关闭数据库连接"
SnapCompress: "制作快照文件"
SnapCompressFile: "压缩快照文件"
SnapCheckCompress: "检查快照压缩文件"
SnapCompressSize: "快照文件大小 {{ .name }}"
SnapUpload: "上传快照文件"
SnapUploadTo: "上传快照文件到 {{ .name }}"
SnapUploadRes: "上传快照文件到 {{ .name }}"
SnapshotRecover: "快照恢复"
RecoverDownload: "下载快照文件"
Download: "下载"
RecoverDownloadAccount: "获取快照下载备份账号 {{ .name }}"
RecoverDecompress: "解压快照压缩文件"
Decompress: "解压"
BackupBeforeRecover: "快照前备份系统相关数据"
ReadJson: "读取快照内 Json 文件"
ReadJsonPath: "获取快照内 Json 文件路径"
ReadJsonContent: "读取 Json 文件"
ReadJsonMarshal: "Json 转义处理"
RecoverApp: "恢复已安装应用"
RecoverWebsite: "恢复网站目录"
RecoverAppImage: "恢复快照镜像备份"
RecoverCompose: "恢复其他编排内容"
RecoverComposeList: "获取所有待恢复编排"
RecoverComposeItem: "恢复编排 {{ .name }}"
RecoverAppEmpty: "快照文件中未发现应用镜像备份"
RecoverBaseData: "恢复基础数据及文件"
RecoverDaemonJsonEmpty: "快照文件及当前机器都不存在容器配置 daemon.json 文件"
RecoverDaemonJson: "恢复容器配置 daemon.json 文件"
RecoverDBData: "恢复数据库数据"
RecoverBackups: "恢复本地备份目录"
RecoverPanelData: "恢复数据目录"

# 任务 - 容器
ContainerImagePull: "拉取容器镜像 {{ .name }}"
ContainerRemoveOld: "删除原容器 {{ .name }}"
ContainerImageCheck: "检查镜像是否正常拉取"
ContainerLoadInfo: "获取容器基本信息"
ContainerRecreate: "容器更新失败，现在开始恢复原容器"
ContainerCreate: "创建新容器 {{ .name }}"
ContainerCreateFailed: "容器创建失败，删除失败容器"
ContainerStartCheck: "检查容器是否已启动"
ContainerAcquireLock: "等待容器 {{ .name }} 操作锁"
ContainerUpgradeItem: "升级容器 {{ .name }}"
ContainerUpgradeSummary: "汇总容器升级结果"
ContainerCleanupWarning: "容器更新成功，但备份容器 {{ .name }} 删除失败。请确认新容器运行正常后手动删除该备份容器。错误：{{ .err }}"
ContainerStopOld: "停止原容器 {{ .name }}"
ContainerRenameOld: "重命名原容器 {{ .name }} 以便回滚"
ContainerDisconnectOld: "释放原容器 {{ .name }} 的网络地址"
ContainerCreateReplacement: "创建替换容器 {{ .name }}"
ContainerStartReplacement: "启动替换容器 {{ .name }}"
ContainerWaitReplacement: "检查替换容器 {{ .name }} 是否就绪"
ContainerRollbackRestartOld: "重新启动原容器 {{ .name }}"
ContainerRollbackRemoveReplacement: "删除启动失败的替换容器 {{ .name }}"
ContainerRollbackRenameOld: "恢复原容器 {{ .name }} 的名称"
ContainerRollbackReconnectOld: "恢复原容器 {{ .name }} 的网络"

# 任务 - 镜像
ImageBuild: "镜像构建"
ImagePull: "拉取镜像"
ImageRepoAuthFromDB: "从数据库获取仓库认证信息"
ImagePush: "推送镜像"
ImageRenameTag: "修改镜像 Tag"
ImageNewTag: "新镜像 Tag {{ .name }}"
ComposeCreate: "创建编排"

# 任务 - 网站
BackupNginxConfig: "备份网站 OpenResty 配置文件"
CompressFileSuccess: "压缩目录成功，压缩为 {{ .name }}"
CompressDir: "压缩目录"
DeCompressFile: "解压文件 {{ .name }}"
ErrCheckValid: "校验备份文件失败，{{ .name }}"
Rollback: "回滚"
websiteDir: "网站目录"
RecoverFailedStartRollBack: "恢复失败，开始回滚"
AppBackupFileIncomplete: "备份文件不完整，缺少 app.json 或 app.tar.gz 文件"
AppAttributesNotMatch: "应用类型或名称不一致"

# 告警
ErrAlertMethodNotSupported: "当前版本不支持此告警方式"
ErrAlertSync: "告警信息同步错误，请检查后重试"

# 任务 - 运行环境
ErrInstallExtension: "已有安装任务正在进行，请等待任务结束"

# 告警邮件模板
PanelAlertTitle: "面板告警通知"
TestAlertTitle: "测试邮件 - 验证邮箱连通性"
TestAlert: "这是一封测试邮件，用于验证邮箱发件配置。"
LicenseExpirationAlert: "您的 {{ .node }}{{ .ip }} 面板，许可证将在 {{ .day }} 天后到期，请登录面板查看详情。"
CronJobFailedAlert: "您的 {{ .node }}{{ .ip }} 面板，计划任务-{{ .name }}执行失败，请登录面板查看详情。"
ClamAlert: "您的 {{ .node }}{{ .ip }} 面板，病毒扫描任务发现 {{ .num }} 个感染文件，请登录面板查看详情。"
WebSiteAlert: "您的 {{ .node }}{{ .ip }} 面板，有 {{ .num }} 个网站将在 {{ .day }} 天后到期，请登录面板查看详情。"
SSLAlert: "您的 {{ .node }}{{ .ip }} 面板，有 {{ .num }} 张SSL证书将在 {{ .day }} 天后到期，请登录面板查看详情。"
DiskUsedAlert: "您的 {{ .node }}{{ .ip }} 面板，磁盘 {{ .name }} 已使用 {{ .used }}，请登录面板查看详情。"
ResourceAlert: "您的 {{ .node }}{{ .ip }} 面板，平均 {{ .time }} 分钟内的 {{ .name }} 使用率为 {{ .used }}，请登录面板查看详情。"
PanelVersionAlert: "您的 {{ .node }}{{ .ip }} 面板，有最新面板版本可供升级，请登录面板查看详情。"
PanelPwdExpirationAlert: "您的 {{ .node }}{{ .ip }} 面板，面板密码将在 {{ .day }} 天后到期，请登录面板查看详情。"
CommonAlert: "您的 {{ .node }}{{ .ip }} 面板，{{ .msg }}，请登录面板查看详情。"
NodeExceptionAlert: "您的 {{ .node }}{{ .ip }} 面板，{{ .num }} 个节点存在异常，请登录面板查看详情。"
LicenseExceptionAlert: "您的 {{ .node }}{{ .ip }} 面板，{{ .num }} 个许可证存在异常，请登录面板查看详情。"
SSHAndPanelLoginAlert: "您的 {{ .node }}{{ .ip }} 面板，面板 {{ .name }} 登录 {{ .loginIp }} 异常，请登录面板查看详情。"

# 磁盘
DeviceNotFound: "设备 {{ .name }} 未找到"
DeviceIsMounted: "设备 {{ .name }} 已挂载，请先卸载"
PartitionDiskErr: "分区失败，{{ .err }}"
FormatDiskErr: "格式化磁盘失败，{{ .err }}"
MountDiskErr: "挂载磁盘失败，{{ .err }}"
XfsNotFound: "未检测到 xfs 文件系统，请先安装 xfsprogs"

# 终端
TerminalAIBlockedRiskyCommand: "已拦截风险命令：{{ .command }}"
TerminalAIThinking: "AI 正在思考..."
TerminalAIReadyToExecute: "思考完成，请回车执行（耗时 {{ .duration }}，token：{{ .tokens }}）"
TerminalAIRequestFailed: "AI 请求失败：{{ .err }}"

# AI 网关
ErrAIProxyServiceNotInstalled: "{{ .name }} 服务未安装"
ErrAIProxyModelAccountNotFound: "模型账号 {{ .id }} 不存在"
ErrAIProxyModelMapRequired: "请填写必填项"
ErrAIProxyModelMapInvalid: "模型映射必须是合法的 JSON 对象：{{ .err }}"
ErrAIProxyModelMapEmpty: "模型映射不能为空"
ErrAIProxyModelMapEmptyExternalModel: "模型映射中存在空的请求模型"
ErrAIProxyModelMapEmptyUpstreamModel: "模型 {{ .model }} 的上游模型不能为空"
AIProxyUserFallback: "已删除用户 (ID: {{ .id }})"
AIProviderBailian: "阿里云百炼"
AIProviderBailianCodingPlan: "阿里云百炼 Coding Plan"
AIProviderArk: "火山方舟"
AIProviderArkCodingPlan: "火山方舟 Coding Plan"
