diff --git a/front/php/templates/language/zh_cn.json b/front/php/templates/language/zh_cn.json
index 1139be4b..ab2966b4 100644
--- a/front/php/templates/language/zh_cn.json
+++ b/front/php/templates/language/zh_cn.json
@@ -27,8 +27,8 @@
"AppEvents_ObjectType": "对象类型",
"AppEvents_Plugin": "插件",
"AppEvents_Type": "类型",
- "BACKEND_API_URL_description": "",
- "BACKEND_API_URL_name": "",
+ "BACKEND_API_URL_description": "用于生成后端API URL。如果您使用反向代理映射到您的GRAPHQL_PORT,请指定。请输入以http://开头的完整URL,包括端口号(末尾不带斜杠/)。",
+ "BACKEND_API_URL_name": "后端 API 网址",
"BackDevDetail_Actions_Ask_Run": "您要执行此操作吗?",
"BackDevDetail_Actions_Not_Registered": "未注册的操作: ",
"BackDevDetail_Actions_Title_Run": "运行动作",
@@ -98,10 +98,10 @@
"DevDetail_MainInfo_Network": " 节点 (MAC)",
"DevDetail_MainInfo_Network_Port": " 端口",
"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 your NetAlertX url/php/server/devices.php?action=ExportCSV 或启用 CSV Backup 插件来触发此功能。",
+ "Maintenance_Tool_ExportCSV_text": "生成一个 CSV(逗号分隔值)文件,其中包含设备列表,包括网络节点和连接设备之间的网络关系。您也可以启用 CSV Backup 插件来触发此功能。",
"Maintenance_Tool_ImportCSV": "设备导入(csv)",
"Maintenance_Tool_ImportCSV_noti": "设备导入(csv)",
"Maintenance_Tool_ImportCSV_noti_text": "您确定要导入 CSV 文件吗?这将完全覆盖数据库中的设备。",
@@ -414,10 +414,10 @@
"Maintenance_Tool_ImportPastedConfig": "设置导入(粘贴)",
"Maintenance_Tool_ImportPastedConfig_noti_text": "您确认要导入粘贴的设置吗?这会完全覆盖app.conf的内容。",
"Maintenance_Tool_ImportPastedConfig_text": "导入包含所有应用程序设置的app.conf文件。建议先通过设置导出功能下载当前的app.conf文件。",
- "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": "更改设备页面中列的可见性和顺序。",
"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": "您确定要升级数据库吗?
(也许您更愿意将其存档)",
"Maintenance_Tool_upgrade_database_text": "此按钮将升级数据库以启用过去 12 小时的网络活动图表。请备份您的数据库以防出现问题。",
@@ -612,7 +612,7 @@
"REPORT_MAIL_description": "如果启用,则会发送一封电子邮件,其中包含您已订阅的更改列表。还请填写以下与 SMTP 设置相关的所有剩余设置。如果遇到问题,请将 LOG_LEVEL 设置为 debug 并检查错误日志。",
"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)依赖于扫描特定的网络接口和子网。查看子网文档以获取有关此设置的帮助,尤其是 VLAN、支持哪些 VLAN,或者如何确定网络掩码和接口。
网络扫描器的替代方法是启用一些其他不依赖于 NetAlertX 访问网络的设备扫描器/导入器(UNIFI、dhcp.leases、PiHole 等)。
注意:扫描时间本身取决于要检查的 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": "设备扫描 (*_RUN_SCHD) 的时间表并不相同。这将导致设备在线/离线通知不一致。除非有意为之,否则请对所有启用的 🔍设备扫描 使用相同的时间表。",
"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": "使用 LOADED_PLUGINS 设置加载更多设备扫描仪",
@@ -786,4 +786,4 @@
"settings_system_label": "系统",
"settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。未执行验证。",
"test_event_tooltip": "在测试设置之前,请先保存更改。"
-}
\ No newline at end of file
+}
diff --git a/server/api_server/api_server_start.py b/server/api_server/api_server_start.py
index 1dc7e436..221d57be 100755
--- a/server/api_server/api_server_start.py
+++ b/server/api_server/api_server_start.py
@@ -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
# --------------------------
diff --git a/test/api_endpoints/test_docs.py b/test/api_endpoints/test_docs.py
new file mode 100644
index 00000000..bc12cecf
--- /dev/null
+++ b/test/api_endpoints/test_docs.py
@@ -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"" in data or b"" in data