39
39
*/
40
40
class TranslationDebugCommand extends Command
41
41
{
42
+ const DISPLAY_MESSAGE_MISSING = 'missing ' ;
43
+ const DISPLAY_MESSAGE_UNUSED = 'unused ' ;
44
+ const DISPLAY_MESSAGE_FALLBACK = 'fallback ' ;
42
45
const MESSAGE_MISSING = 0 ;
43
46
const MESSAGE_UNUSED = 1 ;
44
47
const MESSAGE_EQUALS_FALLBACK = 2 ;
@@ -85,6 +88,7 @@ protected function configure()
85
88
new InputOption ('only-missing ' , null , InputOption::VALUE_NONE , 'Displays only missing messages ' ),
86
89
new InputOption ('only-unused ' , null , InputOption::VALUE_NONE , 'Displays only unused messages ' ),
87
90
new InputOption ('all ' , null , InputOption::VALUE_NONE , 'Load messages from all registered bundles ' ),
91
+ new InputOption ('strict ' , null , InputOption::VALUE_OPTIONAL , 'Returns a non-zero exit code upon failure ' , false ),
88
92
])
89
93
->setDescription ('Displays translation messages information ' )
90
94
->setHelp (<<<'EOF'
@@ -130,6 +134,11 @@ protected function execute(InputInterface $input, OutputInterface $output)
130
134
131
135
$ locale = $ input ->getArgument ('locale ' );
132
136
$ domain = $ input ->getOption ('domain ' );
137
+
138
+ $ strictOption = $ input ->getOption ('strict ' );
139
+ $ strictnessLevel = $ this ->getStrictnessLevel ($ strictOption );
140
+ $ exitCode = 0 ;
141
+
133
142
/** @var KernelInterface $kernel */
134
143
$ kernel = $ this ->getApplication ()->getKernel ();
135
144
$ rootDir = $ kernel ->getContainer ()->getParameter ('kernel.root_dir ' );
@@ -244,7 +253,11 @@ protected function execute(InputInterface $input, OutputInterface $output)
244
253
245
254
$ io ->getErrorStyle ()->warning ($ outputMessage );
246
255
247
- return ;
256
+ if (null !== $ strictnessLevel ) {
257
+ $ exitCode = 1 ;
258
+ }
259
+
260
+ return $ exitCode ;
248
261
}
249
262
250
263
// Load the fallback catalogues
@@ -265,9 +278,17 @@ protected function execute(InputInterface $input, OutputInterface $output)
265
278
if ($ extractedCatalogue ->defines ($ messageId , $ domain )) {
266
279
if (!$ currentCatalogue ->defines ($ messageId , $ domain )) {
267
280
$ states [] = self ::MESSAGE_MISSING ;
281
+
282
+ if (null !== $ strictnessLevel && $ strictnessLevel <= self ::MESSAGE_MISSING ) {
283
+ $ exitCode = $ exitCode | 1 ;
284
+ }
268
285
}
269
286
} elseif ($ currentCatalogue ->defines ($ messageId , $ domain )) {
270
287
$ states [] = self ::MESSAGE_UNUSED ;
288
+
289
+ if (null !== $ strictnessLevel && $ strictnessLevel <= self ::MESSAGE_UNUSED ) {
290
+ $ exitCode = $ exitCode | 1 ;
291
+ }
271
292
}
272
293
273
294
if (!\in_array (self ::MESSAGE_UNUSED , $ states ) && true === $ input ->getOption ('only-unused ' )
@@ -279,6 +300,10 @@ protected function execute(InputInterface $input, OutputInterface $output)
279
300
if ($ fallbackCatalogue ->defines ($ messageId , $ domain ) && $ value === $ fallbackCatalogue ->get ($ messageId , $ domain )) {
280
301
$ states [] = self ::MESSAGE_EQUALS_FALLBACK ;
281
302
303
+ if (null !== $ strictnessLevel && $ strictnessLevel <= self ::MESSAGE_EQUALS_FALLBACK ) {
304
+ $ exitCode = $ exitCode | 1 ;
305
+ }
306
+
282
307
break ;
283
308
}
284
309
}
@@ -293,20 +318,22 @@ protected function execute(InputInterface $input, OutputInterface $output)
293
318
}
294
319
295
320
$ io ->table ($ headers , $ rows );
321
+
322
+ return $ exitCode ;
296
323
}
297
324
298
325
private function formatState ($ state ): string
299
326
{
300
327
if (self ::MESSAGE_MISSING === $ state ) {
301
- return '<error> missing </error> ' ;
328
+ return '<error> ' . self :: DISPLAY_MESSAGE_MISSING . ' </error> ' ;
302
329
}
303
330
304
331
if (self ::MESSAGE_UNUSED === $ state ) {
305
- return '<comment> unused </comment> ' ;
332
+ return '<comment> ' . self :: DISPLAY_MESSAGE_UNUSED . ' </comment> ' ;
306
333
}
307
334
308
335
if (self ::MESSAGE_EQUALS_FALLBACK === $ state ) {
309
- return '<info> fallback </info> ' ;
336
+ return '<info> ' . self :: DISPLAY_MESSAGE_FALLBACK . ' </info> ' ;
310
337
}
311
338
312
339
return $ state ;
@@ -390,4 +417,25 @@ private function loadFallbackCatalogues(string $locale, array $transPaths): arra
390
417
391
418
return $ fallbackCatalogues ;
392
419
}
420
+
421
+ /**
422
+ * @param string|false $strictArg
423
+ *
424
+ * @return int|false|null strictness level, using MESSAGE_* values
425
+ */
426
+ private function getStrictnessLevel ($ strictArg )
427
+ {
428
+ switch ($ strictArg ) {
429
+ case self ::DISPLAY_MESSAGE_FALLBACK :
430
+ return self ::MESSAGE_EQUALS_FALLBACK ;
431
+ case self ::DISPLAY_MESSAGE_UNUSED :
432
+ return self ::MESSAGE_UNUSED ;
433
+ case self ::DISPLAY_MESSAGE_MISSING :
434
+ return self ::MESSAGE_MISSING ;
435
+ case null :
436
+ return null ;
437
+ default :
438
+ return false ;
439
+ }
440
+ }
393
441
}
0 commit comments