diff options
Diffstat (limited to 'maintenance/language')
20 files changed, 713 insertions, 5940 deletions
diff --git a/maintenance/language/StatOutputs.php b/maintenance/language/StatOutputs.php index e9d8c86d..31ce7024 100644 --- a/maintenance/language/StatOutputs.php +++ b/maintenance/language/StatOutputs.php @@ -1,7 +1,4 @@ <?php -if ( !defined( 'MEDIAWIKI' ) ) { - die(); -} /** * Statistic output classes. * @@ -27,57 +24,78 @@ if ( !defined( 'MEDIAWIKI' ) ) { */ /** A general output object. Need to be overriden */ -class statsOutput { +class StatsOutput { function formatPercent( $subset, $total, $revert = false, $accuracy = 2 ) { - return @sprintf( '%.' . $accuracy . 'f%%', 100 * $subset / $total ); + wfSuppressWarnings(); + $return = sprintf( '%.' . $accuracy . 'f%%', 100 * $subset / $total ); + wfRestoreWarnings(); + + return $return; } # Override the following methods function heading() { } + function footer() { } + function blockstart() { } + function blockend() { } + function element( $in, $heading = false ) { } } /** Outputs WikiText */ -class wikiStatsOutput extends statsOutput { +class WikiStatsOutput extends StatsOutput { function heading() { global $wgDummyLanguageCodes; $version = SpecialVersion::getVersion( 'nodb' ); echo "'''Statistics are based on:''' <code>" . $version . "</code>\n\n"; - echo "'''Note:''' These statistics can be generated by running <code>php maintenance/language/transstat.php</code>.\n\n"; - echo "For additional information on specific languages (the message names, the actual problems, etc.), run <code>php maintenance/language/checkLanguage.php --lang=foo</code>.\n\n"; + echo "'''Note:''' These statistics can be generated by running " . + "<code>php maintenance/language/transstat.php</code>.\n\n"; + echo "For additional information on specific languages (the message names, the actual " . + "problems, etc.), run <code>php maintenance/language/checkLanguage.php --lang=foo</code>.\n\n"; echo 'English (en) is excluded because it is the default localization'; if ( is_array( $wgDummyLanguageCodes ) ) { $dummyCodes = array(); foreach ( $wgDummyLanguageCodes as $dummyCode => $correctCode ) { $dummyCodes[] = Language::fetchLanguageName( $dummyCode ) . ' (' . $dummyCode . ')'; } - echo ', as well as the following languages that are not intended for system message translations, usually because they redirect to other language codes: ' . implode( ', ', $dummyCodes ); + echo ', as well as the following languages that are not intended for ' . + 'system message translations, usually because they redirect to other ' . + 'language codes: ' . implode( ', ', $dummyCodes ); } echo ".\n\n"; # dot to end sentence - echo '{| class="sortable wikitable" border="2" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse; clear:both; width:100%;"' . "\n"; + echo '{| class="sortable wikitable" border="2" 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 ); + wfSuppressWarnings(); + $v = round( 255 * $subset / $total ); + wfRestoreWarnings(); + if ( $revert ) { # Weigh reverse with factor 20 so coloring takes effect more quickly as # this option is used solely for reporting 'bad' percentages. @@ -100,25 +118,28 @@ class wikiStatsOutput extends statsOutput { $color = $red . $green . $blue; $percent = parent::formatPercent( $subset, $total, $revert, $accuracy ); + return 'style="background-color:#' . $color . ';"|' . $percent; } } /** Output text. To be used on a terminal for example. */ -class textStatsOutput extends statsOutput { +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 { +class CsvStatsOutput extends StatsOutput { function element( $in, $heading = false ) { echo $in . ";"; } + function blockend() { echo "\n"; } diff --git a/maintenance/language/checkDupeMessages.php b/maintenance/language/checkDupeMessages.php index 381ddae1..5d482442 100644 --- a/maintenance/language/checkDupeMessages.php +++ b/maintenance/language/checkDupeMessages.php @@ -67,8 +67,7 @@ if ( $runTest ) { $messagesFileC = $messagesDir . 'Messages' . $langCodeFC . '.php'; if ( file_exists( $messagesFile ) && file_exists( $messagesFileC ) ) { $run = true; - } - else { + } else { echo "Messages file(s) could not be found.\nMake sure both files are exists.\n"; } } diff --git a/maintenance/language/checkLanguage.inc b/maintenance/language/checkLanguage.inc index 4b49ada3..990f2585 100644 --- a/maintenance/language/checkLanguage.inc +++ b/maintenance/language/checkLanguage.inc @@ -41,7 +41,7 @@ class CheckLanguageCLI { /** * Constructor. - * @param $options array Options for script. + * @param array $options Options for script. */ public function __construct( array $options ) { if ( isset( $options['help'] ) ) { @@ -89,7 +89,7 @@ class CheckLanguageCLI { $this->output = $options['output']; } - $this->L = new languages( $this->includeExif ); + $this->L = new Languages( $this->includeExif ); } /** @@ -118,7 +118,7 @@ class CheckLanguageCLI { /** * Get the checks that can easily be treated by non-speakers of the language. - * @return Array A list of the easy checks. + * @return array A list of the easy checks. */ protected function easyChecks() { return array( @@ -182,21 +182,25 @@ class CheckLanguageCLI { return array( 'untranslated' => '$1 message(s) of $2 are not translated to $3, but exist in en:', 'duplicate' => '$1 message(s) of $2 are translated the same in en and $3:', - 'obsolete' => '$1 message(s) of $2 do not exist in en or are in the ignore list, but exist in $3:', + 'obsolete' => + '$1 message(s) of $2 do not exist in en or are in the ignore list, but exist in $3:', 'variables' => '$1 message(s) of $2 in $3 don\'t match the variables used in en:', 'plural' => '$1 message(s) of $2 in $3 don\'t use {{plural}} while en uses:', 'empty' => '$1 message(s) of $2 in $3 are empty or -:', 'whitespace' => '$1 message(s) of $2 in $3 have trailing whitespace:', 'xhtml' => '$1 message(s) of $2 in $3 contain illegal XHTML:', - 'chars' => '$1 message(s) of $2 in $3 include hidden chars which should not be used in the messages:', + 'chars' => + '$1 message(s) of $2 in $3 include hidden chars which should not be used in the messages:', 'links' => '$1 message(s) of $2 in $3 have problematic link(s):', 'unbalanced' => '$1 message(s) of $2 in $3 have unbalanced {[]}:', 'namespace' => '$1 namespace name(s) of $2 are not translated to $3, but exist in en:', - 'projecttalk' => '$1 namespace name(s) and alias(es) in $3 are project talk namespaces without the parameter:', + 'projecttalk' => + '$1 namespace name(s) and alias(es) in $3 are project talk namespaces without the parameter:', 'magic' => '$1 magic word(s) of $2 are not translated to $3, but exist in en:', 'magic-old' => '$1 magic word(s) of $2 do not exist in en, but exist in $3:', 'magic-over' => '$1 magic word(s) of $2 in $3 do not contain the original en word(s):', - 'magic-case' => '$1 magic word(s) of $2 in $3 change the case-sensitivity of the original en word:', + 'magic-case' => + '$1 magic word(s) of $2 in $3 change the case-sensitivity of the original en word:', 'special' => '$1 special page alias(es) of $2 are not translated to $3, but exist in en:', 'special-old' => '$1 special page alias(es) of $2 do not exist in en, but exist in $3:', ); @@ -216,35 +220,49 @@ Parameters: --all: Check all customized languages. --level: Show the following display level (default: 2): * 0: Skip the checks (useful for checking syntax). - * 1: Show only the stub headers and number of wrong messages, without list of messages. - * 2: Show only the headers and the message keys, without the message values. - * 3: Show both the headers and the complete messages, with both keys and values. + * 1: Show only the stub headers and number of wrong messages, without + list of messages. + * 2: Show only the headers and the message keys, without the message + values. + * 3: Show both the headers and the complete messages, with both keys and + values. --links: Link the message values (default off). --prefix: prefix to add to links. - --wikilang: For the links, what is the content language of the wiki to display the output in (default en). - --noexif: Do not check for Exif messages (a bit hard and boring to translate), if you know - that they are currently not translated and want to focus on other problems (default off). + --wikilang: For the links, what is the content language of the wiki to + display the output in (default en). + --noexif: Do not check for Exif messages (a bit hard and boring to + translate), if you know what they are currently not translated and want + to focus on other problems (default off). --whitelist: Do only the following checks (form: code,code). --blacklist: Do not do the following checks (form: code,code). - --easy: Do only the easy checks, which can be treated by non-speakers of the language. - -Check codes (ideally, all of them should result 0; all the checks are executed by default (except language-specific check blacklists in checkLanguage.inc): - * untranslated: Messages which are required to translate, but are not translated. - * duplicate: Messages which translation equal to fallback - * obsolete: Messages which are untranslatable or do not exist, but are translated. - * variables: Messages without variables which should be used, or with variables which should not be used. + --easy: Do only the easy checks, which can be treated by non-speakers of + the language. + +Check codes (ideally, all of them should result 0; all the checks are executed +by default (except language-specific check blacklists in checkLanguage.inc): + * untranslated: Messages which are required to translate, but are not + translated. + * duplicate: Messages which translation equal to fallback. + * obsolete: Messages which are untranslatable or do not exist, but are + translated. + * variables: Messages without variables which should be used, or with + variables which should not be used. * empty: Empty messages and messages that contain only -. * whitespace: Messages which have trailing whitespace. - * xhtml: Messages which are not well-formed XHTML (checks only few common errors). + * xhtml: Messages which are not well-formed XHTML (checks only few common + errors). * chars: Messages with hidden characters. * links: Messages which contains broken links to pages (does not find all). - * unbalanced: Messages which contains unequal numbers of opening {[ and closing ]}. + * unbalanced: Messages which contains unequal numbers of opening {[ and + closing ]}. * namespace: Namespace names that were not translated. - * projecttalk: Namespace names and aliases where the project talk does not contain $1. + * projecttalk: Namespace names and aliases where the project talk does not + contain $1. * magic: Magic words that were not translated. * magic-old: Magic words which do not exist. * magic-over: Magic words that override the original English word. - * magic-case: Magic words whose translation changes the case-sensitivity of the original English word. + * magic-case: Magic words whose translation changes the case-sensitivity of + the original English word. * special: Special page names that were not translated. * special-old: Special page names which do not exist. @@ -291,6 +309,17 @@ ENDS; $this->results[$this->code] = $this->checkLanguage( $this->code ); } } + + $results = $this->results; + foreach ( $results as $code => $checks ) { + foreach ( $checks as $check => $messages ) { + foreach ( $messages as $key => $details ) { + if ( $this->isCheckBlacklisted( $check, $code, $key ) ) { + unset( $this->results[$code][$check][$key] ); + } + } + } + } } /** @@ -298,14 +327,58 @@ ENDS; * @return array The list of checks which should not be executed. */ protected function getCheckBlacklist() { + static $blacklist = null; + + if ( $blacklist !== null ) { + return $blacklist; + } + + // @codingStandardsIgnoreStart Ignore that globals should have a "wg" prefix. global $checkBlacklist; + // @codingStandardsIgnoreEnd + + $blacklist = $checkBlacklist; + + wfRunHooks( 'LocalisationChecksBlacklist', array( &$blacklist ) ); + + return $blacklist; + } + + /** + * Verify whether a check is blacklisted. + * + * @param string $check Check name + * @param string $code Language code + * @param string|bool $message Message name, or False for a whole language + * @return bool Whether the check is blacklisted + */ + protected function isCheckBlacklisted( $check, $code, $message ) { + $blacklist = $this->getCheckBlacklist(); + + foreach ( $blacklist as $item ) { + if ( isset( $item['check'] ) && $check !== $item['check'] ) { + continue; + } - return $checkBlacklist; + if ( isset( $item['code'] ) && !in_array( $code, $item['code'] ) ) { + continue; + } + + if ( isset( $item['message'] ) && + ( $message === false || !in_array( $message, $item['message'] ) ) + ) { + continue; + } + + return true; + } + + return false; } /** * Check a language. - * @param $code string The language code. + * @param string $code The language code. * @throws MWException * @return array The results. */ @@ -319,11 +392,8 @@ ENDS; } $checkFunctions = $this->getChecks(); - $checkBlacklist = $this->getCheckBlacklist(); foreach ( $this->checks as $check ) { - if ( isset( $checkBlacklist[$code] ) && - in_array( $check, $checkBlacklist[$code] ) - ) { + if ( $this->isCheckBlacklisted( $check, $code, false ) ) { $results[$check] = array(); continue; } @@ -340,8 +410,8 @@ ENDS; /** * Format a message key. - * @param $key string The message key. - * @param $code string The language code. + * @param string $key The message key. + * @param string $code The language code. * @return string The formatted message key. */ protected function formatKey( $key, $code ) { @@ -407,7 +477,8 @@ ENDS; */ function outputWiki() { $detailText = ''; - $rows[] = '! Language !! Code !! Total !! ' . implode( ' !! ', array_diff( $this->checks, $this->nonMessageChecks() ) ); + $rows[] = '! Language !! Code !! Total !! ' . + implode( ' !! ', array_diff( $this->checks, $this->nonMessageChecks() ) ); foreach ( $this->results as $code => $results ) { $detailTextForLang = "==$code==\n"; $numbers = array(); @@ -447,6 +518,7 @@ ENDS; $tableRows = implode( "\n|-\n", $rows ); $version = SpecialVersion::getVersion( 'nodb' ); + // @codingStandardsIgnoreStart Long line. echo <<<EOL '''Check results are for:''' <code>$version</code> @@ -458,6 +530,7 @@ $tableRows $detailText EOL; + // @codingStandardsIgnoreEnd } /** @@ -485,8 +558,8 @@ class CheckExtensionsCLI extends CheckLanguageCLI { /** * Constructor. - * @param $options array Options for script. - * @param $extension string The extension name (or names). + * @param array $options Options for script. + * @param string $extension The extension name (or names). */ public function __construct( array $options, $extension ) { if ( isset( $options['help'] ) ) { @@ -539,19 +612,19 @@ class CheckExtensionsCLI extends CheckLanguageCLI { if ( $extension == 'all' ) { foreach ( MessageGroups::singleton()->getGroups() as $group ) { if ( strpos( $group->getId(), 'ext-' ) === 0 && !$group->isMeta() ) { - $this->extensions[] = new extensionLanguages( $group ); + $this->extensions[] = new ExtensionLanguages( $group ); } } } elseif ( $extension == 'wikimedia' ) { $wikimedia = MessageGroups::getGroup( 'ext-0-wikimedia' ); foreach ( $wikimedia->wmfextensions() as $extension ) { $group = MessageGroups::getGroup( $extension ); - $this->extensions[] = new extensionLanguages( $group ); + $this->extensions[] = new ExtensionLanguages( $group ); } } elseif ( $extension == 'flaggedrevs' ) { foreach ( MessageGroups::singleton()->getGroups() as $group ) { if ( strpos( $group->getId(), 'ext-flaggedrevs-' ) === 0 && !$group->isMeta() ) { - $this->extensions[] = new extensionLanguages( $group ); + $this->extensions[] = new ExtensionLanguages( $group ); } } } else { @@ -559,7 +632,7 @@ class CheckExtensionsCLI extends CheckLanguageCLI { foreach ( $extensions as $extension ) { $group = MessageGroups::getGroup( 'ext-' . $extension ); if ( $group ) { - $extension = new extensionLanguages( $group ); + $extension = new ExtensionLanguages( $group ); $this->extensions[] = $extension; } else { print "No such extension $extension.\n"; @@ -589,7 +662,7 @@ class CheckExtensionsCLI extends CheckLanguageCLI { /** * Get the checks that can easily be treated by non-speakers of the language. - * @return arrayA list of the easy checks. + * @return array A list of the easy checks. */ protected function easyChecks() { return array( @@ -603,34 +676,50 @@ class CheckExtensionsCLI extends CheckLanguageCLI { */ protected function help() { return <<<ENDS -Run this script to check the status of a specific language in extensions, or all of them. -Command line settings are in form --parameter[=value], except for the first one. +Run this script to check the status of a specific language in extensions, or +all of them. Command line settings are in form --parameter[=value], except for +the first one. Parameters: - * First parameter (mandatory): Extension name, multiple extension names (separated by commas), "all" for all the extensions, "wikimedia" for extensions used by Wikimedia or "flaggedrevs" for all FLaggedRevs extension messages. + * First parameter (mandatory): Extension name, multiple extension names + (separated by commas), "all" for all the extensions, "wikimedia" for + extensions used by Wikimedia or "flaggedrevs" for all FLaggedRevs + extension messages. * lang: Language code (default: the installation default language). * help: Show this help. * level: Show the following display level (default: 2). * links: Link the message values (default off). - * wikilang: For the links, what is the content language of the wiki to display the output in (default en). + * wikilang: For the links, what is the content language of the wiki to + display the output in (default en). * whitelist: Do only the following checks (form: code,code). * blacklist: Do not perform the following checks (form: code,code). - * easy: Do only the easy checks, which can be treated by non-speakers of the language. -Check codes (ideally, all of them should result 0; all the checks are executed by default (except language-specific check blacklists in checkLanguage.inc): - * untranslated: Messages which are required to translate, but are not translated. - * duplicate: Messages which translation equal to fallback + * easy: Do only the easy checks, which can be treated by non-speakers of + the language. + +Check codes (ideally, all of them should result 0; all the checks are executed +by default (except language-specific check blacklists in checkLanguage.inc): + * untranslated: Messages which are required to translate, but are not + translated. + * duplicate: Messages which translation equal to fallback. * obsolete: Messages which are untranslatable, but translated. - * variables: Messages without variables which should be used, or with variables which should not be used. + * variables: Messages without variables which should be used, or with + variables which should not be used. * empty: Empty messages. * whitespace: Messages which have trailing whitespace. - * xhtml: Messages which are not well-formed XHTML (checks only few common errors). + * xhtml: Messages which are not well-formed XHTML (checks only few common + errors). * chars: Messages with hidden characters. * links: Messages which contains broken links to pages (does not find all). - * unbalanced: Messages which contains unequal numbers of opening {[ and closing ]}. + * unbalanced: Messages which contains unequal numbers of opening {[ and + closing ]}. + Display levels (default: 2): * 0: Skip the checks (useful for checking syntax). - * 1: Show only the stub headers and number of wrong messages, without list of messages. - * 2: Show only the headers and the message keys, without the message values. - * 3: Show both the headers and the complete messages, with both keys and values. + * 1: Show only the stub headers and number of wrong messages, without list + of messages. + * 2: Show only the headers and the message keys, without the message + values. + * 3: Show both the headers and the complete messages, with both keys and + values. ENDS; } @@ -644,7 +733,7 @@ ENDS; /** * Check a language and show the results. - * @param $code string The language code. + * @param string $code The language code. * @throws MWException */ protected function checkLanguage( $code ) { @@ -675,52 +764,21 @@ ENDS; } } -# Blacklist some checks for some languages +// Blacklist some checks for some languages or some messages +// Possible keys of the sub arrays are: 'check', 'code' and 'message'. $checkBlacklist = array( -#'code' => array( 'check1', 'check2' ... ) - 'az' => array( 'plural' ), - 'bo' => array( 'plural' ), - 'cdo' => array( 'plural' ), - 'dz' => array( 'plural' ), - 'id' => array( 'plural' ), - 'fa' => array( 'plural' ), - 'gan' => array( 'plural' ), - 'gan-hans' => array( 'plural' ), - 'gan-hant' => array( 'plural' ), - 'gn' => array( 'plural' ), - 'hak' => array( 'plural' ), - 'hu' => array( 'plural' ), - 'ja' => array( 'plural' ), // Does not use plural - 'jv' => array( 'plural' ), - 'ka' => array( 'plural' ), - 'kk-arab' => array( 'plural' ), - 'kk-cyrl' => array( 'plural' ), - 'kk-latn' => array( 'plural' ), - 'km' => array( 'plural' ), - 'kn' => array( 'plural' ), - 'ko' => array( 'plural' ), - 'lzh' => array( 'plural' ), - 'mn' => array( 'plural' ), - 'ms' => array( 'plural' ), - 'my' => array( 'plural', 'chars' ), // Uses a lot zwnj - 'sah' => array( 'plural' ), - 'sq' => array( 'plural' ), - 'tet' => array( 'plural' ), - 'th' => array( 'plural' ), - 'to' => array( 'plural' ), - 'tr' => array( 'plural' ), - 'vi' => array( 'plural' ), - 'wuu' => array( 'plural' ), - 'xmf' => array( 'plural' ), - 'yo' => 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' ), + array( + 'check' => 'plural', + 'code' => array( 'az', 'bo', 'cdo', 'dz', 'id', 'fa', 'gan', 'gan-hans', + 'gan-hant', 'gn', 'hak', 'hu', 'ja', 'jv', 'ka', 'kk-arab', + 'kk-cyrl', 'kk-latn', 'km', 'kn', 'ko', 'lzh', 'mn', 'ms', + 'my', 'sah', 'sq', 'tet', 'th', 'to', 'tr', 'vi', 'wuu', 'xmf', + 'yo', 'yue', 'zh', 'zh-classical', 'zh-cn', 'zh-hans', + 'zh-hant', 'zh-hk', 'zh-sg', 'zh-tw', 'zh-yue' + ), + ), + array( + 'check' => 'chars', + 'code' => array( 'my' ), + ), ); diff --git a/maintenance/language/countMessages.php b/maintenance/language/countMessages.php deleted file mode 100644 index 95a7154b..00000000 --- a/maintenance/language/countMessages.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php -/** - * Count how many messages we have defined for each language. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * http://www.gnu.org/copyleft/gpl.html - * - * @file - * @ingroup MaintenanceLanguage - */ - -require_once __DIR__ . '/../Maintenance.php'; - -/** - * Maintenance script that counts how many messages we have defined - * for each language. - * - * @ingroup MaintenanceLanguage - */ -class CountMessages extends Maintenance { - public function __construct() { - parent::__construct(); - $this->mDescription = "Count how many messages we have defined for each language"; - } - - public function execute() { - global $IP; - $dir = $this->getArg( 0, "$IP/languages/messages" ); - $total = 0; - $nonZero = 0; - foreach ( glob( "$dir/*.php" ) as $file ) { - $baseName = basename( $file ); - if ( !preg_match( '/Messages([A-Z][a-z_]+)\.php$/', $baseName, $m ) ) { - continue; - } - - $numMessages = $this->getNumMessages( $file ); - // print "$code: $numMessages\n"; - $total += $numMessages; - if ( $numMessages > 0 ) { - $nonZero ++; - } - } - $this->output( "\nTotal: $total\n" ); - $this->output( "Languages: $nonZero\n" ); - } - - private function getNumMessages( $file ) { - // Separate function to limit scope - require $file; - if ( isset( $messages ) ) { - return count( $messages ); - } else { - return 0; - } - } -} - -$maintClass = "CountMessages"; -require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/language/generateCollationData.php b/maintenance/language/generateCollationData.php index fcf2c960..973cf7bc 100644 --- a/maintenance/language/generateCollationData.php +++ b/maintenance/language/generateCollationData.php @@ -48,7 +48,7 @@ class GenerateCollationData extends Maintenance { * Important tertiary weights from UTS #10 section 7.2 */ const NORMAL_UPPERCASE = 0x08; - const NORMAL_HIRAGANA = 0X0E; + const NORMAL_HIRAGANA = 0x0E; public function __construct() { parent::__construct(); @@ -158,7 +158,8 @@ class GenerateCollationData extends Maintenance { // people like to use that as a fake no header symbol. $category = substr( $data['gc'], 0, 1 ); if ( strpos( 'LNPS', $category ) === false - && $data['cp'] !== '0020' ) { + && $data['cp'] !== '0020' + ) { return; } $cp = hexdec( $data['cp'] ); @@ -178,8 +179,8 @@ class GenerateCollationData extends Maintenance { // Calculate implicit weight per UTS #10 v6.0.0, sec 7.1.3 if ( $data['UIdeo'] === 'Y' ) { if ( $data['block'] == 'CJK Unified Ideographs' - || $data['block'] == 'CJK Compatibility Ideographs' ) - { + || $data['block'] == 'CJK Compatibility Ideographs' + ) { $base = 0xFB40; } else { $base = 0xFB80; @@ -248,8 +249,8 @@ class GenerateCollationData extends Maintenance { } $this->weights[$cp] = $primary; if ( $tertiary === '.0008' - || $tertiary === '.000E' ) - { + || $tertiary === '.000E' + ) { $goodTertiaryChars[$cp] = true; } } @@ -325,7 +326,7 @@ class GenerateCollationData extends Maintenance { $char = codepointToUtf8( $cp ); $headerChars[] = $char; if ( $primaryCollator->compare( $char, $prevChar ) <= 0 ) { - $numOutOfOrder ++; + $numOutOfOrder++; /* printf( "Out of order: U+%05X > U+%05X\n", utf8ToCodepoint( $prevChar ), @@ -390,6 +391,7 @@ class UcdXmlReader { } while ( $this->xml->name !== 'ucd' && $this->xml->read() ); $this->xml->read(); + return $this->xml; } @@ -403,6 +405,7 @@ class UcdXmlReader { while ( $this->xml->moveToNextAttribute() ) { $attrs[$this->xml->name] = $this->xml->value; } + return $attrs; } @@ -460,9 +463,9 @@ class UcdXmlReader { } } $xml->close(); + return $this->blocks; } - } $maintClass = 'GenerateCollationData'; diff --git a/maintenance/language/generateNormalizerData.php b/maintenance/language/generateNormalizerDataAr.php index 216445e4..ece0450f 100644 --- a/maintenance/language/generateNormalizerData.php +++ b/maintenance/language/generateNormalizerDataAr.php @@ -1,6 +1,6 @@ <?php /** - * Generates normalizer data files for Arabic and Malayalam. + * Generates the normalizer data file for Arabic. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,46 +21,43 @@ * @ingroup MaintenanceLanguage */ -require_once __DIR__ . '/../../includes/normal/UtfNormalUtil.php'; - require_once __DIR__ . '/../Maintenance.php'; /** - * Generates normalizer data files for Arabic and Malayalam. + * Generates the normalizer data file for Arabic. * For NFC see includes/normal. * * @ingroup MaintenanceLanguage */ -class GenerateNormalizerData extends Maintenance { - public $dataFile; - +class GenerateNormalizerDataAr extends Maintenance { public function __construct() { parent::__construct(); + $this->mDescription = 'Generate the normalizer data file for Arabic'; $this->addOption( 'unicode-data-file', 'The local location of the data file ' . 'from http://unicode.org/Public/UNIDATA/UnicodeData.txt', false, true ); } + public function getDbType() { + return Maintenance::DB_NONE; + } + public function execute() { if ( !$this->hasOption( 'unicode-data-file' ) ) { - $this->dataFile = 'UnicodeData.txt'; - if ( !file_exists( $this->dataFile ) ) { - $this->error( "Unable to find UnicodeData.txt. Please specify its location with --unicode-data-file=<FILE>" ); + $dataFile = 'UnicodeData.txt'; + if ( !file_exists( $dataFile ) ) { + $this->error( "Unable to find UnicodeData.txt. Please specify " . + "its location with --unicode-data-file=<FILE>" ); exit( 1 ); } } else { - $this->dataFile = $this->getOption( 'unicode-data-file' ); - if ( !file_exists( $this->dataFile ) ) { + $dataFile = $this->getOption( 'unicode-data-file' ); + if ( !file_exists( $dataFile ) ) { $this->error( 'Unable to find the specified data file.' ); exit( 1 ); } } - $this->generateArabic(); - $this->generateMalayalam(); - } - - function generateArabic() { - $file = fopen( $this->dataFile, 'r' ); + $file = fopen( $dataFile, 'r' ); if ( !$file ) { $this->error( 'Unable to open the data file.' ); exit( 1 ); @@ -74,7 +71,9 @@ class GenerateNormalizerData extends Maintenance { 'Canonical_Combining_Class', 'Bidi_Class', 'Decomposition_Type_Mapping', - 'Numeric_Type_Value', + 'Numeric_Type_Value_6', + 'Numeric_Type_Value_7', + 'Numeric_Type_Value_8', 'Bidi_Mirrored', 'Unicode_1_Name', 'ISO_Comment', @@ -104,15 +103,15 @@ class GenerateNormalizerData extends Maintenance { $code = base_convert( $data['Code'], 16, 10 ); if ( ( $code >= 0xFB50 && $code <= 0xFDFF ) # Arabic presentation forms A - || ( $code >= 0xFE70 && $code <= 0xFEFF ) ) # Arabic presentation forms B - { + || ( $code >= 0xFE70 && $code <= 0xFEFF ) # Arabic presentation forms B + ) { if ( $data['Decomposition_Type_Mapping'] === '' ) { // No decomposition continue; } if ( !preg_match( '/^ *(<\w*>) +([0-9A-F ]*)$/', - $data['Decomposition_Type_Mapping'], $m ) ) - { + $data['Decomposition_Type_Mapping'], $m ) + ) { $this->error( "Can't parse Decomposition_Type/Mapping on line $lineNum" ); $this->error( $line ); continue; @@ -128,32 +127,7 @@ class GenerateNormalizerData extends Maintenance { file_put_contents( "$IP/serialized/normalize-ar.ser", serialize( $pairs ) ); echo "ar: " . count( $pairs ) . " pairs written.\n"; } - - function generateMalayalam() { - $hexPairs = array( - # From http://unicode.org/versions/Unicode5.1.0/#Malayalam_Chillu_Characters - '0D23 0D4D 200D' => '0D7A', - '0D28 0D4D 200D' => '0D7B', - '0D30 0D4D 200D' => '0D7C', - '0D32 0D4D 200D' => '0D7D', - '0D33 0D4D 200D' => '0D7E', - - # From http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46413 - '0D15 0D4D 200D' => '0D7F', - ); - - $pairs = array(); - foreach ( $hexPairs as $hexSource => $hexDest ) { - $source = hexSequenceToUtf8( $hexSource ); - $dest = hexSequenceToUtf8( $hexDest ); - $pairs[$source] = $dest; - } - - global $IP; - file_put_contents( "$IP/serialized/normalize-ml.ser", serialize( $pairs ) ); - echo "ml: " . count( $pairs ) . " pairs written.\n"; - } } -$maintClass = 'GenerateNormalizerData'; +$maintClass = 'GenerateNormalizerDataAr'; require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/language/generateNormalizerDataMl.php b/maintenance/language/generateNormalizerDataMl.php new file mode 100644 index 00000000..c7237cfe --- /dev/null +++ b/maintenance/language/generateNormalizerDataMl.php @@ -0,0 +1,69 @@ +<?php +/** + * Generates the normalizer data file for Malayalam. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @ingroup MaintenanceLanguage + */ + +require_once __DIR__ . '/../Maintenance.php'; + +/** + * Generates the normalizer data file for Malayalam. + * For NFC see includes/normal. + * + * @ingroup MaintenanceLanguage + */ +class GenerateNormalizerDataMl extends Maintenance { + public function __construct() { + parent::__construct(); + $this->mDescription = 'Generate the normalizer data file for Malayalam'; + } + + public function getDbType() { + return Maintenance::DB_NONE; + } + + public function execute() { + $hexPairs = array( + # From http://unicode.org/versions/Unicode5.1.0/#Malayalam_Chillu_Characters + '0D23 0D4D 200D' => '0D7A', + '0D28 0D4D 200D' => '0D7B', + '0D30 0D4D 200D' => '0D7C', + '0D32 0D4D 200D' => '0D7D', + '0D33 0D4D 200D' => '0D7E', + + # From http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46413 + '0D15 0D4D 200D' => '0D7F', + ); + + $pairs = array(); + foreach ( $hexPairs as $hexSource => $hexDest ) { + $source = hexSequenceToUtf8( $hexSource ); + $dest = hexSequenceToUtf8( $hexDest ); + $pairs[$source] = $dest; + } + + global $IP; + file_put_contents( "$IP/serialized/normalize-ml.ser", serialize( $pairs ) ); + echo "ml: " . count( $pairs ) . " pairs written.\n"; + } +} + +$maintClass = 'GenerateNormalizerDataMl'; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/language/generateUtf8Case.php b/maintenance/language/generateUtf8Case.php new file mode 100644 index 00000000..0fd32427 --- /dev/null +++ b/maintenance/language/generateUtf8Case.php @@ -0,0 +1,129 @@ +<?php +/** + * Generates Utf8Case.ser from the Unicode Character Database and + * supplementary files. + * + * Copyright © 2004, 2008 Brion Vibber <brion@pobox.com> + * https://www.mediawiki.org/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @ingroup MaintenanceLanguage + */ + +require_once __DIR__ . '/../Maintenance.php'; + +/** + * Generates Utf8Case.ser from the Unicode Character Database and + * supplementary files. + * + * @ingroup MaintenanceLanguage + */ +class GenerateUtf8Case extends Maintenance { + + public function __construct() { + parent::__construct(); + $this->mDescription = 'Generate Utf8Case.ser from the Unicode Character Database ' . + 'and supplementary files'; + $this->addOption( 'unicode-data-file', 'The local location of the data file ' . + 'from http://unicode.org/Public/UNIDATA/UnicodeData.txt', false, true ); + } + + public function getDbType() { + return Maintenance::DB_NONE; + } + + public function execute() { + if ( !$this->hasOption( 'unicode-data-file' ) ) { + $dataFile = 'UnicodeData.txt'; + if ( !file_exists( $dataFile ) ) { + $this->error( "Unable to find UnicodeData.txt. Please specify " . + "its location with --unicode-data-file=<FILE>" ); + exit( 1 ); + } + } else { + $dataFile = $this->getOption( 'unicode-data-file' ); + if ( !file_exists( $dataFile ) ) { + $this->error( 'Unable to find the specified data file.' ); + exit( 1 ); + } + } + + $file = fopen( $dataFile, 'r' ); + if ( !$file ) { + $this->error( 'Unable to open the data file.' ); + exit( 1 ); + } + + // For the file format, see http://www.unicode.org/reports/tr44/ + $fieldNames = array( + 'Code', + 'Name', + 'General_Category', + 'Canonical_Combining_Class', + 'Bidi_Class', + 'Decomposition_Type_Mapping', + 'Numeric_Type_Value_6', + 'Numeric_Type_Value_7', + 'Numeric_Type_Value_8', + 'Bidi_Mirrored', + 'Unicode_1_Name', + 'ISO_Comment', + 'Simple_Uppercase_Mapping', + 'Simple_Lowercase_Mapping', + 'Simple_Titlecase_Mapping' + ); + + $upper = array(); + $lower = array(); + + $lineNum = 0; + while ( false !== ( $line = fgets( $file ) ) ) { + ++$lineNum; + + # Strip comments + $line = trim( substr( $line, 0, strcspn( $line, '#' ) ) ); + if ( $line === '' ) { + continue; + } + + # Split fields + $numberedData = explode( ';', $line ); + $data = array(); + foreach ( $fieldNames as $number => $name ) { + $data[$name] = $numberedData[$number]; + } + + $source = hexSequenceToUtf8( $data['Code'] ); + if ( $data['Simple_Uppercase_Mapping'] ) { + $upper[$source] = hexSequenceToUtf8( $data['Simple_Uppercase_Mapping'] ); + } + if ( $data['Simple_Lowercase_Mapping'] ) { + $lower[$source] = hexSequenceToUtf8( $data['Simple_Lowercase_Mapping'] ); + } + } + + global $IP; + file_put_contents( "$IP/serialized/Utf8Case.ser", serialize( array( + 'wikiUpperChars' => $upper, + 'wikiLowerChars' => $lower, + ) ) ); + } +} + +$maintClass = 'GenerateUtf8Case'; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/language/langmemusage.php b/maintenance/language/langmemusage.php index 14485f98..32cfcd7d 100644 --- a/maintenance/language/langmemusage.php +++ b/maintenance/language/langmemusage.php @@ -43,7 +43,7 @@ class LangMemUsage extends Maintenance { $this->error( "You must compile PHP with --enable-memory-limit", true ); } - $langtool = new languages(); + $langtool = new Languages(); $memlast = $memstart = memory_get_usage(); $this->output( "Base memory usage: $memstart\n" ); diff --git a/maintenance/language/languages.inc b/maintenance/language/languages.inc index 6070f4ab..fb496cbc 100644 --- a/maintenance/language/languages.inc +++ b/maintenance/language/languages.inc @@ -24,35 +24,47 @@ /** * @ingroup MaintenanceLanguage */ -class languages { - protected $mLanguages; # List of languages +class Languages { + /** @var array List of languages */ + protected $mLanguages; - protected $mRawMessages; # Raw list of the messages in each language - protected $mMessages; # Messages in each language (except for English), divided to groups - protected $mFallback; # Fallback language in each language - protected $mGeneralMessages; # General messages in English, divided to groups - protected $mIgnoredMessages; # All the messages which should be exist only in the English file - protected $mOptionalMessages; # All the messages which may be translated or not, depending on the language + /** @var array Raw list of the messages in each language */ + protected $mRawMessages; - protected $mNamespaceNames; # Namespace names - protected $mNamespaceAliases; # Namespace aliases - protected $mMagicWords; # Magic words - protected $mSpecialPageAliases; # Special page aliases + /** @var array Messages in each language (except for English), divided to groups */ + protected $mMessages; + + /** @var array Fallback language in each language */ + protected $mFallback; + + /** @var array General messages in English, divided to groups */ + protected $mGeneralMessages; + + /** @var array All the messages which should be exist only in the English file */ + protected $mIgnoredMessages; + + /** @var array All the messages which may be translated or not, depending on the language */ + protected $mOptionalMessages; + + /** @var array Namespace names */ + protected $mNamespaceNames; + + /** @var array Namespace aliases */ + protected $mNamespaceAliases; + + /** @var array Magic words */ + protected $mMagicWords; + + /** @var array Special page aliases */ + protected $mSpecialPageAliases; /** * Load the list of languages: all the Messages*.php * files in the languages directory. - * - * @param $exif bool Treat the Exif messages? */ - function __construct( $exif = true ) { - require __DIR__ . '/messageTypes.inc'; - $this->mIgnoredMessages = $wgIgnoredMessages; - if ( $exif ) { - $this->mOptionalMessages = array_merge( $wgOptionalMessages ); - } else { - $this->mOptionalMessages = array_merge( $wgOptionalMessages, $wgEXIFMessages ); - } + function __construct() { + wfRunHooks( 'LocalisationIgnoredOptionalMessages', + array( &$this->mIgnoredMessages, &$this->mOptionalMessages ) ); $this->mLanguages = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) ); sort( $this->mLanguages ); @@ -88,7 +100,7 @@ class languages { /** * Load the language file. * - * @param $code string The language code. + * @param string $code The language code. */ protected function loadFile( $code ) { if ( isset( $this->mRawMessages[$code] ) && @@ -96,7 +108,8 @@ class languages { isset( $this->mNamespaceNames[$code] ) && isset( $this->mNamespaceAliases[$code] ) && isset( $this->mMagicWords[$code] ) && - isset( $this->mSpecialPageAliases[$code] ) ) { + isset( $this->mSpecialPageAliases[$code] ) + ) { return; } $this->mRawMessages[$code] = array(); @@ -105,12 +118,16 @@ class languages { $this->mNamespaceAliases[$code] = array(); $this->mMagicWords[$code] = array(); $this->mSpecialPageAliases[$code] = array(); + + $jsonfilename = Language::getJsonMessagesFileName( $code ); + if ( file_exists( $jsonfilename ) ) { + $json = Language::getLocalisationCache()->readJSONFile( $jsonfilename ); + $this->mRawMessages[$code] = $json['messages']; + } + $filename = Language::getMessagesFileName( $code ); if ( file_exists( $filename ) ) { require $filename; - if ( isset( $messages ) ) { - $this->mRawMessages[$code] = $messages; - } if ( isset( $fallback ) ) { $this->mFallback[$code] = $fallback; } @@ -130,14 +147,18 @@ class languages { } /** - * Load the messages for a specific language (which is not English) and divide them to groups: + * Load the messages for a specific language (which is not English) and divide them to + * groups: * all - all the messages. * required - messages which should be translated in order to get a complete translation. - * optional - messages which can be translated, the fallback translation is used if not translated. - * obsolete - messages which should not be translated, either because they do not exist, or they are ignored messages. - * translated - messages which are either required or optional, but translated from English and needed. + * optional - messages which can be translated, the fallback translation is used if not + * translated. + * obsolete - messages which should not be translated, either because they do not exist, + * or they are ignored messages. + * translated - messages which are either required or optional, but translated from + * English and needed. * - * @param $code string The language code. + * @param string $code The language code. */ private function loadMessages( $code ) { if ( isset( $this->mMessages[$code] ) ) { @@ -166,10 +187,13 @@ class languages { /** * Load the messages for English and divide them to groups: * all - all the messages. - * required - messages which should be translated to other languages in order to get a complete translation. - * optional - messages which can be translated to other languages, but it's not required for a complete translation. + * required - messages which should be translated to other languages in order to get a + * complete translation. + * optional - messages which can be translated to other languages, but it's not required + * for a complete translation. * ignored - messages which should not be translated to other languages. - * translatable - messages which are either required or optional, but can be translated from English. + * translatable - messages which are either required or optional, but can be translated + * from English. */ private function loadGeneralMessages() { if ( isset( $this->mGeneralMessages ) ) { @@ -199,111 +223,125 @@ class languages { * fallback language messages, divided to groups: * all - all the messages. * required - messages which should be translated in order to get a complete translation. - * optional - messages which can be translated, the fallback translation is used if not translated. - * obsolete - messages which should not be translated, either because they do not exist, or they are ignored messages. - * translated - messages which are either required or optional, but translated from English and needed. + * optional - messages which can be translated, the fallback translation is used if not + * translated. + * obsolete - messages which should not be translated, either because they do not exist, + * or they are ignored messages. + * translated - messages which are either required or optional, but translated from + * English and needed. * - * @param $code string The language code. + * @param string $code The language code. * * @return string The messages in this language. */ public function getMessages( $code ) { $this->loadMessages( $code ); + return $this->mMessages[$code]; } /** * Get all the general English messages, divided to groups: * all - all the messages. - * required - messages which should be translated to other languages in order to get a complete translation. - * optional - messages which can be translated to other languages, but it's not required for a complete translation. + * required - messages which should be translated to other languages in + * order to get a complete translation. + * optional - messages which can be translated to other languages, but it's + * not required for a complete translation. * ignored - messages which should not be translated to other languages. - * translatable - messages which are either required or optional, but can be translated from English. + * translatable - messages which are either required or optional, but can be + * translated from English. * * @return array The general English messages. */ public function getGeneralMessages() { $this->loadGeneralMessages(); + return $this->mGeneralMessages; } /** * Get fallback language code for a specific language. * - * @param $code string The language code. + * @param string $code The language code. * * @return string Fallback code. */ public function getFallback( $code ) { $this->loadFile( $code ); + return $this->mFallback[$code]; } /** * Get namespace names for a specific language. * - * @param $code string The language code. + * @param string $code The language code. * * @return array Namespace names. */ public function getNamespaceNames( $code ) { $this->loadFile( $code ); + return $this->mNamespaceNames[$code]; } /** * Get namespace aliases for a specific language. * - * @param $code string The language code. + * @param string $code The language code. * * @return array Namespace aliases. */ public function getNamespaceAliases( $code ) { $this->loadFile( $code ); + return $this->mNamespaceAliases[$code]; } /** * Get magic words for a specific language. * - * @param $code string The language code. + * @param string $code The language code. * * @return array Magic words. */ public function getMagicWords( $code ) { $this->loadFile( $code ); + return $this->mMagicWords[$code]; } /** * Get special page aliases for a specific language. * - * @param $code string The language code. + * @param string $code The language code. * * @return array Special page aliases. */ public function getSpecialPageAliases( $code ) { $this->loadFile( $code ); + return $this->mSpecialPageAliases[$code]; } /** * Get the untranslated messages for a specific language. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The untranslated messages for this language. */ public function getUntranslatedMessages( $code ) { $this->loadGeneralMessages(); $this->loadMessages( $code ); + return array_diff_key( $this->mGeneralMessages['required'], $this->mMessages[$code]['required'] ); } /** * Get the duplicate messages for a specific language. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The duplicate messages for this language. */ @@ -316,26 +354,28 @@ class languages { $duplicateMessages[$key] = $value; } } + return $duplicateMessages; } /** * Get the obsolete messages for a specific language. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The obsolete messages for this language. */ public function getObsoleteMessages( $code ) { $this->loadGeneralMessages(); $this->loadMessages( $code ); + return $this->mMessages[$code]['obsolete']; } /** * Get the messages whose variables do not match the original ones. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The messages whose variables do not match the original ones. */ @@ -348,11 +388,13 @@ class languages { $missing = false; foreach ( $variables as $var ) { if ( preg_match( "/$var/sU", $this->mGeneralMessages['translatable'][$key] ) && - !preg_match( "/$var/sU", $value ) ) { + !preg_match( "/$var/sU", $value ) + ) { $missing = true; } if ( !preg_match( "/$var/sU", $this->mGeneralMessages['translatable'][$key] ) && - preg_match( "/$var/sU", $value ) ) { + preg_match( "/$var/sU", $value ) + ) { $missing = true; } } @@ -360,13 +402,14 @@ class languages { $mismatchMessages[$key] = $value; } } + return $mismatchMessages; } /** * Get the messages which do not use plural. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The messages which do not use plural in this language. */ @@ -375,17 +418,20 @@ class languages { $this->loadMessages( $code ); $messagesWithoutPlural = array(); foreach ( $this->mMessages[$code]['translated'] as $key => $value ) { - if ( stripos( $this->mGeneralMessages['translatable'][$key], '{{plural:' ) !== false && stripos( $value, '{{plural:' ) === false ) { + if ( stripos( $this->mGeneralMessages['translatable'][$key], '{{plural:' ) !== false && + stripos( $value, '{{plural:' ) === false + ) { $messagesWithoutPlural[$key] = $value; } } + return $messagesWithoutPlural; } /** * Get the empty messages. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The empty messages for this language. */ @@ -398,13 +444,14 @@ class languages { $emptyMessages[$key] = $value; } } + return $emptyMessages; } /** * Get the messages with trailing whitespace. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The messages with trailing whitespace in this language. */ @@ -417,13 +464,14 @@ class languages { $messagesWithWhitespace[$key] = $value; } } + return $messagesWithWhitespace; } /** * Get the non-XHTML messages. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The non-XHTML messages for this language. */ @@ -445,13 +493,14 @@ class languages { $nonXHTMLMessages[$key] = $value; } } + return $nonXHTMLMessages; } /** * Get the messages which include wrong characters. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The messages which include wrong characters in this language. */ @@ -482,13 +531,14 @@ class languages { $wrongCharsMessages[$key] = $value; } } + return $wrongCharsMessages; } /** * Get the messages which include dubious links. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The messages which include dubious links in this language. */ @@ -500,24 +550,25 @@ class languages { foreach ( $this->mMessages[$code]['translated'] as $key => $value ) { $matches = array(); preg_match_all( "/\[\[([{$tc}]+)(?:\\|(.+?))?]]/sDu", $value, $matches ); - for ( $i = 0; $i < count( $matches[0] ); $i++ ) { + $numMatches = count( $matches[0] ); + for ( $i = 0; $i < $numMatches; $i++ ) { if ( preg_match( "/.*project.*/isDu", $matches[1][$i] ) ) { $messages[$key][] = $matches[0][$i]; } } - if ( isset( $messages[$key] ) ) { $messages[$key] = implode( $messages[$key], ", " ); } } + return $messages; } /** * Get the messages which include unbalanced brackets. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The messages which include unbalanced brackets in this language. */ @@ -547,15 +598,15 @@ class languages { if ( $a !== $b || $c !== $d ) { $messages[$key] = "$a, $b, $c, $d"; } - } + return $messages; } /** * Get the untranslated namespace names. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The untranslated namespace names in this language. */ @@ -566,13 +617,14 @@ class languages { if ( isset( $namespacesDiff[NS_MAIN] ) ) { unset( $namespacesDiff[NS_MAIN] ); } + return $namespacesDiff; } /** * Get the project talk namespace names with no $1. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The problematic project talk namespaces in this language. */ @@ -601,7 +653,7 @@ class languages { /** * Get the untranslated magic words. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The untranslated magic words in this language. */ @@ -614,13 +666,14 @@ class languages { $magicWords[$key] = $value[1]; } } + return $magicWords; } /** * Get the obsolete magic words. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The obsolete magic words in this language. */ @@ -633,13 +686,14 @@ class languages { $magicWords[$key] = $value[1]; } } + return $magicWords; } /** * Get the magic words that override the original English magic word. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The overriding magic words in this language. */ @@ -662,13 +716,14 @@ class languages { } } } + return $magicWords; } /** * Get the magic words which do not match the case-sensitivity of the original words. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The magic words whose case does not match in this language. */ @@ -685,13 +740,14 @@ class languages { $magicWords[$key] = $local[0]; } } + return $magicWords; } /** * Get the untranslated special page names. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The untranslated special page names in this language. */ @@ -704,13 +760,14 @@ class languages { $specialPageAliases[$key] = $value[0]; } } + return $specialPageAliases; } /** * Get the obsolete special page names. * - * @param $code string The language code. + * @param string $code The language code. * * @return array The obsolete special page names in this language. */ @@ -723,12 +780,12 @@ class languages { $specialPageAliases[$key] = $value[0]; } } + return $specialPageAliases; } } -class extensionLanguages extends languages { - +class ExtensionLanguages extends Languages { /** * @var MessageGroup */ @@ -736,7 +793,7 @@ class extensionLanguages extends languages { /** * Load the messages group. - * @param $group MessageGroup The messages group. + * @param MessageGroup $group The messages group. */ function __construct( MessageGroup $group ) { $this->mMessageGroup = $group; @@ -757,7 +814,7 @@ class extensionLanguages extends languages { /** * Load the language file. * - * @param $code string The language code. + * @param string $code The language code. */ protected function loadFile( $code ) { if ( !isset( $this->mRawMessages[$code] ) ) { diff --git a/maintenance/language/listVariants.php b/maintenance/language/listVariants.php new file mode 100644 index 00000000..4bff8916 --- /dev/null +++ b/maintenance/language/listVariants.php @@ -0,0 +1,73 @@ +<?php +/** + * Lists all language variants + * + * Copyright © 2014 MediaWiki developers + * https://www.mediawiki.org/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @ingroup Maintenance + */ +require_once dirname( __DIR__ ) . '/Maintenance.php'; + +/** + * @since 1.24 + */ +class ListVariants extends Maintenance { + + public function __construct() { + parent::__construct(); + $this->mDescription = 'Outputs a list of language variants'; + $this->addOption( 'flat', 'Output variants in a flat list' ); + $this->addOption( 'json', 'Output variants as JSON' ); + } + + public function execute() { + $variantLangs = array(); + $variants = array(); + foreach ( LanguageConverter::$languagesWithVariants as $langCode ) { + $lang = Language::factory( $langCode ); + if ( count( $lang->getVariants() ) > 1 ) { + $variants += array_flip( $lang->getVariants() ); + $variantLangs[$langCode] = $lang->getVariants(); + } + } + $variants = array_keys( $variants ); + sort( $variants ); + $result = $this->hasOption( 'flat' ) ? $variants : $variantLangs; + + // Not using $this->output() because muting makes no sense here + if ( $this->hasOption( 'json' ) ) { + echo FormatJson::encode( $result, true ) . "\n"; + } else { + foreach ( $result as $key => $value ) { + if ( is_array( $value ) ) { + echo "$key\n"; + foreach ( $value as $variant ) { + echo " $variant\n"; + } + } else { + echo "$value\n"; + } + } + } + } +} + +$maintClass = 'ListVariants'; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc deleted file mode 100644 index f9239b1c..00000000 --- a/maintenance/language/messageTypes.inc +++ /dev/null @@ -1,872 +0,0 @@ -<?php -/** - * Several types of messages. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * http://www.gnu.org/copyleft/gpl.html - * - * @file - * @ingroup MaintenanceLanguage - */ - -/** Ignored messages, which should exist only in the English messages file. */ -$wgIgnoredMessages = array( - 'sidebar', - 'accesskey-pt-userpage', - 'accesskey-pt-anonuserpage', - 'accesskey-pt-mytalk', - 'accesskey-pt-anontalk', - 'accesskey-pt-preferences', - 'accesskey-pt-watchlist', - 'accesskey-pt-mycontris', - 'accesskey-pt-login', - 'accesskey-pt-anonlogin', - 'accesskey-pt-logout', - 'accesskey-ca-talk', - 'accesskey-ca-edit', - 'accesskey-ca-addsection', - 'accesskey-ca-viewsource', - 'accesskey-ca-history', - 'accesskey-ca-protect', - 'accesskey-ca-unprotect', - 'accesskey-ca-delete', - 'accesskey-ca-undelete', - 'accesskey-ca-move', - 'accesskey-ca-watch', - 'accesskey-ca-unwatch', - 'accesskey-search', - 'accesskey-search-go', - 'accesskey-search-fulltext', - 'accesskey-p-logo', - 'accesskey-n-mainpage', - 'accesskey-n-mainpage-description', - 'accesskey-n-portal', - 'accesskey-n-currentevents', - 'accesskey-n-recentchanges', - 'accesskey-n-randompage', - 'accesskey-n-help', - 'accesskey-t-whatlinkshere', - 'accesskey-t-recentchangeslinked', - 'accesskey-feed-rss', - 'accesskey-feed-atom', - 'accesskey-t-contributions', - 'accesskey-t-emailuser', - 'accesskey-t-permalink', - 'accesskey-t-print', - 'accesskey-t-upload', - 'accesskey-t-specialpages', - 'accesskey-ca-nstab-main', - 'accesskey-ca-nstab-user', - 'accesskey-ca-nstab-media', - 'accesskey-ca-nstab-special', - 'accesskey-ca-nstab-project', - 'accesskey-ca-nstab-image', - 'accesskey-ca-nstab-mediawiki', - 'accesskey-ca-nstab-template', - 'accesskey-ca-nstab-help', - 'accesskey-ca-nstab-category', - 'accesskey-minoredit', - 'accesskey-save', - 'accesskey-preview', - 'accesskey-diff', - 'accesskey-compareselectedversions', - 'accesskey-watch', - 'accesskey-upload', - 'accesskey-preferences-save', - 'accesskey-summary', - 'accesskey-userrights-set', - 'accesskey-blockip-block', - 'accesskey-export', - 'accesskey-import', - 'accesskey-watchlistedit-normal-submit', - 'accesskey-watchlistedit-raw-submit', - 'addsection', - 'talkpageheader', - 'anonnotice', - 'autoblock_whitelist', - 'searchmenu-new-nocreate', - 'googlesearch', - 'opensearch-desc', - 'exif-make-value', - 'exif-model-value', - 'exif-software-value', - 'exif-software-version-value', - 'history_copyright', - 'licenses', - 'loginstart', - 'loginend-https', - 'loginend', - 'loginlanguagelinks', - 'pear-mail-error', - 'php-mail-error', - 'markaspatrolledlink', - 'newarticletextanon', - 'newsectionheaderdefaultlevel', - 'mainpage-nstab', - 'newtalkseparator', - 'noarticletextanon', - 'number_of_watching_users_RCview', - 'pagecategorieslink', - 'pubmedurl', - 'randompage-url', - 'recentchanges-url', - 'recentchangestext', - 'revision-info-current', - 'revision-nav', - 'rfcurl', - 'shareddescriptionfollows', - 'signature-anon', - 'signupstart', - 'signupend', - 'signupend-https', - 'sitenotice', - 'sitesubtitle', - 'sitetitle', - 'sp-contributions-footer', - 'sp-contributions-footer-anon', - 'sp-contributions-footer-newbies', - 'statistics-summary', - 'statistics-footer', - 'talkpagetext', - 'uploadfooter', - 'upload-default-description', - 'listgrouprights-link', - 'search-interwiki-custom', - 'allpages-summary', - 'booksources-summary', - 'categories-summary', - 'blocklist-summary', - 'protectedtitles-summary', - 'listusers-summary', - 'longpages-summary', - 'preferences-summary', - 'specialpages-summary', - 'whatlinkshere-summary', - 'listredirects-summary', - 'uncategorizedpages-summary', - 'uncategorizedcategories-summary', - 'uncategorizedimages-summary', - 'uncategorizedtemplates-summary', - 'popularpages-summary', - 'wantedcategories-summary', - 'wantedfiles-summary', - 'wantedpages-summary', - 'watchlist-summary', - 'mostlinked-summary', - 'mostlinkedcategories-summary', - 'mostlinkedtemplates-summary', - 'mostcategories-summary', - 'mostimages-summary', - 'mostinterwikis-summary', - 'mostrevisions-summary', - 'prefixindex-summary', - 'shortpages-summary', - 'newpages-summary', - 'ancientpages-summary', - 'unwatchedpages-summary', - 'userrights-summary', - 'brokenredirects-summary', - 'deadendpages-summary', - 'protectedpages-summary', - 'disambiguations-summary', - 'pageswithprop-summary', - 'doubleredirects-summary', - 'lonelypages-summary', - 'unusedtemplates-summary', - 'fewestrevisions-summary', - 'upload-summary', - 'wantedtemplates-summary', - 'activeusers-summary', - 'search-summary', - 'editpage-head-copy-warn', - 'editpage-tos-summary', - 'addsection-preload', - 'addsection-editintro', - 'longpage-hint', - 'javascripttest-backlink', - 'javascripttest-qunit-name', - 'revdelete-logentry', - 'logdelete-logentry', - 'revdelete-content', - 'revdelete-summary', - 'revdelete-uname', - 'revdelete-hid', - 'revdelete-unhid', - 'revdelete-log-message', - 'logdelete-log-message', - 'deletedarticle', - 'suppressedarticle', - 'undeletedarticle', - 'patrol-log-line', - 'patrol-log-auto', - 'patrol-log-diff', - '1movedto2', - '1movedto2_redir', - 'move-redirect-suppressed', - 'newuserlog-create-entry', - 'newuserlog-create2-entry', - 'newuserlog-autocreate-entry', - 'rightslogentry', - 'rightslogentry-autopromote', - 'suppressedarticle', - 'deletedarticle', - // 'uploadedimage', - // 'overwroteimage', - 'createacct-helpusername', - 'createacct-imgcaptcha-help', - 'userlogout-summary', - 'changeemail-summary', - 'changepassword-summary', - 'unusedcategories-summary', - 'unusedimages-summary', - 'deletedcontributions-summary', - 'linksearch-summary', - 'emailuser-summary', - 'undelete-summary', - 'contributions-summary', - 'unblock-summary', - 'movepage-summary', - 'export-summary', - 'import-summary', - 'editwatchlist-summary', - 'version-summary', - 'tags-summary', - 'comparepages-summary', - 'resettokens-summary', - 'version-db-mysql-url', - 'version-db-mariadb-url', - 'version-db-percona-url', - 'version-db-postgres-url', - 'version-db-oracle-url', - 'version-db-sqlite-url', - 'version-db-mssql-url', - 'version-entrypoints-index-php', - 'version-entrypoints-api-php', - 'version-entrypoints-load-php', - 'ipb-default-expiry', - 'pageinfo-header', - 'pageinfo-footer', - 'createacct-benefit-head1', - 'createacct-benefit-icon1', - 'createacct-benefit-head2', - 'createacct-benefit-icon2', - 'createacct-benefit-head3', - 'createacct-benefit-icon3', - 'today-at', - 'redirect-text', - 'helppage', - 'edithelppage', - 'helplogin-url', - 'autocomment-prefix', - 'move-redirect-text', -); - -/** Optional messages, which may be translated only if changed in the target language. */ -$wgOptionalMessages = array( - 'linkprefix', - 'feed-atom', - 'feed-rss', - 'unit-pixel', - 'userrights-irreversible-marker', - 'tog-noconvertlink', - 'variantname-zh-hans', - 'variantname-zh-hant', - 'variantname-zh-cn', - 'variantname-zh-tw', - 'variantname-zh-hk', - 'variantname-zh-mo', - 'variantname-zh-my', - 'variantname-zh-sg', - 'variantname-zh', - 'variantname-gan-hans', - 'variantname-gan-hant', - 'variantname-gan', - 'variantname-sr-ec', - 'variantname-sr-el', - 'variantname-sr', - 'variantname-kk-arab', - 'variantname-kk-cyrl', - 'variantname-kk-latn', - 'variantname-kk-tr', - 'variantname-kk-kz', - 'variantname-kk-cn', - 'variantname-kk', - 'variantname-ku-latn', - 'variantname-ku-arab', - 'variantname-ku', - 'variantname-tg-cyrl', - 'variantname-tg-latn', - 'variantname-tg', - 'variantname-ike-cans', - 'variantname-ike-latn', - 'variantname-iu', - 'variantname-shi-tfng', - 'variantname-shi-latn', - 'variantname-shi', - 'rc-change-size', - 'resetpass_text', - 'image_sample', - 'media_sample', - 'skinname-cologneblue', - 'skinname-monobook', - 'skinname-modern', - 'skinname-vector', - 'common.css', - 'cologneblue.css', - 'monobook.css', - 'modern.css', - 'vector.css', - 'print.css', - 'noscript.css', - 'group-autoconfirmed.css', - 'group-bot.css', - 'group-sysop.css', - 'group-bureaucrat.css', - 'common.js', - 'cologneblue.js', - 'monobook.js', - 'modern.js', - 'vector.js', - 'group-autoconfirmed.js', - 'group-bot.js', - 'group-sysop.js', - 'group-bureaucrat.js', - 'widthheight', - 'exif-fnumber-format', - 'exif-focallength-format', - 'exif-compression-5', - 'exif-compression-6', - 'exif-compression-7', - 'exif-compression-8', - 'exif-compression-32773', - 'exif-compression-32946', - 'exif-compression-34712', - 'exif-photometricinterpretation-2', - 'exif-photometricinterpretation-6', - 'exif-xyresolution-i', - 'exif-xyresolution-c', - 'exif-colorspace-1', - 'exif-componentsconfiguration-1', - 'exif-componentsconfiguration-2', - 'exif-componentsconfiguration-3', - 'exif-componentsconfiguration-4', - 'exif-componentsconfiguration-5', - 'exif-componentsconfiguration-6', - 'exif-contact-value', - 'exif-coordinate-format', - 'exif-lightsource-20', - 'exif-lightsource-21', - 'exif-lightsource-22', - 'exif-lightsource-23', - 'exif-maxaperturevalue-value', - 'exif-subjectnewscode-value', - 'booksources-isbn', - 'protect-summary-desc', - 'sp-contributions-explain', - 'sorbs', - 'video-dims', - 'seconds-abbrev', - 'minutes-abbrev', - 'hours-abbrev', - 'days-abbrev', - 'pagetitle', - 'filename-prefix-blacklist', - 'edittools', - 'edittools-upload', - 'size-bytes', - 'size-kilobytes', - 'size-megabytes', - 'size-gigabytes', - 'size-terabytes', - 'size-petabytes', - 'size-exabytes', - 'size-zetabytes', - 'size-yottabytes', - 'bitrate-bits', - 'bitrate-kilobits', - 'bitrate-megabits', - 'bitrate-gigabits', - 'bitrate-terabits', - 'bitrate-petabits', - 'bitrate-exabits', - 'bitrate-zetabits', - 'bitrate-yottabits', - 'iranian-calendar-m1', - 'iranian-calendar-m2', - 'iranian-calendar-m3', - 'iranian-calendar-m4', - 'iranian-calendar-m5', - 'iranian-calendar-m6', - 'iranian-calendar-m7', - 'iranian-calendar-m8', - 'iranian-calendar-m9', - 'iranian-calendar-m10', - 'iranian-calendar-m11', - 'iranian-calendar-m12', - 'hijri-calendar-m1', - 'hijri-calendar-m2', - 'hijri-calendar-m3', - 'hijri-calendar-m4', - 'hijri-calendar-m5', - 'hijri-calendar-m6', - 'hijri-calendar-m7', - 'hijri-calendar-m8', - 'hijri-calendar-m9', - 'hijri-calendar-m10', - 'hijri-calendar-m11', - 'hijri-calendar-m12', - 'hebrew-calendar-m1', - 'hebrew-calendar-m2', - 'hebrew-calendar-m3', - 'hebrew-calendar-m4', - 'hebrew-calendar-m5', - 'hebrew-calendar-m6', - 'hebrew-calendar-m6a', - 'hebrew-calendar-m6b', - 'hebrew-calendar-m7', - 'hebrew-calendar-m8', - 'hebrew-calendar-m9', - 'hebrew-calendar-m10', - 'hebrew-calendar-m11', - 'hebrew-calendar-m12', - 'hebrew-calendar-m1-gen', - 'hebrew-calendar-m2-gen', - 'hebrew-calendar-m3-gen', - 'hebrew-calendar-m4-gen', - 'hebrew-calendar-m5-gen', - 'hebrew-calendar-m6-gen', - 'hebrew-calendar-m6a-gen', - 'hebrew-calendar-m6b-gen', - 'hebrew-calendar-m7-gen', - 'hebrew-calendar-m8-gen', - 'hebrew-calendar-m9-gen', - 'hebrew-calendar-m10-gen', - 'hebrew-calendar-m11-gen', - 'hebrew-calendar-m12-gen', - 'version-api', - 'version-svn-revision', - 'semicolon-separator', - 'comma-separator', - 'colon-separator', - 'pipe-separator', - 'word-separator', - 'ellipsis', - 'percent', - 'parentheses', - 'brackets', - 'listgrouprights-right-display', - 'listgrouprights-right-revoked', - 'timezone-utc', - 'unpatrolledletter', - 'diff-with-additional', - 'pagetitle-view-mainpage', - 'backlinksubtitle', - 'prefs-registration-date-time', - 'prefs-memberingroups-type', - 'userrights-groupsmember-type', - 'shared-repo-name-wikimediacommons', - 'usermessage-template', - 'filepage.css', - 'metadata-langitem', - 'metadata-langitem-default', - 'nocookiesforlogin', - 'version-entrypoints-articlepath', - 'version-entrypoints-scriptpath', - 'mergehistory-revisionrow', - 'categoryviewer-pagedlinks', - 'undelete-revisionrow', - 'pageinfo-redirects-value', - 'created', // @deprecated. Remove in MediaWiki 1.23. - 'changed', // @deprecated. Remove in MediaWiki 1.23. - 'limitreport-ppvisitednodes-value', - 'limitreport-ppgeneratednodes-value', - 'limitreport-expansiondepth-value', - 'limitreport-expensivefunctioncount-value', - 'tooltip-iwiki', -); - -/** Exif messages, which may be set as optional in several checks, but are generally mandatory */ -$wgEXIFMessages = array( - 'exif-imagewidth', - 'exif-imagelength', - 'exif-bitspersample', - 'exif-compression', - 'exif-photometricinterpretation', - 'exif-orientation', - 'exif-samplesperpixel', - 'exif-planarconfiguration', - 'exif-ycbcrsubsampling', - 'exif-ycbcrpositioning', - 'exif-xresolution', - 'exif-yresolution', - 'exif-stripoffsets', - 'exif-rowsperstrip', - 'exif-stripbytecounts', - 'exif-jpeginterchangeformat', - 'exif-jpeginterchangeformatlength', - 'exif-whitepoint', - 'exif-primarychromaticities', - 'exif-ycbcrcoefficients', - 'exif-referenceblackwhite', - 'exif-datetime', - 'exif-imagedescription', - 'exif-make', - 'exif-model', - 'exif-software', - 'exif-artist', - 'exif-copyright', - 'exif-exifversion', - 'exif-flashpixversion', - 'exif-colorspace', - 'exif-componentsconfiguration', - 'exif-compressedbitsperpixel', - 'exif-pixelydimension', - 'exif-pixelxdimension', - 'exif-usercomment', - 'exif-relatedsoundfile', - 'exif-datetimeoriginal', - 'exif-datetimedigitized', - 'exif-subsectime', - 'exif-subsectimeoriginal', - 'exif-subsectimedigitized', - 'exif-exposuretime', - 'exif-exposuretime-format', - 'exif-fnumber', - 'exif-fnumber-format', - 'exif-exposureprogram', - 'exif-spectralsensitivity', - 'exif-isospeedratings', - 'exif-shutterspeedvalue', - 'exif-aperturevalue', - 'exif-brightnessvalue', - 'exif-exposurebiasvalue', - 'exif-maxaperturevalue', - 'exif-subjectdistance', - 'exif-meteringmode', - 'exif-lightsource', - 'exif-flash', - 'exif-focallength', - 'exif-focallength-format', - 'exif-subjectarea', - 'exif-flashenergy', - 'exif-focalplanexresolution', - 'exif-focalplaneyresolution', - 'exif-focalplaneresolutionunit', - 'exif-subjectlocation', - 'exif-exposureindex', - 'exif-sensingmethod', - 'exif-filesource', - 'exif-scenetype', - 'exif-customrendered', - 'exif-exposuremode', - 'exif-whitebalance', - 'exif-digitalzoomratio', - 'exif-focallengthin35mmfilm', - 'exif-scenecapturetype', - 'exif-gaincontrol', - 'exif-contrast', - 'exif-saturation', - 'exif-sharpness', - 'exif-devicesettingdescription', - 'exif-subjectdistancerange', - 'exif-imageuniqueid', - 'exif-gpsversionid', - 'exif-gpslatituderef', - 'exif-gpslatitude', - 'exif-gpslongituderef', - 'exif-gpslongitude', - 'exif-gpsaltituderef', - 'exif-gpsaltitude', - 'exif-gpstimestamp', - 'exif-gpssatellites', - 'exif-gpsstatus', - 'exif-gpsmeasuremode', - 'exif-gpsdop', - 'exif-gpsspeedref', - 'exif-gpsspeed', - 'exif-gpstrackref', - 'exif-gpstrack', - 'exif-gpsimgdirectionref', - 'exif-gpsimgdirection', - 'exif-gpsmapdatum', - 'exif-gpsdestlatituderef', - 'exif-gpsdestlatitude', - 'exif-gpsdestlongituderef', - 'exif-gpsdestlongitude', - 'exif-gpsdestbearingref', - 'exif-gpsdestbearing', - 'exif-gpsdestdistanceref', - 'exif-gpsdestdistance', - 'exif-gpsprocessingmethod', - 'exif-gpsareainformation', - 'exif-gpsdatestamp', - 'exif-gpsdifferential', - 'exif-coordinate-format', - 'exif-jpegfilecomment', - 'exif-keywords', - 'exif-worldregioncreated', - 'exif-countrycreated', - 'exif-countrycodecreated', - 'exif-provinceorstatecreated', - 'exif-citycreated', - 'exif-sublocationcreated', - 'exif-worldregiondest', - 'exif-countrydest', - 'exif-countrycodedest', - 'exif-provinceorstatedest', - 'exif-citydest', - 'exif-sublocationdest', - 'exif-objectname', - 'exif-specialinstructions', - 'exif-headline', - 'exif-credit', - 'exif-source', - 'exif-editstatus', - 'exif-urgency', - 'exif-fixtureidentifier', - 'exif-locationdest', - 'exif-locationdestcode', - 'exif-objectcycle', - 'exif-contact', - 'exif-writer', - 'exif-languagecode', - 'exif-iimversion', - 'exif-iimcategory', - 'exif-iimsupplementalcategory', - 'exif-datetimeexpires', - 'exif-datetimereleased', - 'exif-originaltransmissionref', - 'exif-identifier', - 'exif-lens', - 'exif-serialnumber', - 'exif-cameraownername', - 'exif-label', - 'exif-datetimemetadata', - 'exif-nickname', - 'exif-rating', - 'exif-rightscertificate', - 'exif-copyrighted', - 'exif-copyrightowner', - 'exif-usageterms', - 'exif-webstatement', - 'exif-originaldocumentid', - 'exif-licenseurl', - 'exif-morepermissionsurl', - 'exif-attributionurl', - 'exif-preferredattributionname', - 'exif-pngfilecomment', - 'exif-disclaimer', - 'exif-contentwarning', - 'exif-giffilecomment', - 'exif-intellectualgenre', - 'exif-subjectnewscode', - 'exif-scenecode', - 'exif-event', - 'exif-organisationinimage', - 'exif-personinimage', - 'exif-originalimageheight', - 'exif-originalimagewidth', - 'exif-make-value', - 'exif-model-value', - 'exif-software-value', - 'exif-software-version-value', - 'exif-contact-value', - 'exif-subjectnewscode-value', - 'exif-compression-1', - 'exif-compression-2', - 'exif-compression-3', - 'exif-compression-4', - 'exif-compression-5', - 'exif-compression-6', - 'exif-compression-7', - 'exif-compression-8', - 'exif-compression-32773', - 'exif-compression-32946', - 'exif-compression-34712', - 'exif-copyrighted-true', - 'exif-copyrighted-false', - 'exif-photometricinterpretation-2', - 'exif-photometricinterpretation-6', - 'exif-unknowndate', - 'exif-orientation-1', - 'exif-orientation-2', - 'exif-orientation-3', - 'exif-orientation-4', - 'exif-orientation-5', - 'exif-orientation-6', - 'exif-orientation-7', - 'exif-orientation-8', - 'exif-planarconfiguration-1', - 'exif-planarconfiguration-2', - 'exif-xyresolution-i', - 'exif-xyresolution-c', - 'exif-colorspace-1', - 'exif-colorspace-65535', - 'exif-componentsconfiguration-0', - 'exif-componentsconfiguration-1', - 'exif-componentsconfiguration-2', - 'exif-componentsconfiguration-3', - 'exif-componentsconfiguration-4', - 'exif-componentsconfiguration-5', - 'exif-componentsconfiguration-6', - 'exif-exposureprogram-0', - 'exif-exposureprogram-1', - 'exif-exposureprogram-2', - 'exif-exposureprogram-3', - 'exif-exposureprogram-4', - 'exif-exposureprogram-5', - 'exif-exposureprogram-6', - 'exif-exposureprogram-7', - 'exif-exposureprogram-8', - 'exif-subjectdistance-value', - 'exif-meteringmode-0', - 'exif-meteringmode-1', - 'exif-meteringmode-2', - 'exif-meteringmode-3', - 'exif-meteringmode-4', - 'exif-meteringmode-5', - 'exif-meteringmode-6', - 'exif-meteringmode-255', - 'exif-lightsource-0', - 'exif-lightsource-1', - 'exif-lightsource-2', - 'exif-lightsource-3', - 'exif-lightsource-4', - 'exif-lightsource-9', - 'exif-lightsource-10', - 'exif-lightsource-11', - 'exif-lightsource-12', - 'exif-lightsource-13', - 'exif-lightsource-14', - 'exif-lightsource-15', - 'exif-lightsource-17', - 'exif-lightsource-18', - 'exif-lightsource-19', - 'exif-lightsource-20', - 'exif-lightsource-21', - 'exif-lightsource-22', - 'exif-lightsource-23', - 'exif-lightsource-24', - 'exif-lightsource-255', - 'exif-flash-fired-0', - 'exif-flash-fired-1', - 'exif-flash-return-0', - 'exif-flash-return-2', - 'exif-flash-return-3', - 'exif-flash-mode-1', - 'exif-flash-mode-2', - 'exif-flash-mode-3', - 'exif-flash-function-1', - 'exif-flash-redeye-1', - 'exif-focalplaneresolutionunit-2', - 'exif-sensingmethod-1', - 'exif-sensingmethod-2', - 'exif-sensingmethod-3', - 'exif-sensingmethod-4', - 'exif-sensingmethod-5', - 'exif-sensingmethod-7', - 'exif-sensingmethod-8', - 'exif-filesource-3', - 'exif-scenetype-1', - 'exif-customrendered-0', - 'exif-customrendered-1', - 'exif-exposuremode-0', - 'exif-exposuremode-1', - 'exif-exposuremode-2', - 'exif-whitebalance-0', - 'exif-whitebalance-1', - 'exif-scenecapturetype-0', - 'exif-scenecapturetype-1', - 'exif-scenecapturetype-2', - 'exif-scenecapturetype-3', - 'exif-gaincontrol-0', - 'exif-gaincontrol-1', - 'exif-gaincontrol-2', - 'exif-gaincontrol-3', - 'exif-gaincontrol-4', - 'exif-contrast-0', - 'exif-contrast-1', - 'exif-contrast-2', - 'exif-saturation-0', - 'exif-saturation-1', - 'exif-saturation-2', - 'exif-sharpness-0', - 'exif-sharpness-1', - 'exif-sharpness-2', - 'exif-subjectdistancerange-0', - 'exif-subjectdistancerange-1', - 'exif-subjectdistancerange-2', - 'exif-subjectdistancerange-3', - 'exif-gpslatitude-n', - 'exif-gpslatitude-s', - 'exif-gpslongitude-e', - 'exif-gpslongitude-w', - 'exif-gpsaltitude-above-sealevel', - 'exif-gpsaltitude-below-sealevel', - 'exif-gpsstatus-a', - 'exif-gpsstatus-v', - 'exif-gpsmeasuremode-2', - 'exif-gpsmeasuremode-3', - 'exif-gpsspeed-k', - 'exif-gpsspeed-m', - 'exif-gpsspeed-n', - 'exif-gpsdestdistance-k', - 'exif-gpsdestdistance-m', - 'exif-gpsdestdistance-n', - 'exif-gpsdop-excellent', - 'exif-gpsdop-good', - 'exif-gpsdop-moderate', - 'exif-gpsdop-fair', - 'exif-gpsdop-poor', - 'exif-objectcycle-a', - 'exif-objectcycle-p', - 'exif-objectcycle-b', - 'exif-gpsdirection-t', - 'exif-gpsdirection-m', - 'exif-ycbcrpositioning-1', - 'exif-ycbcrpositioning-2', - 'exif-dc-contributor', - 'exif-dc-coverage', - 'exif-dc-date', - 'exif-dc-publisher', - 'exif-dc-relation', - 'exif-dc-rights', - 'exif-dc-source', - 'exif-dc-type', - 'exif-rating-rejected', - 'exif-isospeedratings-overflow', - 'exif-maxaperturevalue-value', - 'exif-iimcategory-ace', - 'exif-iimcategory-clj', - 'exif-iimcategory-dis', - 'exif-iimcategory-fin', - 'exif-iimcategory-edu', - 'exif-iimcategory-evn', - 'exif-iimcategory-hth', - 'exif-iimcategory-hum', - 'exif-iimcategory-lab', - 'exif-iimcategory-lif', - 'exif-iimcategory-pol', - 'exif-iimcategory-rel', - 'exif-iimcategory-sci', - 'exif-iimcategory-soi', - 'exif-iimcategory-spo', - 'exif-iimcategory-war', - 'exif-iimcategory-wea', - 'exif-urgency-normal', - 'exif-urgency-low', - 'exif-urgency-high', - 'exif-urgency-other', -); diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc deleted file mode 100644 index e351549b..00000000 --- a/maintenance/language/messages.inc +++ /dev/null @@ -1,4239 +0,0 @@ -<?php -/** - * Define the messages structure in the messages file, for an automated rewriting. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * http://www.gnu.org/copyleft/gpl.html - * - * @file - * @ingroup MaintenanceLanguage - */ - -/** The structure of the messages, divided to blocks */ -$wgMessageStructure = array( - 'sidebar' => array( - 'sidebar', - ), - 'toggles' => array( - 'tog-underline', - 'tog-justify', - 'tog-hideminor', - 'tog-hidepatrolled', - 'tog-newpageshidepatrolled', - 'tog-extendwatchlist', - 'tog-usenewrc', - 'tog-numberheadings', - 'tog-showtoolbar', - 'tog-editondblclick', - 'tog-editsection', - 'tog-editsectiononrightclick', - 'tog-showtoc', - 'tog-rememberpassword', - 'tog-watchcreations', - 'tog-watchdefault', - 'tog-watchmoves', - 'tog-watchdeletion', - 'tog-minordefault', - 'tog-previewontop', - 'tog-previewonfirst', - 'tog-nocache', - 'tog-enotifwatchlistpages', - 'tog-enotifusertalkpages', - 'tog-enotifminoredits', - 'tog-enotifrevealaddr', - 'tog-shownumberswatching', - 'tog-oldsig', - 'tog-fancysig', - 'tog-uselivepreview', - 'tog-forceeditsummary', - 'tog-watchlisthideown', - 'tog-watchlisthidebots', - 'tog-watchlisthideminor', - 'tog-watchlisthideliu', - 'tog-watchlisthideanons', - 'tog-watchlisthidepatrolled', - 'tog-ccmeonemails', - 'tog-diffonly', - 'tog-showhiddencats', - 'tog-noconvertlink', - 'tog-norollbackdiff', - 'tog-useeditwarning', - 'tog-prefershttps' - ), - 'underline' => array( - 'underline-always', - 'underline-never', - 'underline-default', - ), - 'editfont' => array( - 'editfont-style', - 'editfont-default', - 'editfont-monospace', - 'editfont-sansserif', - 'editfont-serif', - ), - 'dates' => array( - 'sunday', - 'monday', - 'tuesday', - 'wednesday', - 'thursday', - 'friday', - 'saturday', - 'sun', - 'mon', - 'tue', - 'wed', - 'thu', - 'fri', - 'sat', - 'january', - 'february', - 'march', - 'april', - 'may_long', - 'june', - 'july', - 'august', - 'september', - 'october', - 'november', - 'december', - 'january-gen', - 'february-gen', - 'march-gen', - 'april-gen', - 'may-gen', - 'june-gen', - 'july-gen', - 'august-gen', - 'september-gen', - 'october-gen', - 'november-gen', - 'december-gen', - 'jan', - 'feb', - 'mar', - 'apr', - 'may', - 'jun', - 'jul', - 'aug', - 'sep', - 'oct', - 'nov', - 'dec', - 'january-date', - 'february-date', - 'march-date', - 'april-date', - 'may-date', - 'june-date', - 'july-date', - 'august-date', - 'september-date', - 'october-date', - 'november-date', - 'december-date', - ), - 'categorypages' => array( - 'pagecategories', - 'pagecategorieslink', - 'category_header', - 'subcategories', - 'category-media-header', - 'category-empty', - 'hidden-categories', - 'hidden-category-category', - 'category-subcat-count', - 'category-subcat-count-limited', - 'category-article-count', - 'category-article-count-limited', - 'category-file-count', - 'category-file-count-limited', - 'listingcontinuesabbrev', - 'index-category', - 'noindex-category', - 'broken-file-category', - 'categoryviewer-pagedlinks', - ), - 'mainpage' => array( - 'linkprefix', - ), - 'miscellaneous1' => array( - 'about', - 'article', - 'newwindow', - 'cancel', - 'moredotdotdot', - 'morenotlisted', - 'mypage', - 'mytalk', - 'anontalk', - 'navigation', - 'and', - ), - 'cologneblue' => array( - 'qbfind', - 'qbbrowse', - 'qbedit', - 'qbpageoptions', - 'qbmyoptions', - 'qbspecialpages', - 'faq', - 'faqpage', - 'sitetitle', - 'sitesubtitle', - ), - 'vector' => array( - 'vector-action-addsection', - 'vector-action-delete', - 'vector-action-move', - 'vector-action-protect', - 'vector-action-undelete', - 'vector-action-unprotect', - 'vector-simplesearch-preference', - 'vector-view-create', - 'vector-view-edit', - 'vector-view-history', - 'vector-view-view', - 'vector-view-viewsource', - 'actions', - 'namespaces', - 'variants', - ), - 'miscellaneous2' => array( - 'navigation-heading', - 'errorpagetitle', - 'returnto', - 'tagline', - 'help', - 'search', - 'searchbutton', - 'go', - 'searcharticle', - 'history', - 'history_short', - 'updatedmarker', - 'printableversion', - 'permalink', - 'print', - 'view', - 'edit', - 'create', - 'editthispage', - 'create-this-page', - 'delete', - 'deletethispage', - 'undeletethispage', - 'undelete_short', - 'viewdeleted_short', - 'protect', - 'protect_change', - 'protectthispage', - 'unprotect', - 'unprotectthispage', - 'newpage', - 'talkpage', - 'talkpagelinktext', - 'specialpage', - 'personaltools', - 'postcomment', - 'addsection', - 'articlepage', - 'talk', - 'views', - 'toolbox', - 'userpage', - 'projectpage', - 'imagepage', - 'mediawikipage', - 'templatepage', - 'viewhelppage', - 'categorypage', - 'viewtalkpage', - 'otherlanguages', - 'redirectedfrom', - 'redirectpagesub', - 'talkpageheader', - 'lastmodifiedat', - 'viewcount', - 'protectedpage', - 'jumpto', - 'jumptonavigation', - 'jumptosearch', - 'view-pool-error', - 'pool-timeout', - 'pool-queuefull', - 'pool-errorunknown', - ), - 'links' => array( - 'aboutsite', - 'aboutpage', - 'copyright', - 'copyrightpage', - 'currentevents', - 'currentevents-url', - 'disclaimers', - 'disclaimerpage', - 'edithelp', - 'edithelppage', - 'help', - 'helppage', - 'mainpage', - 'mainpage-description', - 'policy-url', - 'portal', - 'portal-url', - 'privacy', - 'privacypage', - ), - 'badaccess' => array( - 'badaccess', - 'badaccess-group0', - 'badaccess-groups', - ), - 'versionrequired' => array( - 'versionrequired', - 'versionrequiredtext', - ), - 'miscellaneous3' => array( - 'ok', - 'pagetitle', - 'pagetitle-view-mainpage', - 'backlinksubtitle', - 'retrievedfrom', - 'youhavenewmessages', - 'newmessageslink', - 'newmessagesdifflink', - 'youhavenewmessagesfromusers', - 'youhavenewmessagesmanyusers', - 'newmessageslinkplural', - 'newmessagesdifflinkplural', - 'youhavenewmessagesmulti', - 'newtalkseparator', - 'editsection', - 'editold', - 'viewsourceold', - 'editlink', - 'viewsourcelink', - 'editsectionhint', - 'toc', - 'showtoc', - 'hidetoc', - 'collapsible-collapse', - 'collapsible-expand', - 'thisisdeleted', - 'viewdeleted', - 'restorelink', - 'feedlinks', - 'feed-invalid', - 'feed-unavailable', - 'site-rss-feed', - 'site-atom-feed', - 'page-rss-feed', - 'page-atom-feed', - 'feed-atom', - 'feed-rss', - 'sitenotice', - 'anonnotice', - 'newsectionheaderdefaultlevel', - 'red-link-title', - 'sort-descending', - 'sort-ascending', - - ), - 'nstab' => array( - 'nstab-main', - 'nstab-user', - 'nstab-media', - 'nstab-special', - 'nstab-project', - 'nstab-image', - 'nstab-mediawiki', - 'nstab-template', - 'nstab-help', - 'nstab-category', - 'mainpage-nstab', - ), - 'main' => array( - 'nosuchaction', - 'nosuchactiontext', - 'nosuchspecialpage', - 'nospecialpagetext', - ), - 'errors' => array( - 'error', - 'databaseerror', - 'databaseerror-text', - 'databaseerror-textcl', - 'databaseerror-query', - 'databaseerror-function', - 'databaseerror-error', - 'laggedslavemode', - 'readonly', - 'enterlockreason', - 'readonlytext', - 'missing-article', // not used anymore in core, but kept for extensions - 'missingarticle-rev', // not used anymore in core, but kept for extensions - 'missingarticle-diff', // not used anymore in core, but kept for extensions - 'readonly_lag', - 'internalerror', - 'internalerror_info', - 'fileappenderrorread', - 'fileappenderror', - 'filecopyerror', - 'filerenameerror', - 'filedeleteerror', - 'directorycreateerror', - 'filenotfound', - 'fileexistserror', - 'unexpected', - 'formerror', - 'badarticleerror', - 'cannotdelete', - 'cannotdelete-title', - 'delete-hook-aborted', - 'no-null-revision', - 'badtitle', - 'badtitletext', - 'perfcached', - 'perfcachedts', - 'querypage-no-updates', - 'wrong_wfQuery_params', - 'viewsource', - 'viewsource-title', - 'actionthrottled', - 'actionthrottledtext', - 'protectedpagetext', - 'viewsourcetext', - 'viewyourtext', - 'protectedinterface', - 'editinginterface', - 'cascadeprotected', - 'namespaceprotected', - 'customcssprotected', - 'customjsprotected', - 'mycustomcssprotected', - 'mycustomjsprotected', - 'myprivateinfoprotected', - 'mypreferencesprotected', - 'ns-specialprotected', - 'titleprotected', - 'filereadonlyerror', - 'invalidtitle-knownnamespace', - 'invalidtitle-unknownnamespace', - 'exception-nologin', - 'exception-nologin-text', - ), - 'virus' => array( - 'virus-badscanner', - 'virus-scanfailed', - 'virus-unknownscanner', - ), - 'login' => array( - 'logouttext', - 'welcomeuser', - 'welcomecreation-msg', - 'yourname', - 'userlogin-yourname', - 'userlogin-yourname-ph', - 'createacct-another-username-ph', - 'createacct-helpusername', - 'yourpassword', - 'userlogin-yourpassword', - 'userlogin-yourpassword-ph', - 'createacct-yourpassword-ph', - 'yourpasswordagain', - 'createacct-yourpasswordagain', - 'createacct-yourpasswordagain-ph', - 'remembermypassword', - 'userlogin-remembermypassword', - 'userlogin-signwithsecure', - 'yourdomainname', - 'password-change-forbidden', - 'externaldberror', - 'login', - 'nav-login-createaccount', - 'loginprompt', - 'userlogin', - 'userloginnocreate', - 'logout', - 'userlogout', - 'userlogout-summary', - 'notloggedin', - 'userlogin-noaccount', - 'userlogin-joinproject', - 'nologin', - 'nologinlink', - 'createaccount', - 'gotaccount', - 'gotaccountlink', - 'userlogin-resetlink', - 'userlogin-resetpassword-link', - 'helplogin-url', - 'userlogin-helplink2', - 'userlogin-loggedin', - 'userlogin-createanother', - 'createacct-join', - 'createacct-another-join', - 'createacct-emailrequired', - 'createacct-emailoptional', - 'createacct-email-ph', - 'createacct-another-email-ph', - 'createaccountmail', - 'createacct-realname', - 'createaccountreason', - 'createacct-reason', - 'createacct-reason-ph', - 'createacct-captcha', - 'createacct-imgcaptcha-help', - 'createacct-imgcaptcha-ph', - 'createacct-submit', - 'createacct-another-submit', - 'createacct-benefit-heading', - 'createacct-benefit-icon1', - 'createacct-benefit-head1', - 'createacct-benefit-body1', - 'createacct-benefit-icon2', - 'createacct-benefit-head2', - 'createacct-benefit-body2', - 'createacct-benefit-icon3', - 'createacct-benefit-head3', - 'createacct-benefit-body3', - 'badretype', - 'userexists', - 'loginerror', - 'createacct-error', - 'createaccounterror', - 'nocookiesnew', - 'nocookieslogin', - 'nocookiesfornew', - 'nocookiesforlogin', - 'noname', - 'loginsuccesstitle', - 'loginsuccess', - 'nosuchuser', - 'nosuchusershort', - 'nouserspecified', - 'login-userblocked', - 'wrongpassword', - 'wrongpasswordempty', - 'passwordtooshort', - 'password-name-match', - 'password-login-forbidden', - 'mailmypassword', - 'passwordremindertitle', - 'passwordremindertext', - 'noemail', - 'noemailcreate', - 'passwordsent', - 'blocked-mailpassword', - 'eauthentsent', - 'throttled-mailpassword', - 'loginstart', - 'loginend', - 'loginend-https', - 'signupstart', - 'signupend', - 'signupend-https', - 'mailerror', - 'acct_creation_throttle_hit', - 'emailauthenticated', - 'emailnotauthenticated', - 'noemailprefs', - 'emailconfirmlink', - 'invalidemailaddress', - 'cannotchangeemail', - 'emaildisabled', - 'accountcreated', - 'accountcreatedtext', - 'createaccount-title', - 'createaccount-text', - 'usernamehasherror', - 'login-throttled', - 'login-abort-generic', - 'loginlanguagelabel', - 'loginlanguagelinks', - 'suspicious-userlogout', - 'createacct-another-realname-tip', - ), - 'mail' => array( - 'pear-mail-error', - 'php-mail-error', - 'php-mail-error-unknown', - 'user-mail-no-addy', - 'user-mail-no-body', - ), - 'resetpass' => array( - 'resetpass', - 'resetpass_announce', - 'resetpass_text', - 'resetpass_header', - 'oldpassword', - 'newpassword', - 'retypenew', - 'resetpass_submit', - 'changepassword-success', - 'resetpass_forbidden', - 'resetpass-no-info', - 'resetpass-submit-loggedin', - 'resetpass-submit-cancel', - 'resetpass-wrong-oldpass', - 'resetpass-temp-password', - 'resetpass-abort-generic', - ), - 'passwordreset' => array( - 'passwordreset', - 'passwordreset-text-one', - 'passwordreset-text-many', - 'passwordreset-legend', - 'passwordreset-disabled', - 'passwordreset-emaildisabled', - 'passwordreset-username', - 'passwordreset-domain', - 'passwordreset-capture', - 'passwordreset-capture-help', - 'passwordreset-email', - 'passwordreset-emailtitle', - 'passwordreset-emailtext-ip', - 'passwordreset-emailtext-user', - 'passwordreset-emailelement', - 'passwordreset-emailsent', - 'passwordreset-emailsent-capture', - 'passwordreset-emailerror-capture', - ), - 'changeemail' => array( - 'changeemail', - 'changeemail-summary', - 'changeemail-header', - 'changeemail-text', - 'changeemail-no-info', - 'changeemail-oldemail', - 'changeemail-newemail', - 'changeemail-none', - 'changeemail-password', - 'changeemail-submit', - 'changeemail-cancel', - ), - 'resettokens' => array( - 'resettokens', - 'resettokens-summary', - 'resettokens-text', - 'resettokens-no-tokens', - 'resettokens-legend', - 'resettokens-tokens', - 'resettokens-token-label', - 'resettokens-watchlist-token', - 'resettokens-done', - 'resettokens-resetbutton', - ), - 'toolbar' => array( - 'bold_sample', - 'bold_tip', - 'italic_sample', - 'italic_tip', - 'link_sample', - 'link_tip', - 'extlink_sample', - 'extlink_tip', - 'headline_sample', - 'headline_tip', - 'nowiki_sample', - 'nowiki_tip', - 'image_sample', - 'image_tip', - 'media_sample', - 'media_tip', - 'sig_tip', - 'hr_tip', - ), - 'edit' => array( - 'summary', - 'subject', - 'minoredit', - 'watchthis', - 'savearticle', - 'preview', - 'showpreview', - 'showlivepreview', - 'showdiff', - 'anoneditwarning', - 'anonpreviewwarning', - 'missingsummary', - 'missingcommenttext', - 'missingcommentheader', - 'summary-preview', - 'subject-preview', - 'blockedtitle', - 'blockedtext', - 'autoblockedtext', - 'blockednoreason', - 'whitelistedittext', - 'confirmedittext', - 'nosuchsectiontitle', - 'nosuchsectiontext', - 'loginreqtitle', - 'loginreqlink', - 'loginreqpagetext', - 'accmailtitle', - 'accmailtext', - 'newarticle', - 'newarticletext', - 'newarticletextanon', - 'talkpagetext', - 'anontalkpagetext', - 'noarticletext', - 'noarticletext-nopermission', - 'noarticletextanon', - 'missing-revision', - 'userpage-userdoesnotexist', - 'userpage-userdoesnotexist-view', - 'blocked-notice-logextract', - 'clearyourcache', - 'usercssyoucanpreview', - 'userjsyoucanpreview', - 'usercsspreview', - 'userjspreview', - 'sitecsspreview', - 'sitejspreview', - 'userinvalidcssjstitle', - 'updated', - 'note', - 'previewnote', - 'continue-editing', - 'previewconflict', - 'session_fail_preview', - 'session_fail_preview_html', - 'token_suffix_mismatch', - 'edit_form_incomplete', - 'editing', - 'creating', - 'editingsection', - 'editingcomment', - 'editconflict', - 'explainconflict', - 'yourtext', - 'storedversion', - 'nonunicodebrowser', - 'editingold', - 'yourdiff', - 'copyrightwarning', - 'copyrightwarning2', - 'editpage-head-copy-warn', - 'editpage-tos-summary', - 'longpage-hint', - 'longpageerror', - 'readonlywarning', - 'protectedpagewarning', - 'semiprotectedpagewarning', - 'cascadeprotectedwarning', - 'titleprotectedwarning', - 'templatesused', - 'templatesusedpreview', - 'templatesusedsection', - 'template-protected', - 'template-semiprotected', - 'hiddencategories', - 'edittools', - 'edittools-upload', - 'nocreatetext', - 'nocreate-loggedin', - 'sectioneditnotsupported-title', - 'sectioneditnotsupported-text', - 'permissionserrors', - 'permissionserrorstext', - 'permissionserrorstext-withaction', - 'recreate-moveddeleted-warn', - 'moveddeleted-notice', - 'log-fulllog', - 'edit-hook-aborted', - 'edit-gone-missing', - 'edit-conflict', - 'edit-no-change', - 'postedit-confirmation', - 'edit-already-exists', - 'addsection-preload', - 'addsection-editintro', - 'defaultmessagetext', - 'content-failed-to-parse', - 'invalid-content-data', - 'content-not-allowed-here', - 'editwarning-warning', - ), - 'contentmodels' => array( - 'content-model-wikitext', - 'content-model-text', - 'content-model-javascript', - 'content-model-css', - ), - 'parserwarnings' => array( - 'expensive-parserfunction-warning', - 'expensive-parserfunction-category', - 'post-expand-template-inclusion-warning', - 'post-expand-template-inclusion-category', - 'post-expand-template-argument-warning', - 'post-expand-template-argument-category', - 'parser-template-loop-warning', - 'parser-template-recursion-depth-warning', - 'language-converter-depth-warning', - 'node-count-exceeded-category', - 'node-count-exceeded-warning', - 'expansion-depth-exceeded-category', - 'expansion-depth-exceeded-warning', - 'parser-unstrip-loop-warning', - 'parser-unstrip-recursion-limit', - 'converter-manual-rule-error', - ), - 'undo' => array( - 'undo-success', - 'undo-failure', - 'undo-norev', - 'undo-summary', - 'undo-summary-username-hidden', - ), - 'cantcreateaccount' => array( - 'cantcreateaccounttitle', - 'cantcreateaccount-text', - ), - 'history' => array( - 'viewpagelogs', - 'nohistory', - 'currentrev', - 'currentrev-asof', - 'revisionasof', - 'revision-info', - 'revision-info-current', - 'revision-nav', - 'previousrevision', - 'nextrevision', - 'currentrevisionlink', - 'cur', - 'next', - 'last', - 'page_first', - 'page_last', - 'histlegend', - 'history-fieldset-title', - 'history-show-deleted', - 'history_copyright', - 'histfirst', - 'histlast', - 'historysize', - 'historyempty', - ), - 'history-feed' => array( - 'history-feed-title', - 'history-feed-description', - 'history-feed-item-nocomment', - 'history-feed-empty', - ), - 'revdelete' => array( - 'rev-deleted-comment', - 'rev-deleted-user', - 'rev-deleted-event', - 'rev-deleted-user-contribs', - 'rev-deleted-text-permission', - 'rev-deleted-text-unhide', - 'rev-suppressed-text-unhide', - 'rev-deleted-text-view', - 'rev-suppressed-text-view', - 'rev-deleted-no-diff', - 'rev-suppressed-no-diff', - 'rev-deleted-unhide-diff', - 'rev-suppressed-unhide-diff', - 'rev-deleted-diff-view', - 'rev-suppressed-diff-view', - 'rev-delundel', - 'rev-showdeleted', - 'revisiondelete', - 'revdelete-nooldid-title', - 'revdelete-nooldid-text', - 'revdelete-nologtype-title', - 'revdelete-nologtype-text', - 'revdelete-nologid-title', - 'revdelete-nologid-text', - 'revdelete-no-file', - 'revdelete-show-file-confirm', - 'revdelete-show-file-submit', - 'revdelete-selected', - 'logdelete-selected', - 'revdelete-text', - 'revdelete-confirm', - 'revdelete-suppress-text', - 'revdelete-legend', - 'revdelete-hide-text', - 'revdelete-hide-image', - 'revdelete-hide-name', - 'revdelete-hide-comment', - 'revdelete-hide-user', - 'revdelete-hide-restricted', - 'revdelete-radio-same', - 'revdelete-radio-set', - 'revdelete-radio-unset', - 'revdelete-suppress', - 'revdelete-unsuppress', - 'revdelete-log', - 'revdelete-submit', - 'revdelete-success', - 'revdelete-failure', - 'logdelete-success', - 'logdelete-failure', - 'revdel-restore', - 'revdel-restore-deleted', - 'revdel-restore-visible', - 'pagehist', - 'deletedhist', - 'revdelete-hide-current', - 'revdelete-show-no-access', - 'revdelete-modify-no-access', - 'revdelete-modify-missing', - 'revdelete-no-change', - 'revdelete-concurrent-change', - 'revdelete-only-restricted', - 'revdelete-reason-dropdown', - 'revdelete-otherreason', - 'revdelete-reasonotherlist', - 'revdelete-edit-reasonlist', - 'revdelete-offender', - ), - 'suppression' => array( - 'suppressionlog', - 'suppressionlogtext', - ), - 'mergehistory' => array( - 'mergehistory', - 'mergehistory-header', - 'mergehistory-box', - 'mergehistory-from', - 'mergehistory-into', - 'mergehistory-list', - 'mergehistory-merge', - 'mergehistory-go', - 'mergehistory-submit', - 'mergehistory-empty', - 'mergehistory-success', - 'mergehistory-fail', - 'mergehistory-no-source', - 'mergehistory-no-destination', - 'mergehistory-invalid-source', - 'mergehistory-invalid-destination', - 'mergehistory-autocomment', - 'mergehistory-comment', - 'mergehistory-same-destination', - 'mergehistory-reason', - 'mergehistory-revisionrow' - ), - 'mergelog' => array( - 'mergelog', - 'pagemerge-logentry', - 'revertmerge', - 'mergelogpagetext', - ), - 'diffs' => array( - 'history-title', - 'difference-title', - 'difference-title-multipage', - 'difference-multipage', - 'lineno', - 'compareselectedversions', - 'showhideselectedversions', - 'editundo', - 'diff-empty', - 'diff-multi', - 'diff-multi-manyusers', - 'difference-missing-revision', - ), - 'search' => array( - 'search-summary', - 'searchresults', - 'searchresults-title', - 'searchresulttext', - 'searchsubtitle', - 'searchsubtitleinvalid', - 'toomanymatches', - 'titlematches', - 'notitlematches', - 'textmatches', - 'notextmatches', - 'prevn', - 'nextn', - 'prevn-title', - 'nextn-title', - 'shown-title', - 'viewprevnext', - 'searchmenu-legend', - 'searchmenu-exists', - 'searchmenu-new', - 'searchmenu-new-nocreate', - 'searchmenu-prefix', - 'searchprofile-articles', - 'searchprofile-project', - 'searchprofile-images', - 'searchprofile-everything', - 'searchprofile-advanced', - 'searchprofile-articles-tooltip', - 'searchprofile-project-tooltip', - 'searchprofile-images-tooltip', - 'searchprofile-everything-tooltip', - 'searchprofile-advanced-tooltip', - 'search-result-size', - 'search-result-category-size', - 'search-result-score', - 'search-redirect', - 'search-section', - 'search-suggest', - 'search-interwiki-caption', - 'search-interwiki-default', - 'search-interwiki-custom', - 'search-interwiki-more', - 'search-relatedarticle', - 'mwsuggest-disable', - 'searcheverything-enable', - 'searchrelated', - 'searchall', - 'showingresults', - 'showingresultsnum', - 'showingresultsheader', - 'nonefound', - 'search-nonefound', - 'powersearch', - 'powersearch-legend', - 'powersearch-ns', - 'powersearch-redir', - 'powersearch-field', - 'powersearch-togglelabel', - 'powersearch-toggleall', - 'powersearch-togglenone', - 'search-external', - 'searchdisabled', - 'googlesearch', - 'search-error', - ), - 'opensearch' => array( - 'opensearch-desc', - ), - 'preferences' => array( - 'preferences', - 'preferences-summary', - 'mypreferences', - 'prefs-edits', - 'prefsnologin', - 'prefsnologintext', - 'changepassword', - 'changepassword-summary', - 'prefs-skin', - 'skin-preview', - 'datedefault', - 'prefs-beta', - 'prefs-datetime', - 'prefs-labs', - 'prefs-user-pages', - 'prefs-personal', - 'prefs-rc', - 'prefs-watchlist', - 'prefs-watchlist-days', - 'prefs-watchlist-days-max', - 'prefs-watchlist-edits', - 'prefs-watchlist-edits-max', - 'prefs-watchlist-token', - 'prefs-misc', // continue checking if used from here on (r49916) - 'prefs-resetpass', - 'prefs-changeemail', - 'prefs-setemail', - 'prefs-email', - 'prefs-rendering', - 'saveprefs', - 'resetprefs', - 'restoreprefs', - 'prefs-editing', - 'rows', - 'columns', - 'searchresultshead', - 'resultsperpage', - 'stub-threshold', - 'stub-threshold-disabled', - 'recentchangesdays', - 'recentchangesdays-max', - 'recentchangescount', - 'prefs-help-recentchangescount', - 'prefs-help-watchlist-token2', - 'savedprefs', - 'timezonelegend', - 'localtime', - 'timezoneuseserverdefault', - 'timezoneuseoffset', - 'timezoneoffset', - 'servertime', - 'guesstimezone', - 'timezoneregion-africa', - 'timezoneregion-america', - 'timezoneregion-antarctica', - 'timezoneregion-arctic', - 'timezoneregion-asia', - 'timezoneregion-atlantic', - 'timezoneregion-australia', - 'timezoneregion-europe', - 'timezoneregion-indian', - 'timezoneregion-pacific', - 'allowemail', - 'prefs-searchoptions', - 'prefs-namespaces', - 'defaultns', - 'default', - 'defaultns', - 'prefs-files', - 'prefs-custom-css', - 'prefs-custom-js', - 'prefs-common-css-js', - 'prefs-reset-intro', - 'prefs-emailconfirm-label', - 'youremail', - 'username', - 'uid', - 'prefs-memberingroups', - 'prefs-memberingroups-type', - 'prefs-registration', - 'prefs-registration-date-time', - 'yourrealname', - 'yourlanguage', - 'yourvariant', - 'prefs-help-variant', - 'yournick', - 'prefs-help-signature', - 'badsig', - 'badsiglength', - 'yourgender', - 'gender-unknown', - 'gender-male', - 'gender-female', - 'prefs-help-gender', - 'email', - 'prefs-help-realname', - - # 3 messages depending upon $wgEmailConfirmToEdit and $wgEnableUserEmail - 'prefs-help-email', - 'prefs-help-email-others', - 'prefs-help-email-required', - - 'prefs-info', - 'prefs-i18n', - 'prefs-signature', - 'prefs-dateformat', - 'prefs-timeoffset', - 'prefs-advancedediting', - 'prefs-editor', - 'prefs-preview', - 'prefs-advancedrc', - 'prefs-advancedrendering', - 'prefs-advancedsearchoptions', - 'prefs-advancedwatchlist', - 'prefs-displayrc', - 'prefs-displaysearchoptions', - 'prefs-displaywatchlist', - 'prefs-tokenwatchlist', - 'prefs-diffs', - 'prefs-help-prefershttps', - ), - 'preferences-email' => array( - 'email-address-validity-valid', - 'email-address-validity-invalid', - ), - 'userrights' => array( - 'userrights', - 'userrights-summary', - 'userrights-lookup-user', - 'userrights-user-editname', - 'editusergroup', - 'editinguser', - 'userrights-editusergroup', - 'saveusergroups', - 'userrights-groupsmember', - 'userrights-groupsmember-auto', - 'userrights-groupsmember-type', - 'userrights-groups-help', - 'userrights-reason', - 'userrights-no-interwiki', - 'userrights-nodatabase', - 'userrights-nologin', - 'userrights-notallowed', - 'userrights-changeable-col', - 'userrights-unchangeable-col', - 'userrights-irreversible-marker', - 'userrights-conflict', - 'userrights-removed-self', - ), - 'group' => array( - 'group', - 'group-user', - 'group-autoconfirmed', - 'group-bot', - 'group-sysop', - 'group-bureaucrat', - 'group-suppress', - 'group-all', - ), - 'group-member' => array( - 'group-user-member', - 'group-autoconfirmed-member', - 'group-bot-member', - 'group-sysop-member', - 'group-bureaucrat-member', - 'group-suppress-member', - ), - 'grouppage' => array( - 'grouppage-user', - 'grouppage-autoconfirmed', - 'grouppage-bot', - 'grouppage-sysop', - 'grouppage-bureaucrat', - 'grouppage-suppress', - ), - 'right' => array( - 'right-read', - 'right-edit', - 'right-createpage', - 'right-createtalk', - 'right-createaccount', - 'right-minoredit', - 'right-move', - 'right-move-subpages', - 'right-move-rootuserpages', - 'right-movefile', - 'right-suppressredirect', - 'right-upload', - 'right-reupload', - 'right-reupload-own', - 'right-reupload-shared', - 'right-upload_by_url', - 'right-purge', - 'right-autoconfirmed', - 'right-bot', - 'right-nominornewtalk', - 'right-apihighlimits', - 'right-writeapi', - 'right-delete', - 'right-bigdelete', - 'right-deletelogentry', - 'right-deleterevision', - 'right-deletedhistory', - 'right-deletedtext', - 'right-browsearchive', - 'right-undelete', - 'right-suppressrevision', - 'right-suppressionlog', - 'right-block', - 'right-blockemail', - 'right-hideuser', - 'right-ipblock-exempt', - 'right-proxyunbannable', - 'right-unblockself', - 'right-protect', - 'right-editprotected', - 'right-editsemiprotected', - 'right-editinterface', - 'right-editusercssjs', - 'right-editusercss', - 'right-edituserjs', - 'right-editmyusercss', - 'right-editmyuserjs', - 'right-viewmywatchlist', - 'right-editmywatchlist', - 'right-viewmyprivateinfo', - 'right-editmyprivateinfo', - 'right-editmyoptions', - 'right-rollback', - 'right-markbotedits', - 'right-noratelimit', - 'right-import', - 'right-importupload', - 'right-patrol', - 'right-autopatrol', - 'right-patrolmarks', - 'right-unwatchedpages', - 'right-mergehistory', - 'right-userrights', - 'right-userrights-interwiki', - 'right-siteadmin', - 'right-override-export-depth', - 'right-sendemail', - 'right-passwordreset', - ), - 'newuserlog' => array( - 'newuserlogpage', - 'newuserlogpagetext', - ), - 'rightslog' => array( - 'rightslog', - 'rightslogtext', - ), - 'action' => array( - 'action-read', - 'action-edit', - 'action-createpage', - 'action-createtalk', - 'action-createaccount', - 'action-minoredit', - 'action-move', - 'action-move-subpages', - 'action-move-rootuserpages', - 'action-movefile', - 'action-upload', - 'action-reupload', - 'action-reupload-shared', - 'action-upload_by_url', - 'action-writeapi', - 'action-delete', - 'action-deleterevision', - 'action-deletedhistory', - 'action-browsearchive', - 'action-undelete', - 'action-suppressrevision', - 'action-suppressionlog', - 'action-block', - 'action-protect', - 'action-rollback', - 'action-import', - 'action-importupload', - 'action-patrol', - 'action-autopatrol', - 'action-unwatchedpages', - 'action-mergehistory', - 'action-userrights', - 'action-userrights-interwiki', - 'action-siteadmin', - 'action-sendemail', - 'action-editmywatchlist', - 'action-viewmywatchlist', - 'action-viewmyprivateinfo', - 'action-editmyprivateinfo', - ), - 'recentchanges' => array( - 'nchanges', - 'enhancedrc-since-last-visit', - 'enhancedrc-history', - 'recentchanges', - 'recentchanges-url', - 'recentchanges-legend', - 'recentchanges-summary', - 'recentchangestext', - 'recentchanges-noresult', - 'recentchanges-feed-description', - 'recentchanges-label-newpage', - 'recentchanges-label-minor', - 'recentchanges-label-bot', - 'recentchanges-label-unpatrolled', - 'rcnote', - 'rcnotefrom', - 'rclistfrom', - 'rcshowhideminor', - 'rcshowhidebots', - 'rcshowhideliu', - 'rcshowhideanons', - 'rcshowhidepatr', - 'rcshowhidemine', - 'rclinks', - 'diff', - 'hist', - 'hide', - 'show', - 'minoreditletter', - 'newpageletter', - 'boteditletter', - 'unpatrolledletter', - 'number_of_watching_users_RCview', - 'number_of_watching_users_pageview', - 'rc_categories', - 'rc_categories_any', - 'rc-change-size', - 'rc-change-size-new', - 'newsectionsummary', - 'rc-enhanced-expand', - 'rc-enhanced-hide', - 'rc-old-title', - ), - 'recentchangeslinked' => array( - 'recentchangeslinked', - 'recentchangeslinked-feed', - 'recentchangeslinked-toolbox', - 'recentchangeslinked-title', - 'recentchangeslinked-summary', - 'recentchangeslinked-page', - 'recentchangeslinked-to', - ), - 'upload' => array( - 'upload', - 'uploadbtn', - 'reuploaddesc', - 'upload-tryagain', - 'uploadnologin', - 'uploadnologintext', - 'upload_directory_missing', - 'upload_directory_read_only', - 'uploaderror', - 'upload-summary', - 'upload-recreate-warning', - 'uploadtext', - 'upload-permitted', - 'upload-preferred', - 'upload-prohibited', - 'uploadfooter', - 'upload-default-description', - 'uploadlog', - 'uploadlogpage', - 'uploadlogpagetext', - 'filename', - 'filedesc', - 'fileuploadsummary', - 'filereuploadsummary', - 'filestatus', - 'filesource', - 'uploadedfiles', - 'ignorewarning', - 'ignorewarnings', - 'minlength1', - 'illegalfilename', - 'filename-toolong', - 'badfilename', - 'filetype-mime-mismatch', - 'filetype-badmime', - 'filetype-bad-ie-mime', - 'filetype-unwanted-type', - 'filetype-banned-type', - 'filetype-missing', - 'empty-file', - 'file-too-large', - 'filename-tooshort', - 'filetype-banned', - 'verification-error', - 'hookaborted', - 'illegal-filename', - 'overwrite', - 'unknown-error', - 'tmp-create-error', - 'tmp-write-error', - 'large-file', - 'largefileserver', - 'emptyfile', - 'windows-nonascii-filename', - 'fileexists', - 'filepageexists', - 'fileexists-extension', - 'fileexists-thumbnail-yes', - 'file-thumbnail-no', - 'fileexists-forbidden', - 'fileexists-shared-forbidden', - 'file-exists-duplicate', - 'file-deleted-duplicate', - 'uploadwarning', - 'uploadwarning-text', - 'savefile', - 'uploadedimage', - 'overwroteimage', - 'uploaddisabled', - 'copyuploaddisabled', - 'uploadfromurl-queued', - 'uploaddisabledtext', - 'php-uploaddisabledtext', - 'uploadscripted', - 'uploadvirus', - 'uploadjava', - 'upload-source', - 'sourcefilename', - 'sourceurl', - 'destfilename', - 'upload-maxfilesize', - 'upload-description', - 'upload-options', - 'watchthisupload', - 'filewasdeleted', - 'filename-bad-prefix', - 'filename-prefix-blacklist', - 'upload-success-subj', - 'upload-success-msg', - 'upload-failure-subj', - 'upload-failure-msg', - 'upload-warning-subj', - 'upload-warning-msg', - ), - 'upload-errors' => array( - 'upload-proto-error', - 'upload-proto-error-text', - 'upload-file-error', - 'upload-file-error-text', - 'upload-misc-error', - 'upload-misc-error-text', - 'upload-too-many-redirects', - 'upload-unknown-size', - 'upload-http-error', - 'upload-copy-upload-invalid-domain', - ), - - 'filebackend-errors' => array( - 'backend-fail-stream', - 'backend-fail-backup', - 'backend-fail-notexists', - 'backend-fail-hashes', - 'backend-fail-notsame', - 'backend-fail-invalidpath', - 'backend-fail-delete', - 'backend-fail-describe', - 'backend-fail-alreadyexists', - 'backend-fail-store', - 'backend-fail-copy', - 'backend-fail-move', - 'backend-fail-opentemp', - 'backend-fail-writetemp', - 'backend-fail-closetemp', - 'backend-fail-read', - 'backend-fail-create', - 'backend-fail-maxsize', - 'backend-fail-readonly', - 'backend-fail-synced', - 'backend-fail-connect', - 'backend-fail-internal', - 'backend-fail-contenttype', - 'backend-fail-batchsize', - 'backend-fail-usable' - ), - - 'filejournal-errors' => array( - 'filejournal-fail-dbconnect', - 'filejournal-fail-dbquery' - ), - - 'lockmanager-errors' => array( - 'lockmanager-notlocked', - 'lockmanager-fail-closelock', - 'lockmanager-fail-deletelock', - 'lockmanager-fail-acquirelock', - 'lockmanager-fail-openlock', - 'lockmanager-fail-acquirelock', - 'lockmanager-fail-releaselock', - 'lockmanager-fail-db-bucket', - 'lockmanager-fail-db-release', - 'lockmanager-fail-svr-acquire', - 'lockmanager-fail-svr-release' - ), - - 'zip' => array( - 'zip-file-open-error', - 'zip-wrong-format', - 'zip-bad', - 'zip-unsupported' - ), - - 'uploadstash' => array( - 'uploadstash', - 'uploadstash-summary', - 'uploadstash-clear', - 'uploadstash-nofiles', - 'uploadstash-badtoken', - 'uploadstash-errclear', - 'uploadstash-refresh', - 'invalid-chunk-offset', - ), - - 'img-auth' => array( - 'img-auth-accessdenied', - 'img-auth-desc', - 'img-auth-nopathinfo', - 'img-auth-notindir', - 'img-auth-badtitle', - 'img-auth-nologinnWL', - 'img-auth-nofile', - 'img-auth-isdir', - 'img-auth-streaming', - 'img-auth-public', - 'img-auth-noread', - 'img-auth-bad-query-string', - ), - - 'http-errors' => array( - 'http-invalid-url', - 'http-invalid-scheme', - 'http-request-error', - 'http-read-error', - 'http-timed-out', - 'http-curl-error', - 'http-bad-status', - ), - - 'upload-curl-errors' => array( - 'upload-curl-error6', - 'upload-curl-error6-text', - 'upload-curl-error28', - 'upload-curl-error28-text', - ), - 'licenses' => array( - 'license', - 'license-header', - 'nolicense', - 'licenses', - 'license-nopreview', - 'upload_source_url', - 'upload_source_file', - ), - 'filelist' => array( - 'listfiles-summary', - 'listfiles_search_for', - 'imgfile', - 'listfiles', - 'listfiles_thumb', - 'listfiles_date', - 'listfiles_name', - 'listfiles_user', - 'listfiles_size', - 'listfiles_description', - 'listfiles_count', - 'listfiles-show-all', - 'listfiles-latestversion', - 'listfiles-latestversion-yes', - 'listfiles-latestversion-no', - ), - 'filedescription' => array( - 'file-anchor-link', - 'filehist', - 'filehist-help', - 'filehist-deleteall', - 'filehist-deleteone', - 'filehist-revert', - 'filehist-current', - 'filehist-datetime', - 'filehist-thumb', - 'filehist-thumbtext', - 'filehist-nothumb', - 'filehist-user', - 'filehist-dimensions', - 'filehist-filesize', - 'filehist-comment', - 'filehist-missing', - 'imagelinks', - 'linkstoimage', - 'linkstoimage-more', - 'nolinkstoimage', - 'morelinkstoimage', - 'linkstoimage-redirect', - 'duplicatesoffile', - 'sharedupload', - 'sharedupload-desc-there', - 'sharedupload-desc-here', - 'sharedupload-desc-edit', - 'sharedupload-desc-create', - 'shareddescriptionfollows', - 'filepage-nofile', - 'filepage-nofile-link', - 'uploadnewversion-linktext', - 'shared-repo-from', - 'shared-repo', - 'shared-repo-name-wikimediacommons', - 'filepage.css', - 'upload-disallowed-here', - ), - 'filerevert' => array( - 'filerevert', - 'filerevert-legend', - 'filerevert-intro', - 'filerevert-comment', - 'filerevert-defaultcomment', - 'filerevert-submit', - 'filerevert-success', - 'filerevert-badversion', - ), - 'filedelete' => array( - 'filedelete', - 'filedelete-legend', - 'filedelete-intro', - 'filedelete-intro-old', - 'filedelete-comment', - 'filedelete-submit', - 'filedelete-success', - 'filedelete-success-old', - 'filedelete-nofile', - 'filedelete-nofile-old', - 'filedelete-otherreason', - 'filedelete-reason-otherlist', - 'filedelete-reason-dropdown', - 'filedelete-edit-reasonlist', - 'filedelete-maintenance', - 'filedelete-maintenance-title', - ), - 'mimesearch' => array( - 'mimesearch', - 'mimesearch-summary', - 'mimetype', - 'download', - ), - 'unwatchedpages' => array( - 'unwatchedpages', - 'unwatchedpages-summary', - ), - 'listredirects' => array( - 'listredirects', - 'listredirects-summary', - ), - 'unusedtemplates' => array( - 'unusedtemplates', - 'unusedtemplates-summary', - 'unusedtemplatestext', - 'unusedtemplateswlh', - ), - 'randompage' => array( - 'randompage', - 'randompage-nopages', - 'randompage-url', - ), - 'randomincategory' => array( - 'randomincategory', - 'randomincategory-invalidcategory', - 'randomincategory-nopages', - 'randomincategory-selectcategory', - 'randomincategory-selectcategory-submit', - ), - 'randomredirect' => array( - 'randomredirect', - 'randomredirect-nopages', - ), - 'statistics' => array( - 'statistics', - 'statistics-summary', - 'statistics-header-pages', - 'statistics-header-edits', - 'statistics-header-views', - 'statistics-header-users', - 'statistics-header-hooks', - 'statistics-articles', - 'statistics-pages', - 'statistics-pages-desc', - 'statistics-files', - 'statistics-edits', - 'statistics-edits-average', - 'statistics-views-total', - 'statistics-views-total-desc', - 'statistics-views-peredit', - 'statistics-users', - 'statistics-users-active', - 'statistics-users-active-desc', - 'statistics-mostpopular', - 'statistics-footer', - ), - 'pageswithprop' => array( - 'pageswithprop', - 'pageswithprop-summary', - 'pageswithprop-legend', - 'pageswithprop-text', - 'pageswithprop-prop', - 'pageswithprop-submit', - 'pageswithprop-prophidden-long', - 'pageswithprop-prophidden-binary', - ), - 'doubleredirects' => array( - 'doubleredirects', - 'doubleredirects-summary', - 'doubleredirectstext', - 'double-redirect-fixed-move', - 'double-redirect-fixed-maintenance', - 'double-redirect-fixer', - ), - 'brokenredirects' => array( - 'brokenredirects', - 'brokenredirects-summary', - 'brokenredirectstext', - 'brokenredirects-edit', - 'brokenredirects-delete', - ), - 'withoutinterwiki' => array( - 'withoutinterwiki', - 'withoutinterwiki-summary', - 'withoutinterwiki-legend', - 'withoutinterwiki-submit', - ), - 'fewestrevisions' => array( - 'fewestrevisions', - 'fewestrevisions-summary', - ), - 'specialpages' => array( - 'nbytes', - 'ncategories', - 'ninterwikis', - 'nlinks', - 'nmembers', - 'nrevisions', - 'nviews', - 'nchanges', - 'nimagelinks', - 'ntransclusions', - 'specialpage-empty', - 'lonelypages', - 'lonelypages-summary', - 'lonelypagestext', - 'uncategorizedpages', - 'uncategorizedpages-summary', - 'uncategorizedcategories', - 'uncategorizedcategories-summary', - 'uncategorizedimages', - 'uncategorizedimages-summary', - 'uncategorizedtemplates', - 'uncategorizedtemplates-summary', - 'unusedcategories', - 'unusedcategories-summary', - 'unusedimages', - 'unusedimages-summary', - 'popularpages', - 'popularpages-summary', - 'wantedcategories', - 'wantedcategories-summary', - 'wantedpages', - 'wantedpages-summary', - 'wantedpages-badtitle', - 'wantedfiles', - 'wantedfiles-summary', - 'wantedfiletext-cat', - 'wantedfiletext-nocat', - 'wantedtemplates', - 'wantedtemplates-summary', - 'mostlinked', - 'mostlinked-summary', - 'mostlinkedcategories', - 'mostlinkedcategories-summary', - 'mostlinkedtemplates', - 'mostlinkedtemplates-summary', - 'mostcategories', - 'mostcategories-summary', - 'mostimages', - 'mostimages-summary', - 'mostinterwikis', - 'mostinterwikis-summary', - 'mostrevisions', - 'mostrevisions-summary', - 'prefixindex', - 'prefixindex-namespace', - 'prefixindex-summary', - 'prefixindex-strip', - 'shortpages', - 'shortpages-summary', - 'longpages', - 'longpages-summary', - 'deadendpages', - 'deadendpages-summary', - 'deadendpagestext', - 'protectedpages', - 'protectedpages-indef', - 'protectedpages-summary', - 'protectedpages-cascade', - 'protectedpagestext', - 'protectedpagesempty', - 'protectedtitles', - 'protectedtitles-summary', - 'protectedtitlestext', - 'protectedtitlesempty', - 'listusers', - 'listusers-summary', - 'listusers-editsonly', - 'listusers-creationsort', - 'listusers-desc', - 'usereditcount', - 'usercreated', - 'newpages', - 'newpages-summary', - 'newpages-username', - 'ancientpages', - 'ancientpages-summary', - 'move', - 'movethispage', - 'unusedimagestext', - 'unusedcategoriestext', - 'notargettitle', - 'notargettext', - 'nopagetitle', - 'nopagetext', - 'pager-newer-n', - 'pager-older-n', - 'suppress', - 'querypage-disabled', - ), - 'booksources' => array( - 'booksources', - 'booksources-summary', - 'booksources-search-legend', - 'booksources-isbn', - 'booksources-go', - 'booksources-text', - 'booksources-invalid-isbn', - ), - 'magicwords' => array( - 'rfcurl', - 'pubmedurl', - ), - 'logpages' => array( - 'specialloguserlabel', - 'speciallogtitlelabel', - 'log', - 'all-logs-page', - 'alllogstext', - 'logempty', - 'log-title-wildcard', - 'showhideselectedlogentries', - ), - 'allpages' => array( - 'allpages', - 'allpages-summary', - 'alphaindexline', - 'nextpage', - 'prevpage', - 'allpagesfrom', - 'allpagesto', - 'allarticles', - 'allinnamespace', - 'allnotinnamespace', - 'allpagesprev', - 'allpagesnext', - 'allpagessubmit', - 'allpagesprefix', - 'allpagesbadtitle', - 'allpages-bad-ns', - 'allpages-hide-redirects', - ), - 'cachedspecial' => array( - 'cachedspecial-viewing-cached-ttl', - 'cachedspecial-viewing-cached-ts', - 'cachedspecial-refresh-now', - ), - 'categories' => array( - 'categories', - 'categories-summary', - 'categoriespagetext', - 'categoriesfrom', - 'special-categories-sort-count', - 'special-categories-sort-abc', - ), - 'deletedcontribs' => array( - 'deletedcontributions', - 'deletedcontributions-summary', - 'deletedcontributions-title', - 'sp-deletedcontributions-contribs', - ), - 'linksearch' => array( - 'linksearch', - 'linksearch-summary', - 'linksearch-pat', - 'linksearch-ns', - 'linksearch-ok', - 'linksearch-text', - 'linksearch-line', - 'linksearch-error', - ), - 'listusers' => array( - 'listusersfrom', - 'listusers-submit', - 'listusers-noresult', - 'listusers-blocked', - ), - 'activeusers' => array( - 'activeusers', - 'activeusers-summary', - 'activeusers-intro', - 'activeusers-count', - 'activeusers-from', - 'activeusers-hidebots', - 'activeusers-hidesysops', - 'activeusers-submit', - 'activeusers-noresult', - ), - 'listgrouprights' => array( - 'listgrouprights', - 'listgrouprights-summary', - 'listgrouprights-key', - 'listgrouprights-group', - 'listgrouprights-rights', - 'listgrouprights-helppage', - 'listgrouprights-members', - 'listgrouprights-right-display', - 'listgrouprights-right-revoked', - 'listgrouprights-addgroup', - 'listgrouprights-removegroup', - 'listgrouprights-addgroup-all', - 'listgrouprights-removegroup-all', - 'listgrouprights-addgroup-self', - 'listgrouprights-removegroup-self', - 'listgrouprights-addgroup-self-all', - 'listgrouprights-removegroup-self-all', - - ), - 'emailuser' => array( - 'mailnologin', - 'mailnologintext', - 'emailuser', - 'emailuser-title-target', - 'emailuser-title-notarget', - 'emailuser-summary', - 'emailpage', - 'emailpagetext', - 'usermailererror', - 'defemailsubject', - 'usermaildisabled', - 'usermaildisabledtext', - 'noemailtitle', - 'noemailtext', - 'nowikiemailtitle', - 'nowikiemailtext', - 'emailnotarget', - 'emailtarget', - 'emailusername', - 'emailusernamesubmit', - 'email-legend', - 'emailfrom', - 'emailto', - 'emailsubject', - 'emailmessage', - 'emailsend', - 'emailccme', - 'emailccsubject', - 'emailsent', - 'emailsenttext', - 'emailuserfooter', - ), - 'usermessage' => array( - 'usermessage-summary', - 'usermessage-editor', - 'usermessage-template', - ), - 'watchlist' => array( - 'watchlist', - 'watchlist-summary', - 'mywatchlist', - 'watchlistfor2', - 'nowatchlist', - 'watchlistanontext', - 'watchnologin', - 'watchnologintext', - 'addwatch', - 'addedwatchtext', - 'removewatch', - 'removedwatchtext', - 'watch', - 'watchthispage', - 'unwatch', - 'unwatchthispage', - 'notanarticle', - 'notvisiblerev', - 'watchlist-details', - 'wlheader-enotif', - 'wlheader-showupdated', - 'watchmethod-recent', - 'watchmethod-list', - 'watchlistcontains', - 'iteminvalidname', - 'wlnote', - 'wlshowlast', - 'watchlist-options', - ), - 'watching' => array( - 'watching', - 'unwatching', - 'watcherrortext', - ), - 'enotif' => array( - 'enotif_mailer', - 'enotif_reset', - 'enotif_impersonal_salutation', - 'enotif_subject_deleted', - 'enotif_subject_created', - 'enotif_subject_moved', - 'enotif_subject_restored', - 'enotif_subject_changed', - 'enotif_body_intro_deleted', - 'enotif_body_intro_created', - 'enotif_body_intro_moved', - 'enotif_body_intro_restored', - 'enotif_body_intro_changed', - 'enotif_lastvisited', - 'enotif_lastdiff', - 'enotif_anon_editor', - 'enotif_body', - 'created', - 'changed', - ), - 'delete' => array( - 'deletepage', - 'confirm', - 'excontent', - 'excontentauthor', - 'exbeforeblank', - 'exblank', - 'delete-confirm', - 'delete-legend', - 'historywarning', - 'confirmdeletetext', - 'actioncomplete', - 'actionfailed', - 'deletedtext', - 'dellogpage', - 'dellogpagetext', - 'deletionlog', - 'reverted', - 'deletecomment', - 'deleteotherreason', - 'deletereasonotherlist', - 'deletereason-dropdown', - 'delete-edit-reasonlist', - 'delete-toobig', - 'delete-warning-toobig', - ), - 'rollback' => array( - 'rollback', - 'rollback_short', - 'rollbacklink', - 'rollbacklinkcount', - 'rollbacklinkcount-morethan', - 'rollbackfailed', - 'cantrollback', - 'alreadyrolled', - 'editcomment', - 'revertpage', - 'revertpage-nouser', - 'rollback-success', - ), - 'edittokens' => array( - 'sessionfailure-title', - 'sessionfailure', - ), - 'protect' => array( - 'protectlogpage', - 'protectlogtext', - 'protectedarticle', - 'modifiedarticleprotection', - 'unprotectedarticle', - 'movedarticleprotection', - 'protect-title', - 'protect-title-notallowed', - 'prot_1movedto2', - 'protect-badnamespace-title', - 'protect-badnamespace-text', - 'protect-norestrictiontypes-text', - 'protect-norestrictiontypes-title', - 'protect-legend', - 'protectcomment', - 'protectexpiry', - 'protect_expiry_invalid', - 'protect_expiry_old', - 'protect-unchain-permissions', - 'protect-text', - 'protect-locked-blocked', - 'protect-locked-dblock', - 'protect-locked-access', - 'protect-cascadeon', - 'protect-default', - 'protect-fallback', - 'protect-level-autoconfirmed', - 'protect-level-sysop', - 'protect-summary-desc', - 'protect-summary-cascade', - 'protect-expiring', - 'protect-expiring-local', - 'protect-expiry-indefinite', - 'protect-cascade', - 'protect-cantedit', - 'protect-othertime', - 'protect-othertime-op', - 'protect-existing-expiry', - 'protect-otherreason', - 'protect-otherreason-op', - 'protect-dropdown', - 'protect-edit-reasonlist', - 'protect-expiry-options', - 'restriction-type', - 'restriction-level', - 'minimum-size', - 'maximum-size', - 'pagesize', - ), - 'restrictions' => array( - 'restriction-edit', - 'restriction-move', - 'restriction-create', - 'restriction-upload', - ), - 'restriction-levels' => array( - 'restriction-level-sysop', - 'restriction-level-autoconfirmed', - 'restriction-level-all', - ), - 'undelete' => array( - 'undelete', - 'undelete-summary', - 'undeletepage', - 'undeletepagetitle', - 'viewdeletedpage', - 'undeletepagetext', - 'undelete-fieldset-title', - 'undeleteextrahelp', - 'undeleterevisions', - 'undeletehistory', - 'undeleterevdel', - 'undeletehistorynoadmin', - 'undelete-revision', - 'undeleterevision-missing', - 'undelete-nodiff', - 'undeletebtn', - 'undeletelink', - 'undeleteviewlink', - 'undeletereset', - 'undeleteinvert', - 'undeletecomment', - 'undeletedrevisions', - 'undeletedrevisions-files', - 'undeletedfiles', - 'cannotundelete', - 'undeletedpage', - 'undelete-header', - 'undelete-search-title', - 'undelete-search-box', - 'undelete-search-prefix', - 'undelete-search-submit', - 'undelete-no-results', - 'undelete-filename-mismatch', - 'undelete-bad-store-key', - 'undelete-cleanup-error', - 'undelete-missing-filearchive', - 'undelete-error', - 'undelete-error-short', - 'undelete-error-long', - 'undelete-show-file-confirm', - 'undelete-show-file-submit', - 'undelete-revisionrow', - ), - 'nsform' => array( - 'namespace', - 'invert', - 'tooltip-invert', - 'namespace_association', - 'tooltip-namespace_association', - 'blanknamespace', - ), - 'contributions' => array( - 'contributions', - 'contributions-summary', - 'contributions-title', - 'mycontris', - 'contribsub2', - 'nocontribs', - 'uctop', - 'month', - 'year', - ), - 'sp-contributions' => array( - 'sp-contributions-newbies', - 'sp-contributions-newbies-sub', - 'sp-contributions-newbies-title', - 'sp-contributions-blocklog', - 'sp-contributions-deleted', - 'sp-contributions-uploads', - 'sp-contributions-logs', - 'sp-contributions-talk', - 'sp-contributions-userrights', - 'sp-contributions-blocked-notice', - 'sp-contributions-blocked-notice-anon', - 'sp-contributions-search', - 'sp-contributions-username', - 'sp-contributions-toponly', - 'sp-contributions-submit', - 'sp-contributions-explain', - 'sp-contributions-footer', - 'sp-contributions-footer-anon', - 'sp-contributions-footer-newbies', - ), - 'whatlinkshere' => array( - 'whatlinkshere', - 'whatlinkshere-title', - 'whatlinkshere-summary', - 'whatlinkshere-page', - 'linkshere', - 'nolinkshere', - 'nolinkshere-ns', - 'isredirect', - 'istemplate', - 'isimage', - 'whatlinkshere-prev', - 'whatlinkshere-next', - 'whatlinkshere-links', - 'whatlinkshere-hideredirs', - 'whatlinkshere-hidetrans', - 'whatlinkshere-hidelinks', - 'whatlinkshere-hideimages', - 'whatlinkshere-filters', - ), - 'block' => array( - 'autoblockid', - 'block', - 'unblock', - 'unblock-summary', - 'blockip', - 'blockip-title', - 'blockip-legend', - 'blockiptext', - 'ipadressorusername', - 'ipbexpiry', - 'ipbreason', - 'ipbreasonotherlist', - 'ipbreason-dropdown', - 'ipb-hardblock', - 'ipbcreateaccount', - 'ipbemailban', - 'ipbenableautoblock', - 'ipbsubmit', - 'ipbother', - 'ipboptions', - 'ipbotheroption', - 'ipbotherreason', - 'ipbhidename', - 'ipbwatchuser', - 'ipb-disableusertalk', - 'ipb-change-block', - 'ipb-confirm', - 'badipaddress', - 'blockipsuccesssub', - 'blockipsuccesstext', - 'ipb-blockingself', - 'ipb-confirmhideuser', - 'ipb-edit-dropdown', - 'ipb-unblock-addr', - 'ipb-unblock', - 'ipb-blocklist', - 'ipb-blocklist-contribs', - 'unblockip', - 'unblockiptext', - 'ipusubmit', - 'unblocked', - 'unblocked-range', - 'unblocked-id', - 'blocklist', - 'ipblocklist', - 'ipblocklist-legend', - 'blocklist-userblocks', - 'blocklist-tempblocks', - 'blocklist-addressblocks', - 'blocklist-rangeblocks', - 'blocklist-timestamp', - 'blocklist-target', - 'blocklist-expiry', - 'blocklist-by', - 'blocklist-params', - 'blocklist-reason', - 'blocklist-summary', - 'ipblocklist-submit', - 'ipblocklist-localblock', - 'ipblocklist-otherblocks', - - 'infiniteblock', - 'expiringblock', - 'anononlyblock', - 'noautoblockblock', - 'createaccountblock', - 'emailblock', - 'blocklist-nousertalk', - 'ipblocklist-empty', - 'ipblocklist-no-results', - 'blocklink', - 'unblocklink', - 'change-blocklink', - 'contribslink', - 'emaillink', - 'autoblocker', - 'blocklogpage', - 'blocklog-showlog', - 'blocklog-showsuppresslog', - 'blocklogentry', - 'reblock-logentry', - 'blocklogtext', - 'unblocklogentry', - 'block-log-flags-anononly', - 'block-log-flags-nocreate', - 'block-log-flags-noautoblock', - 'block-log-flags-noemail', - 'block-log-flags-nousertalk', - 'block-log-flags-angry-autoblock', - 'block-log-flags-hiddenname', - 'range_block_disabled', - 'ipb_expiry_invalid', - 'ipb_expiry_temp', - 'ipb_hide_invalid', - 'ipb_already_blocked', - 'ipb-needreblock', - 'ipb-otherblocks-header', - 'unblock-hideuser', - 'ipb_cant_unblock', - 'ipb_blocked_as_range', - 'ip_range_invalid', - 'ip_range_toolarge', - 'proxyblocker', - 'proxyblockreason', - 'sorbs', - 'sorbsreason', - 'sorbs_create_account_reason', - 'xffblockreason', - 'cant-block-while-blocked', - 'cant-see-hidden-user', - 'ipbblocked', - 'ipbnounblockself', - 'ipb-default-expiry', - ), - 'developertools' => array( - 'lockdb', - 'unlockdb', - 'lockdbtext', - 'unlockdbtext', - 'lockconfirm', - 'unlockconfirm', - 'lockbtn', - 'unlockbtn', - 'locknoconfirm', - 'lockdbsuccesssub', - 'unlockdbsuccesssub', - 'lockdbsuccesstext', - 'unlockdbsuccesstext', - 'lockfilenotwritable', - 'databasenotlocked', - 'lockedbyandtime', - ), - 'movepage' => array( - 'move-page', - 'movepage-summary', - 'move-page-legend', - 'movepagetext', - 'movepagetext-noredirectfixer', - 'movepagetalktext', - 'movearticle', - 'moveuserpage-warning', - 'movenologin', - 'movenologintext', - 'movenotallowed', - 'movenotallowedfile', - 'cant-move-user-page', - 'cant-move-to-user-page', - 'newtitle', - 'move-watch', - 'movepagebtn', - 'pagemovedsub', - 'movepage-moved', - 'movepage-moved-redirect', - 'movepage-moved-noredirect', - 'articleexists', - 'cantmove-titleprotected', - 'talkexists', - 'movedto', - 'movetalk', - 'move-subpages', - 'move-talk-subpages', - 'movepage-page-exists', - 'movepage-page-moved', - 'movepage-page-unmoved', - 'movepage-max-pages', - 'movelogpage', - 'movelogpagetext', - 'movesubpage', - 'movesubpagetext', - 'movenosubpage', - 'movereason', - 'move-redirect-text', - 'revertmove', - 'delete_and_move', - 'delete_and_move_text', - 'delete_and_move_confirm', - 'delete_and_move_reason', - 'selfmove', - 'immobile-source-namespace', - 'immobile-target-namespace', - 'immobile-target-namespace-iw', - 'immobile-source-page', - 'immobile-target-page', - 'bad-target-model', - 'immobile_namespace', - 'imagenocrossnamespace', - 'nonfile-cannot-move-to-file', - 'imagetypemismatch', - 'imageinvalidfilename', - 'fix-double-redirects', - 'move-leave-redirect', - 'protectedpagemovewarning', - 'semiprotectedpagemovewarning', - 'move-over-sharedrepo', - 'file-exists-sharedrepo', - ), - 'export' => array( - 'export', - 'export-summary', - 'exporttext', - 'exportall', - 'exportcuronly', - 'exportnohistory', - 'exportlistauthors', - 'export-submit', - 'export-addcattext', - 'export-addcat', - 'export-addnstext', - 'export-addns', - 'export-download', - 'export-templates', - 'export-pagelinks', - ), - 'allmessages' => array( - 'allmessages', - 'allmessagesname', - 'allmessagesdefault', - 'allmessagescurrent', - 'allmessagestext', - 'allmessagesnotsupportedDB', - 'allmessages-filter-legend', - 'allmessages-filter', - 'allmessages-filter-unmodified', - 'allmessages-filter-all', - 'allmessages-filter-modified', - 'allmessages-prefix', - 'allmessages-language', - 'allmessages-filter-submit', - ), - 'thumbnails' => array( - 'thumbnail-more', - 'filemissing', - 'thumbnail_error', - 'thumbnail_error_remote', - 'djvu_page_error', - 'djvu_no_xml', - 'thumbnail-temp-create', - 'thumbnail-dest-create', - 'thumbnail_invalid_params', - 'thumbnail_dest_directory', - 'thumbnail_image-type', - 'thumbnail_gd-library', - 'thumbnail_image-missing', - ), - 'import' => array( - 'import', - 'import-summary', - 'importinterwiki', - 'import-interwiki-text', - 'import-interwiki-source', - 'import-interwiki-history', - 'import-interwiki-templates', - 'import-interwiki-submit', - 'import-interwiki-namespace', - 'import-interwiki-rootpage', - 'import-upload-filename', - 'import-comment', - 'importtext', - 'importstart', - 'import-revision-count', - 'importnopages', - 'imported-log-entries', - 'importfailed', - 'importunknownsource', - 'importcantopen', - 'importbadinterwiki', - 'importnotext', - 'importsuccess', - 'importhistoryconflict', - 'importnosources', - 'importnofile', - 'importuploaderrorsize', - 'importuploaderrorpartial', - 'importuploaderrortemp', - 'import-parse-failure', - 'import-noarticle', - 'import-nonewrevisions', - 'xml-error-string', - 'import-upload', - 'import-token-mismatch', - 'import-invalid-interwiki', - 'import-error-edit', - 'import-error-create', - 'import-error-interwiki', - 'import-error-special', - 'import-error-invalid', - 'import-error-unserialize', - 'import-options-wrong', - 'import-rootpage-invalid', - 'import-rootpage-nosubpage', - ), - 'importlog' => array( - 'importlogpage', - 'importlogpagetext', - 'import-logentry-upload', - 'import-logentry-upload-detail', - 'import-logentry-interwiki', - 'import-logentry-interwiki-detail', - ), - 'javaccripttest' => array( - 'javascripttest', - 'javascripttest-backlink', - 'javascripttest-title', - 'javascripttest-pagetext-noframework', - 'javascripttest-pagetext-unknownframework', - 'javascripttest-pagetext-frameworks', - 'javascripttest-pagetext-skins', - 'javascripttest-qunit-name', - 'javascripttest-qunit-intro', - 'javascripttest-qunit-heading', - ), - 'accesskeys' => array( - 'accesskey-pt-userpage', - 'accesskey-pt-anonuserpage', - 'accesskey-pt-mytalk', - 'accesskey-pt-anontalk', - 'accesskey-pt-preferences', - 'accesskey-pt-watchlist', - 'accesskey-pt-mycontris', - 'accesskey-pt-login', - 'accesskey-pt-anonlogin', - 'accesskey-pt-logout', - 'accesskey-ca-talk', - 'accesskey-ca-edit', - 'accesskey-ca-addsection', - 'accesskey-ca-viewsource', - 'accesskey-ca-history', - 'accesskey-ca-protect', - 'accesskey-ca-unprotect', - 'accesskey-ca-delete', - 'accesskey-ca-undelete', - 'accesskey-ca-move', - 'accesskey-ca-watch', - 'accesskey-ca-unwatch', - 'accesskey-search', - 'accesskey-search-go', - 'accesskey-search-fulltext', - 'accesskey-p-logo', - 'accesskey-n-mainpage', - 'accesskey-n-mainpage-description', - 'accesskey-n-portal', - 'accesskey-n-currentevents', - 'accesskey-n-recentchanges', - 'accesskey-n-randompage', - 'accesskey-n-help', - 'accesskey-t-whatlinkshere', - 'accesskey-t-recentchangeslinked', - 'accesskey-t-random', - 'accesskey-feed-rss', - 'accesskey-feed-atom', - 'accesskey-t-contributions', - 'accesskey-t-emailuser', - 'accesskey-t-permalink', - 'accesskey-t-print', - 'accesskey-t-upload', - 'accesskey-t-specialpages', - 'accesskey-ca-nstab-main', - 'accesskey-ca-nstab-user', - 'accesskey-ca-nstab-media', - 'accesskey-ca-nstab-special', - 'accesskey-ca-nstab-project', - 'accesskey-ca-nstab-image', - 'accesskey-ca-nstab-mediawiki', - 'accesskey-ca-nstab-template', - 'accesskey-ca-nstab-help', - 'accesskey-ca-nstab-category', - 'accesskey-minoredit', - 'accesskey-save', - 'accesskey-preview', - 'accesskey-diff', - 'accesskey-compareselectedversions', - 'accesskey-watch', - 'accesskey-upload', - 'accesskey-preferences-save', - 'accesskey-summary', - 'accesskey-userrights-set', - 'accesskey-blockip-block', - 'accesskey-export', - 'accesskey-import', - 'accesskey-watchlistedit-normal-submit', - 'accesskey-watchlistedit-raw-submit', - ), - 'tooltips' => array( - 'tooltip-pt-userpage', - 'tooltip-pt-anonuserpage', - 'tooltip-pt-mytalk', - 'tooltip-pt-anontalk', - 'tooltip-pt-preferences', - 'tooltip-pt-watchlist', - 'tooltip-pt-mycontris', - 'tooltip-pt-login', - 'tooltip-pt-anonlogin', - 'tooltip-pt-logout', - 'tooltip-ca-talk', - 'tooltip-ca-edit', - 'tooltip-ca-addsection', - 'tooltip-ca-viewsource', - 'tooltip-ca-history', - 'tooltip-ca-protect', - 'tooltip-ca-unprotect', - 'tooltip-ca-delete', - 'tooltip-ca-undelete', - 'tooltip-ca-move', - 'tooltip-ca-watch', - 'tooltip-ca-unwatch', - 'tooltip-search', - 'tooltip-search-go', - 'tooltip-search-fulltext', - 'tooltip-p-logo', - 'tooltip-n-mainpage', - 'tooltip-n-mainpage-description', - 'tooltip-n-portal', - 'tooltip-n-currentevents', - 'tooltip-n-recentchanges', - 'tooltip-n-randompage', - 'tooltip-n-help', - 'tooltip-t-whatlinkshere', - 'tooltip-t-recentchangeslinked', - 'tooltip-t-random', - 'tooltip-feed-rss', - 'tooltip-feed-atom', - 'tooltip-t-contributions', - 'tooltip-t-emailuser', - 'tooltip-t-upload', - 'tooltip-t-specialpages', - 'tooltip-t-print', - 'tooltip-t-permalink', - 'tooltip-ca-nstab-main', - 'tooltip-ca-nstab-user', - 'tooltip-ca-nstab-media', - 'tooltip-ca-nstab-special', - 'tooltip-ca-nstab-project', - 'tooltip-ca-nstab-image', - 'tooltip-ca-nstab-mediawiki', - 'tooltip-ca-nstab-template', - 'tooltip-ca-nstab-help', - 'tooltip-ca-nstab-category', - 'tooltip-minoredit', - 'tooltip-save', - 'tooltip-preview', - 'tooltip-diff', - 'tooltip-compareselectedversions', - 'tooltip-watch', - 'tooltip-watchlistedit-normal-submit', - 'tooltip-watchlistedit-raw-submit', - 'tooltip-recreate', - 'tooltip-upload', - 'tooltip-rollback', - 'tooltip-undo', - 'tooltip-preferences-save', - 'tooltip-summary', - 'interlanguage-link-title', - ), - 'stylesheets' => array( - 'common.css', - 'cologneblue.css', - 'monobook.css', - 'modern.css', - 'vector.css', - 'print.css', - 'noscript.css', - 'group-autoconfirmed.css', - 'group-bot.css', - 'group-sysop.css', - 'group-bureaucrat.css', - ), - 'scripts' => array( - 'common.js', - 'cologneblue.js', - 'monobook.js', - 'modern.js', - 'vector.js', - 'group-autoconfirmed.js', - 'group-bot.js', - 'group-sysop.js', - 'group-bureaucrat.js', - ), - 'metadata_cc' => array( - 'notacceptable', - ), - 'attribution' => array( - 'anonymous', - 'siteuser', - 'anonuser', - 'lastmodifiedatby', - 'othercontribs', - 'others', - 'siteusers', - 'anonusers', - 'creditspage', - 'nocredits', - ), - 'spamprotection' => array( - 'spamprotectiontitle', - 'spamprotectiontext', - 'spamprotectionmatch', - 'spambot_username', - 'spam_reverting', - 'spam_blanking', - 'spam_deleting', - 'simpleantispam-label', - ), - 'info' => array( - 'pageinfo-header', - 'pageinfo-title', - 'pageinfo-not-current', - 'pageinfo-header-basic', - 'pageinfo-header-edits', - 'pageinfo-header-restrictions', - 'pageinfo-header-properties', - 'pageinfo-display-title', - 'pageinfo-default-sort', - 'pageinfo-length', - 'pageinfo-article-id', - 'pageinfo-language', - 'pageinfo-robot-policy', - 'pageinfo-robot-index', - 'pageinfo-robot-noindex', - 'pageinfo-views', - 'pageinfo-watchers', - 'pageinfo-few-watchers', - 'pageinfo-redirects-name', - 'pageinfo-redirects-value', - 'pageinfo-subpages-name', - 'pageinfo-subpages-value', - 'pageinfo-firstuser', - 'pageinfo-firsttime', - 'pageinfo-lastuser', - 'pageinfo-lasttime', - 'pageinfo-edits', - 'pageinfo-authors', - 'pageinfo-recent-edits', - 'pageinfo-recent-authors', - 'pageinfo-magic-words', - 'pageinfo-hidden-categories', - 'pageinfo-templates', - 'pageinfo-transclusions', - 'pageinfo-footer', - 'pageinfo-toolboxlink', - 'pageinfo-redirectsto', - 'pageinfo-redirectsto-info', - 'pageinfo-contentpage', - 'pageinfo-contentpage-yes', - 'pageinfo-protect-cascading', - 'pageinfo-protect-cascading-yes', - 'pageinfo-protect-cascading-from', - 'pageinfo-category-info', - 'pageinfo-category-pages', - 'pageinfo-category-subcats', - 'pageinfo-category-files' - ), - 'skin' => array( - 'skinname-cologneblue', - 'skinname-monobook', - 'skinname-modern', - 'skinname-vector', - ), - 'patrolling' => array( - 'markaspatrolleddiff', - 'markaspatrolledlink', - 'markaspatrolledtext', - 'markedaspatrolled', - 'markedaspatrolledtext', - 'rcpatroldisabled', - 'rcpatroldisabledtext', - 'markedaspatrollederror', - 'markedaspatrollederrortext', - 'markedaspatrollederror-noautopatrol', - 'markedaspatrollednotify', - 'markedaspatrollederrornotify', - ), - 'patrol-log' => array( - 'patrol-log-page', - 'patrol-log-header', - 'log-show-hide-patrol', - ), - 'imagedeletion' => array( - 'deletedrevision', - 'filedeleteerror-short', - 'filedeleteerror-long', - 'filedelete-missing', - 'filedelete-old-unregistered', - 'filedelete-current-unregistered', - 'filedelete-archive-read-only', - ), - 'browsediffs' => array( - 'previousdiff', - 'nextdiff', - ), - 'media-info' => array( - 'mediawarning', - 'imagemaxsize', - 'thumbsize', - 'widthheight', - 'widthheightpage', - 'file-info', - 'file-info-size', - 'file-info-size-pages', - 'file-nohires', - 'svg-long-desc', - 'svg-long-desc-animated', - 'svg-long-error', - 'show-big-image', - 'show-big-image-preview', - 'show-big-image-other', - 'show-big-image-size', - 'file-info-gif-looped', - 'file-info-gif-frames', - 'file-info-png-looped', - 'file-info-png-repeat', - 'file-info-png-frames', - 'file-no-thumb-animation', - 'file-no-thumb-animation-gif', - ), - 'newfiles' => array( - 'newimages', - 'imagelisttext', - 'newimages-summary', - 'newimages-legend', - 'newimages-label', - 'showhidebots', - 'noimages', - 'ilsubmit', - 'bydate', - 'sp-newimages-showfrom', - ), - 'video-info' => array( - 'video-dims', - 'seconds-abbrev', - 'minutes-abbrev', - 'hours-abbrev', - 'days-abbrev', - 'seconds', - 'minutes', - 'hours', - 'days', - 'weeks', - 'months', - 'years', - 'ago', - 'just-now', - ), - 'human-timestamps' => array( - 'hours-ago', - 'minutes-ago', - 'seconds-ago', - 'monday-at', - 'tuesday-at', - 'wednesday-at', - 'thursday-at', - 'friday-at', - 'saturday-at', - 'sunday-at', - 'today-at', - 'yesterday-at', - ), - 'badimagelist' => array( - 'bad_image_list', - ), - 'variantname-zh' => array( - 'variantname-zh-hans', - 'variantname-zh-hant', - 'variantname-zh-cn', - 'variantname-zh-tw', - 'variantname-zh-hk', - 'variantname-zh-mo', - 'variantname-zh-sg', - 'variantname-zh-my', - 'variantname-zh', - ), - 'variantname-gan' => array( - 'variantname-gan-hans', - 'variantname-gan-hant', - 'variantname-gan', - ), - 'variantname-sr' => array( - 'variantname-sr-ec', - 'variantname-sr-el', - 'variantname-sr', - ), - 'variantname-kk' => array( - 'variantname-kk-kz', - 'variantname-kk-tr', - 'variantname-kk-cn', - 'variantname-kk-cyrl', - 'variantname-kk-latn', - 'variantname-kk-arab', - 'variantname-kk', - ), - 'variantname-ku' => array( - 'variantname-ku-arab', - 'variantname-ku-latn', - 'variantname-ku', - ), - 'variantname-tg' => array( - 'variantname-tg-cyrl', - 'variantname-tg-latn', - 'variantname-tg', - ), - 'variantname-iu' => array( - 'variantname-ike-cans', - 'variantname-ike-latn', - 'variantname-iu', - ), - 'variantname-shi' => array( - 'variantname-shi-tfng', - 'variantname-shi-latn', - 'variantname-shi', - ), - 'metadata' => array( - 'metadata', - 'metadata-help', - 'metadata-expand', - 'metadata-collapse', - 'metadata-fields', - 'metadata-langitem', - 'metadata-langitem-default', - ), - 'exif' => array( - 'exif-imagewidth', - 'exif-imagelength', - 'exif-bitspersample', - 'exif-compression', - 'exif-photometricinterpretation', - 'exif-orientation', - 'exif-samplesperpixel', - 'exif-planarconfiguration', - 'exif-ycbcrsubsampling', - 'exif-ycbcrpositioning', - 'exif-xresolution', - 'exif-yresolution', - 'exif-resolutionunit', - 'exif-stripoffsets', - 'exif-rowsperstrip', - 'exif-stripbytecounts', - 'exif-jpeginterchangeformat', - 'exif-jpeginterchangeformatlength', - 'exif-whitepoint', - 'exif-primarychromaticities', - 'exif-ycbcrcoefficients', - 'exif-referenceblackwhite', - 'exif-datetime', - 'exif-imagedescription', - 'exif-make', - 'exif-model', - 'exif-software', - 'exif-artist', - 'exif-copyright', - 'exif-exifversion', - 'exif-flashpixversion', - 'exif-colorspace', - 'exif-componentsconfiguration', - 'exif-compressedbitsperpixel', - 'exif-pixelydimension', - 'exif-pixelxdimension', - 'exif-usercomment', - 'exif-relatedsoundfile', - 'exif-datetimeoriginal', - 'exif-datetimedigitized', - 'exif-subsectime', - 'exif-subsectimeoriginal', - 'exif-subsectimedigitized', - 'exif-exposuretime', - 'exif-exposuretime-format', - 'exif-fnumber', - 'exif-fnumber-format', - 'exif-exposureprogram', - 'exif-spectralsensitivity', - 'exif-isospeedratings', - 'exif-shutterspeedvalue', - 'exif-aperturevalue', - 'exif-brightnessvalue', - 'exif-exposurebiasvalue', - 'exif-maxaperturevalue', - 'exif-subjectdistance', - 'exif-meteringmode', - 'exif-lightsource', - 'exif-flash', - 'exif-focallength', - 'exif-focallength-format', - 'exif-subjectarea', - 'exif-flashenergy', - 'exif-focalplanexresolution', - 'exif-focalplaneyresolution', - 'exif-focalplaneresolutionunit', - 'exif-subjectlocation', - 'exif-exposureindex', - 'exif-sensingmethod', - 'exif-filesource', - 'exif-scenetype', - 'exif-customrendered', - 'exif-exposuremode', - 'exif-whitebalance', - 'exif-digitalzoomratio', - 'exif-focallengthin35mmfilm', - 'exif-scenecapturetype', - 'exif-gaincontrol', - 'exif-contrast', - 'exif-saturation', - 'exif-sharpness', - 'exif-devicesettingdescription', - 'exif-subjectdistancerange', - 'exif-imageuniqueid', - 'exif-gpsversionid', - 'exif-gpslatituderef', - 'exif-gpslatitude', - 'exif-gpslongituderef', - 'exif-gpslongitude', - 'exif-gpsaltituderef', - 'exif-gpsaltitude', - 'exif-gpstimestamp', - 'exif-gpssatellites', - 'exif-gpsstatus', - 'exif-gpsmeasuremode', - 'exif-gpsdop', - 'exif-gpsspeedref', - 'exif-gpsspeed', - 'exif-gpstrackref', - 'exif-gpstrack', - 'exif-gpsimgdirectionref', - 'exif-gpsimgdirection', - 'exif-gpsmapdatum', - 'exif-gpsdestlatituderef', - 'exif-gpsdestlatitude', - 'exif-gpsdestlongituderef', - 'exif-gpsdestlongitude', - 'exif-gpsdestbearingref', - 'exif-gpsdestbearing', - 'exif-gpsdestdistanceref', - 'exif-gpsdestdistance', - 'exif-gpsprocessingmethod', - 'exif-gpsareainformation', - 'exif-gpsdatestamp', - 'exif-gpsdifferential', - 'exif-coordinate-format', - 'exif-jpegfilecomment', - 'exif-keywords', - 'exif-worldregioncreated', - 'exif-countrycreated', - 'exif-countrycodecreated', - 'exif-provinceorstatecreated', - 'exif-citycreated', - 'exif-sublocationcreated', - 'exif-worldregiondest', - 'exif-countrydest', - 'exif-countrycodedest', - 'exif-provinceorstatedest', - 'exif-citydest', - 'exif-sublocationdest', - 'exif-objectname', - 'exif-specialinstructions', - 'exif-headline', - 'exif-credit', - 'exif-source', - 'exif-editstatus', - 'exif-urgency', - 'exif-fixtureidentifier', - 'exif-locationdest', - 'exif-locationdestcode', - 'exif-objectcycle', - 'exif-contact', - 'exif-writer', - 'exif-languagecode', - 'exif-iimversion', - 'exif-iimcategory', - 'exif-iimsupplementalcategory', - 'exif-datetimeexpires', - 'exif-datetimereleased', - 'exif-originaltransmissionref', - 'exif-identifier', - 'exif-lens', - 'exif-serialnumber', - 'exif-cameraownername', - 'exif-label', - 'exif-datetimemetadata', - 'exif-nickname', - 'exif-rating', - 'exif-rightscertificate', - 'exif-copyrighted', - 'exif-copyrightowner', - 'exif-usageterms', - 'exif-webstatement', - 'exif-originaldocumentid', - 'exif-licenseurl', - 'exif-morepermissionsurl', - 'exif-attributionurl', - 'exif-preferredattributionname', - 'exif-pngfilecomment', - 'exif-disclaimer', - 'exif-contentwarning', - 'exif-giffilecomment', - 'exif-intellectualgenre', - 'exif-subjectnewscode', - 'exif-scenecode', - 'exif-event', - 'exif-organisationinimage', - 'exif-personinimage', - 'exif-originalimageheight', - 'exif-originalimagewidth', - ), - 'exif-values' => array( - 'exif-make-value', - 'exif-model-value', - 'exif-software-value', - 'exif-software-version-value', - 'exif-contact-value', - 'exif-subjectnewscode-value', - ), - 'exif-compression' => array( - 'exif-compression-1', - 'exif-compression-2', - 'exif-compression-3', - 'exif-compression-4', - 'exif-compression-5', - 'exif-compression-6', - 'exif-compression-7', - 'exif-compression-8', - 'exif-compression-32773', - 'exif-compression-32946', - 'exif-compression-34712', - ), - 'exif-copyrighted' => array( - 'exif-copyrighted-true', - 'exif-copyrighted-false', - ), - 'exif-photometricinterpretation' => array( - 'exif-photometricinterpretation-2', - 'exif-photometricinterpretation-6', - ), - 'exif-unknowndate' => array( - 'exif-unknowndate', - ), - 'exif-orientation' => array( - 'exif-orientation-1', - 'exif-orientation-2', - 'exif-orientation-3', - 'exif-orientation-4', - 'exif-orientation-5', - 'exif-orientation-6', - 'exif-orientation-7', - 'exif-orientation-8', - ), - 'exif-planarconfiguration' => array( - 'exif-planarconfiguration-1', - 'exif-planarconfiguration-2', - ), - 'exif-xyresolution' => array( - 'exif-xyresolution-i', - 'exif-xyresolution-c', - ), - 'exif-colorspace' => array( - 'exif-colorspace-1', - 'exif-colorspace-65535', - ), - 'exif-componentsconfiguration' => array( - 'exif-componentsconfiguration-0', - 'exif-componentsconfiguration-1', - 'exif-componentsconfiguration-2', - 'exif-componentsconfiguration-3', - 'exif-componentsconfiguration-4', - 'exif-componentsconfiguration-5', - 'exif-componentsconfiguration-6', - ), - 'exif-exposureprogram' => array( - 'exif-exposureprogram-0', - 'exif-exposureprogram-1', - 'exif-exposureprogram-2', - 'exif-exposureprogram-3', - 'exif-exposureprogram-4', - 'exif-exposureprogram-5', - 'exif-exposureprogram-6', - 'exif-exposureprogram-7', - 'exif-exposureprogram-8', - ), - 'exif-subjectdistance-value' => array( - 'exif-subjectdistance-value', - ), - 'exif-meteringmode' => array( - 'exif-meteringmode-0', - 'exif-meteringmode-1', - 'exif-meteringmode-2', - 'exif-meteringmode-3', - 'exif-meteringmode-4', - 'exif-meteringmode-5', - 'exif-meteringmode-6', - 'exif-meteringmode-255', - ), - 'exif-lightsource' => array( - 'exif-lightsource-0', - 'exif-lightsource-1', - 'exif-lightsource-2', - 'exif-lightsource-3', - 'exif-lightsource-4', - 'exif-lightsource-9', - 'exif-lightsource-10', - 'exif-lightsource-11', - 'exif-lightsource-12', - 'exif-lightsource-13', - 'exif-lightsource-14', - 'exif-lightsource-15', - 'exif-lightsource-17', - 'exif-lightsource-18', - 'exif-lightsource-19', - 'exif-lightsource-20', - 'exif-lightsource-21', - 'exif-lightsource-22', - 'exif-lightsource-23', - 'exif-lightsource-24', - 'exif-lightsource-255', - ), - 'exif-flash' => array( - 'exif-flash-fired-0', - 'exif-flash-fired-1', - 'exif-flash-return-0', - 'exif-flash-return-2', - 'exif-flash-return-3', - 'exif-flash-mode-1', - 'exif-flash-mode-2', - 'exif-flash-mode-3', - 'exif-flash-function-1', - 'exif-flash-redeye-1', - ), - 'exif-focalplaneresolutionunit' => array( - 'exif-focalplaneresolutionunit-2', - ), - 'exif-sensingmethod' => array( - 'exif-sensingmethod-1', - 'exif-sensingmethod-2', - 'exif-sensingmethod-3', - 'exif-sensingmethod-4', - 'exif-sensingmethod-5', - 'exif-sensingmethod-7', - 'exif-sensingmethod-8', - ), - 'exif-filesource' => array( - 'exif-filesource-3', - ), - 'exif-scenetype' => array( - 'exif-scenetype-1', - ), - 'exif-customrendered' => array( - 'exif-customrendered-0', - 'exif-customrendered-1', - ), - 'exif-exposuremode' => array( - 'exif-exposuremode-0', - 'exif-exposuremode-1', - 'exif-exposuremode-2', - ), - 'exif-whitebalance' => array( - 'exif-whitebalance-0', - 'exif-whitebalance-1', - ), - 'exif-scenecapturetype' => array( - 'exif-scenecapturetype-0', - 'exif-scenecapturetype-1', - 'exif-scenecapturetype-2', - 'exif-scenecapturetype-3', - ), - 'exif-gaincontrol' => array( - 'exif-gaincontrol-0', - 'exif-gaincontrol-1', - 'exif-gaincontrol-2', - 'exif-gaincontrol-3', - 'exif-gaincontrol-4', - ), - 'exif-contrast' => array( - 'exif-contrast-0', - 'exif-contrast-1', - 'exif-contrast-2', - ), - 'exif-saturation' => array( - 'exif-saturation-0', - 'exif-saturation-1', - 'exif-saturation-2', - ), - 'exif-sharpness' => array( - 'exif-sharpness-0', - 'exif-sharpness-1', - 'exif-sharpness-2', - ), - 'exif-subjectdistancerange' => array( - 'exif-subjectdistancerange-0', - 'exif-subjectdistancerange-1', - 'exif-subjectdistancerange-2', - 'exif-subjectdistancerange-3', - ), - 'exif-gpslatitude' => array( - 'exif-gpslatitude-n', - 'exif-gpslatitude-s', - ), - 'exif-gpslongitude' => array( - 'exif-gpslongitude-e', - 'exif-gpslongitude-w', - ), - 'exif-altituderef' => array( - 'exif-gpsaltitude-above-sealevel', - 'exif-gpsaltitude-below-sealevel', - ), - 'exif-gpsstatus' => array( - 'exif-gpsstatus-a', - 'exif-gpsstatus-v', - ), - 'exif-gpsmeasuremode' => array( - 'exif-gpsmeasuremode-2', - 'exif-gpsmeasuremode-3', - ), - 'exif-gpsspeed' => array( - 'exif-gpsspeed-k', - 'exif-gpsspeed-m', - 'exif-gpsspeed-n', - ), - 'exif-gpsdestdistanceref' => array( - 'exif-gpsdestdistance-k', - 'exif-gpsdestdistance-m', - 'exif-gpsdestdistance-n', - ), - 'exif-gdop' => array( - 'exif-gpsdop-excellent', - 'exif-gpsdop-good', - 'exif-gpsdop-moderate', - 'exif-gpsdop-fair', - 'exif-gpsdop-poor', - ), - 'exif-objectcycle' => array( - 'exif-objectcycle-a', - 'exif-objectcycle-p', - 'exif-objectcycle-b', - ), - 'exif-gpsdirection' => array( - 'exif-gpsdirection-t', - 'exif-gpsdirection-m', - ), - 'exif-ycbcrpositioning' => array( - 'exif-ycbcrpositioning-1', - 'exif-ycbcrpositioning-2', - ), - 'exif-dc' => array( - 'exif-dc-contributor', - 'exif-dc-coverage', - 'exif-dc-date', - 'exif-dc-publisher', - 'exif-dc-relation', - 'exif-dc-rights', - 'exif-dc-source', - 'exif-dc-type', - ), - 'exif-rating' => array( - 'exif-rating-rejected', - ), - 'exif-isospeedratings' => array( - 'exif-isospeedratings-overflow', - ), - 'exif-maxaperturevalue' => array( - 'exif-maxaperturevalue-value', - ), - 'exif-iimcategory' => array( - 'exif-iimcategory-ace', - 'exif-iimcategory-clj', - 'exif-iimcategory-dis', - 'exif-iimcategory-fin', - 'exif-iimcategory-edu', - 'exif-iimcategory-evn', - 'exif-iimcategory-hth', - 'exif-iimcategory-hum', - 'exif-iimcategory-lab', - 'exif-iimcategory-lif', - 'exif-iimcategory-pol', - 'exif-iimcategory-rel', - 'exif-iimcategory-sci', - 'exif-iimcategory-soi', - 'exif-iimcategory-spo', - 'exif-iimcategory-war', - 'exif-iimcategory-wea', - ), - 'exif-urgency' => array( - 'exif-urgency-normal', - 'exif-urgency-low', - 'exif-urgency-high', - 'exif-urgency-other', - ), - 'edit-externally' => array( - 'edit-externally', - 'edit-externally-help', - ), - 'all' => array( - 'watchlistall2', - 'namespacesall', - 'monthsall', - 'limitall', - ), - 'confirmemail' => array( - 'confirmemail', - 'confirmemail_noemail', - 'confirmemail_text', - 'confirmemail_pending', - 'confirmemail_send', - 'confirmemail_sent', - 'confirmemail_oncreate', - 'confirmemail_sendfailed', - 'confirmemail_invalid', - 'confirmemail_needlogin', - 'confirmemail_success', - 'confirmemail_loggedin', - 'confirmemail_error', - 'confirmemail_subject', - 'confirmemail_body', - 'confirmemail_body_changed', - 'confirmemail_body_set', - 'confirmemail_invalidated', - 'invalidateemail', - ), - 'scarytransclusion' => array( - 'scarytranscludedisabled', - 'scarytranscludefailed', - 'scarytranscludefailed-httpstatus', - 'scarytranscludetoolong', - ), - 'deleteconflict' => array( - 'deletedwhileediting', - 'confirmrecreate', - 'confirmrecreate-noreason', - 'recreate', - ), - 'unit-pixel' => array( - 'unit-pixel', - ), - 'purge' => array( - 'confirm_purge_button', - 'confirm-purge-top', - 'confirm-purge-bottom', - ), - 'watch-unwatch' => array( - 'confirm-watch-button', - 'confirm-watch-top', - 'confirm-unwatch-button', - 'confirm-unwatch-top', - ), - 'separators' => array( - 'semicolon-separator', - 'comma-separator', - 'colon-separator', - 'autocomment-prefix', - 'pipe-separator', - 'word-separator', - 'ellipsis', - 'percent', - 'parentheses', - 'brackets', - ), - 'imgmulti' => array( - 'imgmultipageprev', - 'imgmultipagenext', - 'imgmultigo', - 'imgmultigoto', - ), - 'tablepager' => array( - 'ascending_abbrev', - 'descending_abbrev', - 'table_pager_next', - 'table_pager_prev', - 'table_pager_first', - 'table_pager_last', - 'table_pager_limit', - 'table_pager_limit_label', - 'table_pager_limit_submit', - 'table_pager_empty', - ), - 'autosumm' => array( - 'autosumm-blank', - 'autosumm-replace', - 'autoredircomment', - 'autosumm-new', - ), - 'autoblock_whitelist' => array( - 'autoblock_whitelist', - ), - 'sizeunits' => array( - 'size-bytes', - 'size-kilobytes', - 'size-megabytes', - 'size-gigabytes', - 'size-terabytes', - 'size-petabytes', - 'size-exabytes', - 'size-zetabytes', - 'size-yottabytes', - ), - 'bitrateunits' => array( - 'bitrate-bits', - 'bitrate-kilobits', - 'bitrate-megabits', - 'bitrate-gigabits', - 'bitrate-terabits', - 'bitrate-petabits', - 'bitrate-exabits', - 'bitrate-zetabits', - 'bitrate-yottabits', - ), - 'livepreview' => array( - 'livepreview-loading', - 'livepreview-ready', - 'livepreview-failed', - 'livepreview-error', - ), - 'lagwarning' => array( - 'lag-warn-normal', - 'lag-warn-high', - ), - 'watch' => array( - 'confirm-watch-button', - ), - 'watchlisteditor' => array( - 'editwatchlist-summary', - 'watchlistedit-numitems', - 'watchlistedit-noitems', - 'watchlistedit-normal-title', - 'watchlistedit-normal-legend', - 'watchlistedit-normal-explain', - 'watchlistedit-normal-submit', - 'watchlistedit-normal-done', - 'watchlistedit-raw-title', - 'watchlistedit-raw-legend', - 'watchlistedit-raw-explain', - 'watchlistedit-raw-titles', - 'watchlistedit-raw-submit', - 'watchlistedit-raw-done', - 'watchlistedit-raw-added', - 'watchlistedit-raw-removed', - ), - 'watchlisttools' => array( - 'watchlisttools-view', - 'watchlisttools-edit', - 'watchlisttools-raw', - ), - 'iranian-dates' => array( - 'iranian-calendar-m1', - 'iranian-calendar-m2', - 'iranian-calendar-m3', - 'iranian-calendar-m4', - 'iranian-calendar-m5', - 'iranian-calendar-m6', - 'iranian-calendar-m7', - 'iranian-calendar-m8', - 'iranian-calendar-m9', - 'iranian-calendar-m10', - 'iranian-calendar-m11', - 'iranian-calendar-m12', - ), - 'hijri-dates' => array( - 'hijri-calendar-m1', - 'hijri-calendar-m2', - 'hijri-calendar-m3', - 'hijri-calendar-m4', - 'hijri-calendar-m5', - 'hijri-calendar-m6', - 'hijri-calendar-m7', - 'hijri-calendar-m8', - 'hijri-calendar-m9', - 'hijri-calendar-m10', - 'hijri-calendar-m11', - 'hijri-calendar-m12', - ), - 'hebrew-dates' => array( - 'hebrew-calendar-m1', - 'hebrew-calendar-m2', - 'hebrew-calendar-m3', - 'hebrew-calendar-m4', - 'hebrew-calendar-m5', - 'hebrew-calendar-m6', - 'hebrew-calendar-m6a', - 'hebrew-calendar-m6b', - 'hebrew-calendar-m7', - 'hebrew-calendar-m8', - 'hebrew-calendar-m9', - 'hebrew-calendar-m10', - 'hebrew-calendar-m11', - 'hebrew-calendar-m12', - 'hebrew-calendar-m1-gen', - 'hebrew-calendar-m2-gen', - 'hebrew-calendar-m3-gen', - 'hebrew-calendar-m4-gen', - 'hebrew-calendar-m5-gen', - 'hebrew-calendar-m6-gen', - 'hebrew-calendar-m6a-gen', - 'hebrew-calendar-m6b-gen', - 'hebrew-calendar-m7-gen', - 'hebrew-calendar-m8-gen', - 'hebrew-calendar-m9-gen', - 'hebrew-calendar-m10-gen', - 'hebrew-calendar-m11-gen', - 'hebrew-calendar-m12-gen', - ), - 'signatures' => array( - 'signature', - 'signature-anon', - 'timezone-utc', - ), - 'CoreParserFunctions' => array( - 'unknown_extension_tag', - 'duplicate-defaultsort', - ), - 'version' => array( - 'version', - 'version-summary', - 'version-extensions', - 'version-specialpages', - 'version-parserhooks', - 'version-variables', - 'version-antispam', - 'version-skins', - 'version-api', - 'version-other', - 'version-mediahandlers', - 'version-hooks', - 'version-parser-extensiontags', - 'version-parser-function-hooks', - 'version-hook-name', - 'version-hook-subscribedby', - 'version-version', - 'version-svn-revision', - 'version-license', - 'version-poweredby-credits', - 'version-poweredby-others', - 'version-poweredby-translators', - 'version-credits-summary', - 'version-license-info', - 'version-software', - 'version-software-product', - 'version-software-version', - 'version-db-mysql-url', - 'version-db-mariadb-url', - 'version-db-percona-url', - 'version-db-postgres-url', - 'version-db-oracle-url', - 'version-db-sqlite-url', - 'version-db-mssql-url', - 'version-entrypoints', - 'version-entrypoints-header-entrypoint', - 'version-entrypoints-header-url', - 'version-entrypoints-articlepath', - 'version-entrypoints-scriptpath', - 'version-entrypoints-index-php', - 'version-entrypoints-api-php', - 'version-entrypoints-load-php', - ), - 'redirect' => array( - 'redirect', - 'redirect-legend', - 'redirect-text', - 'redirect-summary', - 'redirect-submit', - 'redirect-lookup', - 'redirect-value', - 'redirect-user', - 'redirect-revision', - 'redirect-file', - 'redirect-not-exists', - ), - 'fileduplicatesearch' => array( - 'fileduplicatesearch', - 'fileduplicatesearch-summary', - 'fileduplicatesearch-legend', - 'fileduplicatesearch-filename', - 'fileduplicatesearch-submit', - 'fileduplicatesearch-info', - 'fileduplicatesearch-result-1', - 'fileduplicatesearch-result-n', - 'fileduplicatesearch-noresults', - ), - 'special-specialpages' => array( - 'specialpages', - 'specialpages-summary', - 'specialpages-note', - 'specialpages-group-maintenance', - 'specialpages-group-other', - 'specialpages-group-login', - 'specialpages-group-changes', - 'specialpages-group-media', - 'specialpages-group-users', - 'specialpages-group-highuse', - 'specialpages-group-pages', - 'specialpages-group-pagetools', - 'specialpages-group-wiki', - 'specialpages-group-redirects', - 'specialpages-group-spam', - ), - 'special-blank' => array( - 'blankpage', - 'intentionallyblankpage', - ), - 'external_images' => array( - 'external_image_whitelist', - ), - 'special-tags' => array( - 'tags', - 'tags-summary', - 'tag-filter', - 'tag-filter-submit', - 'tag-list-wrapper', - 'tags-title', - 'tags-intro', - 'tags-tag', - 'tags-display-header', - 'tags-description-header', - 'tags-active-header', - 'tags-hitcount-header', - 'tags-active-yes', - 'tags-active-no', - 'tags-edit', - 'tags-hitcount', - ), - 'comparepages' => array( - 'comparepages', - 'comparepages-summary', - 'compare-selector', - 'compare-page1', - 'compare-page2', - 'compare-rev1', - 'compare-rev2', - 'compare-submit', - 'compare-invalid-title', - 'compare-title-not-exists', - 'compare-revision-not-exists', - ), - 'db-error-messages' => array( - 'dberr-header', - 'dberr-problems', - 'dberr-again', - 'dberr-info', - 'dberr-info-hidden', - 'dberr-usegoogle', - 'dberr-outofdate', - 'dberr-cachederror', - ), - 'html-forms' => array( - 'htmlform-invalid-input', - 'htmlform-select-badoption', - 'htmlform-int-invalid', - 'htmlform-float-invalid', - 'htmlform-int-toolow', - 'htmlform-int-toohigh', - 'htmlform-required', - 'htmlform-submit', - 'htmlform-reset', - 'htmlform-selectorother-other', - 'htmlform-no', - 'htmlform-yes', - 'htmlform-chosen-placeholder', - ), - 'sqlite' => array( - 'sqlite-has-fts', - 'sqlite-no-fts', - ), - 'unwatch' => array( - 'confirm-unwatch-button', - ), - 'logging' => array( - 'logentry-delete-delete', - 'logentry-delete-restore', - 'logentry-delete-event', - 'logentry-delete-revision', - 'logentry-delete-event-legacy', - 'logentry-delete-revision-legacy', - 'logentry-suppress-delete', - 'logentry-suppress-event', - 'logentry-suppress-revision', - 'logentry-suppress-event-legacy', - 'logentry-suppress-revision-legacy', - 'revdelete-content-hid', - 'revdelete-summary-hid', - 'revdelete-uname-hid', - 'revdelete-content-unhid', - 'revdelete-summary-unhid', - 'revdelete-uname-unhid', - 'revdelete-restricted', - 'revdelete-unrestricted', - 'logentry-move-move', - 'logentry-move-move-noredirect', - 'logentry-move-move_redir', - 'logentry-move-move_redir-noredirect', - 'logentry-patrol-patrol', - 'logentry-patrol-patrol-auto', - 'logentry-newusers-newusers', - 'logentry-newusers-create', - 'logentry-newusers-create2', - 'logentry-newusers-byemail', - 'logentry-newusers-autocreate', - 'logentry-rights-rights', - 'logentry-rights-rights-legacy', - 'logentry-rights-autopromote', - 'rightsnone', - ), - 'logging-irc' => array( - 'revdelete-logentry', - 'logdelete-logentry', - 'revdelete-content', - 'revdelete-summary', - 'revdelete-uname', - 'revdelete-hid', - 'revdelete-unhid', - 'revdelete-log-message', - 'logdelete-log-message', - 'deletedarticle', - 'suppressedarticle', - 'undeletedarticle', - 'patrol-log-line', - 'patrol-log-auto', - 'patrol-log-diff', - '1movedto2', - '1movedto2_redir', - 'move-redirect-suppressed', - 'newuserlog-create-entry', - 'newuserlog-create2-entry', - 'newuserlog-autocreate-entry', - 'suppressedarticle', - 'deletedarticle', - // 'uploadedimage', - // 'overwroteimage', - 'rightslogentry', - 'rightslogentry-autopromote', - ), - 'feedback' => array( - 'feedback-bugornote', - 'feedback-subject', - 'feedback-message', - 'feedback-cancel', - 'feedback-submit', - 'feedback-adding', - 'feedback-error1', - 'feedback-error2', - 'feedback-error3', - 'feedback-thanks', - 'feedback-close', - 'feedback-bugcheck', - 'feedback-bugnew', - ), - 'searchsuggestions' => array( - 'searchsuggest-search', - 'searchsuggest-containing', - ), - 'apierrors' => array( - 'api-error-badaccess-groups', - 'api-error-badtoken', - 'api-error-copyuploaddisabled', - 'api-error-duplicate', - 'api-error-duplicate-archive', - 'api-error-duplicate-archive-popup-title', - 'api-error-duplicate-popup-title', - 'api-error-empty-file', - 'api-error-emptypage', - 'api-error-fetchfileerror', - 'api-error-fileexists-forbidden', - 'api-error-fileexists-shared-forbidden', - 'api-error-file-too-large', - 'api-error-filename-tooshort', - 'api-error-filetype-banned', - 'api-error-filetype-banned-type', - 'api-error-filetype-missing', - 'api-error-hookaborted', - 'api-error-http', - 'api-error-illegal-filename', - 'api-error-internal-error', - 'api-error-invalid-file-key', - 'api-error-missingparam', - 'api-error-missingresult', - 'api-error-mustbeloggedin', - 'api-error-mustbeposted', - 'api-error-noimageinfo', - 'api-error-nomodule', - 'api-error-ok-but-empty', - 'api-error-overwrite', - 'api-error-stashfailed', - 'api-error-publishfailed', - 'api-error-timeout', - 'api-error-unclassified', - 'api-error-unknown-code', - 'api-error-unknown-error', - 'api-error-unknown-warning', - 'api-error-unknownerror', - 'api-error-uploaddisabled', - 'api-error-verification-error', - ), - 'duration' => array( - 'duration-seconds', - 'duration-minutes', - 'duration-hours', - 'duration-days', - 'duration-weeks', - 'duration-years', - 'duration-decades', - 'duration-centuries', - 'duration-millennia' - ), - 'rotation' => array( - 'rotate-comment', - ), - 'limitreport' => array( - 'limitreport-title', - 'limitreport-cputime', - 'limitreport-cputime-value', - 'limitreport-walltime', - 'limitreport-walltime-value', - 'limitreport-ppvisitednodes', - 'limitreport-ppvisitednodes-value', - 'limitreport-ppgeneratednodes', - 'limitreport-ppgeneratednodes-value', - 'limitreport-postexpandincludesize', - 'limitreport-postexpandincludesize-value', - 'limitreport-templateargumentsize', - 'limitreport-templateargumentsize-value', - 'limitreport-expansiondepth', - 'limitreport-expansiondepth-value', - 'limitreport-expensivefunctioncount', - 'limitreport-expensivefunctioncount-value', - ), -); - -/** Comments for each block */ -$wgBlockComments = array( - 'sidebar' => "The sidebar for MonoBook is generated from this message, lines that do not -begin with * or ** are discarded, furthermore lines that do begin with ** and -do not contain | are also discarded, but do not depend on this behavior for -future releases. Also note that since each list value is wrapped in a unique -(X)HTML id it should only appear once and include characters that are legal -(X)HTML id names.", - 'toggles' => 'User preference toggles', - 'underline' => '', - 'editfont' => 'Font style option in Special:Preferences', - 'dates' => 'Dates', - 'categorypages' => 'Categories related messages', - 'mainpage' => '', - 'miscellaneous1' => '', - 'cologneblue' => 'Cologne Blue skin', - 'vector' => 'Vector skin', - 'miscellaneous2' => '', - 'links' => 'All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).', - 'badaccess' => '', - 'versionrequired' => '', - 'miscellaneous3' => '', - 'nstab' => "Short words for each namespace, by default used in the namespace tab in monobook", - 'main' => 'Main script and global functions', - 'errors' => 'General errors', - 'virus' => 'Virus scanner', - 'login' => 'Login and logout pages', - 'mail' => 'Email sending', - 'passwordstrength' => 'JavaScript password checks', - 'resetpass' => 'Change password dialog', - 'passwordreset' => 'Special:PasswordReset', - 'changeemail' => 'Special:ChangeEmail', - 'resettokens' => 'Special:ResetTokens', - 'toolbar' => 'Edit page toolbar', - 'edit' => 'Edit pages', - 'parserwarnings' => 'Parser/template warnings', - 'contentmodels' => 'Content models', - 'undo' => '"Undo" feature', - 'cantcreateaccount' => 'Account creation failure', - 'history' => 'History pages', - 'history-feed' => 'Revision feed', - 'revdelete' => 'Revision deletion', - 'suppression' => 'Suppression log', - 'mergehistory' => 'History merging', - 'mergelog' => 'Merge log', - 'diffs' => 'Diffs', - 'search' => 'Search results', - 'opensearch' => 'OpenSearch description', - 'preferences' => 'Preferences page', - 'preferences-email' => 'User preference: email validation using jQuery', - 'userrights' => 'User rights', - 'group' => 'Groups', - 'group-member' => '', - 'grouppage' => '', - 'right' => 'Rights', - 'action' => 'Associated actions - in the sentence "You do not have permission to X"', - 'rightslog' => 'User rights log', - 'recentchanges' => 'Recent changes', - 'recentchangeslinked' => 'Recent changes linked', - 'upload' => 'Upload', - 'zip' => 'ZipDirectoryReader', - 'upload-errors' => '', - 'filebackend-errors' => 'File backend', - 'filejournal-errors' => 'File journal errors', - 'lockmanager-errors' => 'Lock manager', - 'uploadstash' => 'Special:UploadStash', - 'img-auth' => 'img_auth script messages', - 'http-errors' => 'HTTP errors', - 'upload-curl-errors' => 'Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>', - 'licenses' => '', - 'filelist' => 'Special:ListFiles', - 'filedescription' => 'File description page', - 'filerevert' => 'File reversion', - 'filedelete' => 'File deletion', - 'mimesearch' => 'MIME search', - 'unwatchedpages' => 'Unwatched pages', - 'listredirects' => 'List redirects', - 'unusedtemplates' => 'Unused templates', - 'randompage' => 'Random page', - 'randomincategory' => 'Random page in category', - 'randomredirect' => 'Random redirect', - 'statistics' => 'Statistics', - 'pageswithprop' => '', - 'doubleredirects' => '', - 'brokenredirects' => '', - 'withoutinterwiki' => '', - 'fewestrevisions' => '', - 'specialpages' => 'Miscellaneous special pages', - 'booksources' => 'Book sources', - 'magicwords' => 'Magic words', - 'logpages' => 'Special:Log', - 'allpages' => 'Special:AllPages', - 'categories' => 'Special:Categories', - 'deletedcontribs' => 'Special:DeletedContributions', - 'linksearch' => 'Special:LinkSearch', - 'listusers' => 'Special:ListUsers', - 'activeusers' => 'Special:ActiveUsers', - 'newuserlog' => 'Special:Log/newusers', - 'listgrouprights' => 'Special:ListGroupRights', - 'emailuser' => 'Email user', - 'usermessage' => 'User Messenger', - 'watchlist' => 'Watchlist', - 'watching' => 'Displayed when you click the "watch" button and it is in the process of watching', - 'enotif' => '', - 'delete' => 'Delete', - 'rollback' => 'Rollback', - 'edittokens' => 'Edit tokens', - 'protect' => 'Protect', - 'restrictions' => 'Restrictions (nouns)', - 'restriction-levels' => 'Restriction levels', - 'undelete' => 'Undelete', - 'nsform' => 'Namespace form on various pages', - 'contributions' => 'Contributions', - 'sp-contributions' => '', - 'whatlinkshere' => 'What links here', - 'block' => 'Block/unblock', - 'developertools' => 'Developer tools', - 'movepage' => 'Move page', - 'export' => 'Export', - 'allmessages' => 'Namespace 8 related', - 'thumbnails' => 'Thumbnails', - 'import' => 'Special:Import', - 'importlog' => 'Import log', - 'javaccripttest' => 'JavaScriptTest', - 'accesskeys' => 'Keyboard access keys for power users', - 'tooltips' => 'Tooltip help for the actions', - 'stylesheets' => 'Stylesheets', - 'scripts' => 'Scripts', - 'metadata_cc' => 'Metadata', - 'attribution' => 'Attribution', - 'spamprotection' => 'Spam protection', - 'info' => 'Info page', - 'skin' => 'Skin names', - 'patrolling' => 'Patrolling', - 'patrol-log' => 'Patrol log', - 'imagedeletion' => 'Image deletion', - 'browsediffs' => 'Browsing diffs', - 'newfiles' => 'Special:NewFiles', - 'video-info' => 'Video information, used by Language::formatTimePeriod() to format lengths in the above messages', - 'human-timestamps' => 'Human-readable timestamps', - 'badimagelist' => 'Bad image list', - 'variantname-zh' => "Short names for language variants used for language conversion links. -Variants for Chinese language", - 'variantname-gan' => 'Variants for Gan language', - 'variantname-sr' => 'Variants for Serbian language', - 'variantname-kk' => 'Variants for Kazakh language', - 'variantname-ku' => 'Variants for Kurdish language', - 'variantname-tg' => 'Variants for Tajiki language', - 'variantname-iu' => 'Variants for Inuktitut language', - 'variantname-shi' => 'Variants for Tachelhit language', - 'media-info' => 'Media information', - 'metadata' => 'Metadata', - 'exif' => 'Exif tags', - 'exif-values' => 'Make & model, can be wikified in order to link to the camera and model name', - 'exif-compression' => 'Exif attributes', - 'exif-copyrighted' => '', - 'exif-unknowndate' => '', - 'exif-photometricinterpretation' => '', - 'exif-orientation' => '', - 'exif-planarconfiguration' => '', - 'exif-xyresolution' => '', - 'exif-colorspace' => '', - 'exif-componentsconfiguration' => '', - 'exif-exposureprogram' => '', - 'exif-subjectdistance-value' => '', - 'exif-meteringmode' => '', - 'exif-lightsource' => '', - 'exif-flash' => 'Flash modes', - 'exif-focalplaneresolutionunit' => '', - 'exif-sensingmethod' => '', - 'exif-filesource' => '', - 'exif-scenetype' => '', - 'exif-customrendered' => '', - 'exif-exposuremode' => '', - 'exif-whitebalance' => '', - 'exif-scenecapturetype' => '', - 'exif-gaincontrol' => '', - 'exif-contrast' => '', - 'exif-saturation' => '', - 'exif-sharpness' => '', - 'exif-subjectdistancerange' => '', - 'exif-gpslatitude' => 'Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef', - 'exif-gpslongitude' => 'Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef', - 'exif-altituderef' => 'Pseudotags used for GPSAltitudeRef', - 'exif-gpsstatus' => '', - 'exif-gpsmeasuremode' => '', - 'exif-gpsspeed' => 'Pseudotags used for GPSSpeedRef', - 'exif-gpsdestdistanceref' => 'Pseudotags used for GPSDestDistanceRef', - 'exif-gdop' => '', - 'exif-objectcycle' => '', - 'exif-gpsdirection' => 'Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef', - 'exif-ycbcrpositioning' => '', - 'exif-dc' => '', - 'exif-rating' => '', - 'exif-isospeedratings' => '', - 'exif-maxaperturevalue' => '', - 'exif-iimcategory' => '', - 'exif-urgency' => '', - 'edit-externally' => 'External editor support', - 'all' => "'all' in various places, this might be different for inflected languages", - 'confirmemail' => 'Email address confirmation', - 'scarytransclusion' => 'Scary transclusion', - 'deleteconflict' => 'Delete conflict', - 'unit-pixel' => '', - 'purge' => 'action=purge', - 'watch-unwatch' => 'action=watch/unwatch', - 'separators' => 'Separators for various lists, etc.', - 'imgmulti' => 'Multipage image navigation', - 'tablepager' => 'Table pager', - 'autosumm' => 'Auto-summaries', - 'autoblock_whitelist' => 'Autoblock whitelist', - 'sizeunits' => 'Size units', - 'bitrateunits' => 'Bitrate units', - 'livepreview' => 'Live preview', - 'lagwarning' => 'Friendlier slave lag warnings', - 'watchlisteditor' => 'Watchlist editor', - 'watchlisttools' => 'Watchlist editing tools', - 'iranian-dates' => 'Iranian month names', - 'hijri-dates' => 'Hijri month names', - 'hebrew-dates' => 'Hebrew month names', - 'signatures' => 'Signatures', - 'CoreParserFunctions' => 'Core parser functions', - 'version' => 'Special:Version', - 'redirect' => 'Special:Redirect', - 'fileduplicatesearch' => 'Special:FileDuplicateSearch', - 'special-specialpages' => 'Special:SpecialPages', - 'special-blank' => 'Special:BlankPage', - 'external_images' => 'External image whitelist', - 'special-tags' => 'Special:Tags', - 'comparepages' => 'Special:ComparePages', - 'db-error-messages' => 'Database error messages', - 'html-forms' => 'HTML forms', - 'sqlite' => 'SQLite database support', - 'logging' => 'New logging system', - 'logging-irc' => 'For IRC, see bug 34508. Do not change', - 'feedback' => 'Feedback', - 'searchsuggestions' => 'Search suggestions', - 'apierrors' => 'API errors', - 'duration' => 'Durations', - 'cachedspecial' => 'SpecialCachedPage', - 'rotation' => 'Image rotation', - 'limitreport' => 'Limit report', -); diff --git a/maintenance/language/rebuildLanguage.php b/maintenance/language/rebuildLanguage.php deleted file mode 100644 index 66948aeb..00000000 --- a/maintenance/language/rebuildLanguage.php +++ /dev/null @@ -1,126 +0,0 @@ -<?php -/** - * Rewrite the messages array in the files languages/messages/MessagesXx.php. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * http://www.gnu.org/copyleft/gpl.html - * - * @file - * @ingroup MaintenanceLanguage - * @defgroup MaintenanceLanguage MaintenanceLanguage - */ - -require_once __DIR__ . '/../commandLine.inc'; -require_once 'languages.inc'; -require_once 'writeMessagesArray.inc'; - -/** - * Rewrite a messages array. - * - * @param $languages - * @param $code string The language code. - * @param bool $write Write to the messages file? - * @param bool $listUnknown List the unknown messages? - * @param bool $removeUnknown Remove the unknown messages? - * @param bool $removeDupes Remove the duplicated messages? - * @param $dupeMsgSource string The source file intended to remove from the array. - * @param $messagesFolder String: path to a folder to store the MediaWiki messages. - */ -function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown, $removeDupes, $dupeMsgSource, $messagesFolder ) { - $messages = $languages->getMessages( $code ); - $messages = $messages['all']; - if ( $removeDupes ) { - $messages = removeDupes( $messages, $dupeMsgSource ); - } - MessageWriter::writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown, $messagesFolder ); -} - -/** - * Remove duplicates from a message array. - * - * @param $oldMsgArray array The input message array. - * @param $dupeMsgSource string The source file path for duplicates. - * @return Array $newMsgArray The output message array, with duplicates removed. - */ -function removeDupes( $oldMsgArray, $dupeMsgSource ) { - if ( file_exists( $dupeMsgSource ) ) { - include $dupeMsgSource; - if ( !isset( $dupeMessages ) ) { - echo "There are no duplicated messages in the source file provided."; - exit( 1 ); - } - } else { - echo "The specified file $dupeMsgSource cannot be found."; - exit( 1 ); - } - $newMsgArray = $oldMsgArray; - foreach ( $oldMsgArray as $key => $value ) { - if ( array_key_exists( $key, $dupeMessages ) ) { - unset( $newMsgArray[$key] ); - } - } - return $newMsgArray; -} - -# Show help -if ( isset( $options['help'] ) ) { - echo <<<TEXT -Run this script to rewrite the messages array in the files languages/messages/MessagesXX.php. -Parameters: - * lang: Language code (default: the installation default language). You can also specify "all" to check all the languages. - * help: Show this help. -Options: - * dry-run: Do not write the array to the file. - * no-unknown: Do not list the unknown messages. - * remove-unknown: Remove unknown messages. - * remove-duplicates: Remove duplicated messages based on a PHP source file. - * messages-folder: An alternative folder with MediaWiki messages. - -TEXT; - exit( 1 ); -} - -# Get the language code -if ( isset( $options['lang'] ) ) { - $wgCode = $options['lang']; -} else { - $wgCode = $wgContLang->getCode(); -} - -# Get the duplicate message source -if ( isset( $options['remove-duplicates'] ) && ( strcmp( $options['remove-duplicates'], '' ) ) ) { - $wgDupeMessageSource = $options['remove-duplicates']; -} else { - $wgDupeMessageSource = ''; -} - -# Get the options -$wgWriteToFile = !isset( $options['dry-run'] ); -$wgListUnknownMessages = !isset( $options['no-unknown'] ); -$wgRemoveUnknownMessages = isset( $options['remove-unknown'] ); -$wgRemoveDuplicateMessages = isset( $options['remove-duplicates'] ); -$messagesFolder = isset( $options['messages-folder'] ) ? $options['messages-folder'] : false; - -# Get language objects -$languages = new languages(); - -# Write all the language -if ( $wgCode == 'all' ) { - foreach ( $languages->getLanguages() as $languageCode ) { - rebuildLanguage( $languages, $languageCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource, $messagesFolder ); - } -} else { - rebuildLanguage( $languages, $wgCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource, $messagesFolder ); -} diff --git a/maintenance/language/transstat.php b/maintenance/language/transstat.php index 61b84a07..4a853b0f 100644 --- a/maintenance/language/transstat.php +++ b/maintenance/language/transstat.php @@ -24,7 +24,7 @@ * @author Antoine Musso <hashar at free dot fr> * * Output is posted from time to time on: - * http://www.mediawiki.org/wiki/Localisation_statistics + * https://www.mediawiki.org/wiki/Localisation_statistics */ $optionsWithArgs = array( 'output' ); @@ -32,7 +32,6 @@ require_once __DIR__ . '/../commandLine.inc'; require_once 'languages.inc'; require_once __DIR__ . '/StatOutputs.php'; - if ( isset( $options['help'] ) ) { showUsage(); } @@ -57,25 +56,23 @@ TEXT; exit( 1 ); } - - # Select an output engine switch ( $options['output'] ) { case 'wiki': - $output = new wikiStatsOutput(); + $output = new WikiStatsOutput(); break; case 'text': - $output = new textStatsOutput(); + $output = new TextStatsOutput(); break; case 'csv': - $output = new csvStatsOutput(); + $output = new CsvStatsOutput(); break; default: showUsage(); } # Languages -$wgLanguages = new languages(); +$wgLanguages = new Languages(); # Header $output->heading(); @@ -97,7 +94,8 @@ $wgRequiredMessagesNumber = count( $wgGeneralMessages['required'] ); foreach ( $wgLanguages->getLanguages() as $code ) { # Don't check English, RTL English or dummy language codes if ( $code == 'en' || $code == 'enRTL' || ( is_array( $wgDummyLanguageCodes ) && - isset( $wgDummyLanguageCodes[$code] ) ) ) { + isset( $wgDummyLanguageCodes[$code] ) ) + ) { continue; } @@ -107,16 +105,33 @@ foreach ( $wgLanguages->getLanguages() as $code ) { $messages = $wgLanguages->getMessages( $code ); $messagesNumber = count( $messages['translated'] ); $requiredMessagesNumber = count( $messages['required'] ); - $requiredMessagesPercent = $output->formatPercent( $requiredMessagesNumber, $wgRequiredMessagesNumber ); + $requiredMessagesPercent = $output->formatPercent( + $requiredMessagesNumber, + $wgRequiredMessagesNumber + ); $obsoleteMessagesNumber = count( $messages['obsolete'] ); - $obsoleteMessagesPercent = $output->formatPercent( $obsoleteMessagesNumber, $messagesNumber, true ); + $obsoleteMessagesPercent = $output->formatPercent( + $obsoleteMessagesNumber, + $messagesNumber, + true + ); $messagesWithMismatchVariables = $wgLanguages->getMessagesWithMismatchVariables( $code ); $emptyMessages = $wgLanguages->getEmptyMessages( $code ); $messagesWithWhitespace = $wgLanguages->getMessagesWithWhitespace( $code ); $nonXHTMLMessages = $wgLanguages->getNonXHTMLMessages( $code ); $messagesWithWrongChars = $wgLanguages->getMessagesWithWrongChars( $code ); - $problematicMessagesNumber = count( array_unique( array_merge( $messagesWithMismatchVariables, $emptyMessages, $messagesWithWhitespace, $nonXHTMLMessages, $messagesWithWrongChars ) ) ); - $problematicMessagesPercent = $output->formatPercent( $problematicMessagesNumber, $messagesNumber, true ); + $problematicMessagesNumber = count( array_unique( array_merge( + $messagesWithMismatchVariables, + $emptyMessages, + $messagesWithWhitespace, + $nonXHTMLMessages, + $messagesWithWrongChars + ) ) ); + $problematicMessagesPercent = $output->formatPercent( + $problematicMessagesNumber, + $messagesNumber, + true + ); # Output them $output->blockstart(); diff --git a/maintenance/language/validate.php b/maintenance/language/validate.php deleted file mode 100644 index 63d9b847..00000000 --- a/maintenance/language/validate.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php -/** - * Check language files for unrecognised variables. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * http://www.gnu.org/copyleft/gpl.html - * - * @file - * @ingroup MaintenanceLanguage - */ - -if ( PHP_SAPI != 'cli' ) { - die( "Run me from the command line please.\n" ); -} - -if ( !isset( $argv[1] ) ) { - print "Usage: php {$argv[0]} <filename>\n"; - exit( 1 ); -} -array_shift( $argv ); - -define( 'MEDIAWIKI', 1 ); -define( 'NOT_REALLY_MEDIAWIKI', 1 ); - -$IP = __DIR__ . '/../..'; - -require_once "$IP/includes/Defines.php"; -require_once "$IP/languages/Language.php"; - -$files = array(); -foreach ( $argv as $arg ) { - $files = array_merge( $files, glob( $arg ) ); -} - -foreach ( $files as $filename ) { - print "$filename..."; - $vars = getVars( $filename ); - $keys = array_keys( $vars ); - $diff = array_diff( $keys, Language::$mLocalisationKeys ); - if ( $diff ) { - print "\nWarning: unrecognised variable(s): " . implode( ', ', $diff ) . "\n"; - } else { - print " ok\n"; - } -} - -function getVars( $filename ) { - require $filename; - $vars = get_defined_vars(); - unset( $vars['filename'] ); - return $vars; -} diff --git a/maintenance/language/writeMessagesArray.inc b/maintenance/language/writeMessagesArray.inc deleted file mode 100644 index fc0da3f5..00000000 --- a/maintenance/language/writeMessagesArray.inc +++ /dev/null @@ -1,283 +0,0 @@ -<?php -/** - * Write a messages array as a PHP text. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * http://www.gnu.org/copyleft/gpl.html - * - * @file - * @ingroup MaintenanceLanguage - */ - -/** - * @ingroup MaintenanceLanguage - */ -class MessageWriter { - static $optionalComment = 'only translate this message to other languages if you have to change it'; - static $ignoredComment = "do not translate or duplicate this message to other languages"; - - static $messageStructure; - static $blockComments; - static $ignoredMessages; - static $optionalMessages; - - /** - * Write a messages array as a PHP text and write it to the messages file. - * - * @param $messages Array: the messages array. - * @param $code String: the language code. - * @param $write Boolean: write to the messages file? - * @param $listUnknown Boolean: list the unknown messages? - * @param $removeUnknown Boolean: whether to remove unkown messages - * @param $messagesFolder String: path to a folder to store the MediaWiki messages. Defaults to the current install. - */ - public static function writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown, $messagesFolder = false ) { - # Rewrite the messages array - $messages = self::writeMessagesArray( $messages, $code == 'en', false, $removeUnknown ); - $messagesText = $messages[0]; - $sortedMessages = $messages[1]; - - # Write to the file - if ( $messagesFolder ) { - $filename = Language::getFileName( "$messagesFolder/Messages", $code ); - } else { - $filename = Language::getMessagesFileName( $code ); - } - - if ( file_exists( $filename ) ) { - $contents = file_get_contents( $filename ); - } else { - $contents = '<?php -$messages = array( -); -'; - } - - 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'] ) ) { - if ( $removeUnknown ) { - echo "\nThe following " . count( $sortedMessages['unknown'] ) . " unknown messages have been removed:\n"; - } else { - 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 seem to be no messages array in the file.\n"; - } - } - - /** - * Write a messages array as a PHP text. - * - * @param $messages Array: the messages array. - * @param $ignoredComments Boolean: show comments about ignored and optional - * messages? (For English.) - * @param $prefix String: base path for messages.inc and messageTypes.inc files - * or false for default path (this directory) - * @param $removeUnknown Boolean: whether to remove unkown messages - * - * @return Array of the PHP text and the sorted messages array. - */ - public static function writeMessagesArray( $messages, $ignoredComments = false, $prefix = false, $removeUnknown = false ) { - # Load messages - $dir = $prefix ? $prefix : __DIR__; - - require $dir . '/messages.inc'; - self::$messageStructure = $wgMessageStructure; - self::$blockComments = $wgBlockComments; - - require $dir . '/messageTypes.inc'; - self::$ignoredMessages = $wgIgnoredMessages; - self::$optionalMessages = $wgOptionalMessages; - - # Sort messages to blocks - $sortedMessages['unknown'] = $messages; - foreach ( self::$messageStructure as $blockName => $block ) { - /** - * @var $block array - */ - 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; - } - - if ( $ignoredComments ) { - $ignored = self::$ignoredMessages; - $optional = self::$optionalMessages; - } else { - $ignored = array(); - $optional = array(); - } - $comments = self::makeComments( array_keys( $messages ), $ignored, $optional ); - - # Write the block - $messagesText .= self::writeMessagesBlock( self::$blockComments[$block], $messages, $comments ); - } - - # Write the unknown messages, alphabetically sorted. - # Of course, we don't have any comments for them, because they are unknown. - if ( !$removeUnknown ) { - ksort( $sortedMessages['unknown'] ); - $messagesText .= self::writeMessagesBlock( 'Unknown messages', $sortedMessages['unknown'] ); - } - $messagesText .= "); -"; - return array( $messagesText, $sortedMessages ); - } - - /** - * Generates an array of comments for messages. - * - * @param $messages Array: key of messages. - * @param $ignored Array: list of ingored message keys. - * @param $optional Array: list of optional message keys. - * @return array - */ - public static function makeComments( $messages, $ignored, $optional ) { - # Comment collector - $commentArray = array(); - - # List of keys only - foreach ( $messages as $key ) { - if ( in_array( $key, $ignored ) ) { - $commentArray[$key] = ' # ' . self::$ignoredComment; - } elseif ( in_array( $key, $optional ) ) { - $commentArray[$key] = ' # ' . self::$optionalComment; - } - } - - return $commentArray; - } - - /** - * Write a block of messages to PHP. - * - * @param $blockComment String: the comment of whole block. - * @param $messages Array: the block messages. - * @param $messageComments Array: optional comments for messages in this block. - * @param $prefix String: prefix for every line, for indenting purposes. - * - * @return string The block, formatted in PHP. - */ - public static function writeMessagesBlock( $blockComment, $messages, - $messageComments = array(), $prefix = '' ) { - - $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( $blockComment ) ) { - if ( strpos( $blockComment, "\n" ) === false ) { - $blockText .= "$prefix# $blockComment -"; - } else { - $blockText .= "$prefix/* -$blockComment -*/ -"; - } - } - - # 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 .= "$prefix'$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 - # Quote \ here, because it needs always escaping - $value = addcslashes( $value, '\\' ); - - # For readability - $single = "'"; - $double = '"'; - - if ( strpos( $value, $single ) === false ) { - # Nothing ugly, just use ' - $blockText .= $single . $value . $single; - } elseif ( strpos( $value, $double ) === false && !preg_match( '/\$[a-zA-Z_\x7f-\xff]/', $value ) ) { - # No "-quotes, no variables that need quoting, use " - $blockText .= $double . $value . $double; - } else { - # Something needs quoting, pick the quote which causes less quoting - $quote = substr_count( $value, $double ) + substr_count( $value, '$' ) >= substr_count( $value, $single ) ? $single : $double; - if ( $quote === $double ) { - $extra = '$'; - } else { - $extra = ''; - } - $blockText .= $quote . addcslashes( $value, $quote . $extra ) . $quote; - } - - # Comma - $blockText .= ','; - - # Add comments, if there is any - if ( array_key_exists( $key, $messageComments ) ) { - $blockText .= $messageComments[$key]; - } - - # Newline - $blockText .= " -"; - } - - # Newline to end the block - $blockText .= " -"; - - return $blockText; - } -} diff --git a/maintenance/language/zhtable/Makefile.py b/maintenance/language/zhtable/Makefile.py index 7e197945..f902e581 100644 --- a/maintenance/language/zhtable/Makefile.py +++ b/maintenance/language/zhtable/Makefile.py @@ -30,9 +30,9 @@ def unichr3( *args ): return [unichr( int( i[2:7], 16 ) ) for i in args if i[2:7]] # DEFINE -UNIHAN_VER = '6.2.0' +UNIHAN_VER = '6.3.0' SF_MIRROR = 'dfn' -SCIM_TABLES_VER = '0.5.11' +SCIM_TABLES_VER = '0.5.13' SCIM_PINYIN_VER = '0.5.92' LIBTABE_VER = '0.2.3' # END OF DEFINE @@ -59,7 +59,11 @@ def uncompress( fp, member, encoding = 'U8' ): shutil.move( member, name ) if '/' in member: shutil.rmtree( member.split( '/', 1 )[0] ) - return open( name, 'rb', encoding, 'ignore' ) + if pyversion[:1] in ['2']: + fc = open( name, 'rb', encoding, 'ignore' ) + else: + fc = open( name, 'r', encoding = encoding, errors = 'ignore' ) + return fc unzip = lambda path, member, encoding = 'U8': \ uncompress( zf.ZipFile( path ), member, encoding ) @@ -136,7 +140,10 @@ def unihanParser( path ): def applyExcludes( mlist, path ): """ Apply exclude rules from path to mlist. """ - excludes = open( path, 'rb', 'U8' ).read().split() + if pyversion[:1] in ['2']: + excludes = open( path, 'rb', 'U8' ).read().split() + else: + excludes = open( path, 'r', encoding = 'U8' ).read().split() excludes = [word.split( '#' )[0].strip() for word in excludes] excludes = '|'.join( excludes ) excptn = re.compile( '.*(?:%s).*' % excludes ) @@ -145,7 +152,7 @@ def applyExcludes( mlist, path ): return mlist def charManualTable( path ): - fp = open( path, 'rb', 'U8' ) + fp = open( path, 'r', encoding = 'U8' ) ret = {} for line in fp: elems = line.split( '#' )[0].split( '|' ) @@ -156,13 +163,18 @@ def charManualTable( path ): def toManyRules( src_table ): tomany = set() - for ( f, t ) in src_table.iteritems(): - for i in range( 1, len( t ) ): - tomany.add( t[i] ) + if pyversion[:1] in ['2']: + for ( f, t ) in src_table.iteritems(): + for i in range( 1, len( t ) ): + tomany.add( t[i] ) + else: + for ( f, t ) in src_table.items(): + for i in range( 1, len( t ) ): + tomany.add( t[i] ) return tomany def removeRules( path, table ): - fp = open( path, 'rb', 'U8' ) + fp = open( path, 'r', encoding = 'U8' ) texc = list() for line in fp: elems = line.split( '=>' ) @@ -179,13 +191,18 @@ def removeRules( path, table ): if t: texc.append( t ) texcptn = re.compile( '^(?:%s)$' % '|'.join( texc ) ) - for (tmp_f, tmp_t) in table.copy().iteritems(): - if texcptn.match( tmp_t ): - table.pop( tmp_f ) + if pyversion[:1] in ['2']: + for (tmp_f, tmp_t) in table.copy().iteritems(): + if texcptn.match( tmp_t ): + table.pop( tmp_f ) + else: + for (tmp_f, tmp_t) in table.copy().items(): + if texcptn.match( tmp_t ): + table.pop( tmp_f ) return table def customRules( path ): - fp = open( path, 'rb', 'U8' ) + fp = open( path, 'r', encoding = 'U8' ) ret = dict() for line in fp: elems = line.split( '#' )[0].split() @@ -210,7 +227,7 @@ def translate( text, conv_table ): return text def manualWordsTable( path, conv_table, reconv_table ): - fp = open( path, 'rb', 'U8' ) + fp = open( path, 'r', encoding = 'U8' ) reconv_table = {} wordlist = [line.split( '#' )[0].strip() for line in fp] wordlist = list( set( wordlist ) ) @@ -285,8 +302,12 @@ def main(): t2s_1tomany.update( charManualTable( 'trad2simp.manual' ) ) s2t_1tomany.update( charManualTable( 'simp2trad.manual' ) ) - t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.iteritems()] ) - s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.iteritems()] ) + if pyversion[:1] in ['2']: + t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.iteritems()] ) + s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.iteritems()] ) + else: + t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.items()] ) + s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.items()] ) s_tomany = toManyRules( t2s_1tomany ) t_tomany = toManyRules( s2t_1tomany ) @@ -333,10 +354,16 @@ def main(): # Final tables # sorted list toHans - t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.iteritems() if f != t] ) + if pyversion[:1] in ['2']: + t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.iteritems() if f != t] ) + else: + t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.items() if f != t] ) toHans = dictToSortedList( t2s_1to1, 0 ) + dictToSortedList( t2s_word2word, 1 ) # sorted list toHant - s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.iteritems() if f != t] ) + if pyversion[:1] in ['2']: + s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.iteritems() if f != t] ) + else: + s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.items() if f != t] ) toHant = dictToSortedList( s2t_1to1, 0 ) + dictToSortedList( s2t_word2word, 1 ) # sorted list toCN toCN = dictToSortedList( customRules( 'toCN.manual' ), 1 ) @@ -352,7 +379,7 @@ def main(): /** * Simplified / Traditional Chinese conversion tables * - * Automatically generated using code and data in includes/zhtable/ + * Automatically generated using code and data in maintenance/language/zhtable/ * Do not modify directly! * * @file @@ -372,7 +399,10 @@ $zh2Hant = array(\n''' + PHPArray( toSG ) \ + '\n);\n' - f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'wb', encoding = 'utf8' ) + if pyversion[:1] in ['2']: + f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'wb', encoding = 'utf8' ) + else: + f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'w', buffering = 4096, encoding = 'utf8' ) print ('Writing ZhConversion.php ... ') f.write( php ) f.close() diff --git a/maintenance/language/zhtable/trad2simp_supp_unset.manual b/maintenance/language/zhtable/trad2simp_supp_unset.manual deleted file mode 100644 index e69de29b..00000000 --- a/maintenance/language/zhtable/trad2simp_supp_unset.manual +++ /dev/null diff --git a/maintenance/language/zhtable/tradphrases.manual b/maintenance/language/zhtable/tradphrases.manual index e20ca05b..69b2c832 100644 --- a/maintenance/language/zhtable/tradphrases.manual +++ b/maintenance/language/zhtable/tradphrases.manual @@ -3991,6 +3991,7 @@ 學裡 獄裡 館裡 +箱裡 系列裡 村子裡 艷后 |