From 07d22a2bd6140336a1a498b8dd1938ec131faa14 Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 00:44:12 +0000 Subject: [PATCH] fix(i18n): load registered locales in core bootstrap Co-Authored-By: Virgil --- core_service.go | 5 +++++ go.sum | 4 ++++ hooks_test.go | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/core_service.go b/core_service.go index e0aa993..1f42c56 100644 --- a/core_service.go +++ b/core_service.go @@ -56,6 +56,11 @@ func NewCoreService(opts ServiceOptions) func(*core.Core) (any, error) { } } + // Preserve the same init-time locale registration behaviour used by Init(). + // Core bootstrap should not bypass packages that registered locale files + // before the service was constructed. + loadRegisteredLocales(svc) + if opts.Language != "" { if langErr := svc.SetLanguage(opts.Language); langErr != nil { return nil, core.Wrap(langErr, "NewCoreService", core.Sprintf("i18n: invalid language %q", opts.Language)) diff --git a/go.sum b/go.sum index bc16ba9..46b541d 100644 --- a/go.sum +++ b/go.sum @@ -15,10 +15,14 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/hooks_test.go b/hooks_test.go index 7698abc..e8929b8 100644 --- a/hooks_test.go +++ b/hooks_test.go @@ -111,6 +111,42 @@ func TestInit_LoadsRegisteredLocales(t *testing.T) { assert.Equal(t, "loaded on init", got) } +func TestNewCoreService_LoadsRegisteredLocales(t *testing.T) { + registeredLocalesMu.Lock() + savedLocales := registeredLocales + savedLoaded := localesLoaded + registeredLocales = nil + localesLoaded = false + registeredLocalesMu.Unlock() + + prev := defaultService.Load() + SetDefault(nil) + + defer func() { + registeredLocalesMu.Lock() + registeredLocales = savedLocales + localesLoaded = savedLoaded + registeredLocalesMu.Unlock() + SetDefault(prev) + }() + + fs := fstest.MapFS{ + "locales/en.json": &fstest.MapFile{ + Data: []byte(`{"core.registered": "loaded on core bootstrap"}`), + }, + } + RegisterLocales(fs, "locales") + + factory := NewCoreService(ServiceOptions{}) + _, err := factory(nil) + require.NoError(t, err) + + svc := Default() + require.NotNil(t, svc) + got := svc.T("core.registered") + assert.Equal(t, "loaded on core bootstrap", got) +} + func TestInit_ReDetectsRegisteredLocales(t *testing.T) { t.Setenv("LANG", "de_DE.UTF-8") -- 2.45.3