Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. EnglishInflector.php

function EnglishInflector::pluralize

Overrides InflectorInterface::pluralize

File

vendor/symfony/string/Inflector/EnglishInflector.php, line 510

Class

EnglishInflector

Namespace

Symfony\Component\String\Inflector

Code

public function pluralize(string $singular) : array {
    $singularRev = strrev($singular);
    $lowerSingularRev = strtolower($singularRev);
    $singularLength = \strlen($lowerSingularRev);
    // Check if the word is one which is not inflected, return early if so
    if (\in_array($lowerSingularRev, self::UNINFLECTED, true)) {
        return [
            $singular,
        ];
    }
    // The outer loop iterates over the entries of the singular table
    // The inner loop $j iterates over the characters of the singular suffix
    // in the singular table to compare them with the characters of the actual
    // given singular suffix
    foreach (self::SINGULAR_MAP as $map) {
        $suffix = $map[0];
        $suffixLength = $map[1];
        $j = 0;
        // Compare characters in the singular table and of the suffix of the
        // given plural one by one
        while ($suffix[$j] === $lowerSingularRev[$j]) {
            // Let $j point to the next character
            ++$j;
            // Successfully compared the last character
            // Add an entry with the plural suffix to the plural array
            if ($j === $suffixLength) {
                // Is there any character preceding the suffix in the plural string?
                if ($j < $singularLength) {
                    $nextIsVowel = str_contains('aeiou', $lowerSingularRev[$j]);
                    if (!$map[2] && $nextIsVowel) {
                        // suffix may not succeed a vowel but next char is one
                        break;
                    }
                    if (!$map[3] && !$nextIsVowel) {
                        // suffix may not succeed a consonant but next char is one
                        break;
                    }
                }
                $newBase = substr($singular, 0, $singularLength - $suffixLength);
                $newSuffix = $map[4];
                // Check whether the first character in the singular suffix
                // is uppercased. If yes, uppercase the first character in
                // the singular suffix too
                $firstUpper = ctype_upper($singularRev[$j - 1]);
                if (\is_array($newSuffix)) {
                    $plurals = [];
                    foreach ($newSuffix as $newSuffixEntry) {
                        $plurals[] = $newBase . ($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);
                    }
                    return $plurals;
                }
                return [
                    $newBase . ($firstUpper ? ucfirst($newSuffix) : $newSuffix),
                ];
            }
            // Suffix is longer than word
            if ($j === $singularLength) {
                break;
            }
        }
    }
    // Assume that plural is singular with a trailing `s`
    return [
        $singular . 's',
    ];
}
RSS feed
Powered by Drupal