--- /dev/null
+<?php
+/**
+ * Write a messages array as a PHP text.
+ *
+ * @addtogroup Maintenance
+ */
+
+require_once( 'messages.inc' );
+require_once( 'messageTypes.inc' );
+
+/**
+ * Write a messages array as a PHP text and write it to the messages file.
+ *
+ * @param $messages The messages array.
+ * @param $code The language code.
+ * @param $write Write to the messages file?
+ * @param $listUnknown List the unknown messages?
+ */
+function writeMessagesToFile( $messages, $code, $write, $listUnknown ) {
+ # Rewrite the messages array
+ $messages = writeMessagesArray( $messages, $code == 'en' );
+ $messagesText = $messages[0];
+ $sortedMessages = $messages[1];
+
+ # Write to the file
+ $filename = Language::getMessagesFileName( $code );
+ $contents = file_get_contents( $filename );
+ if ( strpos( $contents, '$messages' ) !== false ) {
+ $contents = explode( '$messages', $contents );
+ if ( $messagesText == '$messages' . $contents[1] ) {
+ echo "Generated messages for language $code. Same as the current file.\n";
+ } else {
+ if ( $write ) {
+ $new = $contents[0];
+ $new .= $messagesText;
+ file_put_contents( $filename, $new );
+ echo "Generated and wrote messages for language $code.\n";
+ } else {
+ echo "Generated messages for language $code. Please run the script again (without the parameter \"dry-run\") to write the array to the file.\n";
+ }
+ }
+ if ( $listUnknown && isset( $sortedMessages['unknown'] ) && !empty( $sortedMessages['unknown'] ) ) {
+ echo "\nThere are " . count( $sortedMessages['unknown'] ) . " unknown messages, please check them:\n";
+ foreach ( $sortedMessages['unknown'] as $key => $value ) {
+ echo "* " . $key . "\n";
+ }
+ }
+ } else {
+ echo "Generated messages for language $code. There seems to be no messages array in the file.\n";
+ }
+}
+
+/**
+ * Write a messages array as a PHP text.
+ *
+ * @param $messages The messages array.
+ * @param $ignoredComments Show comments about ignored and optional messages? (For English.)
+ *
+ * @return Array of the PHP text and the sorted messages array.
+ */
+function writeMessagesArray( $messages, $ignoredComments = false ) {
+ global $wgMessageStructure, $wgBlockComments;
+
+ # Sort messages to blocks
+ $sortedMessages['unknown'] = $messages;
+ foreach ( $wgMessageStructure as $blockName => $block ) {
+ foreach ( $block as $key ) {
+ if ( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
+ $sortedMessages[$blockName][$key] = $sortedMessages['unknown'][$key];
+ unset( $sortedMessages['unknown'][$key] );
+ }
+ }
+ }
+
+ # Write all the messages
+ $messagesText = "\$messages = array(
+";
+ foreach( $sortedMessages as $block => $messages ) {
+ # Skip if it's the block of unknown messages - handle that in the end of file
+ if ( $block == 'unknown' ) {
+ continue;
+ }
+
+ # Write the block
+ $messagesText .= writeMessagesBlock( $block, $wgBlockComments[$block], $messages, $ignoredComments );
+ }
+ ksort( $sortedMessages['unknown'] );
+ $messagesText .= writeMessagesBlock( 'unknown', 'Unknown messages', $sortedMessages['unknown'], $ignoredComments ); # Write the unknown messages, alphabetically sorted
+ $messagesText .= ");
+";
+
+ return array( $messagesText, $sortedMessages );
+}
+
+/**
+ * Write a block of messages to PHP.
+ *
+ * @param $name The block name.
+ * @param $comment The block comment.
+ * @param $messages The block messages.
+ * @param $ignoredComments Show comments about ignored and optional messages? (For English.)
+ *
+ * @return The block, formatted in PHP.
+ */
+function writeMessagesBlock( $name, $comment, $messages, $ignoredComments ) {
+ global $wgMessageComments, $wgMessagseWithDollarSigns;
+ global $wgIgnoredMessages, $wgOptionalMessages;
+ $blockText = '';
+
+ # Skip the block if it includes no messages
+ if ( empty( $messages ) ) {
+ return '';
+ }
+
+ # Format the block comment (if exists); check for multiple lines comments
+ if ( !empty( $comment ) ) {
+ if ( strpos( $comment, "\n" ) === false ) {
+ $blockText .= "# $comment
+";
+ } else {
+ $blockText .= "/*
+$comment
+*/
+";
+ }
+ }
+
+ # Get max key length
+ $maxKeyLength = max( array_map( 'strlen', array_keys( $messages ) ) );
+
+ # Format the messages
+ foreach( $messages as $key => $value ) {
+ # Add the key name
+ $blockText .= "'$key'";
+
+ # Add the appropriate block whitespace
+ $blockText .= str_repeat( ' ', $maxKeyLength - strlen( $key ) );
+
+ # Refer to the value
+ $blockText .= ' => ';
+
+ # Check for the appropriate apostrophe and add the value
+ if ( strpos( $value, "'" ) === false ) {
+ $blockText .= "'$value'";
+ } elseif ( strpos( $value, '"' ) === false && !in_array( $key, $wgMessagseWithDollarSigns ) ) {
+ $blockText .= "\"$value\"";
+ } else {
+ # Pick the less numerous one to escape
+ $quote = substr_count( $value, '"' ) + substr_count( $value, '$' ) >= substr_count( $value, "'" ) ? "'" : '"';
+ if ('"' == $quote) { $extra = '$'; }
+ else { $extra = ''; }
+ $blockText .= $quote . addcslashes( $value, $quote.'\\'.$extra ) . $quote;
+ }
+
+ # Comma
+ $blockText .= ',';
+
+ $ignoredComment = "don't translate or duplicate this message to other languages";
+ $optionalComment = "only translate this message to other languages if you have to change it";
+ $showIgnoredOrOptionalComment = in_array( $key, $wgIgnoredMessages ) || in_array( $key, $wgOptionalMessages );
+ if ( $ignoredComments ) {
+ if ( array_key_exists( $key, $wgMessageComments ) ) {
+ $blockText .= ' # ' . $wgMessageComments[$key];
+ if ( $showIgnoredOrOptionalComment ) {
+ $blockText .= '; ';
+ }
+ } elseif ( $showIgnoredOrOptionalComment ) {
+ $blockText .= ' # ';
+ }
+ if ( in_array( $key, $wgIgnoredMessages ) ) {
+ $blockText .= $ignoredComment;
+ } elseif ( in_array( $key, $wgOptionalMessages ) ) {
+ $blockText .= $optionalComment;
+ }
+ } elseif ( array_key_exists( $key, $wgMessageComments ) ) {
+ $blockText .= ' # ' . $wgMessageComments[$key];
+ }
+
+ # Newline
+ $blockText .= "
+";
+ }
+
+ # Newline to end the block
+ $blockText .= "
+";
+
+ return $blockText;
+}
+
+?>