| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- package flect
- var pluralRules = []rule{}
- // AddPlural adds a rule that will replace the given suffix with the replacement suffix.
- func AddPlural(suffix string, repl string) {
- pluralMoot.Lock()
- defer pluralMoot.Unlock()
- pluralRules = append(pluralRules, rule{
- suffix: suffix,
- fn: func(s string) string {
- s = s[:len(s)-len(suffix)]
- return s + repl
- },
- })
- pluralRules = append(pluralRules, rule{
- suffix: repl,
- fn: noop,
- })
- }
- var singleToPlural = map[string]string{
- "aircraft": "aircraft",
- "alias": "aliases",
- "alumna": "alumnae",
- "alumnus": "alumni",
- "analysis": "analyses",
- "antenna": "antennas",
- "antithesis": "antitheses",
- "apex": "apexes",
- "appendix": "appendices",
- "axis": "axes",
- "bacillus": "bacilli",
- "bacterium": "bacteria",
- "basis": "bases",
- "beau": "beaus",
- "bison": "bison",
- "bureau": "bureaus",
- "bus": "buses",
- "campus": "campuses",
- "caucus": "caucuses",
- "child": "children",
- "château": "châteaux",
- "circus": "circuses",
- "codex": "codices",
- "concerto": "concertos",
- "corpus": "corpora",
- "crisis": "crises",
- "curriculum": "curriculums",
- "datum": "data",
- "deer": "deer",
- "diagnosis": "diagnoses",
- "die": "dice",
- "dwarf": "dwarves",
- "ellipsis": "ellipses",
- "equipment": "equipment",
- "erratum": "errata",
- "faux pas": "faux pas",
- "fez": "fezzes",
- "fish": "fish",
- "focus": "foci",
- "foo": "foos",
- "foot": "feet",
- "formula": "formulas",
- "fungus": "fungi",
- "genus": "genera",
- "goose": "geese",
- "graffito": "graffiti",
- "grouse": "grouse",
- "half": "halves",
- "halo": "halos",
- "hoof": "hooves",
- "human": "humans",
- "hypothesis": "hypotheses",
- "index": "indices",
- "information": "information",
- "jeans": "jeans",
- "larva": "larvae",
- "libretto": "librettos",
- "loaf": "loaves",
- "locus": "loci",
- "louse": "lice",
- "matrix": "matrices",
- "minutia": "minutiae",
- "money": "money",
- "moose": "moose",
- "mouse": "mice",
- "nebula": "nebulae",
- "news": "news",
- "nucleus": "nuclei",
- "oasis": "oases",
- "octopus": "octopi",
- "offspring": "offspring",
- "opus": "opera",
- "ovum": "ova",
- "ox": "oxen",
- "parenthesis": "parentheses",
- "phenomenon": "phenomena",
- "photo": "photos",
- "phylum": "phyla",
- "piano": "pianos",
- "plus": "pluses",
- "police": "police",
- "prognosis": "prognoses",
- "prometheus": "prometheuses",
- "quiz": "quizzes",
- "quota": "quotas",
- "radius": "radiuses",
- "referendum": "referendums",
- "ress": "resses",
- "rice": "rice",
- "salmon": "salmon",
- "sex": "sexes",
- "series": "series",
- "sheep": "sheep",
- "shoe": "shoes",
- "shrimp": "shrimp",
- "species": "species",
- "stimulus": "stimuli",
- "stratum": "strata",
- "swine": "swine",
- "syllabus": "syllabi",
- "symposium": "symposiums",
- "synapse": "synapses",
- "synopsis": "synopses",
- "tableau": "tableaus",
- "testis": "testes",
- "thesis": "theses",
- "thief": "thieves",
- "tooth": "teeth",
- "trout": "trout",
- "tuna": "tuna",
- "vedalia": "vedalias",
- "vertebra": "vertebrae",
- "vertix": "vertices",
- "vita": "vitae",
- "vortex": "vortices",
- "wharf": "wharves",
- "wife": "wives",
- "woman": "women",
- "wolf": "wolves",
- "you": "you",
- }
- var pluralToSingle = map[string]string{}
- func init() {
- for k, v := range singleToPlural {
- pluralToSingle[v] = k
- }
- }
- type singularToPluralSuffix struct {
- singular string
- plural string
- }
- var singularToPluralSuffixList = []singularToPluralSuffix{
- {"iterion", "iteria"},
- {"campus", "campuses"},
- {"genera", "genus"},
- {"person", "people"},
- {"phylum", "phyla"},
- {"randum", "randa"},
- {"actus", "acti"},
- {"adium", "adia"},
- {"basis", "basis"},
- {"child", "children"},
- {"chive", "chives"},
- {"focus", "foci"},
- {"hello", "hellos"},
- {"jeans", "jeans"},
- {"louse", "lice"},
- {"media", "media"},
- {"mouse", "mice"},
- {"movie", "movies"},
- {"oasis", "oasis"},
- {"atum", "ata"},
- {"atus", "atuses"},
- {"base", "bases"},
- {"cess", "cesses"},
- {"dium", "diums"},
- {"eses", "esis"},
- {"half", "halves"},
- {"hive", "hives"},
- {"iano", "ianos"},
- {"irus", "iri"},
- {"isis", "ises"},
- {"leus", "li"},
- {"mnus", "mni"},
- {"move", "moves"},
- {"news", "news"},
- {"odex", "odice"},
- {"oose", "eese"},
- {"ouse", "ouses"},
- {"ovum", "ova"},
- {"rion", "ria"},
- {"shoe", "shoes"},
- {"stis", "stes"},
- {"tive", "tives"},
- {"wife", "wives"},
- {"afe", "aves"},
- {"bfe", "bves"},
- {"box", "boxes"},
- {"cfe", "cves"},
- {"dfe", "dves"},
- {"dge", "dges"},
- {"efe", "eves"},
- {"gfe", "gves"},
- {"hfe", "hves"},
- {"ife", "ives"},
- {"itz", "itzes"},
- {"ium", "ia"},
- {"ize", "izes"},
- {"jfe", "jves"},
- {"kfe", "kves"},
- {"man", "men"},
- {"mfe", "mves"},
- {"nfe", "nves"},
- {"nna", "nnas"},
- {"oaf", "oaves"},
- {"oci", "ocus"},
- {"ode", "odes"},
- {"ofe", "oves"},
- {"oot", "eet"},
- {"pfe", "pves"},
- {"pse", "psis"},
- {"qfe", "qves"},
- {"quy", "quies"},
- {"rfe", "rves"},
- {"sfe", "sves"},
- {"tfe", "tves"},
- {"tum", "ta"},
- {"tus", "tuses"},
- {"ufe", "uves"},
- {"ula", "ulae"},
- {"ula", "ulas"},
- {"uli", "ulus"},
- {"use", "uses"},
- {"uss", "usses"},
- {"vfe", "vves"},
- {"wfe", "wves"},
- {"xfe", "xves"},
- {"yfe", "yves"},
- {"you", "you"},
- {"zfe", "zves"},
- {"by", "bies"},
- {"ch", "ches"},
- {"cy", "cies"},
- {"dy", "dies"},
- {"ex", "ices"},
- {"fy", "fies"},
- {"gy", "gies"},
- {"hy", "hies"},
- {"io", "ios"},
- {"jy", "jies"},
- {"ky", "kies"},
- {"lf", "lves"},
- {"ly", "lies"},
- {"my", "mies"},
- {"ny", "nies"},
- {"py", "pies"},
- {"qy", "qies"},
- {"rf", "rves"},
- {"ry", "ries"},
- {"sh", "shes"},
- {"ss", "sses"},
- {"sy", "sies"},
- {"ty", "ties"},
- {"tz", "tzes"},
- {"va", "vae"},
- {"vy", "vies"},
- {"wy", "wies"},
- {"xy", "xies"},
- {"zy", "zies"},
- {"zz", "zzes"},
- {"o", "oes"},
- {"x", "xes"},
- }
- func init() {
- for _, suffix := range singularToPluralSuffixList {
- AddPlural(suffix.singular, suffix.plural)
- AddSingular(suffix.plural, suffix.singular)
- }
- }
|