Files
EdgeCommon/pkg/langs/lang.go

84 lines
2.0 KiB
Go
Raw Normal View History

2023-06-28 09:12:13 +08:00
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
package langs
2023-06-28 16:19:05 +08:00
import (
"errors"
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
"strings"
)
const varPrefix = "lang."
type LangCode = string
2023-06-28 09:12:13 +08:00
type Lang struct {
code string
2023-06-30 18:09:43 +08:00
messageMap map[MessageCode]string // message code => message text
2023-06-28 09:12:13 +08:00
}
func NewLang(code string) *Lang {
return &Lang{
code: code,
2023-06-30 18:09:43 +08:00
messageMap: map[MessageCode]string{},
2023-06-28 09:12:13 +08:00
}
}
2023-06-30 18:09:43 +08:00
func (this *Lang) Set(messageCode MessageCode, messageText string) {
2023-06-28 09:12:13 +08:00
this.messageMap[messageCode] = messageText
}
2023-06-30 18:09:43 +08:00
func (this *Lang) Has(messageCode MessageCode) bool {
_, ok := this.messageMap[messageCode]
return ok
}
2023-06-28 09:12:13 +08:00
// Get 读取单条消息
// get single message with message code
2023-06-30 18:09:43 +08:00
func (this *Lang) Get(messageCode MessageCode) string {
2023-06-28 09:12:13 +08:00
return this.messageMap[messageCode]
}
// GetAll 读取所有消息
// get all messages
2023-06-30 18:09:43 +08:00
func (this *Lang) GetAll() map[MessageCode]string {
2023-06-28 09:12:13 +08:00
return this.messageMap
}
2023-06-28 16:19:05 +08:00
// 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 {
2023-06-30 18:09:43 +08:00
return errors.New("compile '" + string(code) + "': '" + oldMessage + "' failed: " + err.Error())
2023-06-28 16:19:05 +08:00
}
this.messageMap[code] = message
}
return nil
}
2023-06-30 18:09:43 +08:00
func (this *Lang) get(messageCode MessageCode, loopIndex int) (string, error) {
2023-06-28 16:19:05 +08:00
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
2023-06-30 18:09:43 +08:00
return "${" + varPrefix + string(messageCode) + "}", errors.New("can not find message for code '" + string(messageCode) + "'")
2023-06-28 16:19:05 +08:00
}
return "", nil
}
return configutils.ParseVariablesError(message, func(varName string) (value string, err error) {
if !strings.HasPrefix(varName, varPrefix) {
return "${" + varName + "}", nil
}
2023-06-30 18:09:43 +08:00
return this.get(MessageCode(varName[len(varPrefix):]), loopIndex)
2023-06-28 16:19:05 +08:00
})
}