]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blobdiff - maintenance/language/writeMessagesArray.inc
MediaWiki 1.11.0
[autoinstalls/mediawiki.git] / maintenance / language / writeMessagesArray.inc
diff --git a/maintenance/language/writeMessagesArray.inc b/maintenance/language/writeMessagesArray.inc
new file mode 100644 (file)
index 0000000..bcbf05e
--- /dev/null
@@ -0,0 +1,191 @@
+<?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;
+}
+
+?>