--- /dev/null
+<?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:" );
+
+?>
<?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";
+ }
+ }
+ }
}
+
?>