diff --git a/localise.go b/localise.go index ac481a3..250fa15 100644 --- a/localise.go +++ b/localise.go @@ -114,7 +114,12 @@ func CurrentPluralCategory(n int) PluralCategory { } func detectLanguage(supported []language.Tag) string { - for _, langEnv := range []string{os.Getenv("LC_ALL"), os.Getenv("LC_MESSAGES"), os.Getenv("LANG")} { + for _, langEnv := range []string{ + os.Getenv("LC_ALL"), + firstLocaleFromList(os.Getenv("LANGUAGE")), + os.Getenv("LC_MESSAGES"), + os.Getenv("LANG"), + } { if langEnv == "" { continue } @@ -145,6 +150,18 @@ func detectLanguageFromEnv(langEnv string, supported []language.Tag) string { return bestMatch.String() } +func firstLocaleFromList(langList string) string { + if langList == "" { + return "" + } + for _, lang := range core.Split(langList, ":") { + if trimmed := core.Trim(lang); trimmed != "" { + return trimmed + } + } + return "" +} + func normalizeLanguageTag(lang string) string { lang = core.Trim(lang) if lang == "" { diff --git a/localise_test.go b/localise_test.go index 3bcc640..a19d073 100644 --- a/localise_test.go +++ b/localise_test.go @@ -279,6 +279,20 @@ func TestDetectLanguage_SkipsInvalidHigherPriorityLocale(t *testing.T) { assert.Equal(t, "fr", result, "invalid LC_ALL should not block a valid lower-priority locale") } +func TestDetectLanguage_PrefersLanguageList(t *testing.T) { + t.Setenv("LANGUAGE", "fr_FR.UTF-8:de_DE.UTF-8") + t.Setenv("LANG", "en_US.UTF-8") + + supported := []language.Tag{ + language.AmericanEnglish, + language.French, + language.German, + } + + result := detectLanguage(supported) + assert.Equal(t, "fr", result, "LANGUAGE should be considered before LANG") +} + // --- Mode.String() --- func TestMode_String_Good(t *testing.T) {