Creating an improved script to check language files, adding the ignored messages...
authorRotem Liss <rotem@users.mediawiki.org>
Sat, 5 Aug 2006 15:31:05 +0000 (15:31 +0000)
committerRotem Liss <rotem@users.mediawiki.org>
Sat, 5 Aug 2006 15:31:05 +0000 (15:31 +0000)
maintenance/checkLanguage.php [new file with mode: 0644]
maintenance/languages.inc

diff --git a/maintenance/checkLanguage.php b/maintenance/checkLanguage.php
new file mode 100644 (file)
index 0000000..0ec7771
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Run this script to check a specific language file. If you don't specify
+ * the language code, the script will run on the default installation.
+ *
+ * @package MediaWiki
+ * @subpackage Maintenance
+ */
+
+require_once( 'commandLine.inc' );
+require_once( 'languages.inc' );
+
+# Get the language code
+if ( isset( $args[0] ) ) {
+       $code = $args[0];
+} else {
+       $code = $wgLang->getCode();
+}
+
+# Can't check English
+if ( $code == 'en' ) {
+       echo "Current selected language is English, which cannot be checked.\n";
+       exit();
+}
+
+# Get language objects
+$wgLanguages = new languages();
+
+# Get messages number
+$englishMessagesNumber = count( $wgLanguages->getMessagesFor( 'en' ) );
+$localMessagesNumber = count( $wgLanguages->getMessagesFor( $code ) );
+
+# Show numbers of defined messages
+echo "There are $englishMessagesNumber messages in en.\n";
+echo "There are $localMessagesNumber messages in $code.\n";
+
+# Untranslated messages
+$untranslatedMessages = $wgLanguages->getUntranslatedMessages( $code );
+$untranslatedMessagesNumber = count( $untranslatedMessages );
+$wgLanguages->outputMessagesList( $untranslatedMessages, "\n$untranslatedMessagesNumber messages of $englishMessagesNumber are not translated to $code, but exist in en:" );
+
+# Duplicate messages
+$duplicateMessages = $wgLanguages->getDuplicateMessages( $code );
+$duplicateMessagesNumber = count( $duplicateMessages );
+$wgLanguages->outputMessagesList( $duplicateMessages, "\n$duplicateMessagesNumber messages of $localMessagesNumber are translated the same in en and $code:" );
+
+# Obsolete messages
+$obsoleteMessages = $wgLanguages->getObsoleteMessages( $code );
+$obsoleteMessagesNumber = count( $obsoleteMessages );
+$wgLanguages->outputMessagesList( $obsoleteMessages, "\n$obsoleteMessagesNumber messages of $localMessagesNumber are not exist in en, but still exist in $code:" );
+
+?>
index d61df62..35d0f8f 100644 (file)
 <?php
 /**
- * Library to grab data from languages files
+ * Handle messages in the language files.
  *
- * WORK IN PROGRESS. There is some bugs when including the same
- * file multiple time :(((
+ * @package MediaWiki
+ * @subpackage Maintenance
  */
-require_once('commandLine.inc');
 
 class languages {
-       /** Contain the list of languages available */
-       var $list = array();
-       /** some messages for the current lang */
-       var $messages = array();
+       private $mList = array();
+       private $mMessages = array();
+       private $mIgnoredMessages = array(
+               'sidebar',
+               'addsection',
+               'anonnotice',
+               'catseparator',
+               'googlesearch',
+               'exif-make-value',
+               'exif-model-value',
+               'exif-software-value',
+               'history_copyright',
+               'licenses',
+               'linkprefix',
+               'linktrail',
+               'loginend',
+               'loginlanguagelinks',
+               'markaspatrolledlink',
+               'metadata-fields', // Objection, contains help
+               'newarticletextanon',
+               'noarticletextanon',
+               'number_of_watching_users_RCview',
+               'pubmedurl',
+               'randompage-url',
+               'recentchanges-url',
+               'rfcurl',
+               'shareddescriptionfollows',
+               'signupend',
+               'sitenotice',
+               'sitesubtitle',
+               'sitetitle',
+               'talkpagetext',
+               'trackback',
+               'trackbackexcerpt',
+               'widthheight',
+       );
 
+       /**
+        * Load the list of languages: all the Messages*.php
+        * files in the languages directory.
+        */
        function __construct() {
-               $this->clear();
-               $this->loadList();
+               global $IP;
+               $dir = opendir("$IP/languages");
+               while ( $file = readdir( $dir ) ) {
+                       if ( preg_match( "/Messages([^.]*?)\.php$/", $file, $matches ) ) {
+                               $this->mList[] = $matches[1];
+                       }
+               }
+               sort($this->mList);
        }
 
-       function clear() {
-               $this->list = array();
-               $this->messages = array();
+       /**
+        * Get the language list.
+        *
+        * @return the language list
+        */
+       public function getList() {
+               return $this->mList;
        }
 
-       function loadList() {
-               global $IP;
-               $this->list = array();
+       /**
+        * Load the messages for a specific langauge from the messages file.
+        *
+        * @param $code The langauge code.
+        */
+       private function loadMessages( $code ) {
+               if ( !isset( $this->mMessages[$code] ) ) {
+                       global $IP;
+                       $filename = Language::getFileName( "$IP/languages/Messages", $code, '.php' );
+                       if ( file_exists( $filename ) ) {
+                               require( $filename );
+                               if ( isset( $messages ) ) {
+                                       $this->mMessages[$code] = $messages;
+                               } else {
+                                       $this->mMessages[$code] = array();
+                               }
+                       } else {
+                               $this->mMessages[$code] = array();
+                       }
+               }
+       }
 
-               // available language files
-               $dir = opendir("$IP/languages");
-               while ($file = readdir($dir)) {
-                       if (preg_match("/Messages([^.]*?)\.php$/", $file, $m)) {
-                               $this->list[] = $m[1];
+       /**
+        * Get all the messages for a specific langauge, without the fallback
+        * language messages.
+        *
+        * @param $code The langauge code.
+        *
+        * @return The messages in this language.
+        */
+       public function getMessagesFor( $code ) {
+               $this->loadMessages( $code );
+               return $this->mMessages[$code];
+       }
+
+       /**
+        * Get all the messages of all the languages.
+        */
+       public function getAllMessages() {
+               foreach ( $this->mList as $code ) {
+                       $this->getMessages( $code );
+               }
+       }
+
+       /**
+        * Get the untranslated messages for a specific language.
+        *
+        * @param $code The langauge code.
+        *
+        * @return The untranslated messages for this language.
+        */
+       public function getUntranslatedMessages( $code ) {
+               $this->loadMessages( 'en' );
+               $this->loadMessages( $code );
+               $untranslatedMessages = array();
+               foreach ( $this->mMessages['en'] as $key => $value ) {
+                       if ( !isset( $this->mMessages[$code][$key] ) && !in_array( $key, $this->mIgnoredMessages ) ) {
+                               $untranslatedMessages[$key] = $value;
                        }
                }
-               sort($this->list);
+               return $untranslatedMessages;
        }
 
-       function getList() { return $this->list; }
+       /**
+        * Get the duplicate messages for a specific language.
+        *
+        * @param $code The langauge code.
+        *
+        * @return The duplicate messages for this language.
+        */
+       public function getDuplicateMessages( $code ) {
+               $this->loadMessages( 'en' );
+               $this->loadMessages( $code );
+               $duplicateMessages = array();
+               foreach ( $this->mMessages[$code] as $key => $value ) {
+                       if ( @$this->mMessages['en'][$key] == $value ) {
+                               $duplicateMessages[$key] = $value;
+                       }
+               }
+               return $duplicateMessages;
+       }
+
+       /**
+        * Get the obsolete messages for a specific language.
+        *
+        * @param $code The langauge code.
+        *
+        * @return The obsolete messages for this language.
+        */
+       public function getObsoleteMessages( $code ) {
+               $this->loadMessages( 'en' );
+               $this->loadMessages( $code );
+               $obsoleteMessages = array();
+               foreach ( $this->mMessages[$code] as $key => $value ) {
+                       if ( !isset( $this->mMessages['en'][$key] ) ) {
+                               $obsoleteMessages[$key] = $value;
+                       }
+               }
+               return $obsoleteMessages;
+       }
+
+       /**
+        * Output a messages list.
+        *
+        * @param $messages The messages list.
+        * @param $text The text to show before the list (optional).
+        */
+       public function outputMessagesList( $messages, $text = '' ) {
+               if ( count( $messages ) > 0 ) {
+                       if ( $text ) {
+                               echo "$text\n";
+                       }
+                       foreach ( array_keys( $messages ) as $key ) {
+                               echo "* $key\n";
+                       }
+               }
+       }
 }
+
 ?>