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