slugger = $slugger ?: new AsciiSlugger(); } public function getFilters(): array { return [ new TwigFilter('u', [$this, 'createUnicodeString']), new TwigFilter('slug', [$this, 'createSlug']), new TwigFilter('plural', [$this, 'plural']), new TwigFilter('singular', [$this, 'singular']), ]; } public function createUnicodeString(?string $text): UnicodeString { return new UnicodeString($text ?? ''); } public function createSlug(string $string, string $separator = '-', ?string $locale = null): AbstractUnicodeString { return $this->slugger->slug($string, $separator, $locale); } /** * @return array|string */ public function plural(string $value, string $locale = 'en', bool $all = false) { if ($all) { return $this->getInflector($locale)->pluralize($value); } return $this->getInflector($locale)->pluralize($value)[0]; } /** * @return array|string */ public function singular(string $value, string $locale = 'en', bool $all = false) { if ($all) { return $this->getInflector($locale)->singularize($value); } return $this->getInflector($locale)->singularize($value)[0]; } private function getInflector(string $locale): InflectorInterface { switch ($locale) { case 'en': return $this->englishInflector ?? $this->englishInflector = new EnglishInflector(); case 'es': if (!class_exists(SpanishInflector::class)) { throw new RuntimeError('SpanishInflector is not available.'); } return $this->spanishInflector ?? $this->spanishInflector = new SpanishInflector(); case 'fr': return $this->frenchInflector ?? $this->frenchInflector = new FrenchInflector(); default: throw new \InvalidArgumentException(\sprintf('Locale "%s" is not supported.', $locale)); } } }