* : Path to an existing PO file or a directory containing multiple PO files. * * [] * : Path to the destination directory for the resulting MO files. Defaults to the source directory. * * ## EXAMPLES * * # Create MO files for all PO files in the current directory. * $ wp i18n make-mo . * * # Create a MO file from a single PO file in a specific directory. * $ wp i18n make-mo example-plugin-de_DE.po languages * * @when before_wp_load * * @throws WP_CLI\ExitException */ public function __invoke( $args, $assoc_args ) { $source = realpath( $args[0] ); if ( ! $source || ( ! is_file( $source ) && ! is_dir( $source ) ) ) { WP_CLI::error( 'Source file or directory does not exist!' ); } $destination = is_file( $source ) ? dirname( $source ) : $source; if ( isset( $args[1] ) ) { $destination = $args[1]; } // Two is_dir() checks in case of a race condition. if ( ! is_dir( $destination ) && ! mkdir( $destination, 0777, true ) && ! is_dir( $destination ) ) { WP_CLI::error( 'Could not create destination directory!' ); } if ( is_file( $source ) ) { $files = [ new SplFileInfo( $source ) ]; } else { $files = new IteratorIterator( new DirectoryIterator( $source ) ); } $result_count = 0; /** @var DirectoryIterator $file */ foreach ( $files as $file ) { if ( 'po' !== $file->getExtension() ) { continue; } if ( ! $file->isFile() || ! $file->isReadable() ) { WP_CLI::warning( sprintf( 'Could not read file %s', $file->getFilename() ) ); continue; } $file_basename = basename( $file->getFilename(), '.po' ); $destination_file = "{$destination}/{$file_basename}.mo"; $translations = Translations::fromPoFile( $file->getPathname() ); if ( ! $translations->toMoFile( $destination_file ) ) { WP_CLI::warning( sprintf( 'Could not create file %s', $destination_file ) ); continue; } $result_count++; } WP_CLI::success( sprintf( 'Created %d %s.', $result_count, Utils\pluralize( 'file', $result_count ) ) ); } }