private string PublicSingularize(string word) { // words that we know of if (_userDictionary.ExistsInSecond(word)) { return(_userDictionary.GetFirstValue(word)); } if (IsNoOpWord(word)) { return(word); } string prefixWord; string suffixWord = GetSuffixWord(word, out prefixWord); if (IsNoOpWord(suffixWord)) { return(prefixWord + suffixWord); } // handle the word that is the same as the plural form if (IsUninflective(suffixWord)) { return(prefixWord + suffixWord); } // if word is one of the known singular words, then just return if (_knownSingluarWords.Contains(suffixWord.ToLowerInvariant())) { return(prefixWord + suffixWord); } // handle simple irregular verbs, e.g. was -> were if (_irregularVerbPluralizationService.ExistsInSecond(suffixWord)) { return(prefixWord + _irregularVerbPluralizationService.GetFirstValue(suffixWord)); } // handle irregular plurals, e.g. "ox" -> "oxen" if (_irregularPluralsPluralizationService.ExistsInSecond(suffixWord)) { return(prefixWord + _irregularPluralsPluralizationService.GetFirstValue(suffixWord)); } // handle singluarization for words ending with sis and pluralized to ses, // e.g. "ses" -> "sis" if (_wordsEndingWithSisPluralizationService.ExistsInSecond(suffixWord)) { return(prefixWord + _wordsEndingWithSisPluralizationService.GetFirstValue(suffixWord)); } // handle words ending with se, e.g. "ses" -> "se" if (_wordsEndingWithSePluralizationService.ExistsInSecond(suffixWord)) { return(prefixWord + _wordsEndingWithSePluralizationService.GetFirstValue(suffixWord)); } // handle words ending with sus, e.g. "suses" -> "sus" if (_wordsEndingWithSusPluralizationService.ExistsInSecond(suffixWord)) { return(prefixWord + _wordsEndingWithSusPluralizationService.GetFirstValue(suffixWord)); } string newSuffixWord; if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "men" }, s => s.Remove(s.Length - 2, 2) + "an", Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } // handle irregular inflections for common suffixes, e.g. "mouse" -> "mice" if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "lice", "mice" }, s => s.Remove(s.Length - 3, 3) + "ouse", Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "teeth" }, s => s.Remove(s.Length - 4, 4) + "ooth", Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "geese" }, s => s.Remove(s.Length - 4, 4) + "oose", Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "feet" }, s => s.Remove(s.Length - 3, 3) + "oot", Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "zoa" }, s => s.Remove(s.Length - 2, 2) + "oon", Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } // [cs]h and ss that take es as plural form, this is being moved up since the sses will be override by the ses if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "ches", "shes", "sses" }, s => s.Remove(s.Length - 2, 2), Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } // handle assimilated classical inflections, e.g. vertebra -> vertebrae if (_assimilatedClassicalInflectionPluralizationService.ExistsInSecond(suffixWord)) { return(prefixWord + _assimilatedClassicalInflectionPluralizationService.GetFirstValue(suffixWord)); } // Handle the classical variants of modern inflections // if (_classicalInflectionPluralizationService.ExistsInSecond(suffixWord)) { return(prefixWord + _classicalInflectionPluralizationService.GetFirstValue(suffixWord)); } if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "trices" }, s => s.Remove(s.Length - 3, 3) + "x", Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "eaux", "ieux" }, s => s.Remove(s.Length - 1, 1), Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } if (_wordsEndingWithInxAnxYnxPluralizationService.ExistsInSecond(suffixWord)) { return(prefixWord + _wordsEndingWithInxAnxYnxPluralizationService.GetFirstValue(suffixWord)); } // f, fe that take ves as plural form if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "alves", "elves", "olves", "eaves", "arves" }, s => s.Remove(s.Length - 3, 3) + "f", Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "nives", "lives", "wives" }, s => s.Remove(s.Length - 3, 3) + "fe", Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } // y takes ys as plural form if preceded by a vowel, but ies if preceded by a consonant, e.g. stays, skies if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "ays", "eys", "iys", "oys", "uys" }, s => s.Remove(s.Length - 1, 1), Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } // if (suffixWord.EndsWith("ies", true, Culture)) { return(prefixWord + suffixWord.Remove(suffixWord.Length - 3, 3) + "y"); } // handle some of the words o -> os, and [vowel]o -> os, and the rest are o->oes if (_oSuffixPluralizationService.ExistsInSecond(suffixWord)) { return(prefixWord + _oSuffixPluralizationService.GetFirstValue(suffixWord)); } if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "aos", "eos", "ios", "oos", "uos" }, s => suffixWord.Remove(suffixWord.Length - 1, 1), Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } // if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "ces" }, s => s.Remove(s.Length - 1, 1), Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } if (TryInflectOnSuffixInWord(suffixWord, new List <string> { "ces", "ses", "xes" }, s => s.Remove(s.Length - 2, 2), Culture, out newSuffixWord)) { return(prefixWord + newSuffixWord); } if (suffixWord.EndsWith("oes", true, Culture)) { return(prefixWord + suffixWord.Remove(suffixWord.Length - 2, 2)); } if (suffixWord.EndsWith("ss", true, Culture)) { return(prefixWord + suffixWord); } if (suffixWord.EndsWith("s", true, Culture)) { return(prefixWord + suffixWord.Remove(suffixWord.Length - 1, 1)); } // word is a singlar return(prefixWord + suffixWord); }