From 120a696cf058483c1b1c330b31475e6dd4b1e0cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=90=9B=E9=87=8E=E7=94=9FBug=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E5=91=98?= <851046264@qq.com> Date: Fri, 8 May 2026 10:14:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增中文语言文件 pkg/web/locales/zh.json,包含完整的界面翻译内容 --- pkg/web/locales/zh.json | 577 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 577 insertions(+) create mode 100644 pkg/web/locales/zh.json diff --git a/pkg/web/locales/zh.json b/pkg/web/locales/zh.json new file mode 100644 index 0000000..baa4d6c --- /dev/null +++ b/pkg/web/locales/zh.json @@ -0,0 +1,577 @@ +{ + "meta.language_name": "中文", + "page.title": "Fail2ban UI 控制面板", + "nav.dashboard": "控制面板", + "nav.filter_debug": "过滤器调试", + "nav.settings": "设置", + "restart_banner.message": "Fail2ban 配置已更改。要应用更改,请 ", + "restart_banner.button": "重启服务", + "restart_banner.restart_success": "Fail2ban 服务已重启并通过健康检查", + "restart_banner.reload_success": "Fail2ban 配置已成功重新加载(无需重启 systemd 服务)", + "dashboard.title": "控制面板", + "dashboard.overview": "查看活动的 Jails 和封禁记录", + "dashboard.overview_hint": "使用搜索功能过滤封禁的 IP,点击 jail 可以编辑其配置。", + "dashboard.search_label": "搜索封禁 IP", + "dashboard.search_placeholder": "输入 IP 地址进行搜索", + "dashboard.external_ip": "您的外部 IP:", + "dashboard.manage_servers": "管理服务器", + "dashboard.no_servers_title": "未配置 Fail2ban 服务器", + "dashboard.no_servers_body": "添加服务器以开始监控和控制 Fail2ban 实例。", + "dashboard.loading_summary": "正在加载汇总数据…", + "dashboard.errors.summary_failed": "无法从服务器加载汇总信息。", + "dashboard.no_enabled_servers_title": "无活动连接器", + "dashboard.no_enabled_servers_body": "启用本地连接器或注册远程 Fail2ban 服务器以查看实时数据。", + "dashboard.jail_local_warning_title": "此服务器上的 jail.local 不由 Fail2ban-UI 管理", + "dashboard.jail_local_warning_body": "所选服务器上存在文件 /etc/fail2ban/jail.local,但不由 Fail2ban-UI 管理。缺少回调操作(ui-custom-action),这意味着封禁/解封事件将不会被记录,也不会发送邮件警报。要修复此问题,请将 jail.local 中的每个 jail 部分移动到 /etc/fail2ban/jail.d/ 下的独立文件中(使用 jailname.conf 保持默认设置或 jailname.local 覆盖现有 .conf)。然后删除 jail.local,以便 Fail2ban-UI 可以创建其自己的托管版本(在设置页面点击一次保存以写入文件)。确保 Fail2ban-UI 对 /etc/fail2ban/ 具有写入权限 -> 请参阅文档了解详情。", + "dashboard.cards.active_jails": "活动 Jails", + "dashboard.cards.total_banned": "总封禁 IP 数", + "dashboard.cards.new_last_hour": "最近一小时新增", + "dashboard.cards.total_logged": "已存储封禁事件", + "dashboard.cards.recurring_week": "重复 IP", + "dashboard.cards.recurring_hint": "重复违规者(最近7天)", + "dashboard.table.jail_name": "Jail 名称", + "dashboard.table.total_banned": "总封禁数", + "dashboard.table.new_last_hour": "最近一小时新增", + "dashboard.table.banned_ips": "封禁 IP(解封)", + "dashboard.no_jails": "未找到 jails。", + "dashboard.overview_detail": "列表必须展开才能搜索 IP。", + "dashboard.table.time": "时间", + "dashboard.table.jail": "Jail", + "dashboard.table.ip": "IP", + "dashboard.table.log_line": "日志行", + "dashboard.no_banned_ips": "无封禁 IP", + "dashboard.unban": "解封", + "dashboard.manual_block.title": "手动封禁 IP", + "dashboard.manual_block.subtitle": "在特定 jail 中手动封禁 IP 地址。", + "dashboard.manual_block.expand_hint": "点击展开并封禁 IP 地址", + "dashboard.manual_block.jail_label": "选择 Jail", + "dashboard.manual_block.jail_placeholder": "选择 jail...", + "dashboard.manual_block.ip_label": "IP 地址", + "dashboard.manual_block.ip_placeholder": "例如:88.76.21.123", + "dashboard.manual_block.button": "封禁 IP", + "dashboard.manual_block.confirm": "确定在 jail {jail} 中封禁 IP {ip}?", + "dashboard.manual_block.success": "IP 封禁成功", + "dashboard.manual_block.error": "封禁 IP 时出错", + "dashboard.manual_block.jail_required": "请选择 jail", + "dashboard.manual_block.ip_required": "请输入 IP 地址", + "dashboard.manual_block.invalid_ip": "请输入有效的 IP 地址", + "dashboard.banned.show_more": "显示更多", + "dashboard.banned.show_less": "隐藏额外内容", + "logs.overview.title": "内部日志概览", + "logs.overview.subtitle": "Fail2ban-UI 在所有连接器上存储的事件。", + "logs.overview.refresh": "刷新数据", + "logs.overview.total_events": "总存储事件数", + "logs.overview.per_server": "每服务器事件数", + "logs.overview.recent_events_title": "最近存储的事件", + "logs.overview.clear_events": "清除", + "logs.overview.clear_events_confirm": "这将永久删除所有存储的封禁事件。统计数据、洞察和事件历史将重置为零。\n\n此操作无法撤销。继续?", + "logs.overview.clear_events_success": "所有存储的封禁事件已清除。", + "logs.overview.recent_empty": "未找到存储的事件。", + "logs.overview.empty": "尚未记录任何封禁事件。", + "logs.overview.open_insights": "打开洞察", + "logs.overview.total_today": "今日", + "logs.overview.total_week": "最近7天", + "logs.overview.per_server_empty": "暂无每服务器数据。", + "logs.overview.recent_filtered_empty": "没有存储的事件匹配当前过滤器。", + "logs.overview.recent_count_label": "显示事件数", + "logs.overview.load_more": "加载更多", + "logs.overview.country_unknown": "未知", + "logs.overview.last_seen": "最后出现", + "logs.table.server": "服务器", + "logs.table.count": "计数", + "logs.table.jail": "Jail", + "logs.table.ip": "IP", + "logs.table.time": "时间", + "logs.table.country": "国家", + "logs.table.actions": "操作", + "logs.actions.whois": "Whois", + "logs.actions.logs": "日志", + "logs.search.label": "搜索事件", + "logs.search.placeholder": "搜索 IP、jail 或服务器", + "logs.search.country_label": "国家", + "logs.search.country_all": "所有国家", + "logs.search.country_unknown": "未知", + "logs.badge.recurring": "重复", + "logs.modal.whois_title": "Whois 信息", + "logs.modal.logs_title": "日志", + "logs.modal.jail": "Jail", + "logs.modal.insights_title": "封禁洞察", + "logs.modal.insights_description": "国家分布和重复违规者。", + "logs.modal.insights_countries": "按国家封禁", + "logs.modal.insights_countries_empty": "此期间未记录封禁。", + "logs.modal.insights_countries_hint": "所选时间范围内的主要来源。", + "logs.modal.insights_recurring_hint": "重复触发 Fail2ban 的 IP 地址。", + "logs.modal.total_overall_note": "记录的终身封禁数", + "logs.modal.total_today_note": "最近24小时", + "logs.modal.total_week_note": "本周活动", + "logs.modal.insights_recurring": "重复 IP", + "logs.modal.insights_recurring_empty": "未检测到重复 IP。", + "logs.modal.threat_map_title": "全球威胁地图", + "logs.modal.threat_map_hint": "拖动旋转,滚动缩放。", + "logs.modal.threat_map_empty": "无可用地理数据。", + "threat.modal.title": "威胁情报", + "threat.modal.subtitle": "此 IP 的威胁情报数据。", + "threat.modal.loading": "正在加载威胁情报数据...", + "threat.modal.invalid_ip": "无效 IP 地址", + "threat.modal.error_generic": "无法加载威胁情报数据。", + "threat.modal.error_http": "威胁情报请求失败", + "threat.metric.reputation": "信誉", + "threat.metric.confidence": "置信度", + "threat.metric.background_noise": "背景干扰", + "threat.metric.overall_score": "总分", + "threat.metric.provider": "提供商", + "threat.metric.risk": "风险", + "threat.metric.pulses": "脉冲", + "threat.metric.country": "国家", + "threat.metric.asn": "ASN", + "threat.metric.abuse_confidence": "滥用置信度", + "threat.metric.total_reports": "报告总数", + "threat.metric.distinct_users": "独立用户", + "threat.provider.alienvault": "AlienVault OTX", + "threat.provider.abuseipdb": "AbuseIPDB", + "threat.modal.provider_unknown": "未知提供商", + "threat.section.overview": "概览", + "threat.section.network_location": "网络和位置", + "threat.section.history_activity": "历史和活动", + "threat.section.activity_level": "活动级别", + "threat.section.pulses": "脉冲", + "threat.section.reports": "报告", + "threat.section.scores": "分数", + "threat.section.behaviors": "行为", + "threat.section.attack_details": "攻击详情", + "threat.section.classifications": "分类", + "threat.section.mitre": "MITRE 技术", + "threat.section.references": "参考", + "threat.section.cves": "CVEs", + "threat.section.target_countries": "目标国家", + "threat.field.ip": "IP", + "threat.field.type": "类型", + "threat.field.asn": "ASN", + "threat.field.as_name": "AS 名称", + "threat.field.proxy_vpn": "代理/VPN", + "threat.field.reverse_dns": "反向 DNS", + "threat.field.ip_range": "IP 范围", + "threat.field.ip_range_24": "/24 范围", + "threat.field.country": "国家", + "threat.field.city": "城市", + "threat.field.isp": "ISP", + "threat.field.domain": "域名", + "threat.field.usage_type": "使用类型", + "threat.field.whitelisted": "白名单", + "threat.field.latitude": "纬度", + "threat.field.longitude": "经度", + "threat.field.first_seen": "首次出现", + "threat.field.last_seen": "最后出现", + "threat.field.full_age": "完整时长", + "threat.field.days_age": "天数", + "threat.field.continent": "大洲", + "threat.field.accuracy_radius": "精度半径", + "threat.field.subdivision": "细分区域", + "threat.field.validation_source": "来源", + "threat.field.validation_name": "规则", + "threat.field.industries": "行业", + "threat.field.adversary": "对手", + "threat.field.malware_families": "恶意软件家族", + "threat.field.ip_version": "IP 版本", + "threat.field.public_ip": "公网 IP", + "threat.field.tor": "Tor 出口节点", + "threat.field.hostnames": "主机名", + "threat.field.reporter": "报告者", + "threat.field.reporter_id": "报告者 ID", + "threat.field.categories": "类别", + "threat.field.tlp": "TLP", + "threat.field.author": "作者", + "threat.field.subscribers": "订阅者", + "threat.field.indicators": "指标", + "threat.field.tags": "标签", + "threat.section.validation": "验证", + "threat.section.related_context": "相关上下文", + "threat.score.overall": "总体", + "threat.score.last_day": "最近一天", + "threat.score.last_week": "最近一周", + "threat.score.last_month": "最近一月", + "threat.empty.list": "无可用数据。", + "threat.empty.target_countries": "无可用目标国家数据。", + "threat.boolean.yes": "是", + "threat.boolean.no": "否", + "filter_debug.title": "过滤器调试", + "filter_debug.select_filter": "选择过滤器", + "filter_debug.filter_content": "过滤器内容", + "filter_debug.filter_content_hint": "在下方编辑过滤器正则表达式进行测试。更改是临时的,不会保存。", + "filter_debug.filter_content_hint_readonly": "过滤器内容以只读方式显示。点击'编辑'进行测试修改。更改是临时的,不会保存。", + "filter_debug.edit_filter": "编辑", + "filter_debug.cancel_edit": "取消", + "filter_debug.log_lines": "日志行", + "filter_debug.log_lines_placeholder": "在此输入日志行...", + "filter_debug.test_filter": "测试过滤器", + "filter_debug.test_results_title": "测试结果", + "filter_debug.no_matches": "未找到匹配项。", + "settings.title": "设置", + "settings.general": "常规设置", + "settings.language": "语言", + "settings.server_port": "服务器端口", + "settings.server_port_placeholder": "例如:8080", + "settings.port_env_set": "端口通过 PORT 环境变量设置:", + "settings.port_env_hint": "要通过 Web UI 更改端口,请移除 PORT 环境变量并重启容器。", + "settings.port_restart_hint": "⚠️ 端口更改需要重启容器才能生效。", + "settings.enable_debug": "启用调试日志", + "settings.enable_console": "启用控制台输出", + "settings.console.title": "控制台输出", + "settings.console.clear": "清除", + "settings.console.save_hint": "请先保存设置,然后才能在此显示日志。", + "settings.alert": "警报设置", + "settings.callback_url": "Fail2ban 回调 URL", + "settings.callback_url_placeholder": "http://127.0.0.1:8080", + "settings.callback_url_hint": "此 URL 用于所有 Fail2Ban 实例向 Fail2Ban UI 发送封禁警报。对于本地部署,使用与 Fail2Ban UI 相同的端口(例如 http://127.0.0.1:8080)。对于反向代理设置,使用 TLS 加密端点(例如 https://fail2ban.example.com)。", + "settings.callback_url_env_set": "回调 URL 通过 CALLBACK_URL 环境变量设置:", + "settings.callback_url_env_hint": "要通过 Web UI 更改回调 URL,请移除 CALLBACK_URL 环境变量并重启容器。", + "settings.callback_secret": "Fail2ban 回调 URL 密钥", + "settings.callback_secret_placeholder": "自动生成的 42 位密钥", + "settings.callback_secret.description": "此密钥用于验证封禁 API 请求。它会自动包含在 fail2ban 操作配置中。", + "settings.destination_email": "目标邮箱(警报接收者)", + "settings.destination_email_placeholder": "alerts@swissmakers.ch", + "settings.alert_countries": "警报国家", + "settings.alert_countries_description": "选择触发封禁时要接收邮件警报的国家。", + "settings.alerts": "警报偏好", + "settings.alerts_for_bans": "启用封禁警报", + "settings.alerts_for_unbans": "启用解封警报", + "settings.alert_provider": "警报提供商", + "settings.alert_provider_email": "邮件 (SMTP)", + "settings.alert_provider_webhook": "Webhook", + "settings.alert_provider_elasticsearch": "Elasticsearch", + "settings.threat_intel.title": "威胁情报", + "settings.threat_intel.provider": "威胁情报提供商", + "settings.threat_intel.provider_none": "无(禁用)", + "settings.threat_intel.provider_alienvault": "AlienVault OTX", + "settings.threat_intel.provider_abuseipdb": "AbuseIPDB", + "settings.threat_intel.provider_hint": "所选提供商将用于威胁情报模态框。", + "settings.threat_intel.alienvault_api_key": "AlienVault API 密钥", + "settings.threat_intel.alienvault_api_key_hint": "在您的 AlienVault 账户资料中创建 OTX 密钥。", + "settings.threat_intel.abuseipdb_api_key": "AbuseIPDB API 密钥", + "settings.threat_intel.abuseipdb_api_key_hint": "在您的 AbuseIPDB 账户设置中生成 API 密钥。", + "settings.webhook.title": "Webhook 配置", + "settings.webhook.url": "Webhook URL", + "settings.webhook.url_placeholder": "https://my-ntfy-server/fail2ban-topic", + "settings.webhook.method": "HTTP 方法", + "settings.webhook.headers": "自定义头", + "settings.webhook.headers_placeholder": "Authorization: Bearer your-token", + "settings.webhook.headers_hint": "每行一个头,格式为 Key: Value。", + "settings.webhook.skip_tls": "跳过 TLS 证书验证", + "settings.webhook.test": "发送测试 Webhook", + "settings.webhook.test_hint": "请先保存您的 webhook 设置,然后再进行测试。", + "settings.elasticsearch.title": "Elasticsearch 配置", + "settings.elasticsearch.url": "Elasticsearch URL", + "settings.elasticsearch.url_placeholder": "https://elasticsearch.example.com:9200", + "settings.elasticsearch.index": "索引名称", + "settings.elasticsearch.index_placeholder": "fail2ban-events", + "settings.elasticsearch.index_hint": "日期后缀 (-YYYY.MM.DD) 将自动附加用于索引生命周期管理。", + "settings.elasticsearch.api_key": "API 密钥", + "settings.elasticsearch.api_key_placeholder": "Base64 编码的 API 密钥", + "settings.elasticsearch.api_key_hint": "首选认证方法。留空以使用用户名/密码。", + "settings.elasticsearch.username": "用户名", + "settings.elasticsearch.username_placeholder": "elastic", + "settings.elasticsearch.password": "密码", + "settings.elasticsearch.skip_tls": "跳过 TLS 证书验证", + "settings.elasticsearch.test": "测试连接", + "settings.elasticsearch.test_hint": "请先保存您的 Elasticsearch 设置,然后再进行测试。", + "settings.elasticsearch.help_title": "Elasticsearch 设置指南", + "settings.elasticsearch.help_template_title": "1. 创建索引模板", + "settings.elasticsearch.help_template_desc": "在 Kibana Dev Tools 或通过 API 创建索引模板,以便 Elasticsearch 正确映射所有字段。模板包括核心事件字段、丰富的日志字段(HTTP、SSH 等)和解析的 WHOIS 字段:", + "settings.elasticsearch.help_doc_title": "2. 文档结构", + "settings.elasticsearch.help_doc_desc": "Fail2ban-UI 发送 ECS 兼容的文档,带有自动日志和 WHOIS 丰富功能。日志行通过 grok 模式(Apache、Nginx、sshd、Postfix 等)解析,WHOIS 文本提取到结构化字段中。每个事件索引到 fail2ban-events-YYYY.MM.DD:", + "settings.elasticsearch.help_auth_title": "3. 认证", + "settings.elasticsearch.help_auth_desc": "使用 API 密钥(首选)或基本认证,用户需要对 fail2ban-events-* 索引具有写入权限。在 Kibana 的 Stack Management → API Keys 中创建 API 密钥。", + "settings.elasticsearch.help_savetest_title": "4. 保存并测试", + "settings.elasticsearch.help_savetest_desc": "保存 Fail2ban-UI 设置并通过点击测试按钮测试与 Elasticsearch 的连接。(这将创建 fail2ban-events-* 索引并摄入第一个事件。)", + "settings.elasticsearch.help_dataview_title": "5. Kibana 数据视图", + "settings.elasticsearch.help_dataview_desc": "在 Kibana 中,转到 Stack Management → Data Views → Create data view。使用 fail2ban-events-* 作为名称和索引模式,并选择 @timestamp 作为时间字段。", + "settings.elasticsearch.help_review_title": "6. 查看数据", + "settings.elasticsearch.help_review_desc": "在 Kibana 中,转到 Discover → 选择 fail2ban-events-* 索引,您应该会看到第一个摄入的事件。", + "settings.smtp": "SMTP 配置", + "settings.smtp_host": "SMTP 主机", + "settings.smtp_host_placeholder": "例如:smtp.gmail.com", + "settings.smtp_port": "SMTP 端口", + "settings.smtp_port_placeholder": "587", + "settings.smtp_port_hint": "常用端口:25(明文)、587(STARTTLS)、465(SMTPS)、2525(备用 STARTTLS)", + "settings.smtp_auth_method": "认证方法", + "settings.smtp_auth_method_auto": "自动(优先 LOGIN)", + "settings.smtp_auth_method_login": "LOGIN", + "settings.smtp_auth_method_plain": "PLAIN", + "settings.smtp_auth_method_cram_md5": "CRAM-MD5", + "settings.smtp_auth_method_hint": "LOGIN 推荐用于 Office365/Gmail。PLAIN 是标准 SMTP 认证。CRAM-MD5 是基于挑战-响应的。", + "settings.smtp_insecure_skip_verify": "跳过 TLS 证书验证", + "settings.smtp_insecure_skip_verify_warning": "不推荐用于生产环境", + "settings.smtp_username": "SMTP 用户名", + "settings.smtp_username_placeholder": "例如:user@example.com", + "settings.smtp_password": "SMTP 密码", + "settings.smtp_password_placeholder": "输入 SMTP 密码", + "settings.smtp_sender": "发件人邮箱", + "settings.smtp_sender_placeholder": "noreply@swissmakers.ch", + "settings.smtp_tls": "使用 TLS(推荐)", + "settings.send_test_email": "发送测试邮件", + "settings.send_test_email_hint": "请先保存您的 SMTP 设置,然后再发送测试邮件。", + "settings.fail2ban": "全局默认 Fail2Ban 配置", + "settings.fail2ban.description": "这些设置将应用于所有启用的 Fail2Ban 服务器,并存储在其 jail.local [DEFAULT] 部分。", + "settings.enable_bantime_increment": "启用封禁时间递增", + "settings.enable_bantime_increment.description": "如果设置为 true,封禁时间将使用公式计算:bantime = findtime * (失败次数 / maxretry) * (1 + bantime.rndtime)。", + "settings.default_jail_enable": "默认启用 Jails", + "settings.default_jail_enable.description": "如果启用,所有 jails 将默认启用。禁用时,必须显式启用 jails。", + "settings.default_bantime": "默认封禁时间", + "settings.default_bantime.description": "主机被封禁的秒数。时间格式:1m = 1分钟,1h = 1小时,1d = 1天,1w = 1周,1mo = 1月,1y = 1年。", + "settings.default_bantime_placeholder": "例如:48h", + "settings.bantime_rndtime": "封禁时间随机增量", + "settings.bantime_rndtime.description": "可选。封禁时间递增公式中添加的最大随机秒数(例如 2048)。留空使用 Fail2ban 默认值。", + "settings.bantime_rndtime_placeholder": "例如:2048", + "settings.default_chain": "默认链", + "settings.default_chain.description": "用于封禁的 iptables/nftables 链(例如主机使用 INPUT,Docker 容器使用 DOCKER-USER)。", + "settings.chain_help_title": "默认链", + "settings.chain_docker_user": "DOCKER-USER", + "settings.chain_help_docker_user": "用于在 Docker 中运行的应用。封禁适用于主机上的所有容器。", + "settings.chain_input": "INPUT", + "settings.chain_help_input": "用于主机上的应用。封禁仅适用于主机网络,不适用于 Docker 网络。", + "settings.chain_forward": "FORWARD", + "settings.chain_help_forward": "仅适用于 DOCKER-USER 不可用的旧版 Docker 设置。", + "settings.banaction": "封禁操作", + "settings.banaction.description": "默认封禁操作(例如 nftables-multiport、nftables-allports、firewallcmd-rich-rules 等)。用于定义 action_* 变量。", + "settings.banaction_allports": "封禁所有端口操作", + "settings.banaction_allports.description": "封禁所有端口的操作(例如 nftables-allports、firewallcmd-allports 等)。当 jail 需要封禁所有端口而不是特定端口时使用。", + "settings.default_findtime": "默认查找时间", + "settings.default_findtime.description": "如果主机在最近 'findtime' 秒内产生 'maxretry' 次失败,则封禁该主机。时间格式:1m = 1分钟,1h = 1小时,1d = 1天,1w = 1周,1mo = 1月,1y = 1年。", + "settings.default_findtime_placeholder": "例如:30m", + "settings.default_max_retry": "默认最大重试次数", + "settings.default_max_retry.description": "主机被封禁前的失败次数。", + "settings.default_max_retry_placeholder": "输入最大重试次数", + "settings.geoip_provider": "GeoIP 提供商", + "settings.geoip_provider.description": "选择 GeoIP 查询提供商。MaxMind 需要本地数据库文件,而内置使用免费在线 API。", + "settings.geoip_provider.maxmind": "MaxMind(本地数据库)", + "settings.geoip_provider.builtin": "内置(ip-api.com)", + "settings.geoip_database_path": "GeoIP 数据库路径", + "settings.geoip_database_path.description": "MaxMind GeoLite2-Country 数据库文件的路径。", + "settings.max_log_lines": "最大日志行数", + "settings.max_log_lines.description": "封禁通知中包含的最大日志行数。系统会自动选择最相关的行。", + "settings.ignore_ips": "忽略 IP", + "settings.ignore_ips.description": "空格分隔的 IP 地址、CIDR 掩码或 DNS 主机列表。Fail2ban 不会封禁与此列表中地址匹配的主机。", + "settings.ignore_ips_placeholder": "要忽略的 IP,用空格分隔", + "settings.advanced.title": "重复违规者的高级操作", + "settings.advanced.description": "自动将重复违规者同步到外部防火墙或阻止列表。", + "settings.advanced.refresh_log": "刷新日志", + "settings.advanced.test_button": "手动封禁 / 测试", + "settings.advanced.enable": "启用自动永久封禁", + "settings.advanced.threshold": "永久封禁阈值", + "settings.advanced.threshold_hint": "一旦 IP 达到此封禁次数,将转发到集成。", + "settings.advanced.integration": "集成", + "settings.advanced.integration_none": "选择集成", + "settings.advanced.integration_hint": "选择应创建永久封禁的防火墙或设备。", + "settings.advanced.mikrotik.note": "提供对 Mikrotik 路由器的 SSH 访问权限以及应包含封禁 IP 的地址列表。", + "settings.advanced.mikrotik.host": "主机", + "settings.advanced.mikrotik.port": "端口", + "settings.advanced.mikrotik.username": "SSH 用户名", + "settings.advanced.mikrotik.password": "SSH 密码", + "settings.advanced.mikrotik.key": "SSH 密钥路径(可选)", + "settings.advanced.mikrotik.list": "地址列表名称", + "settings.advanced.pfsense.note": "需要 pfSense REST API 包。输入 API 密钥和别名进行管理。", + "settings.advanced.pfsense.install_link": "安装 REST API 包", + "settings.advanced.pfsense.api_key_setup": "设置 API 密钥", + "settings.advanced.pfsense.base_url": "基础 URL", + "settings.advanced.pfsense.token": "API 密钥", + "settings.advanced.pfsense.token_hint": "在 pfSense webConfigurator 的 System > REST API > Keys 中生成", + "settings.advanced.pfsense.alias": "别名名称", + "settings.advanced.pfsense.skip_tls": "跳过 TLS 验证(自签名证书)", + "settings.advanced.opnsense.note": "输入 OPNsense API 凭据和别名进行管理。", + "settings.advanced.opnsense.api_docs": "API 文档", + "settings.advanced.opnsense.api_key_setup": "设置 API 密钥", + "settings.advanced.opnsense.base_url": "基础 URL", + "settings.advanced.opnsense.key": "API 密钥", + "settings.advanced.opnsense.key_hint": "在 System > Access > Users > API Keys 中生成", + "settings.advanced.opnsense.secret": "API 密钥", + "settings.advanced.opnsense.secret_hint": "与 API 密钥一起生成", + "settings.advanced.opnsense.alias": "别名名称", + "settings.advanced.opnsense.skip_tls": "跳过 TLS 验证(自签名证书)", + "settings.advanced.log_title": "永久封禁日志", + "settings.advanced.clear_log": "清除", + "settings.advanced.clear_log_confirm": "这将永久删除整个封禁日志。Fail2ban UI 将假定外部防火墙上当前没有封禁任何 IP。\n\n此操作无法撤销。继续?", + "settings.advanced.clear_log_success": "永久封禁日志已清除。", + "settings.advanced.log_empty": "尚未记录永久封禁。", + "settings.advanced.log_ip": "IP", + "settings.advanced.log_integration": "集成", + "settings.advanced.log_status": "状态", + "settings.advanced.log_message": "消息", + "settings.advanced.log_server": "服务器", + "settings.advanced.log_updated": "更新时间", + "settings.advanced.log_actions": "操作", + "settings.advanced.unblock_btn": "移除", + "settings.advanced.test_title": "手动封禁 / 测试", + "settings.advanced.test_ip": "IP 地址", + "settings.advanced.test_server": "可选服务器", + "settings.advanced.test_server_none": "使用全局集成设置", + "settings.advanced.test_block": "封禁 IP", + "settings.advanced.test_unblock": "移除 IP", + "settings.save": "保存", + "modal.filter_config": "过滤器 / Jail 配置:", + "modal.filter_config_edit": "编辑过滤器 / Jail", + "modal.filter_config_label": "过滤器配置", + "modal.filter_config_hint": "如果留空,将创建一个空的过滤器文件。", + "modal.filter_name": "过滤器名称", + "modal.filter_name_hint": "只允许字母数字字符、破折号和下划线。", + "modal.jail_config": "Jail 配置", + "modal.jail_config_hint": "选择过滤器后,Jail 配置将自动填充。", + "modal.jail_config_label": "Jail 配置", + "modal.jail_filter": "过滤器(可选)", + "modal.jail_filter_hint": "选择过滤器将自动填充 jail 配置。", + "modal.jail_name": "Jail 名称", + "modal.jail_name_hint": "只允许字母数字字符、破折号和下划线。", + "modal.test_logpath": "测试日志路径", + "modal.local_server_logpath_note": "⚠️ 注意:", + "modal.local_server_logpath_text_prefix": "对于本地 fail2ban 服务器(例如安装在容器主机系统上或同一主机的容器中),日志文件也必须挂载到 fail2ban-ui 容器(例如:", + "modal.local_server_logpath_text_suffix": ") 这是必需的,以便 fail2ban-ui 在更新 jails 时可以验证 logpath 变量或路径。", + "modal.create": "创建", + "modal.create_filter": "创建新过滤器", + "modal.create_filter_title": "创建新过滤器", + "modal.create_jail": "创建新 Jail", + "modal.create_jail_title": "创建新 Jail", + "modal.cancel": "取消", + "modal.save": "保存", + "modal.close": "关闭", + "loading": "加载中...", + "dashboard.manage_jails": "管理 Jails", + "modal.manage_jails_title": "管理 Jails", + "servers.selector.label": "活动服务器", + "servers.selector.empty": "未配置服务器", + "servers.selector.none": "未配置服务器。请添加 Fail2ban 服务器。", + "servers.modal.title": "管理 Fail2ban 服务器", + "servers.modal.description": "注册远程 Fail2ban 实例并选择 UI 连接方式。", + "servers.modal.list_title": "已注册服务器", + "servers.modal.list_empty": "尚未配置服务器。使用右侧表单添加您的第一个 Fail2ban 服务器。", + "servers.modal.info_title": "服务器管理器", + "servers.modal.info_body": "从列表中编辑现有服务器,或单击上方按钮创建新连接器。", + "servers.modal.form_title": "添加或更新服务器", + "servers.form.name": "显示名称", + "servers.form.name_placeholder": "我的 Fail2ban 服务器", + "servers.form.type": "连接类型", + "servers.type.local": "本地(同一主机)", + "servers.type.ssh": "SSH", + "servers.type.agent": "API 代理", + "servers.form.host": "主机名 / IP", + "servers.form.host_placeholder": "fail2ban.example.com", + "servers.form.port": "端口", + "servers.form.port_placeholder": "22", + "servers.form.socket_path": "Fail2ban Socket 路径", + "servers.form.socket_path_placeholder": "/var/run/fail2ban/fail2ban.sock", + "servers.form.config_path": "Fail2ban 配置挂载路径", + "servers.form.config_path_placeholder": "/etc/fail2ban-secondary", + "servers.form.config_path_help": "其他本地连接器必需。必须唯一并匹配您的容器挂载目标。", + "servers.form.log_path": "Fail2ban 日志路径", + "servers.form.hostname": "服务器主机名", + "servers.form.hostname_placeholder": "可选", + "servers.form.ssh_user": "SSH 用户", + "servers.form.ssh_user_placeholder": "sa_fail2ban", + "servers.form.ssh_key": "SSH 私钥路径", + "servers.form.ssh_key_placeholder": "/config/.ssh/id_rsa", + "servers.form.ssh_key_help": "将您的 SSH 私钥放在 /config/.ssh/ 目录(挂载的配置卷)中。密钥文件必须具有 600 权限(chmod 600)。例如:/config/.ssh/id_rsa", + "servers.form.agent_url": "代理 URL", + "servers.form.agent_url_placeholder": "https://host:9700", + "servers.form.agent_secret": "代理密钥", + "servers.form.agent_secret_placeholder": "共享密钥令牌", + "servers.form.tags": "标签", + "servers.form.tags_placeholder": "逗号,分隔,标签", + "servers.form.set_default": "设为默认服务器", + "servers.form.enabled": "启用连接器", + "servers.form.submit": "保存服务器", + "servers.form.reset": "重置", + "servers.form.new_server": "新服务器", + "servers.form.success": "服务器保存成功。", + "servers.badge.default": "默认", + "servers.badge.enabled": "已启用", + "servers.badge.disabled": "已禁用", + "servers.badge.restart_needed": "需要重启", + "servers.actions.edit": "编辑", + "servers.actions.set_default": "设为默认", + "servers.actions.enable": "启用", + "servers.actions.disable": "禁用", + "servers.actions.test": "测试连接", + "servers.actions.test_success": "连接成功", + "servers.actions.test_failure": "连接失败", + "servers.jail_local_warning": "警告:jail.local 不由 Fail2ban-UI 管理。将每个 jail 移动到 jail.d/ 下的独立文件中,并删除 jail.local,以便 Fail2ban-UI 可以重新创建它(在设置页面点击一次保存以写入文件)。请参阅文档了解权限要求。", + "servers.actions.restart": "重启 Fail2ban", + "servers.actions.reload": "重新加载 Fail2ban", + "servers.actions.reload_tooltip": "对于本地连接器,只能通过 socket 连接进行配置重新加载。容器无法使用 systemctl 重启 Fail2ban 服务。要执行完全重启,请在主机系统上直接运行 'systemctl restart fail2ban'。", + "servers.actions.delete": "删除", + "servers.actions.delete_confirm": "删除此服务器条目?", + "servers.form.select_key": "选择私钥", + "servers.form.select_key_placeholder": "手动输入", + "servers.form.no_keys": "未找到 SSH 密钥;请手动输入路径", + "servers.validation.name_required": "服务器名称是必需的。", + "servers.validation.duplicate_name": "已存在同名服务器。", + "servers.validation.duplicate_socket": "已存在使用此 socket 路径的本地连接器。", + "servers.validation.duplicate_config_path": "已存在使用此配置路径的本地连接器。", + "servers.validation.agent_required": "API 代理服务器需要代理 URL 和代理密钥。", + "servers.card.socket_path": "Socket 路径", + "servers.card.config_path": "配置路径", + "servers.card.server_id": "服务器 ID", + "filter_debug.not_available": "过滤器调试仅在至少有一个已注册的 Fail2ban 服务器启用时可用。", + "filter_debug.local_missing": "在此主机上未找到本地 Fail2ban 过滤器目录。", + "filter_debug.save_success": "过滤器和 jail 配置已保存并重新加载", + "filter_debug.save_reload_warning": "配置已保存,但 fail2ban 重新加载失败", + "filter_debug.jail_auto_disabled": "Jail '%s' 已自动禁用。", + "email.ban.title": "安全警报:Fail2Ban 封禁了新的 IP 地址", + "email.ban.intro": "Fail2Ban-UI 检测到恶意请求或重复认证失败,并自动封禁了源 IP。请查看下面的元数据和日志摘要。", + "email.ban.subject.banned": "已封禁", + "email.ban.subject.from": "来自", + "email.ban.details.banned_ip": "封禁 IP", + "email.ban.details.jail": "Jail", + "email.ban.details.hostname": "主机名", + "email.ban.details.failed_attempts": "失败尝试次数", + "email.ban.details.country": "国家", + "email.ban.details.timestamp": "时间戳", + "email.ban.whois_title": "WHOIS 信息", + "email.ban.logs_title": "相关日志摘要", + "email.test.title": "邮件传递测试", + "email.test.intro": "此消息确认您的 SMTP 配置工作正常,可以发送 HTML 格式的邮件。", + "email.test.subject": "来自 Fail2Ban UI 的测试邮件", + "email.test.details.recipient": "收件人", + "email.test.details.smtp_host": "SMTP 主机", + "email.test.details.triggered_at": "触发时间", + "email.test.whois_no_data": "测试邮件不执行 WHOIS 查询。", + "email.test.sample_logs": "2025-01-01T12:00:00Z Fail2ban-UI 的示例日志条目。", + "email.whois.no_data": "此事件未捕获 WHOIS 数据。", + "email.logs.no_data": "此封禁未捕获日志条目。", + "email.footer.text": "此消息由 Fail2Ban-UI 自动生成", + "email.unban.title": "IP 地址已解封", + "email.unban.intro": "某个 IP 地址已从 Fail2Ban jail 中解封。", + "email.unban.subject.unbanned": "已解封", + "email.unban.subject.from": "来自", + "email.unban.details.unbanned_ip": "解封 IP", + "email.unban.details.jail": "Jail", + "email.unban.details.hostname": "主机名", + "email.unban.details.country": "国家", + "email.unban.details.timestamp": "时间戳", + "lotr.email.title": "黑暗仆人已被驱逐", + "lotr.email.intro": "中土世界的守护者已检测到威胁并将其驱逐出领地。", + "lotr.email.you_shall_not_pass": "你不能通过", + "lotr.email.footer": "愿服务器得到保护。一个封禁统治所有人。", + "lotr.email.details.dark_servant_location": "黑暗仆人的位置", + "lotr.email.details.realm_protection": "保护领域", + "lotr.email.details.origins": "来自", + "lotr.email.details.banished_at": "被驱逐于", + "lotr.email.unban.title": "被囚禁者已获释", + "lotr.email.unban.intro": "中土世界的守护者已恢复对领地的访问权限。", + "lotr.email.unban.details.restored_ip": "恢复的 IP", + "lotr.banished": "被驱逐出领地", + "lotr.realms_protected": "受保护的领地", + "lotr.threats_banished": "被驱逐的威胁", + "toast.ban.title": "发生新封禁", + "toast.ban.action": "在封禁", + "toast.unban.title": "IP 已解封", + "toast.unban.action": "从解封", + "auth.login_title": "登录 Fail2ban UI", + "auth.login_description": "请进行身份验证以访问管理界面", + "auth.login_button": "使用 OIDC 登录", + "auth.logging_in": "正在重定向到登录页面...", + "auth.logout": "登出", + "auth.user_info": "用户信息", + "auth.session_expired": "您的会话已过期。请重新登录。", + "auth.login_required": "需要身份验证", + "footer.version": "Fail2ban-UI v{version}", + "footer.latest": "最新版本", + "footer.update_available": "有更新可用:v{version}" +} \ No newline at end of file