This commit is contained in:
jokob-sk
2026-02-01 10:36:35 +11:00
3 changed files with 61 additions and 33 deletions

View File

@@ -27,8 +27,8 @@
"AppEvents_ObjectType": "对象类型",
"AppEvents_Plugin": "插件",
"AppEvents_Type": "类型",
"BACKEND_API_URL_description": "",
"BACKEND_API_URL_name": "",
"BACKEND_API_URL_description": "用于生成后端API URL。如果您使用反向代理映射到您的<code>GRAPHQL_PORT</code>,请指定。请输入以<code>http://</code>开头的完整URL包括端口号末尾不带斜杠<code>/</code>)。",
"BACKEND_API_URL_name": "后端 API 网址",
"BackDevDetail_Actions_Ask_Run": "您要执行此操作吗?",
"BackDevDetail_Actions_Not_Registered": "未注册的操作: ",
"BackDevDetail_Actions_Title_Run": "运行动作",
@@ -98,10 +98,10 @@
"DevDetail_MainInfo_Network": "<i class=\"fa fa-server\"></i> 节点 (MAC)",
"DevDetail_MainInfo_Network_Port": "<i class=\"fa fa-ethernet\"></i> 端口",
"DevDetail_MainInfo_Network_Site": "地点",
"DevDetail_MainInfo_Network_Title": "网络",
"DevDetail_MainInfo_Network_Title": "网络 详情",
"DevDetail_MainInfo_Owner": "所有者",
"DevDetail_MainInfo_SSID": "SSID",
"DevDetail_MainInfo_Title": "主要信息",
"DevDetail_MainInfo_Title": "设备信息",
"DevDetail_MainInfo_Type": "类型",
"DevDetail_MainInfo_Vendor": "制造商",
"DevDetail_MainInfo_mac": "MAC",
@@ -203,10 +203,10 @@
"Device_MultiEdit_MassActions": "谨慎操作:",
"Device_MultiEdit_No_Devices": "未选择设备。",
"Device_MultiEdit_Tooltip": "小心。 单击此按钮会将左侧的值应用到上面选择的所有设备。",
"Device_Save_Failed": "",
"Device_Save_Unauthorized": "",
"Device_Saved_Success": "",
"Device_Saved_Unexpected": "",
"Device_Save_Failed": "保存设备失败",
"Device_Save_Unauthorized": "未授权 - API 令牌无效",
"Device_Saved_Success": "设备保存成功",
"Device_Saved_Unexpected": "设备更新返回了一个意外的响应",
"Device_Searchbox": "搜索",
"Device_Shortcut_AllDevices": "我的设备",
"Device_Shortcut_AllNodes": "全部节点",
@@ -226,8 +226,8 @@
"Device_TableHead_FirstSession": "加入",
"Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "组",
"Device_TableHead_IPv4": "",
"Device_TableHead_IPv6": "",
"Device_TableHead_IPv4": "IPv4",
"Device_TableHead_IPv6": "IPv6",
"Device_TableHead_Icon": "图标",
"Device_TableHead_LastIP": "上次 IP",
"Device_TableHead_LastIPOrder": "上次 IP 排序",
@@ -251,7 +251,7 @@
"Device_TableHead_SyncHubNodeName": "同步节点",
"Device_TableHead_Type": "类型",
"Device_TableHead_Vendor": "制造商",
"Device_TableHead_Vlan": "",
"Device_TableHead_Vlan": "VLAN",
"Device_Table_Not_Network_Device": "未配置为网络设备",
"Device_Table_info": "显示第_START_至 END_条_共_TOTAL_条",
"Device_Table_nav_next": "下一页",
@@ -299,14 +299,14 @@
"Events_Tablelenght": "显示_MENU_条",
"Events_Tablelenght_all": "全部",
"Events_Title": "事件",
"FakeMAC_hover": "",
"FieldLock_Error": "",
"FieldLock_Lock_Tooltip": "",
"FieldLock_Locked": "",
"FieldLock_SaveBeforeLocking": "",
"FieldLock_Source_Label": "",
"FieldLock_Unlock_Tooltip": "",
"FieldLock_Unlocked": "",
"FakeMAC_hover": "该设备具有伪造/欺骗的 MAC 地址",
"FieldLock_Error": "更新字段锁定状态时出错",
"FieldLock_Lock_Tooltip": "锁定字段(防止插件覆盖)",
"FieldLock_Locked": "字段锁定",
"FieldLock_SaveBeforeLocking": "在锁定之前请先保存您的更改",
"FieldLock_Source_Label": "出自: ",
"FieldLock_Unlock_Tooltip": "解锁字段(允许插件覆盖)",
"FieldLock_Unlocked": "字段解锁",
"GRAPHQL_PORT_description": "GraphQL服务器的端口号。请确保该端口在该主机和 NetAlertX 实例上的所有应用程序中都是唯一的。",
"GRAPHQL_PORT_name": "GraphQL端口",
"Gen_Action": "动作",
@@ -328,7 +328,7 @@
"Gen_Filter": "筛选",
"Gen_Generate": "生成",
"Gen_InvalidMac": "无效的 Mac 地址。",
"Gen_Invalid_Value": "",
"Gen_Invalid_Value": "输入了无效的值",
"Gen_LockedDB": "错误 - DB 可能被锁定 - 检查 F12 开发工具 -> 控制台或稍后重试。",
"Gen_NetworkMask": "网络掩码",
"Gen_Offline": "离线",
@@ -402,7 +402,7 @@
"Maintenance_Tool_ExportCSV": "设备导出csv",
"Maintenance_Tool_ExportCSV_noti": "设备导出csv",
"Maintenance_Tool_ExportCSV_noti_text": "您确定要生成 CSV 文件吗?",
"Maintenance_Tool_ExportCSV_text": "生成一个 CSV逗号分隔值文件其中包含设备列表包括网络节点和连接设备之间的网络关系。您也可以通过访问此 URL <code>your NetAlertX url/php/server/devices.php?action=ExportCSV</code> 或启用 <a href=\"settings.php#CSVBCKP_header\">CSV Backup</a> 插件来触发此功能。",
"Maintenance_Tool_ExportCSV_text": "生成一个 CSV逗号分隔值文件其中包含设备列表包括网络节点和连接设备之间的网络关系。您也可以启用 <a href=\"settings.php#CSVBCKP_header\">CSV Backup</a> 插件来触发此功能。",
"Maintenance_Tool_ImportCSV": "设备导入csv",
"Maintenance_Tool_ImportCSV_noti": "设备导入csv",
"Maintenance_Tool_ImportCSV_noti_text": "您确定要导入 CSV 文件吗?这将完全<b>覆盖</b>数据库中的设备。",
@@ -414,10 +414,10 @@
"Maintenance_Tool_ImportPastedConfig": "设置导入(粘贴)",
"Maintenance_Tool_ImportPastedConfig_noti_text": "您确认要导入粘贴的设置吗?这会完全<b>覆盖</b><code>app.conf</code>的内容。",
"Maintenance_Tool_ImportPastedConfig_text": "导入包含所有应用程序设置的<code>app.conf</code>文件。建议先通过<b>设置导出</b>功能下载当前的<code>app.conf</code>文件。",
"Maintenance_Tool_UnlockFields": "",
"Maintenance_Tool_UnlockFields_noti": "",
"Maintenance_Tool_UnlockFields_noti_text": "",
"Maintenance_Tool_UnlockFields_text": "",
"Maintenance_Tool_UnlockFields": "清除所有设备来源",
"Maintenance_Tool_UnlockFields_noti": "清除所有设备来源",
"Maintenance_Tool_UnlockFields_noti_text": "您确定要清除所有设备字段(锁定/用户)的所有源值吗?(请注意:此操作将永久删除这些值,无法恢复)这一行为无法挽回。",
"Maintenance_Tool_UnlockFields_text": "此工具将从所有设备的每个跟踪字段中删除所有原始数据,从而为插件和用户完全解锁所有字段。请谨慎使用,因为这将影响您整个设备的库存情况。",
"Maintenance_Tool_arpscansw": "切换 arp 扫描(开/关)",
"Maintenance_Tool_arpscansw_noti": "打开或关闭 arp 扫描",
"Maintenance_Tool_arpscansw_noti_text": "当扫描关闭时,它会保持关闭状态,直到再次激活为止。",
@@ -457,7 +457,7 @@
"Maintenance_Tool_del_unknowndev_noti": "删除(未知)设备",
"Maintenance_Tool_del_unknowndev_noti_text": "您确定要删除所有(未知)和(未找到名称)设备吗?",
"Maintenance_Tool_del_unknowndev_text": "使用此功能前,请先备份。删除操作不可撤销。所有名为 (未知) 的设备都将从数据库中删除。",
"Maintenance_Tool_del_unlockFields_selecteddev_text": "",
"Maintenance_Tool_del_unlockFields_selecteddev_text": "这将解除所选设备的“锁定/用户”字段的锁定状态。这一行为无法挽回。",
"Maintenance_Tool_displayed_columns_text": "更改<a href=\"devices.php\"><b><i class=\"fa fa-laptop\"></i>设备</b></a>页面中列的可见性和顺序。",
"Maintenance_Tool_drag_me": "拖动我来对列进行重新排序。",
"Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text",
@@ -469,8 +469,8 @@
"Maintenance_Tool_restore_noti": "数据库恢复",
"Maintenance_Tool_restore_noti_text": "您确定要执行数据库恢复吗?请确保当前没有正在运行的扫描。",
"Maintenance_Tool_restore_text": "最新备份可通过按钮恢复,但旧备份只能手动恢复。恢复后,请对数据库进行完整性检查以确保安全,以防创建备份时数据库当前处于写访问状态。",
"Maintenance_Tool_unlockFields_selecteddev": "",
"Maintenance_Tool_unlockFields_selecteddev_noti": "",
"Maintenance_Tool_unlockFields_selecteddev": "解锁设备字段",
"Maintenance_Tool_unlockFields_selecteddev_noti": "解锁字段",
"Maintenance_Tool_upgrade_database_noti": "升级数据库",
"Maintenance_Tool_upgrade_database_noti_text": "您确定要升级数据库吗?<br>(也许您更愿意将其存档)",
"Maintenance_Tool_upgrade_database_text": "此按钮将升级数据库以启用过去 12 小时的网络活动图表。请备份您的数据库以防出现问题。",
@@ -612,7 +612,7 @@
"REPORT_MAIL_description": "如果启用,则会发送一封电子邮件,其中包含您已订阅的更改列表。还请填写以下与 SMTP 设置相关的所有剩余设置。如果遇到问题,请将 <code>LOG_LEVEL</code> 设置为 <code>debug</code> 并检查<a href=\"/maintenance.php#tab_Logging\">错误日志</a>。",
"REPORT_MAIL_name": "启用email",
"REPORT_TITLE": "报告",
"RandomMAC_hover": "自动检测 - 表示设备是否随机化其 MAC 地址。您可通过 UI_NOT_RANDOM_MAC 设置排除特定MAC地址。点击了解更多。",
"RandomMAC_hover": "该设备具有随机的MAC地址",
"Reports_Sent_Log": "已发送报告日志",
"SCAN_SUBNETS_description": "大多数网络扫描器ARP-SCAN、NMAP、NSLOOKUP、DIG依赖于扫描特定的网络接口和子网。查看<a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">子网文档</a>以获取有关此设置的帮助,尤其是 VLAN、支持哪些 VLAN或者如何确定网络掩码和接口。<br/> <br/> 网络扫描器的替代方法是启用一些其他不依赖于 NetAlert<sup>X</sup> 访问网络的设备扫描器/导入器UNIFI、dhcp.leases、PiHole 等)。<br/> <br/> 注意:扫描时间本身取决于要检查的 IP 地址数量,因此请使用适当的网络掩码和接口仔细设置。",
"SCAN_SUBNETS_name": "待扫描网络",
@@ -620,7 +620,7 @@
"Setting_Override": "覆盖值",
"Setting_Override_Description": "启用此选项将用上面指定的值覆盖应用程序提供的默认值。",
"Settings_Metadata_Toggle": "显示/隐藏给定设置的元数据。",
"Settings_Show_Description": "显示设置描述",
"Settings_Show_Description": "显示设置描述",
"Settings_device_Scanners_desync": "⚠ 设备扫描计划不同步。",
"Settings_device_Scanners_desync_popup": "设备扫描 (<code>*_RUN_SCHD</code>) 的时间表并不相同。这将导致设备在线/离线通知不一致。除非有意为之,否则请对所有启用的 <b>🔍设备扫描</b> 使用相同的时间表。",
"Speedtest_Results": "Speedtest 结果",
@@ -760,7 +760,7 @@
"run_event_tooltip": "在运行之前,请先启用设置并保存更改。",
"select_icon_event_tooltip": "选择图标",
"settings_core_icon": "fa-solid fa-gem",
"settings_core_label": "核",
"settings_core_label": "核",
"settings_device_scanners": "设备扫描器用于发现写入当前扫描数据库表的设备。",
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
"settings_device_scanners_info": "使用 <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a> 设置加载更多设备扫描仪",
@@ -786,4 +786,4 @@
"settings_system_label": "系统",
"settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。<b>未执行验证。</b>",
"test_event_tooltip": "在测试设置之前,请先保存更改。"
}
}

View File

@@ -4,7 +4,7 @@ import os
# flake8: noqa: E402
from flask import Flask, request, jsonify, Response
from flask import Flask, redirect, request, jsonify, url_for, Response
from models.device_instance import DeviceInstance # noqa: E402
from flask_cors import CORS
from werkzeug.exceptions import HTTPException
@@ -1165,6 +1165,11 @@ def api_docs():
return send_from_directory(openapi_dir, 'swagger.html')
@app.route('/')
def index_redirect():
"""Redirect root to API documentation."""
return redirect(url_for('api_docs'))
# --------------------------
# DB query
# --------------------------

View File

@@ -0,0 +1,23 @@
# test/api_endpoints/test_docs.py - Tests for root redirect and API docs endpoints
from api_server import api_server_start
def test_index_redirect_logic():
"""Test the redirect function logic directly."""
with api_server_start.app.test_client() as client:
response = client.get("/", follow_redirects=False)
assert response.status_code == 302
assert response.location == '/docs'
def test_api_docs_logic():
"""Test that api_docs attempts to serve the correct file."""
with api_server_start.app.test_client() as client:
response = client.get("/docs")
assert response.status_code == 200
assert response.mimetype == "text/html"
response.direct_passthrough = False
data = response.get_data()
assert b"<!DOCTYPE html>" in data or b"<html>" in data