From 5bebb2cca086b8ef2a704aa5a55ca3e7933f5fe5 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Wed, 28 Jun 2023 16:19:05 +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 --- cmd/langs/main.go | 88 +++++-- pkg/configutils/variable.go | 12 + pkg/langs/codes/codes.go | 247 +++++++++++++----- pkg/langs/lang.go | 46 ++++ pkg/langs/messages/messages_zh_cn.go | 246 ++++++++++++----- pkg/langs/protos/zh-cn/README.md | 1 + pkg/langs/protos/zh-cn/admin_cluster.json | 3 - .../protos/zh-cn/admin_cluster_menu.json | 26 ++ pkg/langs/protos/zh-cn/admin_common.json | 11 +- pkg/langs/protos/zh-cn/admin_db_node.json | 3 + pkg/langs/protos/zh-cn/admin_node.json | 2 +- pkg/langs/protos/zh-cn/admin_node_menu.json | 18 ++ pkg/langs/protos/zh-cn/admin_ns_cluster.json | 5 + pkg/langs/protos/zh-cn/admin_server.json | 54 ++++ pkg/langs/protos/zh-cn/admin_setings.json | 3 - pkg/langs/protos/zh-cn/admin_settings.json | 20 ++ pkg/langs/utils.go | 11 +- pkg/langs/utils_test.go | 24 +- 18 files changed, 656 insertions(+), 164 deletions(-) create mode 100644 pkg/langs/protos/zh-cn/README.md delete mode 100644 pkg/langs/protos/zh-cn/admin_cluster.json create mode 100644 pkg/langs/protos/zh-cn/admin_cluster_menu.json create mode 100644 pkg/langs/protos/zh-cn/admin_db_node.json create mode 100644 pkg/langs/protos/zh-cn/admin_node_menu.json create mode 100644 pkg/langs/protos/zh-cn/admin_ns_cluster.json delete mode 100644 pkg/langs/protos/zh-cn/admin_setings.json create mode 100644 pkg/langs/protos/zh-cn/admin_settings.json diff --git a/cmd/langs/main.go b/cmd/langs/main.go index cde6b0d..9f9fdb9 100644 --- a/cmd/langs/main.go +++ b/cmd/langs/main.go @@ -51,9 +51,10 @@ func runGenerate() { var dirRegexp = regexp.MustCompile(`^[a-z]+-[a-z]+$`) var jsonFileNameRegexp = regexp.MustCompile(`^([a-zA-Z0-9]+)(_([a-zA-Z0-9]+))+\.json$`) var messageCodeRegexp = regexp.MustCompile(`^[a-zA-Z0-9_]+$`) + var jsonCommentRegexp = regexp.MustCompile(`//.+`) var messageCodes = []string{} - var messageMaps = map[string]map[string]string{} // lang => { K:V } + var langMaps = map[string]*langs.Lang{} // lang => *langs.Lang var defaultLang = langs.DefaultManager().DefaultLang() for _, file := range files { @@ -65,11 +66,11 @@ func runGenerate() { var langCode = dirName var isBaseLang = langCode == defaultLang - func() { + var processOk = func() bool { jsonFiles, err := filepath.Glob(rootDir + "/" + dirName + "/*.json") if err != nil { fmt.Println("[ERROR]list json files failed: " + err.Error()) - return + return false } for _, jsonFile := range jsonFiles { @@ -82,21 +83,24 @@ func runGenerate() { data, err := os.ReadFile(jsonFile) if err != nil { fmt.Println("[ERROR]read json file '" + jsonFile + "' failed: " + err.Error()) - return + return false } + // remove comments in json + data = jsonCommentRegexp.ReplaceAll(data, []byte{}) + var m = map[string]string{} // code => value err = json.Unmarshal(data, &m) if err != nil { fmt.Println("[ERROR]decode json file '" + jsonFile + "' failed: " + err.Error()) - return + return false } var newM = map[string]string{} for code, value := range m { if !messageCodeRegexp.MatchString(code) { fmt.Println("[ERROR]invalid message code '" + code + "'") - return + return false } var fullCode = module + "_" + code @@ -106,28 +110,42 @@ func runGenerate() { newM[fullCode] = value } - finalMap, ok := messageMaps[langCode] + finalLang, ok := langMaps[langCode] if !ok { - finalMap = map[string]string{} - messageMaps[langCode] = finalMap + finalLang = langs.NewLang(langCode) + langMaps[langCode] = finalLang } for code, value := range newM { - finalMap[code] = value + finalLang.Set(code, value) } } + + return true }() + if !processOk { + return + } + } + + // compile + for langCode, lang := range langMaps { + err = lang.Compile() + if err != nil { + fmt.Println("[ERROR]compile '" + langCode + "' failed: " + err.Error()) + return + } } // check message codes fmt.Println("checking message codes ...") var defaultMessageMap = map[string]string{} - for langCode, messageMap := range messageMaps { + for langCode, messageLang := range langMaps { if langCode == defaultLang { // only check lang not equal to 'en-us' - defaultMessageMap = messageMap + defaultMessageMap = messageLang.GetAll() continue } - for messageCode := range messageMap { + for messageCode := range messageLang.GetAll() { if !lists.ContainsString(messageCodes, messageCode) { fmt.Println("[ERROR]message code '" + messageCode + "' in lang '" + langCode + "' not exist in default lang file ('" + defaultLang + "')") return @@ -150,11 +168,16 @@ import( const ( ` - for _, messageCode := range messageCodes { + for index, messageCode := range messageCodes { // add comment to message code comment, _, _ := strings.Cut(defaultMessageMap[messageCode], "\n") - codesSource += upperWords(messageCode) + " langs.MessageCode = " + strconv.Quote(messageCode) + " // " + comment + "\n" + codesSource += upperWords(messageCode) + " langs.MessageCode = " + strconv.Quote(messageCode) + " // " + comment + + // add NL + if index != len(messageCodes)-1 { + codesSource += "\n" + } } codesSource += ` @@ -175,7 +198,7 @@ const ( } // generate messages_LANG.go - for langCode, messageMap := range messageMaps { + for langCode, messageLang := range langMaps { var langFile = strings.ReplaceAll("messages/messages_"+langCode+".go", "-", "_") fmt.Println("generating '" + langFile + "' ...") @@ -192,7 +215,7 @@ func init() { langs.Load("` + langCode + `", map[string]string{ ` - for code, value := range messageMap { + for code, value := range messageLang.GetAll() { source += strconv.Quote(code) + ": " + strconv.Quote(value) + ",\n" } @@ -214,8 +237,8 @@ func init() { } } - // generate language javascript files for EdgeAdmin - for lang, messageMap := range messageMaps { + // generate language javascript files for EdgeAdmin and EdgeUser (commercial versions) + for lang, messageLang := range langMaps { if lang != defaultLang { // TODO merge messageMap with default message map } @@ -226,7 +249,26 @@ func init() { var targetDir = filepath.Dir(targetFile) dirStat, _ := os.Stat(targetDir) if dirStat != nil { - messageMapJSON, err := json.Marshal(messageMap) + + var prefix = "" + switch component { + case "EdgeAdmin": + prefix = "admin_" + case "EdgeUser": + prefix = "user_" + } + if len(prefix) == 0 { + continue + } + + var filteredMessages = map[string]string{} + for code, value := range messageLang.GetAll() { + if strings.HasPrefix(code, prefix) { + filteredMessages[code] = value + } + } + + messageMapJSON, err := json.Marshal(filteredMessages) if err != nil { fmt.Println("[ERROR]marshal message map failed: " + err.Error()) return @@ -264,12 +306,16 @@ func upperWord(word string) string { // special words switch word { - case "api", "http", "https", "tcp", "udp", "ip", "dns", "ns", "waf", "acme", "ssh", "toa": + case "api", "http", "https", "tcp", "tls", "udp", "ip", "dns", "ns", + "waf", "acme", "ssh", "toa", "http2", "http3", "uam", "cc", + "db", "isp", "sni", "ui": return strings.ToUpper(word) case "ipv6": return "IPv6" case "ddos": return "DDoS" + case "webp": + return "WebP" } return strings.ToUpper(word[:1]) + word[1:] diff --git a/pkg/configutils/variable.go b/pkg/configutils/variable.go index 0f6be65..0baea26 100644 --- a/pkg/configutils/variable.go +++ b/pkg/configutils/variable.go @@ -66,6 +66,18 @@ func ParseVariables(source string, replacer func(varName string) (value string)) return builder.String() } +func ParseVariablesError(source string, replacer func(varName string) (value string, err error)) (string, error) { + var resultErr error + var result = ParseVariables(source, func(varName string) (value string) { + replacedValue, err := replacer(varName) + if err != nil { + resultErr = err + } + return replacedValue + }) + return result, resultErr +} + // ParseVariablesFromHolders 从占位中分析变量 func ParseVariablesFromHolders(holders VariableHolders, replacer func(varName string) (value string)) string { // no variables diff --git a/pkg/langs/codes/codes.go b/pkg/langs/codes/codes.go index 5a2fd17..7f86180 100644 --- a/pkg/langs/codes/codes.go +++ b/pkg/langs/codes/codes.go @@ -7,68 +7,187 @@ import ( ) const ( - AdminDashboardDNS langs.MessageCode = "admin_dashboard_dns" // DNS - AdminDashboardEvents langs.MessageCode = "admin_dashboard_events" // 事件 - AdminDashboardOverview langs.MessageCode = "admin_dashboard_overview" // 概况 - AdminDashboardUser langs.MessageCode = "admin_dashboard_user" // 用户 - AdminDashboardWAF langs.MessageCode = "admin_dashboard_waf" // WAF - AdminMenuAdminRecipients langs.MessageCode = "admin_menu_admin_recipients" // 通知媒介 - AdminMenuAdmins langs.MessageCode = "admin_menu_admins" // 系统用户 - AdminMenuDashboard langs.MessageCode = "admin_menu_dashboard" // 数据看板 - AdminMenuDNS langs.MessageCode = "admin_menu_dns" // 域名解析 - AdminMenuDNSClusters langs.MessageCode = "admin_menu_dns_clusters" // 集群列表 - AdminMenuDNSIssues langs.MessageCode = "admin_menu_dns_issues" // 问题修复 - AdminMenuDNSProviders langs.MessageCode = "admin_menu_dns_providers" // DNS服务商 - AdminMenuFinance langs.MessageCode = "admin_menu_finance" // 财务管理 - AdminMenuFinanceAccounts langs.MessageCode = "admin_menu_finance_accounts" // 用户账户 - AdminMenuFinanceBills langs.MessageCode = "admin_menu_finance_bills" // 费用账单 - AdminMenuFinanceFee langs.MessageCode = "admin_menu_finance_fee" // 计费设置 - AdminMenuFinanceIncome langs.MessageCode = "admin_menu_finance_income" // 统计报表 - AdminMenuFinanceLogs langs.MessageCode = "admin_menu_finance_logs" // 收支明细 - AdminMenuFinanceOrders langs.MessageCode = "admin_menu_finance_orders" // 订单管理 - AdminMenuFinancePackages langs.MessageCode = "admin_menu_finance_packages" // 流量包 - AdminMenuLogs langs.MessageCode = "admin_menu_logs" // 日志审计 - AdminMenuNodeAntiDDoSProducts langs.MessageCode = "admin_menu_node_anti_ddos_products" // 高防IP - AdminMenuNodeClusters langs.MessageCode = "admin_menu_node_clusters" // 集群列表 - AdminMenuNodeDistributedMonitors langs.MessageCode = "admin_menu_node_distributed_monitors" // 区域监控 - AdminMenuNodeIPList langs.MessageCode = "admin_menu_node_ip_list" // 节点IP - AdminMenuNodeLogs langs.MessageCode = "admin_menu_node_logs" // 节点日志 - AdminMenuNodeRegions langs.MessageCode = "admin_menu_node_regions" // 区域设置 - AdminMenuNodeSSHGrants langs.MessageCode = "admin_menu_node_ssh_grants" // 节点SSH - AdminMenuNodes langs.MessageCode = "admin_menu_nodes" // 边缘节点 - AdminMenuNS langs.MessageCode = "admin_menu_ns" // 智能DNS - AdminMenuNSAccessLogs langs.MessageCode = "admin_menu_ns_access_logs" // 访问日志 - AdminMenuNSClusters langs.MessageCode = "admin_menu_ns_clusters" // 集群管理 - AdminMenuNSDomainBatchOperations langs.MessageCode = "admin_menu_ns_domain_batch_operations" // 批量操作 - AdminMenuNSDomainGroups langs.MessageCode = "admin_menu_ns_domain_groups" // 域名分组 - AdminMenuNSDomains langs.MessageCode = "admin_menu_ns_domains" // 域名管理 - AdminMenuNSNodeLogs langs.MessageCode = "admin_menu_ns_node_logs" // 运行日志 - AdminMenuNSPlans langs.MessageCode = "admin_menu_ns_plans" // 套餐设置 - AdminMenuNSResolveTest langs.MessageCode = "admin_menu_ns_resolve_test" // 解析测试 - AdminMenuNSRoutes langs.MessageCode = "admin_menu_ns_routes" // 线路管理 - AdminMenuNSSettings langs.MessageCode = "admin_menu_ns_settings" // 全局配置 - AdminMenuNSUserPlans langs.MessageCode = "admin_menu_ns_user_plans" // 用户套餐 - AdminMenuPlanUserPlans langs.MessageCode = "admin_menu_plan_user_plans" // 已购套餐 - AdminMenuPlans langs.MessageCode = "admin_menu_plans" // 套餐管理 - AdminMenuServerAccessLogPolicies langs.MessageCode = "admin_menu_server_access_log_policies" // 日志策略 - AdminMenuServerAccessLogs langs.MessageCode = "admin_menu_server_access_logs" // 访问日志 - AdminMenuServerCachePolicies langs.MessageCode = "admin_menu_server_cache_policies" // 缓存策略 - AdminMenuServerCerts langs.MessageCode = "admin_menu_server_certs" // 证书管理 - AdminMenuServerGlobalSettings langs.MessageCode = "admin_menu_server_global_settings" // 通用设置 - AdminMenuServerGroups langs.MessageCode = "admin_menu_server_groups" // 网站分组 - AdminMenuServerIPLists langs.MessageCode = "admin_menu_server_ip_lists" // IP名单 - AdminMenuServerMetrics langs.MessageCode = "admin_menu_server_metrics" // 统计指标 - AdminMenuServerPurgeFetchCaches langs.MessageCode = "admin_menu_server_purge_fetch_caches" // 刷新预热 - AdminMenuServerScripts langs.MessageCode = "admin_menu_server_scripts" // 脚本库 - AdminMenuServerTrafficStats langs.MessageCode = "admin_menu_server_traffic_stats" // 用量统计 - AdminMenuServerWAFPolicies langs.MessageCode = "admin_menu_server_waf_policies" // WAF策略 - AdminMenuServers langs.MessageCode = "admin_menu_servers" // 网站列表 - AdminMenuSettingAdvancedSettings langs.MessageCode = "admin_menu_setting_advanced_settings" // 高级设置 - AdminMenuSettingAuthority langs.MessageCode = "admin_menu_setting_authority" // 商业版本 - AdminMenuSettingBasicSettings langs.MessageCode = "admin_menu_setting_basic_settings" // 基础设置 - AdminMenuSettings langs.MessageCode = "admin_menu_settings" // 系统设置 - AdminMenuTicketCategory langs.MessageCode = "admin_menu_ticket_category" // 分类 - AdminMenuTickets langs.MessageCode = "admin_menu_tickets" // 工单系统 - AdminMenuUsers langs.MessageCode = "admin_menu_users" // 用户设置 - + AdminClusterMenuSettingBasic langs.MessageCode = "admin_cluster_menu_setting_basic" // 基础设置 + AdminClusterMenuSettingCachePolicy langs.MessageCode = "admin_cluster_menu_setting_cache_policy" // 缓存策略 + AdminClusterMenuSettingCC langs.MessageCode = "admin_cluster_menu_setting_cc" // CC防护 + AdminClusterMenuSettingDDoSProtection langs.MessageCode = "admin_cluster_menu_setting_ddos_protection" // DDoS防护 + AdminClusterMenuSettingDNS langs.MessageCode = "admin_cluster_menu_setting_dns" // DNS设置 + AdminClusterMenuSettingHealthCheck langs.MessageCode = "admin_cluster_menu_setting_health_check" // 健康检查 + AdminClusterMenuSettingHTTP3 langs.MessageCode = "admin_cluster_menu_setting_http3" // HTTP/3 + AdminClusterMenuSettingMetrics langs.MessageCode = "admin_cluster_menu_setting_metrics" // 统计指标 + AdminClusterMenuSettingNotification langs.MessageCode = "admin_cluster_menu_setting_notification" // 消息通知 + AdminClusterMenuSettingPages langs.MessageCode = "admin_cluster_menu_setting_pages" // 自定义页面 + AdminClusterMenuSettingSchedule langs.MessageCode = "admin_cluster_menu_setting_schedule" // 智能调度 + AdminClusterMenuSettingServiceGlobal langs.MessageCode = "admin_cluster_menu_setting_service_global" // 网站设置 + AdminClusterMenuSettingSystemService langs.MessageCode = "admin_cluster_menu_setting_system_service" // 系统服务 + AdminClusterMenuSettingThresholds langs.MessageCode = "admin_cluster_menu_setting_thresholds" // 阈值设置 + AdminClusterMenuSettingTOA langs.MessageCode = "admin_cluster_menu_setting_toa" // TOA设置 + AdminClusterMenuSettingUAM langs.MessageCode = "admin_cluster_menu_setting_uam" // 5秒盾 + AdminClusterMenuSettingWAFActions langs.MessageCode = "admin_cluster_menu_setting_waf_actions" // WAF动作 + AdminClusterMenuSettingWAFPolicy langs.MessageCode = "admin_cluster_menu_setting_waf_policy" // WAF策略 + AdminClusterMenuSettingWebP langs.MessageCode = "admin_cluster_menu_setting_webp" // WebP + AdminClusterMenuTabClusterDashboard langs.MessageCode = "admin_cluster_menu_tab_cluster_dashboard" // 集群看板 + AdminClusterMenuTabClusterDelete langs.MessageCode = "admin_cluster_menu_tab_cluster_delete" // 删除集群 + AdminClusterMenuTabClusterNodes langs.MessageCode = "admin_cluster_menu_tab_cluster_nodes" // 节点列表 + AdminClusterMenuTabClusterSettings langs.MessageCode = "admin_cluster_menu_tab_cluster_settings" // 集群设置 + AdminCommonMenuSettingBasic langs.MessageCode = "admin_common_menu_setting_basic" // 基础设置 + AdminCommonMenuSettingCache langs.MessageCode = "admin_common_menu_setting_cache" // 缓存设置 + AdminCommonMenuSettingCachePolicy langs.MessageCode = "admin_common_menu_setting_cache_policy" // 缓存策略 + AdminCommonMenuSettingDDoSProtection langs.MessageCode = "admin_common_menu_setting_ddos_protection" // DDoS防护 + AdminCommonMenuSettingDNS langs.MessageCode = "admin_common_menu_setting_dns" // DNS设置 + AdminCommonMenuSettingHealthCheck langs.MessageCode = "admin_common_menu_setting_health_check" // 健康检查 + AdminCommonMenuSettingMetrics langs.MessageCode = "admin_common_menu_setting_metrics" // 统计指标 + AdminCommonMenuSettingWAFPolicy langs.MessageCode = "admin_common_menu_setting_waf_policy" // WAF策略 + AdminCommonMenuSettingWebP langs.MessageCode = "admin_common_menu_setting_webp" // WebP + AdminCommonSystem langs.MessageCode = "admin_common_system" // 系统 + AdminDashboardDNS langs.MessageCode = "admin_dashboard_dns" // DNS + AdminDashboardEvents langs.MessageCode = "admin_dashboard_events" // 事件 + AdminDashboardOverview langs.MessageCode = "admin_dashboard_overview" // 概况 + AdminDashboardUser langs.MessageCode = "admin_dashboard_user" // 用户 + AdminDashboardWAF langs.MessageCode = "admin_dashboard_waf" // WAF + AdminDBNodeTabNodes langs.MessageCode = "admin_db_node_tab_nodes" // 数据库节点 + AdminMenuAdminRecipients langs.MessageCode = "admin_menu_admin_recipients" // 通知媒介 + AdminMenuAdmins langs.MessageCode = "admin_menu_admins" // 系统用户 + AdminMenuDashboard langs.MessageCode = "admin_menu_dashboard" // 数据看板 + AdminMenuDNS langs.MessageCode = "admin_menu_dns" // 域名解析 + AdminMenuDNSClusters langs.MessageCode = "admin_menu_dns_clusters" // 集群列表 + AdminMenuDNSIssues langs.MessageCode = "admin_menu_dns_issues" // 问题修复 + AdminMenuDNSProviders langs.MessageCode = "admin_menu_dns_providers" // DNS服务商 + AdminMenuFinance langs.MessageCode = "admin_menu_finance" // 财务管理 + AdminMenuFinanceAccounts langs.MessageCode = "admin_menu_finance_accounts" // 用户账户 + AdminMenuFinanceBills langs.MessageCode = "admin_menu_finance_bills" // 费用账单 + AdminMenuFinanceFee langs.MessageCode = "admin_menu_finance_fee" // 计费设置 + AdminMenuFinanceIncome langs.MessageCode = "admin_menu_finance_income" // 统计报表 + AdminMenuFinanceLogs langs.MessageCode = "admin_menu_finance_logs" // 收支明细 + AdminMenuFinanceOrders langs.MessageCode = "admin_menu_finance_orders" // 订单管理 + AdminMenuFinancePackages langs.MessageCode = "admin_menu_finance_packages" // 流量包 + AdminMenuLogs langs.MessageCode = "admin_menu_logs" // 日志审计 + AdminMenuNodeAntiDDoSProducts langs.MessageCode = "admin_menu_node_anti_ddos_products" // 高防IP + AdminMenuNodeClusters langs.MessageCode = "admin_menu_node_clusters" // 集群列表 + AdminMenuNodeDistributedMonitors langs.MessageCode = "admin_menu_node_distributed_monitors" // 区域监控 + AdminMenuNodeIPList langs.MessageCode = "admin_menu_node_ip_list" // 节点IP + AdminMenuNodeLogs langs.MessageCode = "admin_menu_node_logs" // 节点日志 + AdminMenuNodeRegions langs.MessageCode = "admin_menu_node_regions" // 区域设置 + AdminMenuNodeSSHGrants langs.MessageCode = "admin_menu_node_ssh_grants" // 节点SSH + AdminMenuNodes langs.MessageCode = "admin_menu_nodes" // 边缘节点 + AdminMenuNS langs.MessageCode = "admin_menu_ns" // 智能DNS + AdminMenuNSAccessLogs langs.MessageCode = "admin_menu_ns_access_logs" // 访问日志 + AdminMenuNSClusters langs.MessageCode = "admin_menu_ns_clusters" // 集群管理 + AdminMenuNSDomainBatchOperations langs.MessageCode = "admin_menu_ns_domain_batch_operations" // 批量操作 + AdminMenuNSDomainGroups langs.MessageCode = "admin_menu_ns_domain_groups" // 域名分组 + AdminMenuNSDomains langs.MessageCode = "admin_menu_ns_domains" // 域名管理 + AdminMenuNSNodeLogs langs.MessageCode = "admin_menu_ns_node_logs" // 运行日志 + AdminMenuNSPlans langs.MessageCode = "admin_menu_ns_plans" // 套餐设置 + AdminMenuNSResolveTest langs.MessageCode = "admin_menu_ns_resolve_test" // 解析测试 + AdminMenuNSRoutes langs.MessageCode = "admin_menu_ns_routes" // 线路管理 + AdminMenuNSSettings langs.MessageCode = "admin_menu_ns_settings" // 全局配置 + AdminMenuNSUserPlans langs.MessageCode = "admin_menu_ns_user_plans" // 用户套餐 + AdminMenuPlanUserPlans langs.MessageCode = "admin_menu_plan_user_plans" // 已购套餐 + AdminMenuPlans langs.MessageCode = "admin_menu_plans" // 套餐管理 + AdminMenuServerAccessLogPolicies langs.MessageCode = "admin_menu_server_access_log_policies" // 日志策略 + AdminMenuServerAccessLogs langs.MessageCode = "admin_menu_server_access_logs" // 访问日志 + AdminMenuServerCachePolicies langs.MessageCode = "admin_menu_server_cache_policies" // 缓存策略 + AdminMenuServerCerts langs.MessageCode = "admin_menu_server_certs" // 证书管理 + AdminMenuServerGlobalSettings langs.MessageCode = "admin_menu_server_global_settings" // 通用设置 + AdminMenuServerGroups langs.MessageCode = "admin_menu_server_groups" // 网站分组 + AdminMenuServerIPLists langs.MessageCode = "admin_menu_server_ip_lists" // IP名单 + AdminMenuServerMetrics langs.MessageCode = "admin_menu_server_metrics" // 统计指标 + AdminMenuServerPurgeFetchCaches langs.MessageCode = "admin_menu_server_purge_fetch_caches" // 刷新预热 + AdminMenuServerScripts langs.MessageCode = "admin_menu_server_scripts" // 脚本库 + AdminMenuServerTrafficStats langs.MessageCode = "admin_menu_server_traffic_stats" // 用量统计 + AdminMenuServerWAFPolicies langs.MessageCode = "admin_menu_server_waf_policies" // WAF策略 + AdminMenuServers langs.MessageCode = "admin_menu_servers" // 网站列表 + AdminMenuSettingAdvancedSettings langs.MessageCode = "admin_menu_setting_advanced_settings" // 高级设置 + AdminMenuSettingAuthority langs.MessageCode = "admin_menu_setting_authority" // 商业版本 + AdminMenuSettingBasicSettings langs.MessageCode = "admin_menu_setting_basic_settings" // 基础设置 + AdminMenuSettings langs.MessageCode = "admin_menu_settings" // 系统设置 + AdminMenuTicketCategory langs.MessageCode = "admin_menu_ticket_category" // 分类 + AdminMenuTickets langs.MessageCode = "admin_menu_tickets" // 工单系统 + AdminMenuUsers langs.MessageCode = "admin_menu_users" // 用户设置 + AdminNodeMenuCreateMultipleNodes langs.MessageCode = "admin_node_menu_create_multiple_nodes" // 批量创建 + AdminNodeMenuCreateSingleNode langs.MessageCode = "admin_node_menu_create_single_node" // 单个创建 + AdminNodeMenuInstallAutoRegister langs.MessageCode = "admin_node_menu_install_auto_register" // 自动注册 + AdminNodeMenuInstallManually langs.MessageCode = "admin_node_menu_install_manually" // 手动安装 + AdminNodeMenuInstallRemote langs.MessageCode = "admin_node_menu_install_remote" // 远程安装(%d) + AdminNodeMenuInstallRemoteUpgrade langs.MessageCode = "admin_node_menu_install_remote_upgrade" // 远程升级(%d) + AdminNodeMenuSettingBasic langs.MessageCode = "admin_node_menu_setting_basic" // 基础设置 + AdminNodeMenuSettingCache langs.MessageCode = "admin_node_menu_setting_cache" // 缓存设置 + AdminNodeMenuSettingDDoSProtection langs.MessageCode = "admin_node_menu_setting_ddos_protection" // DDoS防护 + AdminNodeMenuSettingDNS langs.MessageCode = "admin_node_menu_setting_dns" // DNS设置 + AdminNodeMenuSettingSchedule langs.MessageCode = "admin_node_menu_setting_schedule" // 智能调度 + AdminNodeMenuSettingSSH langs.MessageCode = "admin_node_menu_setting_ssh" // SSH设置 + AdminNodeMenuSettingSystem langs.MessageCode = "admin_node_menu_setting_system" // 系统设置 + AdminNodeMenuSettingThresholds langs.MessageCode = "admin_node_menu_setting_thresholds" // 阈值设置 + AdminNodeUngroupedLabel langs.MessageCode = "admin_node_ungrouped_label" // 未分组 + AdminNSClusterTabDelete langs.MessageCode = "admin_ns_cluster_tab_delete" // 删除集群 + AdminNSClusterTabNodes langs.MessageCode = "admin_ns_cluster_tab_nodes" // 节点列表 + AdminNSClusterTabSetting langs.MessageCode = "admin_ns_cluster_tab_setting" // 集群设置 + AdminServerMenuAccesslogHistory langs.MessageCode = "admin_server_menu_accesslog_history" // 历史 + AdminServerMenuAccesslogRealtime langs.MessageCode = "admin_server_menu_accesslog_realtime" // 实时 + AdminServerMenuAccesslogToday langs.MessageCode = "admin_server_menu_accesslog_today" // 今天 + AdminServerMenuDashboard langs.MessageCode = "admin_server_menu_dashboard" // 看板 + AdminServerMenuSettingAccessLog langs.MessageCode = "admin_server_menu_setting_access_log" // 访问日志 + AdminServerMenuSettingAuth langs.MessageCode = "admin_server_menu_setting_auth" // 访问鉴权 + AdminServerMenuSettingBasic langs.MessageCode = "admin_server_menu_setting_basic" // 基本信息 + AdminServerMenuSettingCache langs.MessageCode = "admin_server_menu_setting_cache" // 缓存 + AdminServerMenuSettingCC langs.MessageCode = "admin_server_menu_setting_cc" // CC防护 + AdminServerMenuSettingCharset langs.MessageCode = "admin_server_menu_setting_charset" // 字符编码 + AdminServerMenuSettingClientIP langs.MessageCode = "admin_server_menu_setting_client_ip" // 访客IP地址 + AdminServerMenuSettingCompress langs.MessageCode = "admin_server_menu_setting_compress" // 内容压缩 + AdminServerMenuSettingDelete langs.MessageCode = "admin_server_menu_setting_delete" // 删除 + AdminServerMenuSettingDNS langs.MessageCode = "admin_server_menu_setting_dns" // DNS + AdminServerMenuSettingDomains langs.MessageCode = "admin_server_menu_setting_domains" // 域名 + AdminServerMenuSettingFastcgi langs.MessageCode = "admin_server_menu_setting_fastcgi" // Fastcgi + AdminServerMenuSettingHTTP langs.MessageCode = "admin_server_menu_setting_http" // HTTP + AdminServerMenuSettingHTTPHeaders langs.MessageCode = "admin_server_menu_setting_http_headers" // HTTP Header + AdminServerMenuSettingHTTPS langs.MessageCode = "admin_server_menu_setting_https" // HTTPS + AdminServerMenuSettingLocations langs.MessageCode = "admin_server_menu_setting_locations" // 路由规则 + AdminServerMenuSettingOrigins langs.MessageCode = "admin_server_menu_setting_origins" // 源站 + AdminServerMenuSettingOthers langs.MessageCode = "admin_server_menu_setting_others" // 其他设置 + AdminServerMenuSettingPages langs.MessageCode = "admin_server_menu_setting_pages" // 自定义页面 + AdminServerMenuSettingRedirects langs.MessageCode = "admin_server_menu_setting_redirects" // URL跳转 + AdminServerMenuSettingReferers langs.MessageCode = "admin_server_menu_setting_referers" // 防盗链 + AdminServerMenuSettingRequestLimit langs.MessageCode = "admin_server_menu_setting_request_limit" // 请求限制 + AdminServerMenuSettingRewriteRules langs.MessageCode = "admin_server_menu_setting_rewrite_rules" // 重写规则 + AdminServerMenuSettingRoot langs.MessageCode = "admin_server_menu_setting_root" // 静态分发 + AdminServerMenuSettingScripts langs.MessageCode = "admin_server_menu_setting_scripts" // 边缘脚本 + AdminServerMenuSettingStat langs.MessageCode = "admin_server_menu_setting_stat" // 统计 + AdminServerMenuSettingTCP langs.MessageCode = "admin_server_menu_setting_tcp" // TCP + AdminServerMenuSettingTLS langs.MessageCode = "admin_server_menu_setting_tls" // TLS + AdminServerMenuSettingTrafficLimit langs.MessageCode = "admin_server_menu_setting_traffic_limit" // 流量限制 + AdminServerMenuSettingUAM langs.MessageCode = "admin_server_menu_setting_uam" // 5秒盾 + AdminServerMenuSettingUDP langs.MessageCode = "admin_server_menu_setting_udp" // UDP + AdminServerMenuSettingUnix langs.MessageCode = "admin_server_menu_setting_unix" // Unix + AdminServerMenuSettingUserAgents langs.MessageCode = "admin_server_menu_setting_user_agents" // UA名单 + AdminServerMenuSettingWAF langs.MessageCode = "admin_server_menu_setting_waf" // WAF + AdminServerMenuSettingWebP langs.MessageCode = "admin_server_menu_setting_webp" // WebP + AdminServerMenuSettingWebsocket langs.MessageCode = "admin_server_menu_setting_websocket" // Websocket + AdminServerMenuStatClients langs.MessageCode = "admin_server_menu_stat_clients" // 终端 + AdminServerMenuStatProviders langs.MessageCode = "admin_server_menu_stat_providers" // 运营商 + AdminServerMenuStatRegions langs.MessageCode = "admin_server_menu_stat_regions" // 地域分布 + AdminServerMenuStatTraffic langs.MessageCode = "admin_server_menu_stat_traffic" // 流量统计 + AdminServerMenuStatWAF langs.MessageCode = "admin_server_menu_stat_waf" // WAF + AdminServerTabAccessLogs langs.MessageCode = "admin_server_tab_access_logs" // 日志 + AdminServerTabDashboard langs.MessageCode = "admin_server_tab_dashboard" // 看板 + AdminServerTabDelete langs.MessageCode = "admin_server_tab_delete" // 删除 + AdminServerTabSettings langs.MessageCode = "admin_server_tab_settings" // 设置 + AdminServerTabStat langs.MessageCode = "admin_server_tab_stat" // 统计 + AdminSettingsTabAccessLogDatabases langs.MessageCode = "admin_settings_tab_access_log_databases" // 日志数据库 + AdminSettingsTabAdminSecuritySettings langs.MessageCode = "admin_settings_tab_admin_security_settings" // 安全设置 + AdminSettingsTabAdminServer langs.MessageCode = "admin_settings_tab_admin_server" // Web服务 + AdminSettingsTabAdminUI langs.MessageCode = "admin_settings_tab_admin_ui" // 管理界面设置 + AdminSettingsTabAPINodes langs.MessageCode = "admin_settings_tab_api_nodes" // API节点 + AdminSettingsTabAuthority langs.MessageCode = "admin_settings_tab_authority" // 商业版认证 + AdminSettingsTabBackup langs.MessageCode = "admin_settings_tab_backup" // 备份 + AdminSettingsTabClientBrowsers langs.MessageCode = "admin_settings_tab_client_browsers" // 浏览器库 + AdminSettingsTabClientOperationSystems langs.MessageCode = "admin_settings_tab_client_operation_systems" // 操作系统库 + AdminSettingsTabDatabase langs.MessageCode = "admin_settings_tab_database" // 数据库 + AdminSettingsTabIPLibrary langs.MessageCode = "admin_settings_tab_ip_library" // IP库 + AdminSettingsTabLogin langs.MessageCode = "admin_settings_tab_login" // 登录设置 + AdminSettingsTabMonitorNodes langs.MessageCode = "admin_settings_tab_monitor_nodes" // 监控节点 + AdminSettingsTabProfile langs.MessageCode = "admin_settings_tab_profile" // 个人资料 + AdminSettingsTabTransfer langs.MessageCode = "admin_settings_tab_transfer" // 迁移 + AdminSettingsTabUpdates langs.MessageCode = "admin_settings_tab_updates" // 检查更新 + AdminSettingsTabUserNodes langs.MessageCode = "admin_settings_tab_user_nodes" // 用户节点 + AdminSettingsTabUserUI langs.MessageCode = "admin_settings_tab_user_ui" // 用户界面设置 ) diff --git a/pkg/langs/lang.go b/pkg/langs/lang.go index c5ef4bb..b73fc5c 100644 --- a/pkg/langs/lang.go +++ b/pkg/langs/lang.go @@ -2,6 +2,16 @@ package langs +import ( + "errors" + "github.com/TeaOSLab/EdgeCommon/pkg/configutils" + "strings" +) + +const varPrefix = "lang." + +type LangCode = string + type Lang struct { code string @@ -30,3 +40,39 @@ func (this *Lang) Get(messageCode string) string { func (this *Lang) GetAll() map[string]string { return this.messageMap } + +// Compile variable to literal strings +func (this *Lang) Compile() error { + for code, oldMessage := range this.messageMap { + message, err := this.get(code, 0) + if err != nil { + return errors.New("compile '" + code + "': '" + oldMessage + "' failed: " + err.Error()) + } + this.messageMap[code] = message + } + return nil +} + +func (this *Lang) get(messageCode string, loopIndex int) (string, error) { + if loopIndex >= 8 /** max recurse **/ { + return "", errors.New("too many recurse") + } + loopIndex++ + + message, ok := this.messageMap[messageCode] + if len(message) == 0 { + if !ok && loopIndex > 1 { + // recover as variable + return "${" + varPrefix + messageCode + "}", errors.New("can not find message for code '" + messageCode + "'") + } + return "", nil + } + + return configutils.ParseVariablesError(message, func(varName string) (value string, err error) { + if !strings.HasPrefix(varName, varPrefix) { + return "${" + varName + "}", nil + } + + return this.get(varName[len(varPrefix):], loopIndex) + }) +} diff --git a/pkg/langs/messages/messages_zh_cn.go b/pkg/langs/messages/messages_zh_cn.go index 2a8cbc9..940ffe1 100644 --- a/pkg/langs/messages/messages_zh_cn.go +++ b/pkg/langs/messages/messages_zh_cn.go @@ -8,68 +8,188 @@ import ( func init() { langs.Load("zh-cn", map[string]string{ - "admin_menu_finance_fee": "计费设置", - "admin_menu_server_traffic_stats": "用量统计", - "admin_menu_ns_node_logs": "运行日志", - "admin_menu_servers": "网站列表", - "admin_menu_finance_logs": "收支明细", - "admin_menu_plan_user_plans": "已购套餐", - "admin_menu_server_ip_lists": "IP名单", - "admin_menu_users": "用户设置", - "admin_menu_ns_access_logs": "访问日志", - "admin_menu_server_purge_fetch_caches": "刷新预热", - "admin_menu_node_distributed_monitors": "区域监控", - "admin_menu_finance_packages": "流量包", - "admin_menu_settings": "系统设置", - "admin_menu_ns_plans": "套餐设置", - "admin_dashboard_user": "用户", - "admin_dashboard_waf": "WAF", - "admin_menu_setting_advanced_settings": "高级设置", - "admin_menu_server_global_settings": "通用设置", - "admin_menu_node_logs": "节点日志", - "admin_menu_ns_clusters": "集群管理", - "admin_menu_server_cache_policies": "缓存策略", - "admin_menu_ns_resolve_test": "解析测试", - "admin_menu_finance_income": "统计报表", - "admin_menu_finance_accounts": "用户账户", - "admin_menu_server_certs": "证书管理", - "admin_menu_dashboard": "数据看板", - "admin_dashboard_events": "事件", - "admin_menu_node_ip_list": "节点IP", - "admin_dashboard_overview": "概况", - "admin_menu_server_access_logs": "访问日志", - "admin_menu_dns_providers": "DNS服务商", - "admin_menu_admins": "系统用户", - "admin_menu_setting_authority": "商业版本", - "admin_menu_dns_issues": "问题修复", - "admin_menu_server_metrics": "统计指标", - "admin_menu_node_ssh_grants": "节点SSH", - "admin_menu_server_waf_policies": "WAF策略", - "admin_menu_ns_domains": "域名管理", - "admin_menu_nodes": "边缘节点", - "admin_dashboard_dns": "DNS", - "admin_menu_logs": "日志审计", - "admin_menu_ns_user_plans": "用户套餐", - "admin_menu_ns_domain_groups": "域名分组", - "admin_menu_tickets": "工单系统", - "admin_menu_node_regions": "区域设置", - "admin_menu_ns_domain_batch_operations": "批量操作", - "admin_menu_plans": "套餐管理", - "admin_menu_finance_bills": "费用账单", - "admin_menu_ticket_category": "分类", - "admin_menu_finance": "财务管理", - "admin_menu_node_anti_ddos_products": "高防IP", - "admin_menu_ns": "智能DNS", - "admin_menu_dns": "域名解析", - "admin_menu_server_groups": "网站分组", - "admin_menu_server_scripts": "脚本库", - "admin_menu_ns_settings": "全局配置", - "admin_menu_ns_routes": "线路管理", - "admin_menu_server_access_log_policies": "日志策略", - "admin_menu_finance_orders": "订单管理", - "admin_menu_dns_clusters": "集群列表", - "admin_menu_admin_recipients": "通知媒介", - "admin_menu_setting_basic_settings": "基础设置", - "admin_menu_node_clusters": "集群列表", + "admin_server_menu_setting_webp": "WebP", + "admin_cluster_menu_setting_uam": "5秒盾", + "admin_common_menu_setting_webp": "WebP", + "admin_dashboard_events": "事件", + "admin_server_menu_setting_unix": "Unix", + "admin_server_menu_setting_root": "静态分发", + "admin_server_menu_accesslog_realtime": "实时", + "admin_server_menu_accesslog_history": "历史", + "admin_settings_tab_access_log_databases": "日志数据库", + "admin_menu_server_traffic_stats": "用量统计", + "admin_menu_ticket_category": "分类", + "admin_menu_server_ip_lists": "IP名单", + "admin_menu_plans": "套餐管理", + "admin_node_menu_install_remote_upgrade": "远程升级(%d)", + "admin_server_menu_setting_auth": "访问鉴权", + "admin_server_menu_setting_websocket": "Websocket", + "admin_common_menu_setting_metrics": "统计指标", + "admin_common_menu_setting_waf_policy": "WAF策略", + "admin_menu_server_global_settings": "通用设置", + "admin_menu_node_clusters": "集群列表", + "admin_node_menu_install_manually": "手动安装", + "admin_server_tab_settings": "设置", + "admin_server_menu_setting_http_headers": "HTTP Header", + "admin_cluster_menu_setting_service_global": "网站设置", + "admin_cluster_menu_setting_thresholds": "阈值设置", + "admin_node_menu_create_multiple_nodes": "批量创建", + "admin_server_menu_setting_https": "HTTPS", + "admin_server_menu_setting_others": "其他设置", + "admin_server_tab_delete": "删除", + "admin_server_menu_setting_pages": "自定义页面", + "admin_settings_tab_client_operation_systems": "操作系统库", + "admin_cluster_menu_tab_cluster_settings": "集群设置", + "admin_cluster_menu_tab_cluster_nodes": "节点列表", + "admin_node_menu_setting_thresholds": "阈值设置", + "admin_server_menu_stat_traffic": "流量统计", + "admin_server_menu_setting_user_agents": "UA名单", + "admin_server_menu_setting_basic": "基本信息", + "admin_settings_tab_updates": "检查更新", + "admin_menu_node_anti_ddos_products": "高防IP", + "admin_menu_setting_advanced_settings": "高级设置", + "admin_menu_node_distributed_monitors": "区域监控", + "admin_menu_ns_node_logs": "运行日志", + "admin_menu_setting_authority": "商业版本", + "admin_server_menu_setting_cc": "CC防护", + "admin_server_menu_stat_clients": "终端", + "admin_server_menu_accesslog_today": "今天", + "admin_cluster_menu_setting_waf_policy": "WAF策略", + "admin_menu_dashboard": "数据看板", + "admin_menu_node_ssh_grants": "节点SSH", + "admin_menu_servers": "网站列表", + "admin_menu_ns_user_plans": "用户套餐", + "admin_node_menu_setting_ssh": "SSH设置", + "admin_server_menu_dashboard": "看板", + "admin_server_menu_setting_dns": "DNS", + "admin_settings_tab_authority": "商业版认证", + "admin_settings_tab_user_nodes": "用户节点", + "admin_cluster_menu_setting_health_check": "健康检查", + "admin_menu_ns_resolve_test": "解析测试", + "admin_menu_finance_orders": "订单管理", + "admin_ns_cluster_tab_setting": "集群设置", + "admin_server_menu_setting_referers": "防盗链", + "admin_server_menu_setting_tls": "TLS", + "admin_settings_tab_admin_server": "Web服务", + "admin_settings_tab_ip_library": "IP库", + "admin_cluster_menu_setting_schedule": "智能调度", + "admin_menu_ns_routes": "线路管理", + "admin_menu_finance_income": "统计报表", + "admin_menu_finance": "财务管理", + "admin_ns_cluster_tab_nodes": "节点列表", + "admin_server_menu_setting_charset": "字符编码", + "admin_server_menu_setting_access_log": "访问日志", + "admin_cluster_menu_setting_dns": "DNS设置", + "admin_dashboard_waf": "WAF", + "admin_menu_dns_issues": "问题修复", + "admin_menu_node_logs": "节点日志", + "admin_server_menu_stat_waf": "WAF", + "admin_server_menu_setting_domains": "域名", + "admin_settings_tab_api_nodes": "API节点", + "admin_cluster_menu_setting_webp": "WebP", + "admin_common_menu_setting_cache": "缓存设置", + "admin_common_system": "系统", + "admin_dashboard_dns": "DNS", + "admin_node_menu_install_remote": "远程安装(%d)", + "admin_menu_ns_plans": "套餐设置", + "admin_menu_server_access_logs": "访问日志", + "admin_server_menu_setting_uam": "5秒盾", + "admin_cluster_menu_setting_basic": "基础设置", + "admin_node_menu_setting_schedule": "智能调度", + "admin_settings_tab_client_browsers": "浏览器库", + "admin_menu_ns_domains": "域名管理", + "admin_menu_server_metrics": "统计指标", + "admin_server_menu_setting_rewrite_rules": "重写规则", + "admin_server_menu_setting_waf": "WAF", + "admin_settings_tab_login": "登录设置", + "admin_cluster_menu_setting_notification": "消息通知", + "admin_db_node_tab_nodes": "数据库节点", + "admin_menu_finance_bills": "费用账单", + "admin_menu_ns_domain_batch_operations": "批量操作", + "admin_menu_finance_accounts": "用户账户", + "admin_server_menu_setting_tcp": "TCP", + "admin_settings_tab_profile": "个人资料", + "admin_settings_tab_backup": "备份", + "admin_cluster_menu_setting_pages": "自定义页面", + "admin_menu_admins": "系统用户", + "admin_menu_ns_settings": "全局配置", + "admin_menu_node_ip_list": "节点IP", + "admin_menu_ns_access_logs": "访问日志", + "admin_node_menu_create_single_node": "单个创建", + "admin_server_menu_setting_cache": "缓存", + "admin_menu_dns_clusters": "集群列表", + "admin_server_menu_setting_redirects": "URL跳转", + "admin_menu_tickets": "工单系统", + "admin_menu_server_certs": "证书管理", + "admin_node_menu_setting_system": "系统设置", + "admin_server_menu_setting_stat": "统计", + "admin_server_menu_setting_scripts": "边缘脚本", + "admin_common_menu_setting_cache_policy": "缓存策略", + "admin_menu_users": "用户设置", + "admin_server_tab_stat": "统计", + "admin_server_menu_setting_http": "HTTP", + "admin_server_menu_setting_client_ip": "访客IP地址", + "admin_settings_tab_database": "数据库", + "admin_settings_tab_user_ui": "用户界面设置", + "admin_menu_server_scripts": "脚本库", + "admin_menu_ns": "智能DNS", + "admin_server_menu_stat_providers": "运营商", + "admin_menu_ns_domain_groups": "域名分组", + "admin_menu_finance_packages": "流量包", + "admin_node_menu_setting_basic": "基础设置", + "admin_ns_cluster_tab_delete": "删除集群", + "admin_server_menu_setting_delete": "删除", + "admin_server_menu_setting_compress": "内容压缩", + "admin_cluster_menu_setting_ddos_protection": "DDoS防护", + "admin_server_menu_setting_request_limit": "请求限制", + "admin_server_tab_access_logs": "日志", + "admin_settings_tab_transfer": "迁移", + "admin_cluster_menu_setting_metrics": "统计指标", + "admin_menu_setting_basic_settings": "基础设置", + "admin_server_menu_setting_udp": "UDP", + "admin_settings_tab_admin_ui": "管理界面设置", + "admin_cluster_menu_setting_toa": "TOA设置", + "admin_common_menu_setting_ddos_protection": "DDoS防护", + "admin_menu_dns_providers": "DNS服务商", + "admin_menu_server_access_log_policies": "日志策略", + "admin_node_ungrouped_label": "未分组", + "admin_server_menu_stat_regions": "地域分布", + "admin_settings_tab_monitor_nodes": "监控节点", + "admin_cluster_menu_tab_cluster_dashboard": "集群看板", + "admin_menu_server_cache_policies": "缓存策略", + "admin_menu_settings": "系统设置", + "admin_menu_logs": "日志审计", + "admin_menu_nodes": "边缘节点", + "admin_common_menu_setting_dns": "DNS设置", + "admin_menu_plan_user_plans": "已购套餐", + "admin_node_menu_setting_dns": "DNS设置", + "admin_cluster_menu_tab_cluster_delete": "删除集群", + "admin_cluster_menu_setting_cache_policy": "缓存策略", + "admin_menu_finance_fee": "计费设置", + "admin_node_menu_setting_cache": "缓存设置", + "admin_server_menu_setting_locations": "路由规则", + "admin_cluster_menu_setting_http3": "HTTP/3", + "admin_menu_node_regions": "区域设置", + "admin_menu_ns_clusters": "集群管理", + "admin_menu_dns": "域名解析", + "admin_node_menu_install_auto_register": "自动注册", + "admin_server_menu_setting_origins": "源站", + "admin_cluster_menu_setting_system_service": "系统服务", + "admin_dashboard_overview": "概况", + "admin_server_tab_dashboard": "看板", + "admin_common_menu_setting_health_check": "健康检查", + "admin_common_menu_setting_basic": "基础设置", + "admin_dashboard_user": "用户", + "admin_menu_server_purge_fetch_caches": "刷新预热", + "admin_menu_server_groups": "网站分组", + "admin_server_menu_setting_traffic_limit": "流量限制", + "admin_settings_tab_admin_security_settings": "安全设置", + "admin_cluster_menu_setting_waf_actions": "WAF动作", + "admin_cluster_menu_setting_cc": "CC防护", + "admin_menu_finance_logs": "收支明细", + "admin_menu_server_waf_policies": "WAF策略", + "admin_menu_admin_recipients": "通知媒介", + "admin_node_menu_setting_ddos_protection": "DDoS防护", + "admin_server_menu_setting_fastcgi": "Fastcgi", }) } diff --git a/pkg/langs/protos/zh-cn/README.md b/pkg/langs/protos/zh-cn/README.md new file mode 100644 index 0000000..958c61e --- /dev/null +++ b/pkg/langs/protos/zh-cn/README.md @@ -0,0 +1 @@ +After change the messages, remember to run 'langs generate' to generate Go codes. \ No newline at end of file diff --git a/pkg/langs/protos/zh-cn/admin_cluster.json b/pkg/langs/protos/zh-cn/admin_cluster.json deleted file mode 100644 index 0e0dcd2..0000000 --- a/pkg/langs/protos/zh-cn/admin_cluster.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - -} \ No newline at end of file diff --git a/pkg/langs/protos/zh-cn/admin_cluster_menu.json b/pkg/langs/protos/zh-cn/admin_cluster_menu.json new file mode 100644 index 0000000..12cc556 --- /dev/null +++ b/pkg/langs/protos/zh-cn/admin_cluster_menu.json @@ -0,0 +1,26 @@ +{ + "setting_basic": "${lang.admin_common_menu_setting_basic}", + "setting_dns": "${lang.admin_common_menu_setting_dns}", + "setting_health_check": "${lang.admin_common_menu_setting_health_check}", + "setting_service_global": "网站设置", + "setting_cache_policy": "${lang.admin_common_menu_setting_cache_policy}", + "setting_waf_policy": "${lang.admin_common_menu_setting_waf_policy}", + "setting_waf_actions": "WAF动作", + "setting_webp": "${lang.admin_common_menu_setting_webp}", + "setting_metrics": "${lang.admin_common_menu_setting_metrics}", + "setting_ddos_protection": "${lang.admin_common_menu_setting_ddos_protection}", + "setting_uam": "5秒盾", + "setting_cc": "CC防护", + "setting_pages": "自定义页面", + "setting_http3": "HTTP/3", + "setting_schedule": "智能调度", + "setting_thresholds": "阈值设置", + "setting_notification": "消息通知", + "setting_system_service": "系统服务", + "setting_toa": "TOA设置", + + "tab_cluster_dashboard": "集群看板", + "tab_cluster_nodes": "节点列表", + "tab_cluster_settings": "集群设置", + "tab_cluster_delete": "删除集群" +} \ No newline at end of file diff --git a/pkg/langs/protos/zh-cn/admin_common.json b/pkg/langs/protos/zh-cn/admin_common.json index 0e0dcd2..11ecaf8 100644 --- a/pkg/langs/protos/zh-cn/admin_common.json +++ b/pkg/langs/protos/zh-cn/admin_common.json @@ -1,3 +1,12 @@ { - + "menu_setting_basic": "基础设置", + "menu_setting_dns": "DNS设置", + "menu_setting_health_check": "健康检查", + "menu_setting_cache_policy": "缓存策略", + "menu_setting_waf_policy": "WAF策略", + "menu_setting_webp": "WebP", + "menu_setting_metrics": "统计指标", + "menu_setting_ddos_protection": "DDoS防护", + "menu_setting_cache": "缓存设置", + "system": "系统" } \ No newline at end of file diff --git a/pkg/langs/protos/zh-cn/admin_db_node.json b/pkg/langs/protos/zh-cn/admin_db_node.json new file mode 100644 index 0000000..9b5527c --- /dev/null +++ b/pkg/langs/protos/zh-cn/admin_db_node.json @@ -0,0 +1,3 @@ +{ + "tab_nodes": "数据库节点" +} \ No newline at end of file diff --git a/pkg/langs/protos/zh-cn/admin_node.json b/pkg/langs/protos/zh-cn/admin_node.json index 0e0dcd2..833db3c 100644 --- a/pkg/langs/protos/zh-cn/admin_node.json +++ b/pkg/langs/protos/zh-cn/admin_node.json @@ -1,3 +1,3 @@ { - + "ungrouped_label": "未分组" } \ No newline at end of file diff --git a/pkg/langs/protos/zh-cn/admin_node_menu.json b/pkg/langs/protos/zh-cn/admin_node_menu.json new file mode 100644 index 0000000..3d41693 --- /dev/null +++ b/pkg/langs/protos/zh-cn/admin_node_menu.json @@ -0,0 +1,18 @@ +{ + "create_single_node": "单个创建", + "create_multiple_nodes": "批量创建", + "install_manually": "手动安装", + "install_auto_register": "自动注册", + "install_remote": "远程安装(%d)", // 参数:节点数量 + "install_remote_upgrade": "远程升级(%d)", // 参数:节点数量, + + "setting_basic": "${lang.admin_common_menu_setting_basic}", + "setting_dns": "${lang.admin_common_menu_setting_dns}", + "setting_cache": "${lang.admin_common_menu_setting_cache}", + "setting_ddos_protection": "${lang.admin_common_menu_setting_ddos_protection}", + "setting_ssh": "SSH设置", + "setting_system": "系统设置", + + "setting_schedule": "智能调度", + "setting_thresholds": "阈值设置" +} \ No newline at end of file diff --git a/pkg/langs/protos/zh-cn/admin_ns_cluster.json b/pkg/langs/protos/zh-cn/admin_ns_cluster.json new file mode 100644 index 0000000..e3cfe8a --- /dev/null +++ b/pkg/langs/protos/zh-cn/admin_ns_cluster.json @@ -0,0 +1,5 @@ +{ + "tab_nodes": "节点列表", + "tab_setting": "集群设置", + "tab_delete": "删除集群" +} \ No newline at end of file diff --git a/pkg/langs/protos/zh-cn/admin_server.json b/pkg/langs/protos/zh-cn/admin_server.json index 0e0dcd2..b9f7e39 100644 --- a/pkg/langs/protos/zh-cn/admin_server.json +++ b/pkg/langs/protos/zh-cn/admin_server.json @@ -1,3 +1,57 @@ { + "tab_dashboard": "看板", + "tab_stat": "统计", + "tab_access_logs": "日志", + "tab_settings": "设置", + "tab_delete": "删除", + "menu_dashboard": "看板", + + "menu_accesslog_realtime": "实时", + "menu_accesslog_today": "今天", + "menu_accesslog_history": "历史", + + "menu_stat_traffic": "流量统计", + "menu_stat_regions": "地域分布", + "menu_stat_providers": "运营商", + "menu_stat_clients": "终端", + "menu_stat_waf": "WAF", + + "menu_setting_basic": "基本信息", + "menu_setting_dns": "DNS", + "menu_setting_domains": "域名", + "menu_setting_http": "HTTP", + "menu_setting_https": "HTTPS", + "menu_setting_origins": "源站", + "menu_setting_redirects": "URL跳转", + "menu_setting_locations": "路由规则", + "menu_setting_rewrite_rules": "重写规则", + "menu_setting_waf": "WAF", + "menu_setting_cache": "缓存", + "menu_setting_auth": "访问鉴权", + "menu_setting_referers": "防盗链", + "menu_setting_user_agents": "UA名单", + "menu_setting_charset": "字符编码", + "menu_setting_access_log": "访问日志", + "menu_setting_stat": "统计", + "menu_setting_compress": "内容压缩", + "menu_setting_pages": "自定义页面", + "menu_setting_http_headers": "HTTP Header", // TODO 中文应该改成"HTTP报头"? + "menu_setting_websocket": "Websocket", + "menu_setting_webp": "WebP", + "menu_setting_root": "静态分发", + "menu_setting_fastcgi": "Fastcgi", + "menu_setting_client_ip": "访客IP地址", + "menu_setting_request_limit": "请求限制", + "menu_setting_others": "其他设置", + "menu_setting_tcp": "TCP", + "menu_setting_tls": "TLS", + "menu_setting_unix": "Unix", + "menu_setting_udp": "UDP", + "menu_setting_delete": "删除", + + "menu_setting_uam": "5秒盾", + "menu_setting_cc": "CC防护", + "menu_setting_traffic_limit": "流量限制", + "menu_setting_scripts": "边缘脚本" } \ No newline at end of file diff --git a/pkg/langs/protos/zh-cn/admin_setings.json b/pkg/langs/protos/zh-cn/admin_setings.json deleted file mode 100644 index 0e0dcd2..0000000 --- a/pkg/langs/protos/zh-cn/admin_setings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - -} \ No newline at end of file diff --git a/pkg/langs/protos/zh-cn/admin_settings.json b/pkg/langs/protos/zh-cn/admin_settings.json new file mode 100644 index 0000000..170cecf --- /dev/null +++ b/pkg/langs/protos/zh-cn/admin_settings.json @@ -0,0 +1,20 @@ +{ + "tab_admin_server": "Web服务", + "tab_admin_ui": "管理界面设置", + "tab_user_ui": "用户界面设置", + "tab_admin_security_settings": "安全设置", + "tab_updates": "检查更新", + "tab_profile": "个人资料", + "tab_login": "登录设置", + "tab_database": "数据库", + "tab_api_nodes": "API节点", + "tab_user_nodes": "用户节点", + "tab_monitor_nodes": "监控节点", + "tab_ip_library": "IP库", + "tab_client_operation_systems": "操作系统库", + "tab_client_browsers": "浏览器库", + "tab_authority": "商业版认证", + "tab_access_log_databases": "日志数据库", + "tab_transfer": "迁移", + "tab_backup": "备份" +} \ No newline at end of file diff --git a/pkg/langs/utils.go b/pkg/langs/utils.go index 2cc0a4d..41588d6 100644 --- a/pkg/langs/utils.go +++ b/pkg/langs/utils.go @@ -11,7 +11,7 @@ import ( // Message 读取消息 // Read message -func Message(langCode string, messageCode MessageCode, args ...any) string { +func Message(langCode LangCode, messageCode MessageCode, args ...any) string { return defaultManager.GetMessage(langCode, messageCode, args...) } @@ -51,19 +51,18 @@ func ParseLangFromAction(action actions.ActionWrapper) (langCode string) { // Format string that contains message variables, such as ${lang.MESSAGE_CODE} // // 暂时不支持变量中加参数 -func Format(langCode string, varString string) string { +func Format(langCode LangCode, varString string) string { return configutils.ParseVariables(varString, func(varName string) (value string) { - const prefix = "lang." - if !strings.HasPrefix(varName, prefix) { + if !strings.HasPrefix(varName, varPrefix) { return "${" + varName + "}" // keep origin variable } - return Message(langCode, varName[len(prefix):]) + return Message(langCode, varName[len(varPrefix):]) }) } // Load 加载消息定义 // Load message definitions from map -func Load(langCode string, messageMap map[string]string) { +func Load(langCode LangCode, messageMap map[string]string) { lang, ok := defaultManager.GetLang(langCode) if !ok { lang = defaultManager.AddLang(langCode) diff --git a/pkg/langs/utils_test.go b/pkg/langs/utils_test.go index 46edcd2..b7b0e20 100644 --- a/pkg/langs/utils_test.go +++ b/pkg/langs/utils_test.go @@ -13,6 +13,26 @@ func TestMessage(t *testing.T) { t.Log(langs.Message("en-us", "user_description", "Lily")) } +func TestMessageVariable(t *testing.T) { + var lang = langs.DefaultManager().AddLang("en-us") + lang.Set("user", "Lily") + lang.Set("user2", "${lang.user}") + lang.Set("user_name", "Name: ${lang.user}") + lang.Set("user_name3", "Name: ${lang.user3}, ${user4}") + //lang.Set("user3", "") + + err := lang.Compile() + if err != nil { + t.Log("ERROR(ignore):", err) + } + + t.Log("user:", lang.Get("user")) + t.Log("user2:", lang.Get("user2")) + t.Log("user_name:", lang.Get("user_name")) + t.Log("user_name3:", lang.Get("user_name3")) + t.Log("user_name3_2:", lang.Get("name3")) +} + func TestMessageDefault(t *testing.T) { var lang = langs.DefaultManager().AddLang("zh-cn") lang.Set("user_description", "user: %s") @@ -31,6 +51,6 @@ func TestFormat(t *testing.T) { lang.Set("book_name", "Go语言") } - t.Log(langs.Format("en-US", "this is ${lang.book_name} book")) - t.Log(langs.Format("zh-CN", "this is ${lang.book_name} book")) + t.Log(langs.Format("en-US", "this is ${lang:book_name} book")) + t.Log(langs.Format("zh-CN", "this is ${lang:book_name} book")) }