Pluralizer.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. namespace Illuminate\Support;
  3. use Doctrine\Inflector\InflectorFactory;
  4. class Pluralizer
  5. {
  6. /**
  7. * The cached inflector instance.
  8. *
  9. * @var static
  10. */
  11. protected static $inflector;
  12. /**
  13. * The language that should be used by the inflector.
  14. *
  15. * @var string
  16. */
  17. protected static $language = 'english';
  18. /**
  19. * Uncountable non-nouns word forms.
  20. *
  21. * Contains words supported by Doctrine/Inflector/Rules/English/Uninflected.php
  22. *
  23. * @var string[]
  24. */
  25. public static $uncountable = [
  26. 'recommended',
  27. 'related',
  28. ];
  29. /**
  30. * Get the plural form of an English word.
  31. *
  32. * @param string $value
  33. * @param int|array|\Countable $count
  34. * @return string
  35. */
  36. public static function plural($value, $count = 2)
  37. {
  38. if (is_countable($count)) {
  39. $count = count($count);
  40. }
  41. if ((int) abs($count) === 1 || static::uncountable($value) || preg_match('/^(.*)[A-Za-z0-9\x{0080}-\x{FFFF}]$/u', $value) == 0) {
  42. return $value;
  43. }
  44. $plural = static::inflector()->pluralize($value);
  45. return static::matchCase($plural, $value);
  46. }
  47. /**
  48. * Get the singular form of an English word.
  49. *
  50. * @param string $value
  51. * @return string
  52. */
  53. public static function singular($value)
  54. {
  55. $singular = static::inflector()->singularize($value);
  56. return static::matchCase($singular, $value);
  57. }
  58. /**
  59. * Determine if the given value is uncountable.
  60. *
  61. * @param string $value
  62. * @return bool
  63. */
  64. protected static function uncountable($value)
  65. {
  66. return in_array(strtolower($value), static::$uncountable);
  67. }
  68. /**
  69. * Attempt to match the case on two strings.
  70. *
  71. * @param string $value
  72. * @param string $comparison
  73. * @return string
  74. */
  75. protected static function matchCase($value, $comparison)
  76. {
  77. $functions = ['mb_strtolower', 'mb_strtoupper', 'ucfirst', 'ucwords'];
  78. foreach ($functions as $function) {
  79. if ($function($comparison) === $comparison) {
  80. return $function($value);
  81. }
  82. }
  83. return $value;
  84. }
  85. /**
  86. * Get the inflector instance.
  87. *
  88. * @return \Doctrine\Inflector\Inflector
  89. */
  90. public static function inflector()
  91. {
  92. if (is_null(static::$inflector)) {
  93. static::$inflector = InflectorFactory::createForLanguage(static::$language)->build();
  94. }
  95. return static::$inflector;
  96. }
  97. /**
  98. * Specify the language that should be used by the inflector.
  99. *
  100. * @param string $language
  101. * @return void
  102. */
  103. public static function useLanguage(string $language)
  104. {
  105. static::$language = $language;
  106. static::$inflector = null;
  107. }
  108. }