From 0aae6a5bebeb789dd7aed5a4ebbade5b5533814d Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Wed, 28 Jun 2023 16:18:52 +0800 Subject: [PATCH] =?UTF-8?q?=E9=83=A8=E5=88=86=E4=B8=AD=E6=96=87=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=B8=BA=E5=A4=9A=E8=AF=AD=E8=A8=80=E4=BB=A3=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/nodes/session_manager.go | 14 ++ .../web/actions/actionutils/parent_action.go | 14 +- internal/web/actions/default/admins/admin.go | 2 +- .../web/actions/default/admins/createPopup.go | 2 +- internal/web/actions/default/admins/update.go | 2 +- .../default/clusters/cluster/createBatch.go | 5 +- .../default/clusters/cluster/createNode.go | 5 +- .../default/clusters/cluster/installManual.go | 2 +- .../default/clusters/cluster/installNodes.go | 2 +- .../default/clusters/cluster/installRemote.go | 2 +- .../clusters/cluster/node/nodeutils/utils.go | 15 ++- .../cluster/node/nodeutils/utils_ext.go | 2 +- .../actions/default/clusters/cluster/nodes.go | 3 +- .../default/clusters/cluster/upgradeRemote.go | 2 +- .../actions/default/clusters/cluster/utils.go | 13 +- .../clusters/clusterutils/cluster_helper.go | 39 +++--- .../clusterutils/cluster_helper_ext.go | 5 +- .../web/actions/default/dashboard/index.go | 2 +- internal/web/actions/default/db/helper.go | 7 +- .../default/servers/serverutils/menu.go | 7 +- .../servers/serverutils/server_helper.go | 123 +++++++++--------- .../settings/settingutils/advanced_helper.go | 14 +- .../default/settings/settingutils/helper.go | 16 ++- internal/web/helpers/helper_lang.go | 20 +++ web/public/js/langs/zh-cn.js | 2 +- 25 files changed, 195 insertions(+), 125 deletions(-) create mode 100644 internal/web/helpers/helper_lang.go diff --git a/internal/nodes/session_manager.go b/internal/nodes/session_manager.go index 9cad35d8..43076dc6 100644 --- a/internal/nodes/session_manager.go +++ b/internal/nodes/session_manager.go @@ -5,10 +5,12 @@ package nodes import ( "encoding/json" "github.com/TeaOSLab/EdgeAdmin/internal/rpc" + "github.com/TeaOSLab/EdgeAdmin/internal/ttlcache" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/logs" "strings" + "time" ) // SessionManager SESSION管理 @@ -32,6 +34,15 @@ func (this *SessionManager) Read(sid string) map[string]string { var result = map[string]string{} + var cacheKey = "SESSION@" + sid + var item = ttlcache.DefaultCache.Read(cacheKey) + if item != nil && item.Value != nil { + itemMap, ok := item.Value.(map[string]string) + if ok { + return itemMap + } + } + rpcClient, err := rpc.SharedRPC() if err != nil { return map[string]string{} @@ -54,6 +65,9 @@ func (this *SessionManager) Read(sid string) map[string]string { logs.Println("SESSION", "decode '"+sid+"' values failed: "+err.Error()) } + // Write to cache + ttlcache.DefaultCache.Write(cacheKey, result, time.Now().Unix()+300 /** must not be too long **/) + return result } diff --git a/internal/web/actions/actionutils/parent_action.go b/internal/web/actions/actionutils/parent_action.go index 9fe62234..f1942414 100644 --- a/internal/web/actions/actionutils/parent_action.go +++ b/internal/web/actions/actionutils/parent_action.go @@ -150,7 +150,7 @@ func (this *ParentAction) ViewData() maps.Map { return this.Data } -func (this *ParentAction) Lang() string { +func (this *ParentAction) LangCode() string { var lang = configloaders.FindAdminLang(this.AdminId()) if len(lang) > 0 { // TODO check language still exists @@ -158,3 +158,15 @@ func (this *ParentAction) Lang() string { } return langs.ParseLangFromAction(this) } + +func (this *ParentAction) Lang(messageCode langs.MessageCode, args ...any) string { + return langs.Message(this.LangCode(), messageCode, args...) +} + +func (this *ParentAction) FailLang(messageCode langs.MessageCode, args ...any) { + this.Fail(langs.Message(this.LangCode(), messageCode, args...)) +} + +func (this *ParentAction) FailFieldLang(field string, messageCode langs.MessageCode, args ...any) { + this.FailField(field, langs.Message(this.LangCode(), messageCode, args...)) +} diff --git a/internal/web/actions/default/admins/admin.go b/internal/web/actions/default/admins/admin.go index ab594bae..76ca836a 100644 --- a/internal/web/actions/default/admins/admin.go +++ b/internal/web/actions/default/admins/admin.go @@ -51,7 +51,7 @@ func (this *AdminAction) RunGet(params struct { // 权限 moduleMaps := []maps.Map{} - for _, m := range configloaders.AllModuleMaps(this.Lang()) { + for _, m := range configloaders.AllModuleMaps(this.LangCode()) { code := m.GetString("code") isChecked := false for _, module := range admin.Modules { diff --git a/internal/web/actions/default/admins/createPopup.go b/internal/web/actions/default/admins/createPopup.go index 00393279..d214cdc7 100644 --- a/internal/web/actions/default/admins/createPopup.go +++ b/internal/web/actions/default/admins/createPopup.go @@ -20,7 +20,7 @@ func (this *CreatePopupAction) Init() { } func (this *CreatePopupAction) RunGet(params struct{}) { - this.Data["modules"] = configloaders.AllModuleMaps(this.Lang()) + this.Data["modules"] = configloaders.AllModuleMaps(this.LangCode()) this.Show() } diff --git a/internal/web/actions/default/admins/update.go b/internal/web/actions/default/admins/update.go index 7718581b..cac8160b 100644 --- a/internal/web/actions/default/admins/update.go +++ b/internal/web/actions/default/admins/update.go @@ -59,7 +59,7 @@ func (this *UpdateAction) RunGet(params struct { } // 权限 - var moduleMaps = configloaders.AllModuleMaps(this.Lang()) + var moduleMaps = configloaders.AllModuleMaps(this.LangCode()) for _, m := range moduleMaps { code := m.GetString("code") isChecked := false diff --git a/internal/web/actions/default/clusters/cluster/createBatch.go b/internal/web/actions/default/clusters/cluster/createBatch.go index 40fbfc81..4e94ae7b 100644 --- a/internal/web/actions/default/clusters/cluster/createBatch.go +++ b/internal/web/actions/default/clusters/cluster/createBatch.go @@ -3,6 +3,7 @@ package cluster import ( "github.com/TeaOSLab/EdgeAdmin/internal/oplogs" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" @@ -27,12 +28,12 @@ func (this *CreateBatchAction) RunGet(params struct { }) { leftMenuItems := []maps.Map{ { - "name": "单个创建", + "name": this.Lang(codes.AdminNodeMenuCreateSingleNode), "url": "/clusters/cluster/createNode?clusterId=" + strconv.FormatInt(params.ClusterId, 10), "isActive": false, }, { - "name": "批量创建", + "name": this.Lang(codes.AdminNodeMenuCreateMultipleNodes), "url": "/clusters/cluster/createBatch?clusterId=" + strconv.FormatInt(params.ClusterId, 10), "isActive": true, }, diff --git a/internal/web/actions/default/clusters/cluster/createNode.go b/internal/web/actions/default/clusters/cluster/createNode.go index 84b26db4..f6da2bb8 100644 --- a/internal/web/actions/default/clusters/cluster/createNode.go +++ b/internal/web/actions/default/clusters/cluster/createNode.go @@ -7,6 +7,7 @@ import ( "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/clusterutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/grants/grantutils" + "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" @@ -37,12 +38,12 @@ func (this *CreateNodeAction) RunGet(params struct { var leftMenuItems = []maps.Map{ { - "name": "单个创建", + "name": this.Lang(codes.AdminNodeMenuCreateSingleNode), "url": "/clusters/cluster/createNode?clusterId=" + strconv.FormatInt(params.ClusterId, 10), "isActive": true, }, { - "name": "批量创建", + "name": this.Lang(codes.AdminNodeMenuCreateMultipleNodes), "url": "/clusters/cluster/createBatch?clusterId=" + strconv.FormatInt(params.ClusterId, 10), "isActive": false, }, diff --git a/internal/web/actions/default/clusters/cluster/installManual.go b/internal/web/actions/default/clusters/cluster/installManual.go index d0d6a6ef..f3169724 100644 --- a/internal/web/actions/default/clusters/cluster/installManual.go +++ b/internal/web/actions/default/clusters/cluster/installManual.go @@ -19,7 +19,7 @@ func (this *InstallManualAction) Init() { func (this *InstallManualAction) RunGet(params struct { ClusterId int64 }) { - this.Data["leftMenuItems"] = LeftMenuItemsForInstall(this.AdminContext(), params.ClusterId, "manual") + this.Data["leftMenuItems"] = LeftMenuItemsForInstall(this.AdminContext(), params.ClusterId, "manual", this.LangCode()) nodesResp, err := this.RPC().NodeRPC().FindAllNotInstalledNodesWithNodeClusterId(this.AdminContext(), &pb.FindAllNotInstalledNodesWithNodeClusterIdRequest{NodeClusterId: params.ClusterId}) if err != nil { diff --git a/internal/web/actions/default/clusters/cluster/installNodes.go b/internal/web/actions/default/clusters/cluster/installNodes.go index 6e80bf9a..b0c56e73 100644 --- a/internal/web/actions/default/clusters/cluster/installNodes.go +++ b/internal/web/actions/default/clusters/cluster/installNodes.go @@ -19,7 +19,7 @@ func (this *InstallNodesAction) Init() { func (this *InstallNodesAction) RunGet(params struct { ClusterId int64 }) { - this.Data["leftMenuItems"] = LeftMenuItemsForInstall(this.AdminContext(), params.ClusterId, "register") + this.Data["leftMenuItems"] = LeftMenuItemsForInstall(this.AdminContext(), params.ClusterId, "register", this.LangCode()) clusterResp, err := this.RPC().NodeClusterRPC().FindEnabledNodeCluster(this.AdminContext(), &pb.FindEnabledNodeClusterRequest{NodeClusterId: params.ClusterId}) if err != nil { diff --git a/internal/web/actions/default/clusters/cluster/installRemote.go b/internal/web/actions/default/clusters/cluster/installRemote.go index 1a19123a..59ee4420 100644 --- a/internal/web/actions/default/clusters/cluster/installRemote.go +++ b/internal/web/actions/default/clusters/cluster/installRemote.go @@ -21,7 +21,7 @@ func (this *InstallRemoteAction) Init() { func (this *InstallRemoteAction) RunGet(params struct { ClusterId int64 }) { - this.Data["leftMenuItems"] = LeftMenuItemsForInstall(this.AdminContext(), params.ClusterId, "install") + this.Data["leftMenuItems"] = LeftMenuItemsForInstall(this.AdminContext(), params.ClusterId, "install", this.LangCode()) nodesResp, err := this.RPC().NodeRPC().FindAllNotInstalledNodesWithNodeClusterId(this.AdminContext(), &pb.FindAllNotInstalledNodesWithNodeClusterIdRequest{NodeClusterId: params.ClusterId}) if err != nil { diff --git a/internal/web/actions/default/clusters/cluster/node/nodeutils/utils.go b/internal/web/actions/default/clusters/cluster/node/nodeutils/utils.go index f8942644..25de4956 100644 --- a/internal/web/actions/default/clusters/cluster/node/nodeutils/utils.go +++ b/internal/web/actions/default/clusters/cluster/node/nodeutils/utils.go @@ -5,6 +5,7 @@ package nodeutils import ( "errors" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/types" @@ -57,24 +58,24 @@ func InitNodeInfo(parentAction *actionutils.ParentAction, nodeId int64) (*pb.Nod var menuItems = []maps.Map{ { - "name": "基础设置", + "name": parentAction.Lang(codes.AdminNodeMenuSettingBasic), "url": prefix + "/update?" + query, "isActive": menuItem == "basic", }, { - "name": "DNS设置", + "name": parentAction.Lang(codes.AdminNodeMenuSettingDNS), "url": prefix + "/settings/dns?" + query, "isActive": menuItem == "dns", "isOn": info.HasDNSInfo, }, { - "name": "缓存设置", + "name": parentAction.Lang(codes.AdminNodeMenuSettingCache), "url": prefix + "/settings/cache?" + query, "isActive": menuItem == "cache", "isOn": info.HasCacheInfo, }, { - "name": "DDoS防护", + "name": parentAction.Lang(codes.AdminNodeMenuSettingDDoSProtection), "url": prefix + "/settings/ddos-protection?" + query, "isActive": menuItem == "ddosProtection", "isOn": info.HasDDoSProtection, @@ -84,16 +85,16 @@ func InitNodeInfo(parentAction *actionutils.ParentAction, nodeId int64) (*pb.Nod "url": "", }, } - menuItems = filterMenuItems(menuItems, menuItem, prefix, query, info) + menuItems = filterMenuItems(menuItems, menuItem, prefix, query, info, parentAction.LangCode()) menuItems = append(menuItems, []maps.Map{ { - "name": "SSH设置", + "name": parentAction.Lang(codes.AdminNodeMenuSettingSSH), "url": prefix + "/settings/ssh?" + query, "isActive": menuItem == "ssh", "isOn": info.HasSSH, }, { - "name": "系统设置", + "name": parentAction.Lang(codes.AdminNodeMenuSettingSystem), "url": prefix + "/settings/system?" + query, "isActive": menuItem == "system", "isOn": info.HasSystemSettings, diff --git a/internal/web/actions/default/clusters/cluster/node/nodeutils/utils_ext.go b/internal/web/actions/default/clusters/cluster/node/nodeutils/utils_ext.go index 459b851f..834c3f67 100644 --- a/internal/web/actions/default/clusters/cluster/node/nodeutils/utils_ext.go +++ b/internal/web/actions/default/clusters/cluster/node/nodeutils/utils_ext.go @@ -8,6 +8,6 @@ import ( "github.com/iwind/TeaGo/maps" ) -func filterMenuItems(menuItems []maps.Map, menuItem string, prefix string, query string, info *pb.FindEnabledNodeConfigInfoResponse) []maps.Map { +func filterMenuItems(menuItems []maps.Map, menuItem string, prefix string, query string, info *pb.FindEnabledNodeConfigInfoResponse, langCode string) []maps.Map { return menuItems } diff --git a/internal/web/actions/default/clusters/cluster/nodes.go b/internal/web/actions/default/clusters/cluster/nodes.go index 91a61f46..e77f2f82 100644 --- a/internal/web/actions/default/clusters/cluster/nodes.go +++ b/internal/web/actions/default/clusters/cluster/nodes.go @@ -6,6 +6,7 @@ import ( teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const" "github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/logs" @@ -290,7 +291,7 @@ func (this *NodesAction) RunGet(params struct { groupMaps = append([]maps.Map{ { "id": -1, - "name": "[未分组](" + types.String(countUngroupNodes) + ")", + "name": "[" + this.Lang(codes.AdminNodeUngroupedLabel)+ "](" + types.String(countUngroupNodes) + ")", "countNodes": countUngroupNodes, }, }, groupMaps...) diff --git a/internal/web/actions/default/clusters/cluster/upgradeRemote.go b/internal/web/actions/default/clusters/cluster/upgradeRemote.go index db80877e..1099ca92 100644 --- a/internal/web/actions/default/clusters/cluster/upgradeRemote.go +++ b/internal/web/actions/default/clusters/cluster/upgradeRemote.go @@ -21,7 +21,7 @@ func (this *UpgradeRemoteAction) Init() { func (this *UpgradeRemoteAction) RunGet(params struct { ClusterId int64 }) { - this.Data["leftMenuItems"] = LeftMenuItemsForInstall(this.AdminContext(), params.ClusterId, "upgrade") + this.Data["leftMenuItems"] = LeftMenuItemsForInstall(this.AdminContext(), params.ClusterId, "upgrade", this.LangCode()) nodes := []maps.Map{} resp, err := this.RPC().NodeRPC().FindAllUpgradeNodesWithNodeClusterId(this.AdminContext(), &pb.FindAllUpgradeNodesWithNodeClusterIdRequest{NodeClusterId: params.ClusterId}) diff --git a/internal/web/actions/default/clusters/cluster/utils.go b/internal/web/actions/default/clusters/cluster/utils.go index 6064dc07..0643cb60 100644 --- a/internal/web/actions/default/clusters/cluster/utils.go +++ b/internal/web/actions/default/clusters/cluster/utils.go @@ -4,13 +4,14 @@ import ( "context" "github.com/TeaOSLab/EdgeAdmin/internal/rpc" "github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils" + "github.com/TeaOSLab/EdgeCommon/pkg/langs" + "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/maps" - "strconv" ) // LeftMenuItemsForInstall 安装升级相关的左侧菜单 -func LeftMenuItemsForInstall(ctx context.Context, clusterId int64, selectedItem string) []maps.Map { +func LeftMenuItemsForInstall(ctx context.Context, clusterId int64, selectedItem string, langCode string) []maps.Map { rpcClient, _ := rpc.SharedRPC() countNotInstalled := int64(0) countUpgrade := int64(0) @@ -31,22 +32,22 @@ func LeftMenuItemsForInstall(ctx context.Context, clusterId int64, selectedItem return []maps.Map{ { - "name": "手动安装", + "name": langs.Message(langCode, codes.AdminNodeMenuInstallManually), "url": "/clusters/cluster/installManual?clusterId=" + numberutils.FormatInt64(clusterId), "isActive": selectedItem == "manual", }, { - "name": "自动注册", + "name": langs.Message(langCode, codes.AdminNodeMenuInstallAutoRegister), "url": "/clusters/cluster/installNodes?clusterId=" + numberutils.FormatInt64(clusterId), "isActive": selectedItem == "register", }, { - "name": "远程安装(" + strconv.FormatInt(countNotInstalled, 10) + ")", + "name": langs.Message(langCode, codes.AdminNodeMenuInstallRemote, countNotInstalled), "url": "/clusters/cluster/installRemote?clusterId=" + numberutils.FormatInt64(clusterId), "isActive": selectedItem == "install", }, { - "name": "远程升级(" + strconv.FormatInt(countUpgrade, 10) + ")", + "name": langs.Message(langCode, codes.AdminNodeMenuInstallRemoteUpgrade, countUpgrade), "url": "/clusters/cluster/upgradeRemote?clusterId=" + numberutils.FormatInt64(clusterId), "isActive": selectedItem == "upgrade", }, diff --git a/internal/web/actions/default/clusters/clusterutils/cluster_helper.go b/internal/web/actions/default/clusters/clusterutils/cluster_helper.go index e191381a..765d2052 100644 --- a/internal/web/actions/default/clusters/clusterutils/cluster_helper.go +++ b/internal/web/actions/default/clusters/clusterutils/cluster_helper.go @@ -4,6 +4,8 @@ import ( teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const" "github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" @@ -15,6 +17,7 @@ import ( // ClusterHelper 单个集群的帮助 type ClusterHelper struct { + helpers.LangHelper } func NewClusterHelper() *ClusterHelper { @@ -79,21 +82,21 @@ func (this *ClusterHelper) BeforeAction(actionPtr actions.ActionWrapper) (goNext } if teaconst.IsPlus { { - var item = tabbar.Add("集群看板", "", "/clusters/cluster/boards?clusterId="+clusterIdString, "chart line area", selectedTabbar == "board") + var item = tabbar.Add(this.Lang(actionPtr, codes.AdminClusterMenuTabClusterDashboard), "", "/clusters/cluster/boards?clusterId="+clusterIdString, "chart line area", selectedTabbar == "board") item.IsDisabled = !isInCluster } } { - var item = tabbar.Add("节点列表", "", "/clusters/cluster/nodes?clusterId="+clusterIdString, "server", selectedTabbar == "node") + var item = tabbar.Add(this.Lang(actionPtr, codes.AdminClusterMenuTabClusterNodes), "", "/clusters/cluster/nodes?clusterId="+clusterIdString, "server", selectedTabbar == "node") item.IsDisabled = !isInCluster } { - var item = tabbar.Add("集群设置", "", "/clusters/cluster/settings?clusterId="+clusterIdString, "setting", selectedTabbar == "setting") + var item = tabbar.Add(this.Lang(actionPtr, codes.AdminClusterMenuTabClusterSettings), "", "/clusters/cluster/settings?clusterId="+clusterIdString, "setting", selectedTabbar == "setting") item.IsDisabled = !isInCluster } { - var item = tabbar.Add("删除集群", "", "/clusters/cluster/delete?clusterId="+clusterIdString, "trash", selectedTabbar == "delete") + var item = tabbar.Add(this.Lang(actionPtr, codes.AdminClusterMenuTabClusterDelete), "", "/clusters/cluster/delete?clusterId="+clusterIdString, "trash", selectedTabbar == "delete") item.IsDisabled = !isInCluster } actionutils.SetTabbar(action, tabbar) @@ -102,7 +105,7 @@ func (this *ClusterHelper) BeforeAction(actionPtr actions.ActionWrapper) (goNext var secondMenuItem = action.Data.GetString("secondMenuItem") switch selectedTabbar { case "setting": - var menuItems = this.createSettingMenu(cluster, clusterInfo, secondMenuItem) + var menuItems = this.createSettingMenu(cluster, clusterInfo, secondMenuItem, actionPtr) action.Data["leftMenuItems"] = menuItems // 当前菜单 @@ -120,23 +123,23 @@ func (this *ClusterHelper) BeforeAction(actionPtr actions.ActionWrapper) (goNext } // 设置菜单 -func (this *ClusterHelper) createSettingMenu(cluster *pb.NodeCluster, info *pb.FindEnabledNodeClusterConfigInfoResponse, selectedItem string) (items []maps.Map) { +func (this *ClusterHelper) createSettingMenu(cluster *pb.NodeCluster, info *pb.FindEnabledNodeClusterConfigInfoResponse, selectedItem string, actionPtr actions.ActionWrapper) (items []maps.Map) { clusterId := numberutils.FormatInt64(cluster.Id) items = append(items, maps.Map{ - "name": "基础设置", + "name": this.Lang(actionPtr, codes.AdminClusterMenuSettingBasic), "url": "/clusters/cluster/settings?clusterId=" + clusterId, "isActive": selectedItem == "basic", "isOn": true, }) items = append(items, maps.Map{ - "name": "DNS设置", + "name": this.Lang(actionPtr, codes.AdminClusterMenuSettingDNS), "url": "/clusters/cluster/settings/dns?clusterId=" + clusterId, "isActive": selectedItem == "dns", "isOn": cluster.DnsDomainId > 0 || len(cluster.DnsName) > 0, }) items = append(items, maps.Map{ - "name": "健康检查", + "name": this.Lang(actionPtr, codes.AdminClusterMenuSettingHealthCheck), "url": "/clusters/cluster/settings/health?clusterId=" + clusterId, "isActive": selectedItem == "health", "isOn": info != nil && info.HealthCheckIsOn, @@ -147,43 +150,43 @@ func (this *ClusterHelper) createSettingMenu(cluster *pb.NodeCluster, info *pb.F }) items = append(items, maps.Map{ - "name": "网站设置", + "name": this.Lang(actionPtr, codes.AdminClusterMenuSettingServiceGlobal), "url": "/clusters/cluster/settings/global-server-config?clusterId=" + clusterId, "isActive": selectedItem == "globalServerConfig", "isOn": true, }) items = append(items, maps.Map{ - "name": "缓存策略", + "name": this.Lang(actionPtr, codes.AdminClusterMenuSettingCachePolicy), "url": "/clusters/cluster/settings/cache?clusterId=" + clusterId, "isActive": selectedItem == "cache", "isOn": cluster.HttpCachePolicyId > 0, }) items = append(items, maps.Map{ - "name": "WAF策略", + "name": this.Lang(actionPtr, codes.AdminClusterMenuSettingWAFPolicy), "url": "/clusters/cluster/settings/waf?clusterId=" + clusterId, "isActive": selectedItem == "waf", "isOn": cluster.HttpFirewallPolicyId > 0, }) items = append(items, maps.Map{ - "name": "WAF动作", + "name": this.Lang(actionPtr, codes.AdminClusterMenuSettingWAFActions), "url": "/clusters/cluster/settings/firewall-actions?clusterId=" + clusterId, "isActive": selectedItem == "firewallAction", "isOn": info != nil && info.HasFirewallActions, }) items = append(items, maps.Map{ - "name": "WebP", + "name": this.Lang(actionPtr, codes.AdminClusterMenuSettingWebP), "url": "/clusters/cluster/settings/webp?clusterId=" + clusterId, "isActive": selectedItem == "webp", "isOn": info != nil && info.WebpIsOn, }) - items = filterMenuItems1(items, info, clusterId, selectedItem) + items = this.filterMenuItems1(items, info, clusterId, selectedItem, actionPtr) items = append(items, maps.Map{ - "name": "统计指标", + "name": this.Lang(actionPtr, codes.AdminClusterMenuSettingMetrics), "url": "/clusters/cluster/settings/metrics?clusterId=" + clusterId, "isActive": selectedItem == "metric", "isOn": info != nil && info.HasMetricItems, @@ -196,13 +199,13 @@ func (this *ClusterHelper) createSettingMenu(cluster *pb.NodeCluster, info *pb.F }) items = append(items, maps.Map{ - "name": "DDoS防护", + "name": this.Lang(actionPtr, codes.AdminClusterMenuSettingDDoSProtection), "url": "/clusters/cluster/settings/ddos-protection?clusterId=" + clusterId, "isActive": selectedItem == "ddosProtection", "isOn": info != nil && info.HasDDoSProtection, }) - items = filterMenuItems2(items, info, clusterId, selectedItem) + items = this.filterMenuItems2(items, info, clusterId, selectedItem, actionPtr) return } diff --git a/internal/web/actions/default/clusters/clusterutils/cluster_helper_ext.go b/internal/web/actions/default/clusters/clusterutils/cluster_helper_ext.go index 32d90016..7169b996 100644 --- a/internal/web/actions/default/clusters/clusterutils/cluster_helper_ext.go +++ b/internal/web/actions/default/clusters/clusterutils/cluster_helper_ext.go @@ -5,13 +5,14 @@ package clusterutils import ( "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/maps" ) -func filterMenuItems1(items []maps.Map, info *pb.FindEnabledNodeClusterConfigInfoResponse, clusterIdString string, selectedItem string) []maps.Map { +func (this *ClusterHelper) filterMenuItems1(items []maps.Map, info *pb.FindEnabledNodeClusterConfigInfoResponse, clusterIdString string, selectedItem string, actionPtr actions.ActionWrapper) []maps.Map { return items } -func filterMenuItems2(items []maps.Map, info *pb.FindEnabledNodeClusterConfigInfoResponse, clusterIdString string, selectedItem string) []maps.Map { +func (this *ClusterHelper) filterMenuItems2(items []maps.Map, info *pb.FindEnabledNodeClusterConfigInfoResponse, clusterIdString string, selectedItem string, actionPtr actions.ActionWrapper) []maps.Map { return items } diff --git a/internal/web/actions/default/dashboard/index.go b/internal/web/actions/default/dashboard/index.go index b5c01678..7811095a 100644 --- a/internal/web/actions/default/dashboard/index.go +++ b/internal/web/actions/default/dashboard/index.go @@ -39,7 +39,7 @@ func (this *IndexAction) RunGet(params struct{}) { module, ok := configloaders.FindFirstAdminModule(this.AdminId()) if ok { if module != "dashboard" { - for _, m := range configloaders.AllModuleMaps(this.Lang()) { + for _, m := range configloaders.AllModuleMaps(this.LangCode()) { if m.GetString("code") == module { this.RedirectURL(m.GetString("url")) return diff --git a/internal/web/actions/default/db/helper.go b/internal/web/actions/default/db/helper.go index 6a292afd..94d804a8 100644 --- a/internal/web/actions/default/db/helper.go +++ b/internal/web/actions/default/db/helper.go @@ -2,11 +2,14 @@ package db import ( "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/iwind/TeaGo/actions" "net/http" ) type Helper struct { + helpers.LangHelper } func (this *Helper) BeforeAction(action *actions.ActionObject) { @@ -18,7 +21,7 @@ func (this *Helper) BeforeAction(action *actions.ActionObject) { selectedTabbar, _ := action.Data["mainTab"] - tabbar := actionutils.NewTabbar() - tabbar.Add("数据库节点", "", "/db", "", selectedTabbar == "db") + var tabbar = actionutils.NewTabbar() + tabbar.Add(this.Lang(action, codes.AdminDBNodeTabNodes), "", "/db", "", selectedTabbar == "db") actionutils.SetTabbar(action, tabbar) } diff --git a/internal/web/actions/default/servers/serverutils/menu.go b/internal/web/actions/default/servers/serverutils/menu.go index 95b022bd..7791cac7 100644 --- a/internal/web/actions/default/servers/serverutils/menu.go +++ b/internal/web/actions/default/servers/serverutils/menu.go @@ -5,13 +5,14 @@ package serverutils import ( "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/maps" ) -func filterMenuItems(serverConfig *serverconfigs.ServerConfig, menuItems []maps.Map, serverIdString string, secondMenuItem string) []maps.Map { +func (this *ServerHelper) filterMenuItems(serverConfig *serverconfigs.ServerConfig, menuItems []maps.Map, serverIdString string, secondMenuItem string, actionPtr actions.ActionWrapper) []maps.Map { return menuItems } -func filterMenuItems2(serverConfig *serverconfigs.ServerConfig, menuItems []maps.Map, serverIdString string, secondMenuItem string) []maps.Map { +func (this *ServerHelper) filterMenuItems2(serverConfig *serverconfigs.ServerConfig, menuItems []maps.Map, serverIdString string, secondMenuItem string, actionPtr actions.ActionWrapper) []maps.Map { return menuItems -} \ No newline at end of file +} diff --git a/internal/web/actions/default/servers/serverutils/server_helper.go b/internal/web/actions/default/servers/serverutils/server_helper.go index 46d3afbf..bbae8a2d 100644 --- a/internal/web/actions/default/servers/serverutils/server_helper.go +++ b/internal/web/actions/default/servers/serverutils/server_helper.go @@ -6,6 +6,8 @@ import ( teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const" "github.com/TeaOSLab/EdgeAdmin/internal/rpc" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/iwind/TeaGo/actions" @@ -17,6 +19,7 @@ import ( ) type ServerHelper struct { + helpers.LangHelper } func NewServerHelper() *ServerHelper { @@ -114,29 +117,29 @@ func (this *ServerHelper) createLeftMenu(action *actions.ActionObject) { } if teaconst.IsPlus { - tabbar.Add("看板", "", "/servers/server/boards?serverId="+serverIdString, "dashboard", selectedTabbar == "board") + tabbar.Add(this.Lang(action, codes.AdminServerTabDashboard), "", "/servers/server/boards?serverId="+serverIdString, "dashboard", selectedTabbar == "board") } if family == "http" { - tabbar.Add("统计", "", "/servers/server/stat?serverId="+serverIdString, "chart area", selectedTabbar == "stat") + tabbar.Add(this.Lang(action, codes.AdminServerTabStat), "", "/servers/server/stat?serverId="+serverIdString, "chart area", selectedTabbar == "stat") } if family == "http" { - tabbar.Add("日志", "", "/servers/server/log?serverId="+serverIdString, "history", selectedTabbar == "log") + tabbar.Add(this.Lang(action, codes.AdminServerTabAccessLogs), "", "/servers/server/log?serverId="+serverIdString, "history", selectedTabbar == "log") } - tabbar.Add("设置", "", "/servers/server/settings?serverId="+serverIdString, "setting", selectedTabbar == "setting") - tabbar.Add("删除", "", "/servers/server/delete?serverId="+serverIdString, "trash", selectedTabbar == "delete") + tabbar.Add(this.Lang(action, codes.AdminServerTabSettings), "", "/servers/server/settings?serverId="+serverIdString, "setting", selectedTabbar == "setting") + tabbar.Add(this.Lang(action, codes.AdminServerTabDelete), "", "/servers/server/delete?serverId="+serverIdString, "trash", selectedTabbar == "delete") actionutils.SetTabbar(action, tabbar) // 左侧操作子菜单 switch types.String(mainTab) { case "board": - action.Data["leftMenuItems"] = this.createBoardMenu(types.String(secondMenuItem), serverIdString, serverConfig) + action.Data["leftMenuItems"] = this.createBoardMenu(types.String(secondMenuItem), serverIdString, serverConfig, action) case "log": - action.Data["leftMenuItems"] = this.createLogMenu(types.String(secondMenuItem), serverIdString, serverConfig) + action.Data["leftMenuItems"] = this.createLogMenu(types.String(secondMenuItem), serverIdString, serverConfig, action) case "stat": - action.Data["leftMenuItems"] = this.createStatMenu(types.String(secondMenuItem), serverIdString, serverConfig) + action.Data["leftMenuItems"] = this.createStatMenu(types.String(secondMenuItem), serverIdString, serverConfig, action) case "setting": - var menuItems = this.createSettingsMenu(types.String(secondMenuItem), serverIdString, serverConfig) + var menuItems = this.createSettingsMenu(types.String(secondMenuItem), serverIdString, serverConfig, action) action.Data["leftMenuItems"] = menuItems // 当前菜单 @@ -148,15 +151,15 @@ func (this *ServerHelper) createLeftMenu(action *actions.ActionObject) { } } case "delete": - action.Data["leftMenuItems"] = this.createDeleteMenu(types.String(secondMenuItem), serverIdString, serverConfig) + action.Data["leftMenuItems"] = this.createDeleteMenu(types.String(secondMenuItem), serverIdString, serverConfig, action) } } // 看板菜单 -func (this *ServerHelper) createBoardMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig) []maps.Map { +func (this *ServerHelper) createBoardMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig, actionPtr actions.ActionWrapper) []maps.Map { menuItems := []maps.Map{} menuItems = append(menuItems, maps.Map{ - "name": "看板", + "name": this.Lang(actionPtr, codes.AdminServerMenuDashboard), "url": "/servers/server/board?serverId=" + serverIdString, "isActive": secondMenuItem == "index", }) @@ -164,20 +167,20 @@ func (this *ServerHelper) createBoardMenu(secondMenuItem string, serverIdString } // 日志菜单 -func (this *ServerHelper) createLogMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig) []maps.Map { +func (this *ServerHelper) createLogMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig, actionPtr actions.ActionWrapper) []maps.Map { menuItems := []maps.Map{} menuItems = append(menuItems, maps.Map{ - "name": "实时", + "name": this.Lang(actionPtr, codes.AdminServerMenuAccesslogRealtime), "url": "/servers/server/log?serverId=" + serverIdString, "isActive": secondMenuItem == "index", }) menuItems = append(menuItems, maps.Map{ - "name": "今天", + "name": this.Lang(actionPtr, codes.AdminServerMenuAccesslogToday), "url": "/servers/server/log/today?serverId=" + serverIdString, "isActive": secondMenuItem == "today", }) menuItems = append(menuItems, maps.Map{ - "name": "历史", + "name": this.Lang(actionPtr, codes.AdminServerMenuAccesslogHistory), "url": "/servers/server/log/history?serverId=" + serverIdString, "isActive": secondMenuItem == "history", }) @@ -185,30 +188,30 @@ func (this *ServerHelper) createLogMenu(secondMenuItem string, serverIdString st } // 统计菜单 -func (this *ServerHelper) createStatMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig) []maps.Map { +func (this *ServerHelper) createStatMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig, actionPtr actions.ActionWrapper) []maps.Map { var menuItems = []maps.Map{} menuItems = append(menuItems, maps.Map{ - "name": "流量统计", + "name": this.Lang(actionPtr, codes.AdminServerMenuStatTraffic), "url": "/servers/server/stat?serverId=" + serverIdString, "isActive": secondMenuItem == "index", }) menuItems = append(menuItems, maps.Map{ - "name": "地域分布", + "name": this.Lang(actionPtr, codes.AdminServerMenuStatRegions), "url": "/servers/server/stat/regions?serverId=" + serverIdString, "isActive": secondMenuItem == "region", }) menuItems = append(menuItems, maps.Map{ - "name": "运营商", + "name": this.Lang(actionPtr, codes.AdminServerMenuStatProviders), "url": "/servers/server/stat/providers?serverId=" + serverIdString, "isActive": secondMenuItem == "provider", }) menuItems = append(menuItems, maps.Map{ - "name": "终端", + "name": this.Lang(actionPtr, codes.AdminServerMenuStatClients), "url": "/servers/server/stat/clients?serverId=" + serverIdString, "isActive": secondMenuItem == "client", }) menuItems = append(menuItems, maps.Map{ - "name": "WAF", + "name": this.Lang(actionPtr, codes.AdminServerMenuStatWAF), "url": "/servers/server/stat/waf?serverId=" + serverIdString, "isActive": secondMenuItem == "waf", }) @@ -216,16 +219,16 @@ func (this *ServerHelper) createStatMenu(secondMenuItem string, serverIdString s } // 设置菜单 -func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig) (items []maps.Map) { +func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig, actionPtr actions.ActionWrapper) (items []maps.Map) { var menuItems = []maps.Map{ { - "name": "基本信息", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingBasic), "url": "/servers/server/settings?serverId=" + serverIdString, "isActive": secondMenuItem == "basic", "isOff": !serverConfig.IsOn, }, { - "name": "DNS", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingDNS), "url": "/servers/server/settings/dns?serverId=" + serverIdString, "isActive": secondMenuItem == "dns", }, @@ -234,34 +237,34 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri // HTTP if serverConfig.IsHTTPFamily() { menuItems = append(menuItems, maps.Map{ - "name": "域名", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingDomains), "url": "/servers/server/settings/serverNames?serverId=" + serverIdString, "isActive": secondMenuItem == "serverName", "isOn": len(serverConfig.ServerNames) > 0, }) menuItems = append(menuItems, maps.Map{ - "name": "HTTP", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingHTTP), "url": "/servers/server/settings/http?serverId=" + serverIdString, "isActive": secondMenuItem == "http", "isOn": (serverConfig.HTTP != nil && serverConfig.HTTP.IsOn && len(serverConfig.HTTP.Listen) > 0) || (serverConfig.Web != nil && serverConfig.Web.RedirectToHttps != nil && serverConfig.Web.RedirectToHttps.IsOn), "isOff": serverConfig.HTTP != nil && !serverConfig.HTTP.IsOn, }) menuItems = append(menuItems, maps.Map{ - "name": "HTTPS", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingHTTPS), "url": "/servers/server/settings/https?serverId=" + serverIdString, "isActive": secondMenuItem == "https", "isOn": serverConfig.HTTPS != nil && serverConfig.HTTPS.IsOn && len(serverConfig.HTTPS.Listen) > 0, "isOff": serverConfig.HTTPS != nil && !serverConfig.HTTPS.IsOn, }) menuItems = append(menuItems, maps.Map{ - "name": "源站", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingOrigins), "url": "/servers/server/settings/reverseProxy?serverId=" + serverIdString, "isActive": secondMenuItem == "reverseProxy", "isOn": serverConfig.ReverseProxyRef != nil && serverConfig.ReverseProxyRef.IsOn, "configCode": serverconfigs.ConfigCodeReverseProxy, }) - menuItems = filterMenuItems(serverConfig, menuItems, serverIdString, secondMenuItem) + menuItems = this.filterMenuItems(serverConfig, menuItems, serverIdString, secondMenuItem, actionPtr) menuItems = append(menuItems, maps.Map{ "name": "-", @@ -269,108 +272,108 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri "isActive": false, }) menuItems = append(menuItems, maps.Map{ - "name": "URL跳转", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingRedirects), "url": "/servers/server/settings/redirects?serverId=" + serverIdString, "isActive": secondMenuItem == "redirects", "isOn": serverConfig.Web != nil && len(serverConfig.Web.HostRedirects) > 0, "configCode": serverconfigs.ConfigCodeHostRedirects, }) menuItems = append(menuItems, maps.Map{ - "name": "路由规则", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingLocations), "url": "/servers/server/settings/locations?serverId=" + serverIdString, "isActive": secondMenuItem == "locations", "isOn": serverConfig.Web != nil && len(serverConfig.Web.Locations) > 0, }) menuItems = append(menuItems, maps.Map{ - "name": "重写规则", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingRewriteRules), "url": "/servers/server/settings/rewrite?serverId=" + serverIdString, "isActive": secondMenuItem == "rewrite", "isOn": serverConfig.Web != nil && len(serverConfig.Web.RewriteRefs) > 0, }) menuItems = append(menuItems, maps.Map{ - "name": "WAF", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingWAF), "url": "/servers/server/settings/waf?serverId=" + serverIdString, "isActive": secondMenuItem == "waf", "isOn": serverConfig.Web != nil && serverConfig.Web.FirewallRef != nil && serverConfig.Web.FirewallRef.IsOn, }) menuItems = append(menuItems, maps.Map{ - "name": "缓存", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingCache), "url": "/servers/server/settings/cache?serverId=" + serverIdString, "isActive": secondMenuItem == "cache", "isOn": serverConfig.Web != nil && serverConfig.Web.Cache != nil && serverConfig.Web.Cache.IsOn, "configCode": serverconfigs.ConfigCodeCache, }) menuItems = append(menuItems, maps.Map{ - "name": "访问鉴权", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingAuth), "url": "/servers/server/settings/access?serverId=" + serverIdString, "isActive": secondMenuItem == "access", "isOn": serverConfig.Web != nil && serverConfig.Web.Auth != nil && serverConfig.Web.Auth.IsOn, "configCode": serverconfigs.ConfigCodeAuth, }) menuItems = append(menuItems, maps.Map{ - "name": "防盗链", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingReferers), "url": "/servers/server/settings/referers?serverId=" + serverIdString, "isActive": secondMenuItem == "referer", "isOn": serverConfig.Web != nil && serverConfig.Web.Referers != nil && serverConfig.Web.Referers.IsOn, "configCode": serverconfigs.ConfigCodeReferers, }) menuItems = append(menuItems, maps.Map{ - "name": "UA名单", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingUserAgents), "url": "/servers/server/settings/userAgent?serverId=" + serverIdString, "isActive": secondMenuItem == "userAgent", "isOn": serverConfig.Web != nil && serverConfig.Web.UserAgent != nil && serverConfig.Web.UserAgent.IsOn, "configCode": serverconfigs.ConfigCodeUserAgent, }) menuItems = append(menuItems, maps.Map{ - "name": "字符编码", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingCharset), "url": "/servers/server/settings/charset?serverId=" + serverIdString, "isActive": secondMenuItem == "charset", "isOn": serverConfig.Web != nil && serverConfig.Web.Charset != nil && serverConfig.Web.Charset.IsOn, "configCode": serverconfigs.ConfigCodeCharset, }) menuItems = append(menuItems, maps.Map{ - "name": "访问日志", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingAccessLog), "url": "/servers/server/settings/accessLog?serverId=" + serverIdString, "isActive": secondMenuItem == "accessLog", "isOn": serverConfig.Web != nil && serverConfig.Web.AccessLogRef != nil && serverConfig.Web.AccessLogRef.IsOn, "configCode": serverconfigs.ConfigCodeAccessLog, }) menuItems = append(menuItems, maps.Map{ - "name": "统计", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingStat), "url": "/servers/server/settings/stat?serverId=" + serverIdString, "isActive": secondMenuItem == "stat", "isOn": serverConfig.Web != nil && serverConfig.Web.StatRef != nil && serverConfig.Web.StatRef.IsOn, "configCode": serverconfigs.ConfigCodeStat, }) menuItems = append(menuItems, maps.Map{ - "name": "内容压缩", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingCompress), "url": "/servers/server/settings/compression?serverId=" + serverIdString, "isActive": secondMenuItem == "compression", "isOn": serverConfig.Web != nil && serverConfig.Web.Compression != nil && serverConfig.Web.Compression.IsOn, "configCode": serverconfigs.ConfigCodeCompression, }) menuItems = append(menuItems, maps.Map{ - "name": "自定义页面", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingPages), "url": "/servers/server/settings/pages?serverId=" + serverIdString, "isActive": secondMenuItem == "pages", "isOn": serverConfig.Web != nil && (len(serverConfig.Web.Pages) > 0 || (serverConfig.Web.Shutdown != nil && serverConfig.Web.Shutdown.IsOn)), "configCode": serverconfigs.ConfigCodePages, }) menuItems = append(menuItems, maps.Map{ - "name": "HTTP Header", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingHTTPHeaders), "url": "/servers/server/settings/headers?serverId=" + serverIdString, "isActive": secondMenuItem == "header", "isOn": this.hasHTTPHeaders(serverConfig.Web), }) menuItems = append(menuItems, maps.Map{ - "name": "Websocket", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingWebsocket), "url": "/servers/server/settings/websocket?serverId=" + serverIdString, "isActive": secondMenuItem == "websocket", "isOn": serverConfig.Web != nil && serverConfig.Web.WebsocketRef != nil && serverConfig.Web.WebsocketRef.IsOn, "configCode": serverconfigs.ConfigCodeWebsocket, }) menuItems = append(menuItems, maps.Map{ - "name": "WebP", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingWebP), "url": "/servers/server/settings/webp?serverId=" + serverIdString, "isActive": secondMenuItem == "webp", "isOn": serverConfig.Web != nil && serverConfig.Web.WebP != nil && serverConfig.Web.WebP.IsOn, @@ -378,14 +381,14 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri }) menuItems = append(menuItems, maps.Map{ - "name": "静态分发", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingRoot), "url": "/servers/server/settings/web?serverId=" + serverIdString, "isActive": secondMenuItem == "web", "isOn": serverConfig.Web != nil && serverConfig.Web.Root != nil && serverConfig.Web.Root.IsOn, "configCode": serverconfigs.ConfigCodeRoot, }) menuItems = append(menuItems, maps.Map{ - "name": "Fastcgi", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingFastcgi), "url": "/servers/server/settings/fastcgi?serverId=" + serverIdString, "isActive": secondMenuItem == "fastcgi", "isOn": serverConfig.Web != nil && serverConfig.Web.FastcgiRef != nil && serverConfig.Web.FastcgiRef.IsOn, @@ -398,7 +401,7 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri }) menuItems = append(menuItems, maps.Map{ - "name": "访客IP地址", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingClientIP), "url": "/servers/server/settings/remoteAddr?serverId=" + serverIdString, "isActive": secondMenuItem == "remoteAddr", "isOn": serverConfig.Web != nil && serverConfig.Web.RemoteAddr != nil && serverConfig.Web.RemoteAddr.IsOn, @@ -406,14 +409,14 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri }) menuItems = append(menuItems, maps.Map{ - "name": "请求限制", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingRequestLimit), "url": "/servers/server/settings/requestLimit?serverId=" + serverIdString, "isActive": secondMenuItem == "requestLimit", "isOn": serverConfig.Web != nil && serverConfig.Web.RequestLimit != nil && serverConfig.Web.RequestLimit.IsOn, "configCode": serverconfigs.ConfigCodeRequestLimit, }) - menuItems = filterMenuItems2(serverConfig, menuItems, serverIdString, secondMenuItem) + menuItems = this.filterMenuItems2(serverConfig, menuItems, serverIdString, secondMenuItem, actionPtr) menuItems = append(menuItems, maps.Map{ "name": "-", @@ -422,46 +425,46 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri }) menuItems = append(menuItems, maps.Map{ - "name": "其他设置", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingOthers), "url": "/servers/server/settings/common?serverId=" + serverIdString, "isActive": secondMenuItem == "common", "isOn": serverConfig.Web != nil && serverConfig.Web.MergeSlashes, }) } else if serverConfig.IsTCPFamily() { menuItems = append(menuItems, maps.Map{ - "name": "TCP", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingTCP), "url": "/servers/server/settings/tcp?serverId=" + serverIdString, "isActive": secondMenuItem == "tcp", "isOn": serverConfig.TCP != nil && serverConfig.TCP.IsOn && len(serverConfig.TCP.Listen) > 0, }) menuItems = append(menuItems, maps.Map{ - "name": "TLS", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingTLS), "url": "/servers/server/settings/tls?serverId=" + serverIdString, "isActive": secondMenuItem == "tls", "isOn": serverConfig.TLS != nil && serverConfig.TLS.IsOn && len(serverConfig.TLS.Listen) > 0, }) menuItems = append(menuItems, maps.Map{ - "name": "源站", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingOrigins), "url": "/servers/server/settings/reverseProxy?serverId=" + serverIdString, "isActive": secondMenuItem == "reverseProxy", "isOn": serverConfig.ReverseProxyRef != nil && serverConfig.ReverseProxyRef.IsOn, }) } else if serverConfig.IsUnixFamily() { menuItems = append(menuItems, maps.Map{ - "name": "Unix", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingUnix), "url": "/servers/server/settings/unix?serverId=" + serverIdString, "isActive": secondMenuItem == "unix", "isOn": serverConfig.Unix != nil && serverConfig.Unix.IsOn && len(serverConfig.Unix.Listen) > 0, }) } else if serverConfig.IsUDPFamily() { menuItems = append(menuItems, maps.Map{ - "name": "UDP", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingUDP), "url": "/servers/server/settings/udp?serverId=" + serverIdString, "isActive": secondMenuItem == "udp", "isOn": serverConfig.UDP != nil && serverConfig.UDP.IsOn && len(serverConfig.UDP.Listen) > 0, }) menuItems = append(menuItems, maps.Map{ - "name": "源站", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingOrigins), "url": "/servers/server/settings/reverseProxy?serverId=" + serverIdString, "isActive": secondMenuItem == "reverseProxy", "isOn": serverConfig.ReverseProxyRef != nil && serverConfig.ReverseProxyRef.IsOn, @@ -472,10 +475,10 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri } // 删除菜单 -func (this *ServerHelper) createDeleteMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig) []maps.Map { +func (this *ServerHelper) createDeleteMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig, actionPtr actions.ActionWrapper) []maps.Map { menuItems := []maps.Map{} menuItems = append(menuItems, maps.Map{ - "name": "删除", + "name": this.Lang(actionPtr, codes.AdminServerMenuSettingDelete), "url": "/servers/server/delete?serverId=" + serverIdString, "isActive": secondMenuItem == "index", }) diff --git a/internal/web/actions/default/settings/settingutils/advanced_helper.go b/internal/web/actions/default/settings/settingutils/advanced_helper.go index cc6aed0b..84695cf1 100644 --- a/internal/web/actions/default/settings/settingutils/advanced_helper.go +++ b/internal/web/actions/default/settings/settingutils/advanced_helper.go @@ -5,10 +5,14 @@ package settingutils import ( "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/iwind/TeaGo/actions" ) type AdvancedHelper struct { + helpers.LangHelper + tab string } @@ -32,12 +36,12 @@ func (this *AdvancedHelper) BeforeAction(actionPtr actions.ActionWrapper) (goNex var session = action.Session() var adminId = session.GetInt64("adminId") if configloaders.AllowModule(adminId, configloaders.AdminModuleCodeSetting) { - tabbar.Add("数据库", "", "/settings/database", "", this.tab == "database") - tabbar.Add("API节点", "", "/settings/api", "", this.tab == "apiNodes") - tabbar.Add("日志数据库", "", "/db", "", this.tab == "dbNodes") - tabbar.Add("迁移", "", "/settings/transfer", "", this.tab == "transfer") + tabbar.Add(this.Lang(actionPtr, codes.AdminSettingsTabTransfer), "", "/settings/database", "", this.tab == "database") + tabbar.Add(this.Lang(actionPtr, codes.AdminSettingsTabAPINodes), "", "/settings/api", "", this.tab == "apiNodes") + tabbar.Add(this.Lang(actionPtr, codes.AdminSettingsTabAccessLogDatabases), "", "/db", "", this.tab == "dbNodes") + tabbar.Add(this.Lang(actionPtr, codes.AdminSettingsTabTransfer), "", "/settings/transfer", "", this.tab == "transfer") - //tabbar.Add("备份", "", "/settings/backup", "", this.tab == "backup") + //tabbar.Add(codes.AdminSettingsTabBackup, "", "/settings/backup", "", this.tab == "backup") } actionutils.SetTabbar(actionPtr, tabbar) diff --git a/internal/web/actions/default/settings/settingutils/helper.go b/internal/web/actions/default/settings/settingutils/helper.go index 01df2e28..ef70d142 100644 --- a/internal/web/actions/default/settings/settingutils/helper.go +++ b/internal/web/actions/default/settings/settingutils/helper.go @@ -5,10 +5,14 @@ package settingutils import ( "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/iwind/TeaGo/actions" ) type Helper struct { + helpers.LangHelper + tab string } @@ -32,13 +36,13 @@ func (this *Helper) BeforeAction(actionPtr actions.ActionWrapper) (goNext bool) var session = action.Session() var adminId = session.GetInt64("adminId") if configloaders.AllowModule(adminId, configloaders.AdminModuleCodeSetting) { - tabbar.Add("Web服务", "", "/settings/server", "", this.tab == "server") - tabbar.Add("管理界面设置", "", "/settings/ui", "", this.tab == "ui") - tabbar.Add("安全设置", "", "/settings/security", "", this.tab == "security") - tabbar.Add("检查更新", "", "/settings/updates", "", this.tab == "updates") + tabbar.Add(this.Lang(actionPtr, codes.AdminSettingsTabAdminServer), "", "/settings/server", "", this.tab == "server") + tabbar.Add(this.Lang(actionPtr, codes.AdminSettingsTabAdminUI), "", "/settings/ui", "", this.tab == "ui") + tabbar.Add(this.Lang(actionPtr, codes.AdminSettingsTabAdminSecuritySettings), "", "/settings/security", "", this.tab == "security") + tabbar.Add(this.Lang(actionPtr, codes.AdminSettingsTabUpdates), "", "/settings/updates", "", this.tab == "updates") } - tabbar.Add("个人资料", "", "/settings/profile", "", this.tab == "profile") - tabbar.Add("登录设置", "", "/settings/login", "", this.tab == "login") + tabbar.Add(this.Lang(actionPtr, codes.AdminSettingsTabProfile), "", "/settings/profile", "", this.tab == "profile") + tabbar.Add(this.Lang(actionPtr, codes.AdminSettingsTabLogin), "", "/settings/login", "", this.tab == "login") actionutils.SetTabbar(actionPtr, tabbar) return diff --git a/internal/web/helpers/helper_lang.go b/internal/web/helpers/helper_lang.go new file mode 100644 index 00000000..68f65d56 --- /dev/null +++ b/internal/web/helpers/helper_lang.go @@ -0,0 +1,20 @@ +// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package helpers + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeCommon/pkg/langs" + "github.com/iwind/TeaGo/actions" +) + +type LangHelper struct { +} + +func (this *LangHelper) Lang(actionPtr actions.ActionWrapper, messageCode langs.MessageCode, args ...any) string { + var langCode = configloaders.FindAdminLang(actionPtr.Object().Session().GetInt64("adminId")) + if len(langCode) == 0 { + langCode = langs.ParseLangFromAction(actionPtr) + } + return langs.Message(langCode, messageCode, args...) +} diff --git a/web/public/js/langs/zh-cn.js b/web/public/js/langs/zh-cn.js index 933d3e93..ccf0c017 100644 --- a/web/public/js/langs/zh-cn.js +++ b/web/public/js/langs/zh-cn.js @@ -1,2 +1,2 @@ // generated by 'langs generate' -window.LANG_MESSAGES = {"admin_dashboard_dns":"DNS","admin_dashboard_events":"事件","admin_dashboard_overview":"概况","admin_dashboard_user":"用户","admin_dashboard_waf":"WAF","admin_menu_admin_recipients":"通知媒介","admin_menu_admins":"系统用户","admin_menu_dashboard":"数据看板","admin_menu_dns":"域名解析","admin_menu_dns_clusters":"集群列表","admin_menu_dns_issues":"问题修复","admin_menu_dns_providers":"DNS服务商","admin_menu_finance":"财务管理","admin_menu_finance_accounts":"用户账户","admin_menu_finance_bills":"费用账单","admin_menu_finance_fee":"计费设置","admin_menu_finance_income":"统计报表","admin_menu_finance_logs":"收支明细","admin_menu_finance_orders":"订单管理","admin_menu_finance_packages":"流量包","admin_menu_logs":"日志审计","admin_menu_node_anti_ddos_products":"高防IP","admin_menu_node_clusters":"集群列表","admin_menu_node_distributed_monitors":"区域监控","admin_menu_node_ip_list":"节点IP","admin_menu_node_logs":"节点日志","admin_menu_node_regions":"区域设置","admin_menu_node_ssh_grants":"节点SSH","admin_menu_nodes":"边缘节点","admin_menu_ns":"智能DNS","admin_menu_ns_access_logs":"访问日志","admin_menu_ns_clusters":"集群管理","admin_menu_ns_domain_batch_operations":"批量操作","admin_menu_ns_domain_groups":"域名分组","admin_menu_ns_domains":"域名管理","admin_menu_ns_node_logs":"运行日志","admin_menu_ns_plans":"套餐设置","admin_menu_ns_resolve_test":"解析测试","admin_menu_ns_routes":"线路管理","admin_menu_ns_settings":"全局配置","admin_menu_ns_user_plans":"用户套餐","admin_menu_plan_user_plans":"已购套餐","admin_menu_plans":"套餐管理","admin_menu_server_access_log_policies":"日志策略","admin_menu_server_access_logs":"访问日志","admin_menu_server_cache_policies":"缓存策略","admin_menu_server_certs":"证书管理","admin_menu_server_global_settings":"通用设置","admin_menu_server_groups":"网站分组","admin_menu_server_ip_lists":"IP名单","admin_menu_server_metrics":"统计指标","admin_menu_server_purge_fetch_caches":"刷新预热","admin_menu_server_scripts":"脚本库","admin_menu_server_traffic_stats":"用量统计","admin_menu_server_waf_policies":"WAF策略","admin_menu_servers":"网站列表","admin_menu_setting_advanced_settings":"高级设置","admin_menu_setting_authority":"商业版本","admin_menu_setting_basic_settings":"基础设置","admin_menu_settings":"系统设置","admin_menu_ticket_category":"分类","admin_menu_tickets":"工单系统","admin_menu_users":"用户设置"}; +window.LANG_MESSAGES = {"admin_cluster_menu_setting_basic":"基础设置","admin_cluster_menu_setting_cache_policy":"缓存策略","admin_cluster_menu_setting_cc":"CC防护","admin_cluster_menu_setting_ddos_protection":"DDoS防护","admin_cluster_menu_setting_dns":"DNS设置","admin_cluster_menu_setting_health_check":"健康检查","admin_cluster_menu_setting_http3":"HTTP/3","admin_cluster_menu_setting_metrics":"统计指标","admin_cluster_menu_setting_notification":"消息通知","admin_cluster_menu_setting_pages":"自定义页面","admin_cluster_menu_setting_schedule":"智能调度","admin_cluster_menu_setting_service_global":"网站设置","admin_cluster_menu_setting_system_service":"系统服务","admin_cluster_menu_setting_thresholds":"阈值设置","admin_cluster_menu_setting_toa":"TOA设置","admin_cluster_menu_setting_uam":"5秒盾","admin_cluster_menu_setting_waf_actions":"WAF动作","admin_cluster_menu_setting_waf_policy":"WAF策略","admin_cluster_menu_setting_webp":"WebP","admin_cluster_menu_tab_cluster_dashboard":"集群看板","admin_cluster_menu_tab_cluster_delete":"删除集群","admin_cluster_menu_tab_cluster_nodes":"节点列表","admin_cluster_menu_tab_cluster_settings":"集群设置","admin_common_menu_setting_basic":"基础设置","admin_common_menu_setting_cache":"缓存设置","admin_common_menu_setting_cache_policy":"缓存策略","admin_common_menu_setting_ddos_protection":"DDoS防护","admin_common_menu_setting_dns":"DNS设置","admin_common_menu_setting_health_check":"健康检查","admin_common_menu_setting_metrics":"统计指标","admin_common_menu_setting_waf_policy":"WAF策略","admin_common_menu_setting_webp":"WebP","admin_common_system":"系统","admin_dashboard_dns":"DNS","admin_dashboard_events":"事件","admin_dashboard_overview":"概况","admin_dashboard_user":"用户","admin_dashboard_waf":"WAF","admin_db_node_tab_nodes":"数据库节点","admin_menu_admin_recipients":"通知媒介","admin_menu_admins":"系统用户","admin_menu_dashboard":"数据看板","admin_menu_dns":"域名解析","admin_menu_dns_clusters":"集群列表","admin_menu_dns_issues":"问题修复","admin_menu_dns_providers":"DNS服务商","admin_menu_finance":"财务管理","admin_menu_finance_accounts":"用户账户","admin_menu_finance_bills":"费用账单","admin_menu_finance_fee":"计费设置","admin_menu_finance_income":"统计报表","admin_menu_finance_logs":"收支明细","admin_menu_finance_orders":"订单管理","admin_menu_finance_packages":"流量包","admin_menu_logs":"日志审计","admin_menu_node_anti_ddos_products":"高防IP","admin_menu_node_clusters":"集群列表","admin_menu_node_distributed_monitors":"区域监控","admin_menu_node_ip_list":"节点IP","admin_menu_node_logs":"节点日志","admin_menu_node_regions":"区域设置","admin_menu_node_ssh_grants":"节点SSH","admin_menu_nodes":"边缘节点","admin_menu_ns":"智能DNS","admin_menu_ns_access_logs":"访问日志","admin_menu_ns_clusters":"集群管理","admin_menu_ns_domain_batch_operations":"批量操作","admin_menu_ns_domain_groups":"域名分组","admin_menu_ns_domains":"域名管理","admin_menu_ns_node_logs":"运行日志","admin_menu_ns_plans":"套餐设置","admin_menu_ns_resolve_test":"解析测试","admin_menu_ns_routes":"线路管理","admin_menu_ns_settings":"全局配置","admin_menu_ns_user_plans":"用户套餐","admin_menu_plan_user_plans":"已购套餐","admin_menu_plans":"套餐管理","admin_menu_server_access_log_policies":"日志策略","admin_menu_server_access_logs":"访问日志","admin_menu_server_cache_policies":"缓存策略","admin_menu_server_certs":"证书管理","admin_menu_server_global_settings":"通用设置","admin_menu_server_groups":"网站分组","admin_menu_server_ip_lists":"IP名单","admin_menu_server_metrics":"统计指标","admin_menu_server_purge_fetch_caches":"刷新预热","admin_menu_server_scripts":"脚本库","admin_menu_server_traffic_stats":"用量统计","admin_menu_server_waf_policies":"WAF策略","admin_menu_servers":"网站列表","admin_menu_setting_advanced_settings":"高级设置","admin_menu_setting_authority":"商业版本","admin_menu_setting_basic_settings":"基础设置","admin_menu_settings":"系统设置","admin_menu_ticket_category":"分类","admin_menu_tickets":"工单系统","admin_menu_users":"用户设置","admin_node_menu_create_multiple_nodes":"批量创建","admin_node_menu_create_single_node":"单个创建","admin_node_menu_install_auto_register":"自动注册","admin_node_menu_install_manually":"手动安装","admin_node_menu_install_remote":"远程安装(%d)","admin_node_menu_install_remote_upgrade":"远程升级(%d)","admin_node_menu_setting_basic":"基础设置","admin_node_menu_setting_cache":"缓存设置","admin_node_menu_setting_ddos_protection":"DDoS防护","admin_node_menu_setting_dns":"DNS设置","admin_node_menu_setting_schedule":"智能调度","admin_node_menu_setting_ssh":"SSH设置","admin_node_menu_setting_system":"系统设置","admin_node_menu_setting_thresholds":"阈值设置","admin_node_ungrouped_label":"未分组","admin_ns_cluster_tab_delete":"删除集群","admin_ns_cluster_tab_nodes":"节点列表","admin_ns_cluster_tab_setting":"集群设置","admin_server_menu_accesslog_history":"历史","admin_server_menu_accesslog_realtime":"实时","admin_server_menu_accesslog_today":"今天","admin_server_menu_dashboard":"看板","admin_server_menu_setting_access_log":"访问日志","admin_server_menu_setting_auth":"访问鉴权","admin_server_menu_setting_basic":"基本信息","admin_server_menu_setting_cache":"缓存","admin_server_menu_setting_cc":"CC防护","admin_server_menu_setting_charset":"字符编码","admin_server_menu_setting_client_ip":"访客IP地址","admin_server_menu_setting_compress":"内容压缩","admin_server_menu_setting_delete":"删除","admin_server_menu_setting_dns":"DNS","admin_server_menu_setting_domains":"域名","admin_server_menu_setting_fastcgi":"Fastcgi","admin_server_menu_setting_http":"HTTP","admin_server_menu_setting_http_headers":"HTTP Header","admin_server_menu_setting_https":"HTTPS","admin_server_menu_setting_locations":"路由规则","admin_server_menu_setting_origins":"源站","admin_server_menu_setting_others":"其他设置","admin_server_menu_setting_pages":"自定义页面","admin_server_menu_setting_redirects":"URL跳转","admin_server_menu_setting_referers":"防盗链","admin_server_menu_setting_request_limit":"请求限制","admin_server_menu_setting_rewrite_rules":"重写规则","admin_server_menu_setting_root":"静态分发","admin_server_menu_setting_scripts":"边缘脚本","admin_server_menu_setting_stat":"统计","admin_server_menu_setting_tcp":"TCP","admin_server_menu_setting_tls":"TLS","admin_server_menu_setting_traffic_limit":"流量限制","admin_server_menu_setting_uam":"5秒盾","admin_server_menu_setting_udp":"UDP","admin_server_menu_setting_unix":"Unix","admin_server_menu_setting_user_agents":"UA名单","admin_server_menu_setting_waf":"WAF","admin_server_menu_setting_webp":"WebP","admin_server_menu_setting_websocket":"Websocket","admin_server_menu_stat_clients":"终端","admin_server_menu_stat_providers":"运营商","admin_server_menu_stat_regions":"地域分布","admin_server_menu_stat_traffic":"流量统计","admin_server_menu_stat_waf":"WAF","admin_server_tab_access_logs":"日志","admin_server_tab_dashboard":"看板","admin_server_tab_delete":"删除","admin_server_tab_settings":"设置","admin_server_tab_stat":"统计","admin_settings_tab_access_log_databases":"日志数据库","admin_settings_tab_admin_security_settings":"安全设置","admin_settings_tab_admin_server":"Web服务","admin_settings_tab_admin_ui":"管理界面设置","admin_settings_tab_api_nodes":"API节点","admin_settings_tab_authority":"商业版认证","admin_settings_tab_backup":"备份","admin_settings_tab_client_browsers":"浏览器库","admin_settings_tab_client_operation_systems":"操作系统库","admin_settings_tab_database":"数据库","admin_settings_tab_ip_library":"IP库","admin_settings_tab_login":"登录设置","admin_settings_tab_monitor_nodes":"监控节点","admin_settings_tab_profile":"个人资料","admin_settings_tab_transfer":"迁移","admin_settings_tab_updates":"检查更新","admin_settings_tab_user_nodes":"用户节点","admin_settings_tab_user_ui":"用户界面设置"};