master

laravel/framework

Last updated at: 29/12/2023 09:24

Pluralizer.php

TLDR

The Pluralizer.php file is a class that provides methods for pluralizing and singularizing English words. It uses the Doctrine Inflector library for performing the inflection operations.

Methods

plural($value, $count = 2)

This method accepts an English word and an optional count. It returns the plural form of the word based on the given count. If the count is not provided or equals 1, the original word is returned. The uncountable words and words ending with special characters are also returned as-is.

singular($value)

This method accepts an English word and returns its singular form. It performs the singularization using the Doctrine Inflector library.

uncountable($value)

This protected method determines if the given word is uncountable. It checks if the lowercase version of the word exists in the static $uncountable array.

matchCase($value, $comparison)

This protected method attempts to match the case of the word passed as the argument to the case of the comparison word. It iterates over a list of case matching functions and returns the transformed value if it matches the comparison word's case.

inflector()

This method returns the inflector instance for performing inflection operations. If the instance is null, a new instance is created using the specified language.

useLanguage($language)

This method allows specifying the language that should be used by the inflector instance. It accepts a string representing the language and updates the static::$language property accordingly. It also sets the static::$inflector property to null, ensuring that a new inflector instance is created with the updated language when it is subsequently accessed.

<?php

namespace Illuminate\Support;

use Doctrine\Inflector\InflectorFactory;

class Pluralizer
{
    /**
     * The cached inflector instance.
     *
     * @var static
     */
    protected static $inflector;

    /**
     * The language that should be used by the inflector.
     *
     * @var string
     */
    protected static $language = 'english';

    /**
     * Uncountable non-nouns word forms.
     *
     * Contains words supported by Doctrine/Inflector/Rules/English/Uninflected.php
     *
     * @var string[]
     */
    public static $uncountable = [
        'recommended',
        'related',
    ];

    /**
     * Get the plural form of an English word.
     *
     * @param  string  $value
     * @param  int|array|\Countable  $count
     * @return string
     */
    public static function plural($value, $count = 2)
    {
        if (is_countable($count)) {
            $count = count($count);
        }

        if ((int) abs($count) === 1 || static::uncountable($value) || preg_match('/^(.*)[A-Za-z0-9\x{0080}-\x{FFFF}]$/u', $value) == 0) {
            return $value;
        }

        $plural = static::inflector()->pluralize($value);

        return static::matchCase($plural, $value);
    }

    /**
     * Get the singular form of an English word.
     *
     * @param  string  $value
     * @return string
     */
    public static function singular($value)
    {
        $singular = static::inflector()->singularize($value);

        return static::matchCase($singular, $value);
    }

    /**
     * Determine if the given value is uncountable.
     *
     * @param  string  $value
     * @return bool
     */
    protected static function uncountable($value)
    {
        return in_array(strtolower($value), static::$uncountable);
    }

    /**
     * Attempt to match the case on two strings.
     *
     * @param  string  $value
     * @param  string  $comparison
     * @return string
     */
    protected static function matchCase($value, $comparison)
    {
        $functions = ['mb_strtolower', 'mb_strtoupper', 'ucfirst', 'ucwords'];

        foreach ($functions as $function) {
            if ($function($comparison) === $comparison) {
                return $function($value);
            }
        }

        return $value;
    }

    /**
     * Get the inflector instance.
     *
     * @return \Doctrine\Inflector\Inflector
     */
    public static function inflector()
    {
        if (is_null(static::$inflector)) {
            static::$inflector = InflectorFactory::createForLanguage(static::$language)->build();
        }

        return static::$inflector;
    }

    /**
     * Specify the language that should be used by the inflector.
     *
     * @param  string  $language
     * @return void
     */
    public static function useLanguage(string $language)
    {
        static::$language = $language;

        static::$inflector = null;
    }
}