Skip to content

Commit d81043e

Browse files
[9.x] Configurable pluralizer language and uncountables (#41941)
* Removes redundant uncountables and gets pluralizer language ruleset from config * Portuguese Pluralizer Test * refactor * formatting Co-authored-by: Taylor Otwell <[email protected]>
1 parent 300c66f commit d81043e

File tree

2 files changed

+138
-45
lines changed

2 files changed

+138
-45
lines changed

src/Illuminate/Support/Pluralizer.php

+33-45
Original file line numberDiff line numberDiff line change
@@ -7,54 +7,31 @@
77
class Pluralizer
88
{
99
/**
10-
* Uncountable word forms.
10+
* The cached inflector instance.
11+
*
12+
* @var static
13+
*/
14+
protected static $inflector;
15+
16+
/**
17+
* The language that should be used by the inflector.
18+
*
19+
* @var string
20+
*/
21+
protected static $language = 'english';
22+
23+
/**
24+
* Uncountable non-nouns word forms.
25+
*
26+
* Contains words supported by Doctrine/Inflector/Rules/English/Uninflected.php
1127
*
1228
* @var string[]
1329
*/
1430
public static $uncountable = [
15-
'audio',
16-
'bison',
1731
'cattle',
18-
'chassis',
19-
'compensation',
20-
'coreopsis',
21-
'data',
22-
'deer',
23-
'education',
24-
'emoji',
25-
'equipment',
26-
'evidence',
27-
'feedback',
28-
'firmware',
29-
'fish',
30-
'furniture',
31-
'gold',
32-
'hardware',
33-
'information',
34-
'jedi',
3532
'kin',
36-
'knowledge',
37-
'love',
38-
'metadata',
39-
'money',
40-
'moose',
41-
'news',
42-
'nutrition',
43-
'offspring',
44-
'plankton',
45-
'pokemon',
46-
'police',
47-
'rain',
4833
'recommended',
4934
'related',
50-
'rice',
51-
'series',
52-
'sheep',
53-
'software',
54-
'species',
55-
'swine',
56-
'traffic',
57-
'wheat',
5835
];
5936

6037
/**
@@ -130,12 +107,23 @@ protected static function matchCase($value, $comparison)
130107
*/
131108
public static function inflector()
132109
{
133-
static $inflector;
134-
135-
if (is_null($inflector)) {
136-
$inflector = InflectorFactory::createForLanguage('english')->build();
110+
if (is_null(static::$inflector)) {
111+
static::$inflector = InflectorFactory::createForLanguage(static::$language)->build();
137112
}
138113

139-
return $inflector;
114+
return static::$inflector;
115+
}
116+
117+
/**
118+
* Specify the language that should be used by the inflector.
119+
*
120+
* @param string $language
121+
* @return void
122+
*/
123+
public static function useLanguage(string $language)
124+
{
125+
static::$language = $language;
126+
127+
static::$inflector = null;
140128
}
141129
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
3+
namespace Illuminate\Tests\Integration\Support;
4+
5+
use Illuminate\Support\Pluralizer;
6+
use Illuminate\Support\Str;
7+
use Orchestra\Testbench\TestCase;
8+
9+
class PluralizerPortugueseTest extends TestCase
10+
{
11+
public function setUp(): void
12+
{
13+
parent::setUp();
14+
15+
Pluralizer::useLanguage('portuguese');
16+
}
17+
18+
public function tearDown(): void
19+
{
20+
parent::tearDown();
21+
22+
Pluralizer::useLanguage('english');
23+
}
24+
25+
public function testBasicSingular()
26+
{
27+
$this->assertSame('herói', Str::singular('heróis'));
28+
$this->assertSame('irmão', Str::singular('irmãos'));
29+
$this->assertSame('chafariz', Str::singular('chafarizes'));
30+
$this->assertSame('colher', Str::singular('colheres'));
31+
$this->assertSame('modelo', Str::singular('modelos'));
32+
$this->assertSame('venda', Str::singular('vendas'));
33+
$this->assertSame('usuário', Str::singular('usuários'));
34+
$this->assertSame('comissão', Str::singular('comissões'));
35+
}
36+
37+
public function testIrregulars()
38+
{
39+
$this->assertSame('males', Str::plural('mal'));
40+
$this->assertSame('lápis', Str::singular('lápis'));
41+
}
42+
43+
public function testBasicPlural()
44+
{
45+
$this->assertSame('fênix', Str::plural('fênix'));
46+
$this->assertSame('palavras', Str::plural('palavra'));
47+
$this->assertSame('modelos', Str::plural('modelo'));
48+
$this->assertSame('vendas', Str::plural('venda'));
49+
$this->assertSame('usuários', Str::plural('usuário'));
50+
$this->assertSame('comissões', Str::plural('comissão'));
51+
}
52+
53+
public function testCaseSensitiveSingularUsage()
54+
{
55+
$this->assertSame('Criança', Str::singular('Crianças'));
56+
$this->assertSame('CIDADÃO', Str::singular('CIDADÃOS'));
57+
}
58+
59+
public function testCaseSensitiveSingularPlural()
60+
{
61+
$this->assertSame('Crianças', Str::plural('Criança'));
62+
$this->assertSame('CIDADÃOS', Str::plural('CIDADÃO'));
63+
$this->assertSame('Testes', Str::plural('Teste'));
64+
}
65+
66+
public function testPluralAppliedForStringEndingWithNumericCharacter()
67+
{
68+
$this->assertSame('Usuário1s', Str::plural('Usuário1'));
69+
$this->assertSame('Usuário2s', Str::plural('Usuário2'));
70+
$this->assertSame('Usuário3s', Str::plural('Usuário3'));
71+
}
72+
73+
public function testPluralSupportsArrays()
74+
{
75+
$this->assertSame('usuários', Str::plural('usuário', []));
76+
$this->assertSame('usuário', Str::plural('usuário', ['um']));
77+
$this->assertSame('usuários', Str::plural('usuário', ['um', 'dois']));
78+
}
79+
80+
public function testPluralSupportsCollections()
81+
{
82+
$this->assertSame('usuários', Str::plural('usuário', collect()));
83+
$this->assertSame('usuário', Str::plural('usuário', collect(['um'])));
84+
$this->assertSame('usuários', Str::plural('usuário', collect(['um', 'dois'])));
85+
}
86+
87+
public function testPluralStudlySupportsArrays()
88+
{
89+
$this->assertPluralStudly('AlgumUsuários', 'AlgumUsuário', []);
90+
$this->assertPluralStudly('AlgumUsuário', 'AlgumUsuário', ['um']);
91+
$this->assertPluralStudly('AlgumUsuários', 'AlgumUsuário', ['um', 'dois']);
92+
}
93+
94+
public function testPluralStudlySupportsCollections()
95+
{
96+
$this->assertPluralStudly('AlgumUsuários', 'AlgumUsuário', collect());
97+
$this->assertPluralStudly('AlgumUsuário', 'AlgumUsuário', collect(['um']));
98+
$this->assertPluralStudly('AlgumUsuários', 'AlgumUsuário', collect(['um', 'dois']));
99+
}
100+
101+
private function assertPluralStudly($expected, $value, $count = 2)
102+
{
103+
$this->assertSame($expected, Str::pluralStudly($value, $count));
104+
}
105+
}

0 commit comments

Comments
 (0)