Backend: Add WebLocale formatting function to clean package #465 #5043

Signed-off-by: Michael Mayer <michael@photoprism.app>
This commit is contained in:
Michael Mayer
2025-06-25 00:03:41 +02:00
parent baa5f2d9a0
commit bcbbbcd7b3
2 changed files with 74 additions and 0 deletions

View File

@@ -19,3 +19,27 @@ func Locale(locale, defaultLocale string) string {
return defaultLocale
}
// PosixLocale returns the normalized locale string in POSIX format with underscore, or the default locale otherwise.
// See https://en.wikipedia.org/wiki/Locale_(computer_software) for details.
func PosixLocale(locale, defaultLocale string) string {
return Locale(locale, defaultLocale)
}
// WebLocale returns a normalized locale string in BCP 47 format with a dash, or the default locale otherwise.
// See https://en.wikipedia.org/wiki/Locale_(computer_software) for details.
func WebLocale(locale, defaultLocale string) string {
if locale == "" {
return defaultLocale
}
locale, _, _ = strings.Cut(strings.Replace(locale, "_", "-", 1), ".")
if l := len(locale); l == 2 {
return strings.ToLower(locale)
} else if l == 5 && locale[2] == '-' {
return strings.ToLower(locale[:2]) + "-" + strings.ToUpper(locale[3:])
}
return defaultLocale
}

View File

@@ -30,3 +30,53 @@ func TestLocale(t *testing.T) {
assert.Equal(t, "und", Locale("cs-CZX", "und"))
})
}
func TestPosixLocale(t *testing.T) {
t.Run("Empty", func(t *testing.T) {
assert.Equal(t, "", PosixLocale("", ""))
assert.Equal(t, "de", PosixLocale("", "de"))
assert.Equal(t, "und", PosixLocale("", "und"))
})
t.Run("Language", func(t *testing.T) {
assert.Equal(t, "de", PosixLocale("de", ""))
assert.Equal(t, "", PosixLocale("und", ""))
assert.Equal(t, "de", PosixLocale("und", "de"))
assert.Equal(t, "cs", PosixLocale("cs", "und"))
})
t.Run("Territory", func(t *testing.T) {
assert.Equal(t, "cs_CZ", PosixLocale("cs_CZ", ""))
assert.Equal(t, "cs_CZ", PosixLocale("cs-CZ", ""))
assert.Equal(t, "cs_CZ", PosixLocale("cs_cz", ""))
assert.Equal(t, "cs_CZ", PosixLocale("cs-cz", ""))
assert.Equal(t, "cs_CZ", PosixLocale("Cs_cz", ""))
assert.Equal(t, "cs_CZ", PosixLocale("Cs-cz", ""))
assert.Equal(t, "cs_CZ", PosixLocale("cs_CZ", "und"))
assert.Equal(t, "cs_CZ", PosixLocale("cs-CZ", "und"))
assert.Equal(t, "und", PosixLocale("cs-CZX", "und"))
})
}
func TestWebLocale(t *testing.T) {
t.Run("Empty", func(t *testing.T) {
assert.Equal(t, "", WebLocale("", ""))
assert.Equal(t, "de", WebLocale("", "de"))
assert.Equal(t, "und", WebLocale("", "und"))
})
t.Run("Language", func(t *testing.T) {
assert.Equal(t, "de", WebLocale("de", ""))
assert.Equal(t, "", WebLocale("und", ""))
assert.Equal(t, "de", WebLocale("und", "de"))
assert.Equal(t, "cs", WebLocale("cs", "und"))
})
t.Run("Territory", func(t *testing.T) {
assert.Equal(t, "cs-CZ", WebLocale("cs-CZ", ""))
assert.Equal(t, "cs-CZ", WebLocale("cs_CZ", ""))
assert.Equal(t, "cs-CZ", WebLocale("cs-cz", ""))
assert.Equal(t, "cs-CZ", WebLocale("cs_cz", ""))
assert.Equal(t, "cs-CZ", WebLocale("Cs-cz", ""))
assert.Equal(t, "cs-CZ", WebLocale("Cs_cz", ""))
assert.Equal(t, "cs-CZ", WebLocale("cs-CZ", "und"))
assert.Equal(t, "cs-CZ", WebLocale("cs_CZ", "und"))
assert.Equal(t, "und", WebLocale("cs_CZX", "und"))
})
}