Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5b55b6c

Browse files
author
Geordie
committed
[String] Fix pluralization of -on ending words + singularization of -a ending foreign words
1 parent 57f2e50 commit 5b55b6c

File tree

3 files changed

+72
-33
lines changed

3 files changed

+72
-33
lines changed

src/Symfony/Component/Inflector/Tests/InflectorTest.php

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public static function singularizeProvider()
3737
['atlases', ['atlas', 'atlase', 'atlasis']],
3838
['axes', ['ax', 'axe', 'axis']],
3939
['babies', 'baby'],
40-
['bacteria', ['bacterion', 'bacterium']],
40+
['bacteria', 'bacterium'],
4141
['bases', ['bas', 'base', 'basis']],
4242
['batches', ['batch', 'batche']],
4343
['beaux', 'beau'],
@@ -48,6 +48,7 @@ public static function singularizeProvider()
4848
['bureaux', 'bureau'],
4949
['buses', ['bus', 'buse', 'busis']],
5050
['bushes', ['bush', 'bushe']],
51+
['buttons', 'button'],
5152
['calves', ['calf', 'calve', 'calff']],
5253
['cars', 'car'],
5354
['cassettes', ['cassett', 'cassette']],
@@ -58,10 +59,12 @@ public static function singularizeProvider()
5859
['circuses', ['circus', 'circuse', 'circusis']],
5960
['cliffs', 'cliff'],
6061
['committee', 'committee'],
62+
['corpora', 'corpus'],
63+
['coupons', 'coupon'],
6164
['crises', ['cris', 'crise', 'crisis']],
62-
['criteria', ['criterion', 'criterium']],
65+
['criteria', 'criterion'],
6366
['cups', 'cup'],
64-
['coupons', 'coupon'],
67+
['curricula', 'curriculum'],
6568
['data', 'data'],
6669
['days', 'day'],
6770
['discos', 'disco'],
@@ -87,6 +90,7 @@ public static function singularizeProvider()
8790
['funguses', ['fungus', 'funguse', 'fungusis']],
8891
['garages', ['garag', 'garage']],
8992
['geese', 'goose'],
93+
['genera', 'genus'],
9094
['halves', ['half', 'halve', 'halff']],
9195
['hats', 'hat'],
9296
['heroes', ['hero', 'heroe']],
@@ -107,6 +111,8 @@ public static function singularizeProvider()
107111
['lives', 'life'],
108112
['matrices', ['matrex', 'matrix', 'matrice']],
109113
['matrixes', 'matrix'],
114+
['media', 'medium'],
115+
['memoranda', 'memorandum'],
110116
['men', 'man'],
111117
['mice', 'mouse'],
112118
['moves', 'move'],
@@ -120,7 +126,7 @@ public static function singularizeProvider()
120126
['parties', 'party'],
121127
['people', 'person'],
122128
['persons', 'person'],
123-
['phenomena', ['phenomenon', 'phenomenum']],
129+
['phenomena', 'phenomenon'],
124130
['photos', 'photo'],
125131
['pianos', 'piano'],
126132
['plateaux', 'plateau'],
@@ -144,7 +150,7 @@ public static function singularizeProvider()
144150
['spies', 'spy'],
145151
['staves', ['staf', 'stave', 'staff']],
146152
['stories', 'story'],
147-
['strata', ['straton', 'stratum']],
153+
['strata', 'stratum'],
148154
['suitcases', ['suitcas', 'suitcase', 'suitcasis']],
149155
['syllabi', 'syllabus'],
150156
['tags', 'tag'],
@@ -195,7 +201,9 @@ public static function pluralizeProvider()
195201
['bureau', ['bureaus', 'bureaux']],
196202
['bus', 'buses'],
197203
['bush', 'bushes'],
204+
['button', 'buttons'],
198205
['calf', ['calfs', 'calves']],
206+
['campus', 'campuses'],
199207
['car', 'cars'],
200208
['cassette', 'cassettes'],
201209
['cave', 'caves'],
@@ -205,10 +213,11 @@ public static function pluralizeProvider()
205213
['circus', 'circuses'],
206214
['cliff', 'cliffs'],
207215
['committee', 'committees'],
216+
['coupon', 'coupons'],
208217
['crisis', 'crises'],
209-
['criteria', 'criterion'],
218+
['criterion', 'criteria'],
210219
['cup', 'cups'],
211-
['coupon', 'coupons'],
220+
['curriculum', 'curricula'],
212221
['data', 'data'],
213222
['day', 'days'],
214223
['disco', 'discos'],
@@ -232,10 +241,12 @@ public static function pluralizeProvider()
232241
['half', ['halfs', 'halves']],
233242
['hat', 'hats'],
234243
['hero', 'heroes'],
244+
['hippocampus', 'hippocampi'],
235245
['hippopotamus', 'hippopotami'], // hippopotamuses
236246
['hoax', 'hoaxes'],
237247
['hoof', ['hoofs', 'hooves']],
238248
['house', 'houses'],
249+
['icon', 'icons'],
239250
['index', ['indicies', 'indexes']],
240251
['ion', 'ions'],
241252
['iris', 'irises'],
@@ -248,6 +259,8 @@ public static function pluralizeProvider()
248259
['louse', 'lice'],
249260
['man', 'men'],
250261
['matrix', ['matricies', 'matrixes']],
262+
['medium', 'media'],
263+
['memorandum', 'memoranda'],
251264
['mouse', 'mice'],
252265
['move', 'moves'],
253266
['movie', 'movies'],

src/Symfony/Component/String/Inflector/EnglishInflector.php

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,32 @@ final class EnglishInflector implements InflectorInterface
2525
// Fourth entry: Whether the suffix may succeed a consonant
2626
// Fifth entry: singular suffix, normal
2727

28-
// bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
29-
['a', 1, true, true, ['on', 'um']],
28+
// bacteria (bacterium)
29+
['airetcab', 8, true, true, 'bacterium'],
30+
31+
// corpora (corpus)
32+
['aroproc', 7, true, true, 'corpus'],
33+
34+
// criteria (criterion)
35+
['airetirc', 8, true, true, 'criterion'],
36+
37+
// curricula (curriculum)
38+
['alucirruc', 9, true, true, 'curriculum'],
39+
40+
// genera (genus)
41+
['areneg', 6, true, true, 'genus'],
42+
43+
// media (medium)
44+
['aidem', 5, true, true, 'medium'],
45+
46+
// memoranda (memorandum)
47+
['adnaromem', 9, true, true, 'memorandum'],
48+
49+
// phenomena (phenomenon)
50+
['anemonehp', 9, true, true, 'phenomenon'],
51+
52+
// strata (stratum)
53+
['atarts', 6, true, true, 'stratum'],
3054

3155
// nebulae (nebula)
3256
['ea', 2, true, true, 'a'],
@@ -238,7 +262,7 @@ final class EnglishInflector implements InflectorInterface
238262
// teeth (tooth)
239263
['htoot', 5, true, true, 'teeth'],
240264

241-
// bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
265+
// bacteria (bacterium), curricula (curriculum), media (medium), memoranda (memorandum), phenomena (phenomenon), strata (stratum)
242266
['mu', 2, true, true, 'a'],
243267

244268
// men (man), women (woman)
@@ -247,20 +271,11 @@ final class EnglishInflector implements InflectorInterface
247271
// people (person)
248272
['nosrep', 6, true, true, ['persons', 'people']],
249273

250-
// bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
251-
['noi', 3, true, true, 'ions'],
252-
253-
// coupon (coupons)
254-
['nop', 3, true, true, 'pons'],
255-
256-
// seasons (season), treasons (treason), poisons (poison), lessons (lesson)
257-
['nos', 3, true, true, 'sons'],
258-
259-
// icons (icon)
260-
['noc', 3, true, true, 'cons'],
274+
// criteria (criterion)
275+
['noiretirc', 9, true, true, 'criteria'],
261276

262-
// bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
263-
['no', 2, true, true, 'a'],
277+
// phenomena (phenomenon)
278+
['nonemonehp', 10, true, true, 'phenomena'],
264279

265280
// echoes (echo)
266281
['ohce', 4, true, true, 'echoes'],

src/Symfony/Component/String/Tests/Inflector/EnglishInflectorTest.php

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public static function singularizeProvider()
3434
['atlases', ['atlas', 'atlase', 'atlasis']],
3535
['axes', ['ax', 'axe', 'axis']],
3636
['babies', 'baby'],
37-
['bacteria', ['bacterion', 'bacterium']],
37+
['bacteria', 'bacterium'],
3838
['bases', ['bas', 'base', 'basis']],
3939
['batches', ['batch', 'batche']],
4040
['beaux', 'beau'],
@@ -45,6 +45,7 @@ public static function singularizeProvider()
4545
['bureaux', 'bureau'],
4646
['buses', ['bus', 'buse', 'busis']],
4747
['bushes', ['bush', 'bushe']],
48+
['buttons', 'button'],
4849
['calves', ['calf', 'calve', 'calff']],
4950
['cars', 'car'],
5051
['cassettes', ['cassett', 'cassette']],
@@ -56,10 +57,12 @@ public static function singularizeProvider()
5657
['cliffs', 'cliff'],
5758
['codes', 'code'],
5859
['committee', 'committee'],
60+
['corpora', 'corpus'],
61+
['coupons', 'coupon'],
5962
['crises', ['cris', 'crise', 'crisis']],
60-
['criteria', ['criterion', 'criterium']],
63+
['criteria', 'criterion'],
6164
['cups', 'cup'],
62-
['coupons', 'coupon'],
65+
['curricula', 'curriculum'],
6366
['data', 'data'],
6467
['days', 'day'],
6568
['discos', 'disco'],
@@ -85,6 +88,7 @@ public static function singularizeProvider()
8588
['funguses', ['fungus', 'funguse', 'fungusis']],
8689
['garages', ['garag', 'garage']],
8790
['geese', 'goose'],
91+
['genera', 'genus'],
8892
['halves', ['half', 'halve', 'halff']],
8993
['hats', 'hat'],
9094
['heroes', ['hero', 'heroe']],
@@ -105,6 +109,8 @@ public static function singularizeProvider()
105109
['lives', 'life'],
106110
['matrices', ['matrex', 'matrix', 'matrice']],
107111
['matrixes', 'matrix'],
112+
['media', 'medium'],
113+
['memoranda', 'memorandum'],
108114
['men', 'man'],
109115
['mice', 'mouse'],
110116
['moves', 'move'],
@@ -119,7 +125,7 @@ public static function singularizeProvider()
119125
['parties', 'party'],
120126
['people', 'person'],
121127
['persons', 'person'],
122-
['phenomena', ['phenomenon', 'phenomenum']],
128+
['phenomena', 'phenomenon'],
123129
['photos', 'photo'],
124130
['pianos', 'piano'],
125131
['plateaux', 'plateau'],
@@ -145,7 +151,7 @@ public static function singularizeProvider()
145151
['status', 'status'],
146152
['statuses', 'status'],
147153
['stories', 'story'],
148-
['strata', ['straton', 'stratum']],
154+
['strata', 'stratum'],
149155
['suitcases', ['suitcas', 'suitcase', 'suitcasis']],
150156
['syllabi', 'syllabus'],
151157
['tags', 'tag'],
@@ -198,7 +204,9 @@ public static function pluralizeProvider()
198204
['bureau', ['bureaus', 'bureaux']],
199205
['bus', 'buses'],
200206
['bush', 'bushes'],
207+
['button', 'buttons'],
201208
['calf', ['calfs', 'calves']],
209+
['campus', 'campuses'],
202210
['car', 'cars'],
203211
['cassette', 'cassettes'],
204212
['cave', 'caves'],
@@ -208,10 +216,11 @@ public static function pluralizeProvider()
208216
['circus', 'circuses'],
209217
['cliff', 'cliffs'],
210218
['committee', 'committees'],
219+
['coupon', 'coupons'],
211220
['crisis', 'crises'],
212-
['criteria', 'criterion'],
221+
['criterion', 'criteria'],
213222
['cup', 'cups'],
214-
['coupon', 'coupons'],
223+
['curriculum', 'curricula'],
215224
['data', 'data'],
216225
['day', 'days'],
217226
['disco', 'discos'],
@@ -235,10 +244,12 @@ public static function pluralizeProvider()
235244
['half', ['halfs', 'halves']],
236245
['hat', 'hats'],
237246
['hero', 'heroes'],
247+
['hippocampus', 'hippocampi'],
238248
['hippopotamus', 'hippopotami'], // hippopotamuses
239249
['hoax', 'hoaxes'],
240250
['hoof', ['hoofs', 'hooves']],
241251
['house', 'houses'],
252+
['icon', 'icons'],
242253
['index', ['indicies', 'indexes']],
243254
['ion', 'ions'],
244255
['iris', 'irises'],
@@ -251,6 +262,8 @@ public static function pluralizeProvider()
251262
['louse', 'lice'],
252263
['man', 'men'],
253264
['matrix', ['matricies', 'matrixes']],
265+
['medium', 'media'],
266+
['memorandum', 'memoranda'],
254267
['mouse', 'mice'],
255268
['move', 'moves'],
256269
['movie', 'movies'],
@@ -284,6 +297,7 @@ public static function pluralizeProvider()
284297
['shoe', 'shoes'],
285298
['species', 'species'],
286299
['status', ['status', 'statuses']],
300+
['stratum', 'strata'],
287301
['spy', 'spies'],
288302
['staff', 'staves'],
289303
['story', 'stories'],
@@ -297,9 +311,6 @@ public static function pluralizeProvider()
297311
['tree', 'trees'],
298312
['waltz', 'waltzes'],
299313
['wife', 'wives'],
300-
['icon', 'icons'],
301-
['hippocampus', 'hippocampi'],
302-
['campus', 'campuses'],
303314

304315
// test casing: if the first letter was uppercase, it should remain so
305316
['Man', 'Men'],

0 commit comments

Comments
 (0)