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 ;
@@ -81,6 +84,7 @@ protected function configure()
81
84
new InputOption ('only-missing ' , null , InputOption::VALUE_NONE , 'Displays only missing messages ' ),
82
85
new InputOption ('only-unused ' , null , InputOption::VALUE_NONE , 'Displays only unused messages ' ),
83
86
new InputOption ('all ' , null , InputOption::VALUE_NONE , 'Load messages from all registered bundles ' ),
87
+ new InputOption ('strict ' , null , InputOption::VALUE_OPTIONAL , 'Returns a non-zero exit code upon failure ' , false ),
84
88
))
85
89
->setDescription ('Displays translation messages information ' )
86
90
->setHelp (<<<'EOF'
@@ -126,6 +130,11 @@ protected function execute(InputInterface $input, OutputInterface $output)
126
130
127
131
$ locale = $ input ->getArgument ('locale ' );
128
132
$ domain = $ input ->getOption ('domain ' );
133
+
134
+ $ strictOption = $ input ->getOption ('strict ' );
135
+ $ strictnessLevel = $ this ->getStrictnessLevel ($ strictOption );
136
+ $ exitCode = 0 ;
137
+
129
138
/** @var KernelInterface $kernel */
130
139
$ kernel = $ this ->getApplication ()->getKernel ();
131
140
$ rootDir = $ kernel ->getContainer ()->getParameter ('kernel.root_dir ' );
@@ -240,7 +249,11 @@ protected function execute(InputInterface $input, OutputInterface $output)
240
249
241
250
$ io ->getErrorStyle ()->warning ($ outputMessage );
242
251
243
- return ;
252
+ if (null !== $ strictnessLevel ) {
253
+ $ exitCode = 1 ;
254
+ }
255
+
256
+ return $ exitCode ;
244
257
}
245
258
246
259
// Load the fallback catalogues
@@ -261,9 +274,17 @@ protected function execute(InputInterface $input, OutputInterface $output)
261
274
if ($ extractedCatalogue ->defines ($ messageId , $ domain )) {
262
275
if (!$ currentCatalogue ->defines ($ messageId , $ domain )) {
263
276
$ states [] = self ::MESSAGE_MISSING ;
277
+
278
+ if (null !== $ strictnessLevel && $ strictnessLevel <= self ::MESSAGE_MISSING ) {
279
+ $ exitCode = $ exitCode | 1 ;
280
+ }
264
281
}
265
282
} elseif ($ currentCatalogue ->defines ($ messageId , $ domain )) {
266
283
$ states [] = self ::MESSAGE_UNUSED ;
284
+
285
+ if (null !== $ strictnessLevel && $ strictnessLevel <= self ::MESSAGE_UNUSED ) {
286
+ $ exitCode = $ exitCode | 1 ;
287
+ }
267
288
6D40
}
268
289
269
290
if (!\in_array (self ::MESSAGE_UNUSED , $ states ) && true === $ input ->getOption ('only-unused ' )
@@ -275,6 +296,10 @@ protected function execute(InputInterface $input, OutputInterface $output)
275
296
if ($ fallbackCatalogue ->defines ($ messageId , $ domain ) && $ value === $ fallbackCatalogue ->get ($ messageId , $ domain )) {
276
297
$ states [] = self ::MESSAGE_EQUALS_FALLBACK ;
277
298
299
+ if (null !== $ strictnessLevel && $ strictnessLevel <= self ::MESSAGE_EQUALS_FALLBACK ) {
300
+ $ exitCode = $ exitCode | 1 ;
301
+ }
302
+
278
303
break ;
279
304
}
280
305
}
@@ -289,20 +314,22 @@ protected function execute(InputInterface $input, OutputInterface $output)
289
314
}
290
315
291
316
$ io ->table ($ headers , $ rows );
317
+
318
+ return $ exitCode ;
292
319
}
293
320
294
321
private function formatState ($ state ): string
295
322
{
296
323
if (self ::MESSAGE_MISSING === $ state ) {
297
- return '<error> missing </error> ' ;
324
+ return '<error> ' . self :: DISPLAY_MESSAGE_MISSING . ' </error> ' ;
298
325
}
299
326
300
327
if (self ::MESSAGE_UNUSED === $ state ) {
301
- return '<comment> unused </comment> ' ;
328
+ return '<comment> ' . self :: DISPLAY_MESSAGE_UNUSED . ' </comment> ' ;
302
329
}
303
330
304
331
if (self ::MESSAGE_EQUALS_FALLBACK === $ state ) {
305
- return '<info> fallback </info> ' ;
332
+ return '<info> ' . self :: DISPLAY_MESSAGE_FALLBACK . ' </info> ' ;
306
333
}
307
334
308
335
return $ state ;
@@ -386,4 +413,24 @@ private function loadFallbackCatalogues(string $locale, array $transPaths): arra
386
413
387
414
return $ fallbackCatalogues ;
388
415
}
416
+
417
+ /**
418
+ * @param string|false $strictArg
419
+ * @return int|null|false strictness level, using MESSAGE_* values
420
+ */
421
+ private function getStrictnessLevel ($ strictArg )
422
+ {
423
+ switch ($ strictArg ) {
424
+ case self ::DISPLAY_MESSAGE_FALLBACK :
425
+ return self ::MESSAGE_EQUALS_FALLBACK ;
426
+ case self ::DISPLAY_MESSAGE_UNUSED :
427
+ return self ::MESSAGE_UNUSED ;
428
+ case self ::DISPLAY_MESSAGE_MISSING :
429
+ return self ::MESSAGE_MISSING ;
430
+ case null :
431
+ return null ;
432
+ default :
433
+ return false ;
434
+ }
435
+ }
389
436
}
0 commit comments