fix(i18n): publish the translation bundle only once it is complete

InitLocalizer filled the shared bundle in place, and the Telegram bot
runs it again while the panel is serving, so a request could read the
bundle's maps while they were being written and the process died on a
concurrent map access. Build the bundle privately and publish it, and
the bot and web localizers, through atomic pointers; the lazy load in
the middleware publishes only if nothing else did first.
This commit is contained in:
MHSanaei
2026-10-31 09:11:54 +00:00
parent e3736564a3
commit f1e1b0fb0c
7 changed files with 89 additions and 32 deletions
@@ -52,9 +52,8 @@ func draftLocalizer(t *testing.T, msgs ...*i18n.Message) {
bundle := i18n.NewBundle(language.MustParse("en-US"))
bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
_ = bundle.AddMessages(language.MustParse("en-US"), msgs...)
orig := locale.LocalizerBot
t.Cleanup(func() { locale.LocalizerBot = orig })
locale.LocalizerBot = i18n.NewLocalizer(bundle, "en-US")
orig := locale.SwapBotLocalizer(i18n.NewLocalizer(bundle, "en-US"))
t.Cleanup(func() { locale.SwapBotLocalizer(orig) })
}
// Regression test: the wizard's own prompts are HTML-parsed as well, so the