Merge "ContentHandlerTest: Use dataProvider"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 22 Mar 2013 19:32:17 +0000 (19:32 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 22 Mar 2013 19:32:17 +0000 (19:32 +0000)
133 files changed:
RELEASE-NOTES-1.21
includes/AutoLoader.php
includes/GlobalFunctions.php
includes/PoolCounter.php
includes/Title.php
includes/api/ApiFormatWddx.php
includes/api/ApiPageSet.php
includes/api/ApiSetNotificationTimestamp.php
includes/db/LoadBalancer.php
includes/installer/DatabaseInstaller.php
includes/installer/Installer.i18n.php
includes/installer/Installer.php
includes/installer/MysqlInstaller.php
includes/installer/WebInstallerPage.php
includes/job/Job.php
includes/job/JobQueue.php
includes/job/JobQueueRedis.php
includes/parser/Parser.php
languages/messages/MessagesArc.php
languages/messages/MessagesAst.php
languages/messages/MessagesBg.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCy.php
languages/messages/MessagesDiq.php
languages/messages/MessagesFrr.php
languages/messages/MessagesHr.php
languages/messages/MessagesJa.php
languages/messages/MessagesKm.php
languages/messages/MessagesKo.php
languages/messages/MessagesLb.php
languages/messages/MessagesLv.php
languages/messages/MessagesNah.php
languages/messages/MessagesOr.php
languages/messages/MessagesPl.php
languages/messages/MessagesPt.php
languages/messages/MessagesRu.php
languages/messages/MessagesSv.php
languages/messages/MessagesTh.php
languages/messages/MessagesVi.php
languages/messages/MessagesYi.php
maintenance/dictionary/mediawiki.dic [new file with mode: 0644]
tests/parser/parserTests.txt
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/SeleniumConfigurationTest.php
tests/phpunit/includes/StringUtilsTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/installer/InstallDocFormatterTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/json/ServicesJsonTest.php
tests/phpunit/includes/libs/CSSJanusTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/media/BitmapScalingTest.php
tests/phpunit/includes/media/ExifRotationTest.php
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php
tests/phpunit/includes/site/SiteTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/languages/LanguageAmTest.php
tests/phpunit/languages/LanguageArTest.php
tests/phpunit/languages/LanguageBeTest.php
tests/phpunit/languages/LanguageBe_taraskTest.php
tests/phpunit/languages/LanguageBhoTest.php
tests/phpunit/languages/LanguageBsTest.php
tests/phpunit/languages/LanguageCsTest.php
tests/phpunit/languages/LanguageCuTest.php
tests/phpunit/languages/LanguageCyTest.php
tests/phpunit/languages/LanguageDsbTest.php
tests/phpunit/languages/LanguageFrTest.php
tests/phpunit/languages/LanguageGaTest.php
tests/phpunit/languages/LanguageGdTest.php
tests/phpunit/languages/LanguageGvTest.php
tests/phpunit/languages/LanguageHeTest.php
tests/phpunit/languages/LanguageHiTest.php
tests/phpunit/languages/LanguageHrTest.php
tests/phpunit/languages/LanguageHsbTest.php
tests/phpunit/languages/LanguageHuTest.php
tests/phpunit/languages/LanguageHyTest.php
tests/phpunit/languages/LanguageKshTest.php
tests/phpunit/languages/LanguageLnTest.php
tests/phpunit/languages/LanguageLtTest.php
tests/phpunit/languages/LanguageLvTest.php
tests/phpunit/languages/LanguageMgTest.php
tests/phpunit/languages/LanguageMkTest.php
tests/phpunit/languages/LanguageMlTest.php
tests/phpunit/languages/LanguageMoTest.php
tests/phpunit/languages/LanguageMtTest.php
tests/phpunit/languages/LanguageNsoTest.php
tests/phpunit/languages/LanguagePlTest.php
tests/phpunit/languages/LanguageRoTest.php
tests/phpunit/languages/LanguageRuTest.php
tests/phpunit/languages/LanguageSeTest.php
tests/phpunit/languages/LanguageSgsTest.php
tests/phpunit/languages/LanguageShTest.php
tests/phpunit/languages/LanguageSkTest.php
tests/phpunit/languages/LanguageSlTest.php
tests/phpunit/languages/LanguageSmaTest.php
tests/phpunit/languages/LanguageSrTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/LanguageTiTest.php
tests/phpunit/languages/LanguageTlTest.php
tests/phpunit/languages/LanguageTrTest.php
tests/phpunit/languages/LanguageUkTest.php
tests/phpunit/languages/LanguageWaTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/skins/SideBarTest.php

index 295eb7b..c77ff83 100644 (file)
@@ -115,11 +115,16 @@ production.
   uz, vi.
 * Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
 * Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
+* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
 * (bug 33186) Add image rotation api "imagerotate"
 * (bug 34040) Add "User rights management" link on user page toolbox.
 * (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
   structual equality of HTML (ignoring insignificant differences like
   quotmarks, order and whitespace in the attribute list).
+* (bug 23393) HTML <hN> headings containing line breaks are now handled
+  correctly.
+* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
+  is now non-significant and not preserved in the HTML output.
 
 === Bug fixes in 1.21 ===
 * (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
@@ -205,6 +210,8 @@ production.
 * (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
 * (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
 * (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
+* WDDX formatted output will actually be formatted (and normal output will no
+  longer be), and will no longer choke on booleans.
 
 === API changes in 1.21 ===
 * prop=revisions can now report the contentmodel and contentformat.
index 7136232..42cea7a 100644 (file)
@@ -194,6 +194,7 @@ $wgAutoloadLocalClasses = array(
        'PoolCounter' => 'includes/PoolCounter.php',
        'PoolCounter_Stub' => 'includes/PoolCounter.php',
        'PoolCounterWork' => 'includes/PoolCounter.php',
+       'PoolCounterWorkViaCallback' => 'includes/PoolCounter.php',
        'PoolWorkArticleView' => 'includes/WikiPage.php',
        'Preferences' => 'includes/Preferences.php',
        'PreferencesForm' => 'includes/Preferences.php',
index 016736f..e1e1234 100644 (file)
@@ -3655,7 +3655,7 @@ function wfWaitForSlaves( $maxLag = false, $wiki = false ) {
        // bug 27975 - Don't try to wait for slaves if there are none
        // Prevents permission error when getting master position
        if ( $lb->getServerCount() > 1 ) {
-               $dbw = $lb->getConnection( DB_MASTER );
+               $dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
                $pos = $dbw->getMasterPos();
                $lb->waitForAll( $pos );
        }
index c6a3077..38c6f04 100644 (file)
@@ -135,7 +135,7 @@ class PoolCounter_Stub extends PoolCounter {
 }
 
 /**
- * Handy class for dealing with PoolCounters using class members instead of callbacks.
+ * Class for dealing with PoolCounters using class members
  */
 abstract class PoolCounterWork {
        protected $cacheable = false; //Does this override getCachedWork() ?
@@ -247,3 +247,73 @@ abstract class PoolCounterWork {
                }
        }
 }
+
+/**
+ * Convenience class for dealing with PoolCounters using callbacks
+ * @since 1.22
+ */
+class PoolCounterWorkViaCallback extends PoolCounterWork {
+       /** @var callable */
+       protected $doWork;
+       /** @var callable|null */
+       protected $doCachedWork;
+       /** @var callable|null */
+       protected $fallback;
+       /** @var callable|null */
+       protected $error;
+
+       /**
+        * Build a PoolCounterWork class from a type, key, and callback map.
+        *
+        * The callback map must at least have a callback for the 'doWork' method.
+        * Additionally, callbacks can be provided for the 'doCachedWork', 'fallback',
+        * and 'error' methods. Methods without callbacks will be no-ops that return false.
+        * If a 'doCachedWork' callback is provided, then execute() may wait for any prior
+        * process in the pool to finish and reuse its cached result.
+        *
+        * @param string $type
+        * @param string $key
+        * @param array $callbacks Map of callbacks
+        * @throws MWException
+        */
+       public function __construct( $type, $key, array $callbacks ) {
+               parent::__construct( $type, $key );
+               foreach ( array( 'doWork', 'doCachedWork', 'fallback', 'error' ) as $name ) {
+                       if ( isset( $callbacks[$name] ) ) {
+                               if ( !is_callable( $callbacks[$name] ) ) {
+                                       throw new MWException( "Invalid callback provided for '$name' function." );
+                               }
+                               $this->$name = $callbacks[$name];
+                       }
+               }
+               if ( !isset( $this->doWork ) ) {
+                       throw new MWException( "No callback provided for 'doWork' function." );
+               }
+               $this->cacheable = isset( $this->doCachedWork );
+       }
+
+       public function doWork() {
+               return call_user_func_array( $this->doWork, array() );
+       }
+
+       public function getCachedWork() {
+               if ( $this->doCachedWork ) {
+                       return call_user_func_array( $this->doCachedWork, array() );
+               }
+               return false;
+       }
+
+       function fallback() {
+               if ( $this->fallback ) {
+                       return call_user_func_array( $this->fallback, array() );
+               }
+               return false;
+       }
+
+       function error( $status ) {
+               if ( $this->error ) {
+                       return call_user_func_array( $this->error, array( $status ) );
+               }
+               return false;
+       }
+}
index e81023a..bfbb06f 100644 (file)
@@ -3838,6 +3838,7 @@ class Title {
 
                $this->resetArticleID( 0 );
                $nt->resetArticleID( $oldid );
+               $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
 
                $newpage->updateRevisionOn( $dbw, $nullRevision );
 
@@ -3855,6 +3856,7 @@ class Title {
                        WikiPage::onArticleDelete( $this );
                } else {
                        $redirectArticle = WikiPage::factory( $this );
+                       $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
                        $newid = $redirectArticle->insertOn( $dbw );
                        if ( $newid ) { // sanity
                                $redirectRevision = new Revision( array(
index 884a1dc..5685d93 100644 (file)
@@ -46,7 +46,7 @@ class ApiFormatWddx extends ApiFormatBase {
                } else {
                        // Don't do newlines and indentation if we weren't asked
                        // for pretty output
-                       $nl = ( $this->getIsHtml() ? '' : "\n" );
+                       $nl = ( $this->getIsHtml() ? "\n" : '' );
                        $indstr = ' ';
                        $this->printText( "<?xml version=\"1.0\"?>$nl" );
                        $this->printText( "<wddxPacket version=\"1.0\">$nl" );
@@ -64,9 +64,9 @@ class ApiFormatWddx extends ApiFormatBase {
         * @param $indent int
         */
        function slowWddxPrinter( $elemValue, $indent = 0 ) {
-               $indstr = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent ) );
-               $indstr2 = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent + 2 ) );
-               $nl = ( $this->getIsHtml() ? '' : "\n" );
+               $indstr = ( $this->getIsHtml() ? str_repeat( ' ', $indent ) : '' );
+               $indstr2 = ( $this->getIsHtml() ? str_repeat( ' ', $indent + 2 ) : '' );
+               $nl = ( $this->getIsHtml() ? "\n" : '' );
                if ( is_array( $elemValue ) ) {
                        // Check whether we've got an associative array (<struct>)
                        // or a regular array (<array>)
@@ -95,6 +95,10 @@ class ApiFormatWddx extends ApiFormatBase {
                        $this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
                } elseif ( is_string( $elemValue ) ) {
                        $this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
+               } elseif ( is_bool( $elemValue ) ) {
+                       $this->printText( $indstr . Xml::element( 'boolean',
+                               array( 'value' => $elemValue ? 'true' : 'false' ) ) . $nl
+                       );
                } else {
                        ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
                }
index bab59b7..074efe4 100644 (file)
@@ -217,6 +217,30 @@ class ApiPageSet extends ApiBase {
                return $this->mResolveRedirects;
        }
 
+       /**
+        * Return the parameter name that is the source of data for this PageSet
+        *
+        * If multiple source parameters are specified (e.g. titles and pageids),
+        * one will be named arbitrarily.
+        *
+        * @return string|null
+        */
+       public function getDataSource() {
+               if ( $this->mAllowGenerator && isset( $this->mParams['generator'] ) ) {
+                       return 'generator';
+               }
+               if ( isset( $this->mParams['titles'] ) ) {
+                       return 'titles';
+               }
+               if ( isset( $this->mParams['pageids'] ) ) {
+                       return 'pageids';
+               }
+               if ( isset( $this->mParams['revids'] ) ) {
+                       return 'revids';
+               }
+               return null;
+       }
+
        /**
         * Request an additional field from the page table.
         * Must be called before execute()
index b40476a..58d5d9a 100644 (file)
@@ -44,8 +44,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
                $this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
 
                $pageSet = $this->getPageSet();
-               $args = array_merge( array( $params, 'entirewatchlist' ), array_keys( $pageSet->getAllowedParams() ) );
-               call_user_func_array( array( $this, 'requireOnlyOneParameter' ), $args );
+               if ( $params['entirewatchlist'] && $pageSet->getDataSource() !== null ) {
+                       $this->dieUsage( "Cannot use 'entirewatchlist' at the same time as '{$pageSet->getDataSource()}'", 'multisource' );
+               }
 
                $dbw = wfGetDB( DB_MASTER, 'api' );
 
index 1e85927..187870f 100644 (file)
@@ -407,7 +407,7 @@ class LoadBalancer {
                                wfDebug( __METHOD__ . ": no connection open\n" );
                                return false;
                        } else {
-                               $conn = $this->openConnection( $index );
+                               $conn = $this->openConnection( $index, '' );
                                if ( !$conn ) {
                                        wfDebug( __METHOD__ . ": failed to open connection\n" );
                                        return false;
index 3472b7f..8231e7f 100644 (file)
@@ -335,6 +335,8 @@ abstract class DatabaseInstaller {
         * @return String
         */
        public function getReadableName() {
+               // Give grep a chance to find the usages:
+               // config-type-mysql, config-type-postgres, config-type-sqlite, config-type-oracle
                return wfMessage( 'config-type-' . $this->getName() )->text();
        }
 
index 473e727..ee07a13 100644 (file)
@@ -315,7 +315,7 @@ This is '''not recommended''' unless you are having problems with your wiki.",
        'config-upgrade-done-no-regenerate' => "Upgrade complete.
 
 You can now [$1 start using your wiki].",
-       'config-regenerate'               => 'Regenerate <code>LocalSettings.php</code> →',
+       'config-regenerate'               => 'Regenerate LocalSettings.php →',
        'config-show-table-status'        => '<code>SHOW TABLE STATUS</code> query failed!',
        'config-unknown-collation'        => "'''Warning:''' Database is using unrecognized collation.",
        'config-db-web-account'           => 'Database account for web access',
index 4d8e5f0..7ff1ff5 100644 (file)
@@ -643,6 +643,8 @@ abstract class Installer {
 
                $allNames = array();
 
+               // Give grep a chance to find the usages:
+               // config-type-mysql, config-type-postgres, config-type-oracle, config-type-sqlite
                foreach ( self::getDBTypes() as $name ) {
                        $allNames[] = wfMessage( "config-type-$name" )->text();
                }
index f9a8ce7..06821f8 100644 (file)
@@ -361,6 +361,9 @@ class MysqlInstaller extends DatabaseInstaller {
                }
 
                if ( count( $engines ) >= 2 ) {
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-mysql-innodb, config-mysql-myisam
                        $s .= $this->getRadioSet( array(
                                'var' => '_MysqlEngine',
                                'label' => 'config-mysql-engine',
@@ -385,6 +388,9 @@ class MysqlInstaller extends DatabaseInstaller {
 
                // Do charset selector
                if ( count( $charsets ) >= 2 ) {
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-mysql-binary, config-mysql-utf8
                        $s .= $this->getRadioSet( array(
                                'var' => '_MysqlCharset',
                                'label' => 'config-mysql-charset',
index 93092e3..9119c12 100644 (file)
@@ -84,12 +84,14 @@ abstract class WebInstallerPage {
 
                if ( $continue ) {
                        // Fake submit button for enter keypress (bug 26267)
+                       // Give grep a chance to find the usages: config-continue
                        $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
                                array( 'name' => "enter-$continue", 'style' =>
                                        'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
                }
 
                if ( $back ) {
+                       // Give grep a chance to find the usages: config-back
                        $s .= Xml::submitButton( wfMessage( "config-$back" )->text(),
                                array(
                                        'name' => "submit-$back",
@@ -98,6 +100,7 @@ abstract class WebInstallerPage {
                }
 
                if ( $continue ) {
+                       // Give grep a chance to find the usages: config-continue
                        $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
                                array(
                                        'name' => "submit-$continue",
@@ -452,6 +455,8 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                $settings = '';
                $defaultType = $this->getVar( 'wgDBtype' );
 
+               // Give grep a chance to find the usages:
+               // config-support-mysql, config-support-postgres, config-support-oracle, config-support-sqlite
                $dbSupport = '';
                foreach( $this->parent->getDBTypes() as $type ) {
                        $link = DatabaseBase::factory( $type )->getSoftwareLink();
@@ -474,6 +479,8 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                                ) .
                                "</li>\n";
 
+                       // Give grep a chance to find the usages:
+                       // config-header-mysql, config-header-postgres, config-header-oracle, config-header-sqlite
                        $settings .=
                                Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type,
                                                'class' => 'dbWrapper' ) ) .
@@ -647,6 +654,9 @@ class WebInstaller_Name extends WebInstallerPage {
                                'label' => 'config-site-name',
                                'help' => $this->parent->getHelpBox( 'config-site-name-help' )
                        ) ) .
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-ns-site-name, config-ns-generic, config-ns-other
                        $this->parent->getRadioSet( array(
                                'var' => '_NamespaceType',
                                'label' => 'config-project-namespace',
@@ -688,6 +698,9 @@ class WebInstaller_Name extends WebInstallerPage {
                        ) ) .
                        $this->getFieldSetEnd() .
                        $this->parent->getInfoBox( wfMessage( 'config-almost-done' )->text() ) .
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-optional-continue, config-optional-skip
                        $this->parent->getRadioSet( array(
                                'var' => '_SkipOptional',
                                'itemLabelPrefix' => 'config-optional-',
@@ -831,6 +844,9 @@ class WebInstaller_Options extends WebInstallerPage {
                $this->startForm();
                $this->addHTML(
                        # User Rights
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-profile-wiki, config-profile-no-anon, config-profile-fishbowl, config-profile-private
                        $this->parent->getRadioSet( array(
                                'var' => '_RightsProfile',
                                'label' => 'config-profile',
@@ -840,6 +856,11 @@ class WebInstaller_Options extends WebInstallerPage {
                        $this->parent->getInfoBox( wfMessage( 'config-profile-help' )->plain() ) .
 
                        # Licensing
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
+                       // config-license-cc-0, config-license-pd, config-license-gfdl,
+                       // config-license-none, config-license-cc-choose
                        $this->parent->getRadioSet( array(
                                'var' => '_LicenseCode',
                                'label' => 'config-license',
@@ -966,6 +987,9 @@ class WebInstaller_Options extends WebInstallerPage {
                        # Advanced settings
                        $this->getFieldSetStart( 'config-advanced-settings' ) .
                        # Object cache settings
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-cache-none, config-cache-accel, config-cache-memcached
                        $this->parent->getRadioSet( array(
                                'var' => 'wgMainCacheType',
                                'label' => 'config-cache-options',
@@ -1092,6 +1116,10 @@ class WebInstaller_Options extends WebInstallerPage {
                                return false;
                        }
                } elseif ( in_array( $code, array_keys( $this->parent->licenses ) ) ) {
+                       // Give grep a chance to find the usages:
+                       // config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
+                       // config-license-cc-0, config-license-pd, config-license-gfdl,
+                       // config-license-none, config-license-cc-choose
                        $entry = $this->parent->licenses[$code];
                        if ( isset( $entry['text'] ) ) {
                                $this->setVar( 'wgRightsText', $entry['text'] );
index bcf582e..d8f55c3 100644 (file)
@@ -176,6 +176,16 @@ abstract class Job {
                return $this->params;
        }
 
+       /**
+        * @return integer|null UNIX timestamp to delay running this job until, otherwise null
+        * @since 1.22
+        */
+       public function getReleaseTimestamp() {
+               return isset( $this->params['jobReleaseTimestamp'] )
+                       ? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
+                       : null;
+       }
+
        /**
         * @return bool Whether only one of each identical set of jobs should be run
         */
index 5ef52b5..9c152cd 100644 (file)
@@ -34,6 +34,7 @@ abstract class JobQueue {
        protected $order; // string; job priority for pop()
        protected $claimTTL; // integer; seconds
        protected $maxTries; // integer; maximum number of times to try a job
+       protected $checkDelay; // boolean; allow delayed jobs
 
        const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
 
@@ -55,28 +56,36 @@ abstract class JobQueue {
                if ( !in_array( $this->order, $this->supportedOrders() ) ) {
                        throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
                }
+               $this->checkDelay = !empty( $params['checkDelay'] );
+               if ( $this->checkDelay && !$this->supportsDelayedJobs() ) {
+                       throw new MWException( __CLASS__ . " does not support delayed jobs." );
+               }
        }
 
        /**
         * Get a job queue object of the specified type.
         * $params includes:
-        *   - class    : What job class to use (determines job type)
-        *   - wiki     : wiki ID of the wiki the jobs are for (defaults to current wiki)
-        *   - type     : The name of the job types this queue handles
-        *   - order    : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
-        *                If "fifo" is used, the queue will effectively be FIFO. Note that
-        *                job completion will not appear to be exactly FIFO if there are multiple
-        *                job runners since jobs can take different times to finish once popped.
-        *                If "timestamp" is used, the queue will at least be loosely ordered
-        *                by timestamp, allowing for some jobs to be popped off out of order.
-        *                If "random" is used, pop() will pick jobs in random order.
-        *                Note that it may only be weakly random (e.g. a lottery of the oldest X).
-        *                If "any" is choosen, the queue will use whatever order is the fastest.
-        *                This might be useful for improving concurrency for job acquisition.
-        *   - claimTTL : If supported, the queue will recycle jobs that have been popped
-        *                but not acknowledged as completed after this many seconds. Recycling
-        *                of jobs simple means re-inserting them into the queue. Jobs can be
-        *                attempted up to three times before being discarded.
+        *   - class      : What job class to use (determines job type)
+        *   - wiki       : wiki ID of the wiki the jobs are for (defaults to current wiki)
+        *   - type       : The name of the job types this queue handles
+        *   - order      : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
+        *                  If "fifo" is used, the queue will effectively be FIFO. Note that job
+        *                  completion will not appear to be exactly FIFO if there are multiple
+        *                  job runners since jobs can take different times to finish once popped.
+        *                  If "timestamp" is used, the queue will at least be loosely ordered
+        *                  by timestamp, allowing for some jobs to be popped off out of order.
+        *                  If "random" is used, pop() will pick jobs in random order.
+        *                  Note that it may only be weakly random (e.g. a lottery of the oldest X).
+        *                  If "any" is choosen, the queue will use whatever order is the fastest.
+        *                  This might be useful for improving concurrency for job acquisition.
+        *   - claimTTL   : If supported, the queue will recycle jobs that have been popped
+        *                  but not acknowledged as completed after this many seconds. Recycling
+        *                  of jobs simple means re-inserting them into the queue. Jobs can be
+        *                  attempted up to three times before being discarded.
+        *   - checkDelay : If supported, respect Job::getReleaseTimestamp() in the push functions.
+        *                  This lets delayed jobs wait in a staging area until a given timestamp is
+        *                  reached, at which point they will enter the queue. If this is not enabled
+        *                  or not supported, an exception will be thrown on delayed job insertion.
         *
         * Queue classes should throw an exception if they do not support the options given.
         *
@@ -128,7 +137,14 @@ abstract class JobQueue {
        abstract protected function optimalOrder();
 
        /**
-        * Quickly check if the queue is empty (has no available jobs).
+        * @return boolean Whether delayed jobs are supported
+        */
+       protected function supportsDelayedJobs() {
+               return false; // not implemented
+       }
+
+       /**
+        * Quickly check if the queue has no available (unacquired, non-delayed) jobs.
         * Queue classes should use caching if they are any slower without memcached.
         *
         * If caching is used, this might return false when there are actually no jobs.
@@ -153,7 +169,7 @@ abstract class JobQueue {
        abstract protected function doIsEmpty();
 
        /**
-        * Get the number of available (unacquired) jobs in the queue.
+        * Get the number of available (unacquired, non-delayed) jobs in the queue.
         * Queue classes should use caching if they are any slower without memcached.
         *
         * If caching is used, this number might be out of date for a minute.
@@ -196,6 +212,31 @@ abstract class JobQueue {
         */
        abstract protected function doGetAcquiredCount();
 
+       /**
+        * Get the number of delayed jobs (these are temporarily out of the queue).
+        * Queue classes should use caching if they are any slower without memcached.
+        *
+        * If caching is used, this number might be out of date for a minute.
+        *
+        * @return integer
+        * @throws MWException
+        * @since 1.22
+        */
+       final public function getDelayedCount() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doGetDelayedCount();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueue::getDelayedCount()
+        * @return integer
+        */
+       protected function doGetDelayedCount() {
+               return 0; // not implemented
+       }
+
        /**
         * Push a single jobs into the queue.
         * This does not require $wgJobClasses to be set for the given job type.
@@ -227,7 +268,11 @@ abstract class JobQueue {
 
                foreach ( $jobs as $job ) {
                        if ( $job->getType() !== $this->type ) {
-                               throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+                               throw new MWException(
+                                       "Got '{$job->getType()}' job; expected a '{$this->type}' job." );
+                       } elseif ( $job->getReleaseTimestamp() && !$this->checkDelay ) {
+                               throw new MWException(
+                                       "Got delayed '{$job->getType()}' job; delays are not supported." );
                        }
                }
 
@@ -493,15 +538,27 @@ abstract class JobQueue {
        protected function doFlushCaches() {}
 
        /**
-        * Get an iterator to traverse over all of the jobs in this queue.
-        * This does not include jobs that are current acquired. In general,
-        * this should only be called on a queue that is no longer being popped.
+        * Get an iterator to traverse over all available jobs in this queue.
+        * This does not include jobs that are currently acquired or delayed.
+        * This should only be called on a queue that is no longer being popped.
         *
         * @return Iterator|Traversable|Array
         * @throws MWException
         */
        abstract public function getAllQueuedJobs();
 
+       /**
+        * Get an iterator to traverse over all delayed jobs in this queue.
+        * This should only be called on a queue that is no longer being popped.
+        *
+        * @return Iterator|Traversable|Array
+        * @throws MWException
+        * @since 1.22
+        */
+       public function getAllDelayedJobs() {
+               return array(); // not implemented
+       }
+
        /**
         * Namespace the queue with a key to isolate it for testing
         *
index 338dc79..bd23174 100644 (file)
  * This is faster, less resource intensive, queue that JobQueueDB.
  * All data for a queue using this class is placed into one redis server.
  *
- * There are seven main redis keys used to track jobs:
- *   - l-unclaimed  : A list of job IDs used for push/pop
+ * There are eight main redis keys used to track jobs:
+ *   - l-unclaimed  : A list of job IDs used for ready unclaimed jobs
  *   - z-claimed    : A sorted set of (job ID, UNIX timestamp as score) used for job retries
  *   - z-abandoned  : A sorted set of (job ID, UNIX timestamp as score) used for broken jobs
+ *   - z-delayed    : A sorted set of (job ID, UNIX timestamp as score) used for delayed jobs
  *   - h-idBySha1   : A hash of (SHA1 => job ID) for unclaimed jobs used for de-duplication
  *   - h-sha1Byid   : A hash of (job ID => SHA1) for unclaimed jobs used for de-duplication
  *   - h-attempts   : A hash of (job ID => attempt count) used for job claiming/retries
  *   - h-data       : A hash of (job ID => serialized blobs) for job storage
- * Any given job ID can be in only one of l-unclaimed, z-claimed, and z-abandoned.
+ * A job ID can be in only one of z-delayed, l-unclaimed, z-claimed, and z-abandoned.
  * If an ID appears in any of those lists, it should have a h-data entry for its ID.
- * If a job has a non-empty SHA1 de-duplication value and its ID is in l-unclaimed,
- * then there should be no other such jobs. Every h-idBySha1 entry has an h-sha1Byid
+ * If a job has a SHA1 de-duplication value and its ID is in l-unclaimed or z-delayed, then
+ * there should be no other such jobs with that SHA1. Every h-idBySha1 entry has an h-sha1Byid
  * entry and every h-sha1Byid must refer to an ID that is l-unclaimed. If a job has its
  * ID in z-claimed or z-abandoned, then it must also have an h-attempts entry for its ID.
  *
- * Additionally, "rootjob:* keys to track "root jobs" used for additional de-duplication.
+ * Additionally, "rootjob:* keys track "root jobs" used for additional de-duplication.
  * Aside from root job keys, all keys have no expiry, and are only removed when jobs are run.
  * All the keys are prefixed with the relevant wiki ID information.
  *
@@ -89,6 +90,10 @@ class JobQueueRedis extends JobQueue {
                return 'fifo';
        }
 
+       protected function supportsDelayedJobs() {
+               return true;
+       }
+
        /**
         * @see JobQueue::doIsEmpty()
         * @return bool
@@ -132,6 +137,23 @@ class JobQueueRedis extends JobQueue {
                }
        }
 
+       /**
+        * @see JobQueue::doGetDelayedCount()
+        * @return integer
+        * @throws MWException
+        */
+       protected function doGetDelayedCount() {
+               if ( !$this->checkDelay ) {
+                       return 0; // no delayed jobs
+               }
+               $conn = $this->getConnection();
+               try {
+                       return $conn->zSize( $this->getQueueKey( 'z-delayed' ) );
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $this->server, $conn, $e );
+               }
+       }
+
        /**
         * @see JobQueue::doBatchPush()
         * @param array $jobs
@@ -150,13 +172,8 @@ class JobQueueRedis extends JobQueue {
                                $items[$item['uuid']] = $item;
                        }
                }
-               // Convert the field maps into serialized blobs
-               $tuples = array();
-               foreach ( $items as $item ) {
-                       $tuples[] = array( $item['uuid'], $item['sha1'], serialize( $item ) );
-               }
 
-               if ( !count( $tuples ) ) {
+               if ( !count( $items ) ) {
                        return true; // nothing to do
                }
 
@@ -164,26 +181,26 @@ class JobQueueRedis extends JobQueue {
                try {
                        // Actually push the non-duplicate jobs into the queue...
                        if ( $flags & self::QoS_Atomic ) {
-                               $batches = array( $tuples ); // all or nothing
+                               $batches = array( $items ); // all or nothing
                        } else {
-                               $batches = array_chunk( $tuples, 500 ); // avoid tying up the server
+                               $batches = array_chunk( $items, 500 ); // avoid tying up the server
                        }
                        $failed = 0;
                        $pushed = 0;
-                       foreach ( $batches as $tupleBatch ) {
-                               $added = $this->pushBlobs( $conn, $tupleBatch );
+                       foreach ( $batches as $itemBatch ) {
+                               $added = $this->pushBlobs( $conn, $itemBatch );
                                if ( is_int( $added ) ) {
                                        $pushed += $added;
                                } else {
-                                       $failed += count( $tupleBatch );
+                                       $failed += count( $itemBatch );
                                }
                        }
                        if ( $failed > 0 ) {
                                wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
                                return false;
                        }
-                       wfIncrStats( 'job-insert', count( $tuples ) );
-                       wfIncrStats( 'job-insert-duplicate', count( $tuples ) - $failed - $pushed );
+                       wfIncrStats( 'job-insert', count( $items ) );
+                       wfIncrStats( 'job-insert-duplicate', count( $items ) - $failed - $pushed );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -193,30 +210,37 @@ class JobQueueRedis extends JobQueue {
 
        /**
         * @param RedisConnRef $conn
-        * @param array $tuples List of tuples of (job ID, job SHA1 or '', serialized blob)
+        * @param array $items List of results from JobQueueRedis::getNewJobFields()
         * @return integer Number of jobs inserted (duplicates are ignored)
         * @throws RedisException
         */
-       protected function pushBlobs( RedisConnRef $conn, array $tuples ) {
+       protected function pushBlobs( RedisConnRef $conn, array $items ) {
                $args = array(); // ([id, sha1, blob [, id, sha1, blob ... ] ] )
-               foreach ( $tuples as $tuple ) {
-                       $args[] = $tuple[0]; // id
-                       $args[] = $tuple[1]; // sha1
-                       $args[] = $tuple[2]; // blob
+               foreach ( $items as $item ) {
+                       $args[] = (string)$item['uuid'];
+                       $args[] = (string)$item['sha1'];
+                       $args[] = (string)$item['rtimestamp'];
+                       $args[] = (string)serialize( $item );
                }
                static $script =
 <<<LUA
-               if #ARGV % 3 ~= 0 then return redis.error_reply('Unmatched arguments') end
+               if #ARGV % 4 ~= 0 then return redis.error_reply('Unmatched arguments') end
                local pushed = 0
-               for i = 1,#ARGV,3 do
-                       local id,sha1,blob = ARGV[i],ARGV[i+1],ARGV[i+2]
+               for i = 1,#ARGV,4 do
+                       local id,sha1,rtimestamp,blob = ARGV[i],ARGV[i+1],ARGV[i+2],ARGV[i+3]
                        if sha1 == '' or redis.call('hExists',KEYS[3],sha1) == 0 then
-                               redis.call('lPush',KEYS[1],id)
+                               if 1*rtimestamp > 0 then
+                                       -- Insert into delayed queue (release time as score)
+                                       redis.call('zAdd',KEYS[4],rtimestamp,id)
+                               else
+                                       -- Insert into unclaimed queue
+                                       redis.call('lPush',KEYS[1],id)
+                               end
                                if sha1 ~= '' then
                                        redis.call('hSet',KEYS[2],id,sha1)
                                        redis.call('hSet',KEYS[3],sha1,id)
                                end
-                               redis.call('hSet',KEYS[4],id,blob)
+                               redis.call('hSet',KEYS[5],id,blob)
                                pushed = pushed + 1
                        end
                end
@@ -228,11 +252,12 @@ LUA;
                                        $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
                                        $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
                                        $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
-                                       $this->getQueueKey( 'h-data' ), # KEYS[4]
+                                       $this->getQueueKey( 'z-delayed' ), # KEYS[4]
+                                       $this->getQueueKey( 'h-data' ), # KEYS[5]
                                ),
                                $args
                        ),
-                       4 # number of first argument(s) that are keys
+                       5 # number of first argument(s) that are keys
                );
        }
 
@@ -244,6 +269,12 @@ LUA;
        protected function doPop() {
                $job = false;
 
+               // Push ready delayed jobs into the queue every 10 jobs to spread the load.
+               // This is also done as a periodic task, but we don't want too much done at once.
+               if ( $this->checkDelay && mt_rand( 0, 9 ) == 0 ) {
+                       $this->releaseReadyDelayedJobs();
+               }
+
                $conn = $this->getConnection();
                try {
                        do {
@@ -463,7 +494,29 @@ LUA;
        }
 
        /**
-        * This function should not be called outside RedisJobQueue
+        * @see JobQueue::getAllQueuedJobs()
+        * @return Iterator
+        */
+       public function getAllDelayedJobs() {
+               $conn = $this->getConnection();
+               if ( !$conn ) {
+                       throw new MWException( "Unable to connect to redis server." );
+               }
+               try {
+                       $that = $this;
+                       return new MappedIterator( // delayed jobs
+                               $conn->zRange( $this->getQueueKey( 'z-delayed' ), 0, -1 ),
+                               function( $uid ) use ( $that, $conn ) {
+                                       return $that->getJobFromUidInternal( $uid, $conn );
+                               }
+                       );
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $this->server, $conn, $e );
+               }
+       }
+
+       /**
+        * This function should not be called outside JobQueueRedis
         *
         * @param $uid string
         * @param $conn RedisConnRef
@@ -485,6 +538,43 @@ LUA;
                }
        }
 
+       /**
+        * Release any ready delayed jobs into the queue
+        *
+        * @return integer Number of jobs released
+        * @throws MWException
+        */
+       public function releaseReadyDelayedJobs() {
+               $count = 0;
+
+               $conn = $this->getConnection();
+               try {
+                       static $script =
+<<<LUA
+                       -- Get the list of ready delayed jobs, sorted by readiness
+                       local ids = redis.call('zRangeByScore',KEYS[1],0,ARGV[1])
+                       -- Migrate the jobs from the "delayed" set to the "unclaimed" list
+                       for k,id in ipairs(ids) do
+                               redis.call('lPush',KEYS[2],id)
+                               redis.call('zRem',KEYS[1],id)
+                       end
+                       return #ids
+LUA;
+                       $count += (int)$this->redisEval( $conn, $script,
+                               array(
+                                       $this->getQueueKey( 'z-delayed' ), // KEYS[1]
+                                       $this->getQueueKey( 'l-unclaimed' ), // KEYS[2]
+                                       time() // ARGV[1]; max "delay until" UNIX timestamp
+                               ),
+                               2 # first two arguments are keys
+                       );
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $this->server, $conn, $e );
+               }
+
+               return $count;
+       }
+
        /**
         * Recycle or destroy any jobs that have been claimed for too long
         *
@@ -564,16 +654,20 @@ LUA;
         * @return Array
         */
        protected function doGetPeriodicTasks() {
+               $tasks = array();
                if ( $this->claimTTL > 0 ) {
-                       return array(
-                               'recycleAndDeleteStaleJobs' => array(
-                                       'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
-                                       'period'   => ceil( $this->claimTTL / 2 )
-                               )
+                       $tasks['recycleAndDeleteStaleJobs'] = array(
+                               'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
+                               'period'   => ceil( $this->claimTTL / 2 )
                        );
-               } else {
-                       return array();
                }
+               if ( $this->checkDelay ) {
+                       $tasks['releaseReadyDelayedJobs'] = array(
+                               'callback' => array( $this, 'releaseReadyDelayedJobs' ),
+                               'period'   => 300 // 5 minutes
+                       );
+               }
+               return $tasks;
        }
 
        /**
@@ -584,11 +678,22 @@ LUA;
         * @return mixed
         */
        protected function redisEval( RedisConnRef $conn, $script, array $params, $numKeys ) {
-               $res = $conn->evalSha( sha1( $script ), $params, $numKeys );
-               if ( $res === false && $conn->getLastError() != '' ) { // not in script cache?
-                       wfDebugLog( 'JobQueueRedis', "Lua script error: " . $conn->getLastError() );
+               $sha1 = sha1( $script ); // 40 char hex
+
+               // Try to run the server-side cached copy of the script
+               $conn->clearLastError();
+               $res = $conn->evalSha( $sha1, $params, $numKeys );
+               // If the script is not in cache, use eval() to retry and cache it
+               if ( $conn->getLastError() && $conn->script( 'exists', $sha1 ) === array( 0 ) ) {
+                       $conn->clearLastError();
                        $res = $conn->eval( $script, $params, $numKeys );
+                       wfDebugLog( 'JobQueueRedis', "Used eval() for Lua script $sha1." );
                }
+
+               if ( $conn->getLastError() ) { // script bug?
+                       wfDebugLog( 'JobQueueRedis', "Lua script error: " . $conn->getLastError() );
+               }
+
                return $res;
        }
 
@@ -599,16 +704,18 @@ LUA;
        protected function getNewJobFields( Job $job ) {
                return array(
                        // Fields that describe the nature of the job
-                       'type'      => $job->getType(),
-                       'namespace' => $job->getTitle()->getNamespace(),
-                       'title'     => $job->getTitle()->getDBkey(),
-                       'params'    => $job->getParams(),
+                       'type'       => $job->getType(),
+                       'namespace'  => $job->getTitle()->getNamespace(),
+                       'title'      => $job->getTitle()->getDBkey(),
+                       'params'     => $job->getParams(),
+                       // Some jobs cannot run until a "release timestamp"
+                       'rtimestamp' => $job->getReleaseTimestamp() ?: 0,
                        // Additional job metadata
-                       'uuid'      => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
-                       'sha1'      => $job->ignoreDuplicates()
+                       'uuid'       => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
+                       'sha1'       => $job->ignoreDuplicates()
                                ? wfBaseConvert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
                                : '',
-                       'timestamp' => time() // UNIX timestamp
+                       'timestamp'  => time() // UNIX timestamp
                );
        }
 
index dea0764..8209f8a 100644 (file)
@@ -4108,7 +4108,7 @@ class Parser {
                # Get all headlines for numbering them and adding funky stuff like [edit]
                # links - this is for later, but we need the number of headlines right now
                $matches = array();
-               $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?'.'>)(?P<header>.*?)<\/H[1-6] *>/i', $text, $matches );
+               $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?'.'>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i', $text, $matches );
 
                # if there are fewer than 4 headlines in the article, do not show TOC
                # unless it's been explicitly enabled.
@@ -4170,7 +4170,7 @@ class Parser {
                                $serial = $markerMatches[1];
                                list( $titleText, $sectionIndex ) = $this->mHeadings[$serial];
                                $isTemplate = ( $titleText != $baseTitleText );
-                               $headline = preg_replace( "/^$markerRegex/", "", $headline );
+                               $headline = preg_replace( "/^$markerRegex\\s*/", "", $headline );
                        }
 
                        if ( $toclevel ) {
@@ -4416,7 +4416,7 @@ class Parser {
                }
 
                # split up and insert constructed headlines
-               $blocks = preg_split( '/<H[1-6].*?' . '>.*?<\/H[1-6]>/i', $text );
+               $blocks = preg_split( '/<H[1-6].*?' . '>[\s\S]*?<\/H[1-6]>/i', $text );
                $i = 0;
 
                // build an array of document sections
index 03416b1..987385e 100644 (file)
@@ -287,7 +287,7 @@ $messages = array(
 'edit' => 'ܫܚܠܦ',
 'create' => 'ܒܪܝ',
 'editthispage' => 'ܫܚܠܦ ܦܐܬܐ ܗܕܐ',
-'create-this-page' => 'Ü\92ܪÜ\9d ܦܐܬܐ ܗܕܐ',
+'create-this-page' => 'Ü£Ü\9dÜ¡ ܦܐܬܐ ܗܕܐ',
 'delete' => 'ܫܘܦ',
 'deletethispage' => 'ܫܘܦ ܦܐܬܐ ܗܕܐ',
 'undelete_short' => 'ܠܐ ܫܘܦ {{PLURAL:$1|ܚܕ ܫܘܚܠܦܐ|$1 ܫܘܚܠܦ̈ܐ}}',
@@ -666,7 +666,7 @@ $1',
 'viewprevnext' => 'ܚܘܝ ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'ܓܒܝܬ̈ܐ ܕܒܨܝܐ',
 'searchmenu-exists' => "'''ܐܝܬ ܦܐܬܐ ܒܫܡ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ'''",
-'searchmenu-new' => "'''Ü\92ܪÜ\9d ܦܐܬܐ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
+'searchmenu-new' => "'''Ü£Ü\9dÜ¡ ܦܐܬܐ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
 'searchhelp-url' => 'Help:ܚܒܝܫܬ̈ܐ',
 'searchprofile-articles' => 'ܦܐܬܬ̈ܐ ܕܚܒܝܫܬ̈ܐ',
 'searchprofile-project' => 'ܦܐܬܬ̈ܐ ܕܬܪ̈ܡܝܬܐ ܘܕܥܘܕܪܢܐ',
@@ -951,6 +951,7 @@ $1',
 'upload_source_file' => ' (ܠܦܦܐ ܥܠ ܚܫܘܒܬܐ ܕܝܠܟ)',
 
 # Special:ListFiles
+'listfiles_search_for' => 'ܒܨܝ ܥܠ ܫܡܐ ܕܡܝܕܝܐ:',
 'imgfile' => 'ܠܦܦܐ',
 'listfiles' => 'ܡܟܬܒܘܬܐ ܕܠܦܦ̈ܐ',
 'listfiles_thumb' => 'ܙܘܥܪܐ',
index 8dd9dba..f66fa66 100644 (file)
@@ -547,8 +547,8 @@ Por favor vuelvi identificate depués de recibila.',
 'blocked-mailpassword' => 'Ta bloquiada la edición dende la to direición IP, polo que pa evitar abusos nun se pue usar la función de recuperación de clave.',
 'eauthentsent' => "Unvióse un corréu electrónicu de confirmación a la direición indicada.
 Enantes de que s'unvie nengún otru corréu a la cuenta, has siguir les instrucciones del corréu electrónicu pa confirmar que la cuenta ye de to.",
-'throttled-mailpassword' => "Yá s'unvió un recordatoriu de la clave {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.
-Pa evitar abusos, namái s'unviará un recordatoriu cada {{PLURAL:$1|hora|$1 hores}}.",
+'throttled-mailpassword' => "Yá s'unvió un corréu de reaniciu la clave {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.
+Pa evitar abusos, namái s'unviará un corréu de reaniciu cada {{PLURAL:$1|hora|$1 hores}}.",
 'mailerror' => 'Fallu al unviar el corréu: $1',
 'acct_creation_throttle_hit' => "Los visitantes d'esta wiki qu'usen la to direición IP yá crearon güei {{PLURAL:$1|1 cuenta|$1 cuentes}}, que ye'l máximu almitíu nesti periodu de tiempu.
 Poro, los visitantes qu'usen esta direición IP nun puen crear más cuentes de momentu.",
@@ -602,7 +602,7 @@ Seique yá camudaras correutamente la clave o que pidieras una nueva clave provi
 
 # Special:PasswordReset
 'passwordreset' => 'Reaniciar clave',
-'passwordreset-text' => 'Completa esti formulariu pa recibir un corréu electrónicu que te recuerde los detalles de la to cuenta.',
+'passwordreset-text' => 'Complete esti formulariu pa reaniciar la contraseña.',
 'passwordreset-legend' => 'Reaniciar clave',
 'passwordreset-disabled' => 'Los reanicios de clave tán desactivaos nesta wiki.',
 'passwordreset-pretext' => "{{PLURAL:$1||Escribi ún de los elementos de los datos d'abaxo}}",
@@ -612,32 +612,27 @@ Seique yá camudaras correutamente la clave o que pidieras una nueva clave provi
 'passwordreset-capture-help' => "Si marques esta caxella, podrás ver el corréu (cola clave provisional) amás d'unvialu al usuariu.",
 'passwordreset-email' => 'Direición de corréu electrónicu:',
 'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Daquién (seique tu, dende la direición IP $1)solicitó un recordatoriu de los
-detalles de la to cuenta de {{SITENAME}} ($4).
+'passwordreset-emailtext-ip' => "Dalguién (seique vusté, dende la direición IP $1)solicitó'l reaniciu de la so contraseña de {{SITENAME}} ($4).
 {{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
 a esta direición de corréu electrónicu:
 
 $2
 
-{{PLURAL:$3|Esta clave provisional caduca|Estes claves provisionales caduquen}} {{PLURAL:$5|nún día|en $5 díes}}.
-Habríes identificate y escoyer una clave nueva agora. Si esta solicitú la fizo otra persona,
-o si recordasti la clave orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir
-usando la to clave antigua.",
-'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} solicitó un recordatoriu de los detalles de la to cuenta de {{SITENAME}} ($4).
-{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
-a esta direición de corréu electrónicu:
+{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
+Tendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona,
+o si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir
+usando la contraseña antigua.",
+'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} solicitó un reaniciu de la so contraseña de {{SITENAME}} ($4). {{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}} con esta direición de corréu electrónicu:
 
 $2
 
-{{PLURAL:$3|Esta clave provisional caduca|Estes claves provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
-Habríes identificate y escoyer una clave nueva agora. Si esta solicitú la fizo otra persona, o si
-recordasti la clave orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir usando
-la to clave antigua.",
+{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
+Tendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona, o si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir usando la contraseña antigua.",
 'passwordreset-emailelement' => "Nome d'usuariu: $1
 Clave provisional: $2",
-'passwordreset-emailsent' => 'Unvióse un corréu electrónicu de recordatoriu.',
-'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu de recordatoriu, que s'amuesa abaxo.",
-'passwordreset-emailerror-capture' => "Xeneróse un corréu electrónicu de recordatoriu, que s'amuesa abaxo, pero falló'l so unviu al usuariu: $1",
+'passwordreset-emailsent' => 'Unvióse un corréu electrónicu pa reaniciar la contraseña.',
+'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
+'passwordreset-emailerror-capture' => "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu al usuariu: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Camudar la direición de corréu electrónicu',
@@ -734,7 +729,7 @@ Seique se treslladara o desaniciara mientres víes la páxina.',
 'loginreqtitle' => 'Necesítase identificación',
 'loginreqlink' => 'identificate',
 'loginreqpagetext' => 'Has $1 pa ver otres páxines.',
-'accmailtitle' => 'Clave unviada.',
+'accmailtitle' => 'Clave unviada',
 'accmailtext' => "Unvióse a $2 una clave xenerada al debalu pal usuariu [[User talk:$1|$1]].
 
 La clave d'esta cuenta nueva pue camudase na páxina ''[[Special:ChangePassword|camudar clave]]'' depués d'identificate.",
@@ -742,10 +737,11 @@ La clave d'esta cuenta nueva pue camudase na páxina ''[[Special:ChangePassword|
 'newarticletext' => "Siguisti un enllaz a un artículu qu'inda nun esiste.
 Pa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [[{{MediaWiki:Helppage}}|páxina d'ayuda]] pa más información).
 Si llegasti equí por enquivocu, calca nel botón '''atrás''' del to restolador.",
-'anontalkpagetext' => "----''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.
+'anontalkpagetext' => "----
+''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''
 Pola mor d'ello ha usase la direición numbérica IP pa identificalu/la.
 Tala IP pue ser compartida por varios usuarios.
-Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.''",
+Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.",
 'noarticletext' => 'Nestos momentos nun hai testu nesta páxina.
 Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos],
@@ -2072,9 +2068,7 @@ Pue haber [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] toca
 
 # Email user
 'mailnologin' => "Ensin direición d'unviu",
-'mailnologintext' => 'Has tar [[Special:UserLogin|identificáu]]
-y tener una direición de corréu válida nes tos [[Special:Preferences|preferencies]]
-pa poder unviar correos a otros usuarios.',
+'mailnologintext' => 'Has tener [[Special:UserLogin|sesión aniciada]] y una direición de corréu válida nes tos [[Special:Preferences|preferencies]] pa poder unviar correos a otros usuarios.',
 'emailuser' => 'Manda-y un corréu a esti usuariu',
 'emailuser-title-target' => 'Unviar un corréu electrónicu a {{GENDER:$1|esti usuariu|esta usuaria}}',
 'emailuser-title-notarget' => 'Unviar un corréu electrónicu a un usuariu',
@@ -2102,7 +2096,7 @@ La direición de corréu electrónicu qu\'especificasti nes [[Special:Preference
 'emailccme' => 'Unviame per corréu una copia del mio mensaxe.',
 'emailccsubject' => 'Copia del to mensaxe a $1: $2',
 'emailsent' => 'Corréu unviáu',
-'emailsenttext' => 'El to corréu foi unviáu.',
+'emailsenttext' => "Unviose'l to mensaxe de corréu.",
 'emailuserfooter' => 'Esti corréu electrónicu unviolu $1 a $2 per aciu de la función "Manda-y un corréu a un usuariu" de {{SITENAME}}.',
 
 # User Messenger
@@ -2472,9 +2466,9 @@ Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'unblockip' => 'Desbloquiar usuariu',
 'unblockiptext' => "Usa'l formulariu d'abaxo pa restablecer l'accesu d'escritura a una direicion IP o a un nome d'usuariu previamente bloquiáu.",
 'ipusubmit' => 'Desaniciar esti bloquéu',
-'unblocked' => '[[User:$1|$1]] foi desbloquiáu',
+'unblocked' => '[[User:$1|$1]] desbloquióse.',
 'unblocked-range' => '$1 se desbloquió',
-'unblocked-id' => 'El bloquéu $1 foi elimináu',
+'unblocked-id' => "Desaniciose'l bloquéu $1.",
 'blocklist' => 'Usuarios bloquiaos',
 'ipblocklist' => 'Usuarios bloquiaos',
 'ipblocklist-legend' => 'Atopar un usuariu bloquiáu',
@@ -2496,7 +2490,7 @@ Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'anononlyblock' => 'namái anón.',
 'noautoblockblock' => 'bloquéu automáticu desactiváu',
 'createaccountblock' => 'bloquiada la creación de cuentes',
-'emailblock' => 'corréu electrónicu bloquiáu',
+'emailblock' => 'corréu electrónicu desactiváu',
 'blocklist-nousertalk' => "nun pue editar la so páxina d'alderique",
 'ipblocklist-empty' => 'La llista de bloqueos ta vacia.',
 'ipblocklist-no-results' => "La direición IP o nome d'usuariu solicitáu nun ta bloquiáu.",
@@ -2520,7 +2514,7 @@ Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bl
 'block-log-flags-anononly' => 'namái usuarios anónimos',
 'block-log-flags-nocreate' => 'creación de cuentes desactivada',
 'block-log-flags-noautoblock' => 'bloquéu automáticu deshabilitáu',
-'block-log-flags-noemail' => 'corréu electrónicu bloquiáu',
+'block-log-flags-noemail' => 'corréu electrónicu desactiváu',
 'block-log-flags-nousertalk' => "nun pue editar la páxina d'alderique propia",
 'block-log-flags-angry-autoblock' => 'autobloquéu ameyoráu activáu',
 'block-log-flags-hiddenname' => "nome d'usuariu anubríu",
@@ -3481,16 +3475,14 @@ Los demás tarán anubríos de mou predetermináu.
 # Email address confirmation
 'confirmemail' => 'Confirmar direición de corréu',
 'confirmemail_noemail' => "Nun tienes una direición de corréu válida nes tos [[Special:Preferences|preferencies d'usuariu]].",
-'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les
-funcionalidaes de mensaxes. Da-y al botón que tienes equí embaxo pa unviar un avisu de
-confirmación a la to direición. Esti avisu va incluyir un enllaz con un códigu; carga
-l'enllaz nel to navegador pa confirmar la to direición de corréu electrónicu.",
+'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les carauterístiques de corréu.
+Da-y al botón que tienes equí embaxo pa unviar un corréu de confirmación a la to direición.
+El corréu va incluyir un enllaz con un códigu; carga l'enllaz nel to navegador pa confirmar que la to direición de corréu electrónicu ye válida.",
 'confirmemail_pending' => "Yá s'unvió un códigu de confirmación a la to direición de corréu; si creasti hai poco la to cuenta, pues esperar dellos minutos a que-y de tiempu a llegar enantes de pidir otru códigu nuevu.",
 'confirmemail_send' => 'Unviar códigu de confirmación',
 'confirmemail_sent' => 'Corréu de confirmación unviáu.',
 'confirmemail_oncreate' => "Unvióse un códigu de confirmación a la to direición de corréu.
-Esti códigu nun se necesita pa identificase, pero tendrás que lu conseñar enantes
-d'activar cualesquier funcionalidá de la wiki que tea rellacionada col corréu.",
+Esti códigu nun se necesita p'aniciar sesión, pero tendrás que conseñalu enantes d'activar cualesquier carauterística de la wiki que tea rellacionada col corréu.",
 'confirmemail_sendfailed' => '{{SITENAME}} nun pudo unviar el to corréu de confirmación.
 Por favor comprueba que nun punxeras carauteres non válidos na to direición de corréu.
 
@@ -3502,15 +3494,15 @@ Agora yá pues [[Special:UserLogin|coneutate]] y esfrutar de la wiki.',
 'confirmemail_loggedin' => 'Quedó confirmada la to direición de corréu.',
 'confirmemail_error' => 'Hebo un problema al guardar la to confirmación.',
 'confirmemail_subject' => 'Confirmación de la direición de corréu de {{SITENAME}}',
-'confirmemail_body' => 'Daquién, seique tu dende la IP $1, rexistró la cuenta "$2" con
+'confirmemail_body' => 'Daquién, seique tu, dende la IP $1, rexistró la cuenta "$2" con
 esta direición de corréu en {{SITENAME}}.
 
-Pa confirmar qu\'esta cuenta ye tuya daveres y asina activar les funcionalidaes
+Pa confirmar qu\'esta cuenta ye tuya daveres y asina activar les carauterístiques
 de corréu en {{SITENAME}}, abri esti enllaz nel to navegador:
 
 $3
 
-Si *nun* rexistrasti tu la cuenta, da-y a esti enllaz pa cancelar
+Si *nun* rexistrasti tu la cuenta, sigui esti enllaz pa encaboxar
 la confirmación de la direición de corréu electrónicu:
 
 $5
@@ -3544,8 +3536,8 @@ la confirmación de les señes de corréu electrónicu:
 $5
 
 Esti códigu de confirmación caduca\'l $4.',
-'confirmemail_invalidated' => 'Confirmación de direición de corréu electrónicu cancelada',
-'invalidateemail' => 'Cancelar confirmación de corréu electrónicu',
+'confirmemail_invalidated' => 'Confirmación de direición de corréu electrónicu encaboxada',
+'invalidateemail' => 'Encaboxar confirmación de corréu electrónicu',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[La tresclusión interwiki ta desactivada]',
@@ -3554,7 +3546,7 @@ Esti códigu de confirmación caduca\'l $4.',
 'scarytranscludetoolong' => '[La URL ye demasiao llarga]',
 
 # Delete conflict
-'deletedwhileediting' => "'''Avisu''': ¡Esta páxina foi esborrada depués de qu'entamaras a editala!",
+'deletedwhileediting' => "'''Avisu''': ¡Esta páxina desanicióse depués de qu'entamaras a editala!",
 'confirmrecreate' => "L'usuariu [[User:$1|$1]] ([[User talk:$1|alderique]]) esborró esta páxina depués de qu'empecipiaras a editala pol siguiente motivu:
 : ''$2''
 Por favor confirma que daveres quies volver a crear esta páxina.",
@@ -3777,17 +3769,17 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'sqlite-no-fts' => '$1 ensin sofitu pa gueta en testu completu',
 
 # New logging system
-'logentry-delete-delete' => '$1 desanició la páxina $3',
-'logentry-delete-restore' => '$1 restauró la páxina $3',
-'logentry-delete-event' => "$1 camudó la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
-'logentry-delete-revision' => "$1 camudó la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
-'logentry-delete-event-legacy' => '$1 camudó la visibilidá de los socesos del rexistru en $3',
-'logentry-delete-revision-legacy' => '$1 camudó la visibilidá de les revisiones na páxina $3',
-'logentry-suppress-delete' => '$1 suprimió la páxina $3',
-'logentry-suppress-event' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
-'logentry-suppress-revision' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
-'logentry-suppress-event-legacy' => '$1 camudó en secretu la visibilidá de los socesos del rexistru en $3',
-'logentry-suppress-revision-legacy' => '$1 camudó en secretu la visibilidá de les revisiones na páxina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|desanició}} la páxina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|restauró}} la páxina $3',
+'logentry-delete-event' => "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|camudó}} la visibilidá de los socesos del rexistru en $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|camudó}} la visibilidá de les revisiones na páxina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|suprimió}} la páxina $3',
+'logentry-suppress-event' => "$1 {{GENDER:$2|camudó}} en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|camudó}} en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|camudó}} en secretu la visibilidá de los socesos del rexistru en $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|camudó}} en secretu la visibilidá de les revisiones na páxina $3',
 'revdelete-content-hid' => 'conteníu tapecíu',
 'revdelete-summary-hid' => "resume d'edición tapecíu",
 'revdelete-uname-hid' => "nome d'usuariu anubríu",
@@ -3796,20 +3788,20 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'revdelete-uname-unhid' => "nome d'usuariu non anubríu",
 'revdelete-restricted' => 'aplicaes les restricciones a los alministradores',
 'revdelete-unrestricted' => 'eliminaes les restricciones a los alministradores',
-'logentry-move-move' => '$1 treslladó la páxina "$3" a "$4"',
-'logentry-move-move-noredirect' => '$1 treslladó la páxina "$3" a "$4" ensin dexar una redireición',
-'logentry-move-move_redir' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición',
-'logentry-move-move_redir-noredirect' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
-'logentry-patrol-patrol' => '$1 marcó la revisión $4 de la páxina "$3" como patrullada',
-'logentry-patrol-patrol-auto' => '$1 marcó automaticamente la revisión $4 de la páxina "$3" como patrullada',
-'logentry-newusers-newusers' => "Creóse la cuenta d'usuariu $1",
-'logentry-newusers-create' => "Creóse la cuenta d'usuariu $1",
-'logentry-newusers-create2' => "$1 creó la cuenta d'usuariu $3",
-'logentry-newusers-byemail' => "$1 creó la cuenta d'usuariu $3 y la contraseña uviose per corréu electrónicu",
-'logentry-newusers-autocreate' => 'La cuenta $1 creóse automáticamente',
-'logentry-rights-rights' => '$1 camudó la pertenencia a grupos de $3 dende $4 a $5',
-'logentry-rights-rights-legacy' => '$1 camudó la pertenencia a grupos de $3',
-'logentry-rights-autopromote' => '$1 promocionó automáticamente de $4 a $5',
+'logentry-move-move' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4"',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" ensin dexar una redireición',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" sobre una redireición',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcó}} la revisión $4 de la páxina "$3" como patrullada',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcó}} automáticamente la revisión $4 de la páxina "$3" como patrullada',
+'logentry-newusers-newusers' => "{{GENDER:$2|Creóse}} la cuenta d'usuariu $1",
+'logentry-newusers-create' => "{{GENDER:$2|Creóse}} la cuenta d'usuariu $1",
+'logentry-newusers-create2' => "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3",
+'logentry-newusers-byemail' => "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3 y la contraseña unvióse per corréu electrónicu",
+'logentry-newusers-autocreate' => 'La cuenta $1 {{GENDER:$2|creóse}} automáticamente',
+'logentry-rights-rights' => '$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3 dende $4 a $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|promocionó}} automáticamente de $4 a $5',
 'rightsnone' => '(nengún)',
 
 # Feedback
index 370c8b1..7eb9d06 100644 (file)
@@ -772,20 +772,20 @@ $2
 
 {{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.
 Сега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.',
-'passwordreset-emailtext-user' => 'Ð\9fоÑ\82Ñ\80ебиÑ\82ел $1 Ð¾Ñ\82 {{SITENAME}} Ð¿Ð¾Ð¸Ñ\81ка Ð½Ð°Ð¿Ð¾Ð¼Ð½Ñ\8fне Ð·Ð° Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð¾Ñ\82 сметката в {{SITENAME}}
+'passwordreset-emailtext-user' => 'Ð\9fоÑ\82Ñ\80ебиÑ\82ел $1 Ð¾Ñ\82 {{SITENAME}} Ð¿Ð¾Ð¸Ñ\81ка Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а Ð·Ð° сметката в {{SITENAME}}
 ($4). За {{PLURAL:$3|следната сметка|следните сметки}} е посочен този адрес за електронна поща:
 
 $2
 
 {{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.
-Сега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена 
+Сега би трябвало да влезете в системата и да изберете нова парола. Ако заявката е направена 
 от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете 
 това съобщение и да продължите да използвате старата си парола.',
 'passwordreset-emailelement' => 'Потребителско име: $1
 Временна парола: $2',
 'passwordreset-emailsent' => 'На електронната поща беше испратено писмо за възстановяване на паролата.',
-'passwordreset-emailsent-capture' => 'Ð\9fо-долÑ\83 Ðµ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\82о Ð¿Ð¸Ñ\81мо Ð·Ð° Ð½Ð°Ð¿Ð¾Ð¼Ð½Ñ\8fне, което беше изпратено.',
-'passwordreset-emailerror-capture' => 'Ð\9fо-долÑ\83 Ðµ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ Ñ\81Ñ\8aздадено ÐµÐ»ÐµÐºÑ\82Ñ\80онно Ð¿Ð¸Ñ\81мо Ð·Ð° Ð½Ð°Ð¿Ð¾Ð¼Ð½Ñ\8fне, което не беше изпратено на потребителя: $1',
+'passwordreset-emailsent-capture' => 'Ð\9fо-долÑ\83 Ðµ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\82о Ð¿Ð¸Ñ\81мо Ð·Ð° Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а, което беше изпратено.',
+'passwordreset-emailerror-capture' => 'Ð\9fо-долÑ\83 Ðµ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ Ñ\81Ñ\8aздадено ÐµÐ»ÐµÐºÑ\82Ñ\80онно Ð¿Ð¸Ñ\81мо Ð·Ð° Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а, което не беше изпратено на потребителя: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Промяна на адреса за е-поща',
@@ -2183,14 +2183,14 @@ $1',
 'enotif_mailer' => 'Известяване по пощата на {{SITENAME}}',
 'enotif_reset' => 'Отбелязване на всички страници като посетени',
 'enotif_impersonal_salutation' => 'Потребител на {{SITENAME}}',
+'enotif_body_intro_deleted' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|изтрита}} на $PAGEEDITDATE от $2. Вижте $3.',
+'enotif_body_intro_created' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|създадена}} на $PAGEEDITDATE от $2. За текущата версия, вижте $3',
 'enotif_lastvisited' => 'Преглед на всички промени след последното ви посещение: $1.',
 'enotif_lastdiff' => 'Преглед на тази промяна: $1.',
 'enotif_anon_editor' => 'анонимен потребител $1',
 'enotif_body' => 'Уважаеми(а) $WATCHINGUSERNAME,
 
-Страницата $PAGETITLE в {{SITENAME}} е била $CHANGEDORCREATED на $PAGEEDITDATE от $PAGEEDITOR. За текущата версия на страницата, вижте $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Резюме на редакцията: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2201,16 +2201,16 @@ $NEWPAGE
 Няма да получавате други известия за последващи промени, докато не посетите страницата.
 Можете да актуализиране настройките си за този вид известия за всички страници от вашия списък за наблюдение.
 
-             Системата за известяване на {{SITENAME}}
+Системата за известяване на {{SITENAME}}
 
 --
\97а Ð´Ð° Ð¿Ñ\80омениÑ\82е Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ñ\81и Ð·Ð° Ð¸Ð·Ð²ÐµÑ\81Ñ\82Ñ\8fваниÑ\8f Ñ\87Ñ\80ез ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð¿Ð¾Ñ\89а, Ð¿Ð¾Ñ\81еÑ\82еÑ\82е
\9fÑ\80омÑ\8fна Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð·Ð° Ð¸Ð·Ð²ÐµÑ\81Ñ\82Ñ\8fваниÑ\8f Ñ\87Ñ\80ез ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð¿Ð¾Ñ\89а Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88и Ð½Ð°
 {{canonicalurl:{{#special:Preferences}}}}
 
\97а Ð´Ð° Ð¿Ñ\80омениÑ\82е Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ñ\81и Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение, Ð¿Ð¾Ñ\81еÑ\82еÑ\82е
\9fÑ\80омÑ\8fна Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ва Ð½Ð°
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
\97а Ð´Ð° Ð¸Ð·Ñ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ñ\81и Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение, Ð¿Ð¾Ñ\81еÑ\82еÑ\82е
\98зÑ\82Ñ\80иванеÑ\82о Ð½Ð° Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение Ñ\81Ñ\82ава Ñ\87Ñ\80ез 
 $UNWATCHURL
 
 За обратна връзка и помощ:
@@ -2887,6 +2887,7 @@ $1',
 'pageinfo-header-basic' => 'Основна информация',
 'pageinfo-header-edits' => 'История на редакциите',
 'pageinfo-header-restrictions' => 'Защита на страницата',
+'pageinfo-default-sort' => 'Ключ за сортиране по подразбиране',
 'pageinfo-article-id' => 'Номер на страницата',
 'pageinfo-views' => 'Брой прегледи',
 'pageinfo-watchers' => 'Брой наблюдаващи страницата',
index 267693d..c2980ab 100644 (file)
@@ -1278,8 +1278,8 @@ $1",
 'yournick' => 'واژووی نوێ:',
 'prefs-help-signature' => 'بۆچوونەکان لە لاپەڕەکانی وتووێژدا دەبێ بە "<nowiki>~~~~</nowiki>" دیاری بکرێن، کە دواتر خۆکار دەگۆڕێ بە واژۆکەت و مۆری کاتی.',
 'badsig' => 'ئیمزاكه‌ هه‌ڵه‌یه‌، ته‌ماشای كۆدی HTML بكه‌‌',
-'badsiglength' => 'واژۆکەت زۆر درێژە.
-واژۆ نابێ لە $1 {{PLURAL:$1|نووسە|نووسە}} درێژتر بێت.',
+'badsiglength' => 'واژووەکەت زۆر درێژە.
+واژوو نابێ لە $1 {{PLURAL:$1|نووسە}} درێژتر بێت.',
 'yourgender' => 'زایەند:',
 'gender-unknown' => 'ئاشکرا نەکراو',
 'gender-male' => 'پیاو',
@@ -1294,7 +1294,7 @@ $1",
 'prefs-help-email-required' => 'ناونیشانی ئیمەیل پێویستە.',
 'prefs-info' => 'زانیاریی سەرەتایی',
 'prefs-i18n' => 'نێونەتەویی کردن',
-'prefs-signature' => 'واژۆ',
+'prefs-signature' => 'واژوو',
 'prefs-dateformat' => 'ڕازاندنەوەی ڕێکەوت',
 'prefs-timeoffset' => 'قەرەبووکەری کات',
 'prefs-advancedediting' => 'ھەڵبژاردەکانی پێشکەوتوو',
index 774bddd..fce5ba8 100644 (file)
@@ -1044,7 +1044,7 @@ $3 мына бу себепни бильдирди: ''$2''",
 'nchanges' => '$1 {{PLURAL:$1|денъиштирме}}',
 'recentchanges' => 'Сонъки денъиштирмелер',
 'recentchanges-legend' => 'Сонъки денъиштирмелер сазламалары',
-'recentchanges-summary' => 'Япылгъан энъ сонъки денъишикликлерни бу саифеде корип оласынъыз.',
+'recentchanges-summary' => 'Япылгъан энъ сонъки денъиштирмелерни бу саифеде корип оласынъыз.',
 'recentchanges-feed-description' => 'Бу лента вастасынен викиде сонъки денъиштирмелерни козет.',
 'recentchanges-label-newpage' => 'Бу денъиштирме янъы бир саифе яратты',
 'recentchanges-label-minor' => 'Бу, кичик бир денъиштирме',
index 28185d4..ad088f0 100644 (file)
@@ -1040,7 +1040,7 @@ Eger bildirseñiz, saifelerdeki deñiştirmelerni kimniñ yapqanını köstermek
 'nchanges' => '$1 {{PLURAL:$1|deñiştirme}}',
 'recentchanges' => 'Soñki deñiştirmeler',
 'recentchanges-legend' => 'Soñki deñiştirmeler sazlamaları',
-'recentchanges-summary' => 'Yapılğan eñ soñki deñişikliklerni bu saifede körip olasıñız.',
+'recentchanges-summary' => 'Yapılğan eñ soñki deñişitirmelerni bu saifede körip olasıñız.',
 'recentchanges-feed-description' => 'Bu lenta vastasınen vikide soñki deñiştirmelerni közet.',
 'recentchanges-label-newpage' => 'Bu deñiştirme yañı bir saife yarattı',
 'recentchanges-label-minor' => 'Bu, kiçik bir deñiştirme',
index 6d0156c..ab81729 100644 (file)
@@ -122,7 +122,7 @@ $messages = array(
 'tog-justify' => 'Unioni paragraffau',
 'tog-hideminor' => 'Cuddio golygiadau bychain yn rhestr y newidiadau diweddar',
 'tog-hidepatrolled' => 'Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr newidiadau diweddar',
-'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag y rhestr dudalennau newydd',
+'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag rhestr y tudalennau newydd',
 'tog-extendwatchlist' => "Ehangu'r rhestr wylio i ddangos pob golygiad yn hytrach na'r diweddaraf yn unig",
 'tog-usenewrc' => "Yn dangos newidiadau i un dudalen gyda'i gilydd - ar 'newidiadau diweddar' a'r 'rhestr wylio' (angen JavaScript)",
 'tog-numberheadings' => "Rhifo penawdau'n awtomatig",
@@ -586,8 +586,8 @@ Os mai rhywun arall a holodd am y cyfrinair, ynteu eich bod wedi cofio\'r hen gy
 'blocked-mailpassword' => 'Gan fod eich cyfeiriad IP wedi ei atal rhag golygu, ni ellir adfer y cyfrinair.',
 'eauthentsent' => 'Anfonwyd e-bost o gadarnhâd at y cyfeiriad a benwyd.
 Cyn y gellir anfon unrhywbeth arall at y cyfeiriad hwnnw rhaid i chi ddilyn y cyfarwyddiadau yn yr e-bost hwnnw er mwyn cadarnhau bod y cyfeiriad yn un dilys.',
-'throttled-mailpassword' => "Anfonwyd e-bost atoch i'ch atgoffa o'ch cyfrinair eisoes, yn ystod y $1 {{PLURAL:$1|awr|awr|awr|awr|awr|awr}} diwethaf.
-Er mwyn rhwystro camddefnydd, dim ond un e-bost i'ch atgoffa o'ch cyfrinair gaiff ei anfon bob yn $1 {{PLURAL:$1|awr|awr|awr|awr|awr|awr}}.",
+'throttled-mailpassword' => "Anfonwyd e-bost atoch eisoes i'ch atgoffa o'ch cyfrinair, a hynny yn ystod y $1 {{PLURAL:$1|awr}} diwethaf.
+Er mwyn rhwystro camddefnydd, dim ond un e-bost i'ch atgoffa o'ch cyfrinair gaiff ei anfon bob yn $1 {{PLURAL:$1|awr}}.",
 'mailerror' => 'Gwall wrth ddanfon yr e-bost: $1',
 'acct_creation_throttle_hit' => "Mae ymwelwyr sy'n defnyddio'ch cyfeiriad IP wedi creu $1 {{PLURAL:$1|cyfrif|cyfrif|gyfrif|chyfrif|chyfrif|cyfrif}} yn ystod y diwrnod diwethaf, sef y mwyafswm a ganiateir mewn diwrnod.
 Felly ni chaiff defnyddwyr sy'n defnyddio'r cyfeiriad IP hwn greu rhagor o gyfrifon ar hyn o bryd.",
@@ -636,7 +636,7 @@ Gall fod eich bod wedi llwyddo newid eich cyfrinair eisoes neu eich bod wedi gof
 
 # Special:PasswordReset
 'passwordreset' => 'Ailosod cyfrinair',
-'passwordreset-text' => "Cwblhewch y ffurflen hon er mwyn derbyn e-bost i'ch atgoffa o fanylion eich cyfrif.",
+'passwordreset-text' => 'Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.',
 'passwordreset-legend' => 'Ailosod y cyfrinair',
 'passwordreset-disabled' => 'Analluogwyd ailosod cyfrineiriau ar y wici hwn.',
 'passwordreset-pretext' => "{{PLURAL:$1|||Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod}}",
@@ -646,23 +646,23 @@ Gall fod eich bod wedi llwyddo newid eich cyfrinair eisoes neu eich bod wedi gof
 'passwordreset-capture-help' => "Os y ticiwch y blwch hwn, bydd yr e-bost (gyda'r cyfrinair dros dro) yn cael ei ddangos i chi yn ogystal a chael ei anfon at y defnyddiwr.",
 'passwordreset-email' => 'Eich cyfeiriad e-bost:',
 'passwordreset-emailtitle' => 'Manylion eich cyfrif ar {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am nodyn atgoffa o fanylion eich cyfrif ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
+'passwordreset-emailtext-ip' => "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am ailosod eich cyfrinair ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
 
 $2
 
-Bydd y {{PLURAL:$3||cyfrinair dros dro hwn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn}} yn dod i ben ymhen {{PLURAL:$5||diwrnod |deuddydd|tridiau|$5 diwrnod|$5 diwrnod}}. Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
-'passwordreset-emailtext-user' => "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ei atgoffa o fanylion eich cyfrif ar {{SITENAME}}
-($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
+Bydd y {{PLURAL:$3||cyfrinair dros dro hwn|cyfrineiriau dros dro hyn}} yn dod i ben ymhen {{PLURAL:$5||diwrnod |deuddydd|tridiau|$5 diwrnod}}. Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
+'passwordreset-emailtext-user' => "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ailosod ei gyfrinair ar {{SITENAME}}
+($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
 
 $2
 
-Bydd y {{PLURAL:$3||cyfrinair|cyfrineiriau|cyfrineiriau|cyfrineiriau|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod|$5 diwrnod}}.
+Bydd y {{PLURAL:$3||cyfrinair|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod}}.
 Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
 'passwordreset-emailelement' => "Enw'r defnyddiwr: $1
 Y cyfrinair dros dro: $2",
-'passwordreset-emailsent' => 'Anfonwyd nodyn atgoffa drwy e-bost.',
-'passwordreset-emailsent-capture' => 'Anfonwyd e-bost atgoffa, a ddangosir isod.',
-'passwordreset-emailerror-capture' => "Lluniwyd e-bost atgoffa fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
+'passwordreset-emailsent' => 'Anfonwyd e-bost i ailosod eich cyfrinair atoch.',
+'passwordreset-emailsent-capture' => "Anfonwyd e-bost i ailosod cyfrinair, ac fe'i ddangosir isod.",
+'passwordreset-emailerror-capture' => "Lluniwyd e-bost i ailosod cyfrinair fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Newid y cyfeiriad e-bost',
@@ -3718,12 +3718,12 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'logentry-delete-delete' => 'Dileodd $1 y dudalen $3',
 'logentry-delete-restore' => 'Adferodd $1 y dudalen $3',
 'logentry-delete-event' => 'Newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-delete-revision' => "Newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-delete-revision' => "Newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
 'logentry-delete-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3',
 'logentry-delete-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3",
 'logentry-suppress-delete' => 'Cuddiodd $1 y dudalen $3',
 'logentry-suppress-event' => 'Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-suppress-revision' => "Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-suppress-revision' => "Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
 'logentry-suppress-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3, yn y dirgel',
 'logentry-suppress-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3, yn y dirgel",
 'revdelete-content-hid' => 'cuddiwyd y cynnwys',
@@ -3734,8 +3734,8 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'revdelete-uname-unhid' => 'datguddiwyd yr enw defnyddiwr',
 'revdelete-restricted' => 'cyfyngwyd ar allu gweinyddwyr i weld',
 'revdelete-unrestricted' => 'tynnwyd y cyfyngiadau ar allu gweinyddwyr i weld',
-'logentry-move-move' => 'Symudwyd y dudalen $3 i $4 gan $1',
-'logentry-move-move-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 heb adael dolen ailgyfeirio',
+'logentry-move-move' => 'Symudodd $1 y dudalen $3 i $4',
+'logentry-move-move-noredirect' => 'Symudodd $1 y dudalen $3 i $4 heb adael dolen ailgyfeirio',
 'logentry-move-move_redir' => 'Symudwyd y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio',
 'logentry-move-move_redir-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 dros ddolen ailgyfeirio heb adael dolen ailgyfeirio newydd',
 'logentry-patrol-patrol' => "Rhoddodd $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
index 0920527..0019ad1 100644 (file)
@@ -2574,7 +2574,7 @@ $1',
 'namespace' => 'Cayê namey:',
 'invert' => 'Weçinıtışo peyserki',
 'tooltip-invert' => 'nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê',
-'namespace_association' => 'Cayê nameyanê eleqedaran',
+'namespace_association' => 'Cayê nameyanê elaqedaran',
 'tooltip-namespace_association' => 'Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê',
 'blanknamespace' => '(Ser)',
 
@@ -4164,7 +4164,7 @@ Ena sita dı newke xırabiya teknik esta.',
 'revdelete-unrestricted' => 'verger (ver gırewtış) ê ke qey xızmkaran diyê wera (wedariyê)',
 'logentry-move-move' => "Karber $1' pelay $3' berd $4",
 'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u berd $4",
-'logentry-move-move_redir' => '$1 pela $3 pela da $4 sera hetenayış ra ahulnê',
+'logentry-move-move_redir' => 'Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4',
 'logentry-move-move_redir-noredirect' => '$1 hetenayışê qeydê pela da  $3 ahulnê $4 sero hetenayış vıraşt',
 'logentry-patrol-patrol' => '$1 revizyonê pela da $4 $3 ke kontrol',
 'logentry-patrol-patrol-auto' => "$1 pelay $3'i rewizyon dê $4 ya kontrol ke",
index 9d71f03..dadabb0 100644 (file)
@@ -1510,9 +1510,9 @@ Feranerangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
 'protect-locked-access' => "Din brükerkonto ferfäiget ai ouer da nüsie ruchte tu jü änring foon e sideschüts. Heer san da aktuäle sideschütsönjstalinge fon jü sid '''„$1“:'''",
 'protect-cascadeon' => 'Jüdeer sid as nütutids diilj foon e kaskaadenspäre. Jü as önj {{PLURAL:$1|jü füliende sid|da füliende side}} önjbünen, huk döör jü kaskaadenspäropsjoon schütsed {{PLURAL:$1|as|san}}. Di sideschütsstatus koon for jüdeer sid änred wårde, dåtdeer heet ouers nån influs aw jü kaskaadenspäre:',
 'protect-default' => 'Åle brükere',
-'protect-fallback' => 'Jü "$1"-beruchtiging as nüsi.',
-'protect-level-autoconfirmed' => 'Späring for naie än ai registriirde brükere',
-'protect-level-sysop' => 'Bloot administratoore',
+'protect-fallback' => 'Ferloof bluas för brükern mä "$1"-rochten.',
+'protect-level-autoconfirmed' => 'Ferloof bluas för registriaret brükern.',
+'protect-level-sysop' => 'Ferloof bluas för administratooren.',
 'protect-summary-cascade' => 'kaskadiirend',
 'protect-expiring' => 'bit $2, am e klook $3 (UTC)',
 'protect-cascade' => 'Kaskadiirende späre - åle önj jüdeer sid önjbünene forlååge wårde uk spärd.',
@@ -1668,7 +1668,7 @@ For di fål dåt dü dåt ai dääst, präiw aw [[Special:DoubleRedirects|dööw
 Dü bast deerfor feroontuurdlik, dåt links fortönj ap dåt koräkt muul wise.
 
 Jü sid wårt '''ai''' ferschääwen, wan dåt ål en sid ma di seelew noome jeeft,
-süwid jüdeer ai lääsi unti en widerliidjing suner färsjoonshistoori as. Dåtdeer bedjüset,
+süwid jüdeer ai bloots en widerliidjing suner färsjoonshistoori as. Dåtdeer bedjüset,
 dåt dü jü sid tubääg ferschüwe koost, wan dü en fäägel mååged heest. Dü koost
 deeriinj niinj sid ouerschriwe.
 
index 88215c4..765c9ae 100644 (file)
@@ -491,7 +491,7 @@ $messages = array(
 'history' => 'Stare izmjene',
 'history_short' => 'Stare izmjene',
 'updatedmarker' => 'obnovljeno od zadnjeg posjeta',
-'printableversion' => 'Verzija za ispis',
+'printableversion' => 'Inačica za ispis',
 'permalink' => 'Trajna poveznica',
 'print' => 'Ispiši',
 'view' => 'Vidi',
@@ -1987,7 +1987,7 @@ Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
 'filedelete-success' => "Datoteka '''$1''' je izbrisana.",
 'filedelete-success-old' => "Inačica datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
 'filedelete-nofile' => "'''$1''' ne postoji.",
-'filedelete-nofile-old' => "Nema arhivirane verzije datoteke '''$1''' s zadanim parametrima.",
+'filedelete-nofile-old' => "Nema arhivirane inačice datoteke '''$1''' sa zadanim parametrima.",
 'filedelete-otherreason' => 'Drugi/dodatni razlog:',
 'filedelete-reason-otherlist' => 'Drugi razlog',
 'filedelete-reason-dropdown' => '*Česti razlozi brisanja
@@ -2832,7 +2832,7 @@ Molimo odaberite drugo ime.',
 
 # Export
 'export' => 'Izvezi stranice',
-'exporttext' => 'Možete izvesti tekst i prijašnje promjene jedne ili više stranica uklopljene u XML kod. U budućim verzijama MediaWiki softvera bit će moguće uvesti ovakvu stranicu u neki drugi wiki. Trenutačna verzija to još ne podržava.
+'exporttext' => 'Možete izvesti tekst i prijašnje promjene jedne ili više stranica uklopljene u kȏd XML. U budućim inačicama MediaWiki softvera bit će moguće uvesti ovakvu stranicu u neki drugi wiki. Trenutačna inačica to još ne podržava.
 
 Za izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i označite želite li trenutačnu inačicu zajedno sa svim prijašnjima, ili samo trenutačnu inačicu s informacijom o zadnjoj promjeni.
 
index 8ea970d..1afc66c 100644 (file)
@@ -59,6 +59,7 @@
  * @author 欅
  * @author 蝋燭α
  * @author 青子守歌
+ * @author 아라
  */
 
 $datePreferences = array(
@@ -848,7 +849,7 @@ Cookieを有効にしていることを確認して、このページを再読
 この申請をしたのが他人の場合、あるいはパスワードを思い出してパスワード変更が不要になった場合は、
 このメッセージを無視して、引き続き以前のパスワードを使用し続けることができます。',
 'noemail' => '利用者「$1」のメールアドレスは登録されていません。',
-'noemailcreate' => '有効なメールアドレスを入力する必要があります',
+'noemailcreate' => '有効なメールアドレスを入力する必要があります',
 'passwordsent' => '新しいパスワードを「$1」に登録されたメールアドレスにお送りしました。
 メールが届いたら、再度ログインしてください。',
 'blocked-mailpassword' => 'ご使用中のIPアドレスからの編集はブロックされており、不正利用防止のため、パスワードの再発行機能は使用できません。',
index e5b8892..cc838e4 100644 (file)
@@ -388,6 +388,9 @@ $messages = array(
 'index-category' => 'ទំព័រដែលមានលិបិក្រម',
 'noindex-category' => 'ទំព័រដែលគ្មានលិបិក្រម',
 'broken-file-category' => 'ទំព័រទាំងឡាយដែលដាច់តំណភ្ជាប់',
+'categoryviewer-pagedlinks' => '($1) ($2)',
+
+'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
 'about' => 'អំពី',
 'article' => 'មាតិកាអត្ថបទ',
@@ -522,6 +525,8 @@ $1',
 
 'ok' => 'យល់ព្រម',
 'pagetitle' => '$1 - {{SITENAME}}',
+'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '← $1',
 'retrievedfrom' => 'បានពី "$1"',
 'youhavenewmessages' => 'អ្នកមាន $1 ($2)។',
 'newmessageslink' => 'សារថ្មីៗ',
@@ -532,6 +537,7 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}ចុងក្រោយ',
 'youhavenewmessagesmulti' => 'អ្នកមានសារថ្មីៗនៅ $1',
 'editsection' => 'កែប្រែ',
+'editsection-brackets' => '[$1]',
 'editold' => 'កែប្រែ',
 'viewsourceold' => 'មើលកូដ',
 'editlink' => 'កែប្រែ',
@@ -552,6 +558,8 @@ $1',
 'site-atom-feed' => 'បម្រែបម្រួល Atom Feed នៃ $1',
 'page-rss-feed' => 'បម្រែបម្រួល RSS Feed នៃ "$1"',
 'page-atom-feed' => 'បម្រែបម្រួល Atom Feed នៃ "$1"',
+'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
 'red-link-title' => '$1 (ទំព័រនេះមិនទាន់​មាននៅឡើយទេ)',
 'sort-descending' => 'តម្រៀបតាមលំដាប់ចុះ',
 'sort-ascending' => 'តម្រៀបតាមលំដាប់ឡើង',
@@ -707,6 +715,7 @@ $2',
 អ្នកបានជ្រើសមិនប្រើខូឃី។​
 
 សូមជ្រើសប្រើខូឃីវិញ រួចព្យាយាមម្តងទៀត។',
+'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => 'អ្នកមិនបានផ្ដល់អត្តនាមត្រឹមត្រូវទេ។',
 'loginsuccesstitle' => 'កត់ឈ្មោះចូលបានសំរេច',
 'loginsuccess' => "'''ពេលនេះអ្នកបានកត់ឈ្មោះចូល{{SITENAME}}ដោយប្រើឈ្មោះ \"\$1\"។'''",
@@ -804,7 +813,7 @@ $2',
 # Special:PasswordReset
 'passwordreset' => 'កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ',
 'passwordreset-text' => 'បំពេញសំណុំបែបបទនេះដើម្បីទទួលបានអ៊ីម៉ែលក្រើនរំលឹកពីព័ត៌មានលំអិតរបស់គណនីរបស់អ្នក។',
-'passwordreset-legend' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9e¾á\9e\98',
+'passwordreset-legend' => 'á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9fá\9e¶á\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89',
 'passwordreset-disabled' => 'មុខងារប្ដូរទៅពាក្យសម្ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
 'passwordreset-pretext' => '{{PLURAL:$1||វាយបញ្ចូលផ្នែកមួយនៃទិន្នន័យខាងក្រោម}}',
 'passwordreset-username' => 'អត្តនាម៖',
@@ -1354,7 +1363,7 @@ $1",
 'prefs-labs' => 'មុខងារពិសេសថ្មីៗដែលស្ថិតក្រោមការពិសោធន៍នៅឡើយ',
 'prefs-user-pages' => 'ទំព័រអ្នកប្រើប្រាស់',
 'prefs-personal' => 'ប្រវត្តិរូប',
-'prefs-rc' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗ',
+'prefs-rc' => 'á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗ',
 'prefs-watchlist' => 'បញ្ជីតាមដាន',
 'prefs-watchlist-days' => 'ចំនួនថ្ងៃត្រូវបង្ហាញក្នុងបញ្ជីតាមដាន៖',
 'prefs-watchlist-days-max' => 'អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}',
@@ -2276,7 +2285,7 @@ $1',
 'enotif_reset' => 'កត់សម្គាល់រាល់គ្រប់ទំព័រដែលបានចូលមើល',
 'enotif_impersonal_salutation' => 'អ្នកប្រើប្រាស់ {{SITENAME}}',
 'enotif_lastvisited' => 'ពិនិត្យ $1 សម្រាប់គ្រប់បន្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយ។',
-'enotif_lastdiff' => 'សូមពិនិត្យ$1ដើម្បីមើលបន្លាស់ប្តូរនេះ។',
+'enotif_lastdiff' => 'សូមពិនិត្យ $1 ដើម្បីមើលបំលាស់ប្តូរនេះ។',
 'enotif_anon_editor' => 'អ្នកប្រើប្រាស់អនាមិក $1',
 'enotif_body' => 'ជូនចំពោះ $WATCHINGUSERNAME ជាទីរាប់អាន,
 
index 597ab16..61cb9ce 100644 (file)
@@ -358,7 +358,7 @@ $messages = array(
 'tog-editsection' => '[편집] 링크로 부분 편집하기',
 'tog-editsectiononrightclick' => '제목을 오른쪽 클릭해서 부분 편집하기 (자바스크립트 필요)',
 'tog-showtoc' => '문서의 차례 보여주기 (머릿글이 4개 이상인 경우)',
-'tog-rememberpassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1)',
+'tog-rememberpassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})',
 'tog-watchcreations' => '내가 만드는 문서와 내가 올린 파일을 주시문서 목록에 추가',
 'tog-watchdefault' => '내가 편집하는 문서와 파일을 주시문서 목록에 추가',
 'tog-watchmoves' => '내가 이동하는 문서와 파일을 주시문서 목록에 추가',
@@ -462,12 +462,12 @@ $messages = array(
 'category-empty' => '이 분류에 속하는 문서나 자료가 없습니다.',
 'hidden-categories' => '{{PLURAL:$1|숨은 분류}}',
 'hidden-category-category' => '숨은 분류',
-'category-subcat-count' => '{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 하위 분류 $2개 가운데 $1개입니다.}}',
-'category-subcat-count-limited' => '이 분류에 하위 분류 $1개가 있습니다.',
-'category-article-count' => '{{PLURAL:$2|이 분류에는 문서 1개만이 속해 있습니다.|다음은 이 분류에 속하는 문서 $2개 가운데 $1개입니다.}}',
-'category-article-count-limited' => '이 분류에 문서 $1개가 있습니다.',
-'category-file-count' => '{{PLURAL:$2|이 분류에는 파일 1개만이 속해 있습니다.|다음은 이 분류에 속하는 파일 $2개 가운데 $1개입니다.}}',
-'category-file-count-limited' => '이 분류에 파일 $1개가 있습니다.',
+'category-subcat-count' => '{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|하위 분류}} $2개 가운데 $1개입니다.}}',
+'category-subcat-count-limited' => '이 분류에 {{PLURAL:$1|하위 분류}} $1개가 있습니다.',
+'category-article-count' => '{{PLURAL:$2|이 분류에는 문서 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|문서}} $2개 가운데 $1개입니다.}}',
+'category-article-count-limited' => '이 분류에 {{PLURAL:$1|문서}} $1개가 있습니다.',
+'category-file-count' => '{{PLURAL:$2|이 분류에는 파일 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|파일}} $2개 가운데 $1개입니다.}}',
+'category-file-count-limited' => '이 분류에 {{PLURAL:$1|파일}} $1개가 있습니다.',
 'listingcontinuesabbrev' => '(계속)',
 'index-category' => '색인된 문서',
 'noindex-category' => '색인에서 제외되는 문서',
@@ -534,8 +534,8 @@ $messages = array(
 'create-this-page' => '이 문서 만들기',
 'delete' => '삭제',
 'deletethispage' => '이 문서 삭제하기',
-'undelete_short' => '편집 $1개 되살리기',
-'viewdeleted_short' => '삭제된 편집 $1개 보기',
+'undelete_short' => '{{PLURAL:$1|편집 $1개}} 되살리기',
+'viewdeleted_short' => '{{PLURAL:$1|삭제된 편집 $1개}} 보기',
 'protect' => '보호',
 'protect_change' => '보호 수준 바꾸기',
 'protectthispage' => '이 문서 보호하기',
@@ -563,7 +563,7 @@ $messages = array(
 'redirectedfrom' => '($1에서 넘어옴)',
 'redirectpagesub' => '넘겨주기 문서',
 'lastmodifiedat' => '이 문서는 $1 $2에 마지막으로 바뀌었습니다.',
-'viewcount' => '이 문서는 $1번 읽혔습니다.',
+'viewcount' => '이 문서는 {{PLURAL:$1|$1번}} 읽혔습니다.',
 'protectedpage' => '보호된 문서',
 'jumpto' => '이동:',
 'jumptonavigation' => '둘러보기',
@@ -574,7 +574,7 @@ $messages = array(
 
 $1',
 'pool-timeout' => '잠금 대기 중 타임아웃',
-'pool-queuefull' => '풀 큐가 가득 찼습니다.',
+'pool-queuefull' => '풀 큐가 가득 찼습니다',
 'pool-errorunknown' => '알 수 없는 오류',
 
 # 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) and the disambiguation template definition (see disambiguations).
@@ -607,14 +607,14 @@ $1',
 
 'ok' => '확인',
 'retrievedfrom' => '원본 주소 "$1"',
-'youhavenewmessages' => '다른 사용자가 $1에 글을 남겼습니다. ($2)',
+'youhavenewmessages' => '다른 사용자가 $1에 글을 남겼습니다. ($2)',
 'newmessageslink' => '사용자 토론',
 'newmessagesdifflink' => '마지막 바뀐 내용',
-'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1에 글을 남겼습니다. ($2)',
-'youhavenewmessagesmanyusers' => '여러 사용자가 $1에 글을 남겼습니다. ($2)',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1에 글을 남겼습니다. ($2)',
+'youhavenewmessagesmanyusers' => '여러 사용자가 $1에 글을 남겼습니다. ($2)',
 'newmessageslinkplural' => '{{PLURAL:$1|사용자 토론}}',
 'newmessagesdifflinkplural' => '마지막 {{PLURAL:$1|바뀐 내용}}',
-'youhavenewmessagesmulti' => '다른 사용자가 $1란에 글을 남겼습니다.',
+'youhavenewmessagesmulti' => '다른 사용자가 $1에 글을 남겼습니다',
 'editsection' => '편집',
 'editold' => '편집',
 'viewsourceold' => '내용 보기',
@@ -628,7 +628,7 @@ $1',
 'collapsible-expand' => '펼치기',
 'thisisdeleted' => '$1을 보거나 되살리겠습니까?',
 'viewdeleted' => '$1을 보겠습니까?',
-'restorelink' => '삭제된 편집 $1개',
+'restorelink' => '{{PLURAL:$1|삭제된 편집 $1개}}',
 'feedlinks' => '피드:',
 'feed-invalid' => '잘못된 구독 피드 방식입니다.',
 'feed-unavailable' => '피드 서비스는 제공하지 않습니다',
@@ -764,7 +764,7 @@ $2',
 'yourname' => '사용자 이름:',
 'yourpassword' => '비밀번호:',
 'yourpasswordagain' => '비밀번호 다시 입력:',
-'remembermypassword' => '이 컴퓨터에서 로그인 상태를 저장하기 (최대 $1일)',
+'remembermypassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})',
 'securelogin-stick-https' => '로그인 후에도 HTTPS 연결 상태를 유지합니다',
 'yourdomainname' => '도메인 이름:',
 'password-change-forbidden' => '이 위키에서 비밀번호를 바꿀 수 없습니다.',
@@ -803,8 +803,8 @@ $2',
 'loginsuccesstitle' => '로그인 성공',
 'loginsuccess' => "'''{{SITENAME}}에 \"\$1\" 계정으로 로그인했습니다.'''",
 'nosuchuser' => '"$1" 사용자가 존재하지 않습니다.
-사용자 이름은 대소문자를 구별합니다. 철자가 맞는지 확인해주세요.
-[[Special:UserLogin/signup|새 계정을 만들 수도 있습니다]].',
+사용자 이름은 대소문자를 구별합니다.
+철자가 맞는지 확인해주세요. [[Special:UserLogin/signup|새 계정을 만들 수도 있습니다]].',
 'nosuchusershort' => '이름이 "$1"인 사용자는 없습니다.
 철자가 맞는지 확인하세요.',
 'nouserspecified' => '사용자 이름을 입력하지 않았습니다.',
@@ -813,7 +813,7 @@ $2',
 다시 시도하세요.',
 'wrongpasswordempty' => '비밀번호를 입력하지 않았습니다.
 다시 시도하세요.',
-'passwordtooshort' => '비밀번호는 $1 문자 이상이어야 합니다.',
+'passwordtooshort' => '비밀번호는 {{PLURAL:$1|$1 글자}} 이상이어야 합니다.',
 'password-name-match' => '비밀번호는 사용자 이름과 반드시 달라야 합니다.',
 'password-login-forbidden' => '이 사용자 이름과 비밀번호는 사용할 수 없습니다.',
 'mailmypassword' => '새 비밀번호를 이메일로 보내기',
@@ -821,12 +821,12 @@ $2',
 'passwordremindertext' => '$1 IP 주소에서 누군가가 아마 자신이 {{SITENAME}} ($4)의 새 비밀번호를 요청했습니다.
 "$2" 사용자의 임시 비밀번호는 "$3"로 설정되었습니다. 이것이 자신이 의도한 바라면
 지금 로그인하여 새로운 비밀번호를 만드세요.
-임시 비밀번호는 $5일 후에 만료됩니다.
+임시 비밀번호는 {{PLURAL:$5|$5일}} 후에 만료됩니다.
 
 이 요청을 다른 사람이 했거나 이전 비밀번호를 기억해 내서 바꿀 필요가 없으면
 이 메시지를 무시하고 이전 비밀번호를 계속 사용할 수 있습니다.',
 'noemail' => '"$1" 사용자는 이메일 주소를 등록하지 않았습니다.',
-'noemailcreate' => '바른 이메일 주소를 제공해야 합니다.',
+'noemailcreate' => '바른 이메일 주소를 제공해야 합니다.',
 'passwordsent' => '"$1" 계정의 새로운 비밀번호를 이메일로 보냈습니다.
 비밀번호를 받고 다시 로그인해 주세요.',
 'blocked-mailpassword' => '당신의 IP 주소는 편집을 할 수 없게 차단되어 있어서 악용하지 못하도록 비밀번호 되살리기 기능 사용이 금지됩니다.',
@@ -835,7 +835,7 @@ $2',
 'throttled-mailpassword' => '비밀번호 재설정 이메일을 이미 최근 {{PLURAL:$1|$1시간}} 안에 보냈습니다.
 악용을 방지하기 위해 비밀번호 재설정 메일은 {{PLURAL:$1|$1시간}}마다 오직 하나씩만 보낼 수 있습니다.',
 'mailerror' => '메일 보내기 오류: $1',
-'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 계정을 $1개 만들어, 계정 만들기 한도를 초과하였습니다.
+'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 {{PLURAL:$1|계정 $1개}}를 만들어, 계정 만들기 한도를 초과하였습니다.
 따라서 지금은 이 IP 주소로는 더 이상 계정을 만들 수 없습니다.',
 'emailauthenticated' => '이메일 주소는 $2 $3에 인증되었습니다.',
 'emailnotauthenticated' => '이메일 주소를 인증하지 않았습니다.
@@ -853,7 +853,7 @@ $2',
 지금 로그인하여 비밀번호를 바꾸십시오.
 
 실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.',
-'usernamehasherror' => '사용자 이름에는 해시 문자가 들어갈 수 없습니다.',
+'usernamehasherror' => '사용자 이름에는 해시 문자가 들어갈 수 없습니다',
 'login-throttled' => '로그인에 연속으로 실패하였습니다.
 잠시 후에 다시 시도해주세요.',
 'login-abort-generic' => '로그인에 실패했습니다 - 중지됨',
@@ -902,7 +902,7 @@ $2',
 
 $2
 
-이 {{PLURAL:$3|임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.
+{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.
 이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,
 원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고
 이전의 비밀번호를 계속 사용할 수 있습니다.',
@@ -941,7 +941,7 @@ $2
 'link_sample' => '링크 제목',
 'link_tip' => '안쪽 링크',
 'extlink_sample' => 'http://www.example.com 사이트 이름',
-'extlink_tip' => '바깥 링크 (주소 앞에 http://가 있어야 합니다.)',
+'extlink_tip' => '바깥 링크 (주소 앞에 http://가 있어야 합니다)',
 'headline_sample' => '제목',
 'headline_tip' => '2단계 문단 제목',
 'nowiki_sample' => '여기에 위키 문법을 사용하지 않을 글을 적어 주세요',
@@ -1010,7 +1010,7 @@ $1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대
 'loginreqtitle' => '로그인 필요',
 'loginreqlink' => '로그인',
 'loginreqpagetext' => '다른 문서를 보기 위해서는 $1해야 합니다.',
-'accmailtitle' => '비밀번호를 보냈습니다.',
+'accmailtitle' => '비밀번호를 보냈습니다',
 'accmailtext' => '[[User talk:$1|$1]] 사용자의 비밀번호가 임의로 만들어져 $2로 전송되었습니다.
 
 새 비밀번호는 로그인한 후 [[Special:ChangePassword|비밀번호를 바꿀]] 수 있습니다.',
@@ -1049,9 +1049,9 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 '''아직 저장하지 않았습니다!'''",
 'userjspreview' => "'''사용자 자바스크립트 미리 보기입니다.'''
 '''아직 저장하지 않았습니다!'''",
-'sitecsspreview' => "'''ì\9d´ CSSì\9d\98 ë¯¸ë¦¬ ë³´ê¸°ì\9d¼ ë¿\90ì\9e\85ë\8b\88ë\8b¤.'''
+'sitecsspreview' => "'''이 CSS의 미리 보기입니다.'''
 '''아직 저장하지 않았습니다!'''",
-'sitejspreview' => "'''ì\9d´ ì\9e\90ë°\94ì\8a¤í\81¬ë¦½í\8a¸ ì½\94ë\93\9cì\9d\98 ë¯¸ë¦¬ ë³´ê¸°ì\9d¼ ë¿\90ì\9e\85ë\8b\88ë\8b¤.'''
+'sitejspreview' => "'''이 자바스크립트 코드의 미리 보기입니다.'''
 '''아직 저장하지 않았습니다!'''",
 'userinvalidcssjstitle' => "'''경고''': \"\$1\" 스킨은 없습니다.
 .css와 .js 문서의 제목은 {{ns:user}}:Foo/vector.css 처럼 소문자로 써야 합니다. {{ns:user}}:Foo/Vector.css 와 같이 대문자로 쓸 경우 작동하지 않습니다.",
@@ -1116,7 +1116,7 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'templatesusedsection' => '이 문단에서 사용하고 있는 {{PLURAL:$1|틀}}:',
 'template-protected' => '(보호됨)',
 'template-semiprotected' => '(준보호됨)',
-'hiddencategories' => '이 문서는 다음 숨은 분류 $1개에 속해 있습니다:',
+'hiddencategories' => '이 문서는 다음 {{PLURAL:$1|숨은 분류 1개|숨은 분류 $1개}}에 속해 있습니다:',
 'edittools' => '<!-- 이 문서는 편집 창과 파일 올리기 창에 출력됩니다. -->',
 'nocreatetext' => '{{SITENAME}}에서 새로운 문서를 만드는 것은 제한되어 있습니다.
 이미 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그인하거나 계정을 만들 수 있습니다]].',
@@ -1155,7 +1155,7 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''경고:''' 이 문서는 너무 많은 파서 함수를 포함하고 있습니다.
 
-$2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
+$2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개를 쓰고 있습니다}}.",
 'expensive-parserfunction-category' => '느린 파서 함수 호출을 너무 많이 하는 문서',
 'post-expand-template-inclusion-warning' => "'''경고:''' 틀 포함 크기가 너무 큽니다.
 일부 틀은 포함되지 않을 수 있습니다.",
@@ -1176,7 +1176,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 
 # "Undo" feature
 'undo-success' => '편집을 되돌릴 수 있습니다.
\8e¸ì§\91 ë\90\98ë\8f\8c리기를 ì\99\84ë£\8cí\95\98려면 ì\9d´ í\8e¸ì§\91ì\9d\84 ë\90\98ë\8f\8c리려면 ì\95\84ë\9e\98ì\9d\98 ë°\94ë\80\9c ì\82¬í\95­을 확인한 후 저장해주세요.',
\8e¸ì§\91 ë\90\98ë\8f\8c리기를 ì\99\84ë£\8cí\95\98려면 ì\9d´ í\8e¸ì§\91ì\9d\84 ë\90\98ë\8f\8c리려면 ì\95\84ë\9e\98ì\9d\98 ë°\94ë\80\90 ë\82´ì\9a©을 확인한 후 저장해주세요.',
 'undo-failure' => '중간의 다른 편집과 충돌하여 이 편집을 되돌릴 수 없습니다.',
 'undo-norev' => '문서가 없거나 삭제되었기 때문에 편집을 되돌릴 수 없습니다.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]]) 의 $1판 편집을 되돌림',
@@ -1208,7 +1208,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'history-show-deleted' => '삭제된 것만',
 'histfirst' => '처음',
 'histlast' => '마지막',
-'historysize' => '($1 바이트)',
+'historysize' => '({{PLURAL:$1|1 바이트|$1 바이트}})',
 'historyempty' => '(비었음)',
 
 # Revision feed
@@ -1251,7 +1251,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 숨겨진 판과 이 판의 편집 비교를 할 수 있습니다. 자세한 내용은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 해당 숨김 기록]에서 찾아볼 수 있습니다.",
 'rev-delundel' => '보이기/숨기기',
 'rev-showdeleted' => '보이기',
-'revisiondelete' => 'í\8c\90 ì\82­ì \9c³µêµ¬',
+'revisiondelete' => 'í\8c\90 ì\82­ì \9c\90\98ì\82´ë¦¬ê¸°',
 'revdelete-nooldid-title' => '대상 판이 잘못되었습니다.',
 'revdelete-nooldid-text' => '이 기능을 수행할 특정 판을 제시하지 않았거나 해당 판이 없습니다. 또는 현재 판을 숨기려 하고 있을 수도 있습니다.',
 'revdelete-nologtype-title' => '기록의 종류가 제시되지 않았습니다.',
@@ -1264,7 +1264,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'revdelete-selected' => "'''[[:$1]]의 {{PLURAL:$2|선택한 판}}:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|선택한 기록}}:'''",
 'revdelete-text' => "'''삭제된 판과 기록은 문서 역사와 기록에 계속 나타나지만, 내용은 공개되지 않을 것입니다.'''
-{{SITENAME}}ì\9d\98 ë\8b¤ë¥¸ ê´\80리ì\9e\90ë\8a\94 ë\8b¤ë¥¸ ì \9cí\95\9cì\9d´ ì\84¤ì \95ë\90\98ì\96´ ì\9e\88ì§\80 ì\95\8aë\8a\94 í\95\9c, ì\88¨ê²¨ì§\84 ë\82´ì\9a©ì\9d\84 ë³¼ ì\88\98 ì\9e\88ê³ , ê°\99ì\9d\80 ë\8f\84구를 ì\9d´ì\9a©í\95´ ë³µêµ¬í\95  수 있습니다.",
+{{SITENAME}}ì\9d\98 ë\8b¤ë¥¸ ê´\80리ì\9e\90ë\8a\94 ë\8b¤ë¥¸ ì \9cí\95\9cì\9d´ ì\84¤ì \95ë\90\98ì\96´ ì\9e\88ì§\80 ì\95\8aë\8a\94 í\95\9c, ì\88¨ê²¨ì§\84 ë\82´ì\9a©ì\9d\84 ë³¼ ì\88\98 ì\9e\88ê³ , ê°\99ì\9d\80 ë\8f\84구를 ì\9d´ì\9a©í\95´ ë\90\98ì\82´ë¦´ 수 있습니다.",
 'revdelete-confirm' => '이 작업을 수행하는 것의 결과를 알고 있으며, [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지 확인해주세요.',
 'revdelete-suppress-text' => "숨기기는 '''다음 경우에만''' 사용되어야 합니다:
 * 잠재적인 비방 정보
@@ -1281,7 +1281,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'revdelete-radio-set' => '예',
 'revdelete-radio-unset' => '아니오',
 'revdelete-suppress' => '문서 내용을 관리자에게도 보이지 않게 숨기기',
-'revdelete-unsuppress' => '복구ë\90\9c 판에 대한 제한을 해제',
+'revdelete-unsuppress' => 'ë\90\98ì\82´ë¦° 판에 대한 제한을 해제',
 'revdelete-log' => '이유:',
 'revdelete-submit' => '선택한 {{PLURAL:$1|판}}에 적용',
 'revdelete-success' => "'''판의 보이기 설정을 성공적으로 바꾸었습니다.'''",
@@ -1335,7 +1335,7 @@ $1",
 'mergehistory-go' => '합칠 수 있는 편집 보기',
 'mergehistory-submit' => '문서 역사 합치기',
 'mergehistory-empty' => '합칠 수 있는 판이 없습니다.',
-'mergehistory-success' => '[[:$1]] 문서의  $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.',
+'mergehistory-success' => '[[:$1]] 문서의 {{PLURAL:$3|판}} $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.',
 'mergehistory-fail' => '문서 역사 합치기 명령을 수행할 수 없습니다. 문서와 시간 변수를 다시 확인하십시오.',
 'mergehistory-no-source' => '원본인 $1 문서가 존재하지 않습니다.',
 'mergehistory-no-destination' => '대상인 $1 문서가 존재하지 않습니다.',
@@ -1361,9 +1361,9 @@ $1",
 'compareselectedversions' => '선택한 판을 비교하기',
 'showhideselectedversions' => '선택한 판을 보이기/숨기기',
 'editundo' => '편집 취소',
-'diff-multi' => '({{PLURAL:$2|한 사용자의|사용자 $2명의}} 중간의 편집 $1개 숨겨짐)',
-'diff-multi-manyusers' => '({{PLURAL:$2|한 사용자의|사용자 $2명 이상의}} 중간의 편집 $1개 숨겨짐)',
-'difference-missing-revision' => '문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 없습니다.
+'diff-multi' => '({{PLURAL:$2|한 사용자의|사용자 $2명의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)',
+'diff-multi-manyusers' => '({{PLURAL:$2|한 사용자의|사용자 $2명 이상의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)',
+'difference-missing-revision' => '문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 {{PLURAL:$2|없습니다}}.
 
 이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 비교 링크로 인해 발생합니다.
 자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.',
@@ -1379,11 +1379,11 @@ $1",
 'notitlematches' => '해당하는 제목 없음',
 'textmatches' => '문서 내용 일치',
 'notextmatches' => '해당하는 문서 없음',
-'prevn' => '이전 $1개',
-'nextn' => '다음 $1개',
-'prevn-title' => '이전 결과 $1개',
-'nextn-title' => '다음 결과 $1개',
-'shown-title' => '쪽마다 ê²°ê³¼ $1ê°\9cì\94© ë³´ì\9d´ê¸°',
+'prevn' => '이전 {{PLURAL:$1|$1개}}',
+'nextn' => '다음 {{PLURAL:$1|$1개}}',
+'prevn-title' => '이전 {{PLURAL:$1|결과}} $1개',
+'nextn-title' => '다음 {{PLURAL:$1|결과}} $1개',
+'shown-title' => '쪽마다 {{PLURAL:$1|ê²°ê³¼}} $1ê°\9cì\94© ë³´ê¸°',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) 보기',
 'searchmenu-legend' => '찾기 설정',
 'searchmenu-exists' => "'''이 위키에 \"[[:\$1]]\"의 이름을 가진 문서가 있습니다.'''",
@@ -1400,8 +1400,8 @@ $1",
 'searchprofile-images-tooltip' => '파일 찾기',
 'searchprofile-everything-tooltip' => '토론 문서를 포함한 모든 문서 찾기',
 'searchprofile-advanced-tooltip' => '다음 설정한 이름공간에서 찾기',
-'search-result-size' => '$1 ($2 단어)',
-'search-result-category-size' => '문서 {{PLURAL:$1|1|$1}}개, 하위 분류 {{PLURAL:$2|1|$2}}개, 파일 {{PLURAL:$3|1|$3}}',
+'search-result-size' => '$1 ({{PLURAL:$2|1 단어|$2 단어}})',
+'search-result-category-size' => '{{PLURAL:$1|문서 1개|문서 $1개}}, {{PLURAL:$2|하위 분류 1개|하위 분류 $2개}}, {{PLURAL:$3|파일 1개|파일 $3개}}',
 'search-result-score' => '유사도: $1%',
 'search-redirect' => '($1에서 넘어옴)',
 'search-section' => '($1 문단)',
@@ -1414,9 +1414,9 @@ $1",
 'searcheverything-enable' => '모든 이름공간에서 찾기',
 'searchrelated' => '관련',
 'searchall' => '모두',
-'showingresults' => '<strong>$2</strong>번 부터의 <strong>결과 $1개</strong>입니다.',
-'showingresultsnum' => "'''$2'''번 부터의 '''결과 $3개''' 입니다.",
-'showingresultsheader' => "'''$4''' 검색어에 대하여 결과 '''$3'''개 중 {{PLURAL:$5|'''$1'''개|'''$1 - $2'''번째}}를 보여 주고 있습니다.",
+'showingresults' => "'''$2'''번 부터의 {{PLURAL:$1|결과 '''1'''개|결과 '''$1'''개}}입니다.",
+'showingresultsnum' => "'''$2'''번 부터의 {{PLURAL:$3|결과 '''1'''개|결과 '''$3'''개}} 입니다.",
+'showingresultsheader' => "'''$4''' 검색어에 대하여 {{PLURAL:$5|결과 '''$3'''개 중 '''$1'''개|결과 '''$3'''개 중 '''$1 - $2'''번째}}를 보여 주고 있습니다",
 'nonefound' => "'''참고''': 몇개의 이름공간만 기본 찾을 범위입니다. 토론이나 틀 등의 모든 자료를 찾하기 위해서는 접두어로 '''all:''' 어떤 이름공간을 위해서는 접두어로 그 이름공간을 쓸 수 있습니다.",
 'search-nonefound' => '찾기 결과가 없습니다.',
 'powersearch' => '고급 찾기',
@@ -1425,7 +1425,7 @@ $1",
 'powersearch-redir' => '넘겨주기 목록',
 'powersearch-field' => '찾기',
 'powersearch-togglelabel' => '확인:',
-'powersearch-toggleall' => '모두 선택',
+'powersearch-toggleall' => '모두',
 'powersearch-togglenone' => '없음',
 'search-external' => '바깥 찾기',
 'searchdisabled' => '{{SITENAME}} 찾기 기능이 비활성화되어 있습니다.
@@ -1481,7 +1481,7 @@ $1",
 'stub-threshold' => '링크를 <a href="#" class="stub">토막글</a> 형식으로 보여줄 문서 크기 (바이트 수):',
 'stub-threshold-disabled' => '비활성화됨',
 'recentchangesdays' => '최근 바뀜에 보여줄 날짜 수:',
-'recentchangesdays-max' => '최대 $1',
+'recentchangesdays-max' => '최대 $1{{PLURAL:$1|일}}',
 'recentchangescount' => '기본으로 보여줄 편집 수:',
 'prefs-help-recentchangescount' => '이 설정은 최근 바뀜, 문서 역사와 기록에 적용됩니다.',
 'prefs-help-watchlist-token' => '아래에 비밀 값을 넣으면 주시문서 목록에 대한 RSS 피드가 만들어집니다.
@@ -1515,7 +1515,7 @@ $1",
 'prefs-custom-js' => '사용자 자바스크립트',
 'prefs-common-css-js' => '모든 스킨에 대한 공통 CSS/자바스크립트:',
 'prefs-reset-intro' => '이 사이트의 기본값으로 환경 설정을 되돌릴 수 있습니다.
³µêµ¬í\95  수 없습니다.',
\90\98ë\8f\8c릴 수 없습니다.',
 'prefs-emailconfirm-label' => '이메일 인증:',
 'prefs-textboxsize' => '편집창의 크기',
 'youremail' => '이메일:',
@@ -1532,7 +1532,7 @@ $1",
 'badsig' => '서명이 잘못되었습니다.
 HTML 태그를 확인하세요.',
 'badsiglength' => '서명이 너무 깁니다.
-서명은 $1보다 짧아야 합니다.',
+서명은 $1 {{PLURAL:$1|글자}}보다 짧아야 합니다.',
 'yourgender' => '성별:',
 'gender-unknown' => '무응답',
 'gender-male' => '남성',
@@ -1636,13 +1636,13 @@ HTML 태그를 확인하세요.',
 'right-writeapi' => 'API 작성',
 'right-delete' => '문서 삭제',
 'right-bigdelete' => '문서 역사가 긴 문서를 삭제',
-'right-deletelogentry' => '특정 기록 항목을 삭제 및 복구',
-'right-deleterevision' => '문서의 특정 판을 삭제 및 복구',
+'right-deletelogentry' => '특정 기록 항목을 삭제하고 되살리기',
+'right-deleterevision' => '문서의 특정 판을 삭제하고 되살리기',
 'right-deletedhistory' => '삭제된 문서의 내용을 제외한 역사를 보기',
 'right-deletedtext' => '삭제된 문서의 내용과 편집상의 차이를 보기',
 'right-browsearchive' => '삭제된 문서 찾기',
-'right-undelete' => 'ì\82­ì \9cë\90\9c ë¬¸ì\84\9c ë³µêµ¬',
-'right-suppressrevision' => 'ê´\80리ì\9e\90ë\8f\84 ë³´ì§\80 ëª»í\95\98ë\8f\84ë¡\9d ì\88¨ê²¨ì§\84 í\8c\90ì\9d\98 í\99\95ì\9d¸ ë°\8f ë³µêµ¬',
+'right-undelete' => 'ì\82­ì \9cë\90\9c ë¬¸ì\84\9c ë\90\98ì\82´ë¦¬ê¸°',
+'right-suppressrevision' => 'ê´\80리ì\9e\90ë\8f\84 ë³´ì§\80 ëª»í\95\98ë\8f\84ë¡\9d ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³  ë\90\98ì\82´ë¦¬ê¸°',
 'right-suppressionlog' => '숨겨진 기록을 보기',
 'right-block' => '다른 사용자를 편집을 못하도록 차단',
 'right-blockemail' => '다른 사용자가 이메일을 보내지 못하도록 차단',
@@ -1701,8 +1701,8 @@ HTML 태그를 확인하세요.',
 'action-deleterevision' => '이 판을 삭제',
 'action-deletedhistory' => '이 문서의 삭제된 기여의 역사 보기',
 'action-browsearchive' => '삭제된 문서 찾기',
-'action-undelete' => 'ì\9d´ ë¬¸ì\84\9c를 ë³µêµ¬í\95\98기',
-'action-suppressrevision' => 'ì\9d´ ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³  ë³µêµ¬í\95 ',
+'action-undelete' => 'ì\9d´ ë¬¸ì\84\9c를 ë\90\98ì\82´ë¦¬기',
+'action-suppressrevision' => 'ì\9d´ ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³  ë\90\98ì\82´ë¦´',
 'action-suppressionlog' => '비공개 기록 보기',
 'action-block' => '이 사용자를 편집하지 못하도록 차단',
 'action-protect' => '이 문서의 보호 설정을 바꾸기',
@@ -1745,7 +1745,7 @@ HTML 태그를 확인하세요.',
 'minoreditletter' => '잔글',
 'newpageletter' => '새글',
 'boteditletter' => '봇',
-'number_of_watching_users_pageview' => '[$1명이 주시하고 있음]',
+'number_of_watching_users_pageview' => '[{{PLURAL:$1|사용자}} $1명이 주시하고 있음]',
 'rc_categories' => '다음 분류로 제한 ("|"로 구분)',
 'rc_categories_any' => '모두',
 'rc-change-size-new' => '바꾼 후 $1 {{PLURAL:$1|바이트}}',
@@ -1811,8 +1811,8 @@ HTML 태그를 확인하세요.',
 'filetype-bad-ie-mime' => '인터넷 익스플로러가 잠재적으로 위험한 파일 형식으로 판단되어 사용이 금지된 "$1"로 인식할 수 있기 때문에 이 파일을 올릴 수 없습니다.',
 'filetype-unwanted-type' => "'''\".\$1\"''' 확장자는 추천하지 않습니다.
 추천하는 {{PLURAL:\$3|파일 확장자}}는 \$2입니다.",
-'filetype-banned-type' => '{{PLURAL:$3$4}}\'\'\'".$1"\'\'\' 형식의 파일은 올릴 수 없습니다.
-$2 형식만 사용할 수 있습니다.',
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|형식의 파일은 올릴 수 없습니다}}.
+$2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.',
 'filetype-missing' => '파일에 확장자(".jpg" 등)가 없습니다.',
 'empty-file' => '올린 파일이 비어 있습니다.',
 'file-too-large' => '올리려는 파일이 너무 큽니다.',
@@ -1945,7 +1945,7 @@ URL이 올바르고 접근 가능한지를 확인하고 다시 시도해주세
 'backend-fail-connect' => '"$1" 저장 백엔드에 접속하지 못했습니다.',
 'backend-fail-internal' => '"$1" 저장 백엔드에 알 수 없는 오류가 발생했습니다.',
 'backend-fail-contenttype' => '"$1"에 저장하기 위한 파일의 내용 유형을 판별하지 못했습니다.',
-'backend-fail-batchsize' => 'ì \80ì\9e¥ ë°±ì\97\94ë\93\9cì\97\90ì\84\9c í\8c\8cì\9d¼ {{PLURAL:$1|ì\9e\91ì\97\85}} $1ê°\9cê°\80 ì\8c\93ì\97¬ ì\9e\88ì\8aµë\8b\88ë\8b¤. í\95\9cê³\84ë\8a\94 $2개입니다.',
+'backend-fail-batchsize' => 'ì \80ì\9e¥ ë°±ì\97\94ë\93\9cì\97\90ì\84\9c í\8c\8cì\9d¼ {{PLURAL:$1|ì\9e\91ì\97\85}} $1ê°\9cê°\80 ì\8c\93ì\98\80ì\8aµë\8b\88ë\8b¤. í\95\9cê³\84ë\8a\94 {{PLURAL:$2|ì\9e\91ì\97\85}} $2개입니다.',
 'backend-fail-usable' => '파일 읽기/쓰기 권한이 없거나 저장 위치가 빠졌기 때문에 "$1" 파일을 읽거나 쓸 수 없습니다.',
 
 # File journal errors
@@ -2059,14 +2059,14 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filehist-comment' => '내용',
 'filehist-missing' => '파일을 찾을 수 없음',
 'imagelinks' => '이 파일을 사용하는 문서',
-'linkstoimage' => '다음 문서 $1개가 이 파일을 사용하고 있습니다:',
-'linkstoimage-more' => '$1개 이상의 문서가 이 파일을 가리키고 있습니다.
-다음 목록은 이 파일을 가리키는 처음 $1개 문서만 보여주고 있습니다.
-이 파일을 가리키는 ëª¨ë\93  ë¬¸ì\84\9c를 ë³´ë ¤ë©´ [[Special:WhatLinksHere/$2|ì\97¬ê¸°]]를 ì°¸ê³ í\95´ ì£¼ì\8b­ì\8b\9cì\98¤.',
+'linkstoimage' => '다음 {{PLURAL:$1|문서 $1개}}가 이 파일을 가리키고 있습니다:',
+'linkstoimage-more' => '$1개 이상의 {{PLURAL:$1|문서}}가 이 파일을 가리키고 있습니다.
+다음 목록은 이 파일을 {{PLURAL:$1|가리키는 처음 문서 $1개}}만 보여주고 있습니다.
+이 파일을 가리키는 [[Special:WhatLinksHere/$2|모ë\93  ë¬¸ì\84\9c ëª©ë¡\9d]]ì\9d\84 ë³¼ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.',
 'nolinkstoimage' => '이 파일을 사용하는 문서가 없습니다.',
 'morelinkstoimage' => '이 파일이 쓰이고 있는 문서 목록 [[Special:WhatLinksHere/$1|더 보기]].',
 'linkstoimage-redirect' => '$1 (파일 넘겨주기) $2',
-'duplicatesoffile' => '다음 파일 $1개가 이 파일과 중복됩니다 ([[Special:FileDuplicateSearch/$2|자세한 정보]]):',
+'duplicatesoffile' => '다음 {{PLURAL:$1|파일 $1개}}가 이 파일과 중복됩니다 ([[Special:FileDuplicateSearch/$2|자세한 정보]]):',
 'sharedupload' => '이 파일은 $1으로부터 왔고, 다른 프로젝트에서 사용하고 있을 가능성이 있습니다.',
 'sharedupload-desc-there' => '이 파일은 $1에 있으며, 다른 프로젝트에서 사용하고 있을 가능성이 있습니다.
 [$2 해당 파일]에 대한 자세한 정보를 확인해주세요.',
@@ -2112,7 +2112,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 ** 저작권 침해
 ** 중복된 파일',
 'filedelete-edit-reasonlist' => '삭제 이유 편집',
-'filedelete-maintenance' => 'ì \90ê²\80 ì¤\91ì\97\90ë\8a\94 ì\9e\84ì\8b\9cì \81ì\9c¼ë¡\9c ì\82­ì \9cì\99\80 ë³µêµ¬를 할 수 없습니다.',
+'filedelete-maintenance' => 'ì \90ê²\80 ì¤\91ì\97\90ë\8a\94 ì\9e\84ì\8b\9cì \81ì\9c¼ë¡\9c ì\82­ì \9cì\99\80 ë\90\98ì\82´ë¦¬ê¸°를 할 수 없습니다.',
 'filedelete-maintenance-title' => '파일을 삭제할 수 없습니다',
 
 # MIME search
@@ -2160,7 +2160,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'statistics-views-peredit' => '편집당 방문 횟수',
 'statistics-users' => '등록된 [[Special:ListUsers|사용자]]',
 'statistics-users-active' => '활동적인 사용자',
-'statistics-users-active-desc' => '최근 $1일 동안 활동한 사용자',
+'statistics-users-active-desc' => '최근 {{PLURAL:$1|$1일}} 동안 활동한 사용자',
 'statistics-mostpopular' => '가장 많이 읽힌 문서',
 
 'disambiguations' => '동음이의 문서를 가리키는 문서 목록',
@@ -2197,15 +2197,15 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'fewestrevisions' => '편집 역사가 짧은 문서 목록',
 
 # Miscellaneous special pages
-'nbytes' => '$1 바이트',
-'ncategories' => '분류 $1개',
+'nbytes' => '$1 {{PLURAL:$1|바이트}}',
+'ncategories' => '{{PLURAL:$1|분류}} $1개',
 'ninterwikis' => '{{PLURAL:$1|인터위키}} $1개',
-'nlinks' => '링크 $1개',
-'nmembers' => '문서 $1개',
-'nrevisions' => '편집 $1개',
-'nviews' => '$1회 읽음',
-'nimagelinks' => '문서 $1개에서 사용 중',
-'ntransclusions' => '문서 $1개에서 사용 중',
+'nlinks' => '{{PLURAL:$1|링크}} $1개',
+'nmembers' => '{{PLURAL:$1|문서}} $1개',
+'nrevisions' => '{{PLURAL:$1|판}} $1개',
+'nviews' => '$1번 {{PLURAL:$1|읽음}}',
+'nimagelinks' => '{{PLURAL:$1|문서}} $1개에서 사용 중',
+'ntransclusions' => '{{PLURAL:$1|문서}} $1개에서 사용 중',
 'specialpage-empty' => '명령에 대한 결과가 없습니다.',
 'lonelypages' => '외톨이 문서 목록',
 'lonelypagestext' => '{{SITENAME}}에서 다른 모든 문서에서 링크되거나 틀로 포함되지 않은 문서의 목록입니다.',
@@ -2247,7 +2247,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'listusers' => '사용자 목록',
 'listusers-editsonly' => '기여가 있는 사용자만 보기',
 'listusers-creationsort' => '계정 등록일 순으로 정렬',
-'usereditcount' => '편집 $1회',
+'usereditcount' => '{{PLURAL:$1|편집}} $1회',
 'usercreated' => '$1 $2에 계정 {{GENDER:$3|만들어짐}}',
 'newpages' => '새 문서 목록',
 'newpages-username' => '사용자 이름:',
@@ -2261,8 +2261,8 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'notargettext' => '기능을 수행할 대상 문서나 사용자를 지정하지 않았습니다.',
 'nopagetitle' => '해당 문서 없음',
 'nopagetext' => '찾는 문서가 존재하지 않습니다.',
-'pager-newer-n' => '이전 $1개',
-'pager-older-n' => '다음 $1개',
+'pager-newer-n' => '{{PLURAL:$1|다음 1개|다음 $1개}}',
+'pager-older-n' => '{{PLURAL:$1|이전 1개|이전 $1개}}',
 'suppress' => '오버사이트',
 'querypage-disabled' => '이 특수 문서는 성능상의 이유로 비활성화되었습니다.',
 
@@ -2311,7 +2311,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 
 # Special:Categories
 'categories' => '분류 목록',
-'categoriespagetext' => '{{PLURAL:$1}}문서나 자료를 담고 있는 분류 목록입니다.
+'categoriespagetext' => '문서나 자료를 {{PLURAL:$1|포함하고 있는 분류}} 목록입니다.
 [[Special:UnusedCategories|사용되지 않는 분류]]는 여기에 보이지 않습니다.
 [[Special:WantedCategories|필요한 분류]]도 참고하세요.',
 'categoriesfrom' => '다음으로 시작하는 분류를 보여주기:',
@@ -2342,8 +2342,8 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 
 # Special:ActiveUsers
 'activeusers' => '활동적인 사용자 목록',
-'activeusers-intro' => '다음은 최근 $1 동안 활동한 사용자의 목록입니다.',
-'activeusers-count' => '최근 {{PLURAL:$3|1일|$3일}} 사이의 {{PLURAL:$1|활동}} $1회',
+'activeusers-intro' => '다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.',
+'activeusers-count' => '최근 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회',
 'activeusers-from' => '다음으로 시작하는 사용자를 보기:',
 'activeusers-hidebots' => '봇을 숨기기',
 'activeusers-hidesysops' => '관리자를 숨기기',
@@ -2426,14 +2426,14 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'notanarticle' => '문서가 아님',
 'notvisiblerev' => '이 판은 삭제되었습니다.',
 'watchnochange' => '주어진 기간 중에 바뀐 주시문서가 없습니다.',
-'watchlist-details' => '토론을 제외하고 문서 $1개를 주시하고 있습니다.',
+'watchlist-details' => '토론을 제외하고 {{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
 'wlheader-enotif' => '* 이메일 알림 기능이 활성화되었습니다.',
 'wlheader-showupdated' => "* 마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보여집니다.",
 'watchmethod-recent' => '주시된 문서를 확인하고자 최근 편집을 확인',
 'watchmethod-list' => '최근 편집을 확인하고자 주시된 문서 확인',
-'watchlistcontains' => '문서 $1개를 주시하고 있습니다.',
+'watchlistcontains' => '{{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
 'iteminvalidname' => "'$1' 항목에 문제가 발생했습니다. 이름이 잘못되었습니다...",
-'wlnote' => "다음은 최근 '''$2'''시간 동안 바뀐 문서 '''$1'''개 입니다. ($3 $4 기준)",
+'wlnote' => "다음은 최근 {{PLURAL:$2|'''$2'''시간}} 동안 {{PLURAL:$1|바뀐 문서 '''$1'''개 입니다}}. ($3 $4 기준)",
 'wlshowlast' => '최근 $1시간 $2일 또는 $3 동안에 바뀐 문서',
 'watchlist-options' => '주시문서 목록 설정',
 
@@ -2445,18 +2445,18 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'enotif_mailer' => '{{SITENAME}} 자동 알림 메일',
 'enotif_reset' => '모든 문서를 방문한 것으로 표시하기',
 'enotif_impersonal_salutation' => '{{SITENAME}} 사용자',
-'enotif_subject_deleted' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 삭제했습니다',
-'enotif_subject_created' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 만들었습니다',
-'enotif_subject_moved' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 옮겼습니다',
-'enotif_subject_restored' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 복구했습니다',
-'enotif_subject_changed' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 바꾸었습니다',
-'enotif_body_intro_deleted' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 삭제했습니다. $3 에서 볼 수 있습니다.',
-'enotif_body_intro_created' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 만들었습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_body_intro_moved' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 옮겼습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_body_intro_restored' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 복구했습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_body_intro_changed' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 바꾸었습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_lastvisited' => '마지막으로 방문한 뒤 생긴 모든 바뀜 사항을 보려면 $1 을 보세요.',
-'enotif_lastdiff' => 'ì\9d´ ë°\94ë\80\90 ë\82´ì\9a©을 보려면 $1 을 보세요.',
+'enotif_subject_deleted' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|삭제했습니다}}',
+'enotif_subject_created' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|만들었습니다}}',
+'enotif_subject_moved' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|옮겼습니다}}',
+'enotif_subject_restored' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|되살렸습니다}}',
+'enotif_subject_changed' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|바꾸었습니다}}',
+'enotif_body_intro_deleted' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|삭제했으며}} $3 에서 볼 수 있습니다.',
+'enotif_body_intro_created' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|만들었으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_moved' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|옮겼으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_restored' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|되살렸으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_changed' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|바꾸었으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_lastvisited' => '마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1 을 보세요.',
+'enotif_lastdiff' => 'ì\9d´ ë°\94ë\80\9c을 보려면 $1 을 보세요.',
 'enotif_anon_editor' => '익명 사용자 $1',
 'enotif_body' => '$WATCHINGUSERNAME님,
 
@@ -2496,7 +2496,7 @@ $UNWATCHURL
 'exblank' => '빈 문서',
 'delete-confirm' => '"$1" 삭제',
 'delete-legend' => '삭제',
-'historywarning' => "'''경고:''' 삭제하려는 문서에 과거 편집 내역 약 $1개가 있습니다:",
+'historywarning' => "'''경고:''' 삭제하려는 문서에 이전 {{PLURAL:$1|편집 역사}} 약 $1개가 있습니다:",
 'confirmdeletetext' => '문서와 문서 역사를 삭제하려고 합니다.
 삭제하려는 문서가 맞는지, 이 문서를 삭제하는 것이 [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지를 확인해 주세요.',
 'actioncomplete' => '명령 완료',
@@ -2515,9 +2515,9 @@ $UNWATCHURL
 ** 저작권 침해
 ** 훼손 행위',
 'delete-edit-reasonlist' => '삭제 이유 편집',
-'delete-toobig' => '이 문서에는 편집 역사가 $1개 있습니다.
+'delete-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
 편집 역사가 긴 문서를 삭제하면 {{SITENAME}}에 큰 혼란을 줄 수 있기 때문에 삭제할 수 없습니다.',
-'delete-warning-toobig' => '이 문서에는 편집 역사가 $1개 있습니다.
+'delete-warning-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
 편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.
 주의해 주세요.',
 
@@ -2525,8 +2525,8 @@ $UNWATCHURL
 'rollback' => '편집 되돌리기',
 'rollback_short' => '되돌리기',
 'rollbacklink' => '되돌리기',
-'rollbacklinkcount' => '편집 $1회 되돌리기',
-'rollbacklinkcount-morethan' => '편집 $1회 이상 되돌리기',
+'rollbacklinkcount' => '{{PLURAL:$1|편집}} $1회 되돌리기',
+'rollbacklinkcount-morethan' => '{{PLURAL:$1|편집}} $1회 이상 되돌리기',
 'rollbackfailed' => '되돌리기 실패',
 'cantrollback' => '편집을 되돌릴 수 없습니다.
 문서를 편집한 사용자가 한명뿐입니다.',
@@ -2547,7 +2547,7 @@ $UNWATCHURL
 
 # Protect
 'protectlogpage' => '문서 보호 기록',
-'protectlogtext' => '아래의 목록은 문서 보호에 관한 바뀜 사항에 대한 기록입니다.
+'protectlogtext' => '아래의 목록은 문서 보호에 관한 바뀜에 대한 기록입니다.
 현재 보호된 문서의 목록에 대해서는 [[Special:ProtectedPages|보호된 문서 목록]]을 참고하세요.',
 'protectedarticle' => '사용자가 "[[$1]]" 문서를 보호했습니다',
 'modifiedarticleprotection' => '사용자가 "[[$1]]" 문서의 보호 설정을 바꿨습니다',
@@ -2621,49 +2621,49 @@ $UNWATCHURL
 'viewdeletedpage' => '삭제된 문서 보기',
 'undeletepagetext' => '다음 {{PLURAL:$1|문서는|문서 $1개는}} 삭제되었지만 아직 보관되어 있고 되살릴 수 있습니다.
 보관된 문서는 주기적으로 삭제될 것입니다.',
-'undelete-fieldset-title' => '문ì\84\9c ë³µêµ¬',
-'undeleteextrahelp' => "문ì\84\9c ì\97­ì\82¬ ì \84체를 ë³µêµ¬í\95\98려면 모든 체크박스의 선택을 해제하고 '''{{int:undeletebtn}}'''를 누르세요.
\8a¹ì \95í\95\9c ë²\84ì \84ë§\8c ë³µêµ¬í\95\98려면 ë³µêµ¬í\95\98려는 버전을 선택하고 '''{{int:undeletebtn}}'''를 누르세요.",
-'undeleterevisions' => '판 $1개 보관중',
-'undeletehistory' => '문서를 되살리면 모든 역사가 같이 복구됩니다.
-문ì\84\9cê°\80 ì\82­ì \9cë\90\9c ë\92¤ ê°\99ì\9d\80 ì\9d´ë¦\84ì\9d\98 ë¬¸ì\84\9cê°\80 ë§\8cë\93¤ì\96´ì¡\8cë\8b¤ë©´, ë³µêµ¬ë\90\98ë\8a\94 ì\97­ì\82¬ë\8a\94 ì§\80ê¸\88 ì\97­ì\82¬ì\9d\98 ê³¼ê±° 부분에 나타날 것입니다.',
-'undeleterevdel' => '복구í\95\98ë ¤ë\8a\94 ë¬¸ì\84\9cì\9d\98 ìµ\9cì\8b í\8c\90ì\9d´ ì\82­ì \9cë\90\98ì\96´ ì\9e\88ë\8a\94 ê²½ì\9a° ë¬¸ì\84\9c를 ë³µêµ¬ì\8b\9cí\82¬ 수 없습니다.
+'undelete-fieldset-title' => '문ì\84\9c ë\90\98ì\82´ë¦¬ê¸°',
+'undeleteextrahelp' => "문ì\84\9c ì\97­ì\82¬ ì \84체를 ë\90\98ì\82´ë¦¬려면 모든 체크박스의 선택을 해제하고 '''{{int:undeletebtn}}'''를 누르세요.
\8a¹ì \95í\95\9c ë²\84ì \84ë§\8c ë\90\98ì\82´ë¦¬ë ¤ë©´ ë\90\98ì\82´ë¦¬려는 버전을 선택하고 '''{{int:undeletebtn}}'''를 누르세요.",
+'undeleterevisions' => '{{PLURAL:$1|판}} $1개 보관 중',
+'undeletehistory' => '문서를 되살리면 모든 역사를 같이 되살립니다.
+문ì\84\9cê°\80 ì\82­ì \9cë\90\9c ë\92¤ ê°\99ì\9d\80 ì\9d´ë¦\84ì\9d\98 ë¬¸ì\84\9cê°\80 ë§\8cë\93¤ì\96´ì¡\8cë\8b¤ë©´, ë\90\98ì\82´ë\90\98ë\8a\94 ì\97­ì\82¬ë\8a\94 ì§\80ê¸\88 ì\97­ì\82¬ì\9d\98 ì\9d´ì \84 부분에 나타날 것입니다.',
+'undeleterevdel' => 'ë\90\98ì\82´ë¦¬ë ¤ë\8a\94 ë¬¸ì\84\9cì\9d\98 ìµ\9cì\8b í\8c\90ì\9d´ ì\82­ì \9cë\90\98ì\96´ ì\9e\88ë\8a\94 ê²½ì\9a° ë¬¸ì\84\9c를 ë\90\98ì\82´ë¦´ 수 없습니다.
 이러한 경우 삭제된 최신판 문서의 확인 상자를 선택 해제하거나 숨김을 해제해야 합니다.',
 'undeletehistorynoadmin' => '이 문서는 삭제되었습니다.
 삭제된 이유와 삭제되기 전에 이 문서를 편집한 사용자가 아래에 나와 있습니다.
 삭제된 문서의 내용을 보려면 관리자 권한이 필요합니다.',
 'undelete-revision' => '삭제된 $1 문서의 $4 $5 버전 (기여자 $3):',
 'undeleterevision-missing' => '해당 판이 잘못되었거나 존재하지 않습니다.
\9e\98못ë\90\9c ë§\81í\81¬ë¥¼ ë\94°ë\9d¼ì\99\94ê±°ë\82\98, í\8a¹ì \95 í\8c\90ì\9d´ ì\9d´ë¯¸ ë³µêµ¬ë\90\98거나 데이터베이스에서 제거되었을 수도 있습니다.',
\9e\98못ë\90\9c ë§\81í\81¬ë¥¼ ë\94°ë\9d¼ì\99\94ê±°ë\82\98, í\8a¹ì \95 í\8c\90ì\9d´ ì\9d´ë¯¸ ë\90\98ì\82´ë ¸거나 데이터베이스에서 제거되었을 수도 있습니다.',
 'undelete-nodiff' => '이전의 판이 없습니다.',
-'undeletebtn' => '복구',
+'undeletebtn' => 'ë\90\98ì\82´ë¦¬ê¸°',
 'undeletelink' => '보기/되살리기',
 'undeleteviewlink' => '보기',
 'undeletereset' => '초기화',
 'undeleteinvert' => '선택 반전',
 'undeletecomment' => '이유:',
-'undeletedrevisions' => '판 $1개를 복구했습니다',
-'undeletedrevisions-files' => '판 $1개와 파일 $2개를 복구했습니다.',
-'undeletedfiles' => '파일 $1개를 복구했습니다',
-'cannotundelete' => '복구í\95\98는 데 실패했습니다:
+'undeletedrevisions' => '{{PLURAL:$1|판 1개|판 $1개}}를 되살렸습니다',
+'undeletedrevisions-files' => '{{PLURAL:$1|판 1개|판 $1개}}와 {{PLURAL:$2|파일 1개|파일 $2개}}를 되살렸습니다',
+'undeletedfiles' => '{{PLURAL:$1|파일 1개|파일 $1개}}를 되살렸습니다',
+'cannotundelete' => 'ë\90\98ì\82´ë¦¬는 데 실패했습니다:
 $1',
-'undeletedpage' => "'''$1 ë¬¸ì\84\9c를 ë³µêµ¬í\96\88습니다.'''
+'undeletedpage' => "'''$1 ë¬¸ì\84\9c를 ë\90\98ì\82´ë ¸습니다.'''
 
-[[Special:Log/delete|ì\82­ì \9c ê¸°ë¡\9d]]ì\97\90ì\84\9c ìµ\9cê·¼ì\9d\98 ì\82­ì \9cì\99\80 ë³µêµ¬ 기록을 볼 수 있습니다.",
+[[Special:Log/delete|ì\82­ì \9c ê¸°ë¡\9d]]ì\97\90ì\84\9c ìµ\9cê·¼ì\9d\98 ì\82­ì \9cì\99\80 ë\90\98ì\82´ë¦¬ê¸° 기록을 볼 수 있습니다.",
 'undelete-header' => '최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.',
 'undelete-search-title' => '삭제된 문서 찾기',
 'undelete-search-box' => '삭제된 문서 찾기',
 'undelete-search-prefix' => '다음으로 시작하는 문서 보기:',
 'undelete-search-submit' => '찾기',
 'undelete-no-results' => '삭제된 문서 보존 자료에서 입력한 값에 맞는 문서가 없습니다.',
-'undelete-filename-mismatch' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 ë³µêµ¬í\95  수 없습니다: 파일 이름이 일치하지 않습니다.',
-'undelete-bad-store-key' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 ë³µêµ¬í\95  수 없습니다: 파일이 삭제되기 전에 사라졌습니다.',
+'undelete-filename-mismatch' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 ë\90\98ì\82´ë¦´ 수 없습니다: 파일 이름이 일치하지 않습니다.',
+'undelete-bad-store-key' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 ë\90\98ì\82´ë¦´ 수 없습니다: 파일이 삭제되기 전에 사라졌습니다.',
 'undelete-cleanup-error' => '사용되지 않는 보존된 파일 "$1"을 삭제하는 데 오류가 발생했습니다.',
-'undelete-missing-filearchive' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì¡´ì\9e¬í\95\98ì§\80 ì\95\8a기 ë\95\8c문ì\97\90 í\8c\8cì\9d¼ ë³´ì¡´ IDê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\84 ë³µêµ¬í\95  수 없습니다.
\9d´ë¯¸ ë³µêµ¬ë\90\98ì\97\88을 수 있습니다.',
-'undelete-error' => '문서 복구 중 오류',
-'undelete-error-short' => '파일 복구 오류: $1',
-'undelete-error-long' => 'í\8c\8cì\9d¼ì\9d\84 ë³µêµ¬í\95\98는 동안 오류가 발생했습니다:
+'undelete-missing-filearchive' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì¡´ì\9e¬í\95\98ì§\80 ì\95\8a기 ë\95\8c문ì\97\90 í\8c\8cì\9d¼ ë³´ì¡´ IDê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\84 ë\90\98ì\82´ë¦´ 수 없습니다.
\9d´ë¯¸ ë\90\98ì\82´ë ¸을 수 있습니다.',
+'undelete-error' => '문서를 되살리는 동안 오류',
+'undelete-error-short' => '파일을 되살리는 동안 오류: $1',
+'undelete-error-long' => 'í\8c\8cì\9d¼ì\9d\84 ë\90\98ì\82´ë¦¬는 동안 오류가 발생했습니다:
 
 $1',
 'undelete-show-file-confirm' => '정말 "<nowiki>$1</nowiki>" 파일의 삭제된 $2 $3 버전을 보시겠습니까?',
@@ -2820,7 +2820,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다.
 자동으로 차단된 IP 주소는 여기에 나오지 않습니다.
 [[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
-'unblocklogentry' => '사용자가 $1 사용자를 차단 해제했습니다.',
+'unblocklogentry' => '사용자가 $1 사용자를 차단 해제했습니다',
 'block-log-flags-anononly' => 'IP만 막음',
 'block-log-flags-nocreate' => '계정 만들기 금지됨',
 'block-log-flags-noautoblock' => '자동 차단 비활성화됨',
@@ -2876,7 +2876,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'lockfilenotwritable' => '데이터베이스 잠금 파일에 쓰기 권한이 없습니다.
 데이터베이스를 잠그거나 잠금 해제하려면, 웹 서버에서 이 파일의 쓰기 권한을 설정해야 합니다.',
 'databasenotlocked' => '데이터베이스가 잠겨 있지 않습니다.',
-'lockedbyandtime' => '($1이 $2 $3에 잠금)',
+'lockedbyandtime' => '({{GENDER:$1|$1}} 사용자가 $2 $3에 잠금)',
 
 # Move page
 'move-page' => '$1 이동',
@@ -2935,11 +2935,11 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'movepage-page-exists' => '이동할 수 없습니다. "$1" 문서가 이미 존재합니다.',
 'movepage-page-moved' => '"$1" 문서를 "$2" 문서로 이동했습니다.',
 'movepage-page-unmoved' => '"$1" 문서를 "$2" 문서로 이동할 수 없습니다.',
-'movepage-max-pages' => '문서를 최대 $1개 이동했습니다. 나머지 문서는 자동 이동하지 않습니다.',
+'movepage-max-pages' => '{{PLURAL:$1|문서}}를 최대 $1개 이동했습니다. 나머지 문서는 자동 이동하지 않습니다.',
 'movelogpage' => '이동 기록',
 'movelogpagetext' => '아래는 이동한 문서의 목록입니다.',
 'movesubpage' => '{{PLURAL:$1|하위 문서}}',
-'movesubpagetext' => '이 문서에는 다음 하위 문서 $1개가 있습니다.',
+'movesubpagetext' => '이 문서에는 다음 {{PLURAL:$1|하위 문서}} $1개가 있습니다.',
 'movenosubpage' => '이 문서에는 하위 문서가 존재하지 않습니다.',
 'movereason' => '이유:',
 'revertmove' => '되돌리기',
@@ -3041,9 +3041,9 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'importtext' => '원본 위키에서 [[Special:Export|내보내기]] 기능을 사용해 파일을 내려받으세요.
 그리고 당신의 컴퓨터에 저장해 둔 후 여기에 올려주세요.',
 'importstart' => '문서를 가져오는 중...',
-'import-revision-count' => ' $1개',
+'import-revision-count' => '{{PLURAL:$1|판}} $1개',
 'importnopages' => '가져올 문서가 없습니다.',
-'imported-log-entries' => '기록 항목 $1개를 가져왔습니다.',
+'imported-log-entries' => '{{PLURAL:$1|기록 항목}} $1개를 가져왔습니다.',
 'importfailed' => '가져오기 실패: <nowiki>$1</nowiki>',
 'importunknownsource' => '알 수 없는 가져오기 자료 유형',
 'importcantopen' => '파일을 열 수 없습니다.',
@@ -3080,10 +3080,10 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 # Import log
 'importlogpage' => '가져오기 기록',
 'importlogpagetext' => '다른 위키에서 가져온 문서 기록입니다.',
-'import-logentry-upload' => '사용자가 파일 올리기를 통해 [[$1]] 문서를 가져왔습니다.',
-'import-logentry-upload-detail' => ' $1개',
-'import-logentry-interwiki' => '$1 문서를 다른 위키에서 가져왔습니다.',
-'import-logentry-interwiki-detail' => '$2에서 판 $1개를 가져옴',
+'import-logentry-upload' => '사용자가 파일 올리기를 통해 [[$1]] 문서를 가져왔습니다',
+'import-logentry-upload-detail' => '{{PLURAL:$1|판}} $1개',
+'import-logentry-interwiki' => '$1 문서를 다른 위키에서 가져왔습니다',
+'import-logentry-interwiki-detail' => '$2에서 {{PLURAL:$1|판}} $1개를 가져왔습니다',
 
 # JavaScriptTest
 'javascripttest' => '자바스크립트 테스트',
@@ -3115,7 +3115,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-ca-protect' => '문서 보호하기',
 'tooltip-ca-unprotect' => '이 문서의 보호 설정을 바꾸기',
 'tooltip-ca-delete' => '문서 삭제하기',
-'tooltip-ca-undelete' => 'ì\82­ì \9cë\90\98기 ì \84ì\97\90 ì\9d´ ë¬¸ì\84\9cì\9d\98 ì\99\84ë£\8cí\95\9c í\8e¸ì§\91 ë³µêµ¬í\95\98기',
+'tooltip-ca-undelete' => 'ì\82­ì \9cë\90\98기 ì \84ì\97\90 ì\9d´ ë¬¸ì\84\9cì\9d\98 ì\99\84ë£\8cí\95\9c í\8e¸ì§\91 ë\90\98ì\82´ë¦¬기',
 'tooltip-ca-move' => '문서 이동하기',
 'tooltip-ca-watch' => '이 문서를 주시문서 목록에 추가합니다.',
 'tooltip-ca-unwatch' => '이 문서를 주시문서 목록에서 제거합니다.',
@@ -3321,7 +3321,7 @@ $1',
 파일을 실행하면 컴퓨터에 문제가 생길 가능성이 있습니다.",
 'imagemaxsize' => '그림 최대 크기:<br />(파일 문서에 적용되는 기능)',
 'thumbsize' => '섬네일 크기:',
-'widthheightpage' => '$1 × $2, $3페이지',
+'widthheightpage' => '$1 × $2, $3{{PLURAL:$3|쪽}}',
 'file-info' => '파일 크기: $1, MIME 종류: $2',
 'file-info-size' => '$1 × $2 픽셀, 파일 크기: $3, MIME 종류: $4',
 'file-info-size-pages' => '$1 × $2 픽셀, 파일 크기: $3, MIME 형식: $4, $5{{PLURAL:$5|쪽}}',
@@ -3334,16 +3334,16 @@ $1',
 'show-big-image-other' => '다른 {{PLURAL:$2|해상도}}: $1',
 'show-big-image-size' => '$1 × $2 픽셀',
 'file-info-gif-looped' => '반복됨',
-'file-info-gif-frames' => '$1 프레임',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|프레임}}',
 'file-info-png-looped' => '반복됨',
 'file-info-png-repeat' => '$1{{PLURAL:$1|번}} 재생됨',
-'file-info-png-frames' => '$1 프레임',
+'file-info-png-frames' => '$1 {{PLURAL:$1|프레임}}',
 'file-no-thumb-animation' => "'''참고: 기술적인 제한으로 인해 이 파일의 섬네일은 애니메이션을 지원하지 않습니다.'''",
 'file-no-thumb-animation-gif' => "'''참고: 기술적인 제한으로 인해 고해상도 GIF 그림 섬네일은 애니메이션을 지원하지 않습니다.'''",
 
 # Special:NewFiles
 'newimages' => '새 파일 목록',
-'imagelisttext' => "파일 '''$1'''개를 $2 순으로 정렬한 목록입니다.",
+'imagelisttext' => "{{PLURAL:$1|파일}} '''$1'''개를 $2 순으로 정렬한 목록입니다.",
 'newimages-summary' => '이 특수 문서는 최근에 올라온 파일을 나열하고 있습니다.',
 'newimages-legend' => '필터',
 'newimages-label' => '파일 이름 (또는 그 일부분):',
@@ -3722,8 +3722,8 @@ Variants for Chinese language
 'exif-gpslongitude-w' => '서경',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => '해발 $1미터',
-'exif-gpsaltitude-below-sealevel' => '해저 $1미터',
+'exif-gpsaltitude-above-sealevel' => '해발 $1{{PLURAL:$1|미터}}',
+'exif-gpsaltitude-below-sealevel' => '해저 $1{{PLURAL:$1|미터}}',
 
 'exif-gpsstatus-a' => '측정 중',
 'exif-gpsstatus-v' => '인터랙티브 측정',
@@ -3932,19 +3932,19 @@ $5
 일반 미리 보기를 이용하세요.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => '최근 $1 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.',
-'lag-warn-high' => '데이터베이스 서버의 과도한 부하 때문에 최근 $1 안에 바뀐 문서 목록은 보여지지 않을 수 있습니다.',
+'lag-warn-normal' => '최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.',
+'lag-warn-high' => '데이터베이스 서버의 과도한 부하 때문에 최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서 목록은 보여지지 않을 수 있습니다.',
 
 # Watchlist editor
-'watchlistedit-numitems' => '토론 문서를 제외하고 문서 $1개를 주시하고 있습니다.',
+'watchlistedit-numitems' => '토론 문서를 제외하고 {{PLURAL:$1|문서 1개|문서 $1개}}를 주시하고 있습니다.',
 'watchlistedit-noitems' => '주시문서 목록이 비어 있습니다.',
 'watchlistedit-normal-title' => '주시문서 목록 편집하기',
 'watchlistedit-normal-legend' => '주시문서 목록에서 문서 제거하기',
-'watchlistedit-normal-explain' => '주ì\8b\9c문ì\84\9c ëª©ë¡\9dì\97\90 ì\9e\88ë\8a\94 ë¬¸ì\84\9cì\9d\98 ì \9c목ì\9d´ ì\95\84ë\9e\98ì\97\90 ë\82\98ì\97´ë\90\98ì\96´ 있습니다.
+'watchlistedit-normal-explain' => '주ì\8b\9c문ì\84\9c ëª©ë¡\9dì\97\90 ì\9e\88ë\8a\94 ë¬¸ì\84\9cì\9d\98 ì \9c목ì\9d´ ì\95\84ë\9e\98ì\97\90 ë\82\98ì\99\80 있습니다.
 주시문서 목록에서 제거하려는 문서가 있으면 각 항목의 확인 상자를 선택한 다음 "{{int:Watchlistedit-normal-submit}}"를 클릭해주세요.
 또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.',
 'watchlistedit-normal-submit' => '항목 삭제',
-'watchlistedit-normal-done' => '주시문서 목록에서 다음 {{PLURAL:$1|항목}}을 주시하지 않습니다:',
+'watchlistedit-normal-done' => '주시문서 목록에서 다음 {{PLURAL:$1|항목 $1개}}를 제거했습니다:',
 'watchlistedit-raw-title' => '주시문서 목록 직접 편집하기',
 'watchlistedit-raw-legend' => '주시문서 목록 직접 편집하기',
 'watchlistedit-raw-explain' => '주시문서 목록의 각 항목이 나와 있습니다. 필요한 항목을 직접 추가하거나 제거할 수 있습니다.
@@ -3954,8 +3954,8 @@ $5
 'watchlistedit-raw-titles' => '목록:',
 'watchlistedit-raw-submit' => '주시문서 목록 새로 고침',
 'watchlistedit-raw-done' => '주시문서 목록을 새로 고쳤습니다.',
-'watchlistedit-raw-added' => '문서 $1개를 추가했습니다:',
-'watchlistedit-raw-removed' => '문서 $1개를 제거했습니다:',
+'watchlistedit-raw-added' => '{{PLURAL:$1|문서 $1개}}를 추가했습니다:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|문서 $1개}}를 제거했습니다:',
 
 # Watchlist editing tools
 'watchlisttools-view' => '주시문서 최근 바뀜',
@@ -4019,7 +4019,7 @@ $5
 'fileduplicatesearch-submit' => '찾기',
 'fileduplicatesearch-info' => '$1 × $2 픽셀<br />파일 크기: $3<br />MIME 유형: $4',
 'fileduplicatesearch-result-1' => '"$1" 파일과 중복된 파일이 없습니다.',
-'fileduplicatesearch-result-n' => '"$1" 파일은 중복 파일이 $2개 있습니다.',
+'fileduplicatesearch-result-n' => '"$1" 파일은 {{PLURAL:$2|중복 파일이 $2개}} 있습니다.',
 'fileduplicatesearch-noresults' => '"$1"이라는 이름을 가진 파일이 없습니다.',
 
 # Special:SpecialPages
@@ -4106,17 +4106,17 @@ $5
 'sqlite-no-fts' => '$1 (본문은 찾기에서 제외)',
 
 # New logging system
-'logentry-delete-delete' => '$1 사용자가 $3 문서를 {{GENDER:$2|삭제했습니다}}.',
-'logentry-delete-restore' => '$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 {{GENDER:$2|복구í\96\88ì\8aµë\8b\88ë\8b¤}}.',
-'logentry-delete-event' => '$1 사용자가 $3의 기록 $5개에 대해 보이기 설정을 바꾸었습니다: $4',
-'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 바꾸었습니다: $4',
-'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 보이기 설정을 바꾸었습니다.',
-'logentry-delete-revision-legacy' => '$1 사용자가 $3 문서 편집의 보이기 설정을 바꾸었습니다.',
-'logentry-suppress-delete' => '$1 사용자가 $3 문서를 숨겼습니다.',
-'logentry-suppress-event' => '$1 사용자가 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 보이기 설정을 바꾸었습니다: $4',
-'logentry-suppress-revision' => '$1 사용자가 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 보이기 설정을 바꾸었습니다: $4',
-'logentry-suppress-event-legacy' => '$1 사용자가 비공개적으로 $3의 항목에 대한 보이기 설정을 바꾸었습니다.',
-'logentry-suppress-revision-legacy' => '$1 사용자가 비공개적으로 $3 문서의 특정 판에 대한 보이기 설정을 바꾸었습니다.',
+'logentry-delete-delete' => '$1 사용자가 $3 문서를 {{GENDER:$2|삭제했습니다}}',
+'logentry-delete-restore' => '$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 {{GENDER:$2|ë\90\98ì\82´ë ¸ì\8aµë\8b\88ë\8b¤}}',
+'logentry-delete-event' => '$1 사용자가 $3의 {{PLURAL:$1|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-delete-revision-legacy' => '$1 사용자가 $3 문서 편집의 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-suppress-delete' => '$1 사용자가 $3 문서를 {{GENDER:$2|숨겼습니다}}',
+'logentry-suppress-event' => '$1 사용자가 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-suppress-revision' => '$1 사용자가 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-suppress-event-legacy' => '$1 사용자가 비공개적으로 $3의 항목에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-suppress-revision-legacy' => '$1 사용자가 비공개적으로 $3 문서의 특정 판에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
 'revdelete-content-hid' => '내용 숨겨짐',
 'revdelete-summary-hid' => '편집 요약 숨겨짐',
 'revdelete-uname-hid' => '사용자 이름 숨겨짐',
@@ -4125,20 +4125,20 @@ $5
 'revdelete-uname-unhid' => '사용자 이름 숨김 해제됨',
 'revdelete-restricted' => '관리자에게 제한을 적용함',
 'revdelete-unrestricted' => '관리자에 대한 제한을 해제함',
-'logentry-move-move' => '$1 사용자가 $3 문서를 $4 문서로 옮겼습니다.',
-'logentry-move-move-noredirect' => '$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 옮겼습니다.',
-'logentry-move-move_redir' => '$1 사용자가 $3 문서를 $4 문서로 옮기면서 넘겨주기를 덮어썼습니다.',
-'logentry-move-move_redir-noredirect' => '$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 옮기면서 옮길 대상에 있던 넘겨주기를 덮어썼습니다.',
-'logentry-patrol-patrol' => '$1 사용자가 $3 문서의 $4판을 검토한 것으로 표시했습니다.',
-'logentry-patrol-patrol-auto' => '$1 사용자가 자동적으로 $3 문서의 $4판을 검토한 것으로 표시했습니다.',
-'logentry-newusers-newusers' => '$1 사용자 계정을 만들었습니다.',
-'logentry-newusers-create' => '$1 사용자 계정을 만들었습니다.',
-'logentry-newusers-create2' => '$1 사용자가 $3 사용자 계정을 만들었습니다.',
-'logentry-newusers-byemail' => '$3 사용자 계정이 $1에 만들어졌고 비밀번호는 이메일로 보냈습니다',
-'logentry-newusers-autocreate' => '$1 사용자 계정을 자동적으로 만들었습니다.',
-'logentry-rights-rights' => '$1 사용자가 $3 사용자의 권한을 $4에서 $5으로 바꾸었습니다.',
-'logentry-rights-rights-legacy' => '$1 사용자가 $3 사용자의 권한을 바꾸었습니다.',
-'logentry-rights-autopromote' => '$1 ì\82¬ì\9a©ì\9e\90ì\9d\98 ê¶\8cí\95\9cì\9d´ ì\9e\90ë\8f\99ì \81ì\9c¼ë¡\9c $4ì\97\90ì\84\9c $5ì\9c¼ë¡\9c ë°\94ë\80\8cì\97\88ì\8aµë\8b\88ë\8b¤.',
+'logentry-move-move' => '$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮겼습니다}}',
+'logentry-move-move-noredirect' => '$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 {{GENDER:$2|옮겼습니다}}',
+'logentry-move-move_redir' => '$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮기면서}} 넘겨주기를 덮어썼습니다',
+'logentry-move-move_redir-noredirect' => '$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 {{GENDER:$2|옮기면서}} 옮길 대상에 있던 넘겨주기를 덮어썼습니다',
+'logentry-patrol-patrol' => '$1 사용자가 $3 문서의 $4판을 검토한 것으로 {{GENDER:$2|표시했습니다}}',
+'logentry-patrol-patrol-auto' => '$1 사용자가 자동적으로 $3 문서의 $4판을 검토한 것으로 {{GENDER:$2|표시했습니다}}',
+'logentry-newusers-newusers' => '$1 사용자 계정을 {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-create' => '$1 사용자 계정을 {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-create2' => '$1 사용자가 $3 사용자 계정을 {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-byemail' => '$3 사용자 계정이 $1에 {{GENDER:$2|만들어졌고}} 비밀번호는 이메일로 보냈습니다',
+'logentry-newusers-autocreate' => '$1 사용자 계정을 자동적으로 {{GENDER:$2|만들었습니다}}',
+'logentry-rights-rights' => '$1 사용자가 $3 사용자의 권한을 $4에서 $5으로 {{GENDER:$2|바꾸었습니다}}',
+'logentry-rights-rights-legacy' => '$1 사용자가 $3 사용자의 권한을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-rights-autopromote' => '$1 ì\82¬ì\9a©ì\9e\90ì\9d\98 ê¶\8cí\95\9cì\9d\84 ì\9e\90ë\8f\99ì \81ì\9c¼ë¡\9c $4ì\97\90ì\84\9c $5ì\9c¼ë¡\9c {{GENDER:$2|ë°\94꾸ì\97\88ì\8aµë\8b\88ë\8b¤}}',
 'rightsnone' => '(없음)',
 
 # Feedback
index 9e28308..d7a4bdb 100644 (file)
@@ -663,8 +663,8 @@ Mellt Iech w.e.g. domat un, soubal Dir et kritt hutt.',
 'blocked-mailpassword' => "Déi vun Iech benotzten IP-Adress ass fir d'Ännere vu Säite gespaart. Fir Mëssbrauch ze verhënneren, gouf d'Méiglechkeet fir een neit Passwuert unzefroen och gespaart.",
 'eauthentsent' => "Eng Confirmatiouns-E-Mail gouf un déi Adress geschéckt déi Dir uginn hutt.<br />
 Ier iergendeng E-Mail vun anere Benotzer op dee Kont geschéckt ka ginn, musst Dir als éischt d'Instructiounen an der Confirmatiouns-E-Mail befollegen, fir ze bestätegen datt de Kont wierklech Ären eegenen ass.",
-'throttled-mailpassword' => "An {{PLURAL:$1|der leschter Stonn|de leschte(n) $1 Stonnen}} gouf eng Erënenrung un d'Passwuert verschéckt.
-Fir de Mëssbrauch vun dëser Funktioun ze verhënneren kann nëmmen all {{PLURAL:$1|Stonn|$1 Stonnen}} esou eng Erënnerung verschéckt ginn.",
+'throttled-mailpassword' => "An {{PLURAL:$1|der leschter Stonn|de leschte(n) $1 Stonnen}} eng E-Mail verschéckt fir d'Passwuert zréckzesetzen.
+Fir de Mëssbrauch vun dëser Funktioun ze verhënneren kann nëmmen all {{PLURAL:$1|Stonn|$1 Stonnen}} esou eng Mail verschéckt ginn.",
 'mailerror' => 'Feeler beim Schécke vun der E-Mail: $1',
 'acct_creation_throttle_hit' => 'Visiteure vun dëser Wiki déi Är IP-Adress hu {{PLURAL:$1|schonn $1 Benotzerkont|scho(nn) $1 Benotzerkonten}} an de leschten Deeg opgemaach, dëst ass déi maximal Zuel déi an dësem Zäitraum erlaabt ass.
 Dofir kënne Visiteure déi dës IP-Adress benotzen den Ament keng Benotzerkonten opmaachen.',
@@ -736,9 +736,9 @@ $2
 Dir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
 'passwordreset-emailelement' => 'Benotzernumm: $1
 Temporärt Passwuert: $2',
-'passwordreset-emailsent' => 'Eng Erënnerungs-Mail gouf geschéckt.',
-'passwordreset-emailsent-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt.",
-'passwordreset-emailerror-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt, awer de Benotzer konnt se net kréien: $1",
+'passwordreset-emailsent' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt.",
+'passwordreset-emailsent-capture' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
+'passwordreset-emailerror-capture' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de Benotzer konnt se net kréien: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Mailadress änneren',
@@ -3771,13 +3771,13 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'sqlite-no-fts' => "$1 ënnerstëtzt d'Volltextsich net",
 
 # New logging system
-'logentry-delete-delete' => "$1 huet d'Säit $3 geläscht",
-'logentry-delete-restore' => "$1 huet d'Säit $3 restauréiert",
+'logentry-delete-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
+'logentry-delete-restore' => "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
 'logentry-delete-event' => "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 geännert",
 'logentry-delete-event-legacy' => "$1 huet d'Visibilitéit vun Elementer am Log op $3 geännert",
 'logentry-delete-revision-legacy' => "$1 huet d'Visibilitéit vu Versioune vun der Säit $3 geännert",
-'logentry-suppress-delete' => "$1 huet d'Säit $3 ewechgeholl",
-'logentry-suppress-event-legacy' => "$1 huet diskret d'Visibilitéit vun Elementer am Log op $3 geännert",
+'logentry-suppress-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 ewechgeholl",
+'logentry-suppress-event-legacy' => "$1 {{GENDER:$2|huet}} diskret d'Visibilitéit vun Elementer am Log op $3 geännert",
 'logentry-suppress-revision-legacy' => "$1 huet diskret d'Visibilitéit vu Versioune vun der Säit $3 geännert",
 'revdelete-content-hid' => 'Inhalt verstoppt',
 'revdelete-summary-hid' => 'Resumé vun der Ännerung verstoppt',
@@ -3787,18 +3787,18 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'revdelete-uname-unhid' => 'Benotzernumm net verstoppt',
 'revdelete-restricted' => 'Limitatioune fir Administrateuren ageschalt',
 'revdelete-unrestricted' => 'Limitatioune fir Administrateuren opgehuewen',
-'logentry-move-move' => "$1 huet d'Säit $3 op $4 geréckelt",
+'logentry-move-move' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}}",
 'logentry-move-move-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt ouni eng Viruleedung unzeleeën",
 'logentry-move-move_redir' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen",
-'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
-'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt markéiert",
+'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
+'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt {{GENDER:$2|markéiert}}",
 'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt  {{GENDER:$2|markéiert}}",
 'logentry-newusers-newusers' => 'De Benotzerkont $1 gouf {{GENDER:$2|ugeluecht}}',
-'logentry-newusers-create' => 'De Benotzerkont $1 gouf ugeluecht',
-'logentry-newusers-create2' => 'De Benotzerkont $3 gouf vum $1 ugeluecht',
-'logentry-newusers-byemail' => "De Benotzerkont $3 gouf vum $1 ugeluecht an d'Passwuert gouf per E-Mail geschéckt.",
-'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch ugeluecht',
-'logentry-rights-autopromote' => "De Benotzer $1 huet d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
+'logentry-newusers-create' => 'De Benotzerkont $1 gouf {{GENDER:$2|ugeluecht}}',
+'logentry-newusers-create2' => 'De Benotzerkont $3 gouf vum $1 {{GENDER:$2|ugeluecht}}',
+'logentry-newusers-byemail' => "De Benotzerkont $3 gouf vum $1 {{GENDER:$2|ugeluecht}} an d'Passwuert gouf per E-Mail geschéckt.",
+'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch {{GENDER:$2|ugeluecht}}',
+'logentry-rights-autopromote' => "De Benotzer $1 {{GENDER:$2|krut}} d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
 'rightsnone' => '(keen)',
 
 # Feedback
index 995fd6b..45cb9d0 100644 (file)
@@ -1600,7 +1600,7 @@ Katrā rindiņā ir saites uz pirmo un otro pāradresācijas lapu, kā arī pirm
 'brokenredirects-edit' => 'labot',
 'brokenredirects-delete' => 'dzēst',
 
-'withoutinterwiki' => 'Lapas bez interwiki',
+'withoutinterwiki' => 'Lapas bez starpviki saitēm',
 'withoutinterwiki-summary' => "Šajās lapās nav saišu uz citu valodu projektiem (''interwiki''):",
 'withoutinterwiki-legend' => 'Prefikss',
 'withoutinterwiki-submit' => 'Rādīt',
index e464a70..1cd2025 100644 (file)
@@ -394,7 +394,7 @@ Hueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.',
 'createaccount' => 'Ticchīhuāz cē cuentah',
 'gotaccount' => "¿Ye ticpiya cē cuentah? '''$1'''.",
 'gotaccountlink' => 'Ximocalaqui',
-'createaccountmail' => 'e-mailcopa',
+'createaccountmail' => 'Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō moēhualtīz in maltzinteyōtl netitlanizyeyāntli',
 'createaccountreason' => 'Tlèka:',
 'badretype' => 'Ahneneuhqui motlahtōlichtacāyo.',
 'userexists' => 'In tlatequitiltilīltōcāitl in ōquipehpen ye ia.
@@ -1004,7 +1004,7 @@ Nò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlà
 'listgrouprights-group' => 'Olōlli',
 'listgrouprights-rights' => 'Huelītiliztli',
 
-# E-mail user
+# Email user
 'emailuser' => 'Tiquēhualtlīz maltzinteyōtl netitlaniztli inīn tlatequitiltilīlli',
 'defemailsubject' => '{{SITENAME}} correo tlatequitiltilīlhuīc $1',
 'emailfrom' => 'Īhuīcpa:',
@@ -1410,7 +1410,7 @@ Hueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl a
 'monthsall' => '(mochīntīn)',
 'limitall' => 'mochi',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Ticchicāhuāz e-mail',
 'confirmemail_needlogin' => 'Tihuīquilia $1 ic ticchicāhua mo e-mail.',
 'confirmemail_success' => 'Mocorreo ōmotlahtōlneltilih
index 13e0a46..9c35059 100644 (file)
@@ -531,7 +531,7 @@ $1',
 'editlink' => 'ସମ୍ପାଦନା',
 'viewsourcelink' => 'ମୂଳାଧାର ଦେଖିବେ',
 'editsectionhint' => '$1 ଭାଗଟିକୁ ବଦଳାଇବେ',
-'toc' => 'ଭିତର à¬\9aିà¬\9c',
+'toc' => 'ବିଷà­\9fସà­\82à¬\9aà­\80',
 'showtoc' => 'ଦେଖାଇବେ',
 'hidetoc' => 'ଲୁଚାନ୍ତୁ',
 'collapsible-collapse' => 'ଚାପିଦେବେ',
index d6b9955..e5e57aa 100644 (file)
@@ -2093,6 +2093,10 @@ Sprawdź inne linki do szablonów, zanim usuniesz tę stronę.',
 a powinny odwoływać się bezpośrednio do stron treści.<br />
 Strona uznawana jest za ujednoznaczniającą, jeśli zawiera szablon linkowany przez stronę [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Strony z właściwościami',
+'pageswithprop-legend' => 'Strony z właściwościami',
+'pageswithprop-text' => 'Ta strona zawiera listę stron korzystających z właściwości.',
+
 'doubleredirects' => 'Podwójne przekierowania',
 'doubleredirectstext' => 'Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.
 Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, do którego prowadzi drugie przekierowanie. Ostatni link prowadzi zazwyczaj do strony, do której powinna w rzeczywistości przekierowywać pierwsza strona.
index c9596df..21aa249 100644 (file)
@@ -44,6 +44,7 @@
  * @author RmSilva
  * @author Rodrigo Calanca Nishino
  * @author SandroHc
+ * @author Sarilho1
  * @author Sir Lestaty de Lioncourt
  * @author Sérgio Ribeiro
  * @author Teles
@@ -845,7 +846,7 @@ Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova pal
 
 # Special:PasswordReset
 'passwordreset' => 'Repor palavra-chave',
-'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta por correio electrónico.',
+'passwordreset-text' => 'Preencha este formulário para repor a sua palavra-passe.',
 'passwordreset-legend' => 'Reiniciar a palavra-chave',
 'passwordreset-disabled' => 'O reinício da palavra-chave foi impossibilitado nesta wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
index 6e51710..95b30c3 100644 (file)
@@ -43,6 +43,7 @@
  * @author Haffman
  * @author HalanTul
  * @author Huuchin
+ * @author Ignatus
  * @author Illusion
  * @author Iltever
  * @author Incnis Mrsi
@@ -522,7 +523,7 @@ $messages = array(
 'hidden-category-category' => 'Скрытые категории',
 'category-subcat-count' => '{{PLURAL:$2|Эта категория содержит только следующую подкатегорию.|Эта категория содержит $1 {{PLURAL:$1|подкатегорию|подкатегории}} из $2 всего.}}',
 'category-subcat-count-limited' => 'В этой категории {{PLURAL:$1|$1 подкатегория|$1 подкатегории|$1 подкатегорий}}.',
-'category-article-count' => '{{PLURAL:$2|Эта категория содержит только следующую страницу.|В этой категории показан{{PLURAL:$1|а $1 страница|ы $1 страницы|о $1 страниц}} из $2.}}',
+'category-article-count' => '{{#ifeq:$2|1|Эта категория содержит только следующую страницу.|Эта категория содержит следующ{{PLURAL:$1|ую $1 страницу|ие $1 страницы|ие $1 страниц}} из $2.}}',
 'category-article-count-limited' => 'В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц}}.',
 'category-file-count' => '{{PLURAL:$2|Эта категория содержит только один файл.|В этой категории {{PLURAL:$1|показан $1 файл|показано $1 файла|показано $1 файлов}} из $2 {{PLURAL:$2|имеющейся|имеющихся}}.}}',
 'category-file-count-limited' => 'В этой категории {{PLURAL:$1|$1 файл|$1 файла|$1 файлов}}.',
@@ -4212,7 +4213,7 @@ MediaWiki распространяется в надежде, что она бу
 'logentry-newusers-autocreate' => 'Автоматически создана учётная запись $1',
 'logentry-rights-rights' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3 с $4 на $5',
 'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3',
-'logentry-rights-autopromote' => 'Учётная запись «$1» была автоматически переведена из $4 в $5',
+'logentry-rights-autopromote' => '$1 был{{GENDER:$2||а}} автоматически переведен{{GENDER:$2||а}} из $4 в $5',
 'rightsnone' => '(нет)',
 
 # Feedback
@@ -4288,4 +4289,7 @@ MediaWiki распространяется в надежде, что она бу
 'duration-centuries' => '$1 {{PLURAL:$1|век|века|веков}}',
 'duration-millennia' => '$1 {{PLURAL:$1|тысячелетие|тысячелетия|тысячелетий}}',
 
+# Image rotation
+'rotate-comment' => 'Изображение повернуто на $1 градус{{PLURAL:$1||а|ов}} по часовой стрелке',
+
 );
index 21438e3..e6ce2c8 100644 (file)
@@ -30,6 +30,7 @@
  * @author M.M.S.
  * @author MagnusA
  * @author Micke
+ * @author Mikez
  * @author NH
  * @author Najami
  * @author Nghtwlkr
@@ -2892,7 +2893,7 @@ I det senare fallet kan du även använda en länk, exempel [[{{#Special:Export}
 'exportcuronly' => 'Inkludera endast den nuvarande versionen, inte hela historiken',
 'exportnohistory' => "----
 '''OBS:''' export av fullständig sidhistorik med hjälp av detta formulär har stängts av på grund av prestandaskäl.",
-'exportlistauthors' => 'Innehålla en fullständig lista över bidragsgivare för varje sida',
+'exportlistauthors' => 'Inkludera en fullständig lista över bidragsgivare för varje sida',
 'export-submit' => 'Exportera',
 'export-addcattext' => 'Lägg till sidor från kategori:',
 'export-addcat' => 'Lägg till',
@@ -3994,17 +3995,17 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 'sqlite-no-fts' => '$1 utan stöd för fulltextsökning',
 
 # New logging system
-'logentry-delete-delete' => '$1 raderade sidan $3',
-'logentry-delete-restore' => '$1 återställde sidan $3',
-'logentry-delete-event' => '$1 ändrade synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
-'logentry-delete-revision' => '$1 ändrade synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
-'logentry-delete-event-legacy' => '$1 ändrade synligheten för logghändelser på $3',
-'logentry-delete-revision-legacy' => '$1 ändrade synligheten för versioner på sidan $3',
-'logentry-suppress-delete' => '$1 gömde sidan $3',
-'logentry-suppress-event' => '$1 ändrade i hemlighet synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
-'logentry-suppress-revision' => '$1 ändrade synligheten i hemlighet för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
-'logentry-suppress-event-legacy' => '$1 ändrade synligheten i hemlighet för logghändelser på $3',
-'logentry-suppress-revision-legacy' => '$1 ändrade synligheten i hemlighet för versioner på sidan $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|raderade}} sidan $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|återställde}} sidan $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten för logghändelser på $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten för versioner på sidan $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|gömde}} sidan $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|ändrade}} i hemlighet synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för logghändelser på $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för versioner på sidan $3',
 'revdelete-content-hid' => 'innehåll dolt',
 'revdelete-summary-hid' => 'redigeringssammanfattning dold',
 'revdelete-uname-hid' => 'användarnamn dolt',
@@ -4013,10 +4014,10 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 'revdelete-uname-unhid' => 'användarnamn synligt',
 'revdelete-restricted' => 'satte begränsningar för administratörer',
 'revdelete-unrestricted' => 'tog bort begränsningar för administratörer',
-'logentry-move-move' => '$1 flyttade sidan $3 till $4',
-'logentry-move-move-noredirect' => '$1 flyttade sidan $3 till $4 utan att lämna en omdirigering',
-'logentry-move-move_redir' => '$1 flyttade sidan $3 till $4 över en omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flyttade sidan $3 till $4 över en omdirigering utan att lämna en omdirigering',
+'logentry-move-move' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 utan att lämna en omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 över en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 över en omdirigering utan att lämna en omdirigering',
 'logentry-patrol-patrol' => '$1 {{GENDER:$2|markerade}} versionen $4 av sidan $3 som patrullerad',
 'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markerade}} automatiskt versionen $4 av sidan $3 som patrullerad',
 'logentry-newusers-newusers' => 'Användarkonto $1 har {{GENDER:$2|skapats}}',
index efae1ab..dd7fd4a 100644 (file)
@@ -2470,7 +2470,7 @@ $1',
 'unblockip' => 'ปลดบล็อกผู้ใช้',
 'unblockiptext' => 'ใช้แบบด้านล่างเพื่อคืนสิทธิการเข้าถึงการเขียนแก่เลขที่อยู่ไอพี หรือชื่อผู้ใช้ที่เคยถูกบล็อก',
 'ipusubmit' => 'ยกเลิกการบล็อกนี้',
-'unblocked' => '[[User:$1|$1]] ถูกปลดบล็อก',
+'unblocked' => '[[User:$1|$1]] ถูกปลดบล็อกแล้ว',
 'unblocked-range' => '$1 ถูกปลดบล็อกแล้ว',
 'unblocked-id' => 'เลิกบล็อก $1',
 'blocklist' => 'ผู้ใช้ที่ถูกบล็อก',
index 3c65416..2847cfe 100644 (file)
@@ -767,7 +767,7 @@ Nếu bạn không yêu cầu gửi mật khẩu mới, hoặc bạn đã nhớ
 'passwordsent' => 'Mật khẩu mới đã được gửi tới thư điện tử của thành viên “$1”. Xin đăng nhập lại sau khi nhận thư.',
 'blocked-mailpassword' => 'Địa chỉ IP của bạn bị cấm không được sửa đổi, do đó cũng không được phép dùng chức năng phục hồi mật khẩu để tránh lạm dụng.',
 'eauthentsent' => 'Thư xác nhận đã được gửi. Trước khi dùng chức năng nhận thư, bạn cần thực hiện hướng dẫn trong thư xác nhận, để đảm bảo tài khoản thuộc về bạn.',
-'throttled-mailpassword' => 'Mật khẩu đã được gửi đến cho bạn trong vòng {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ trở lại. Để tránh lạm dụng, chỉ có thể gửi mật khẩu {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ một lần.',
+'throttled-mailpassword' => 'Mật khẩu đã được gửi đến cho bạn trong vòng {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ trở lại. Để tránh lạm dụng, chỉ có thể gửi mật khẩu $1 giờ đồng hồ một lần.',
 'mailerror' => 'Lỗi gửi thư : $1',
 'acct_creation_throttle_hit' => 'Ai đó cùng [[địa chỉ IP]] với bạn đã mở {{PLURAL:$1|một tài khoản|$1 tài khoản}} ở đây trong vòng 24 giờ. Vì quy định hạn chế số tài khoản mở trên một địa chỉ IP nên bạn hiện không thể mở thêm được nữa dùng địa chỉ IP này.',
 'emailauthenticated' => 'Địa chỉ thư điện tử của bạn được xác nhận vào lúc $3 $2.',
@@ -4074,17 +4074,17 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'sqlite-no-fts' => '$1 không có hỗ trợ tìm kiếm toàn văn',
 
 # New logging system
-'logentry-delete-delete' => '$1 đã xóa trang “$3”',
-'logentry-delete-restore' => '$1 đã phục hồi trang “$3”',
-'logentry-delete-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4',
-'logentry-delete-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
-'logentry-delete-event-legacy' => '$1 đã thay đổi mức hiển thị của các mục nhật trình về $3',
-'logentry-delete-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3',
-'logentry-suppress-delete' => '$1 đã ẩn trang $3',
-'logentry-suppress-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3 một cách kín đáo: $4',
-'logentry-suppress-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
-'logentry-suppress-event-legacy' => '$1 đã thay đổi mức hiển thị các mục nhật trình về $3 một cách kín đáo',
-'logentry-suppress-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
+'logentry-delete-delete' => '$1 {{GENDER:$2}}đã xóa trang “$3”',
+'logentry-delete-restore' => '$1 {{GENDER:$2}}đã phục hồi trang “$3”',
+'logentry-delete-event' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các mục nhật trình về $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các phiên bản trang $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2}}đã ẩn trang $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3 một cách kín đáo: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị các mục nhật trình về $3 một cách kín đáo',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
 'revdelete-content-hid' => 'đã ẩn nội dung',
 'revdelete-summary-hid' => 'đã ẩn tóm lược sửa đổi',
 'revdelete-uname-hid' => 'đã ẩn tên người dùng',
@@ -4093,20 +4093,20 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'revdelete-uname-unhid' => 'đã hiện tên người dùng',
 'revdelete-restricted' => 'đã áp dụng hạn chế cho bảo quản viên',
 'revdelete-unrestricted' => 'đã gỡ bỏ hạn chế cho bảo quản viên',
-'logentry-move-move' => '$1 đã đổi $3 thành $4',
-'logentry-move-move-noredirect' => '$1 đã đổi $3 thành $4 (đã tắt đổi hướng)',
-'logentry-move-move_redir' => '$1 đã đổi $3 thành $4 qua đổi hướng',
-'logentry-move-move_redir-noredirect' => '$1 đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
-'logentry-patrol-patrol' => '$1 đã đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-patrol-patrol-auto' => '$1 đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-newusers-newusers' => 'Đã mở tài khoản người dùng $1',
-'logentry-newusers-create' => 'Đã mở tài khoản người dùng $1',
-'logentry-newusers-create2' => '$1 đã mở tài khoản người dùng $3',
-'logentry-newusers-byemail' => '$1 đã mở tài khoản người dùng $3 và nhận mật khẩu qua thư điện tử',
-'logentry-newusers-autocreate' => 'Tài khoản $1 đã được mở tự động',
-'logentry-rights-rights' => '$1 đã đổi các nhóm liên kết của $3 từ $4 đến $5',
-'logentry-rights-rights-legacy' => '$1 đã đổi các nhóm liên kết của $3',
-'logentry-rights-autopromote' => '$1 đã được tự động phong cấp từ $4 đến $5',
+'logentry-move-move' => '$1 {{GENDER:$2}}đã đổi $3 thành $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 (đã tắt đổi hướng)',
+'logentry-move-move_redir' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 qua đổi hướng',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2}}đã đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2}}đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-newusers-newusers' => '{{GENDER:$2}}Đã mở tài khoản người dùng $1',
+'logentry-newusers-create' => '{{GENDER:$2}}Đã mở tài khoản người dùng $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2}}đã mở tài khoản người dùng $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2}}đã mở tài khoản người dùng $3 và nhận mật khẩu qua thư điện tử',
+'logentry-newusers-autocreate' => 'Tài khoản $1 {{GENDER:$2}}đã được mở tự động',
+'logentry-rights-rights' => '$1 {{GENDER:$2}}đã đổi các nhóm bao gồm $3 từ $4 đến $5',
+'logentry-rights-rights-legacy' => '{{GENDER:$2}}$1 đã đổi các nhóm bao gồm $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2}}đã được tự động phong cấp từ $4 đến $5',
 'rightsnone' => '(không có)',
 
 # Feedback
index 3c6c155..d6b3df2 100644 (file)
@@ -1746,6 +1746,7 @@ $1",
 'uploadstash' => 'אַרויפֿלאָד רעזערוו',
 'uploadstash-clear' => 'אויסמעקן טעקעס פון זאפאס',
 'uploadstash-nofiles' => 'איר האט נישט קיין טעקעס אין זאפאס.',
+'uploadstash-errclear' => 'אוועקנעמען די טעקעס דורכגעפאלן.',
 'uploadstash-refresh' => 'דערפֿרישן די רשימה פון טעקעס',
 
 # img_auth script messages
@@ -3716,17 +3717,17 @@ $5
 'sqlite-no-fts' => '$1 אָן פֿולן-טעקסט זוכן שטיץ',
 
 # New logging system
-'logentry-delete-delete' => '$1 האט אויסגעמעקט בלאט $3',
-'logentry-delete-restore' => '$1 האט צוריקגעשטעלט בלאט $3',
-'logentry-delete-event' => '$1 האט געענדערט די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
-'logentry-delete-revision' => '$1 האט געענדערט די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
-'logentry-delete-event-legacy' => '$1 האט געענדערט די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
-'logentry-delete-revision-legacy' => '$1 האט געענדערט די זעבארקייט פון רעוויזיעס אויף בלאט $3',
-'logentry-suppress-delete' => '$1 האט אונטערדריקט בלאט $3',
-'logentry-suppress-event' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
-'logentry-suppress-revision' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
-'logentry-suppress-event-legacy' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
-'logentry-suppress-revision-legacy' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון רעוויזיעס אויף בלאט $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|האט אויסגעמעקט}} בלאט $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|האט צוריקגעשטעלט }} בלאט $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון רעוויזיעס אויף בלאט $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|האט אונטערדריקט}} בלאט $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|האט געהיימלעך געענדערט}} די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|האט געהיימלעך געענדערט}}  די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|האט געהיימלעך געענדערט}}  די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
+'logentry-suppress-revision-legacy' => '!$1 {{GENDER:$2|האט געהיימלעך געענדערט}}  די זעבארקייט פון רעוויזיעס אויף בלאט $3',
 'revdelete-content-hid' => 'אינהאלט פארהוילן',
 'revdelete-summary-hid' => 'רעדאקטירונג קאנספעקט פארהוילן',
 'revdelete-uname-hid' => 'באניצער־נאמען פארהוילן',
@@ -3735,19 +3736,20 @@ $5
 'revdelete-uname-unhid' => 'באַניצער נאָמען ארויסגעגעבן',
 'revdelete-restricted' => 'צוגעלייגט באגרעניצונגען פאר סיסאפן',
 'revdelete-unrestricted' => 'אוועקגענומען באגרעניצונגען פאר סיסאפן',
-'logentry-move-move' => '$1 האט באוועגט בלאט $3 צו $4',
-'logentry-move-move-noredirect' => '$1 האט באוועגט בלאט $3 צו $4 אן לאזן א ווייטערפירונג',
-'logentry-move-move_redir' => '$1 האט באוועגט $3 צו $4 אריבער ווייטערפירונג',
-'logentry-move-move_redir-noredirect' => '$1 האט באוועגט $3 צו $4 אריבער א ווייטערפירונג אן לאזן א  ווייטערפירונג',
-'logentry-patrol-patrol' => '$1 האט מארקירט רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
-'logentry-patrol-patrol-auto' => '$1 האט אויטאמאטיש מארקירט רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
-'logentry-newusers-newusers' => 'באניצער קאנטע $1 געשאפן געווארן',
-'logentry-newusers-create' => 'באניצער קאנטע $1 געשאפן געווארן',
-'logentry-newusers-create2' => 'באניצער קאנטע $1 געשאפן געווארן דורך $3',
-'logentry-newusers-autocreate' => 'קאנטע $1 באשאפן אויטאמאטיש',
-'logentry-rights-rights' => '$1 האט געביטן גרופע מיטגלידערשאַפֿט פֿאַר $3 פֿון $4 אויף $5',
-'logentry-rights-rights-legacy' => '$1 האט געביטן גרופע מיטגלידערשאפט פאר $3',
-'logentry-rights-autopromote' => '$1 אויטאמאטיש פראמאווירט פון $4 צו $5',
+'logentry-move-move' => '$1 {{GENDER:$2|האט באוועגט}} בלאט $3 צו $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|האט באוועגט}} בלאט $3 צו $4 אן לאזן א ווייטערפירונג',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|האט באוועגט}} $3 צו $4 אריבער ווייטערפירונג',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|האט באוועגט}} $3 צו $4 אריבער א ווייטערפירונג אן לאזן א  ווייטערפירונג',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|האט מארקירט}} רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|האט אויטאמאטיש מארקירט}} רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
+'logentry-newusers-newusers' => 'באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}}',
+'logentry-newusers-create' => 'באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}}',
+'logentry-newusers-create2' => 'באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}} דורך $3',
+'logentry-newusers-byemail' => 'באניצער קאנטע $3 איז {{GENDER:$2|געשאפן געווארן}} דורך $1 און דאס פאסווארט איז געשיקט געווארט דורך ע־פאסט',
+'logentry-newusers-autocreate' => 'באַניצער קאנטע $1 {{GENDER:$2|געשאפן}} אויטאמאטיש',
+'logentry-rights-rights' => '$1 האט {{GENDER:$2|געביטן}} גרופע מיטגלידערשאַפֿט פֿאַר $3 פֿון $4 אויף $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|האט געביטן}} גרופע מיטגלידערשאפט פאר $3',
+'logentry-rights-autopromote' => '$1 אויטאמאטיש  {{GENDER:$2|פראמאווירט}} פון $4 צו $5',
 'rightsnone' => '(גארנישט)',
 
 # Feedback
@@ -3802,6 +3804,7 @@ $5
 'api-error-ok-but-empty' => 'אינערלעכער גרײַז: קיין ענטפֿער פֿון סערווירער.',
 'api-error-overwrite' => 'מען טאָר נישט איבערשרײַבן אַן עקזיסטירנדע טעקע.',
 'api-error-stashfailed' => 'אינערלעכער גרײַז: סערווירער האט נישט געקענט אײַנשפייכלערן צייַטווייַליקע טעקע.',
+'api-error-publishfailed' => 'אינערלעכער גרײַז: סערווירער האט נישט געזדאנזשעט פארעפנטלעכן צייַטווייַליקע טעקע.',
 'api-error-timeout' => 'דער סערווירער האט ניט געענטפֿערט אינערהאַלב דער דערוואַרטעטער צייַט.',
 'api-error-unclassified' => 'אַן אומבאַקאַנט טעות איז פֿארגעקומען.',
 'api-error-unknown-code' => 'אומבאַקאַנט טעות: " $1 "',
@@ -3822,4 +3825,7 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|יארהונדערט|יארהונדערטער}}',
 'duration-millennia' => '$1 {{PLURAL:$1|יארטויזנט|יארטויזנטער}}',
 
+# Image rotation
+'rotate-comment' => 'בילד געדרייט דורך $1 {{PLURAL:$1|גראד}} זייגערווייז',
+
 );
diff --git a/maintenance/dictionary/mediawiki.dic b/maintenance/dictionary/mediawiki.dic
new file mode 100644 (file)
index 0000000..59ea18f
--- /dev/null
@@ -0,0 +1,4550 @@
+ænglisc
+ævar
+&add
+&amp
+&bar
+&sim
+&url
+ABNF
+API
+Aacute
+Aborted
+Abuse
+Account
+Accum
+Acirc
+Action
+Activity
+Agrave
+All
+Allocations
+Ancientpages
+Anim
+Api
+Apitestsysop
+Apitestuser
+Aring
+Article
+As
+Atilde
+Auml
+Autopromote
+BACKCOMPAT
+Backlinks
+Blacklist
+Block
+Blocked
+Blocks
+Bodytext
+Broken
+COMPUTERNAME
+CRLF
+CURLOPT
+Campaign
+Capture
+Categories
+Category
+Ccedil
+Central
+Changes
+Check
+Click
+Client
+Clientfor
+Colorer
+Compare
+Config
+Console
+Continue
+Contribs
+Contributions
+Conversiontable
+Coordinates
+Create
+Creation
+Cview
+DDLMODE
+DWIM
+DWIMD
+Daily
+Dbkeyform
+Deadendpages
+Debugtext
+Delete
+Deletedrevs
+Denied
+Dfile
+Disambiguations
+Double
+Duplicate
+EAGAIN
+EBML
+ECMA
+EDITFILTERMERGED
+EINPROGRESS
+EINTR
+EOCDR
+ETAG
+Eacute
+Ecirc
+Edit
+Editor
+Education
+Egrave
+Ehcache
+Elig
+Email
+Empty
+End
+English
+Enlist
+Euml
+Eval
+Events
+Exists
+Expand
+Expression
+Ext
+External
+Extracts
+Extraneous
+FFFD
+FOLLOWLOCATION
+Failure
+Featured
+Feed
+Feedback
+Feedbackv
+Feeds
+Fewestrevisions
+Ffile
+File
+Filearchive
+Filedelete
+Files
+Filter
+Filters
+Flag
+Flagged
+GI
+GRAPHEME
+Gadget
+Gadgets
+Geo
+Get
+Global
+Groups
+HEA
+HTM
+Hardblock
+Help
+Helpful
+ID
+IPTC
+IWBacklinks
+IWLinks
+Iacute
+Icirc
+Igrave
+Illegal
+Image
+Images
+Implict
+Import
+Info
+Invalidateemail
+Isarticle
+Item
+Iuml
+LOCALISATIONCACHE
+Lang
+Lastmod
+Links
+Linktags
+List
+Listredirects
+Living
+Log
+Login
+Logout
+Logs
+Lonelypages
+Longpages
+Love
+Ltitle
+MSVC
+Mark
+Match
+Matrix
+Members
+Mesg
+Messages
+Metatags
+Mobile
+Mostcategories
+Mostimages
+Mostinterwikis
+Mostlinked
+Mostlinkedcategories
+Mostlinkedtemplates
+Mostrevisions
+Move
+Mssql
+Mwstore
+Myuploads
+NEWPAGE
+NOTIC
+Name
+Need
+No
+Noscript
+Not
+Notalk
+Notice
+Notification
+Ntilde
+Oacute
+Ocirc
+Ograve
+Oldreviewedpages
+Open
+Options
+Oslash
+Otilde
+Ouml
+PAGEEDITDATE
+PAGEEDITOR
+PAGEEDITTIME
+PAGEINTRO
+PAGEMINOREDIT
+PAGESUMMARY
+PARSEHUGE
+PARSERFIRSTCALLINIT
+PHPTAL
+PMID
+Page
+Pages
+Param
+Parse
+Parsers
+Pass
+Passpass
+Patrol
+People
+Plugin
+Possible
+Program
+Props
+Protect
+Protected
+Protectexpiry
+Protectother
+Protectreason
+Protectreasonother
+Purge
+Query
+Queued
+Random
+Rapid
+Ratings
+Raw
+Recent
+Redirects
+Redis
+Referer
+Refresh
+Regexlike
+Replacer
+Reset
+Resursive
+Revert
+Review
+Revisions
+Rollback
+Rsd
+SEGSIZE
+STDERR
+SYSDBA
+Scaron
+Scribunto
+Search
+Section
+Set
+Shortpages
+Site
+Siteinfo
+Solr
+Stabilize
+Stash
+Stats
+Status
+Success
+Syntax
+TMPDIR
+TOOLBOXEND
+TRANSLIT
+Tagging
+Tags
+Template
+Templates
+Textform
+Tfile
+Throttled
+Timestamp
+Title
+Titles
+Token
+Tokens
+Tracking
+Transcode
+Triage
+UNWATCHURL
+Uacute
+Ucirc
+Ugrave
+Unblock
+Uncategorizedcategories
+Uncategorizedimages
+Uncategorizedpages
+Uncategorizedtemplates
+Undelete
+Unusedcategories
+Unusedimages
+Unusedtemplates
+Unwatchedpages
+Upload
+Urlform
+Usage
+User
+Usercreate
+Userdir
+Userlang
+Userrights
+Users
+Useruser
+Ustart
+Uuml
+Value
+Video
+View
+Visual
+WATCHINGUSERNAME
+WEBPVP
+Wantedcategories
+Wantedfiles
+Wantedpages
+Wantedtemplates
+Warning
+Watch
+Watchingusers
+Watchlist
+Wiki
+Wikibase
+Withoutinterwiki
+Wrong
+XX
+Xml
+YYYY
+YYYYMMDDHHMMSS
+Yacute
+Yuml
+\
+a
+aa
+aacute
+abbrv
+abcdefghijklmnopqrstuvwxyz
+abf
+aboutpage
+aboutsite
+abusefilter
+abusefiltercheckmatch
+abusefilterchecksyntax
+abusefilterevalexpression
+abusefilters
+abusefilterunblockautopromote
+abuselog
+abusive
+ac
+acad
+accel
+acceptlang
+accessdenied
+accesskey
+accesskeycache
+accesskeys
+accessors
+acchits
+account
+accountcreator
+accum
+acirc
+aclimit
+acprefix
+action
+actioncomplete
+actionhidden
+actions
+actiontext
+actionthrottled
+actionthrottledtext
+actiontoken
+activeusers
+activity
+acuxvalidate
+add
+addablegroups
+addbegin
+addedline
+addedwatchtext
+addergroup
+addergroups
+addin
+adding
+additional
+addr
+address
+addresses
+addsection
+addstudent
+admin
+administrator
+adnum
+adrelid
+adsrc
+advancedediting
+advancedrc
+advancedrendering
+advancedsearchoptions
+advancedwatchlist
+aelig
+af
+afl
+aft
+afttest
+afvf
+age
+aggregators
+agrave
+ahandler
+ahttp
+ai
+aifc
+aiff
+aiprop
+ajaxwatch
+al
+alefsym
+algo
+algos
+all
+all's
+allcategories
+alldata
+alle
+allexamples
+allhidden
+allimages
+allimit
+alllinks
+alllogstext
+allmessages
+allmonths
+allowedctypes
+allowedonly
+allowemail
+allowsduplicates
+allowusertalk
+allpages
+allpagesbadtitle
+allpagesprefix
+allpagesredirect
+allpagessubmit
+allrev
+alltitles
+alltransclusions
+allusers
+aloption
+alprefix
+alreadyblocked
+alreadydone
+alreadyexists
+alreadyrolled
+alunique
+am
+anchor
+anchorclose
+anchorencode
+and
+andconvert
+andtitle
+anon
+anoneditwarning
+anonlogin
+anonnotice
+anononly
+anonpreviewwarning
+anontalk
+anontalkpagetext
+anontoken
+anonuserpage
+anonymous
+anti
+antispoof
+antivirus
+anymap
+ap
+apcond
+apdir
+api
+api's
+apibase
+apihelp
+apihighlimits
+apis
+aplimit
+apnamespace
+apng
+apos
+appendnotsupported
+appendtext
+apprefix
+approve
+aprops
+aqbt
+aqct
+archivename
+aren
+args
+argsarams
+aring
+arnfjörð
+article
+articleexists
+articlefeedbackv
+articleid
+articlelink
+articlepage
+articlepath
+articles
+aryeh
+asc
+ascending
+asctime
+asdf
+aspx
+assert
+astriks
+asymp
+async
+asynccopyuploaddisabled
+asyncdownload
+at
+atend
+atext
+atid
+atilde
+atime
+atlimit
+atoi
+atom
+atprefix
+atthasdef
+attibs
+attibute
+attlen
+attname
+attnum
+attrdef
+attrelid
+attrib
+attribs
+attributename
+attrs
+atttypid
+atunique
+au
+auml
+authplugins
+autoaccount
+autobiography
+autoblock
+autoblocked
+autoblockedtext
+autoblocker
+autoblockid
+autoblocking
+autoblockip
+autoblocks
+autocad
+autocomment
+autocomments
+autocomplete
+autoconfirm
+autoconfirmed
+autocreate
+autocreated
+autocreation
+autodetection
+autoflag
+autofocus
+autogen
+autogenerated
+autohide
+autoload
+autoloader
+autoloaders
+autoloading
+automagically
+automatic
+autonym
+autopatrol
+autoplay
+autopromote
+autopromoted
+autopromotion
+autoreview
+autoreviewer
+autoreviewrestore
+autosumm
+autosummaries
+autosummary
+axto
+azərbaycanca
+backends
+backlink
+backlinks
+backlinksubtitle
+backported
+backslashed
+backtraces
+bad
+badaccess
+badarticleerror
+badcontinue
+baddiff
+bademail
+badfilename
+badformat
+badgenerator
+badhookmsg
+badinterwiki
+badip
+badipaddress
+badkey
+badmd
+badmime
+badminpassword
+badminuser
+badnamespace
+badoption
+badparams
+badport
+badretype
+badrevids
+badsig
+badsiglength
+badsyntax
+badtag
+badtimestamp
+badtitle
+badtitletext
+badtoken
+badtype
+badupload
+baduser
+badversion
+balancer
+balancers
+banjar
+barstein
+base
+basefont
+basename
+basepagename
+basepagenamee
+basetimestamp
+bashkir
+bashpid
+bcancel
+bceffd
+bcmath
+bcompress
+bcpio
+bdop
+bdquo
+becampus
+beinstructor
+belarusian
+beonline
+bereviewer
+berror
+bestq
+besttype
+bg
+bgcolor
+bgzip
+bidi
+bigdelete
+binhex
+bitdepth
+bitfield
+bitfields
+bitmask
+bjarmason
+bk
+bkey
+bkinvalidparammix
+bkmissingparam
+bkusers
+bl
+blanking
+blanknamespace
+blankpage
+blegh
+bleh
+blinvalidparammix
+blksize
+blmissingparam
+block
+blockable
+blocked
+blockedasrange
+blockedby
+blockedbyid
+blockedemailuser
+blockedexpiry
+blockedfrommail
+blockednoreason
+blockedreason
+blockedtext
+blockedtitle
+blockemail
+blockexpiry
+blockid
+blockinfo
+blockip
+blocklink
+blocklogentry
+blocklogpage
+blocklogtext
+blockme
+blockquote
+blockreason
+blocks
+blocktoken
+bloggs
+blogs
+blogspot
+bltitle
+bluelink
+bluelinks
+bmwschema
+bmysql
+bname
+bodycontent
+boldening
+bolding
+booksources
+bool
+boolean
+borderhack
+bot
+botedit
+boteditletter
+bots
+bottom
+bottomscripts
+bpassword
+bpatch
+bpchar
+bport
+bprefix
+broeck
+brokenlibxml
+brokenredirects
+brokenredirectstext
+browsearchive
+brvbar
+bserver
+bservers
+bssl
+btestpassword
+btestuser
+btype
+bucket
+bucketcount
+bugfix
+bugfixes
+buglist
+bugzilla
+buildpath
+buildpathentry
+bulgakov
+bulkdelcourses
+bulkdelorgs
+bureaucrat
+buser
+by
+byemail
+byid
+bytea
+bytesleft
+bytesread
+bytevalue
+cacheable
+cached
+cachedcount
+cachedsidebar
+cachedspecial
+cachedtimestamp
+calimit
+callargs
+campaign
+campus
+cancelto
+cannotdelete
+cannotundelete
+canonicalised
+canonicalization
+canonicalize
+canonicalizes
+canonicalizing
+canremember
+canreset
+cansecurelogin
+cantblock
+cantcreate
+cantdelete
+cantedit
+cantexecute
+canthide
+cantimport
+cantmove
+cantmovefile
+cantopenfile
+cantoverwrite
+cantrollback
+cantsend
+cantunblock
+cantundelete
+capitalizeallnouns
+captchaid
+captchas
+captchaword
+cascade
+cascadeable
+cascadeon
+cascadeprotected
+cascadeprotectedwarning
+cascading
+cascadingness
+categories
+categories's
+categorieshtml
+category
+categoryfinder
+categoryinfo
+categorylinks
+categorymembers
+categorypage
+categoryviewer
+catids
+catlinks
+catpage
+catrope
+cattitles
+ccedil
+ccme
+ccmeonemails
+cdab
+cdel
+cdlink
+cedil
+ceebc
+cellpadding
+cellspacing
+central
+centralauth
+centralnotice
+centralnoticeallocations
+centralnoticelogs
+centralnoticequerycampaign
+cgroup
+cgroups
+change
+change's
+changeablegroups
+changed
+changedby
+changedorcreated
+changeemail
+changelog
+changeslist
+changing
+characters
+chardiff
+charoff
+chars
+checkfreq
+checkmatrix
+checkstatus
+checkuser
+checkuserlog
+chgrp
+childs
+chillu
+chmoding
+choicesstring
+chrs
+chunk
+chunked
+chunking
+ci
+cidr
+cidrtoobroad
+circ
+citeseer
+ckers
+ckey
+cl
+clamav
+clamscan
+classname
+clcategorie
+cldir
+cldr
+clear
+clearable
+clearyourcache
+clfrom
+clickjacking
+clicktracking
+clientfor
+clientpool
+cllimit
+clober
+closed
+clto
+cm
+cminvalidparammix
+cmmissingparam
+cmnamespace
+cmtitle
+co
+code
+codemap
+codepoint
+codestr
+coi
+colgroup
+collapsable
+collectionsaveascommunitypage
+collectionsaveasuserpage
+colname
+cologneblue
+colonseparator
+colorer
+colspan
+commafy
+commafying
+comment
+commentedit
+commenthidden
+comments
+commitdiff
+commoncssjs
+compactpro
+compare
+compat
+complete
+cond
+condcomment
+condeferrable
+condeferred
+conds
+config
+confirmdeletetext
+confirmed
+confirmedittext
+confirmemail
+confirmrecreate
+conflimit
+confstr
+conkey
+conname
+conrelid
+console
+content
+contentformat
+contenthandler
+contentlanguage
+contentless
+contentmodel
+contenttoobig
+continue
+contribs
+contribslink
+conttitle
+contype
+conv
+converttitles
+convmv
+cookieprefix
+cooltalk
+coord
+coordinates
+copyrightico
+copyrightpage
+copyrightwarning
+copyuploadbaddomain
+copyuploaddisabled
+copyvio
+copywarn
+cors
+couldn
+counter
+countmsg
+country
+course
+courseid
+cpio
+cprefs
+cprotected
+crarr
+crashbug
+create
+createaccount
+createonly
+createpage
+createtalk
+creationsort
+creativecommons
+creditspage
+crocker
+cryptrand
+csize
+csrf
+css
+cssclass
+csslinks
+cssprefs
+cta
+ctime
+ctor
+ctype
+cu
+cul
+curation
+curdiff
+curid
+curlink
+curren
+currentarticle
+currentbrowser
+currentday
+currentdayname
+currentdow
+currenthour
+currentmonth
+currentmonthabbrev
+currentmonthname
+currentmonthnamegen
+currentrev
+currentrevisionlink
+currenttime
+currenttimestamp
+currentversion
+currentweek
+currentyear
+customcssprotected
+customised
+customjsprotected
+cut
+cyber
+cygwin
+cyrl
+d'oh
+dadedad
+dairiki
+danga
+danielc
+darr
+datalen
+dataset
+datasets
+datasize
+datatable
+datatype
+datedefault
+dateformat
+dateheader
+dateopts
+daysago
+dbcnt
+dbconnect
+dberrortext
+dbg
+dbgfm
+dbkey
+dbkeys
+dbks
+dbname
+dbrepllag
+dbsettings
+dbtype
+dbversion
+ddjvu
+de
+deadend
+deadendpagestext
+deadenpages
+dealies
+debughtml
+decline
+declined
+decls
+decr
+decrease
+default
+defaultcontentmodel
+defaultmessagetext
+defaultmissing
+defaultns
+defaultsort
+defaultval
+deferr
+definite
+deflimit
+defs
+deja
+delete
+deleteall
+deletecomment
+deleteconfirm
+deleted
+deletedhistory
+deletedline
+deletedonly
+deletedrevision
+deletedrevs
+deletedtext
+deletedwhileediting
+deleteeducation
+deleteglobalaccount
+deletelogentry
+deleteone
+deleteotherreason
+deletepage
+deletereason
+deletereasonotherlist
+deleterevision
+deleteset
+deletethispage
+deletetoken
+deletion
+deletionlog
+delim
+dellogpage
+dellogpagetext
+delundel
+deprecated
+deps
+depth
+dequeue
+dequeued
+dequeueing
+dequeues
+derivatives
+desc
+descending
+description
+descriptionmsg
+descriptionmsgparams
+descriptionurl
+deserialization
+deserialize
+dest
+detail
+details
+devangari
+devel
+df
+dflt
+dhtml
+diams
+didn
+diff
+diff's
+diffchange
+diffhist
+difflink
+diffonly
+difftext
+diffto
+difftocontent
+difftotext
+dim
+dimensions
+dir
+direction
+directionmark
+directorycreateerror
+directorynotreadableerror
+directoryreadonlyerror
+dirmark
+dirname
+disabled
+disabledtranscode
+disablemail
+disablepp
+disablesuggest
+disclaimerpage
+diskussion
+displayname
+displayrc
+displaysearchoptions
+displaytitle
+displaytitles
+displaywatchlist
+distclean
+distro
+djava
+djob
+djvu
+djvudump
+djvulibre
+djvutoxml
+djvutxt
+djvuxml
+djvuzone
+dkjsagfjsgashfajsh
+dlen
+dltk
+dmoz
+dnsbl
+dnsblacklist
+dnumber
+docm
+docroot
+doctype
+doctypes
+docx
+dodiff
+doesn
+domain
+domainnames
+domainpart
+domainparts
+domas
+doms
+dotdotcount
+dotm
+dotsc
+dotsi
+dotsm
+dotso
+dotwise
+dotx
+doubleclick
+doublequote
+doxygen
+dpos
+dr
+dropdown
+dump
+dumpfm
+dupfunc
+duplicatefiles
+duplicatesoffile
+dvips
+dwfx
+dwhitelist
+e
+eacute
+earth
+eauth
+ecirc
+ecmascript
+edit
+editbutton
+editconflict
+editconflicts
+editcount
+editfont
+editform
+edithelp
+edithelppage
+edithelpurl
+editingcomment
+editinginterface
+editingold
+editingsection
+editinterface
+editintro
+edititis
+editlink
+editnotice
+editnotsupported
+editondblclick
+editor
+editownusertalk
+editpage
+editprotected
+editreasons
+editredlink
+editrestriction
+edits
+editsection
+editsectionhint
+editsectiononrightclick
+editsonly
+editthispage
+edittime
+edittoken
+edittools
+editurl
+editusercss
+editusercssjs
+edituserjs
+edoe
+egrave
+ehcache
+ei
+eich
+eiinvalidparammix
+eimissingparam
+eititle
+el
+elapsedreal
+elemname
+elink
+eltitle
+email
+emailable
+emailaddress
+emailauthenticated
+emailauthentication
+emailauthenticationclass
+emailcapture
+emailconfirm
+emailconfirmed
+emailconfirmlink
+emaildisabled
+emailling
+emaillink
+emailnotauthenticated
+emailtoken
+emailuser
+embeddedin
+empty
+emptyfile
+emptynewsection
+emptypage
+emsenhuber
+emsp
+en
+enabled
+enabledonly
+enableparser
+encapsed
+enctype
+end
+endcode
+endcond
+endian
+endid
+endl
+endsortkey
+endsortkeyprefix
+endtime
+endverbatim
+enhancedchanges
+enlist
+enotif
+enotifminoredits
+enotifrevealaddr
+enotifusertalkpages
+enotifwatchlistpages
+enqueueing
+enroll
+ensp
+entirewatchlist
+entityid
+envcmd
+enwiki
+eocdr
+ep
+eparticle
+epcampus
+epcoordinator
+epinstructor
+eponline
+erevoke
+errno
+error
+errorbox
+errormessage
+errorpagetitle
+errors
+errorstr
+errortext
+errorunknown
+errstr
+es
+escapenoentities
+escapeshellarg
+esearch
+español
+española
+etag
+eu
+euml
+event
+eventid
+ex
+exampleextension
+examples
+excludegroup
+excludepage
+excludeuser
+executables
+exempt
+existingwiki
+exists
+exiv
+expandtab
+expandtemplates
+expandurl
+experiment
+expertise
+expiry
+expiryarray
+explainconflict
+export
+exportnowrap
+exportxml
+expression
+exptime
+extauth
+extendwatchlist
+extensionname
+extensions
+extensiontags
+external
+externaldberror
+externaldiff
+externaledit
+externaleditor
+externallinks
+externalstore
+extet
+extiw
+extlink
+extlinks
+extracts
+extradata
+extrafields
+extraq
+extratags
+exturlusage
+extuser
+exxaammppllee
+fa
+facto
+failback
+failover
+failsafe
+fallbacks
+false
+falsy
+fancysig
+fastcgi
+faux
+favicon
+fclose
+fdef
+fdff
+feature
+featured
+featuredfeed
+feed
+feed's
+feedback
+feedbackid
+feedcontributions
+feedformat
+feeditems
+feedlink
+feedlinks
+feedurl
+feedwatchlist
+feff
+female
+fetchfileerror
+fffe
+ffff
+fffff
+ffffff
+fieldname
+fieldset
+fieldsets
+file
+filearchive
+filebackend
+filecache
+filecopyerror
+filedelete
+filedeleteerror
+fileexists
+fileextensions
+filehidden
+filehist
+filehistory
+fileinfo
+filejournal
+filekey
+filelinks
+filemissing
+filemover
+filemtime
+filename
+filenames
+filenotfound
+filepage
+filepath
+filerenameerror
+filerepo
+filerevert
+filerevisions
+files
+filesize
+filesort
+filesorts
+filesystem's
+filesystems
+filetoc
+filetoobig
+filetype
+filetypemismatch
+fileversions
+filter
+filterbots
+filteriw
+filterlanglinks
+filterlocal
+filterredir
+filterwatched
+findnext
+finfo
+firefox
+firstname
+firstrev
+firsttime
+fishbowl
+fixme
+fixup
+flac
+flag
+flagconfig
+flagged
+flags
+flagtype
+flatlist
+flds
+float
+fmttime
+fname
+fnof
+foldmarker
+foldmethod
+followpolicy
+footericon
+footericons
+footerlinks
+fopen
+for
+forall
+forbidden
+forcearticlepath
+forcebot
+forceditsummary
+forceeditsummary
+forcelinkupdate
+forcetoc
+forcontent
+formaction
+format
+formatmodules
+formatted
+formatters
+formatting
+formedness
+formenctype
+formnovalidate
+formtype
+forupdate
+found
+founder
+fr
+frac
+frameless
+framesets
+frasl
+fread
+freedomdefined
+freeform
+freenode
+frickin
+from
+fromdb
+fromdbmaster
+fromid
+fromrev
+fromrevid
+fromtitle
+frontends
+fseek
+fsockopen
+fsync
+ftp
+fullhistory
+fullpagename
+fullpagenamee
+fulluri
+fullurl
+funcname
+functionhooks
+functionname
+futuresplash
+fvalue
+ga
+gack
+gadgetcategories
+gadgets
+gaid
+gaifilterredir
+gallerybox
+gallerycaption
+gallerytext
+gapdir
+gapfilterredir
+gaplimit
+gapprefix
+garber
+gblblock
+gblock
+gblrights
+gc
+gcldir
+gcllimit
+gender
+general
+generatexml
+generator
+geocoordinate
+geosearch
+gerrit
+getcookie
+getenv
+getheader
+getimagesize
+getlink
+getmac
+getmarkashelpfulitem
+getmypid
+getrusage
+gettimeofday
+gettingstarted
+gettoken
+getuid
+gfdl
+ggp
+ghostscript
+gimpbaseenums
+git
+gitdir
+github
+gitweb
+global
+globalauth
+globalblock
+globalblocks
+globalgroupmembership
+globalgrouppermissions
+globalgroups
+globalsettings
+globalunblock
+globalusage
+globaluserinfo
+globe
+gmail
+gmdate
+goodtitle
+gopher
+graymap
+grayscale
+greant
+greymap
+group
+groupcounts
+groupless
+groupmember
+grouppage
+groupperms
+groupprms
+groups
+growinglink
+grxml
+gs
+gtar
+gu
+guesstimezone
+gui
+guid
+gunblock
+guser
+gwicke
+gzcompress
+gzdeflate
+gzencode
+gzhandler
+gzip
+gzipped
+gzipping
+hacky
+hansm
+hant
+hardblocks
+hardcode
+hardcoding
+harr
+hash
+hashar
+hashcheckfailed
+hashsearchdisabled
+hashtable
+hashtables
+hasmatch
+hasmsg
+hasn
+hasrelated
+headelement
+headerpos
+headhtml
+headitems
+headlinks
+headscripts
+height
+hellip
+help
+helpful
+helppage
+helptext
+helpurl
+helpurls
+helpwindow
+hexdump
+hexstring
+hidden
+hiddencat
+hiddencategories
+hiddencats
+hide
+hideanons
+hidebots
+hidediff
+hideliu
+hideminor
+hidemyself
+hidename
+hidepatrolled
+hideredirects
+hiderevision
+hideuser
+hidpi
+highlimit
+highmax
+highuse
+hilfe
+hiphop
+histfirst
+histlast
+historyempty
+historysubmit
+historywarning
+hit
+hitcount
+hitcounter
+hits
+hmac
+hmtl
+hobby
+homelink
+hookaborted
+horohoe
+hostnames
+hours
+hphp
+hplist
+hpos
+hreflang
+hslots
+htaccess
+htcp
+html
+htmlelements
+htmlescaped
+htmlform
+htmlish
+htmllist
+htmlnest
+htmlpair
+htmlpairs
+htmlsingle
+htmlsingleallowed
+htmlsingleonly
+htmlspecialchars
+htmltidy
+http
+httpaccept
+httpbl
+https
+i
+ia
+iabn
+iacute
+icirc
+icononly
+iconv
+icubench
+icutest
+id
+idanduser
+ids
+ie's
+ieinternals
+ietf
+iexcl
+ifconfig
+iframe
+igbinary
+iges
+ignorewarnings
+igrave
+ii
+iicontinue
+iiprop
+iiurlparam
+iiurlwidth
+iker
+ilfrom
+ilto
+im
+image
+imagegetsize
+imageinfo
+imageinvalidfilename
+imagelinks
+imagemagick
+imagemaxsize
+imagenocrossnamespace
+imagepage
+imagerepository
+imagerotate
+images
+imagesize
+imagetype
+imagetypemismatch
+imageusage
+imagick
+imgmultigo
+imgmultigoto
+imgmultipagenext
+imgmultipageprev
+imgs
+imgserv
+immobilenamespace
+implicitgroups
+import
+importbadinterwiki
+importcantopen
+importlogpage
+importlogpagetext
+importnofile
+importtoken
+importupload
+importuploaderrorpartial
+importuploaderrorsize
+importuploaderrortemp
+in
+iname
+inbound
+includable
+include
+includecomments
+includelocal
+includeonly
+includexmlnamespace
+incr
+increase
+indefinite
+index
+indexfield
+indexpageids
+indexpolicy
+indstr
+infin
+infinite
+infiniteblock
+info
+infoaction
+infobox
+infoline
+infomsg
+ingroups
+injectjs
+inkscape
+inlanguagecode
+inlined
+inno
+inputneeded
+insb
+inser
+instantcommons
+institution
+instructor
+int
+integer
+integeroutofrange
+intentionallyblankpage
+interlang
+interlangs
+interlanguage
+internal
+internaledit
+internalerror
+interwiki
+interwikimap
+interwikipage
+interwikis
+interwikisource
+intnull
+intoken
+intra
+intro
+intrw
+ints
+intval
+invalid
+invalidaction
+invalidations
+invalidcategory
+invaliddomain
+invalidemail
+invalidemailaddress
+invalidexpiry
+invalidip
+invalidlang
+invalidlevel
+invalidmode
+invalidoldimage
+invalidpage
+invalidpageid
+invalidparameter
+invalidparammix
+invalidpath
+invalidrange
+invalidsection
+invalidsessiondata
+invalidsha
+invalidspecialpage
+invalidtags
+invalidtime
+invalidtitle
+invalidtoken
+invaliduser
+invalue
+iorm
+ip
+ipbblocked
+ipblock
+ipblocks
+ipbnounblockself
+ipchain
+ipedits
+iphash
+ipinrange
+ipusers
+iquest
+irc
+ircs
+isam
+isapi
+isbot
+isconnected
+iscur
+isin
+isip
+ismap
+isminor
+ismodsince
+ismulti
+isnew
+ispermalink
+isself
+isset
+istainted
+istalk
+iswatch
+it
+item
+itemid
+itemprop
+itemref
+itemscope
+itemtype
+iter
+iu
+iuinvalidparammix
+iumissingparam
+iuml
+iw
+iwbacklinks
+iwbl
+iwlfrom
+iwlinks
+iwlprefix
+iwltitle
+iwprefix
+iwtitle
+iwurl
+javascript
+javascripttest
+jbartsh
+jconds
+jdk's
+jhtml
+jimbo
+joaat
+jobqueue
+jointype
+jorsch
+journaling
+jpeg
+jpegtran
+jslint
+jsmimetype
+jsminplus
+json
+jsonfm
+jsparse
+jstext
+jsvarurl
+justthis
+kabardian
+kangxi
+kashubia
+kattouw
+kblength
+kernowek
+key
+keygen
+keylen
+keyname
+keynames
+keytype
+khash
+kludgy
+knownnamespace
+konqueror
+kpos
+kuza
+labarga
+labelmsg
+laggedslavemode
+laggy
+lang
+langbacklinks
+langcode
+langcodes
+langconversion
+langlinks
+langprop
+langs
+language
+languagelinks
+languages
+languageshtml
+laquo
+large
+larr
+last
+lastdiff
+lastdot
+lastedit
+lasteditor
+lastedittime
+lastlink
+lastmod
+lastmodifiedat
+lastname
+lastrevid
+lastvisited
+latgalian
+laxström
+lbase
+lbl
+lcattrib
+lceil
+lcomments
+lcount
+lcrocker
+ldquo
+le
+leavemessage
+len
+length
+leprop
+lesque
+lettercase
+level
+lfloor
+lg
+lgname
+lgpassword
+lgpl
+lgtoken
+lguserid
+lgusername
+libcurl
+libel
+libgimpbase
+libketama
+libmemcached
+libre
+libtidy
+ligabue
+lighttpd
+limit
+limitable
+line
+linenumber
+linestart
+link
+linkarr
+linkcolour
+linkprefix
+links
+linkstoimage
+linktbl
+linktext
+linktodiffs
+linktrail
+linktype
+linkupdate
+list
+listable
+listadmins
+listbots
+listfiles
+listgrouprights
+listinfo
+listingcontinuesabbrev
+listoutput
+listresult
+lists
+listtags
+listuser
+listusers
+listusersfrom
+livepreview
+ll
+llfrom
+lllang
+lltitle
+lnumber
+local
+localday
+localdayname
+localdow
+locale
+localhour
+localmonth
+localmonthabbrev
+localmonthname
+localmonthnamegen
+localname
+localonly
+localsettings
+localtimezone
+localweek
+localyear
+lock
+lockandhid
+lockdb
+lockdir
+locked
+lockmanager
+log
+logaction
+logentry
+logevent
+logevents
+logextract
+loggedin
+logid
+login
+loginend
+loginerror
+loginfo
+loginlanguagelinks
+loginlink
+loginprompt
+loginreqlink
+loginreqpagetext
+loginreqtitle
+logins
+loginstart
+logitem
+loglink
+loglist
+logname
+logonly
+logopath
+logourl
+logout
+logpage
+logtext
+logtitle
+logtype
+longpage
+longpageerror
+lookie
+lookups
+loopback
+lossless
+lossy
+lowast
+lowercaps
+lowercased
+lowlimit
+lsaquo
+lsquo
+ltags
+ltitle
+ltrimmed
+lurl
+lysator
+möller
+macr
+magicarr
+magicfile
+magick
+magicword
+magicwordkey
+magicwords
+magnus
+mahaction
+mailerror
+mailmypassword
+mailnologin
+mailparts
+mailpassword
+mailtext
+mailto
+mainmodule
+mainpage
+maintainership
+makesafe
+male
+malloc
+manske
+manualthumb
+mark
+markashelpful
+markaspatrolledlink
+markaspatrolledtext
+markbot
+markbotedits
+markedaspatrollederror
+markpatrolled
+masse
+match
+matchcount
+mathml
+mathtt
+matrixes
+matroska
+max
+maxage
+maxdim
+maxlag
+maxlength
+maxlifetime
+maxqueue
+maxresults
+maxsize
+maxuploadsize
+maxwidth
+mazeland
+mbresponse
+mbstring
+mckey
+mcklmqw
+mcrypt
+mcvalue
+md
+mdash
+medialink
+mediaqueries
+mediatype
+mediawarning
+mediawiki's
+mediawikipage
+megapixels
+member
+memberingroups
+members
+memc
+memcache
+memcached
+memlimit
+memoryp
+memsw
+merge
+mergeable
+merged
+mergehistory
+mergelog
+mergelogpagetext
+message
+messagekey
+messagename
+messagepattern
+messages
+messagetype
+meta
+metacharacters
+metachars
+metadata
+metadataversion
+metafile
+mhash
+mhtml
+micrblogging
+microdata
+microsyntaxes
+microtime
+middot
+migurski
+millitime
+mime
+mimer
+mimesearchdisabled
+mimetype
+min
+minangkabau
+minh
+minification
+minified
+minifier
+minifies
+minify
+minifying
+minimal
+minor
+minordefault
+minoredit
+minoreditletter
+minsize
+misconfigured
+misermode
+mismatch
+misresolved
+missing
+missingcommentheader
+missingcommenttext
+missingdata
+missingparam
+missingpermission
+missingresult
+missingrev
+missingsummary
+missingtext
+missingtitle
+missinguser
+mituzas
+mixedapproval
+mkdir
+mms
+mobile
+mobileformat
+mobileview
+modified
+modifiedarticleprotection
+modify
+modsecurity
+modsince
+module
+moduledisabled
+modulename
+modules
+monitor
+monobook
+monospace
+monospaced
+month
+monthsall
+moodbar
+moredotdotdot
+morelinkstoimage
+morethan
+move
+movedarticleprotection
+moveddeleted
+movedto
+movefile
+movelogpage
+movelogpagetext
+movenologintext
+movenotallowed
+movenotallowedfile
+moveonly
+moveoverredirect
+movepage
+moves
+movestable
+movesubpages
+movetalk
+movethispage
+movetoken
+mozilla
+mpeg
+mpegurl
+mpga
+mplink
+mptitle
+msdn
+msdownload
+msec
+msexcel
+msgid
+msgkey
+msgs
+msgsize
+msgsmall
+msgtext
+msie
+msmetafile
+mssql
+msvideo
+msword
+mtime
+mtype
+mullane
+multi
+multibyte
+multicast
+multipage
+multipageimage
+multipageimagenavbox
+multipart
+multiselect
+multisource
+multithreaded
+multival
+multivalue
+multpages
+munge
+musso
+mustbeloggedin
+mustbeposted
+mutator
+mutators
+muxers
+mwdumper
+mwfile
+mwstore
+mwsuggest
+mwuser
+mxircecho
+mycontributions
+mycontris
+myext
+myextension
+myisam
+mykey
+mypage
+mypreferences
+mysqldump
+mytalk
+mytext
+mywatchlist
+nabla
+name
+namehidden
+nameinlowercase
+names
+namespace
+namespacealiases
+namespacebanner
+namespacee
+namespacenotice
+namespacenumber
+namespaceoptions
+namespaceprotected
+namespaces
+namespacesall
+namespaceselector
+namespacing
+nassert
+nbase
+nbsp
+nbytes
+nchanges
+ncount
+ndash
+nearmatch
+nedersaksies
+nedersaksisch
+needreblock
+needservers
+needtoken
+netcdf
+netware
+never
+new
+newaddr
+newarticletext
+newarticletextanon
+newer
+newerthanrevid
+newgroups
+newheader
+newid
+newimages
+newlen
+newmessagesdifflink
+newmessagesdifflinkplural
+newmessageslink
+newmessageslinkplural
+newname
+newnames
+newnamespace
+newpage
+newpageletter
+newpages
+newpageshidepatrolled
+newparams
+newpass
+newpassword
+newpos
+newquery
+newrevid
+news
+newsectionlink
+newsectionsummary
+newset
+newsfeed
+newsize
+newtalk
+newtalks
+newtalkseparator
+newtext
+newtimestamp
+newtitle
+newuser
+newuserlogpage
+newuserlogpagetext
+newusers
+newwidth
+newwindow
+nextdiff
+nextid
+nextlink
+nextn
+nextpage
+nextredirect
+nextrevision
+nextval
+nfkc
+nginx
+nheight
+niklas
+nlink
+nlinks
+nmime
+nnnn
+nntp
+no
+noanimatethumb
+noanontoken
+noapiwrite
+noarchivename
+noarticle
+noarticletext
+noarticletextanon
+noautopatrol
+noblock
+nobots
+nobucket
+nobuffer
+nochange
+nochanges
+noclasses
+nocode
+nocomment
+nocomplete
+nocontent
+nocontentconvert
+nocontinue
+noconvertlink
+nocookiesfornew
+nocopyright
+nocourseid
+nocreate
+nocreatetext
+nocredits
+nocta
+nodata
+nodatabase
+nodb
+nodefault
+nodeid
+nodeleteablefile
+nodeletion
+nodelist
+nodename
+nodirection
+nodotdot
+noedit
+noeditsection
+noemail
+noemailprefs
+noemailtitle
+noeventid
+noexec
+noexpertise
+noexpression
+nofeed
+nofeedbackid
+nofile
+nofilekey
+nofilename
+nofilter
+noflagtype
+noflip
+nofollow
+nofound
+nogallery
+nogomatch
+nogroup
+noheader
+noheadings
+nohires
+noids
+noimage
+noimageredirect
+noimages
+noinclude
+noindex
+noindexing
+nointerwikipage
+nointerwikiuserrights
+noitem
+nojs
+nolabel
+nolang
+nolicense
+nolimit
+nolink
+nolinkstoimage
+nologging
+nologin
+nomahaction
+nominornewtalk
+nomodule
+non
+noname
+nonamespacenumber
+nonascii
+noncascading
+nondefaults
+none
+nonewsectionlink
+nonexistent
+nonfile
+nonfilenamespace
+nonincludable
+noninfringement
+noninitial
+nonlocal
+nonote
+nonredirects
+nonsense
+nonunicodebrowser
+noobjective
+noofexpiries
+noofprotections
+noop
+nooptions
+nooverride
+nopaction
+nopage
+nopageid
+nopagetext
+nopagetitle
+noparser
+nopathinfo
+nopermission
+noport
+noprefix
+noproject
+noprop
+noprotections
+noquestion
+noradius
+noratelimit
+norating
+norcid
+noread
+noreason
+noredir
+noredirect
+norequest
+norestrictiontypes
+noresult
+noreturnto
+norev
+norevid
+noreviewed
+normalizedtitle
+norole
+norollbackdiff
+noscale
+noschema
+noscript
+nosearch
+nosectiontitle
+nosession
+noshade
+noskipnotif
+noslash
+nosniff
+nosort
+nosortdirection
+nosource
+nospecialpagetext
+nost
+nosubaction
+nosubject
+nosubpage
+nosubpages
+nosuccess
+nosuchaction
+nosuchactiontext
+nosuchdatabase
+nosuchlogid
+nosuchpageid
+nosuchrcid
+nosuchrevid
+nosuchsection
+nosuchsectiontext
+nosuchsectiontitle
+nosuchspecialpage
+nosuchuser
+nosuchusershort
+nosummary
+notacceptable
+notag
+notaglist
+notalk
+notallowed
+notanarticle
+notarget
+notcached
+notdeleted
+note
+notempdir
+notemplate
+notext
+nothumb
+notif
+notificationtimestamp
+notificationtimestamps
+notin
+notitle
+notitleconvert
+notloggedin
+notminor
+noto
+notoc
+notoggle
+notoken
+notransform
+notreviewable
+notrustworthy
+notspecialpage
+notsuspended
+notvisiblerev
+notwatched
+notwikitext
+notype
+noudp
+noupdates
+nouploadmodule
+nouser
+nouserid
+nousername
+nouserspecified
+novalues
+noview
+nowatchlist
+nowellwritten
+nowiki
+nowlocal
+nowserver
+nparsing
+ns
+nsassociated
+nsfrom
+nsinvert
+nslinks
+nslist
+nsname
+nsnum
+nspname
+nsselect
+nstab
+nsub
+ntfs
+ntilde
+ntitle
+nuke
+null
+nullable
+numauthors
+number
+numberheadings
+numberingroup
+numberof
+numberofactiveusers
+numberofadmins
+numberofarticles
+numberofedits
+numberoffiles
+numberofpages
+numberofusers
+numberofviews
+numberofwatchingusers
+numedits
+numentries
+numericized
+numgroups
+numtalkauthors
+numtalkedits
+numwatchers
+nwidth
+oacute
+objectcache
+objective
+ocirc
+ocount
+oelig
+of
+officedocument
+offset
+offsite
+ofname
+ogevents
+ogghandler
+ograve
+old
+oldaddr
+oldcountable
+older
+olderror
+oldfile
+oldgroups
+oldid
+oldimage
+oldlen
+oldnamespace
+oldquery
+oldrev
+oldrevid
+oldreviewedpages
+oldshared
+oldsig
+oldsize
+oldtext
+oldtitle
+oldtitlemsg
+oline
+oname
+onkeyup
+online
+onload
+onlyauthor
+onlyinclude
+onlypst
+onlyquery
+onsubmit
+onthisday
+ontop
+openbasedir
+opendoc
+opendocument
+opensearch
+opensearchdescription
+openssl's
+openxml
+openxmlformats
+oplus
+oppositedm
+optgroup
+optgroups
+optionname
+options
+optionstoken
+optionvalue
+optstack
+or
+ordertype
+ordf
+ordm
+org
+origcategory
+ortime
+oslash
+other
+otherlanguages
+otherlist
+otheroption
+otherreason
+othertime
+otilde
+otimes
+otitle
+ouml
+outparam
+outputter
+outputtype
+outreachwiki
+over
+overridable
+override
+oversight
+oversighted
+oversighter
+overwrite
+overwroteimage
+own
+owner
+paction
+page
+pagecannotexist
+pagecategories
+pagecategorieslink
+pageclass
+pagecontent
+pagecount
+pagecss
+pagedeleted
+pagedlinks
+pageid
+pageids
+pageimages
+pageinfo
+pagelink
+pagelinks
+pagemerge
+pagename
+pagenamee
+pagenames
+pagenum
+pageoffset
+pagepropnames
+pageprops
+pagerestrictions
+pages
+pageselector
+pageset
+pagesetmodule
+pagesincategory
+pagesinnamespace
+pageswithprop
+pagetextmsg
+pagetitle
+pagetools
+pagetriage
+pagetriageaction
+pagetriagelist
+pagetriagestats
+pagetriagetagging
+pagetriagetemplate
+pageurl
+pageview
+param
+parameters
+paraminfo
+paramlist
+paramname
+params
+paren
+parens
+parentid
+parenttree
+parms
+parse
+parsedcomment
+parseddescription
+parsedsummary
+parseerror
+parseinline
+parsemag
+parser
+parsercache
+parserfuncs
+parserfunctions
+parserhook
+parserrender
+parsetree
+parsevalue
+parsoid
+partialupload
+partname
+pass's
+passthru
+password
+passwordfor
+passwordreset
+passwordtooshort
+paste
+pastexpiry
+pathchar
+pathinfo
+pathname
+patrol
+patroldisabled
+patrolled
+patrollink
+patrolmarks
+patroltoken
+pattern
+pcache
+pcntl
+pcomment
+pdbk
+pdf's
+pendingdelta
+perc
+perfcached
+perfcachedts
+perm
+perma
+permalink
+permdenied
+permil
+permissiondenied
+permissionerror
+permissionserrors
+permissionserrorstext
+permissiontype
+perp
+perrow
+pgsql
+photoshop
+php
+php's
+phpfm
+phps
+phpsapi
+phpunit
+phpversion
+phpwiki
+phrasewise
+phtml
+pi
+pipermail
+pixmap
+pkey
+pkuk
+pl
+plain
+plainlink
+plainlinks
+plaintext
+plfrom
+plink
+pllimit
+plns
+plpgsql
+pltitle
+pltitles
+plusminus
+plusmn
+pname
+pnmtojpeg
+pnmtopng
+poolcounter
+popts
+popularpages
+portlet
+portlets
+posplus
+possible
+postcomment
+postgre
+postsep
+potd
+potm
+potx
+poweredby
+poweredbyico
+powersearch
+pp
+ppam
+ppsm
+ppsx
+pptm
+pptx
+precaching
+precompiled
+preferences
+preferencestoken
+prefill
+prefilled
+prefix
+prefixindex
+prefixsearchdisabled
+prefs
+prefsection
+prefsnologin
+prefsnologintext
+prefsubmit
+preload
+preloads
+preloadtitle
+prepending
+prependtext
+preprocess
+preprocessing
+preprocessors
+presentationml
+presep
+prevchar
+prevdiff
+previd
+previewconflict
+previewhead
+previewheader
+previewnote
+previewonfirst
+previewontop
+previewtext
+previousrevision
+prevlink
+prevn
+prexpiry
+prfiltercascade
+prfx
+primary
+printableversion
+printfooter
+printurl
+privacypage
+private
+privs
+prlevel
+probabalistically
+probs
+proc
+processings
+procs
+prodromou
+profession
+profileinfo
+programmatically
+project
+projectpage
+promotion
+prop
+properties
+property
+propname
+props
+prot
+protect
+protectcomment
+protectedarticle
+protectedinterface
+protectednamespace
+protectedpage
+protectedpages
+protectedpagetext
+protectedpagewarning
+protectedtitle
+protectedtitles
+protection
+protections
+protectlevel
+protectlogpage
+protectlogtext
+protectthispage
+protecttoken
+proto
+protocol
+protocols
+protos
+proxied
+proxyblocker
+proxyblockreason
+proxyunbannable
+prtype
+psir
+pst
+psttext
+psychedelix
+pt
+ptext
+ptool
+pubdate
+publicsuffix
+publishfailed
+punycode
+purge
+purged
+qabardjajəbza
+qbar
+qbsettings
+qmoicj
+qp
+quasit
+query
+querycache
+querycachetwo
+querycur
+querydiff
+querykey
+querymodule
+querymodules
+querypage
+querypages
+querystring
+querytype
+question
+queuefull
+quickbar
+quicktemplate
+quicktime
+qunit
+quux
+qvalues
+rabdiff
+radic
+radius
+raggett
+raii
+raimond
+random
+randompage
+randomredirect
+randstr
+range
+rangeblock
+rangeblocks
+rangedisabled
+rangeend
+rangestart
+raquo
+rarr
+rarticle
+rasterizations
+rasterize
+rasterized
+rasterizer
+ratelimited
+ratelimits
+rating
+ratings
+raw
+rawfm
+rawrow
+rbspan
+rc
+rcdays
+rceil
+rcfeed
+rcid
+rcids
+rclimit
+rcoptions
+rcpatroldisabled
+rctitle
+rctoken
+rdev
+rdfa
+rdfrom
+rdftype
+rdquo
+read
+readable
+readapidenied
+readarray
+reader
+readline
+readonlyreason
+readonlytext
+readonlywarning
+readrequired
+readrights
+realaudio
+realllly
+realname
+realpath
+reason
+reasonlist
+reasonstr
+reblock
+rebuildtextindex
+recache
+recached
+recaching
+recalc
+recentchange
+recentchanges
+recentchangescount
+recentchangesdays
+recentchangeslinked
+recentchangestext
+recenteditcount
+recentedits
+recip
+recips
+recreate
+recurse
+recurses
+redir
+redirect
+redirectable
+redirectcreated
+redirectedfrom
+redirections
+redirectpagesub
+redirectparams
+redirects
+redirectsnippet
+redirectstofile
+redirecttitle
+redirectto
+redirid
+redirlinks
+redirs
+redis
+redlink
+redlinks
+redocument
+reedyboy
+reenables
+reencode
+reference
+refetch
+refresheducation
+refreshlinks
+regexes
+regexlike
+region
+registered
+registration
+registrationdate
+reimport
+reindexation
+reindexed
+releasenotes
+relevance
+relevant
+relicense
+relimit
+relkind
+relname
+relnamespace
+remarticle
+remembermypassword
+rememberpassword
+removablegroups
+removal
+remove
+removed
+removedwatchtext
+removetags
+remreviewer
+remstudent
+renameuser
+renaming
+renderable
+renormalized
+repeating
+repl
+replaceafter
+replacer
+replacers
+replag
+replyto
+reporttime
+repos
+request
+requested
+requestid
+requeue
+required
+rerender
+rerendered
+rescnt
+researcher
+resends
+reset
+resetkinds
+resetlink
+resetpass
+resized
+resolutioninfo
+resolutionunit
+resolve
+resolved
+resourceloader
+responsecode
+restore
+restorelink
+restoreprefs
+restricted
+result
+resultset
+resultsperpage
+retrievedfrom
+returnto
+returntoquery
+retval
+reupload
+revalidate
+revalidation
+revdel
+revdelete
+revdelete'd
+revdelundel
+revert
+reverting
+revertpage
+reverts
+revid
+revids
+review
+reviewactivity
+reviewed
+reviewer
+reviewing
+revision
+revisionasof
+revisionday
+revisiondelete
+revisionid
+revisionmonth
+revisions
+revisiontext
+revisiontimestamp
+revisionuser
+revisionyear
+revlink
+revwrongpage
+rfloor
+rgba
+richtext
+rights
+rightscode
+rightsinfo
+rightslog
+rightslogtext
+rked
+rmdir
+rn
+rnlimit
+robotstxt
+roff
+role
+rollback
+rollbacker
+rollbacklink
+rollbacklinkcount
+rollbacktoken
+rootpage
+rootuserpages
+rowcount
+rown
+rownum
+rowsarr
+rowset
+rowspan
+rowspans
+rsaquo
+rsargs
+rsd
+rsdf
+rsquo
+rss
+rsvg
+ruleset
+rulesets
+rusyn
+rv
+rvcontinue
+rvdiffto
+rvlimit
+rvparse
+rvprop
+rvstart
+rvstartid
+rvtoken
+sabino
+safemode
+safesubst
+sais
+sameorigin
+samp
+sansserif
+save
+savearticle
+savedprefs
+saveprefs
+saveusergroups
+sawfish
+sbin
+sbquo
+scaler
+scalers
+scaron
+score
+screensize
+scribunto
+scriptable
+scriptbuilder
+scriptpath
+scrolltop
+sdot
+search
+search's
+searchaction
+searcharticle
+searchboxes
+searchbutton
+searcheverything
+searchform
+searchindex
+searchinfo
+searchlimit
+searchmenu
+searchnamespaces
+searchoptions
+searchresulttext
+searchstring
+searchtitle
+secondary
+section
+sectionanchor
+sectionedit
+sectioneditnotsupported
+sectionformat
+sectionnumber
+sectionprop
+sections
+sectionsnippet
+sectionsnotsupported
+sectiontitle
+securelogin
+seiten
+selectandother
+selectorother
+self
+selflink
+selfmove
+semiglobal
+semiprotected
+semiprotectedpagewarning
+sendemail
+sendmail
+sentences
+serialize
+servedby
+servername
+servertime
+serverurl
+sess
+session
+sessionfailure
+sessionid
+sessionkey
+setchange
+setcookie
+setemail
+setext
+setglobalaccountstatus
+setnewtype
+setnotificationtimestamp
+setopt
+setrename
+setrlimit
+setstatus
+sha
+shar
+sharding
+shared
+shareddescriptionfollows
+sharedfile
+sharedrepo
+sharedupload
+shellscript
+shiftwidth
+shockwave
+short
+shorturl
+shouldn
+shouting
+show
+showalldb
+showbots
+showdeleted
+showdiff
+showdifflinks
+showfilename
+showhiddencats
+showhideminor
+showhooks
+showingresults
+showinitializer
+showjumplinks
+showlinkedto
+showme
+showmeta
+shownavigation
+shownumberswatching
+showpreview
+showredirs
+showreviewed
+showsizediff
+showtoc
+showtoolbar
+showunreviewed
+shtml
+si
+siebrand
+sighhhh
+sigkill
+sigmaf
+signup
+sigsegv
+sigterm
+sii
+siit
+siiurlwidth
+simplesearch
+singlegroup
+singularthey
+sinumberingroup
+siprop
+site
+siteadmin
+sitecsspreview
+sitedir
+siteinfo
+sitejspreview
+sitemap
+sitemaps
+sitematrix
+sitename
+sitenotice
+siteprop
+sitesearch
+sitestats
+sitestatsupdate
+siteuser
+sitewide
+size
+sizediff
+sizediffdisabled
+sizes
+skey
+skinclass
+skinkey
+skinname
+skinnameclass
+skins
+skipcache
+skipcaptcha
+skipnotif
+skname
+sktemplate
+slideshow
+sm
+smaxage
+smil
+smtp
+snippet
+sodipodi
+softtabstop
+solaris
+somecontent
+somefeed
+someuser
+sorani
+sorbs
+sorbsreason
+sort
+sortdirection
+sortkey
+sortkeyprefix
+sortkeys
+source
+soxred
+spam
+spamdetected
+spamprotected
+spamprotectionmatch
+spamprotectiontext
+spamprotectiontitle
+spcontent
+special
+specialpage
+specialpagealiases
+specialpageattributes
+specialpagegroup
+specialpages
+specialprotected
+speedtip
+speedy
+speex
+spekking
+spellcheck
+spezial
+spoofable
+spreadsheetml
+sprefs
+sprintf
+sprotected
+sql's
+sqlite
+sqltotal
+sr
+srchres
+srcset
+srgs
+srprop
+srwhat
+stabilize
+stable
+stablesettings
+stansvik
+start
+startid
+startime
+startsortkey
+startsortkeyprefix
+starttime
+starttimestamp
+stash
+stashfailed
+stashimageinfo
+state
+staticredirect
+statistics
+statline
+status
+statuskey
+stdclass
+stdout
+steward
+stopwords
+storedversion
+strcasecmp
+strcmp
+string
+stripos
+stripslashes
+strlen
+strpos
+strrpos
+strtime
+strtok
+strtolower
+strtotime
+strtr
+struct
+strval
+stubthreshold
+student
+studies
+stuffit
+stxt
+stylename
+stylepath
+styleversion
+subaction
+subarray
+subcat
+subcats
+subclassing
+subcond
+subconds
+subdir
+subdomain
+subdomains
+sube
+subelement
+subelements
+subfunction
+subfunctions
+subimages
+subitem
+subitems
+subject
+subjectid
+subjectids
+subjectpagename
+subjectpagenamee
+subjectspace
+subjectspacee
+subkey
+subkeys
+sublevels
+submatch
+submodule
+submodule's
+submodules
+subnet
+subpage
+subpagename
+subpagenamee
+subpages
+subpagestr
+subparents
+subprocesses
+subsql
+substr
+succ
+success
+successbox
+suckage
+suggest
+suggestion
+suhosin
+suhosin's
+summ
+summary
+summarymissed
+summaryrequired
+supe
+superdomain
+superglobals
+superset
+suppress
+suppressed
+suppressedredirect
+suppressionlog
+suppressionlogtext
+suppressredirect
+suppressrevision
+svgs
+svn
+svnroot
+sybase
+symlinked
+syms
+sysinfo
+sysop
+system
+systemnachrichten
+szdiff
+szlig
+szymon
+t
+tabindex
+tablealign
+tablecell
+tablename
+tablesorter
+tablestack
+tabletags
+tabletype
+tabstop
+tag
+tagfilter
+tagline
+taglist
+tags
+tagset
+tagstack
+tailorings
+talk
+talkable
+talkfrom
+talkid
+talkids
+talkmove
+talkmoveoverredirect
+talkpage
+talkpageheader
+talkpagelinktext
+talkpagename
+talkpagenamee
+talkpagetext
+talkspace
+talkspacee
+talkto
+taraškievica
+tarask
+target
+tb
+tbase
+tbody
+tboverride
+tcount
+tcsh
+tddate
+tdtime
+teardown
+telnet
+temp
+tempdir
+template
+templatelinks
+templatepage
+templates
+templatesused
+templatesusedpreview
+templatesusedsection
+tempname
+tempout
+test
+testclean
+testdata
+testmailuser
+testpass
+testrunner
+testswarm
+testuser
+testutf
+texi
+texinfo
+text
+textarea
+textareas
+textares
+textbox
+textboxsize
+texthidden
+textid
+textlink
+textmissing
+textoverride
+textsf
+textsize
+textvector
+texvc
+tfoot
+tful
+tg
+that'll
+thead
+thelink
+theora
+thetasym
+thinsp
+thisisdeleted
+thispage
+thumbborder
+thumbcaption
+thumberror
+thumbheight
+thumbhtml
+thumbimage
+thumbinner
+thumbmime
+thumbnail
+thumbnailing
+thumbnailsize
+thumbname
+thumbsize
+thumbtext
+thumburl
+thumbwidth
+timeago
+timeanddate
+timecond
+timecorrection
+timeframe
+timekey
+timeoffset
+timep
+timespans
+timestamp
+timestamps
+timestamptz
+timezonelegend
+timezoneregion
+timezoneuseoffset
+timezoneuseserverdefault
+tino
+title
+titleblacklist
+titleconversion
+titleexists
+titlemsg
+titleprefixeddbkey
+titleprotected
+titleprotectedwarning
+titles
+titlesnippet
+titletext
+titlevector
+tl
+tllimit
+tltemplates
+tmpfile
+to
+toclevel
+tocline
+tocnumber
+tocsection
+toctext
+toctitle
+tofragment
+toggle
+toid
+token
+tokenname
+tokens
+tolang
+tongminh
+toobig
+toofewexpiries
+toohigh
+toolarray
+toolbarparent
+toolboxend
+toolboxlink
+toolong
+toolow
+tooltiponly
+tooshort
+top
+toparse
+topbar
+toplevel
+toplinks
+toponly
+torev
+torevid
+tornevall
+torunblocked
+totalcnt
+totalcount
+totalhits
+totalmemory
+totaltime
+totitle
+touched
+tplarg
+transcludable
+transclude
+transcluded
+transcluding
+transclusion
+transclusions
+transcode
+transcodekey
+transcoder
+transcodereset
+transcodestatus
+transcoding
+translatewiki
+transstat
+transwiki
+troff
+true
+truespeed
+trustworthy
+truthy
+tsearch
+tsquery
+tuple
+tweakblogs
+tweakers
+txt
+txtfm
+type
+typemustmatch
+typeof
+typname
+tzstring
+uacute
+uarr
+uc
+ucfirst
+ucirc
+udpprofile
+ufffd
+ugrave
+ui
+uint
+ulimit
+ulink
+ulinks
+uname
+unanchored
+unapprove
+unary
+unattached
+unauthenticate
+unavailable
+unblock
+unblocklogentry
+unblockself
+unblocktoken
+unbuffered
+uncacheable
+uncached
+uncategorized
+unclosable
+uncompress
+undel
+undelete
+undeleted
+undeletion
+undo
+undoafter
+undofailure
+undorev
+unescape
+unescaped
+unfeature
+unfeatured
+unflag
+ungrouped
+unhelpful
+unhidden
+unhide
+unidata
+unindent
+unindexed
+uniq
+unique
+universaleditbutton
+unixtime
+unknown
+unknownerror
+unknownnamespace
+unlock
+unlockdb
+unlogged
+unmakesafe
+unmark
+unmerge
+unmodified
+unoversight
+unoversighted
+unpadded
+unpatrolled
+unpatrolledletter
+unprefixed
+unprintables
+unprotect
+unprotectedarticle
+unprotection
+unprotectthispage
+unredacted
+unrequest
+unrequested
+unresolve
+unresolved
+unreviewed
+unreviewedpages
+unsanitized
+unseed
+unserialization
+unserialize
+unserialized
+unserializing
+unsetting
+unstub
+unstubbed
+unstubbing
+unstubs
+unsupportednamespace
+unsupportedrepo
+untaint
+untracked
+untrustworthiness
+unused
+unusual
+unversioned
+unviewable
+unviewed
+unwatch
+unwatched
+unwatchedpages
+unwatching
+unwatchthispage
+unwikified
+unwritable
+upconvert
+updateddate
+updatedtime
+updatelog
+upgradedoc
+upgrader
+upload
+upload's
+uploaddisabled
+uploadedimage
+uploadjava
+uploadlogpage
+uploadlogpagetext
+uploadnewversion
+uploadnologintext
+uploadpage
+uploadscripted
+uploadsource
+uploadstash
+uploadvirus
+uppercased
+upsih
+urandom
+url
+url's
+urlaction
+urldecode
+urldecoded
+urlencode
+urlencoded
+urlheight
+urlparam
+urlparm
+urlpath
+urlvar
+urlwidth
+ursh
+us
+usedomain
+useemail
+uselang
+uselivepreview
+usemod
+usemsgcache
+usenewrc
+user
+useragent
+useragents
+userblock
+usercan
+usercontribs
+usercreate
+usercreated
+usercss
+usercsspreview
+usercssyoucanpreview
+userdailycontribs
+userdir
+userdoesnotexist
+usereditcount
+useredits
+useremail
+userexists
+usergroup
+usergroups
+userhidden
+userid
+userinfo
+userinvalidcssjstitle
+userips
+userjs
+userjsprev
+userjspreview
+userjsyoucanpreview
+userlang
+userlangattributes
+userlink
+userlinks
+userlogin
+userloginlink
+userloginprompt
+userlogout
+usermaildisabled
+usermessage
+username
+usernameless
+usernames
+userpage
+userpages
+userpageurl
+userprefix
+userrights
+userrightstoken
+users
+usersbody
+userspace
+usertalk
+usertalklink
+usertext
+usertoollinks
+useskin
+useto
+usort
+ustar
+ustoken
+utfnormal
+uuml
+validate
+validationbuilder
+valign
+vals
+value
+values
+vandal
+vandalism
+variables
+variant
+variantarticlepath
+varlang
+varname
+vars
+varval
+vasiliev
+vasilvv
+vbase
+vbscript
+vcount
+vcsize
+venema's
+verbosify
+version
+versioning
+versionlink
+versionlog
+versionrequired
+versionrequiredtext
+very
+vhost
+vi
+vibber
+videoinfo
+view
+viewcount
+viewdeleted
+viewhelppage
+viewprevnext
+viewsource
+viewsourcelink
+viewsourcetext
+viewvc
+viewyourtext
+visible
+visualeditor
+viurlwidth
+voff
+vofp
+voicexml
+vorbis
+vpad
+vrml
+vslow
+vvcv
+vxml
+wais
+wait
+wakeup
+walltime
+warmup
+warning
+wasdeleted
+wasn
+watch
+watchcreations
+watchdefault
+watchdeletion
+watched
+watchlist
+watchlistdays
+watchlisthideanons
+watchlisthidebots
+watchlisthideliu
+watchlisthideminor
+watchlisthideown
+watchlisthidepatrolled
+watchlistraw
+watchlists
+watchlisttoken
+watchmoves
+watchthis
+watchthispage
+watchtoken
+watchuser
+wb
+wbmp
+wbxml
+wddx
+wddxfm
+weblog
+webm
+webp
+webrequest
+webserver
+weeks
+weierp
+weight
+wellwritten
+werdna
+wget
+what
+whatlinkshere
+whatwg
+wheely
+wheter
+whitelist
+whitelisted
+whitelistedittext
+whitelisting
+whois
+wicke
+width
+widthx
+wierkosz
+wietse
+wiki
+wiki'd
+wiki's
+wikia
+wikiadmin
+wikibase
+wikibits
+wikibooks
+wikidb
+wikifarm
+wikiid
+wikilink
+wikilinks
+wikilove
+wikiloveimagelog
+wikimedia
+wikimediacommons
+wikipage
+wikipedia
+wikipedian
+wikipedias
+wikiprintable
+wikis
+wikisyntax
+wikitable
+wikitables
+wikitech
+wikitext
+wikiuser
+wiktionary
+wincache
+wininet
+withaccess
+withaction
+witheditsonly
+withlanglinks
+withoutlanglinks
+wl
+wlallrev
+wldir
+wlend
+wlexcludeuser
+wllimit
+wlowner
+wlprop
+wltoken
+wmf's
+wml
+wmlc
+wmls
+wmlsc
+wmlscript
+wmlscriptc
+wordcount
+wordprocessingml
+wordwg
+workalike
+worldwind
+wouldn
+wr
+writeapi
+writeapidenied
+writedisabled
+writerequired
+writerights
+wrongpassword
+x
+xbitmap
+xcache
+xcancel
+xdebug
+xdiff
+xdomain
+xdomains
+xff
+xhtmldefaultnamespace
+xhtmlnamespaces
+xiff
+xlam
+xlsb
+xlsm
+xlsx
+xltm
+xltx
+xml
+xmldoublequote
+xmlfm
+xmlimport
+xmlns
+xmlsafe
+xmlselect
+xor
+xpinstall
+xpixmap
+xpsdocument
+xtended
+xwindowdump
+xxxx
+xxxxx
+yacute
+yaml
+yamlfm
+year
+yes
+youhavenewmessages
+youhavenewmessagesfromusers
+youhavenewmessagesmanyusers
+youhavenewmessagesmulti
+yourdiff
+yourdomainname
+youremail
+yourgender
+yourinternal
+yourlanguage
+yourname
+yournick
+yourpassword
+yourrealname
+yourtext
+yourvariant
+yourwiki
+yuml
+yyyymmddhhiiss
+zhdaemon
+zhengzhu
+zhtable
+zijdel
+zlib
+zoffset
+zwnj
index 03f9659..7dcbeed 100644 (file)
@@ -4459,7 +4459,7 @@ List interrupted by empty line or heading
 <ul><li><ul><li> bar
 </li></ul>
 </li></ul>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a>]</span> <span class="mw-headline" id="A_heading"> A heading </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a>]</span> <span class="mw-headline" id="A_heading">A heading</span></h2>
 <ul><li> Another list item
 </li></ul>
 
@@ -4747,6 +4747,36 @@ Magic Word: {{SITENAME}}
 </p>
 !! end
 
+!! test
+Case-sensitive magic words, when cased differently, should just be template transclusions
+!! input
+{{CurrentMonth}}
+{{currentday}}
+{{cURreNTweEK}}
+{{currentHour}}
+!! result
+<p><a href="/index.php?title=Template:CurrentMonth&amp;action=edit&amp;redlink=1" class="new" title="Template:CurrentMonth (page does not exist)">Template:CurrentMonth</a>
+<a href="/index.php?title=Template:Currentday&amp;action=edit&amp;redlink=1" class="new" title="Template:Currentday (page does not exist)">Template:Currentday</a>
+<a href="/index.php?title=Template:CURreNTweEK&amp;action=edit&amp;redlink=1" class="new" title="Template:CURreNTweEK (page does not exist)">Template:CURreNTweEK</a>
+<a href="/index.php?title=Template:CurrentHour&amp;action=edit&amp;redlink=1" class="new" title="Template:CurrentHour (page does not exist)">Template:CurrentHour</a>
+</p>
+!! end
+
+!! test
+Case-insensitive magic words should still work with weird casing.
+!! input
+{{sErVeRNaMe}}
+{{LCFirst:AOEU}}
+{{ucFIRST:aoeu}}
+{{SERver}}
+!! result
+<p>example.org
+aOEU
+Aoeu
+<a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
+</p>
+!! end
+
 !! test
 Namespace 1 {{ns:1}}
 !! input
@@ -7524,7 +7554,7 @@ More
 ===Smaller headline===
 Blah blah
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1">Headline 1</span></h2>
 <p>Some text
 </p>
 <h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
@@ -7569,11 +7599,11 @@ Some text
 </li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1"> Subheadline 1 </span></h3>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level"> Skipping a level </span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2"> Skipping a level </span></h6>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2"> Headline 2 </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1">Headline 1</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1">Subheadline 1</span></h3>
+<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level">Skipping a level</span></h5>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2">Skipping a level</span></h6>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
 <p>Some text
 </p>
 <h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</span> <span class="mw-headline" id="Another_headline">Another headline</span></h3>
@@ -7624,12 +7654,12 @@ Handling of sections up to level 6 and beyond
 </li>
 </ul>
 </td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading"> Level 1 Heading</span></h1>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading"> Level 2 Heading</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading"> Level 3 Heading</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading"> Level 4 Heading</span></h4>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading"> Level 5 Heading</span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading"> Level 6 Heading</span></h6>
+<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading">Level 1 Heading</span></h1>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading">Level 2 Heading</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading">Level 3 Heading</span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading">Level 4 Heading</span></h4>
+<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading">Level 5 Heading</span></h5>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading">Level 6 Heading</span></h6>
 <h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span> <span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span></h6>
 <h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span> <span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span></h6>
 <h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span></h6>
@@ -7666,12 +7696,12 @@ TOC regression (bug 9764)
 </li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1">title 1</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1">title 1.1</span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1">title 1.1.1</span></h4>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2">title 1.2</span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2">title 2</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1">title 2.1</span></h3>
 
 !! end
 
@@ -7702,12 +7732,12 @@ wgMaxTocLevel=3
 </li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1">title 1</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1">title 1.1</span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1">title 1.1.1</span></h4>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2">title 1.2</span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2">title 2</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1">title 2.1</span></h3>
 
 !! end
 
@@ -7747,8 +7777,8 @@ Resolving duplicate section names
 == Foo bar ==
 == Foo bar ==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2"> Foo bar </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar">Foo bar</span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2">Foo bar</span></h2>
 
 !! end
 
@@ -7758,8 +7788,8 @@ Resolving duplicate section names with differing case (bug 10721)
 == Foo bar ==
 == Foo Bar ==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> Foo Bar </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar">Foo bar</span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2">Foo Bar</span></h2>
 
 !! end
 
@@ -7824,9 +7854,9 @@ __TOC__
 <li class="toclevel-1 tocsection-3"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1">title 1</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1">title 1.1</span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2">title 2</span></h2>
 
 !! end
 
@@ -7887,19 +7917,19 @@ section 5
 <li class="toclevel-1 tocsection-5"><a href="#text_.22_text"><span class="tocnumber">5</span> <span class="toctext">text " text</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text"> text &gt; text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text">text &gt; text</span></h2>
 <p>section 1
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text"> text &lt; text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text">text &lt; text</span></h2>
 <p>section 2
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a>]</span> <span class="mw-headline" id="text_.26_text"> text &amp; text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a>]</span> <span class="mw-headline" id="text_.26_text">text &amp; text</span></h2>
 <p>section 3
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text"> text ' text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text">text ' text</span></h2>
 <p>section 4
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a>]</span> <span class="mw-headline" id="text_.22_text"> text " text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a>]</span> <span class="mw-headline" id="text_.22_text">text " text</span></h2>
 <p>section 5
 </p>
 !! end
@@ -7928,6 +7958,45 @@ Headers with excess '=' characters
 
 !! end
 
+!! test
+HTML headers vs TOC (bug 23393)
+(__NOEDITSECTION__ for clearer output, doesn't matter here)
+!! input
+<h1>Header 1</h1>
+== Header 1.1 ==
+== Header 1.2 ==
+
+<h1>Header 2
+</h1>
+== Header 2.1 ==
+== Header 2.2 ==
+__NOEDITSECTION__
+!! result
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-1"><a href="#Header_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Header 1.1</span></a></li>
+<li class="toclevel-2 tocsection-2"><a href="#Header_1.2"><span class="tocnumber">1.2</span> <span class="toctext">Header 1.2</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1"><a href="#Header_2"><span class="tocnumber">2</span> <span class="toctext">Header 2</span></a>
+<ul>
+<li class="toclevel-2 tocsection-3"><a href="#Header_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Header 2.1</span></a></li>
+<li class="toclevel-2 tocsection-4"><a href="#Header_2.2"><span class="tocnumber">2.2</span> <span class="toctext">Header 2.2</span></a></li>
+</ul>
+</li>
+</ul>
+</td></tr></table>
+<h1> <span class="mw-headline" id="Header_1">Header 1</span></h1>
+<h2> <span class="mw-headline" id="Header_1.1">Header 1.1</span></h2>
+<h2> <span class="mw-headline" id="Header_1.2">Header 1.2</span></h2>
+<h1> <span class="mw-headline" id="Header_2">Header 2</span></h1>
+<h2> <span class="mw-headline" id="Header_2.1">Header 2.1</span></h2>
+<h2> <span class="mw-headline" id="Header_2.2">Header 2.2</span></h2>
+
+!! end
+
 !! test
 BUG 1219 URL next to image (broken)
 !! input
@@ -9211,7 +9280,7 @@ Fuzz testing: Parser14
 == onmouseover= ==
 http://__TOC__
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D"> onmouseover= </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D">onmouseover=</span></h2>
 http://<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
@@ -11150,7 +11219,7 @@ anchorencode encodes like the TOC generator: (bug 18431)
 {{anchorencode: _ +:.3A%3A&&amp;]] }}
 __NOEDITSECTION__
 !! result
-<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D"> _ +:.3A%3A&amp;&amp;]] </span></h3>
+<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D">_ +:.3A%3A&amp;&amp;]]</span></h3>
 <p>.2B:.3A.253A.26.26.5D.5D
 </p>
 !! end
@@ -11380,7 +11449,7 @@ language=sr variant=sr-ec
 !! input
 == -{Naslov}- ==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-"> Naslov </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-">Naslov</span></h2>
 
 !! end
 
@@ -12541,7 +12610,7 @@ __TOC__
 <li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"> <i>Lost</i> episodes </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"><i>Lost</i> episodes</span></h2>
 
 !! end
 
@@ -12558,7 +12627,7 @@ __TOC__
 <li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"> <b>should be bold</b> then normal text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"><b>should be bold</b> then normal text</span></h2>
 
 !! end
 
@@ -12575,7 +12644,7 @@ __TOC__
 <li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image"> Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image">Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></span></h2>
 
 !! end
 
@@ -12592,7 +12661,7 @@ __TOC__
 <li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"> <blockquote>Quote</blockquote> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"><blockquote>Quote</blockquote></span></h2>
 
 !! end
 
@@ -12611,7 +12680,7 @@ QED
 <li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3"> Proof: 2 &lt; 3 </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3">Proof: 2 &lt; 3</span></h2>
 <p><small>Hanc marginis exiguitas non caperet.</small>
 QED
 </p>
@@ -12631,8 +12700,8 @@ __TOC__
 <li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"> <i>Foo</i> <b>Bar</b> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> <i>Foo</i> <blockquote>Bar</blockquote> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"><i>Foo</i> <b>Bar</b></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"><i>Foo</i> <blockquote>Bar</blockquote></span></h2>
 
 !! end
 
@@ -12650,8 +12719,8 @@ __TOC__
 <li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"> <sup class="in-h2">Hello</sup> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"> <sup> b"&gt;Evilbye</sup> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"><sup class="in-h2">Hello</sup></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"><sup> b"&gt;Evilbye</sup></span></h2>
 
 !! end
 
@@ -12678,11 +12747,11 @@ __TOC__
 <li class="toclevel-1 tocsection-5"><a href="#Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span class="tocnumber">5</span> <span class="toctext"><span dir="ltr">Attributes after dir on these span tags must be deleted from the TOC</span></span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: C++">edit</a>]</span> <span class="mw-headline" id="C.2B.2B"> <span dir="ltr">C++</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: זבנג!">edit</a>]</span> <span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"> <span dir="rtl">זבנג!</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"> <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: C++">edit</a>]</span> <span class="mw-headline" id="C.2B.2B"><span dir="ltr">C++</span></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: זבנג!">edit</a>]</span> <span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"><span dir="rtl">זבנג!</span></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span></span></h2>
 
 !! end
 
@@ -12699,7 +12768,7 @@ title=[[Main Page]]
 !! input
 {{int:Bug32057}}
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text"> Headline text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text">Headline text</span></h2>
 
 !! end
 
index e0e5535..c840056 100644 (file)
@@ -87,8 +87,7 @@ class ExtraParserTest extends MediaWikiTestCase {
         * cleanSig() should do nothing if disabled
         */
        function testCleanSigDisabled() {
-               global $wgCleanSignatures;
-               $wgCleanSignatures = false;
+               $this->setMwGlobals( 'wgCleanSignatures', false );
 
                $title = Title::newFromText( __FUNCTION__ );
                $outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
index 24fc47c..2e6417f 100644 (file)
@@ -570,7 +570,7 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $index, "wfMakeUrlIndexes(\"$url\")" );
        }
 
-       function provideMakeUrlIndexes() {
+       public static function provideMakeUrlIndexes() {
                return array(
                        array(
                                // just a regular :)
@@ -627,7 +627,7 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $actual, $description );
        }
 
-       function provideWfMatchesDomainList() {
+       public static function provideWfMatchesDomainList() {
                $a = array();
                $protocols = array( 'HTTP' => 'http:', 'HTTPS' => 'https:', 'protocol-relative' => '' );
                foreach ( $protocols as $pDesc => $p ) {
@@ -658,7 +658,7 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $actual, $description );
        }
 
-       function provideWfShellMaintenanceCmdList() {
+       public static function provideWfShellMaintenanceCmdList() {
                global $wgPhpCli;
                return array(
                        array( 'eval.php', array( '--help', '--test' ), array(),
index 4879a38..c585726 100644 (file)
@@ -11,7 +11,7 @@ class GlobalWithDBTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, wfIsBadImage( $name, $title, $blacklist ), $desc );
        }
 
-       function provideWfIsBadImageList() {
+       public static function provideWfIsBadImageList() {
                $blacklist = '* [[File:Bad.jpg]] except [[Nasty page]]';
                return array(
                        array( 'Bad.jpg', false, $blacklist, true,
index 8df038d..6229be3 100644 (file)
@@ -28,7 +28,7 @@ class WfBCP47Test extends MediaWikiTestCase {
        /**
         * Array format is ($code, $expected)
         */
-       function provideLanguageCodes() {
+       public static function provideLanguageCodes() {
                return array(
                        // Extracted from BCP47 (list not exhaustive)
                        # 2.1.1
index 407be8d..3c4fa20 100644 (file)
@@ -11,7 +11,7 @@ class WfBaseNameTest extends MediaWikiTestCase {
                        "wfBaseName('$fullpath') => '$basename'" );
        }
 
-       function providePaths() {
+       public static function providePaths() {
                return array(
                        array( '', '' ),
                        array( '/', '' ),
index c1225e3..8c67ced 100644 (file)
@@ -6,11 +6,10 @@ class WfExpandUrlTest extends MediaWikiTestCase {
        /** @dataProvider provideExpandableUrls */
        public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
                // Fake $wgServer and $wgCanonicalServer
-               global $wgServer, $wgCanonicalServer;
-               $oldServer = $wgServer;
-               $oldCanServer = $wgCanonicalServer;
-               $wgServer = $server;
-               $wgCanonicalServer = $canServer;
+               $this->setMwGlobals( array(
+                       'wgServer' => $server,
+                       'wgCanonicalServer' => $canServer,
+               ) );
 
                // Fake $_SERVER['HTTPS'] if needed
                if ( $httpsMode ) {
@@ -20,10 +19,6 @@ class WfExpandUrlTest extends MediaWikiTestCase {
                }
 
                $this->assertEquals( $fullUrl, wfExpandUrl( $shortUrl, $defaultProto ), $message );
-
-               // Restore $wgServer and $wgCanonicalServer
-               $wgServer = $oldServer;
-               $wgCanonicalServer = $oldCanServer;
        }
 
        /**
index 9d66d6b..e4e33d1 100644 (file)
@@ -12,7 +12,7 @@ class WfShorthandToIntegerTest extends MediaWikiTestCase {
                );
        }
 
-       function provideABunchOfShorthands() {
+       public static function provideABunchOfShorthands() {
                return array(
                        array( '', -1, 'Empty string' ),
                        array( '     ', -1, 'String of spaces' ),
index cf1830f..ddfffe8 100644 (file)
@@ -10,7 +10,7 @@ class WfTimestampTest extends MediaWikiTestCase {
                $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
        }
 
-       function provideNormalTimestamps() {
+       public static function provideNormalTimestamps() {
                $t = gmmktime( 12, 34, 56, 1, 15, 2001 );
                return array(
                        // TS_UNIX
@@ -60,7 +60,7 @@ class WfTimestampTest extends MediaWikiTestCase {
                $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
        }
 
-       function provideOldTimestamps() {
+       public static function provideOldTimestamps() {
                return array(
                        array( '19011213204554', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:54 GMT', 'Earliest time according to php documentation' ),
                        array( '20380119031407', TS_RFC2822, 'Tue, 19 Jan 2038 03:14:07 GMT', 'Latest 32 bit time' ),
@@ -99,7 +99,7 @@ class WfTimestampTest extends MediaWikiTestCase {
                $this->assertEquals( $output, wfTimestamp( TS_MW, $input ), $desc );
        }
 
-       function provideHttpDates() {
+       public static function provideHttpDates() {
                return array(
                        array( 'Sun, 06 Nov 1994 08:49:37 GMT', '19941106084937', 'RFC 822 date' ),
                        array( 'Sunday, 06-Nov-94 08:49:37 GMT', '19941106084937', 'RFC 850 date' ),
index 590664e..9e3d3a4 100644 (file)
@@ -43,8 +43,6 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        public function testElementBasics() {
-               global $wgWellFormedXml;
-
                $this->assertEquals(
                        '<img>',
                        Html::element( 'img', null, '' ),
@@ -63,7 +61,7 @@ class HtmlTest extends MediaWikiTestCase {
                        'Close tag for empty element (array, string)'
                );
 
-               $wgWellFormedXml = true;
+               $this->setMwGlobals( 'wgWellFormedXml', true );
 
                $this->assertEquals(
                        '<img />',
@@ -90,8 +88,6 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        public function testExpandAttributesForBooleans() {
-               global $wgHtml5, $wgWellFormedXml;
-
                $this->assertEquals(
                        '',
                        Html::expandAttributes( array( 'selected' => false ) ),
@@ -114,7 +110,7 @@ class HtmlTest extends MediaWikiTestCase {
                        'Boolean attributes have no value when value is true (passed as numerical array)'
                );
 
-               $wgWellFormedXml = true;
+               $this->setMwGlobals( 'wgWellFormedXml', true );
 
                $this->assertEquals(
                        ' selected=""',
@@ -122,7 +118,7 @@ class HtmlTest extends MediaWikiTestCase {
                        'Boolean attributes have empty string value when value is true (wgWellFormedXml)'
                );
 
-               $wgHtml5 = false;
+               $this->setMwGlobals( 'wgHtml5', false );
 
                $this->assertEquals(
                        ' selected="selected"',
@@ -136,8 +132,6 @@ class HtmlTest extends MediaWikiTestCase {
         * Please note it output a string prefixed with a space!
         */
        public function testExpandAttributesVariousExpansions() {
-               global $wgWellFormedXml;
-
                ### NOT EMPTY ####
                $this->assertEquals(
                        ' empty_string=""',
@@ -160,7 +154,7 @@ class HtmlTest extends MediaWikiTestCase {
                        'Number 0 value needs no quotes'
                );
 
-               $wgWellFormedXml = true;
+               $this->setMwGlobals( 'wgWellFormedXml', true );
 
                $this->assertEquals(
                        ' empty_string=""',
@@ -418,7 +412,7 @@ class HtmlTest extends MediaWikiTestCase {
         * List of input element types values introduced by HTML5
         * Full list at http://www.w3.org/TR/html-markup/input.html
         */
-       function provideHtml5InputTypes() {
+       public static function provideHtml5InputTypes() {
                $types = array(
                        'datetime',
                        'datetime-local',
index e353c46..ec4d98e 100644 (file)
@@ -17,7 +17,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                );
        }
 
-       function provideCasesForUserLink() {
+       public static function provideCasesForUserLink() {
                # Format:
                # - expected
                # - userid
index c378bb8..0f74899 100644 (file)
@@ -56,12 +56,18 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'abcdefghijka2', $msg->params( $params )->plain(), 'Params > 9 are replaced correctly' );
        }
 
-       function testInContentLanguage() {
-               global $wgLang, $wgForceUIMsgAsContentMsg;
-               $wgLang = Language::factory( 'fr' );
+       function testInContentLanguageDisabled() {
+               $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
 
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg disabled' );
-               $wgForceUIMsgAsContentMsg['testInContentLanguage'] = 'mainpage';
+       }
+
+       function testInContentLanguageEnabled() {
+               $this->setMwGlobals( array(
+                       'wgLang' => Language::factory( 'fr' ),
+                       'wgForceUIMsgAsContentMsg' => array( 'mainpage' ),
+               ) );
+
                $this->assertEquals( 'Accueil', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg enabled' );
        }
 
index 3948e34..39673c0 100644 (file)
@@ -6,14 +6,9 @@
  * ^--- important, causes temporary tables to be used instead of the real database
  */
 class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
-       var $saveContentHandlerNoDB = null;
 
        function setUp() {
-               global $wgContentHandlerUseDB;
-
-               $this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
-
-               $wgContentHandlerUseDB = false;
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
 
                $dbw = wfGetDB( DB_MASTER );
 
@@ -32,14 +27,6 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
                parent::setUp();
        }
 
-       function tearDown() {
-               global $wgContentHandlerUseDB;
-
-               parent::tearDown();
-
-               $wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
-       }
-
        /**
         * @covers Revision::selectFields
         */
index db0245b..9380928 100644 (file)
@@ -134,9 +134,7 @@ class RevisionTest extends MediaWikiTestCase {
 
        function testCompressRevisionTextUtf8Gzip() {
                $this->checkPHPExtension( 'zlib' );
-
-               global $wgCompressRevisions;
-               $wgCompressRevisions = true;
+               $this->setMwGlobals( 'wgCompressRevisions', true );
 
                $row = new stdClass;
                $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
index c0ed4a5..f5aacab 100644 (file)
@@ -90,7 +90,7 @@ class SanitizerTest extends MediaWikiTestCase {
        /**
         * Provide HTML5 tags
         */
-       function provideHtml5Tags() {
+       public static function provideHtml5Tags() {
                $ESCAPED = true; # We want tag to be escaped
                $VERBATIM = false; # We want to keep the tag
                return array(
@@ -125,7 +125,7 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function provideTagAttributesToDecode() {
+       public static function provideTagAttributesToDecode() {
                return array(
                        array( array( 'foo' => 'bar' ), 'foo=bar', 'Unquoted attribute' ),
                        array( array( 'foo' => 'bar' ), '    foo   =   bar    ', 'Spaced attribute' ),
@@ -229,7 +229,7 @@ class SanitizerTest extends MediaWikiTestCase {
        /**
         * Test for support or lack of support for specific attributes in the attribute whitelist.
         */
-       function provideAttributeSupport() {
+       public static function provideAttributeSupport() {
                /** array( <attributes>, <expected>, <message> ) */
                return array(
                        array( 'div', ' role="presentation"', ' role="presentation"', 'Support for WAI-ARIA\'s role="presentation".' ),
index 3422c90..4b49f63 100644 (file)
@@ -138,8 +138,8 @@ testBrowser                 = "firefox"
                $seleniumSettings = array();
                $seleniumBrowsers = array();
                $seleniumTestSuites = array();
-               global $wgSeleniumConfigFile;
-               $wgSeleniumConfigFile = '';
+               $this->setMwGlobals( 'wgSeleniumConfigFile', '' );
+
                SeleniumConfig::getSeleniumSettings( $seleniumSettings,
                        $seleniumBrowsers,
                        $seleniumTestSuites );
@@ -152,9 +152,9 @@ testBrowser                 = "firefox"
                $seleniumSettings = array();
                $seleniumBrowsers = array();
                $seleniumTestSuites = array();
-               global $wgSeleniumConfigFile;
                $this->writeToTempFile( $this->testConfig0 );
-               $wgSeleniumConfigFile = $this->tempFileName;
+               $this->setMwGlobals( 'wgSeleniumConfigFile', $this->tempFileName );
+
                SeleniumConfig::getSeleniumSettings( $seleniumSettings,
                        $seleniumBrowsers,
                        $seleniumTestSuites );
index db3d265..a54a57e 100644 (file)
@@ -57,7 +57,7 @@ class StringUtilsTest extends MediaWikiTestCase {
         * Markus Kuhn:
         * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
         */
-       function provideStringsForIsUtf8Check() {
+       public static function provideStringsForIsUtf8Check() {
                // Expected return values for StringUtils::isUtf8()
                $PASS = true;
                $FAIL = false;
index a906785..cff8a2f 100644 (file)
@@ -230,7 +230,7 @@ class TitleTest extends MediaWikiTestCase {
                );
        }
 
-       function provideCasesForGetpageviewlanguage() {
+       public static function provideCasesForGetpageviewlanguage() {
                # Format:
                # - expected
                # - Title name
@@ -280,7 +280,7 @@ class TitleTest extends MediaWikiTestCase {
                );
        }
 
-       function provideBaseTitleCases() {
+       public static function provideBaseTitleCases() {
                return array(
                        # Title, expected base, optional message
                        array( 'User:John_Doe/subOne/subTwo', 'John Doe/subOne' ),
@@ -319,7 +319,7 @@ class TitleTest extends MediaWikiTestCase {
                );
        }
 
-       function provideSubpageTitleCases() {
+       public static function provideSubpageTitleCases() {
                return array(
                        # Title, expected base, optional message
                        array( 'User:John_Doe/subOne/subTwo', 'subTwo' ),
index 46f8025..d382f6f 100644 (file)
@@ -102,10 +102,12 @@ class WebRequestTest extends MediaWikiTestCase {
         * @dataProvider provideGetIP
         */
        function testGetIP( $expected, $input, $squid, $private, $description ) {
-               global $wgSquidServersNoPurge, $wgUsePrivateIPs;
                $_SERVER = $input;
-               $wgSquidServersNoPurge = $squid;
-               $wgUsePrivateIPs = $private;
+               $this->setMwGlobals( array(
+                       'wgSquidServersNoPurge' => $squid,
+                       'wgUsePrivateIPs' => $private,
+               ) );
+
                $request = new WebRequest();
                $result = $request->getIP();
                $this->assertEquals( $expected, $result, $description );
index 1d937e9..dca9910 100644 (file)
@@ -6,16 +6,10 @@
  * ^--- important, causes temporary tables to be used instead of the real database
  */
 class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
-       var $saveContentHandlerNoDB = null;
 
        function setUp() {
-               global $wgContentHandlerUseDB;
-
                parent::setUp();
-
-               $this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
-
-               $wgContentHandlerUseDB = false;
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
 
                $dbw = wfGetDB( DB_MASTER );
 
@@ -32,14 +26,6 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
                }
        }
 
-       function tearDown() {
-               global $wgContentHandlerUseDB;
-
-               $wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
-
-               parent::tearDown();
-       }
-
        public function testGetContentModel() {
                $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
 
index 8f6b935..8842766 100644 (file)
@@ -109,7 +109,7 @@ class ApiBlockTest extends ApiTestCase {
        /**
         * Just provide the 'block' and 'unblock' action to test both API calls
         */
-       function provideBlockUnblockAction() {
+       public static function provideBlockUnblockAction() {
                return array(
                        array( 'block' ),
                        array( 'unblock' ),
index 1efbaea..06f93d7 100644 (file)
@@ -124,7 +124,7 @@ class ApiEditPageTest extends ApiTestCase {
                $this->assertEquals( $data, $page->getContent()->serialize() );
        }
 
-       static function provideEditAppend() {
+       public static function provideEditAppend() {
                return array(
                        array( #0: append
                                'foo', 'append', 'bar', "foobar"
index 4cc8bd2..eda06d4 100644 (file)
@@ -63,7 +63,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expectedContent, $result, "Message fallback failed." );
        }
 
-       function provideMessagesForFallback() {
+       public static function provideMessagesForFallback() {
                return array(
                        array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
                        array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
@@ -83,7 +83,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expectedContent, $result, "Full key message fallback failed." );
        }
 
-       function provideMessagesForFullKeys() {
+       public static function provideMessagesForFullKeys() {
                return array(
                        array( 'MessageCacheTest-FullKeyTest/ru', 'ru', 'ru' ),
                        array( 'MessageCacheTest-FullKeyTest/ru', 'ab', 'ru' ),
index 382f71a..4fc2d51 100644 (file)
@@ -211,15 +211,11 @@ class TextContentTest extends MediaWikiLangTestCase {
         * @group Database
         */
        public function testIsCountable( $text, $hasLinks, $mode, $expected ) {
-               global $wgArticleCountMethod;
-
-               $old = $wgArticleCountMethod;
-               $wgArticleCountMethod = $mode;
+               $this->setMwGlobals( 'wgArticleCountMethod', $mode );
 
                $content = $this->newContent( $text );
 
                $v = $content->isCountable( $hasLinks, $this->context->getTitle() );
-               $wgArticleCountMethod = $old;
 
                $this->assertEquals( $expected, $v, 'isCountable() returned unexpected value ' . var_export( $v, true )
                        . ' instead of ' . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
index 65c80d1..c9f5f5c 100644 (file)
@@ -209,4 +209,10 @@ class DatabaseTest extends MediaWikiTestCase {
                                . ( $this->db->getType() == 'postgres' ? '()' : '' )
                );
        }
+
+       function testUnknownTableCorruptsResults() {
+               $res = $this->db->select( 'page', '*', array( 'page_id' => 1 ) );
+               $this->assertFalse( $this->db->tableExists( 'foobarbaz' ) );
+               $this->assertInternalType( 'int', $res->numRows() );
+       }
 }
index 9fbf7bb..cacaaa3 100644 (file)
@@ -88,7 +88,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "FileBackend::isStoragePath on path '$path'" );
        }
 
-       function provider_testIsStoragePath() {
+       public static function provider_testIsStoragePath() {
                return array(
                        array( 'mwstore://', true ),
                        array( 'mwstore://backend', true ),
@@ -112,7 +112,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "FileBackend::splitStoragePath on path '$path'" );
        }
 
-       function provider_testSplitStoragePath() {
+       public static function provider_testSplitStoragePath() {
                return array(
                        array( 'mwstore://backend/container', array( 'backend', 'container', '' ) ),
                        array( 'mwstore://backend/container/', array( 'backend', 'container', '' ) ),
@@ -136,7 +136,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "FileBackend::normalizeStoragePath on path '$path'" );
        }
 
-       function provider_normalizeStoragePath() {
+       public static function provider_normalizeStoragePath() {
                return array(
                        array( 'mwstore://backend/container', 'mwstore://backend/container' ),
                        array( 'mwstore://backend/container/', 'mwstore://backend/container' ),
@@ -162,7 +162,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "FileBackend::parentStoragePath on path '$path'" );
        }
 
-       function provider_testParentStoragePath() {
+       public static function provider_testParentStoragePath() {
                return array(
                        array( 'mwstore://backend/container/path/to/obj', 'mwstore://backend/container/path/to' ),
                        array( 'mwstore://backend/container/path/to', 'mwstore://backend/container/path' ),
@@ -927,7 +927,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       function provider_testConcatenate() {
+       public static function provider_testConcatenate() {
                $cases = array();
 
                $rand = mt_rand( 0, 2000000000 ) . time();
@@ -1041,7 +1041,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       function provider_testGetFileStat() {
+       public static function provider_testGetFileStat() {
                $cases = array();
 
                $base = self::baseStorePath();
@@ -1096,7 +1096,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       function provider_testGetFileContents() {
+       public static function provider_testGetFileContents() {
                $cases = array();
 
                $base = self::baseStorePath();
@@ -1164,7 +1164,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $tmpFile->bind( $obj );
        }
 
-       function provider_testGetLocalCopy() {
+       public static function provider_testGetLocalCopy() {
                $cases = array();
 
                $base = self::baseStorePath();
@@ -1230,7 +1230,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       function provider_testGetLocalReference() {
+       public static function provider_testGetLocalReference() {
                $cases = array();
 
                $base = self::baseStorePath();
@@ -1305,7 +1305,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       function provider_testGetFileHttpUrl() {
+       public static function provider_testGetFileHttpUrl() {
                $cases = array();
 
                $base = self::baseStorePath();
@@ -1329,7 +1329,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       function provider_testPrepareAndClean() {
+       public static function provider_testPrepareAndClean() {
                $base = self::baseStorePath();
                return array(
                        array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
index 74b921a..2642541 100644 (file)
@@ -20,7 +20,7 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
        /**
         * Provider for testFormat()
         */
-       function provideDocFormattingTests() {
+       public static function provideDocFormattingTests() {
                # Format: (expected string, unformattedText string, optional message)
                return array(
                        # Escape some wikitext
index f3f9c11..7d4b2bb 100644 (file)
@@ -8,7 +8,6 @@
 class JobQueueTest extends MediaWikiTestCase {
        protected $key;
        protected $queueRand, $queueRandTTL, $queueFifo, $queueFifoTTL;
-       protected $old = array();
 
        function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
@@ -17,10 +16,11 @@ class JobQueueTest extends MediaWikiTestCase {
        }
 
        protected function setUp() {
-               global $wgMemc, $wgJobTypeConf;
+               global $wgJobTypeConf;
                parent::setUp();
-               $this->old['wgMemc'] = $wgMemc;
-               $wgMemc = new HashBagOStuff();
+
+               $this->setMwGlobals( 'wgMemc', new HashBagOStuff() );
+
                if ( $this->getCliArg( 'use-jobqueue=' ) ) {
                        $name = $this->getCliArg( 'use-jobqueue=' );
                        if ( !isset( $wgJobTypeConf[$name] ) ) {
@@ -51,7 +51,6 @@ class JobQueueTest extends MediaWikiTestCase {
        }
 
        protected function tearDown() {
-               global $wgMemc;
                parent::tearDown();
                foreach ( array(
                        'queueRand', 'queueRandTTL', 'queueTimestamp', 'queueTimestampTTL',
@@ -67,7 +66,6 @@ class JobQueueTest extends MediaWikiTestCase {
                        }
                        $this->$q = null;
                }
-               $wgMemc = $this->old['wgMemc'];
        }
 
        /**
@@ -288,7 +286,7 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
        }
 
-       function provider_queueLists() {
+       public static function provider_queueLists() {
                return array(
                        array( 'queueRand', false, 'Random queue without ack()' ),
                        array( 'queueRandTTL', true, 'Random queue with ack()' ),
@@ -299,7 +297,7 @@ class JobQueueTest extends MediaWikiTestCase {
                );
        }
 
-       function provider_fifoQueueLists() {
+       public static function provider_fifoQueueLists() {
                return array(
                        array( 'queueFifo', false, 'Ordered queue without ack()' ),
                        array( 'queueFifoTTL', true, 'Ordered queue with ack()' )
index 56dc648..5051830 100644 (file)
@@ -47,7 +47,7 @@ class ServicesJsonTest extends MediaWikiTestCase {
                }
        }
 
-       function provideValuesToEncode() {
+       public static function provideValuesToEncode() {
                $obj = new stdClass();
                $obj->property = 'value';
                $obj->property2 = null;
@@ -71,7 +71,7 @@ class ServicesJsonTest extends MediaWikiTestCase {
                );
        }
 
-       function provideValuesToDecode() {
+       public static function provideValuesToDecode() {
                return array(
                        array( '1', 'basic integer' ),
                        array( '-1', 'negative integer' ),
index 26747b9..632eb52 100644 (file)
@@ -54,7 +54,7 @@ class CSSJanusTest extends MediaWikiTestCase {
         * These transform cases are tested *in both directions*
         * No need to declare a principle twice in both directions here.
         */
-       function provideTransformCases() {
+       public static function provideTransformCases() {
                return array(
                        // Property keys
                        array(
@@ -476,7 +476,7 @@ class CSSJanusTest extends MediaWikiTestCase {
         * If both ways can be tested, either put both versions in here or move
         * it to provideTransformCases().
         */
-       function provideTransformAdvancedCases() {
+       public static function provideTransformAdvancedCases() {
                $bgPairs = array(
                        # [ - _ . ] <-> [ left right ltr rtl ]
                        'foo.jpg' => 'foo.jpg',
@@ -542,7 +542,7 @@ class CSSJanusTest extends MediaWikiTestCase {
         * Cases that are currently failing, but
         * should be looked at in the future as enhancements and/or bug fix
         */
-       function provideTransformBrokenCases() {
+       public static function provideTransformBrokenCases() {
                return array(
                        // Guard against selectors that look flippable
                        array(
index 57017a8..e9901ce 100644 (file)
@@ -27,7 +27,7 @@ class CSSMinTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedOutput, $minified, 'Minified output should be in the form expected.' );
        }
 
-       function provideMinifyCases() {
+       public static function provideMinifyCases() {
                return array(
                        // Whitespace
                        array( "\r\t\f \v\n\r", "" ),
@@ -77,7 +77,7 @@ class CSSMinTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedOutput, $remapped, 'CSSMin::remap should return the expected url form.' . $messageAdd );
        }
 
-       function provideRemapCases() {
+       public static function provideRemapCases() {
                // Parameter signature:
                // CSSMin::remap( $code, $local, $remote, $embedData = true )
                return array(
@@ -119,7 +119,7 @@ class CSSMinTest extends MediaWikiTestCase {
                $this->testMinifyOutput( $code, $expectedOutput );
        }
 
-       function provideStringCases() {
+       public static function provideStringCases() {
                return array(
                        // String values should be respected
                        // - More than one space in a string value
index 1f55079..eb64a64 100644 (file)
@@ -2,7 +2,7 @@
 
 class JavaScriptMinifierTest extends MediaWikiTestCase {
 
-       function provideCases() {
+       public static function provideCases() {
                return array(
 
                        // Basic whitespace and comments that should be stripped entirely
@@ -132,7 +132,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
        }
 
-       function provideBug32548() {
+       public static function provideBug32548() {
                return array(
                        array(
                                // This one gets interpreted all together by the prior code;
index b221b83..117a072 100644 (file)
@@ -18,8 +18,6 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
         * translation (to en) where XMP should win.
         */
        public function testMultilingualCascade() {
-               global $wgShowEXIF;
-
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
@@ -27,7 +25,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                        $this->markTestSkipped( "This test needs the xml extension." );
                }
 
-               $wgShowEXIF = true;
+               $this->setMwGlobals( 'wgShowEXIF', true );
 
                $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
                        '/Xmp-exif-multilingual_test.jpg' );
index 3de60b7..c4706bf 100644 (file)
@@ -22,7 +22,7 @@ class BitmapScalingTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedParams, $params, $msg );
        }
 
-       function provideNormaliseParams() {
+       public static function provideNormaliseParams() {
                return array(
                        /* Regular resize operations */
                        array(
index db29d17..f02e8b9 100644 (file)
@@ -25,21 +25,11 @@ class ExifRotationTest extends MediaWikiTestCase {
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
-               global $wgShowEXIF;
-               $this->show = $wgShowEXIF;
-               $wgShowEXIF = true;
 
-               global $wgEnableAutoRotation;
-               $this->oldAuto = $wgEnableAutoRotation;
-               $wgEnableAutoRotation = true;
-       }
-
-       protected function tearDown() {
-               global $wgShowEXIF, $wgEnableAutoRotation;
-               $wgShowEXIF = $this->show;
-               $wgEnableAutoRotation = $this->oldAuto;
-
-               parent::tearDown();
+               $this->setMwGlobals( array(
+                       'wgShowEXIF' => true,
+                       'wgEnableAutoRotation' => true,
+               ) );
        }
 
        /**
@@ -139,14 +129,11 @@ class ExifRotationTest extends MediaWikiTestCase {
         * @dataProvider provideFilesNoAutoRotate
         */
        function testMetadataNoAutoRotate( $name, $type, $info ) {
-               global $wgEnableAutoRotation;
-               $wgEnableAutoRotation = false;
+               $this->setMwGlobals( 'wgEnableAutoRotation', false );
 
                $file = $this->dataFile( $name, $type );
                $this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
                $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
-
-               $wgEnableAutoRotation = true;
        }
 
        /**
@@ -154,8 +141,7 @@ class ExifRotationTest extends MediaWikiTestCase {
         * @dataProvider provideFilesNoAutoRotate
         */
        function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
-               global $wgEnableAutoRotation;
-               $wgEnableAutoRotation = false;
+               $this->setMwGlobals( 'wgEnableAutoRotation', false );
 
                foreach ( $thumbs as $size => $out ) {
                        if ( preg_match( '/^(\d+)px$/', $size, $matches ) ) {
@@ -187,7 +173,6 @@ class ExifRotationTest extends MediaWikiTestCase {
                                $this->assertEquals( $out[1], $gis[1], "$name: thumb actual height check for $size" );
                        }
                }
-               $wgEnableAutoRotation = true;
        }
 
        public static function provideFilesNoAutoRotate() {
@@ -238,7 +223,7 @@ class ExifRotationTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $result );
        }
 
-       function provideBitmapExtractPreRotationDimensions() {
+       public static function provideBitmapExtractPreRotationDimensions() {
                return array(
                        array(
                                0,
index 51643ce..75e1fd1 100644 (file)
@@ -172,19 +172,20 @@ class MagicVariableTest extends MediaWikiTestCase {
         * Rough tests for {{SERVERNAME}} magic word
         * Bug 31176
         * @group Database
+        * @dataProvider dataServernameFromDifferentProtocols
         */
-       function testServernameFromDifferentProtocols() {
-               global $wgServer;
-               $saved_wgServer = $wgServer;
+       function testServernameFromDifferentProtocols( $server ) {
+               $this->setMwGlobals( 'wgServer', $server );
 
-               $wgServer = 'http://localhost/';
-               $this->assertMagic( 'localhost', 'servername' );
-               $wgServer = 'https://localhost/';
-               $this->assertMagic( 'localhost', 'servername' );
-               $wgServer = '//localhost/'; # bug 31176
                $this->assertMagic( 'localhost', 'servername' );
+       }
 
-               $wgServer = $saved_wgServer;
+       function dataServernameFromDifferentProtocols() {
+               return array(
+                       array( 'http://localhost/' ),
+                       array( 'https://localhost/' ),
+                       array( '//localhost/' ), # bug 31176
+               );
        }
 
        ############### HELPERS ############################################
index c51a1dc..fb13118 100644 (file)
@@ -18,7 +18,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                return array( 'gallery', 'display map' /* Used by Maps, see r80025 CR */, '/foo' );
        }
 
-       function provideCases() {
+       public static function provideCases() {
                return array(
                        array( "Foo", "<root>Foo</root>" ),
                        array( "<!-- Foo -->", "<root><comment>&lt;!-- Foo --&gt;</comment></root>" ),
@@ -148,7 +148,7 @@ class PreprocessorTest extends MediaWikiTestCase {
        /**
         * These are more complex test cases taken out of wiki articles.
         */
-       function provideFiles() {
+       public static function provideFiles() {
                return array(
                        array( "QuoteQuran" ), # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC-BY-SA by Striver
                        array( "Factorial" ), # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC-BY-SA by Polonium
@@ -180,7 +180,7 @@ class PreprocessorTest extends MediaWikiTestCase {
        /**
         * Tests from Bug 28642 · https://bugzilla.wikimedia.org/28642
         */
-       function provideHeadings() {
+       public static function provideHeadings() {
                return array( /* These should become headings: */
                        array( "== h ==<!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment></h></root>" ),
                        array( "== h ==         <!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==       <comment>&lt;!--c1--&gt;</comment></h></root>" ),
index 0cecdee..b86636f 100644 (file)
@@ -62,7 +62,7 @@ class MediaWikiSiteTest extends SiteTest {
                $this->assertEquals( $expected, $site->getFileUrl( $pathArgument ) );
        }
 
-       public function provideGetPageUrl() {
+       public static function provideGetPageUrl() {
                return array(
                        // path, page, expected substring
                        array( 'http://acme.test/wiki/$1', 'Berlin', '/wiki/Berlin' ),
index d20e2a5..8033784 100644 (file)
@@ -201,7 +201,7 @@ class SiteTest extends MediaWikiTestCase {
                $this->assertEquals( '', $site->getProtocol() );
        }
 
-       public function provideGetPageUrl() {
+       public static function provideGetPageUrl() {
                //NOTE: the assumption that the URL is built by replacing $1
                //      with the urlencoded version of $page
                //      is true for Site but not guaranteed for subclasses.
index f5ef0fb..15a11ed 100644 (file)
@@ -56,7 +56,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
 
        }
 
-       function provideSearchOptionsTests() {
+       public static function provideSearchOptionsTests() {
                $defaultNS = SearchEngine::defaultNamespaces();
                $EMPTY_REQUEST = array();
                $NO_USER_PREF = null;
index 4d2d8ce..ac93aa7 100644 (file)
@@ -8,12 +8,13 @@
 class UploadFromUrlTest extends ApiTestCase {
 
        protected function setUp() {
-               global $wgEnableUploads, $wgAllowCopyUploads, $wgAllowAsyncCopyUploads;
                parent::setUp();
 
-               $wgEnableUploads = true;
-               $wgAllowCopyUploads = true;
-               $wgAllowAsyncCopyUploads = true;
+               $this->setMwGlobals( array(
+                       'wgEnableUploads' => true,
+                       'wgAllowCopyUploads' => true,
+                       'wgAllowAsyncCopyUploads' => true,
+               ) );
                wfSetupSession();
 
                if ( wfLocalFile( 'UploadFromUrlTest.png' )->exists() ) {
index 8fcaa21..7a0fea4 100644 (file)
@@ -44,8 +44,7 @@ class UploadStashTest extends MediaWikiTestCase {
        }
 
        public function testBug29408() {
-               global $wgUser;
-               $wgUser = self::$users['uploader']->user;
+               $this->setMwGlobals( 'wgUser', self::$users['uploader']->user );
 
                $repo = RepoGroup::singleton()->getLocalRepo();
                $stash = new UploadStash( $repo );
index ebbe5a2..fdf3347 100644 (file)
@@ -18,7 +18,7 @@ class LanguageAmTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
index fee05fc..a623912 100644 (file)
@@ -19,7 +19,7 @@ class LanguageArTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, $this->getLang()->sprintfDate( $format, $date ) );
        }
 
-       function providerSprintfDate() {
+       public static function providerSprintfDate() {
                return array(
                        array(
                                'xg "vs" g',
@@ -55,7 +55,7 @@ class LanguageArTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
index 340b334..a88356a 100644 (file)
@@ -18,7 +18,7 @@ class LanguageBeTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'one', 1 ),
                        array( 'many', 11 ),
index aa8c28a..8bc908d 100644 (file)
@@ -43,7 +43,7 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'one', 1 ),
                        array( 'many', 11 ),
@@ -65,7 +65,7 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
                        array( 'other', 11 ),
index 7384ed7..3cdde36 100644 (file)
@@ -18,7 +18,7 @@ class LanguageBhoTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
index d44dc32..83a0ef6 100644 (file)
@@ -18,7 +18,7 @@ class LanguageBsTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'many', 0 ),
                        array( 'one', 1 ),
index 9a4991b..06374d4 100644 (file)
@@ -18,7 +18,7 @@ class LanguageCsTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 7384918..a368371 100644 (file)
@@ -18,7 +18,7 @@ class LanguageCuTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index d56d622..221a498 100644 (file)
@@ -18,7 +18,7 @@ class LanguageCyTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
index b3f01c3..be42124 100644 (file)
@@ -18,7 +18,7 @@ class LanguageDsbTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 2ab5d87..4f96b48 100644 (file)
@@ -18,7 +18,7 @@ class LanguageFrTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
index cac3a02..da7cf12 100644 (file)
@@ -18,7 +18,7 @@ class LanguageGaTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index b7d5cc2..4ff97ea 100644 (file)
@@ -13,7 +13,7 @@ class LanguageGdTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       public static function providerPlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -32,7 +32,7 @@ class LanguageGdTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralExplicit() {
+       public static function providerPluralExplicit() {
                return array (
                                array( 'other', 0 ),
                                array( 'one', 1 ),
index 6e24aea..ef95c5f 100644 (file)
@@ -21,7 +21,7 @@ class LanguageGvTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'Form 4', 0 ),
                        array( 'Form 2', 1 ),
index 1335e90..3fbd51e 100644 (file)
@@ -18,7 +18,7 @@ class LanguageHeTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -35,7 +35,7 @@ class LanguageHeTest extends LanguageClassesTestCase {
 
        // The comments in the beginning of the line help avoid RTL problems
        // with text editors.
-       function provideGrammar() {
+       public static function provideGrammar() {
                return array (
                        array(
                                /* result */ 'וויקיפדיה',
index b21bfe4..9502d6a 100644 (file)
@@ -18,7 +18,7 @@ class LanguageHiTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
index 76e281b..badfd11 100644 (file)
@@ -18,7 +18,7 @@ class LanguageHrTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'many', 0 ),
                        array( 'one', 1 ),
index 8fee549..bae4542 100644 (file)
@@ -18,7 +18,7 @@ class LanguageHsbTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 462a7dd..40ae108 100644 (file)
@@ -18,7 +18,7 @@ class LanguageHuTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 70717f1..f520b7e 100644 (file)
@@ -19,7 +19,7 @@ class LanguageHyTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 7efd58a..e863490 100644 (file)
@@ -18,7 +18,7 @@ class LanguageKshTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
index 052604c..2fa40b5 100644 (file)
@@ -18,7 +18,7 @@ class LanguageLnTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
index eface4c..45f083b 100644 (file)
@@ -18,7 +18,7 @@ class LanguageLtTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -41,7 +41,7 @@ class LanguageLtTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array (
                        array( 'one', 1 ),
                        array( 'other', 2 ),
index dce2f79..3ff9589 100644 (file)
@@ -18,7 +18,7 @@ class LanguageLvTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
index e88b0af..f4eb99a 100644 (file)
@@ -18,7 +18,7 @@ class LanguageMgTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
index a5a8f6c..4ff2e3e 100644 (file)
@@ -18,7 +18,7 @@ class LanguageMkTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 396114d..057ca67 100644 (file)
@@ -14,7 +14,7 @@ class LanguageMlTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->formatNum( $value ) );
        }
 
-       function providerFormatNum() {
+       public static function providerFormatNum() {
                return array(
                        array( '12,34,567', '1234567' ),
                        array( '12,345', '12345' ),
index 31d183a..3ffa4e7 100644 (file)
@@ -18,7 +18,7 @@ class LanguageMoTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'few',   0 ),
                        array( 'one',   1 ),
index 8f5d764..350aa08 100644 (file)
@@ -18,7 +18,7 @@ class LanguageMtTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'few',   0 ),
                        array( 'one',   1 ),
@@ -45,7 +45,7 @@ class LanguageMtTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralTwoForms() {
+       public static function providerPluralTwoForms() {
                return array (
                        array( 'other',  0 ),
                        array( 'one',   1 ),
index 7a7bff2..059de44 100644 (file)
@@ -18,7 +18,7 @@ class LanguageNsoTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'one',  0 ),
                        array( 'one',  1 ),
index 1ace10b..837fc3a 100644 (file)
@@ -18,7 +18,7 @@ class LanguagePlTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'many',  0 ),
                        array( 'one',   1 ),
@@ -45,7 +45,7 @@ class LanguagePlTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralTwoForms() {
+       public static function providerPluralTwoForms() {
                return array (
                        array( 'other',  0 ),
                        array( 'one',   1 ),
index 261d25a..70324f5 100644 (file)
@@ -18,7 +18,7 @@ class LanguageRoTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'few',   0 ),
                        array( 'one',   1 ),
index 3bdf654..ccfda20 100644 (file)
@@ -19,7 +19,7 @@ class LanguageRuTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'one', 1 ),
                        array( 'many', 11 ),
@@ -41,7 +41,7 @@ class LanguageRuTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
                        array( 'other', 11 ),
@@ -55,7 +55,7 @@ class LanguageRuTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
        }
 
-       function providerGrammar() {
+       public static function providerGrammar() {
                return array(
                        array(
                                'Википедии',
index 3e676b9..9b9297c 100644 (file)
@@ -18,7 +18,7 @@ class LanguageSeTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -33,7 +33,7 @@ class LanguageSeTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralTwoForms() {
+       public static function providerPluralTwoForms() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 4721d50..589a369 100644 (file)
@@ -18,7 +18,7 @@ class LanguageSgsTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePluralAllForms() {
+       public static function providePluralAllForms() {
                return array(
                        array( 'few', 0 ),
                        array( 'one', 1 ),
@@ -42,7 +42,7 @@ class LanguageSgsTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index e59c894..8dd18ea 100644 (file)
@@ -18,7 +18,7 @@ class LanguageShTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'many', 0 ),
                        array( 'one',  1 ),
index 48d253c..da09b56 100644 (file)
@@ -19,7 +19,7 @@ class LanguageSkTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 232e35b..8329791 100644 (file)
@@ -19,7 +19,7 @@ class LanguageSlTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providerPlural() {
+       public static function providerPlural() {
                return array (
                        array( 'other',  0 ),
                        array( 'one',   1 ),
index 3503461..2eb8113 100644 (file)
@@ -18,7 +18,7 @@ class LanguageSmaTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -33,7 +33,7 @@ class LanguageSmaTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralTwoForms() {
+       public static function providerPluralTwoForms() {
                return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 7fbe13c..05e8875 100644 (file)
@@ -121,7 +121,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'one', 1 ),
                        array( 'many', 11 ),
@@ -143,7 +143,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
                        array( 'other', 11 ),
index 7647144..f55684f 100644 (file)
@@ -19,7 +19,7 @@ class LanguageTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, $this->getLang()->formatTimePeriod( $seconds, $format ), $desc );
        }
 
-       function provideFormattableTimes() {
+       public static function provideFormattableTimes() {
                return array(
                        array(
                                9.45,
@@ -251,7 +251,7 @@ class LanguageTest extends LanguageClassesTestCase {
        /**
         * Array format is ($len, $ellipsis, $input, $expected)
         */
-       function provideHTMLTruncateData() {
+       public static function provideHTMLTruncateData() {
                return array(
                        array( 0, 'XXX', "1234567890", "XXX" ),
                        array( 8, 'XXX', "1234567890", "12345XXX" ),
@@ -324,7 +324,7 @@ class LanguageTest extends LanguageClassesTestCase {
         * and distributed as free software, under the GNU General Public Licence.
         * http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
         */
-       function provideWellFormedLanguageTags() {
+       public static function provideWellFormedLanguageTags() {
                return array(
                        array( 'fr', 'two-letter code' ),
                        array( 'fr-latn', 'two-letter code with lower case script code' ),
@@ -375,7 +375,7 @@ class LanguageTest extends LanguageClassesTestCase {
         * and distributed as free software, under the GNU General Public Licence.
         * http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
         */
-       function provideMalformedLanguageTags() {
+       public static function provideMalformedLanguageTags() {
                return array(
                        array( 'f', 'language too short' ),
                        array( 'f-Latn', 'language too short with script' ),
@@ -437,7 +437,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideLanguageCodes() {
+       public static function provideLanguageCodes() {
                return array(
                        array( 'fr', 'Two letters, minor case' ),
                        array( 'EN', 'Two letters, upper case' ),
@@ -460,7 +460,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideKnownLanguageTags() {
+       public static function provideKnownLanguageTags() {
                return array(
                        array( 'fr', 'simple code' ),
                        array( 'bat-smg', 'an MW legacy tag' ),
@@ -493,7 +493,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideUnknownLanguageTags() {
+       public static function provideUnknownLanguageTags() {
                return array(
                        array( 'mw', 'non-existent two-letter code' ),
                );
@@ -530,7 +530,7 @@ class LanguageTest extends LanguageClassesTestCase {
                date_default_timezone_set( $oldTZ );
        }
 
-       function provideSprintfDateSamples() {
+       public static function provideSprintfDateSamples() {
                return array(
                        array(
                                'xiY',
@@ -836,7 +836,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideFormatSizes() {
+       public static function provideFormatSizes() {
                return array(
                        array(
                                0,
@@ -898,7 +898,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideFormatBitrate() {
+       public static function provideFormatBitrate() {
                return array(
                        array(
                                0,
@@ -970,7 +970,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideFormatDuration() {
+       public static function provideFormatDuration() {
                return array(
                        array(
                                0,
@@ -1106,7 +1106,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideCheckTitleEncodingData() {
+       public static function provideCheckTitleEncodingData() {
                return array(
                        array( "" ),
                        array( "United States of America" ), // 7bit ASCII
@@ -1170,7 +1170,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideRomanNumeralsData() {
+       public static function provideRomanNumeralsData() {
                return array(
                        array( 1, 'I' ),
                        array( 2, 'II' ),
@@ -1225,7 +1225,7 @@ class LanguageTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, $chosen );
        }
 
-       function providePluralData() {
+       public static function providePluralData() {
                // Params are: [expected text, number given, [the plural forms]]
                return array(
                        array( 'plural', 0, array(
@@ -1273,7 +1273,7 @@ class LanguageTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, $lang->translateBlockExpiry( $str ), $desc );
        }
 
-       function provideTranslateBlockExpiry() {
+       public static function provideTranslateBlockExpiry() {
                return array(
                        array( '2 hours', '2 hours', 'simple data from ipboptions' ),
                        array( 'indefinite', 'infinite', 'infinite from ipboptions' ),
@@ -1302,7 +1302,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideCommafyData() {
+       public static function provideCommafyData() {
                return array(
                        array( 1, '1' ),
                        array( 10, '10' ),
@@ -1341,7 +1341,7 @@ class LanguageTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, Language::isSupportedLanguage( $code ), $comment );
        }
 
-       static function provideIsSupportedLanguage() {
+       public static function provideIsSupportedLanguage() {
                return array(
                        array( 'en', true, 'is supported language' ),
                        array( 'fi', true, 'is supported language' ),
index 4a86086..b2cc4c3 100644 (file)
@@ -18,7 +18,7 @@ class LanguageTiTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'one',  0 ),
                        array( 'one',  1 ),
index 383fe6c..0299653 100644 (file)
@@ -18,7 +18,7 @@ class LanguageTlTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'one',  0 ),
                        array( 'one',  1 ),
index e93d49d..464a310 100644 (file)
@@ -31,7 +31,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, $res, $msg );
        }
 
-       function provideDottedAndDotlessI() {
+       public static function provideDottedAndDotlessI() {
                return array(
                        # function, input, input case, expected
                        # Case changed:
index f7f7369..66cd183 100644 (file)
@@ -19,7 +19,7 @@ class LanguageUkTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'one', 1 ),
                        array( 'many', 11 ),
@@ -41,7 +41,7 @@ class LanguageUkTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
                        array( 'other', 11 ),
index b4c92b7..813222d 100644 (file)
@@ -18,7 +18,7 @@ class LanguageWaTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providePlural() {
+       public static function providePlural() {
                return array (
                        array( 'one',  0 ),
                        array( 'one',  1 ),
index 40d24fc..f82898f 100644 (file)
@@ -73,8 +73,6 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * Clears $wgUser, and reports errors from addDBData to PHPUnit
         */
        protected function setUp() {
-               global $wgUser;
-
                parent::setUp();
 
                // Check if any Exception is stored for rethrowing from addDBData
@@ -83,7 +81,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                        throw $this->exceptionFromAddDBData;
                }
 
-               $wgUser = new User();
+               $this->setMwGlobals( 'wgUser', new User() );
        }
 
        /**
index 3902b68..279932f 100644 (file)
@@ -151,11 +151,12 @@ class SideBarTest extends MediaWikiLangTestCase {
 
        /**
         * Simple test to verify our helper assertAttribs() is functional
-        * Please note this assume MediaWiki default settings:
-        *   $wgNoFollowLinks = true
-        *   $wgExternalLinkTarget = false
         */
        function testTestAttributesAssertionHelper() {
+               $this->setMwGlobals( array(
+                       'wgNoFollowLinks' => true,
+                       'wgExternalLinkTarget' => false,
+               ) );
                $attribs = $this->getAttribs();
 
                $this->assertArrayHasKey( 'rel', $attribs );
@@ -168,38 +169,30 @@ class SideBarTest extends MediaWikiLangTestCase {
         * Test $wgNoFollowLinks in sidebar
         */
        function testRespectWgnofollowlinks() {
-               global $wgNoFollowLinks;
-               $saved = $wgNoFollowLinks;
-               $wgNoFollowLinks = false;
+               $this->setMwGlobals( 'wgNoFollowLinks', false );
 
                $attribs = $this->getAttribs();
                $this->assertArrayNotHasKey( 'rel', $attribs,
                        'External URL in sidebar do not have rel=nofollow when $wgNoFollowLinks = false'
                );
-
-               // Restore global
-               $wgNoFollowLinks = $saved;
        }
 
        /**
         * Test $wgExternaLinkTarget in sidebar
+        * @dataProvider dataRespectExternallinktarget
         */
-       function testRespectExternallinktarget() {
-               global $wgExternalLinkTarget;
-               $saved = $wgExternalLinkTarget;
-
-               $wgExternalLinkTarget = '_blank';
-               $attribs = $this->getAttribs();
-               $this->assertArrayHasKey( 'target', $attribs );
-               $this->assertEquals( $attribs['target'], '_blank' );
+       function testRespectExternallinktarget( $externalLinkTarget ) {
+               $this->setMwGlobals( 'wgExternalLinkTarget', $externalLinkTarget );
 
-               $wgExternalLinkTarget = '_self';
                $attribs = $this->getAttribs();
                $this->assertArrayHasKey( 'target', $attribs );
-               $this->assertEquals( $attribs['target'], '_self' );
-
-               // Restore global
-               $wgExternalLinkTarget = $saved;
+               $this->assertEquals( $attribs['target'], $externalLinkTarget );
        }
 
+       function dataRespectExternallinktarget() {
+               return array(
+                       array( '_blank' ),
+                       array( '_self' ),
+               );
+       }
 }