添加多语言最基础代码

This commit is contained in:
GoEdgeLab
2023-06-28 09:14:07 +08:00
parent f29ad86b67
commit 97fe91c7b0
16 changed files with 172 additions and 70 deletions

View File

@@ -3,6 +3,8 @@ package configloaders
import (
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
"github.com/TeaOSLab/EdgeCommon/pkg/langs"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
"github.com/iwind/TeaGo/maps"
@@ -47,6 +49,7 @@ func loadAdminModuleMapping() (map[int64]*AdminModuleList, error) {
IsSuper: m.IsSuper,
Fullname: m.Fullname,
Theme: m.Theme,
Lang: m.Lang,
}
for _, pbModule := range m.Modules {
@@ -158,50 +161,63 @@ func UpdateAdminTheme(adminId int64, theme string) {
}
}
// FindAdminLang 查找某个管理员选择的语言
func FindAdminLang(adminId int64) string {
locker.Lock()
defer locker.Unlock()
list, ok := sharedAdminModuleMapping[adminId]
if ok {
return list.Lang
}
return ""
}
// AllModuleMaps 所有权限列表
func AllModuleMaps() []maps.Map {
func AllModuleMaps(langCode string) []maps.Map {
var m = []maps.Map{
{
"name": "看板",
"name": langs.Message(langCode, codes.AdminMenuDashboard),
"code": AdminModuleCodeDashboard,
"url": "/dashboard",
},
{
"name": "网站列表",
"name": langs.Message(langCode, codes.AdminMenuServers),
"code": AdminModuleCodeServer,
"url": "/servers",
},
{
"name": "边缘节点",
"name": langs.Message(langCode, codes.AdminMenuNodes),
"code": AdminModuleCodeNode,
"url": "/clusters",
},
{
"name": "域名解析",
"name": langs.Message(langCode, codes.AdminMenuDNS),
"code": AdminModuleCodeDNS,
"url": "/dns",
},
}
if teaconst.IsPlus {
m = append(m, maps.Map{
"name": "智能DNS",
"name": langs.Message(langCode, codes.AdminMenuNS),
"code": AdminModuleCodeNS,
"url": "/ns",
})
}
m = append(m, []maps.Map{
{
"name": "平台用户",
"name": langs.Message(langCode, codes.AdminMenuUsers),
"code": AdminModuleCodeUser,
"url": "/users",
},
{
"name": "系统用户",
"name": langs.Message(langCode, codes.AdminMenuAdmins),
"code": AdminModuleCodeAdmin,
"url": "/admins",
},
{
"name": "财务管理",
"name": langs.Message(langCode, codes.AdminMenuFinance),
"code": AdminModuleCodeFinance,
"url": "/finance",
},
@@ -210,12 +226,12 @@ func AllModuleMaps() []maps.Map {
if teaconst.IsPlus {
m = append(m, []maps.Map{
{
"name": "套餐管理",
"name": langs.Message(langCode, codes.AdminMenuPlans),
"code": AdminModuleCodePlan,
"url": "/plans",
},
{
"name": "工单系统",
"name": langs.Message(langCode, codes.AdminMenuTickets),
"code": AdminModuleCodeTicket,
"url": "/tickets",
},
@@ -224,12 +240,12 @@ func AllModuleMaps() []maps.Map {
m = append(m, []maps.Map{
{
"name": "日志审计",
"name": langs.Message(langCode, codes.AdminMenuLogs),
"code": AdminModuleCodeLog,
"url": "/log",
},
{
"name": "系统设置",
"name": langs.Message(langCode, codes.AdminMenuSettings),
"code": AdminModuleCodeSetting,
"url": "/settings",
},

View File

@@ -7,6 +7,7 @@ type AdminModuleList struct {
Modules []*systemconfigs.AdminModule
Fullname string
Theme string
Lang string
}
func (this *AdminModuleList) Allow(module string) bool {

View File

@@ -8,6 +8,7 @@ import (
"github.com/TeaOSLab/EdgeAdmin/internal/oplogs"
"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/logs"
@@ -148,3 +149,12 @@ func (this *ParentAction) AdminContext() context.Context {
func (this *ParentAction) ViewData() maps.Map {
return this.Data
}
func (this *ParentAction) Lang() string {
var lang = configloaders.FindAdminLang(this.AdminId())
if len(lang) > 0 {
// TODO check language still exists
return lang
}
return langs.ParseLangFromAction(this)
}

View File

@@ -51,7 +51,7 @@ func (this *AdminAction) RunGet(params struct {
// 权限
moduleMaps := []maps.Map{}
for _, m := range configloaders.AllModuleMaps() {
for _, m := range configloaders.AllModuleMaps(this.Lang()) {
code := m.GetString("code")
isChecked := false
for _, module := range admin.Modules {

View File

@@ -20,7 +20,7 @@ func (this *CreatePopupAction) Init() {
}
func (this *CreatePopupAction) RunGet(params struct{}) {
this.Data["modules"] = configloaders.AllModuleMaps()
this.Data["modules"] = configloaders.AllModuleMaps(this.Lang())
this.Show()
}

View File

@@ -59,7 +59,7 @@ func (this *UpdateAction) RunGet(params struct {
}
// 权限
var moduleMaps = configloaders.AllModuleMaps()
var moduleMaps = configloaders.AllModuleMaps(this.Lang())
for _, m := range moduleMaps {
code := m.GetString("code")
isChecked := false

View File

@@ -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() {
for _, m := range configloaders.AllModuleMaps(this.Lang()) {
if m.GetString("code") == module {
this.RedirectURL(m.GetString("url"))
return

View File

@@ -5,36 +5,38 @@ package helpers
import (
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
"github.com/TeaOSLab/EdgeCommon/pkg/langs"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/iwind/TeaGo/maps"
)
func FindAllMenuMaps(nodeLogsType string, countUnreadNodeLogs int64, countUnreadIPItems int64) []maps.Map {
func FindAllMenuMaps(langCode string, nodeLogsType string, countUnreadNodeLogs int64, countUnreadIPItems int64) []maps.Map {
return []maps.Map{
{
"code": "dashboard",
"module": configloaders.AdminModuleCodeDashboard,
"name": "数据看板",
"name": langs.Message(langCode, codes.AdminMenuDashboard),
"icon": "dashboard",
},
{
"code": "servers",
"module": configloaders.AdminModuleCodeServer,
"name": "网站列表",
"name": langs.Message(langCode, codes.AdminMenuServers),
"subtitle": "",
"icon": "clone outsize",
"subItems": []maps.Map{
{
"name": "访问日志",
"name": langs.Message(langCode, codes.AdminMenuServerAccessLogs),
"url": "/servers/logs",
"code": "log",
},
{
"name": "证书管理",
"name": langs.Message(langCode, codes.AdminMenuServerCerts),
"url": "/servers/certs",
"code": "cert",
},
{
"name": "网站分组",
"name": langs.Message(langCode, codes.AdminMenuServerGroups),
"url": "/servers/groups",
"code": "group",
},
@@ -44,12 +46,12 @@ func FindAllMenuMaps(nodeLogsType string, countUnreadNodeLogs int64, countUnread
"code": "",
},
{
"name": "缓存策略",
"name": langs.Message(langCode, codes.AdminMenuServerCachePolicies),
"url": "/servers/components/cache",
"code": "cache",
},
{
"name": "刷新预热",
"name": langs.Message(langCode, codes.AdminMenuServerPurgeFetchCaches),
"url": "/servers/components/cache/batch",
"code": "cacheBatch",
},
@@ -59,12 +61,12 @@ func FindAllMenuMaps(nodeLogsType string, countUnreadNodeLogs int64, countUnread
"code": "",
},
{
"name": "WAF策略",
"name": langs.Message(langCode, codes.AdminMenuServerWAFPolicies),
"url": "/servers/components/waf",
"code": "waf",
},
{
"name": "IP名单",
"name": langs.Message(langCode, codes.AdminMenuServerIPLists),
"url": "/servers/iplists",
"code": "iplist",
"badge": countUnreadIPItems,
@@ -75,12 +77,12 @@ func FindAllMenuMaps(nodeLogsType string, countUnreadNodeLogs int64, countUnread
"code": "",
},
{
"name": "统计指标",
"name": langs.Message(langCode, codes.AdminMenuServerMetrics),
"url": "/servers/metrics",
"code": "metric",
},
{
"name": "通用设置",
"name": langs.Message(langCode, codes.AdminMenuServerGlobalSettings),
"url": "/servers/components",
"code": "global",
},
@@ -89,28 +91,28 @@ func FindAllMenuMaps(nodeLogsType string, countUnreadNodeLogs int64, countUnread
{
"code": "clusters",
"module": configloaders.AdminModuleCodeNode,
"name": "边缘节点",
"name": langs.Message(langCode, codes.AdminMenuNodes),
"subtitle": "",
"icon": "cloud",
"subItems": []maps.Map{
{
"name": "集群列表",
"name": langs.Message(langCode, codes.AdminMenuNodeClusters),
"url": "/clusters",
"code": "cluster",
},
{
"name": "节点日志",
"name": langs.Message(langCode, codes.AdminMenuNodeLogs),
"url": "/clusters/logs?type=" + nodeLogsType,
"code": "log",
"badge": countUnreadNodeLogs,
},
{
"name": "区域设置",
"name": langs.Message(langCode, codes.AdminMenuNodeRegions),
"url": "/clusters/regions",
"code": "region",
},
{
"name": "节点SSH",
"name": langs.Message(langCode, codes.AdminMenuNodeSSHGrants),
"url": "/clusters/grants",
"code": "grant",
},
@@ -119,22 +121,22 @@ func FindAllMenuMaps(nodeLogsType string, countUnreadNodeLogs int64, countUnread
{
"code": "dns",
"module": configloaders.AdminModuleCodeDNS,
"name": "域名解析",
"name": langs.Message(langCode, codes.AdminMenuDNS),
"subtitle": "",
"icon": "globe",
"subItems": []maps.Map{
{
"name": "集群列表",
"name": langs.Message(langCode, codes.AdminMenuDNSClusters),
"url": "/dns",
"code": "cluster",
},
{
"name": "DNS服务商",
"name": langs.Message(langCode, codes.AdminMenuDNSProviders),
"url": "/dns/providers",
"code": "provider",
},
{
"name": "问题修复",
"name": langs.Message(langCode, codes.AdminMenuDNSIssues),
"url": "/dns/issues",
"code": "issue",
},
@@ -143,36 +145,36 @@ func FindAllMenuMaps(nodeLogsType string, countUnreadNodeLogs int64, countUnread
{
"code": "users",
"module": configloaders.AdminModuleCodeUser,
"name": "平台用户",
"name": langs.Message(langCode, codes.AdminMenuUsers),
"icon": "users",
},
{
"code": "admins",
"module": configloaders.AdminModuleCodeAdmin,
"name": "系统用户",
"name": langs.Message(langCode, codes.AdminMenuAdmins),
"subtitle": "",
"icon": "user secret",
},
{
"code": "log",
"module": configloaders.AdminModuleCodeLog,
"name": "日志审计",
"name": langs.Message(langCode, codes.AdminMenuLogs),
"icon": "history",
},
{
"code": "settings",
"module": configloaders.AdminModuleCodeSetting,
"name": "系统设置",
"name": langs.Message(langCode, codes.AdminMenuSettings),
"subtitle": "",
"icon": "setting",
"subItems": []maps.Map{
{
"name": "基础设置",
"name": langs.Message(langCode, codes.AdminMenuSettingBasicSettings),
"url": "/settings",
"code": "basic",
},
{
"name": "高级设置",
"name": langs.Message(langCode, codes.AdminMenuSettingAdvancedSettings),
"url": "/settings/advanced",
"code": "advanced",
},

View File

@@ -8,6 +8,7 @@ import (
"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
"github.com/TeaOSLab/EdgeAdmin/internal/setup"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/index/loginutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
@@ -119,7 +120,7 @@ func (this *userMustAuth) BeforeAction(actionPtr actions.ActionWrapper, paramNam
if teaconst.IsDemoMode {
if action.Request.Method == http.MethodPost {
var actionName = action.Spec.ClassName[strings.LastIndex(action.Spec.ClassName, ".")+1:]
var denyPrefixes = []string{"Update", "Create", "Delete", "Truncate", "Clean", "Clear", "Reset", "Add", "Remove", "Sync"}
var denyPrefixes = []string{"Update", "Create", "Delete", "Truncate", "Clean", "Clear", "Reset", "Add", "Remove", "Sync", "Run", "Exec"}
for _, prefix := range denyPrefixes {
if strings.HasPrefix(actionName, prefix) {
action.Fail(teaconst.ErrorDemoOperation)
@@ -255,7 +256,16 @@ func (this *userMustAuth) BeforeAction(actionPtr actions.ActionWrapper, paramNam
if !action.Data.Has("teaMenu") {
action.Data["teaMenu"] = ""
}
action.Data["teaModules"] = this.modules(actionPtr, adminId, uiConfig)
// 语言
// Language
var lang = configloaders.FindAdminLang(adminId)
if len(lang) == 0 {
lang = langs.ParseLangFromAction(action)
}
action.Data["teaLang"] = lang
action.Data["teaModules"] = this.modules(lang, actionPtr, adminId, uiConfig)
action.Data["teaSubMenus"] = []map[string]interface{}{}
action.Data["teaTabbar"] = []map[string]interface{}{}
if len(uiConfig.Version) == 0 {
@@ -290,7 +300,7 @@ func (this *userMustAuth) BeforeAction(actionPtr actions.ActionWrapper, paramNam
}
// 菜单配置
func (this *userMustAuth) modules(actionPtr actions.ActionWrapper, adminId int64, adminUIConfig *systemconfigs.AdminUIConfig) []maps.Map {
func (this *userMustAuth) modules(langCode string, actionPtr actions.ActionWrapper, adminId int64, adminUIConfig *systemconfigs.AdminUIConfig) []maps.Map {
// 父级动作
var action = actionPtr.Object()
@@ -309,7 +319,7 @@ func (this *userMustAuth) modules(actionPtr actions.ActionWrapper, adminId int64
}
var result = []maps.Map{}
for _, m := range FindAllMenuMaps(nodeLogsType, countUnreadNodeLogs, countUnreadIPItems) {
for _, m := range FindAllMenuMaps(langCode, nodeLogsType, countUnreadNodeLogs, countUnreadIPItems) {
if m.GetString("code") == "finance" && !configloaders.ShowFinance() {
continue
}