You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
6.0 KiB

  1. using System;
  2. using System.Threading;
  3. namespace Humanizer.Inflections
  4. {
  5. /// <summary>
  6. /// Container for registered Vocabularies. At present, only a single vocabulary is supported: Default.
  7. /// </summary>
  8. internal static class Vocabularies
  9. {
  10. private static readonly Lazy<Vocabulary> Instance;
  11. static Vocabularies()
  12. {
  13. Instance = new Lazy<Vocabulary>(BuildDefault, LazyThreadSafetyMode.PublicationOnly);
  14. }
  15. /// <summary>
  16. /// The default vocabulary used for singular/plural irregularities.
  17. /// Rules can be added to this vocabulary and will be picked up by called to Singularize() and Pluralize().
  18. /// At this time, multiple vocabularies and removing existing rules are not supported.
  19. /// </summary>
  20. public static Vocabulary Default => Instance.Value;
  21. private static Vocabulary BuildDefault()
  22. {
  23. var _default = new Vocabulary();
  24. _default.AddPlural("$", "s");
  25. _default.AddPlural("s$", "s");
  26. _default.AddPlural("(ax|test)is$", "$1es");
  27. _default.AddPlural("(octop|vir|alumn|fung|cact|foc|hippopotam|radi|stimul|syllab|nucle)us$", "$1i");
  28. _default.AddPlural("(alias|bias|iris|status|campus|apparatus|virus|walrus|trellis)$", "$1es");
  29. _default.AddPlural("(buffal|tomat|volcan|ech|embarg|her|mosquit|potat|torped|vet)o$", "$1oes");
  30. _default.AddPlural("([dti])um$", "$1a");
  31. _default.AddPlural("sis$", "ses");
  32. _default.AddPlural("(?:([^f])fe|([lr])f)$", "$1$2ves");
  33. _default.AddPlural("(hive)$", "$1s");
  34. _default.AddPlural("([^aeiouy]|qu)y$", "$1ies");
  35. _default.AddPlural("(x|ch|ss|sh)$", "$1es");
  36. _default.AddPlural("(matr|vert|ind|d)ix|ex$", "$1ices");
  37. _default.AddPlural("(^[m|l])ouse$", "$1ice");
  38. _default.AddPlural("^(ox)$", "$1en");
  39. _default.AddPlural("(quiz)$", "$1zes");
  40. _default.AddPlural("(buz|blit|walt)z$", "$1zes");
  41. _default.AddPlural("(hoo|lea|loa|thie)f$", "$1ves");
  42. _default.AddPlural("(alumn|alg|larv|vertebr)a$", "$1ae");
  43. _default.AddPlural("(criteri|phenomen)on$", "$1a");
  44. _default.AddSingular("s$", "");
  45. _default.AddSingular("(n)ews$", "$1ews");
  46. _default.AddSingular("([dti])a$", "$1um");
  47. _default.AddSingular("(analy|ba|diagno|parenthe|progno|synop|the|ellip|empha|neuro|oa|paraly)ses$", "$1sis");
  48. _default.AddSingular("([^f])ves$", "$1fe");
  49. _default.AddSingular("(hive)s$", "$1");
  50. _default.AddSingular("(tive)s$", "$1");
  51. _default.AddSingular("([lr]|hoo|lea|loa|thie)ves$", "$1f");
  52. _default.AddSingular("(^zomb)?([^aeiouy]|qu)ies$", "$2y");
  53. _default.AddSingular("(s)eries$", "$1eries");
  54. _default.AddSingular("(m)ovies$", "$1ovie");
  55. _default.AddSingular("(x|ch|ss|sh)es$", "$1");
  56. _default.AddSingular("(^[m|l])ice$", "$1ouse");
  57. _default.AddSingular("(o)es$", "$1");
  58. _default.AddSingular("(shoe)s$", "$1");
  59. _default.AddSingular("(cris|ax|test)es$", "$1is");
  60. _default.AddSingular("(octop|vir|alumn|fung|cact|foc|hippopotam|radi|stimul|syllab|nucle)i$", "$1us");
  61. _default.AddSingular("(alias|bias|iris|status|campus|apparatus|virus|walrus|trellis)es$", "$1");
  62. _default.AddSingular("^(ox)en", "$1");
  63. _default.AddSingular("(matr|d)ices$", "$1ix");
  64. _default.AddSingular("(vert|ind)ices$", "$1ex");
  65. _default.AddSingular("(quiz)zes$", "$1");
  66. _default.AddSingular("(buz|blit|walt)zes$", "$1z");
  67. _default.AddSingular("(alumn|alg|larv|vertebr)ae$", "$1a");
  68. _default.AddSingular("(criteri|phenomen)a$", "$1on");
  69. _default.AddSingular("([b|r|c]ook|room|smooth)ies$", "$1ie");
  70. _default.AddIrregular("person", "people");
  71. _default.AddIrregular("man", "men");
  72. _default.AddIrregular("human", "humans");
  73. _default.AddIrregular("child", "children");
  74. _default.AddIrregular("sex", "sexes");
  75. _default.AddIrregular("glove", "gloves");
  76. _default.AddIrregular("move", "moves");
  77. _default.AddIrregular("goose", "geese");
  78. _default.AddIrregular("wave", "waves");
  79. _default.AddIrregular("die", "dice");
  80. _default.AddIrregular("foot", "feet");
  81. _default.AddIrregular("tooth", "teeth");
  82. _default.AddIrregular("curriculum", "curricula");
  83. _default.AddIrregular("database", "databases");
  84. _default.AddIrregular("zombie", "zombies");
  85. _default.AddIrregular("personnel", "personnel");
  86. //Fix #789
  87. _default.AddIrregular("cache", "caches");
  88. //Fix 975
  89. _default.AddIrregular("ex", "exes", matchEnding: false);
  90. _default.AddIrregular("is", "are", matchEnding: false);
  91. _default.AddIrregular("that", "those", matchEnding: false);
  92. _default.AddIrregular("this", "these", matchEnding: false);
  93. _default.AddIrregular("bus", "buses", matchEnding: false);
  94. _default.AddIrregular("staff", "staff", matchEnding: false);
  95. _default.AddIrregular("training", "training", matchEnding: false);
  96. _default.AddUncountable("equipment");
  97. _default.AddUncountable("information");
  98. _default.AddUncountable("corn");
  99. _default.AddUncountable("milk");
  100. _default.AddUncountable("rice");
  101. _default.AddUncountable("money");
  102. _default.AddUncountable("species");
  103. _default.AddUncountable("series");
  104. _default.AddUncountable("fish");
  105. _default.AddUncountable("sheep");
  106. _default.AddUncountable("deer");
  107. _default.AddUncountable("aircraft");
  108. _default.AddUncountable("oz");
  109. _default.AddUncountable("tsp");
  110. _default.AddUncountable("tbsp");
  111. _default.AddUncountable("ml");
  112. _default.AddUncountable("l");
  113. _default.AddUncountable("water");
  114. _default.AddUncountable("waters");
  115. _default.AddUncountable("semen");
  116. _default.AddUncountable("sperm");
  117. _default.AddUncountable("bison");
  118. _default.AddUncountable("grass");
  119. _default.AddUncountable("hair");
  120. _default.AddUncountable("mud");
  121. _default.AddUncountable("elk");
  122. _default.AddUncountable("luggage");
  123. _default.AddUncountable("moose");
  124. _default.AddUncountable("offspring");
  125. _default.AddUncountable("salmon");
  126. _default.AddUncountable("shrimp");
  127. _default.AddUncountable("someone");
  128. _default.AddUncountable("swine");
  129. _default.AddUncountable("trout");
  130. _default.AddUncountable("tuna");
  131. _default.AddUncountable("corps");
  132. _default.AddUncountable("scissors");
  133. _default.AddUncountable("means");
  134. _default.AddUncountable("mail");
  135. return _default;
  136. }
  137. }
  138. }