mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2025-12-01 02:00:25 +08:00
添加多语言最基础代码
This commit is contained in:
105
pkg/langs/manager.go
Normal file
105
pkg/langs/manager.go
Normal file
@@ -0,0 +1,105 @@
|
||||
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package langs
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var defaultManager = NewManager()
|
||||
|
||||
type Manager struct {
|
||||
langMap map[string]*Lang // lang code => *Lang, lang code must be in lowercase
|
||||
defaultLangCode string
|
||||
}
|
||||
|
||||
func NewManager() *Manager {
|
||||
return &Manager{
|
||||
langMap: map[string]*Lang{},
|
||||
defaultLangCode: "zh-cn",
|
||||
}
|
||||
}
|
||||
|
||||
func DefaultManager() *Manager {
|
||||
return defaultManager
|
||||
}
|
||||
|
||||
func (this *Manager) AddLang(code string) *Lang {
|
||||
var lang = NewLang(code)
|
||||
this.langMap[code] = lang
|
||||
return lang
|
||||
}
|
||||
|
||||
func (this *Manager) HasLang(code string) bool {
|
||||
_, ok := this.langMap[code]
|
||||
return ok
|
||||
}
|
||||
|
||||
func (this *Manager) GetLang(code string) (lang *Lang, ok bool) {
|
||||
lang, ok = this.langMap[code]
|
||||
return
|
||||
}
|
||||
|
||||
func (this *Manager) MatchLang(code string) (matchedCode string) {
|
||||
// lookup exact match
|
||||
code = strings.ToLower(code)
|
||||
_, ok := this.langMap[code]
|
||||
if ok {
|
||||
return code
|
||||
}
|
||||
|
||||
// lookup language family, such as en-us, en
|
||||
if strings.Contains(code, "-") {
|
||||
code, _, _ = strings.Cut(code, "-")
|
||||
}
|
||||
for rawCode := range this.langMap {
|
||||
if strings.HasPrefix(rawCode, code+"-") { // en-us vs en
|
||||
return rawCode
|
||||
}
|
||||
}
|
||||
|
||||
return this.DefaultLang()
|
||||
}
|
||||
|
||||
func (this *Manager) SetDefaultLang(code string) {
|
||||
this.defaultLangCode = code
|
||||
}
|
||||
|
||||
func (this *Manager) DefaultLang() string {
|
||||
if len(this.defaultLangCode) > 0 {
|
||||
return this.defaultLangCode
|
||||
}
|
||||
return "zh-cn"
|
||||
}
|
||||
|
||||
// GetMessage
|
||||
// message: name: %s, age: %d, salary: %.2f
|
||||
func (this *Manager) GetMessage(langCode string, messageCode string, args ...any) string {
|
||||
var lang = this.langMap[langCode]
|
||||
if lang == nil && len(this.defaultLangCode) > 0 {
|
||||
lang = this.langMap[this.defaultLangCode]
|
||||
}
|
||||
if lang == nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
var message = lang.Get(messageCode)
|
||||
if len(message) == 0 {
|
||||
// try to get message from default lang
|
||||
if lang.code != this.defaultLangCode {
|
||||
var defaultLang = this.langMap[this.defaultLangCode]
|
||||
if defaultLang != nil {
|
||||
return defaultLang.Get(messageCode)
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
if len(args) == 0 {
|
||||
return message
|
||||
}
|
||||
|
||||
return fmt.Sprintf(message, args...)
|
||||
}
|
||||
Reference in New Issue
Block a user