diff --git a/pkg/locale/http.go b/pkg/locale/http.go index 57e658c78..a2633f243 100644 --- a/pkg/locale/http.go +++ b/pkg/locale/http.go @@ -17,11 +17,11 @@ func DetectLanguage(ll *service) func(next http.Handler) http.Handler { // resolve accept-language header // Accept-Language specifies the language of the response payload. - ctx = SetAcceptLanguageToContext(ctx, resolveAcceptLanguageHeaders(ll, r)) + ctx = SetAcceptLanguageToContext(ctx, resolveAcceptLanguageHeaders(r, ll)) // resolve content-language header // Content-Language specifies the language of the request payload. - ctx = SetContentLanguageToContext(ctx, resolveContentLanguageHeaders(r.Header, ll.Default().Tag)) + ctx = SetContentLanguageToContext(ctx, resolveContentLanguageHeaders(r.Header, ll)) next.ServeHTTP(w, r.WithContext(ctx)) }) @@ -36,11 +36,15 @@ func DetectLanguage(ll *service) func(next http.Handler) http.Handler { // - invalid language: (same as skip) // - valid language: returns valid language; services will treat translatable content from the payload as translations // - no header: returns default language; (same as valid language) -func resolveContentLanguageHeaders(h http.Header, def language.Tag) language.Tag { +func resolveContentLanguageHeaders(h http.Header, ll *service) language.Tag { + if ll == nil || ll.Default() == nil { + return language.Und + } + var cLang = h.Get(ContentLanguageHeader) if cLang == "" { - return def + return ll.Default().Tag } if cLang == "skip" { @@ -55,7 +59,12 @@ func resolveContentLanguageHeaders(h http.Header, def language.Tag) language.Tag } } -func resolveAcceptLanguageHeaders(ll *service, r *http.Request) (tag language.Tag) { +func resolveAcceptLanguageHeaders(r *http.Request, ll *service) (tag language.Tag) { + if ll == nil || ll.Default() == nil { + // locale service does not have anything loaded... + return language.Und + } + if ll.opt.DevelopmentMode { if err := ll.ReloadStatic(); err != nil { // when in development mode, refresh languages for every request @@ -64,11 +73,6 @@ func resolveAcceptLanguageHeaders(ll *service, r *http.Request) (tag language.Ta } } - if ll.Default() == nil { - // locale service does not have anything loaded... - return - } - var ( raw string ) @@ -85,7 +89,7 @@ func resolveAcceptLanguageHeaders(ll *service, r *http.Request) (tag language.Ta if len(raw) == 0 { // no need for lang detection - return + return ll.Default().Tag } // parse & ignore errors diff --git a/pkg/locale/service.go b/pkg/locale/service.go index 41a43d4f5..fcaa624e2 100644 --- a/pkg/locale/service.go +++ b/pkg/locale/service.go @@ -74,8 +74,18 @@ func SetGlobal(ll *service) { global = ll } -func Static(ll ...*Language) *service { - return &service{} +func Static(ll ...*Language) (svc *service) { + svc = &service{ + log: zap.NewNop(), + set: make(map[language.Tag]*Language), + } + + for _, l := range ll { + svc.set[l.Tag] = l + svc.tags = append(svc.tags, l.Tag) + } + + return svc } func Service(log *zap.Logger, opt options.LocaleOpt) (*service, error) { @@ -84,7 +94,6 @@ func Service(log *zap.Logger, opt options.LocaleOpt) (*service, error) { src: strings.Split(opt.Path, ":"), log: log.Named("locale"), } - for _, lang := range strings.Split(opt.Languages, ",") { lang = strings.TrimSpace(lang) tag := language.Make(lang) diff --git a/tests/automation/main_test.go b/tests/automation/main_test.go index 20e00e6fc..26285fd65 100644 --- a/tests/automation/main_test.go +++ b/tests/automation/main_test.go @@ -16,6 +16,7 @@ import ( "github.com/cortezaproject/corteza-server/pkg/id" "github.com/cortezaproject/corteza-server/pkg/label" ltype "github.com/cortezaproject/corteza-server/pkg/label/types" + "github.com/cortezaproject/corteza-server/pkg/locale" "github.com/cortezaproject/corteza-server/pkg/logger" "github.com/cortezaproject/corteza-server/pkg/rand" "github.com/cortezaproject/corteza-server/store" @@ -26,6 +27,7 @@ import ( _ "github.com/joho/godotenv/autoload" "github.com/steinfletcher/apitest" "github.com/stretchr/testify/require" + "golang.org/x/text/language" ) type ( @@ -70,6 +72,9 @@ func InitTestApp() { return err } + // Tests should be executed w/o any locales + locale.SetGlobal(locale.Static(&locale.Language{Tag: language.Und})) + eventbus.Set(eventBus) return nil }) diff --git a/tests/compose/main_test.go b/tests/compose/main_test.go index 7aa792f7e..3a01cc66d 100644 --- a/tests/compose/main_test.go +++ b/tests/compose/main_test.go @@ -21,6 +21,7 @@ import ( "github.com/cortezaproject/corteza-server/pkg/envoy/yaml" "github.com/cortezaproject/corteza-server/pkg/eventbus" "github.com/cortezaproject/corteza-server/pkg/id" + "github.com/cortezaproject/corteza-server/pkg/locale" "github.com/cortezaproject/corteza-server/pkg/logger" "github.com/cortezaproject/corteza-server/pkg/objstore/plain" "github.com/cortezaproject/corteza-server/pkg/rand" @@ -33,6 +34,7 @@ import ( "github.com/spf13/afero" "github.com/steinfletcher/apitest" "github.com/stretchr/testify/require" + "golang.org/x/text/language" ) type ( @@ -80,6 +82,9 @@ func InitTestApp() { return err } + // Tests should be executed w/o any locales + locale.SetGlobal(locale.Static(&locale.Language{Tag: language.Und})) + eventbus.Set(eventBus) return nil }) diff --git a/tests/system/main_test.go b/tests/system/main_test.go index d3c5a8d85..ef55cb66d 100644 --- a/tests/system/main_test.go +++ b/tests/system/main_test.go @@ -18,6 +18,7 @@ import ( "github.com/cortezaproject/corteza-server/pkg/id" "github.com/cortezaproject/corteza-server/pkg/label" ltype "github.com/cortezaproject/corteza-server/pkg/label/types" + "github.com/cortezaproject/corteza-server/pkg/locale" "github.com/cortezaproject/corteza-server/pkg/logger" "github.com/cortezaproject/corteza-server/pkg/objstore/plain" "github.com/cortezaproject/corteza-server/pkg/rand" @@ -34,6 +35,7 @@ import ( "github.com/steinfletcher/apitest" "github.com/stretchr/testify/require" "go.uber.org/zap" + "golang.org/x/text/language" ) //go:embed static @@ -90,10 +92,14 @@ func InitTestApp() { return err } + // Tests should be executed w/o any locales + locale.SetGlobal(locale.Static(&locale.Language{Tag: language.Und})) + sm = request.NewSessionManager(service.DefaultStore, app.Opt.Auth, service.DefaultLogger) return nil }) + } sp, _ := loadSAMLService()