diff --git a/README.md b/README.md index 10adbe2..79c2457 100644 --- a/README.md +++ b/README.md @@ -245,6 +245,9 @@ wp i18n make-php [] [] Path to the destination directory for the resulting PHP files. Defaults to the source directory. + [--pretty-print] + Pretty-print resulting PHP files. + **EXAMPLES** # Create PHP files for all PO files in the current directory. diff --git a/features/makephp.feature b/features/makephp.feature index 15972e2..23dd2ba 100644 --- a/features/makephp.feature +++ b/features/makephp.feature @@ -259,3 +259,63 @@ Feature: Generate PHP files from PO files """ new message """ + + Scenario: Should create pretty-printed PHP files + Given an empty foo-plugin directory + And a foo-plugin/foo-plugin-de_DE.po file: + """ + # Copyright (C) 2018 Foo Plugin + # This file is distributed under the same license as the Foo Plugin package. + msgid "" + msgstr "" + "Project-Id-Version: Foo Plugin\n" + "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/foo-plugin\n" + "Last-Translator: FULL NAME \n" + "Language-Team: LANGUAGE \n" + "Language: de_DE\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "POT-Creation-Date: 2018-05-02T22:06:24+00:00\n" + "PO-Revision-Date: 2018-05-02T22:06:24+00:00\n" + "X-Domain: foo-plugin\n" + "Plural-Forms: nplurals=2; plural=(n != 1);\n" + + #: foo-plugin.js:15 + msgid "Foo Plugin" + msgstr "Foo Plugin" + + #: foo-plugin.js:16 + msgid "Hello" + msgstr "Hallo" + + #: foo-plugin.js:17 + msgid "You have %d new message" + msgid_plural "You have %d new messages" + msgstr[0] "Du hast %d neue Nachricht" + msgstr[1] "Du hast %d neue Nachrichten" + """ + + When I run `wp i18n make-php foo-plugin --pretty-print` + Then STDOUT should contain: + """ + Success: Created 1 file. + """ + And the return code should be 0 + And the foo-plugin/foo-plugin-de_DE.l10n.php file should contain: + """ + 'foo-plugin', + 'plural-forms' => 'nplurals=2; plural=(n != 1);', + 'language' => 'de_DE', + 'project-id-version' => 'Foo Plugin', + 'pot-creation-date' => '2018-05-02T22:06:24+00:00', + 'po-revision-date' => '2018-05-02T22:06:24+00:00', + 'messages' => [ + 'Foo Plugin' => 'Foo Plugin', + 'Hello' => 'Hallo', + 'You have %d new message' => 'Du hast %d neue Nachricht' . "\0" . 'Du hast %d neue Nachrichten', + ], + ]; + """ diff --git a/src/MakePhpCommand.php b/src/MakePhpCommand.php index 3c3b559..825929a 100644 --- a/src/MakePhpCommand.php +++ b/src/MakePhpCommand.php @@ -22,6 +22,9 @@ class MakePhpCommand extends WP_CLI_Command { * [] * : Path to the destination directory for the resulting PHP files. Defaults to the source directory. * + * [--pretty-print] + * : Pretty-print resulting PHP files. + * * ## EXAMPLES * * # Create PHP files for all PO files in the current directory. @@ -58,6 +61,8 @@ public function __invoke( $args, $assoc_args ) { } $result_count = 0; + $pretty_print = Utils\get_flag_value( $assoc_args, 'pretty-print', false ); + /** @var DirectoryIterator $file */ foreach ( $files as $file ) { if ( 'po' !== $file->getExtension() ) { @@ -73,7 +78,7 @@ public function __invoke( $args, $assoc_args ) { $destination_file = "{$destination}/{$file_basename}.l10n.php"; $translations = Translations::fromPoFile( $file->getPathname() ); - if ( ! PhpArrayGenerator::toFile( $translations, $destination_file ) ) { + if ( ! PhpArrayGenerator::toFile( $translations, $destination_file, [ 'prettyPrint' => $pretty_print ] ) ) { WP_CLI::warning( sprintf( 'Could not create file %s', $destination_file ) ); continue; } diff --git a/src/PhpArrayGenerator.php b/src/PhpArrayGenerator.php index d76efc5..7946c2d 100644 --- a/src/PhpArrayGenerator.php +++ b/src/PhpArrayGenerator.php @@ -14,6 +14,7 @@ class PhpArrayGenerator extends PhpArray { public static $options = [ 'includeHeaders' => false, + 'prettyPrint' => false, ]; /** @@ -22,7 +23,15 @@ class PhpArrayGenerator extends PhpArray { public static function toString( Translations $translations, array $options = [] ) { $array = static::generate( $translations, $options ); - return ' $value ) { + $result .= $indent . str_repeat( ' ', $indentation ) . "'$key' => "; + + if ( is_array( $value ) ) { + $result .= self::pretty_export( $value, $indentation + $indentation, false ); + } elseif ( strpos( $value, "\0" ) !== false ) { + $parts = explode( "\0", $value ); + $result .= "'" . implode( "' . \"\\0\" . '", array_map( 'addslashes', $parts ) ) . "'"; + } else { + $result .= "'$value'"; + } + + $result .= ',' . PHP_EOL; + } + + $result .= $is_top_level ? ']' : $indent . ']'; + return $result; + } }