From 8d3d4b9704fd12920bcf383e559313a3f5412dd1 Mon Sep 17 00:00:00 2001 From: pixelmaxQM Date: Sun, 31 Aug 2025 17:03:29 +0800 Subject: [PATCH] =?UTF-8?q?fix(translate):=20=E6=B7=BB=E5=8A=A0=E4=BA=92?= =?UTF-8?q?=E6=96=A5=E9=94=81=E4=BF=9D=E6=8A=A4=E7=BF=BB=E8=AF=91=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E5=B9=B6=E5=8F=91=E8=AE=BF=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加sync.RWMutex来保护localizer和defaultLocalizer的并发访问,防止在多线程环境下出现数据竞争问题。 --- server/utils/translate/translator.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/server/utils/translate/translator.go b/server/utils/translate/translator.go index 6c00e3176..388236e3c 100644 --- a/server/utils/translate/translator.go +++ b/server/utils/translate/translator.go @@ -6,6 +6,7 @@ import ( "github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/text/language" "io/ioutil" + "sync" ) type Translator struct { @@ -13,6 +14,7 @@ type Translator struct { bundle *i18n.Bundle localizer *i18n.Localizer defaultLocalizer *i18n.Localizer + mu sync.RWMutex // 保护localizer和defaultLocalizer的并发访问 } // func (t *Translator) InitTranslator(initLang string) { @@ -83,17 +85,26 @@ func (t *Translator) InitTranslatorEx(initLang string, defaultLang string, langP } func (t *Translator) SetTranslatorLanguage(lang string) { + t.mu.Lock() + defer t.mu.Unlock() t.localizer = i18n.NewLocalizer(t.bundle, lang) } func (t *Translator) SetTranslatorDefaultLanguage(lang string) { + t.mu.Lock() + defer t.mu.Unlock() t.defaultLocalizer = i18n.NewLocalizer(t.bundle, lang) } func (t *Translator) TranslateMessage(messageID string) string { - translatedMsg, err := t.localizer.LocalizeMessage(&i18n.Message{ID: messageID}) + t.mu.RLock() + localizer := t.localizer + defaultLocalizer := t.defaultLocalizer + t.mu.RUnlock() + + translatedMsg, err := localizer.LocalizeMessage(&i18n.Message{ID: messageID}) if err != nil || translatedMsg == "" { // if translation fail use default language transalator - translatedMsg, err = t.defaultLocalizer.LocalizeMessage(&i18n.Message{ID: messageID}) + translatedMsg, err = defaultLocalizer.LocalizeMessage(&i18n.Message{ID: messageID}) if err != nil { return messageID }