@@ -370,12 +370,26 @@ private function install_many( $args, $assoc_args ) {
370370 *
371371 * ## OPTIONS
372372 *
373- * <plugin>
373+ * [ <plugin>]
374374 * : Plugin to uninstall language for.
375375 *
376+ * [--all]
377+ * : If set, languages for all plugins will be uninstalled.
378+ *
376379 * <language>...
377380 * : Language code to uninstall.
378381 *
382+ * [--format=<format>]
383+ * : Render output in a particular format. Used when installing languages for all plugins.
384+ * ---
385+ * default: table
386+ * options:
387+ * - table
388+ * - csv
389+ * - json
390+ * - summary
391+ * ---
392+ *
379393 * ## EXAMPLES
380394 *
381395 * $ wp language plugin uninstall hello-dolly ja
@@ -387,7 +401,32 @@ public function uninstall( $args, $assoc_args ) {
387401 /** @var WP_Filesystem_Base $wp_filesystem */
388402 global $ wp_filesystem ;
389403
390- $ plugin = array_shift ( $ args );
404+ if ( empty ( $ assoc_args ['format ' ] ) ) {
405+ $ assoc_args ['format ' ] = 'table ' ;
406+ }
407+
408+ if ( in_array ( $ assoc_args ['format ' ], array ( 'json ' , 'csv ' ), true ) ) {
409+ $ logger = new \WP_CLI \Loggers \Quiet ();
410+ \WP_CLI ::set_logger ( $ logger );
411+ }
412+
413+ $ all = \WP_CLI \Utils \get_flag_value ( $ assoc_args , 'all ' , false );
414+
415+ if ( ! $ all && count ( $ args ) < 2 ) {
416+ \WP_CLI ::error ( 'Please specify one or more plugins, or use --all. ' );
417+ }
418+
419+ if ( $ all ) {
420+ $ plugins = array_map ( '\WP_CLI\Utils\get_plugin_name ' , array_keys ( $ this ->get_all_plugins () ) );
421+
422+ if ( empty ( $ plugins ) ) {
423+ WP_CLI ::success ( 'No plugins installed. ' );
424+ return ;
425+ }
426+ } else {
427+ $ plugins = array ( array_shift ( $ args ) );
428+ }
429+
391430 $ language_codes = (array ) $ args ;
392431 $ current_locale = get_locale ();
393432
@@ -400,24 +439,87 @@ public function uninstall( $args, $assoc_args ) {
400439
401440 // As of WP 4.0, no API for deleting a language pack
402441 WP_Filesystem ();
403- $ available = $ this ->get_installed_languages ( $ plugin );
404442
405- foreach ( $ language_codes as $ language_code ) {
406- if ( ! in_array ( $ language_code , $ available , true ) ) {
407- \WP_CLI ::error ( 'Language not installed. ' );
408- }
443+ $ count = count ( $ plugins ) * count ( $ language_codes );
409444
410- if ( $ language_code === $ current_locale ) {
411- \WP_CLI ::warning ( "The ' {$ language_code }' language is active. " );
412- exit ;
413- }
445+ $ results = array ();
414446
415- if ( $ wp_filesystem ->delete ( "{$ dir }/ {$ plugin }- {$ language_code }.po " ) && $ wp_filesystem ->delete ( "{$ dir }/ {$ plugin }- {$ language_code }.mo " ) ) {
416- \WP_CLI ::success ( 'Language uninstalled. ' );
417- } else {
418- \WP_CLI ::error ( "Couldn't uninstall language. " );
447+ $ successes = 0 ;
448+ $ errors = 0 ;
449+ $ skips = 0 ;
450+
451+ foreach ( $ plugins as $ plugin ) {
452+ $ available = $ this ->get_installed_languages ( $ plugin );
453+
454+ foreach ( $ language_codes as $ language_code ) {
455+ $ result = [
456+ 'name ' => $ plugin ,
457+ 'locale ' => $ language_code ,
458+ 'status ' => 'not available ' ,
459+ ];
460+
461+ if ( ! in_array ( $ language_code , $ available , true ) ) {
462+ $ result ['status ' ] = 'not installed ' ;
463+ \WP_CLI ::warning ( "Language ' {$ language_code }' not installed. " );
464+ if ( $ all ) {
465+ ++$ skips ;
466+ } else {
467+ ++$ errors ;
468+ }
469+ $ results [] = (object ) $ result ;
470+ continue ;
471+ }
472+
473+ if ( $ language_code === $ current_locale ) {
474+ \WP_CLI ::warning ( "The ' {$ language_code }' language is active. " );
475+ exit ;
476+ }
477+
478+ $ po_file = "{$ dir }/ {$ plugin }- {$ language_code }.po " ;
479+ $ mo_file = "{$ dir }/ {$ plugin }- {$ language_code }.mo " ;
480+
481+ $ files_to_remove = array ( $ po_file , $ mo_file );
482+
483+ $ count_files_removed = 0 ;
484+ $ had_one_file = 0 ;
485+ foreach ( $ files_to_remove as $ file ) {
486+ if ( $ wp_filesystem ->exists ( $ file ) ) {
487+ $ had_one_file = 1 ;
488+ if ( $ wp_filesystem ->delete ( $ file ) ) {
489+ ++$ count_files_removed ;
490+ } else {
491+ \WP_CLI ::error ( "Couldn't uninstall language: $ language_code from plugin $ plugin. " );
492+ }
493+ }
494+ }
495+
496+ if ( count ( $ files_to_remove ) === $ count_files_removed ) {
497+ $ result ['status ' ] = 'uninstalled ' ;
498+ ++$ successes ;
499+ \WP_CLI ::log ( "Language ' {$ language_code }' for ' {$ plugin }' uninstalled. " );
500+ } elseif ( $ count_files_removed ) {
501+ \WP_CLI ::log ( "Language ' {$ language_code }' for ' {$ plugin }' partially uninstalled. " );
502+ $ result ['status ' ] = 'partial uninstall ' ;
503+ ++$ errors ;
504+ } elseif ( $ had_one_file ) { /* $count_files_removed == 0 */
505+ \WP_CLI ::log ( "Couldn't uninstall language ' {$ language_code }' from plugin {$ plugin }. " );
506+ $ result ['status ' ] = 'failed to uninstall ' ;
507+ ++$ errors ;
508+ } else {
509+ \WP_CLI ::log ( "Language ' {$ language_code }' for ' {$ plugin }' already uninstalled. " );
510+ $ result ['status ' ] = 'already uninstalled ' ;
511+ ++$ skips ;
512+ }
513+
514+ $ results [] = (object ) $ result ;
419515 }
420516 }
517+
518+ if ( 'summary ' !== $ assoc_args ['format ' ] ) {
519+ \WP_CLI \Utils \format_items ( $ assoc_args ['format ' ], $ results , array ( 'name ' , 'locale ' , 'status ' ) );
520+ }
521+
522+ \WP_CLI \Utils \report_batch_operation_results ( 'language ' , 'uninstall ' , $ count , $ successes , $ errors , $ skips );
421523 }
422524
423525 /**
0 commit comments