refactor: Optimize i18n initialization with sync.Once for thread safety

This commit is contained in:
HynoR 2025-11-21 12:35:28 +08:00
parent e7d483620c
commit 83874f4c27

View file

@ -3,6 +3,7 @@ package i18n
import ( import (
"embed" "embed"
"strings" "strings"
"sync"
"sync/atomic" "sync/atomic"
"github.com/1Panel-dev/1Panel/core/app/repo" "github.com/1Panel-dev/1Panel/core/app/repo"
@ -136,24 +137,29 @@ func UseI18n() gin.HandlerFunc {
} }
func Init() { func Init() {
bundle = i18n.NewBundle(language.Chinese) initOnce.Do(func() {
bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal) bundle = i18n.NewBundle(language.Chinese)
bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal)
for _, file := range langFiles { for _, file := range langFiles {
if _, err := bundle.LoadMessageFileFS(fs, file); err != nil { if _, err := bundle.LoadMessageFileFS(fs, file); err != nil {
global.LOG.Warnf("failed to load language file %s: %v", file, err) global.LOG.Warnf("failed to load language file %s: %v", file, err)
}
} }
}
dbLang := getLanguageFromDBInternal() dbLang := getLanguageFromDBInternal()
SetCachedDBLanguage(dbLang) SetCachedDBLanguage(dbLang)
if dbLang == "" { if dbLang == "" {
dbLang = defaultLang dbLang = defaultLang
} }
global.I18n = i18n.NewLocalizer(bundle, dbLang) global.I18n = i18n.NewLocalizer(bundle, dbLang)
})
} }
func UseI18nForCmd(lang string) { func UseI18nForCmd(lang string) {
if bundle == nil {
Init()
}
if lang == "" { if lang == "" {
lang = defaultLang lang = defaultLang
} }
@ -205,6 +211,7 @@ func getLanguageFromDBInternal() string {
} }
var cachedDBLang atomic.Value var cachedDBLang atomic.Value
var initOnce sync.Once
func GetLanguage() string { func GetLanguage() string {
if v := cachedDBLang.Load(); v != nil { if v := cachedDBLang.Load(); v != nil {