From f0190cc0d372fa3eeecef87df7472ebf3f18c4f3 Mon Sep 17 00:00:00 2001 From: Alies Lapatsin <5278175+alies-dev@users.noreply.github.com> Date: Wed, 7 Oct 2026 14:12:31 +0200 Subject: [PATCH] :bug: Lowercase non-ASCII words in words() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit strtolower() only touches ASCII letters, so words like "Ёлка" or "Über" kept their capital. Use mb_strtolower() when it's available, same as LowercaseModifier does. --- src/Extensions/TextExtension.php | 10 +++++++++- tests/Unit/Extensions/TextExtensionTest.php | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Extensions/TextExtension.php b/src/Extensions/TextExtension.php index 6866168..38c18c2 100644 --- a/src/Extensions/TextExtension.php +++ b/src/Extensions/TextExtension.php @@ -85,7 +85,15 @@ public function words(int $words = 3): string $words = $this->wordsAsArray($words); // Remove any uppercase / comma / dots - return strtolower(preg_replace('/[.,]/', '', implode(' ', $words))); + $words = preg_replace('/[.,]/', '', implode(' ', $words)); + + if (function_exists('mb_strtolower')) { + return mb_strtolower($words); + } + + trigger_error('You do not have the `mbstring` extension enabled; FakerPHP might not handle uncommon characters correctly.', E_USER_WARNING); + + return strtolower($words); } public function sentencesAsArray(int $sentences = 3): array diff --git a/tests/Unit/Extensions/TextExtensionTest.php b/tests/Unit/Extensions/TextExtensionTest.php index 4af2fc2..e1b0c37 100644 --- a/tests/Unit/Extensions/TextExtensionTest.php +++ b/tests/Unit/Extensions/TextExtensionTest.php @@ -30,6 +30,14 @@ public function testWordsWithDefaultValue(): void } } + public function testWordsLowercasesNonAsciiCharacters(): void + { + $extension = new \Xefi\Faker\Extensions\TextExtension(new \Random\Randomizer()); + (new ReflectionClass($extension))->getProperty('paragraphs')->setValue($extension, [[['Ёлка', 'Écrit', 'Über.']]]); + + $this->assertEqualsCanonicalizing(['ёлка', 'écrit', 'über'], explode(' ', $extension->words(3))); + } + public static function wordsProvider() { return [