From 086ae52d12011746a75f5588e877347bc0457352 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Fri, 21 Mar 2008 11:49:34 +0100 Subject: Update auf MediaWiki 1.12.0 --- maintenance/language/StatOutputs.php | 103 ++++++++ maintenance/language/checkLanguage.inc | 128 ++-------- maintenance/language/checkLanguage.php | 323 +++++++++++++++++++++---- maintenance/language/lang2po.php | 14 +- maintenance/language/languages.inc | 113 +++++---- maintenance/language/messageTypes.inc | 70 ++++++ maintenance/language/messages.inc | 297 ++++++++++++++++++----- maintenance/language/rebuildLanguage.php | 2 +- maintenance/language/splitLanguageFiles.inc | 1 - maintenance/language/transstat.php | 96 +------- maintenance/language/writeMessagesArray.inc | 360 ++++++++++++++++------------ 11 files changed, 991 insertions(+), 516 deletions(-) create mode 100644 maintenance/language/StatOutputs.php (limited to 'maintenance/language') diff --git a/maintenance/language/StatOutputs.php b/maintenance/language/StatOutputs.php new file mode 100644 index 00000000..50829cbe --- /dev/null +++ b/maintenance/language/StatOutputs.php @@ -0,0 +1,103 @@ + + * @author Ashar Voultoiz + */ + +/** A general output object. Need to be overriden */ +class statsOutput { + function formatPercent( $subset, $total, $revert = false, $accuracy = 2 ) { + return @sprintf( '%.' . $accuracy . 'f%%', 100 * $subset / $total ); + } + + # Override the following methods + function heading() { + } + function footer() { + } + function blockstart() { + } + function blockend() { + } + function element( $in, $heading = false ) { + } +} + +/** Outputs WikiText */ +class wikiStatsOutput extends statsOutput { + function heading() { + global $IP; + $version = SpecialVersion::getVersion( $IP ); + echo "'''Statistics are based on:''' " . $version . "\n\n"; + echo "'''Note:''' These statistics can be generated by running php maintenance/language/transstat.php.\n\n"; + echo "For additional information on specific languages (the message names, the actual problems, etc.), run php maintenance/language/checkLanguage.php --lang=foo.\n\n"; + echo '{| class="sortable wikitable" border="2" cellpadding="4" cellspacing="0" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse; clear:both;" width="100%"'."\n"; + } + function footer() { + echo "|}\n"; + } + function blockstart() { + echo "|-\n"; + } + function blockend() { + echo ''; + } + function element( $in, $heading = false ) { + echo ($heading ? '!' : '|') . " $in\n"; + } + function formatPercent( $subset, $total, $revert = false, $accuracy = 2 ) { + $v = @round(255 * $subset / $total); + if ( $revert ) { + $v = 255 - $v; + } + if ( $v < 128 ) { + # Red to Yellow + $red = 'FF'; + $green = sprintf( '%02X', 2 * $v ); + } else { + # Yellow to Green + $red = sprintf('%02X', 2 * ( 255 - $v ) ); + $green = 'FF'; + } + $blue = '00'; + $color = $red . $green . $blue; + + $percent = statsOutput::formatPercent( $subset, $total, $revert, $accuracy ); + return 'bgcolor="#'. $color .'" | '. $percent; + } +} + +/** Outputs WikiText and appends category and text only used for Meta-Wiki */ +class metawikiStatsOutput extends wikiStatsOutput { + function heading() { + echo "See [[MediaWiki localisation]] to learn how you can help translating MediaWiki.\n\n"; + parent::heading(); + } + function footer() { + parent::footer(); + echo "\n[[Category:Localisation|Statistics]]\n"; + } +} + +/** Output text. To be used on a terminal for example. */ +class textStatsOutput extends statsOutput { + function element( $in, $heading = false ) { + echo $in."\t"; + } + function blockend() { + echo "\n"; + } +} + +/** csv output. Some people love excel */ +class csvStatsOutput extends statsOutput { + function element( $in, $heading = false ) { + echo $in . ";"; + } + function blockend() { + echo "\n"; + } +} diff --git a/maintenance/language/checkLanguage.inc b/maintenance/language/checkLanguage.inc index 468db550..51de8014 100644 --- a/maintenance/language/checkLanguage.inc +++ b/maintenance/language/checkLanguage.inc @@ -1,109 +1,23 @@ getMessages( $code ); - $messagesNumber = count( $messages['translated'] ); - # Skip the checks if told so - if ( $displayLevel == 0 ) { - return; - } - - # Initialize counts - $problems = 0; - - # Set default language code and checks - if ( !$code ) { - global $wgContLang; - $code = $wgContLang->getCode(); - } - if ( !$checks ) { - $checks = array( 'untranslated', 'obsolete', 'variables', 'empty', 'whitespace', 'xhtml', 'chars' ); - } - - # Untranslated messages - if ( in_array( 'untranslated', $checks ) ) { - $generalMessages = $languages->getGeneralMessages(); - $requiredMessagesNumber = count( $generalMessages['required'] ); - $untranslatedMessages = $languages->getUntranslatedMessages( $code ); - $untranslatedMessagesNumber = count( $untranslatedMessages ); - $languages->outputMessagesList( $untranslatedMessages, $code, "\n$untranslatedMessagesNumber messages of $requiredMessagesNumber are not translated to $code, but exist in en:", $displayLevel, $links, $wikiLanguage ); - $problems += $untranslatedMessagesNumber; - } - - # Duplicate messages - if ( in_array( 'duplicate', $checks ) ) { - $duplicateMessages = $languages->getDuplicateMessages( $code ); - $duplicateMessagesNumber = count( $duplicateMessages ); - $languages->outputMessagesList( $duplicateMessages, $code, "\n$duplicateMessagesNumber messages of $messagesNumber are translated the same in en and $code:", $displayLevel, $links, $wikiLanguage ); - $problems += $duplicateMessagesNumber; - } - - # Obsolete messages - if ( in_array( 'obsolete', $checks ) ) { - $obsoleteMessages = $messages['obsolete']; - $obsoleteMessagesNumber = count( $obsoleteMessages ); - $languages->outputMessagesList( $obsoleteMessages, $code, "\n$obsoleteMessagesNumber messages of $messagesNumber do not exist in en (or are in the ignored list), but still exist in $code:", $displayLevel, $links, $wikiLanguage ); - $problems += $obsoleteMessagesNumber; - } - - # Messages without variables - if ( in_array( 'variables', $checks ) ) { - $messagesWithoutVariables = $languages->getMessagesWithoutVariables( $code ); - $messagesWithoutVariablesNumber = count( $messagesWithoutVariables ); - $languages->outputMessagesList( $messagesWithoutVariables, $code, "\n$messagesWithoutVariablesNumber messages of $messagesNumber in $code don't use some variables while en uses them:", $displayLevel, $links, $wikiLanguage ); - $problems += $messagesWithoutVariablesNumber; - } - - # Messages without plural - if ( in_array( 'plural', $checks ) ) { - $messagesWithoutPlural = $languages->getMessagesWithoutPlural( $code ); - $messagesWithoutPluralNumber = count( $messagesWithoutPlural ); - $languages->outputMessagesList( $messagesWithoutPlural, $code, "\n$messagesWithoutPluralNumber messages of $messagesNumber in $code don't use {{plural}} while en uses it:", $displayLevel, $links, $wikiLanguage ); - $problems += $messagesWithoutPluralNumber; - } - - # Empty messages - if ( in_array( 'empty', $checks ) ) { - $emptyMessages = $languages->getEmptyMessages( $code ); - $emptyMessagesNumber = count( $emptyMessages ); - $languages->outputMessagesList( $emptyMessages, $code, "\n$emptyMessagesNumber messages of $messagesNumber in $code are empty or -:", $displayLevel, $links, $wikiLanguage ); - $problems += $emptyMessagesNumber; - } - - # Messages with whitespace - if ( in_array( 'whitespace', $checks ) ) { - $messagesWithWhitespace = $languages->getMessagesWithWhitespace( $code ); - $messagesWithWhitespaceNumber = count( $messagesWithWhitespace ); - $languages->outputMessagesList( $messagesWithWhitespace, $code, "\n$messagesWithWhitespaceNumber messages of $messagesNumber in $code have a trailing whitespace:", $displayLevel, $links, $wikiLanguage ); - $problems += $messagesWithWhitespaceNumber; - } - - # Non-XHTML messages - if ( in_array( 'xhtml', $checks ) ) { - $nonXHTMLMessages = $languages->getNonXHTMLMessages( $code ); - $nonXHTMLMessagesNumber = count( $nonXHTMLMessages ); - $languages->outputMessagesList( $nonXHTMLMessages, $code, "\n$nonXHTMLMessagesNumber messages of $messagesNumber in $code are not well-formed XHTML:", $displayLevel, $links, $wikiLanguage ); - $problems += $nonXHTMLMessagesNumber; - } - - # Messages with wrong characters - if ( in_array( 'chars', $checks ) ) { - $messagesWithWrongChars = $languages->getMessagesWithWrongChars( $code ); - $messagesWithWrongCharsNumber = count( $messagesWithWrongChars ); - $languages->outputMessagesList( $messagesWithWrongChars, $code, "\n$messagesWithWrongCharsNumber messages of $messagesNumber in $code include hidden chars which should not be used in the messages:", $displayLevel, $links, $wikiLanguage ); - $problems += $messagesWithWrongCharsNumber; - } - - return $problems; -} +# Blacklist some checks for some languages +$checkBlacklist = array( +#'code' => array( 'check1', 'check2' ... ) +'gan' => array( 'plural' ), +'hak' => array( 'plural' ), +'ja' => array( 'plural' ), // Does not use plural +'my' => array( 'chars' ), // Uses a lot zwnj +'tet' => array( 'plural' ), +'th' => array( 'plural' ), +'wuu' => array( 'plural' ), +'yue' => array( 'plural' ), +'zh' => array( 'plural' ), +'zh-classical' => array( 'plural' ), +'zh-cn' => array( 'plural' ), +'zh-hans' => array( 'plural' ), +'zh-hant' => array( 'plural' ), +'zh-hk' => array( 'plural' ), +'zh-sg' => array( 'plural' ), +'zh-tw' => array( 'plural' ), +'zh-yue' => array( 'plural' ), +); diff --git a/maintenance/language/checkLanguage.php b/maintenance/language/checkLanguage.php index 42a43c02..36d32a48 100644 --- a/maintenance/language/checkLanguage.php +++ b/maintenance/language/checkLanguage.php @@ -7,31 +7,137 @@ require_once( dirname(__FILE__).'/../commandLine.inc' ); require_once( 'languages.inc' ); -require_once( 'checkLanguage.inc' ); -# Show help -if ( isset( $options['help'] ) ) { - echo <<execute(); + +class CheckLanguageCLI { + private $code = null; + private $level = 2; + private $doLinks = false; + private $wikiCode = 'en'; + private $includeExif = false; + private $checkAll = false; + private $output = 'plain'; + private $checks = array(); + + private $defaultChecks = array( + 'untranslated', 'obsolete', 'variables', 'empty', 'plural', + 'whitespace', 'xhtml', 'chars', 'links', 'unbalanced' + ); + + private $L = null; + + /** + * GLOBALS: $wgLanguageCode; + */ + public function __construct( Array $options ) { + + if ( isset( $options['help'] ) ) { + echo $this->help(); + exit(); + } + + if ( isset($options['lang']) ) { + $this->code = $options['lang']; + } else { + global $wgLanguageCode; + $this->code = $wgLanguageCode; + } + + if ( isset($options['level']) ) { + $this->level = $options['level']; + } + + $this->doLinks = isset($options['links']); + $this->includeExif = !isset($options['noexif']); + $this->checkAll = isset($options['all']); + + if ( isset($options['wikilang']) ) { + $this->wikiCode = $options['wikilang']; + } + + if ( isset( $options['whitelist'] ) ) { + $this->checks = explode( ',', $options['whitelist'] ); + } elseif ( isset( $options['blacklist'] ) ) { + $this->checks = array_diff( + $this->defaultChecks, + explode( ',', $options['blacklist'] ) + ); + } else { + $this->checks = $this->defaultChecks; + } + + if ( isset($options['output']) ) { + $this->output = $options['output']; + } + + # Some additional checks not enabled by default + if ( isset( $options['duplicate'] ) ) { + $this->checks[] = 'duplicate'; + } + + $this->L = new languages( $this->includeExif ); + } + + protected function getChecks() { + $checks = array(); + $checks['untranslated'] = 'getUntranslatedMessages'; + $checks['duplicate'] = 'getDuplicateMessages'; + $checks['obsolete'] = 'getObsoleteMessages'; + $checks['variables'] = 'getMessagesWithoutVariables'; + $checks['plural'] = 'getMessagesWithoutPlural'; + $checks['empty'] = 'getEmptyMessages'; + $checks['whitespace'] = 'getMessagesWithWhitespace'; + $checks['xhtml'] = 'getNonXHTMLMessages'; + $checks['chars'] = 'getMessagesWithWrongChars'; + $checks['links'] = 'getMessagesWithDubiousLinks'; + $checks['unbalanced'] = 'getMessagesWithUnbalanced'; + return $checks; + } + + protected function getDescriptions() { + $descriptions = array(); + $descriptions['untranslated'] = '$1 message(s) of $2 are not translated to $3, but exist in en:'; + $descriptions['duplicate'] = '$1 message(s) of $2 are translated the same in en and $3:'; + $descriptions['obsolete'] = '$1 message(s) of $2 do not exist in en or are in the ignore list, but are in $3'; + $descriptions['variables'] = '$1 message(s) of $2 in $3 don\'t use some variables that en uses:'; + $descriptions['plural'] = '$1 message(s) of $2 in $3 don\'t use {{plural}} while en uses:'; + $descriptions['empty'] = '$1 message(s) of $2 in $3 are empty or -:'; + $descriptions['whitespace'] = '$1 message(s) of $2 in $3 have trailing whitespace:'; + $descriptions['xhtml'] = '$1 message(s) of $2 in $3 contain illegal XHTML:'; + $descriptions['chars'] = '$1 message(s) of $2 in $3 include hidden chars which should not be used in the messages:'; + $descriptions['links'] = '$1 message(s) of $2 in $3 have problematic link(s):'; + $descriptions['unbalanced'] = '$1 message(s) of $2 in $3 have unbalanced {[]}:'; + return $descriptions; + } + + protected function help() { + return <<