Fix unicode capitalization in plural forms
All checks were successful
Security Scan / security (push) Successful in 15s
Test / test (push) Successful in 1m58s

This commit is contained in:
Virgil 2026-04-02 05:10:36 +00:00
parent c7e5ee8512
commit 5449026041
2 changed files with 46 additions and 12 deletions

View file

@ -371,10 +371,7 @@ func Pluralize(noun string, count int) string {
}
lower := core.Lower(noun)
if form := getNounForm(currentLangForGrammar(), lower, "one"); form != "" {
if unicode.IsUpper(rune(noun[0])) && len(form) > 0 {
return core.Upper(string(form[0])) + form[1:]
}
return form
return preserveInitialCapitalization(noun, form)
}
return noun
}
@ -389,16 +386,10 @@ func PluralForm(noun string) string {
}
lower := core.Lower(noun)
if form := getNounForm(currentLangForGrammar(), lower, "other"); form != "" {
if unicode.IsUpper(rune(noun[0])) && len(form) > 0 {
return core.Upper(string(form[0])) + form[1:]
}
return form
return preserveInitialCapitalization(noun, form)
}
if plural, ok := irregularNouns[lower]; ok {
if unicode.IsUpper(rune(noun[0])) {
return core.Upper(string(plural[0])) + plural[1:]
}
return plural
return preserveInitialCapitalization(noun, plural)
}
return applyRegularPlural(noun)
}
@ -675,6 +666,22 @@ func isInitialism(word string) bool {
return hasLetter
}
func preserveInitialCapitalization(original, form string) string {
if original == "" || form == "" {
return form
}
originalRunes := []rune(original)
formRunes := []rune(form)
if len(originalRunes) == 0 || len(formRunes) == 0 {
return form
}
if !unicode.IsUpper(originalRunes[0]) {
return form
}
formRunes[0] = unicode.ToUpper(formRunes[0])
return string(formRunes)
}
func initialismUsesVowelSound(word string) bool {
if word == "" {
return false

View file

@ -263,6 +263,33 @@ func TestPluralize_UsesLocaleSingularOverride(t *testing.T) {
}
}
func TestPluralize_PreservesUnicodeCapitalization(t *testing.T) {
prev := Default()
t.Cleanup(func() {
SetDefault(prev)
})
svc, err := New()
if err != nil {
t.Fatalf("New() failed: %v", err)
}
SetDefault(svc)
if err := SetLanguage("fr"); err != nil {
t.Fatalf("SetLanguage(fr) failed: %v", err)
}
if got, want := Pluralize("Élément", 1), "Élément"; got != want {
t.Fatalf("Pluralize(%q, 1) = %q, want %q", "Élément", got, want)
}
if got, want := Pluralize("Élément", 2), "Éléments"; got != want {
t.Fatalf("Pluralize(%q, 2) = %q, want %q", "Élément", got, want)
}
if got, want := PluralForm("Élément"), "Éléments"; got != want {
t.Fatalf("PluralForm(%q) = %q, want %q", "Élément", got, want)
}
}
func TestPluralForm(t *testing.T) {
svc, err := New()
if err != nil {