diff --git a/grammar.go b/grammar.go index 4fcf4cf..6faeff7 100644 --- a/grammar.go +++ b/grammar.go @@ -455,6 +455,9 @@ func articleForCurrentLanguage(lowerWord, originalWord string) (string, bool) { if article, ok := articleForPluralForm(data, lowerWord, lang); ok { return article, true } + if article, ok := articleForFrenchPluralGuess(data, lowerWord, originalWord, lang); ok { + return article, true + } if article, ok := articleByGender(data, lowerWord, originalWord, lang); ok { return article, true } @@ -489,6 +492,19 @@ func articleForPluralForm(data *GrammarData, lowerWord, lang string) (string, bo return "les", true } +func articleForFrenchPluralGuess(data *GrammarData, lowerWord, originalWord, lang string) (string, bool) { + if !isFrenchLanguage(lang) { + return "", false + } + if isKnownPluralNoun(data, lowerWord) { + return "", false + } + if !looksLikeFrenchPlural(originalWord) { + return "", false + } + return "des", true +} + func isKnownPluralNoun(data *GrammarData, lowerWord string) bool { if data == nil || len(data.Nouns) == 0 { return false @@ -564,6 +580,18 @@ func usesVowelSoundArticle(word string) bool { return false } +func looksLikeFrenchPlural(word string) bool { + trimmed := core.Trim(word) + if trimmed == "" || strings.ContainsAny(trimmed, " \t") || isInitialism(trimmed) { + return false + } + lower := core.Lower(trimmed) + if core.HasSuffix(lower, "aux") || core.HasSuffix(lower, "eaux") { + return true + } + return core.HasSuffix(lower, "s") || core.HasSuffix(lower, "x") +} + func startsWithVowelSound(word string) bool { lower := core.Lower(core.Trim(word)) if lower == "" { diff --git a/grammar_test.go b/grammar_test.go index f11063c..c6467d6 100644 --- a/grammar_test.go +++ b/grammar_test.go @@ -336,6 +336,7 @@ func TestArticleFrenchLocale(t *testing.T) { }{ {"branche", "la"}, {"branches", "les"}, + {"amis", "des"}, {"enfant", "l'"}, {"fichier", "le"}, {"inconnu", "un"}, @@ -574,6 +575,7 @@ func TestArticlePhraseFrenchLocale(t *testing.T) { }{ {"branche", "la branche"}, {"branches", "les branches"}, + {"amis", "des amis"}, {"enfant", "l'enfant"}, {"fichier", "le fichier"}, }