Merge "FormatJson: minor cleanup"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 11 Oct 2013 17:26:03 +0000 (17:26 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 11 Oct 2013 17:26:03 +0000 (17:26 +0000)
79 files changed:
includes/DefaultSettings.php
includes/GlobalFunctions.php
includes/MimeMagic.php
includes/Revision.php
includes/WikiPage.php
includes/db/DatabaseMysql.php
includes/db/DatabaseMysqlBase.php
includes/diff/DifferenceEngine.php
includes/filerepo/ForeignAPIRepo.php
includes/installer/CliInstaller.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/InstallDocFormatter.php
includes/installer/Installer.i18n.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleInstaller.php
includes/installer/OracleUpdater.php
includes/installer/PhpBugTests.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/job/JobQueue.php
includes/job/JobQueueDB.php
includes/parser/Parser.php
languages/messages/MessagesAce.php
languages/messages/MessagesArz.php
languages/messages/MessagesAz.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBn.php
languages/messages/MessagesCe.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesHi.php
languages/messages/MessagesHr.php
languages/messages/MessagesIa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKsh.php
languages/messages/MessagesLb.php
languages/messages/MessagesLv.php
languages/messages/MessagesMhr.php
languages/messages/MessagesPms.php
languages/messages/MessagesPt.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRo.php
languages/messages/MessagesSl.php
languages/messages/MessagesTr.php
languages/messages/MessagesWar.php
languages/messages/MessagesZh_hans.php
maintenance/backup.inc
maintenance/cleanupTable.inc
maintenance/cleanupTitles.php
maintenance/jsduck/categories.json
maintenance/jsduck/config.json
maintenance/sqlite.inc
resources/Resources.php
resources/mediawiki.page/mediawiki.page.gallery.js
resources/mediawiki/mediawiki.inspect.js [new file with mode: 0644]
resources/mediawiki/mediawiki.js
tests/phpunit/includes/CollationTest.php
tests/phpunit/includes/StringUtilsTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php [new file with mode: 0644]
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/media/ExifBitmapTest.php
tests/phpunit/includes/media/ExifRotationTest.php
tests/phpunit/includes/media/ExifTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/media/JpegTest.php
tests/phpunit/includes/media/TiffTest.php
tests/phpunit/includes/media/XMPTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/structure/ResourcesTest.php

index 98c583b..21cd1ff 100644 (file)
@@ -1125,13 +1125,6 @@ $wgMimeTypeFile = 'includes/mime.types';
  */
 $wgMimeInfoFile = 'includes/mime.info';
 
-/**
- * Switch for loading the FileInfo extension by PECL at runtime.
- * This should be used only if fileinfo is installed as a shared object
- * or a dynamic library.
- */
-$wgLoadFileinfoExtension = false;
-
 /**
  * Sets an external mime detector program. The command must print only
  * the mime type to standard output.
index b11bce9..8241d81 100644 (file)
@@ -2634,38 +2634,6 @@ function wfIniGetBool( $setting ) {
                || preg_match( "/^\s*[+-]?0*[1-9]/", $val ); // approx C atoi() function
 }
 
-/**
- * Wrapper function for PHP's dl(). This doesn't work in most situations from
- * PHP 5.3 onward, and is usually disabled in shared environments anyway.
- *
- * @param string $extension A PHP extension. The file suffix (.so or .dll)
- *                          should be omitted
- * @param string $fileName Name of the library, if not $extension.suffix
- * @return Bool - Whether or not the extension is loaded
- */
-function wfDl( $extension, $fileName = null ) {
-       if ( extension_loaded( $extension ) ) {
-               return true;
-       }
-
-       $canDl = false;
-       if ( PHP_SAPI == 'cli' || PHP_SAPI == 'cgi' || PHP_SAPI == 'embed' ) {
-               $canDl = ( function_exists( 'dl' ) && is_callable( 'dl' )
-               && wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ) );
-       }
-
-       if ( $canDl ) {
-               $fileName = $fileName ? $fileName : $extension;
-               if ( wfIsWindows() ) {
-                       $fileName = 'php_' . $fileName;
-               }
-               wfSuppressWarnings();
-               dl( $fileName . '.' . PHP_SHLIB_SUFFIX );
-               wfRestoreWarnings();
-       }
-       return extension_loaded( $extension );
-}
-
 /**
  * Windows-compatible version of escapeshellarg()
  * Windows doesn't recognise single-quotes in the shell, but the escapeshellarg()
index 44fafca..8220e92 100644 (file)
@@ -169,10 +169,6 @@ class MimeMagic {
         */
        private static $instance;
 
-       /** True if the fileinfo extension has been loaded
-        */
-       private static $extensionLoaded = false;
-
        /** Initializes the MimeMagic object. This is called by MimeMagic::singleton().
         *
         * This constructor parses the mime.types and mime.info files and build internal mappings.
@@ -182,7 +178,7 @@ class MimeMagic {
                 *   --- load mime.types ---
                 */
 
-               global $wgMimeTypeFile, $IP, $wgLoadFileinfoExtension;
+               global $wgMimeTypeFile, $IP;
 
                $types = MM_WELL_KNOWN_MIME_TYPES;
 
@@ -190,11 +186,6 @@ class MimeMagic {
                        $wgMimeTypeFile = "$IP/$wgMimeTypeFile";
                }
 
-               if ( $wgLoadFileinfoExtension && !self::$extensionLoaded ) {
-                       self::$extensionLoaded = true;
-                       wfDl( 'fileinfo' );
-               }
-
                if ( $wgMimeTypeFile ) {
                        if ( is_file( $wgMimeTypeFile ) and is_readable( $wgMimeTypeFile ) ) {
                                wfDebug( __METHOD__ . ": loading mime types from $wgMimeTypeFile\n" );
index c09af74..305c8ff 100644 (file)
@@ -61,6 +61,11 @@ class Revision implements IDBAccessObject {
         */
        protected $mContentHandler;
 
+       /**
+        * @var int
+        */
+       protected $mQueryFlags = 0;
+
        // Revision deletion constants
        const DELETED_TEXT = 1;
        const DELETED_COMMENT = 2;
@@ -298,6 +303,9 @@ class Revision implements IDBAccessObject {
                                $rev = self::loadFromConds( $dbw, $conditions, $flags );
                        }
                }
+               if ( $rev ) {
+                       $rev->mQueryFlags = $flags;
+               }
                return $rev;
        }
 
@@ -1477,20 +1485,30 @@ class Revision implements IDBAccessObject {
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow( 'text',
                                array( 'old_text', 'old_flags' ),
-                               array( 'old_id' => $this->getTextId() ),
+                               array( 'old_id' => $textId ),
                                __METHOD__ );
                }
 
-               if ( !$row && wfGetLB()->getServerCount() > 1 ) {
-                       // Possible slave lag!
+               // Fallback to the master in case of slave lag. Also use FOR UPDATE if it was
+               // used to fetch this revision to avoid missing the row due to REPEATABLE-READ.
+               $forUpdate = ( $this->mQueryFlags & self::READ_LOCKING == self::READ_LOCKING );
+               if ( !$row && ( $forUpdate || wfGetLB()->getServerCount() > 1 ) ) {
                        $dbw = wfGetDB( DB_MASTER );
                        $row = $dbw->selectRow( 'text',
                                array( 'old_text', 'old_flags' ),
-                               array( 'old_id' => $this->getTextId() ),
-                               __METHOD__ );
+                               array( 'old_id' => $textId ),
+                               __METHOD__,
+                               $forUpdate ? array( 'FOR UPDATE' ) : array() );
+               }
+
+               if ( !$row ) {
+                       wfDebugLog( 'Revision', "No text row with ID '$textId' (revision {$this->getId()})." );
                }
 
                $text = self::getRevisionText( $row );
+               if ( $row && $text === false ) {
+                       wfDebugLog( 'Revision', "No blob for text row '$textId' (revision {$this->getId()})." );
+               }
 
                # No negative caching -- negative hits on text rows may be due to corrupted slave servers
                if ( $wgRevisionCacheExpiry && $text !== false ) {
index cda2666..1965982 100644 (file)
@@ -23,7 +23,8 @@
 /**
  * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
  */
-interface Page {}
+interface Page {
+}
 
 /**
  * Class representing a MediaWiki article and history.
@@ -1984,16 +1985,18 @@ class WikiPage implements Page, IDBAccessObject {
         * Prepare content which is about to be saved.
         * Returns a stdclass with source, pst and output members
         *
-        * @param \Content $content
-        * @param null $revid
-        * @param null|\User $user
-        * @param null $serialization_format
+        * @param Content $content
+        * @param int|null $revid
+        * @param User|null $user
+        * @param string|null $serialization_format
         *
         * @return bool|object
         *
         * @since 1.21
         */
-       public function prepareContentForEdit( Content $content, $revid = null, User $user = null, $serialization_format = null ) {
+       public function prepareContentForEdit( Content $content, $revid = null, User $user = null,
+               $serialization_format = null
+       ) {
                global $wgContLang, $wgUser;
                $user = is_null( $user ) ? $wgUser : $user;
                //XXX: check $user->getId() here???
@@ -2187,13 +2190,15 @@ class WikiPage implements Page, IDBAccessObject {
         * The article must already exist; link tables etc
         * are not updated, caches are not flushed.
         *
-        * @param $content Content: content submitted
-        * @param $user User The relevant user
+        * @param Content $content Content submitted
+        * @param User $user The relevant user
         * @param string $comment comment submitted
-        * @param $serialisation_format String: format for storing the content in the database
-        * @param $minor Boolean: whereas it's a minor modification
+        * @param string $serialisation_format Format for storing the content in the database
+        * @param bool $minor Whereas it's a minor modification
         */
-       public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = 0, $serialisation_format = null ) {
+       public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
+               $serialisation_format = null
+       ) {
                wfProfileIn( __METHOD__ );
 
                $serialized = $content->serialize( $serialisation_format );
index b75d615..956bb69 100644 (file)
@@ -43,12 +43,9 @@ class DatabaseMysql extends DatabaseMysqlBase {
        }
 
        protected function mysqlConnect( $realServer ) {
-               # Load mysql.so if we don't have it
-               wfDl( 'mysql' );
-
                # Fail now
                # Otherwise we get a suppressed fatal error, which is very hard to track down
-               if ( !function_exists( 'mysql_connect' ) ) {
+               if ( !extension_loaded( 'mysql' ) ) {
                        throw new DBConnectionError( $this, "MySQL functions missing, have you compiled PHP with the --with-mysql option?\n" );
                }
 
index 5614ed2..d33d7c7 100644 (file)
@@ -469,7 +469,9 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @return string
         */
        public function addIdentifierQuotes( $s ) {
-               return "`" . $this->strencode( $s ) . "`";
+               // Characters in the range \u0001-\uFFFF are valid in a quoted identifier
+               // Remove NUL bytes and escape backticks by doubling
+               return '`' . str_replace( array( "\0", '`' ), array( '', '``' ), $s )  . '`';
        }
 
        /**
index 0c9086b..e436f58 100644 (file)
@@ -695,24 +695,6 @@ class DifferenceEngine extends ContextSource {
                return $difftext;
        }
 
-       /**
-        * Make sure the proper modules are loaded before we try to
-        * make the diff
-        */
-       private function initDiffEngines() {
-               global $wgExternalDiffEngine;
-               if ( $wgExternalDiffEngine == 'wikidiff' && !function_exists( 'wikidiff_do_diff' ) ) {
-                       wfProfileIn( __METHOD__ . '-php_wikidiff.so' );
-                       wfDl( 'php_wikidiff' );
-                       wfProfileOut( __METHOD__ . '-php_wikidiff.so' );
-               }
-               elseif ( $wgExternalDiffEngine == 'wikidiff2' && !function_exists( 'wikidiff2_do_diff' ) ) {
-                       wfProfileIn( __METHOD__ . '-php_wikidiff2.so' );
-                       wfDl( 'wikidiff2' );
-                       wfProfileOut( __METHOD__ . '-php_wikidiff2.so' );
-               }
-       }
-
        /**
         * Generate a diff, no caching.
         *
@@ -779,8 +761,6 @@ class DifferenceEngine extends ContextSource {
                $otext = str_replace( "\r\n", "\n", $otext );
                $ntext = str_replace( "\r\n", "\n", $ntext );
 
-               $this->initDiffEngines();
-
                if ( $wgExternalDiffEngine == 'wikidiff' && function_exists( 'wikidiff_do_diff' ) ) {
                        # For historical reasons, external diff engine expects
                        # input text to be HTML-escaped already
index b1a3962..5eec9a5 100644 (file)
@@ -110,8 +110,8 @@ class ForeignAPIRepo extends FileRepo {
        function fileExistsBatch( array $files ) {
                $results = array();
                foreach ( $files as $k => $f ) {
-                       if ( isset( $this->mFileExists[$k] ) ) {
-                               $results[$k] = true;
+                       if ( isset( $this->mFileExists[$f] ) ) {
+                               $results[$k] = $this->mFileExists[$f];
                                unset( $files[$k] );
                        } elseif ( self::isVirtualUrl( $f ) ) {
                                # @todo FIXME: We need to be able to handle virtual
@@ -129,10 +129,26 @@ class ForeignAPIRepo extends FileRepo {
                $data = $this->fetchImageQuery( array( 'titles' => implode( $files, '|' ),
                                                                                        'prop' => 'imageinfo' ) );
                if ( isset( $data['query']['pages'] ) ) {
-                       $i = 0;
+                       # First, get results from the query. Note we only care whether the image exists,
+                       # not whether it has a description page.
+                       foreach ( $data['query']['pages'] as $p ) {
+                               $this->mFileExists[$p['title']] = ( $p['imagerepository'] !== '' );
+                       }
+                       # Second, copy the results to any redirects that were queried
+                       if ( isset( $data['query']['redirects'] ) ) {
+                               foreach ( $data['query']['redirects'] as $r ) {
+                                       $this->mFileExists[$r['from']] = $this->mFileExists[$r['to']];
+                               }
+                       }
+                       # Third, copy the results to any non-normalized titles that were queried
+                       if ( isset( $data['query']['normalized'] ) ) {
+                               foreach ( $data['query']['normalized'] as $n ) {
+                                       $this->mFileExists[$n['from']] = $this->mFileExists[$n['to']];
+                               }
+                       }
+                       # Finally, copy the results to the output
                        foreach ( $files as $key => $file ) {
-                               $results[$key] = $this->mFileExists[$key] = !isset( $data['query']['pages'][$i]['missing'] );
-                               $i++;
+                               $results[$key] = $this->mFileExists[$file];
                        }
                }
                return $results;
index 9f7ed7b..f944fbe 100644 (file)
@@ -168,6 +168,7 @@ class CliInstaller extends Installer {
                $text = wfMessage( $msg, $params )->parse();
 
                $text = preg_replace( '/<a href="(.*?)".*?>(.*?)<\/a>/', '$2 &lt;$1&gt;', $text );
+
                return html_entity_decode( strip_tags( $text ), ENT_QUOTES );
        }
 
@@ -197,15 +198,17 @@ class CliInstaller extends Installer {
                if ( !$this->specifiedScriptPath ) {
                        $this->showMessage( 'config-no-cli-uri', $this->getVar( "wgScriptPath" ) );
                }
+
                return parent::envCheckPath();
        }
 
        protected function envGetDefaultServer() {
-               return $this->getVar( 'wgServer' );
+               return null; // Do not guess if installing from CLI
        }
 
        public function dirIsExecutable( $dir, $url ) {
                $this->showMessage( 'config-no-cli-uploads-check', $dir );
+
                return false;
        }
 }
index ca4ef97..8bb7826 100644 (file)
@@ -158,6 +158,7 @@ abstract class DatabaseInstaller {
                        $this->db->clearFlag( DBO_TRX );
                        $this->db->commit( __METHOD__ );
                }
+
                return $status;
        }
 
@@ -176,6 +177,7 @@ abstract class DatabaseInstaller {
                if ( $this->db->tableExists( 'archive', __METHOD__ ) ) {
                        $status->warning( 'config-install-tables-exist' );
                        $this->enableLB();
+
                        return $status;
                }
 
@@ -194,6 +196,7 @@ abstract class DatabaseInstaller {
                if ( $status->isOk() ) {
                        $this->enableLB();
                }
+
                return $status;
        }
 
@@ -279,6 +282,7 @@ abstract class DatabaseInstaller {
                }
                $up->purgeCache();
                ob_end_flush();
+
                return $ret;
        }
 
@@ -288,14 +292,12 @@ abstract class DatabaseInstaller {
         * long after the constructor. Helpful for things like modifying setup steps :)
         */
        public function preInstall() {
-
        }
 
        /**
         * Allow DB installers a chance to make checks before upgrade.
         */
        public function preUpgrade() {
-
        }
 
        /**
@@ -319,15 +321,11 @@ abstract class DatabaseInstaller {
         * Convenience function.
         * Check if a named extension is present.
         *
-        * @see wfDl
         * @param $name
         * @return bool
         */
        protected static function checkExtension( $name ) {
-               wfSuppressWarnings();
-               $compiled = wfDl( $name );
-               wfRestoreWarnings();
-               return $compiled;
+               return extension_loaded( $name );
        }
 
        /**
@@ -371,6 +369,7 @@ abstract class DatabaseInstaller {
                } elseif ( isset( $internal[$var] ) ) {
                        $default = $internal[$var];
                }
+
                return $this->parent->getVar( $var, $default );
        }
 
@@ -398,6 +397,7 @@ abstract class DatabaseInstaller {
                if ( !isset( $attribs ) ) {
                        $attribs = array();
                }
+
                return $this->parent->getTextBox( array(
                        'var' => $var,
                        'label' => $label,
@@ -424,6 +424,7 @@ abstract class DatabaseInstaller {
                if ( !isset( $attribs ) ) {
                        $attribs = array();
                }
+
                return $this->parent->getPasswordBox( array(
                        'var' => $var,
                        'label' => $label,
@@ -442,6 +443,7 @@ abstract class DatabaseInstaller {
        public function getCheckBox( $var, $label, $attribs = array(), $helpData = "" ) {
                $name = $this->getName() . '_' . $var;
                $value = $this->getVar( $var );
+
                return $this->parent->getCheckBox( array(
                        'var' => $var,
                        'label' => $label,
@@ -449,7 +451,7 @@ abstract class DatabaseInstaller {
                        'controlName' => $name,
                        'value' => $value,
                        'help' => $helpData
-               ));
+               ) );
        }
 
        /**
@@ -468,6 +470,7 @@ abstract class DatabaseInstaller {
        public function getRadioSet( $params ) {
                $params['controlName'] = $this->getName() . '_' . $params['var'];
                $params['value'] = $this->getVar( $params['var'] );
+
                return $this->parent->getRadioSet( $params );
        }
 
@@ -501,6 +504,7 @@ abstract class DatabaseInstaller {
                if ( !$this->db->selectDB( $this->getVar( 'wgDBname' ) ) ) {
                        return false;
                }
+
                return $this->db->tableExists( 'cur', __METHOD__ ) || $this->db->tableExists( 'revision', __METHOD__ );
        }
 
@@ -523,6 +527,7 @@ abstract class DatabaseInstaller {
         */
        public function submitInstallUserBox() {
                $this->setVarsFromRequest( array( '_InstallUser', '_InstallPassword' ) );
+
                return Status::newGood();
        }
 
@@ -551,6 +556,7 @@ abstract class DatabaseInstaller {
                        $s .= $this->getCheckBox( '_CreateDBAccount', 'config-db-web-create' );
                }
                $s .= Html::closeElement( 'div' ) . Html::closeElement( 'fieldset' );
+
                return $s;
        }
 
@@ -590,6 +596,7 @@ abstract class DatabaseInstaller {
 
                if ( $this->db->selectRow( 'interwiki', '*', array(), __METHOD__ ) ) {
                        $status->warning( 'config-install-interwiki-exists' );
+
                        return $status;
                }
                global $IP;
@@ -613,6 +620,7 @@ abstract class DatabaseInstaller {
                        );
                }
                $this->db->insert( 'interwiki', $interwikis, __METHOD__ );
+
                return Status::newGood();
        }
 
index d4fe530..fdd34d4 100644 (file)
@@ -159,6 +159,7 @@ abstract class DatabaseUpdater {
                $type = $db->getType();
                if ( in_array( $type, Installer::getDBTypes() ) ) {
                        $class = ucfirst( $type ) . 'Updater';
+
                        return new $class( $db, $shared, $maintenance );
                } else {
                        throw new MWException( __METHOD__ . ' called for unsupported $wgDBtype' );
@@ -462,6 +463,7 @@ abstract class DatabaseUpdater {
                        array( 'ul_key' => $key ),
                        __METHOD__
                );
+
                return (bool)$row;
        }
 
@@ -538,21 +540,21 @@ abstract class DatabaseUpdater {
                foreach ( $wgExtNewFields as $fieldRecord ) {
                        $updates[] = array(
                                'addField', $fieldRecord[0], $fieldRecord[1],
-                                       $fieldRecord[2], true
+                               $fieldRecord[2], true
                        );
                }
 
                foreach ( $wgExtNewIndexes as $fieldRecord ) {
                        $updates[] = array(
                                'addIndex', $fieldRecord[0], $fieldRecord[1],
-                                       $fieldRecord[2], true
+                               $fieldRecord[2], true
                        );
                }
 
                foreach ( $wgExtModifiedFields as $fieldRecord ) {
                        $updates[] = array(
                                'modifyField', $fieldRecord[0], $fieldRecord[1],
-                                       $fieldRecord[2], true
+                               $fieldRecord[2], true
                        );
                }
 
@@ -595,6 +597,7 @@ abstract class DatabaseUpdater {
                if ( fwrite( $this->fileHandle, $line ) === false ) {
                        throw new MWException( "trouble writing file" );
                }
+
                return false;
        }
 
@@ -612,6 +615,7 @@ abstract class DatabaseUpdater {
                }
                if ( $this->skipSchema ) {
                        $this->output( "...skipping schema change ($msg).\n" );
+
                        return false;
                }
 
@@ -626,6 +630,7 @@ abstract class DatabaseUpdater {
                        $this->db->sourceFile( $path );
                }
                $this->output( "done.\n" );
+
                return true;
        }
 
@@ -647,6 +652,7 @@ abstract class DatabaseUpdater {
                } else {
                        return $this->applyPatch( $patch, $fullpath, "Creating $name table" );
                }
+
                return true;
        }
 
@@ -671,6 +677,7 @@ abstract class DatabaseUpdater {
                } else {
                        return $this->applyPatch( $patch, $fullpath, "Adding $field field to table $table" );
                }
+
                return true;
        }
 
@@ -695,6 +702,7 @@ abstract class DatabaseUpdater {
                } else {
                        return $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
                }
+
                return true;
        }
 
@@ -717,6 +725,7 @@ abstract class DatabaseUpdater {
                } else {
                        $this->output( "...$table table does not contain $field field.\n" );
                }
+
                return true;
        }
 
@@ -739,6 +748,7 @@ abstract class DatabaseUpdater {
                } else {
                        $this->output( "...$index key doesn't exist.\n" );
                }
+
                return true;
        }
 
@@ -761,6 +771,7 @@ abstract class DatabaseUpdater {
                // First requirement: the table must exist
                if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
                        $this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+
                        return true;
                }
 
@@ -771,12 +782,14 @@ abstract class DatabaseUpdater {
                                $this->output( "...WARNING: $oldIndex still exists, despite it has been renamed into $newIndex (which also exists).\n" .
                                        "            $oldIndex should be manually removed if not needed anymore.\n" );
                        }
+
                        return true;
                }
 
                // Third requirement: the old index must exist
                if ( !$this->db->indexExists( $table, $oldIndex, __METHOD__ ) ) {
                        $this->output( "...skipping: index $oldIndex doesn't exist.\n" );
+
                        return true;
                }
 
@@ -807,13 +820,13 @@ abstract class DatabaseUpdater {
                                $this->output( "$msg ..." );
                                $this->db->dropTable( $table, __METHOD__ );
                                $this->output( "done.\n" );
-                       }
-                       else {
+                       } else {
                                return $this->applyPatch( $patch, $fullpath, $msg );
                        }
                } else {
                        $this->output( "...$table doesn't exist.\n" );
                }
+
                return true;
        }
 
@@ -840,8 +853,10 @@ abstract class DatabaseUpdater {
                        $this->output( "...$field in table $table already modified by patch $patch.\n" );
                } else {
                        $this->insertUpdateRow( $updateKey );
+
                        return $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
                }
+
                return true;
        }
 
@@ -873,6 +888,7 @@ abstract class DatabaseUpdater {
                        $this->output( "missing ss_total_pages, rebuilding...\n" );
                } else {
                        $this->output( "done.\n" );
+
                        return;
                }
                SiteStatsInit::doAllAndCommit( $this->db );
@@ -904,9 +920,10 @@ abstract class DatabaseUpdater {
        protected function doLogUsertextPopulation() {
                if ( !$this->updateRowExists( 'populate log_usertext' ) ) {
                        $this->output(
-                       "Populating log_user_text field, printing progress markers. For large\n" .
-                       "databases, you may want to hit Ctrl-C and do this manually with\n" .
-                       "maintenance/populateLogUsertext.php.\n" );
+                               "Populating log_user_text field, printing progress markers. For large\n" .
+                               "databases, you may want to hit Ctrl-C and do this manually with\n" .
+                               "maintenance/populateLogUsertext.php.\n"
+                       );
 
                        $task = $this->maintenance->runChild( 'PopulateLogUsertext' );
                        $task->execute();
@@ -936,6 +953,7 @@ abstract class DatabaseUpdater {
        protected function doUpdateTranscacheField() {
                if ( $this->updateRowExists( 'convert transcache field' ) ) {
                        $this->output( "...transcache tc_time already converted.\n" );
+
                        return true;
                }
 
@@ -954,9 +972,11 @@ abstract class DatabaseUpdater {
                                'COUNT(*)',
                                'cl_collation != ' . $this->db->addQuotes( $wgCategoryCollation ),
                                __METHOD__
-                               ) == 0 ) {
-                                       $this->output( "...collations up-to-date.\n" );
-                                       return;
+                               ) == 0
+                       ) {
+                               $this->output( "...collations up-to-date.\n" );
+
+                               return;
                        }
 
                        $this->output( "Updating category collations..." );
index ce282cc..0042089 100644 (file)
@@ -23,6 +23,7 @@
 class InstallDocFormatter {
        static function format( $text ) {
                $obj = new self( $text );
+
                return $obj->execute();
        }
 
@@ -47,6 +48,7 @@ class InstallDocFormatter {
                $text = preg_replace_callback( '/bug (\d+)/', array( $this, 'replaceBugLinks' ), $text );
                // add links to manual to every global variable mentioned
                $text = preg_replace_callback( '/(\$wg[a-z0-9_]+)/i', array( $this, 'replaceConfigLinks' ), $text );
+
                return $text;
        }
 
index 20b2ece..7d1c109 100644 (file)
@@ -17552,6 +17552,7 @@ MediaWiki требует поддержки UTF-8 для корректной р
        'config-memory-bad' => "'''Внимание:''' размер PHP <code>memory_limit</code> составляет $1.
 Вероятно, этого слишком мало.
 Установка может потерпеть неудачу!",
+       'config-ctype' => "'''Фатальная ошибка:''' PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/ru/ctype.installation.php расширения Ctype].",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] установлен',
        'config-apc' => '[http://www.php.net/apc APC] установлен',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] установлен',
@@ -17560,6 +17561,7 @@ MediaWiki требует поддержки UTF-8 для корректной р
        'config-mod-security' => "'''Внимание''': на вашем веб-сервере включен [http://modsecurity.org/ mod_security]. При неправильной настройке он может вызывать проблемы для MediaWiki или другого ПО, позволяющего пользователям отправлять на сервер произвольный текст.
 Обратитесь к [http://modsecurity.org/documentation/ документации mod_security] или в поддержку вашего хостера, если при работе возникают непонятные ошибки.",
        'config-diff3-bad' => 'GNU diff3 не найден.',
+       'config-git' => 'Найдена система контроля версий Git: <code>$1</code>.',
        'config-git-bad' => 'Программное обеспечение по управлению версиями Git не найдено.',
        'config-imagemagick' => 'Обнаружен ImageMagick: <code>$1</code>.
 Возможно отображение миниатюр изображений, если вы разрешите закачки файлов.',
@@ -17962,6 +17964,9 @@ $3
        'config-download-localsettings' => 'Загрузить <code>LocalSettings.php</code>',
        'config-help' => 'справка',
        'config-nofile' => 'Файл "$1" не удается найти. Он был удален?',
+       'config-extension-link' => 'Знаете ли вы, что ваш вики-проект поддерживает [//www.mediawiki.org/wiki/Manual:Extensions расширения]?
+
+Вы можете просмотреть [//www.mediawiki.org/wiki/Category:Extensions_by_category расширения по категориям] или [//www.mediawiki.org/wiki/Extension_Matrix матрицу расширений], чтобы увидеть их полный список.',
        'mainpagetext' => "'''Вики-движок «MediaWiki» успешно установлен.'''",
        'mainpagedocfooter' => 'Информацию по работе с этой вики можно найти в [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 справочном руководстве].
 
index 1044f18..5eaacf8 100644 (file)
@@ -46,7 +46,6 @@ abstract class Installer {
         */
        protected $settings;
 
-
        /**
         * List of detected DBs, access using getCompiledDBs().
         *
@@ -159,7 +158,6 @@ abstract class Installer {
                'wgImageMagickConvertCommand',
                'wgGitBin',
                'IP',
-               'wgServer',
                'wgScriptPath',
                'wgScriptExtension',
                'wgMetaNamespace',
@@ -513,6 +511,7 @@ abstract class Installer {
                if ( file_exists( "$IP/AdminSettings.php" ) ) {
                        require "$IP/AdminSettings.php";
                }
+
                return get_defined_vars();
        }
 
@@ -639,6 +638,7 @@ abstract class Installer {
                        'ss_users' => 0,
                        'ss_images' => 0 ),
                        __METHOD__, 'IGNORE' );
+
                return Status::newGood();
        }
 
@@ -670,7 +670,7 @@ abstract class Installer {
 
                $databases = $this->getCompiledDBs();
 
-               $databases = array_flip ( $databases );
+               $databases = array_flip( $databases );
                foreach ( array_keys( $databases ) as $db ) {
                        $installer = $this->getDBInstaller( $db );
                        $status = $installer->checkPrerequisites();
@@ -684,9 +684,11 @@ abstract class Installer {
                $databases = array_flip( $databases );
                if ( !$databases ) {
                        $this->showError( 'config-no-db', $wgLang->commaList( $allNames ) );
+
                        // @todo FIXME: This only works for the web installer!
                        return false;
                }
+
                return true;
        }
 
@@ -707,8 +709,10 @@ abstract class Installer {
                $test = new PhpXmlBugTester();
                if ( !$test->ok ) {
                        $this->showError( 'config-brokenlibxml' );
+
                        return false;
                }
+
                return true;
        }
 
@@ -722,8 +726,10 @@ abstract class Installer {
                $test->execute();
                if ( !$test->ok ) {
                        $this->showError( 'config-using531', phpversion() );
+
                        return false;
                }
+
                return true;
        }
 
@@ -734,8 +740,10 @@ abstract class Installer {
        protected function envCheckMagicQuotes() {
                if ( wfIniGetBool( "magic_quotes_runtime" ) ) {
                        $this->showError( 'config-magic-quotes-runtime' );
+
                        return false;
                }
+
                return true;
        }
 
@@ -746,8 +754,10 @@ abstract class Installer {
        protected function envCheckMagicSybase() {
                if ( wfIniGetBool( 'magic_quotes_sybase' ) ) {
                        $this->showError( 'config-magic-quotes-sybase' );
+
                        return false;
                }
+
                return true;
        }
 
@@ -758,8 +768,10 @@ abstract class Installer {
        protected function envCheckMbstring() {
                if ( wfIniGetBool( 'mbstring.func_overload' ) ) {
                        $this->showError( 'config-mbstring' );
+
                        return false;
                }
+
                return true;
        }
 
@@ -770,8 +782,10 @@ abstract class Installer {
        protected function envCheckZE1() {
                if ( wfIniGetBool( 'zend.ze1_compatibility_mode' ) ) {
                        $this->showError( 'config-ze1' );
+
                        return false;
                }
+
                return true;
        }
 
@@ -784,6 +798,7 @@ abstract class Installer {
                        $this->setVar( '_SafeMode', true );
                        $this->showMessage( 'config-safe-mode' );
                }
+
                return true;
        }
 
@@ -794,8 +809,10 @@ abstract class Installer {
        protected function envCheckXML() {
                if ( !function_exists( "utf8_encode" ) ) {
                        $this->showError( 'config-xml-bad' );
+
                        return false;
                }
+
                return true;
        }
 
@@ -810,6 +827,7 @@ abstract class Installer {
        protected function envCheckPCRE() {
                if ( !function_exists( 'preg_match' ) ) {
                        $this->showError( 'config-pcre' );
+
                        return false;
                }
                wfSuppressWarnings();
@@ -822,8 +840,10 @@ abstract class Installer {
                wfRestoreWarnings();
                if ( $regexd != '--' || $regexprop != '--' ) {
                        $this->showError( 'config-pcre-no-utf8' );
+
                        return false;
                }
+
                return true;
        }
 
@@ -850,6 +870,7 @@ abstract class Installer {
                                $this->setVar( '_RaiseMemory', true );
                        }
                }
+
                return true;
        }
 
@@ -882,6 +903,7 @@ abstract class Installer {
                if ( self::apacheModulePresent( 'mod_security' ) ) {
                        $this->showMessage( 'config-mod-security' );
                }
+
                return true;
        }
 
@@ -901,6 +923,7 @@ abstract class Installer {
                        $this->setVar( 'wgDiff3', false );
                        $this->showMessage( 'config-diff3-bad' );
                }
+
                return true;
        }
 
@@ -917,13 +940,14 @@ abstract class Installer {
                if ( $convert ) {
                        $this->setVar( 'wgImageMagickConvertCommand', $convert );
                        $this->showMessage( 'config-imagemagick', $convert );
+
                        return true;
                } elseif ( function_exists( 'imagejpeg' ) ) {
                        $this->showMessage( 'config-gd' );
-
                } else {
                        $this->showMessage( 'config-no-scaling' );
                }
+
                return true;
        }
 
@@ -946,6 +970,7 @@ abstract class Installer {
                        $this->setVar( 'wgGitBin', false );
                        $this->showMessage( 'config-git-bad' );
                }
+
                return true;
        }
 
@@ -954,8 +979,10 @@ abstract class Installer {
         */
        protected function envCheckServer() {
                $server = $this->envGetDefaultServer();
-               $this->showMessage( 'config-using-server', $server );
-               $this->setVar( 'wgServer', $server );
+               if ( $server !== null ) {
+                       $this->showMessage( 'config-using-server', $server );
+                       $this->setVar( 'wgServer', $server );
+               }
                return true;
        }
 
@@ -975,6 +1002,7 @@ abstract class Installer {
                $this->setVar( 'IP', $IP );
 
                $this->showMessage( 'config-using-uri', $this->getVar( 'wgServer' ), $this->getVar( 'wgScriptPath' ) );
+
                return true;
        }
 
@@ -990,6 +1018,7 @@ abstract class Installer {
                        $ext = 'php';
                }
                $this->setVar( 'wgScriptExtension', ".$ext" );
+
                return true;
        }
 
@@ -1035,6 +1064,7 @@ abstract class Installer {
                # Try the current value of LANG.
                if ( isset( $candidatesByLocale[getenv( 'LANG' )] ) ) {
                        $this->setVar( 'wgShellLocale', getenv( 'LANG' ) );
+
                        return true;
                }
 
@@ -1043,6 +1073,7 @@ abstract class Installer {
                foreach ( $commonLocales as $commonLocale ) {
                        if ( isset( $candidatesByLocale[$commonLocale] ) ) {
                                $this->setVar( 'wgShellLocale', $commonLocale );
+
                                return true;
                        }
                }
@@ -1053,6 +1084,7 @@ abstract class Installer {
                if ( isset( $candidatesByLang[$wikiLang] ) ) {
                        $m = reset( $candidatesByLang[$wikiLang] );
                        $this->setVar( 'wgShellLocale', $m[0] );
+
                        return true;
                }
 
@@ -1060,6 +1092,7 @@ abstract class Installer {
                if ( count( $candidatesByLocale ) ) {
                        $m = reset( $candidatesByLocale );
                        $this->setVar( 'wgShellLocale', $m[0] );
+
                        return true;
                }
 
@@ -1081,6 +1114,7 @@ abstract class Installer {
                if ( !$safe ) {
                        $this->showMessage( 'config-uploads-not-safe', $dir );
                }
+
                return true;
        }
 
@@ -1095,6 +1129,7 @@ abstract class Installer {
                        // Only warn if the value is below the sane 1024
                        $this->showMessage( 'config-suhosin-max-value-length', $maxValueLength );
                }
+
                return true;
        }
 
@@ -1177,8 +1212,10 @@ abstract class Installer {
        protected function envCheckCtype() {
                if ( !function_exists( 'ctype_digit' ) ) {
                        $this->showError( 'config-ctype' );
+
                        return false;
                }
+
                return true;
        }
 
@@ -1188,8 +1225,10 @@ abstract class Installer {
        protected function envCheckJSON() {
                if ( !function_exists( 'json_decode' ) ) {
                        $this->showError( 'config-json' );
+
                        return false;
                }
+
                return true;
        }
 
@@ -1218,8 +1257,8 @@ abstract class Installer {
         * @param string $path path to search
         * @param array $names of executable names
         * @param $versionInfo Boolean false or array with two members:
-        *               0 => Command to run for version check, with $1 for the full executable name
-        *               1 => String to compare the output with
+        *         0 => Command to run for version check, with $1 for the full executable name
+        *         1 => String to compare the output with
         *
         * If $versionInfo is not false, only executables with a version
         * matching $versionInfo[1] will be returned.
@@ -1248,6 +1287,7 @@ abstract class Installer {
                                }
                        }
                }
+
                return false;
        }
 
@@ -1265,6 +1305,7 @@ abstract class Installer {
                                return $exe;
                        }
                }
+
                return false;
        }
 
@@ -1298,8 +1339,7 @@ abstract class Installer {
 
                                try {
                                        $text = Http::get( $url . $file, array( 'timeout' => 3 ) );
-                               }
-                               catch ( MWException $e ) {
+                               } catch ( MWException $e ) {
                                        // Http::get throws with allow_url_fopen = false and no curl extension.
                                        $text = null;
                                }
@@ -1307,6 +1347,7 @@ abstract class Installer {
 
                                if ( $text == 'exec' ) {
                                        wfRestoreWarnings();
+
                                        return $ext;
                                }
                        }
@@ -1331,6 +1372,7 @@ abstract class Installer {
                ob_start();
                phpinfo( INFO_MODULES );
                $info = ob_get_clean();
+
                return strpos( $info, $moduleName ) !== false;
        }
 
@@ -1436,13 +1478,13 @@ abstract class Installer {
         */
        protected function getInstallSteps( DatabaseInstaller $installer ) {
                $coreInstallSteps = array(
-                       array( 'name' => 'database',   'callback' => array( $installer, 'setupDatabase' ) ),
-                       array( 'name' => 'tables',     'callback' => array( $installer, 'createTables' ) ),
-                       array( 'name' => 'interwiki',  'callback' => array( $installer, 'populateInterwikiTable' ) ),
-                       array( 'name' => 'stats',      'callback' => array( $this, 'populateSiteStats' ) ),
-                       array( 'name' => 'keys',       'callback' => array( $this, 'generateKeys' ) ),
-                       array( 'name' => 'sysop',      'callback' => array( $this, 'createSysop' ) ),
-                       array( 'name' => 'mainpage',   'callback' => array( $this, 'createMainpage' ) ),
+                       array( 'name' => 'database', 'callback' => array( $installer, 'setupDatabase' ) ),
+                       array( 'name' => 'tables', 'callback' => array( $installer, 'createTables' ) ),
+                       array( 'name' => 'interwiki', 'callback' => array( $installer, 'populateInterwikiTable' ) ),
+                       array( 'name' => 'stats', 'callback' => array( $this, 'populateSiteStats' ) ),
+                       array( 'name' => 'keys', 'callback' => array( $this, 'generateKeys' ) ),
+                       array( 'name' => 'sysop', 'callback' => array( $this, 'createSysop' ) ),
+                       array( 'name' => 'mainpage', 'callback' => array( $this, 'createMainpage' ) ),
                );
 
                // Build the array of install steps starting from the core install list,
@@ -1475,6 +1517,7 @@ abstract class Installer {
                                'callback' => array( $installer, 'createExtensionTables' )
                        );
                }
+
                return $this->installSteps;
        }
 
@@ -1511,6 +1554,7 @@ abstract class Installer {
                if ( $status->isOk() ) {
                        $this->setVar( '_InstallDone', true );
                }
+
                return $installResults;
        }
 
@@ -1524,6 +1568,7 @@ abstract class Installer {
                if ( strval( $this->getVar( 'wgUpgradeKey' ) ) === '' ) {
                        $keys['wgUpgradeKey'] = 16;
                }
+
                return $this->doGenerateKeys( $keys );
        }
 
@@ -1645,10 +1690,11 @@ abstract class Installer {
                        );
 
                        $page->doEditContent( $content,
-                                       '',
-                                       EDIT_NEW,
-                                       false,
-                                       User::newFromName( 'MediaWiki default' ) );
+                               '',
+                               EDIT_NEW,
+                               false,
+                               User::newFromName( 'MediaWiki default' )
+                       );
                } catch ( MWException $e ) {
                        //using raw, because $wgShowExceptionDetails can not be set yet
                        $status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
index cca8a4a..858fbee 100644 (file)
@@ -80,7 +80,7 @@ class LocalSettingsGenerator {
                                $val = wfBoolToStr( $val );
                        }
 
-                       if ( !in_array( $c, $unescaped ) ) {
+                       if ( !in_array( $c, $unescaped ) && $val !== null ) {
                                $val = self::escapePhpString( $val );
                        }
 
@@ -222,6 +222,12 @@ class LocalSettingsGenerator {
                        }
                }
 
+               $wgServerSetting = "";
+               if ( array_key_exists( 'wgServer', $this->values ) && $this->values['wgServer'] !== null ) {
+                       $wgServerSetting = "\n## The protocol and server name to use in fully-qualified URLs\n";
+                       $wgServerSetting .= "\$wgServer = \"{$this->values['wgServer']}\";\n";
+               }
+
                switch ( $this->values['wgMainCacheType'] ) {
                        case 'anything':
                        case 'db':
@@ -235,6 +241,7 @@ class LocalSettingsGenerator {
                }
 
                $mcservers = $this->buildMemcachedServerList();
+
                return "<?php
 # This file was automatically generated by the MediaWiki {$GLOBALS['wgVersion']}
 # installer. If you make manual changes, please keep track in case you
@@ -264,10 +271,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 ## http://www.mediawiki.org/wiki/Manual:Short_URL
 \$wgScriptPath = \"{$this->values['wgScriptPath']}\";
 \$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
-
-## The protocol and server name to use in fully-qualified URLs
-\$wgServer = \"{$this->values['wgServer']}\";
-
+${wgServerSetting}
 ## The relative URL path to the skins directory
 \$wgStylePath = \"\$wgScriptPath/skins\";
 
@@ -351,5 +355,4 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 
 {$groupRights}";
        }
-
 }
index c0b5243..16ec21c 100644 (file)
@@ -161,6 +161,7 @@ class MysqlInstaller extends DatabaseInstaller {
                } catch ( DBConnectionError $e ) {
                        $status->fatal( 'config-connection-error', $e->getMessage() );
                }
+
                return $status;
        }
 
@@ -170,6 +171,7 @@ class MysqlInstaller extends DatabaseInstaller {
                $status = $this->getConnection();
                if ( !$status->isOK() ) {
                        $this->parent->showStatusError( $status );
+
                        return;
                }
                /**
@@ -243,6 +245,7 @@ class MysqlInstaller extends DatabaseInstaller {
                        }
                }
                $engines = array_intersect( $this->supportedEngines, $engines );
+
                return $engines;
        }
 
@@ -327,6 +330,7 @@ class MysqlInstaller extends DatabaseInstaller {
                        // Can't grant everything
                        return false;
                }
+
                return true;
        }
 
@@ -350,7 +354,7 @@ class MysqlInstaller extends DatabaseInstaller {
 
                $s .= Xml::openElement( 'div', array(
                        'id' => 'dbMyisamWarning'
-               ));
+               ) );
                $myisamWarning = 'config-mysql-myisam-dep';
                if ( count( $engines ) === 1 ) {
                        $myisamWarning = 'config-mysql-only-myisam-dep';
@@ -382,7 +386,8 @@ class MysqlInstaller extends DatabaseInstaller {
                                                'class' => 'hideShowRadio',
                                                'rel' => 'dbMyisamWarning'
                                        )
-                       )));
+                               )
+                       ) );
                        $s .= $this->parent->getHelpBox( 'config-mysql-engine-help' );
                }
 
@@ -402,7 +407,7 @@ class MysqlInstaller extends DatabaseInstaller {
                                'label' => 'config-mysql-charset',
                                'itemLabelPrefix' => 'config-mysql-',
                                'values' => $charsets
-                       ));
+                       ) );
                        $s .= $this->parent->getHelpBox( 'config-mysql-charset-help' );
                }
 
@@ -454,6 +459,7 @@ class MysqlInstaller extends DatabaseInstaller {
                if ( !in_array( $this->getVar( '_MysqlCharset' ), $charsets ) ) {
                        $this->setVar( '_MysqlCharset', reset( $charsets ) );
                }
+
                return Status::newGood();
        }
 
@@ -481,6 +487,7 @@ class MysqlInstaller extends DatabaseInstaller {
                        $conn->selectDB( $dbName );
                }
                $this->setupSchemaVars();
+
                return $status;
        }
 
@@ -603,11 +610,11 @@ class MysqlInstaller extends DatabaseInstaller {
                try {
                        $res = $this->db->selectRow( 'mysql.user', array( 'Host', 'User' ),
                                array( 'Host' => $host, 'User' => $user ), __METHOD__ );
+
                        return (bool)$res;
                } catch ( DBQueryError $dqe ) {
                        return false;
                }
-
        }
 
        /**
@@ -624,6 +631,7 @@ class MysqlInstaller extends DatabaseInstaller {
                if ( $this->getVar( '_MysqlCharset' ) !== null ) {
                        $options[] = 'DEFAULT CHARSET=' . $this->getVar( '_MysqlCharset' );
                }
+
                return implode( ', ', $options );
        }
 
@@ -645,8 +653,8 @@ class MysqlInstaller extends DatabaseInstaller {
                $dbmysql5 = wfBoolToStr( $this->getVar( 'wgDBmysql5', true ) );
                $prefix = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBprefix' ) );
                $tblOpts = LocalSettingsGenerator::escapePhpString( $this->getTableOptions() );
-               return
-"# MySQL specific settings
+
+               return "# MySQL specific settings
 \$wgDBprefix = \"{$prefix}\";
 
 # MySQL table options to use during installation or update
index 02faf7c..d92d186 100644 (file)
@@ -276,11 +276,13 @@ class MysqlUpdater extends DatabaseUpdater {
                        foreach ( $info as $row ) {
                                if ( $row->Column_name == $field ) {
                                        $this->output( "...index $index on table $table includes field $field.\n" );
+
                                        return true;
                                }
                        }
                }
                $this->output( "...index $index on table $table has no field $field; added.\n" );
+
                return false;
        }
 
@@ -296,6 +298,7 @@ class MysqlUpdater extends DatabaseUpdater {
 
                if ( $this->db->tableExists( "interwiki", __METHOD__ ) ) {
                        $this->output( "...already have interwiki table\n" );
+
                        return;
                }
 
@@ -313,6 +316,7 @@ class MysqlUpdater extends DatabaseUpdater {
                }
                if ( $meta->isMultipleKey() ) {
                        $this->output( "...indexes seem up to 20031107 standards.\n" );
+
                        return;
                }
 
@@ -328,6 +332,7 @@ class MysqlUpdater extends DatabaseUpdater {
                $info = $this->db->fieldInfo( 'imagelinks', 'il_from' );
                if ( !$info || $info->type() !== 'string' ) {
                        $this->output( "...il_from OK\n" );
+
                        return;
                }
 
@@ -344,6 +349,7 @@ class MysqlUpdater extends DatabaseUpdater {
                $nontalk = $this->db->selectField( 'watchlist', 'count(*)', 'NOT (wl_namespace & 1)', __METHOD__ );
                if ( $talk == $nontalk ) {
                        $this->output( "...watchlist talk page rows already present.\n" );
+
                        return;
                }
 
@@ -361,6 +367,7 @@ class MysqlUpdater extends DatabaseUpdater {
        function doSchemaRestructuring() {
                if ( $this->db->tableExists( 'page', __METHOD__ ) ) {
                        $this->output( "...page table already exists.\n" );
+
                        return;
                }
 
@@ -379,7 +386,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        $this->output( sprintf( "<b>      %-60s %3s %5s</b>\n", 'Title', 'NS', 'Count' ) );
                        $duplicate = array();
                        foreach ( $rows as $row ) {
-                               if ( ! isset( $duplicate[$row->cur_namespace] ) ) {
+                               if ( !isset( $duplicate[$row->cur_namespace] ) ) {
                                        $duplicate[$row->cur_namespace] = array();
                                }
                                $duplicate[$row->cur_namespace][] = $row->cur_title;
@@ -552,6 +559,7 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doPagelinksUpdate() {
                if ( $this->db->tableExists( 'pagelinks', __METHOD__ ) ) {
                        $this->output( "...already have pagelinks table.\n" );
+
                        return;
                }
 
@@ -589,6 +597,7 @@ class MysqlUpdater extends DatabaseUpdater {
                $duper = new UserDupes( $this->db, array( $this, 'output' ) );
                if ( $duper->hasUniqueIndex() ) {
                        $this->output( "...already have unique user_name index.\n" );
+
                        return;
                }
 
@@ -621,6 +630,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        } else {
                                $this->output( "...user_groups table exists and is in current format.\n" );
                        }
+
                        return;
                }
 
@@ -633,6 +643,7 @@ class MysqlUpdater extends DatabaseUpdater {
                                $this->output( "*** WARNING: couldn't locate user_rights table or field for upgrade.\n" );
                                $this->output( "*** You may need to manually configure some sysops by manipulating\n" );
                                $this->output( "*** the user_groups table.\n" );
+
                                return;
                        }
                }
@@ -670,6 +681,7 @@ class MysqlUpdater extends DatabaseUpdater {
                }
                if ( $info->isNullable() ) {
                        $this->output( "...wl_notificationtimestamp is already nullable.\n" );
+
                        return;
                }
 
@@ -696,6 +708,7 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doTemplatelinksUpdate() {
                if ( $this->db->tableExists( 'templatelinks', __METHOD__ ) ) {
                        $this->output( "...templatelinks table already exists\n" );
+
                        return;
                }
 
@@ -719,7 +732,6 @@ class MysqlUpdater extends DatabaseUpdater {
                                                'tl_title' => $row->pl_title,
                                        ), __METHOD__
                                );
-
                        }
                } else {
                        // Fast update
@@ -739,8 +751,8 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doBacklinkingIndicesUpdate() {
                if ( !$this->indexHasField( 'pagelinks', 'pl_namespace', 'pl_from' ) ||
                        !$this->indexHasField( 'templatelinks', 'tl_namespace', 'tl_from' ) ||
-                       !$this->indexHasField( 'imagelinks', 'il_to', 'il_from' ) )
-               {
+                       !$this->indexHasField( 'imagelinks', 'il_to', 'il_from' )
+               {
                        $this->applyPatch( 'patch-backlinkindexes.sql', false, "Updating backlinking indices" );
                }
        }
@@ -753,6 +765,7 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doRestrictionsUpdate() {
                if ( $this->db->tableExists( 'page_restrictions', __METHOD__ ) ) {
                        $this->output( "...page_restrictions table already exists.\n" );
+
                        return;
                }
 
@@ -774,6 +787,7 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doCategoryPopulation() {
                if ( $this->updateRowExists( 'populate category' ) ) {
                        $this->output( "...category table already populated.\n" );
+
                        return;
                }
 
@@ -807,7 +821,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return true;
                }
 
-               if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+               if ( $wgProfileToDatabase === true && !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
                        $this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
                }
        }
@@ -821,8 +835,10 @@ class MysqlUpdater extends DatabaseUpdater {
                        return true;
                } elseif ( $this->db->fieldExists( 'profiling', 'pf_memory', __METHOD__ ) ) {
                        $this->output( "...profiling table has pf_memory field.\n" );
+
                        return true;
                }
+
                return $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" );
        }
 
@@ -831,6 +847,7 @@ class MysqlUpdater extends DatabaseUpdater {
                if ( !$info ) {
                        $this->applyPatch( 'patch-filearchive-user-index.sql', false, "Updating filearchive indices" );
                }
+
                return true;
        }
 
@@ -838,10 +855,12 @@ class MysqlUpdater extends DatabaseUpdater {
                $info = $this->db->indexInfo( 'pagelinks', 'pl_namespace' );
                if ( is_array( $info ) && !$info[0]->Non_unique ) {
                        $this->output( "...pl_namespace, tl_namespace, il_to indices are already UNIQUE.\n" );
+
                        return true;
                }
                if ( $this->skipSchema ) {
                        $this->output( "...skipping schema change (making pl_namespace, tl_namespace and il_to indices UNIQUE).\n" );
+
                        return false;
                }
 
@@ -851,6 +870,7 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doUpdateMimeMinorField() {
                if ( $this->updateRowExists( 'mime_minor_length' ) ) {
                        $this->output( "...*_mime_minor fields are already long enough.\n" );
+
                        return;
                }
 
@@ -860,6 +880,7 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doClFieldsUpdate() {
                if ( $this->updateRowExists( 'cl_fields_update' ) ) {
                        $this->output( "...categorylinks up-to-date.\n" );
+
                        return;
                }
 
@@ -889,6 +910,7 @@ class MysqlUpdater extends DatabaseUpdater {
                }
                if ( $info->isNullable() ) {
                        $this->output( "...user_last_timestamp is already nullable.\n" );
+
                        return;
                }
 
@@ -899,10 +921,12 @@ class MysqlUpdater extends DatabaseUpdater {
                $info = $this->db->indexInfo( 'iwlinks', 'iwl_prefix_title_from' );
                if ( is_array( $info ) && $info[0]->Non_unique ) {
                        $this->output( "...iwl_prefix_title_from index is already non-UNIQUE.\n" );
+
                        return true;
                }
                if ( $this->skipSchema ) {
                        $this->output( "...skipping schema change (making iwl_prefix_title_from index non-UNIQUE).\n" );
+
                        return false;
                }
 
index aa95093..efa8d00 100644 (file)
@@ -59,6 +59,7 @@ class OracleInstaller extends DatabaseInstaller {
                if ( $this->getVar( 'wgDBserver' ) == 'localhost' ) {
                        $this->parent->setVar( 'wgDBserver', '' );
                }
+
                return $this->getTextBox( 'wgDBserver', 'config-db-host-oracle', array(), $this->parent->getHelpBox( 'config-db-host-oracle-help' ) ) .
                        Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
@@ -74,6 +75,7 @@ class OracleInstaller extends DatabaseInstaller {
        public function submitInstallUserBox() {
                parent::submitInstallUserBox();
                $this->parent->setVar( '_InstallDBname', $this->getVar( '_InstallUser' ) );
+
                return Status::newGood();
        }
 
@@ -162,6 +164,7 @@ class OracleInstaller extends DatabaseInstaller {
                        $this->connError = $e->db->lastErrno();
                        $status->fatal( 'config-connection-error', $e->getMessage() );
                }
+
                return $status;
        }
 
@@ -181,6 +184,7 @@ class OracleInstaller extends DatabaseInstaller {
                        $this->connError = $e->db->lastErrno();
                        $status->fatal( 'config-connection-error', $e->getMessage() );
                }
+
                return $status;
        }
 
@@ -189,6 +193,7 @@ class OracleInstaller extends DatabaseInstaller {
                $this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
                $retVal = parent::needsUpgrade();
                $this->parent->setVar( 'wgDBname', $tempDBname );
+
                return $retVal;
        }
 
@@ -203,6 +208,7 @@ class OracleInstaller extends DatabaseInstaller {
 
        public function setupDatabase() {
                $status = Status::newGood();
+
                return $status;
        }
 
@@ -285,13 +291,14 @@ class OracleInstaller extends DatabaseInstaller {
                foreach ( $varNames as $name ) {
                        $vars[$name] = $this->getVar( $name );
                }
+
                return $vars;
        }
 
        public function getLocalSettings() {
                $prefix = $this->getVar( 'wgDBprefix' );
-               return
-"# Oracle specific settings
+
+               return "# Oracle specific settings
 \$wgDBprefix = \"{$prefix}\";
 ";
        }
@@ -315,5 +322,4 @@ class OracleInstaller extends DatabaseInstaller {
                $isValid |= preg_match( '/^(?:\/\/)?[\w\-\.]+(?::[\d]+)?(?:\/(?:[\w\-\.]+(?::(pooled|dedicated|shared))?)?(?:\/[\w\-\.]+)?)?$/', $connect_string ); // EZConnect
                return (bool)$isValid;
        }
-
 }
index be10e04..f3f86eb 100644 (file)
@@ -212,6 +212,7 @@ class OracleUpdater extends DatabaseUpdater {
                $row = $meta->fetchRow();
                if ( $row['column_name'] == 'PR_ID' ) {
                        $this->output( "seems to be up to date.\n" );
+
                        return;
                }
 
@@ -247,5 +248,4 @@ class OracleUpdater extends DatabaseUpdater {
                $this->db->delete( '/*Q*/' . $this->db->tableName( 'objectcache' ), '*', __METHOD__ );
                $this->output( "done.\n" );
        }
-
 }
index 773debe..5471264 100644 (file)
@@ -30,6 +30,7 @@
 class PhpXmlBugTester {
        private $parsedData = '';
        public $ok = false;
+
        public function __construct() {
                $charData = '<b>c</b>';
                $xml = '<a>' . htmlspecialchars( $charData ) . '</a>';
@@ -39,6 +40,7 @@ class PhpXmlBugTester {
                $parsedOk = xml_parse( $parser, $xml, true );
                $this->ok = $parsedOk && ( $this->parsedData == $charData );
        }
+
        public function chardata( $parser, $data ) {
                $this->parsedData .= $data;
        }
index 3747189..a7e8462 100644 (file)
@@ -107,6 +107,7 @@ class PostgresInstaller extends DatabaseInstaller {
 
                $this->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
                $this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
+
                return Status::newGood();
        }
 
@@ -115,6 +116,7 @@ class PostgresInstaller extends DatabaseInstaller {
                if ( $status->isOK() ) {
                        $this->db = $status->value;
                }
+
                return $status;
        }
 
@@ -142,6 +144,7 @@ class PostgresInstaller extends DatabaseInstaller {
                } catch ( DBConnectionError $e ) {
                        $status->fatal( 'config-connection-error', $e->getMessage() );
                }
+
                return $status;
        }
 
@@ -165,6 +168,7 @@ class PostgresInstaller extends DatabaseInstaller {
                        $conn->commit( __METHOD__ );
                        $this->pgConns[$type] = $conn;
                }
+
                return $status;
        }
 
@@ -215,6 +219,7 @@ class PostgresInstaller extends DatabaseInstaller {
                                        $safeRole = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
                                        $conn->query( "SET ROLE $safeRole" );
                                }
+
                                return $status;
                        default:
                                throw new MWException( "Invalid special connection type: \"$type\"" );
@@ -267,6 +272,7 @@ class PostgresInstaller extends DatabaseInstaller {
 
                $row = $conn->selectRow( '"pg_catalog"."pg_roles"', '*',
                        array( 'rolname' => $superuser ), __METHOD__ );
+
                return $row;
        }
 
@@ -275,6 +281,7 @@ class PostgresInstaller extends DatabaseInstaller {
                if ( !$perms ) {
                        return false;
                }
+
                return $perms->rolsuper === 't' || $perms->rolcreaterole === 't';
        }
 
@@ -283,6 +290,7 @@ class PostgresInstaller extends DatabaseInstaller {
                if ( !$perms ) {
                        return false;
                }
+
                return $perms->rolsuper === 't';
        }
 
@@ -331,6 +339,7 @@ class PostgresInstaller extends DatabaseInstaller {
                        } else {
                                $msg = 'config-install-user-missing';
                        }
+
                        return Status::newFatal( $msg, $this->getVar( 'wgDBuser' ) );
                }
 
@@ -410,6 +419,7 @@ class PostgresInstaller extends DatabaseInstaller {
                                }
                        }
                }
+
                return false;
        }
 
@@ -454,6 +464,7 @@ class PostgresInstaller extends DatabaseInstaller {
                        $safedb = $conn->addIdentifierQuotes( $dbName );
                        $conn->query( "CREATE DATABASE $safedb", __METHOD__ );
                }
+
                return Status::newGood();
        }
 
@@ -480,11 +491,13 @@ class PostgresInstaller extends DatabaseInstaller {
 
                // Select the new schema in the current connection
                $conn->determineCoreSchema( $schema );
+
                return Status::newGood();
        }
 
        function commitChanges() {
                $this->db->commit( __METHOD__ );
+
                return Status::newGood();
        }
 
@@ -529,8 +542,8 @@ class PostgresInstaller extends DatabaseInstaller {
        function getLocalSettings() {
                $port = $this->getVar( 'wgDBport' );
                $schema = $this->getVar( 'wgDBmwschema' );
-               return
-"# Postgres specific settings
+
+               return "# Postgres specific settings
 \$wgDBport = \"{$port}\";
 \$wgDBmwschema = \"{$schema}\";";
        }
@@ -560,6 +573,7 @@ class PostgresInstaller extends DatabaseInstaller {
                if ( $conn->tableExists( 'archive' ) ) {
                        $status->warning( 'config-install-tables-exist' );
                        $this->enableLB();
+
                        return $status;
                }
 
@@ -567,6 +581,7 @@ class PostgresInstaller extends DatabaseInstaller {
 
                if ( !$conn->schemaExists( $schema ) ) {
                        $status->fatal( 'config-install-pg-schema-not-exist' );
+
                        return $status;
                }
                $error = $conn->sourceFile( $conn->getSchemaPath() );
@@ -581,6 +596,7 @@ class PostgresInstaller extends DatabaseInstaller {
                if ( $status->isOk() ) {
                        $this->enableLB();
                }
+
                return $status;
        }
 
@@ -623,6 +639,7 @@ class PostgresInstaller extends DatabaseInstaller {
                } else {
                        return Status::newFatal( 'config-pg-no-plpgsql', $this->getVar( 'wgDBname' ) );
                }
+
                return Status::newGood();
        }
 }
index 58a54c4..a4c9d74 100644 (file)
@@ -371,25 +371,25 @@ class PostgresUpdater extends DatabaseUpdater {
                # Add missing extension fields
                foreach ( $wgExtPGNewFields as $fieldRecord ) {
                        $updates[] = array(
-                                       'addPgField', $fieldRecord[0], $fieldRecord[1],
-                                       $fieldRecord[2]
-                               );
+                               'addPgField', $fieldRecord[0], $fieldRecord[1],
+                               $fieldRecord[2]
+                       );
                }
 
                # Change altered columns
                foreach ( $wgExtPGAlteredFields as $fieldRecord ) {
                        $updates[] = array(
-                                       'changeField', $fieldRecord[0], $fieldRecord[1],
-                                       $fieldRecord[2]
-                               );
+                               'changeField', $fieldRecord[0], $fieldRecord[1],
+                               $fieldRecord[2]
+                       );
                }
 
                # Add missing extension indexes
                foreach ( $wgExtNewIndexes as $fieldRecord ) {
                        $updates[] = array(
-                                       'addPgExtIndex', $fieldRecord[0], $fieldRecord[1],
-                                       $fieldRecord[2]
-                               );
+                               'addPgExtIndex', $fieldRecord[0], $fieldRecord[1],
+                               $fieldRecord[2]
+                       );
                }
 
                return $updates;
@@ -403,8 +403,8 @@ SELECT attname, attnum FROM pg_namespace, pg_class, pg_attribute
          AND relname=%s AND nspname=%s
 END;
                $res = $this->db->query( sprintf( $q,
-                               $this->db->addQuotes( $table ),
-                               $this->db->addQuotes( $this->db->getCoreSchema() ) ) );
+                       $this->db->addQuotes( $table ),
+                       $this->db->addQuotes( $this->db->getCoreSchema() ) ) );
                if ( !$res ) {
                        return null;
                }
@@ -412,10 +412,11 @@ END;
                $cols = array();
                foreach ( $res as $r ) {
                        $cols[] = array(
-                                       "name" => $r[0],
-                                       "ord" => $r[1],
-                               );
+                               "name" => $r[0],
+                               "ord" => $r[1],
+                       );
                }
+
                return $cols;
        }
 
@@ -485,11 +486,12 @@ END;
                if ( !( $row = $this->db->fetchRow( $r ) ) ) {
                        return null;
                }
+
                return $row[0];
        }
 
        function ruleDef( $table, $rule ) {
-       $q = <<<END
+               $q = <<<END
 SELECT definition FROM pg_rules
        WHERE schemaname = %s
          AND tablename = %s
@@ -508,6 +510,7 @@ END;
                        return null;
                }
                $d = $row[0];
+
                return $d;
        }
 
@@ -524,6 +527,7 @@ END;
        protected function renameSequence( $old, $new ) {
                if ( $this->db->sequenceExists( $new ) ) {
                        $this->output( "...sequence $new already exists.\n" );
+
                        return;
                }
                if ( $this->db->sequenceExists( $old ) ) {
@@ -550,6 +554,7 @@ END;
                // First requirement: the table must exist
                if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
                        $this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+
                        return;
                }
 
@@ -557,17 +562,19 @@ END;
                if ( $this->db->indexExists( $table, $new, __METHOD__ ) ) {
                        $this->output( "...index $new already set on $table table.\n" );
                        if ( !$skipBothIndexExistWarning
-                               && $this->db->indexExists( $table, $old, __METHOD__ ) )
-                       {
+                               && $this->db->indexExists( $table, $old, __METHOD__ )
+                       {
                                $this->output( "...WARNING: $old still exists, despite it has been renamed into $new (which also exists).\n" .
                                        "            $old should be manually removed if not needed anymore.\n" );
                        }
+
                        return;
                }
 
                // Third requirement: the old index must exist
                if ( !$this->db->indexExists( $table, $old, __METHOD__ ) ) {
                        $this->output( "...skipping: index $old doesn't exist.\n" );
+
                        return;
                }
 
@@ -578,6 +585,7 @@ END;
                $fi = $this->db->fieldInfo( $table, $field );
                if ( !is_null( $fi ) ) {
                        $this->output( "...column '$table.$field' already exists\n" );
+
                        return;
                } else {
                        $this->output( "Adding column '$table.$field'\n" );
@@ -638,8 +646,7 @@ END;
                        if ( 'NULL' === $null ) {
                                $this->output( "Changing '$table.$field' to allow NULLs\n" );
                                $this->db->query( "ALTER TABLE $table ALTER $field DROP NOT NULL" );
-                       }
-                       else {
+                       } else {
                                $this->output( "...column '$table.$field' is already set as NOT NULL\n" );
                        }
                }
@@ -671,6 +678,7 @@ END;
                $fi = $this->db->fieldInfo( $table, $field );
                if ( is_null( $fi ) ) {
                        $this->output( "WARNING! Column '$table.$field' does not exist but it should! Please report this.\n" );
+
                        return;
                }
                if ( $fi->is_deferred() && $fi->is_deferrable() ) {
index 50a7181..136ca4b 100644 (file)
@@ -63,6 +63,7 @@ class SqliteInstaller extends DatabaseInstaller {
                if ( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
                        $result->warning( 'config-no-fts3' );
                }
+
                return $result;
        }
 
@@ -73,6 +74,7 @@ class SqliteInstaller extends DatabaseInstaller {
                                DIRECTORY_SEPARATOR,
                                dirname( $_SERVER['DOCUMENT_ROOT'] ) . '/data'
                        );
+
                        return array( 'wgSQLiteDataDir' => $path );
                } else {
                        return array();
@@ -96,6 +98,7 @@ class SqliteInstaller extends DatabaseInstaller {
                if ( !$result ) {
                        return $path;
                }
+
                return $result;
        }
 
@@ -115,6 +118,7 @@ class SqliteInstaller extends DatabaseInstaller {
                }
                # Table prefix is not used on SQLite, keep it empty
                $this->setVar( 'wgDBprefix', '' );
+
                return $result;
        }
 
@@ -173,6 +177,7 @@ class SqliteInstaller extends DatabaseInstaller {
                } catch ( DBConnectionError $e ) {
                        $status->fatal( 'config-sqlite-connection-error', $e->getMessage() );
                }
+
                return $status;
        }
 
@@ -220,6 +225,7 @@ class SqliteInstaller extends DatabaseInstaller {
                $this->setVar( 'wgDBuser', '' );
                $this->setVar( 'wgDBpassword', '' );
                $this->setupSchemaVars();
+
                return $this->getConnection();
        }
 
@@ -228,6 +234,7 @@ class SqliteInstaller extends DatabaseInstaller {
         */
        public function createTables() {
                $status = parent::createTables();
+
                return $this->setupSearchIndex( $status );
        }
 
@@ -246,6 +253,7 @@ class SqliteInstaller extends DatabaseInstaller {
                } elseif ( !$fts3tTable && $module == 'FTS3' ) {
                        $this->db->sourceFile( "$IP/maintenance/sqlite/archives/searchindex-fts3.sql" );
                }
+
                return $status;
        }
 
@@ -254,8 +262,8 @@ class SqliteInstaller extends DatabaseInstaller {
         */
        public function getLocalSettings() {
                $dir = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgSQLiteDataDir' ) );
-               return
-"# SQLite-specific settings
+
+               return "# SQLite-specific settings
 \$wgSQLiteDataDir = \"{$dir}\";";
        }
 }
index 28d8d66..df69c0e 100644 (file)
@@ -116,6 +116,7 @@ class SqliteUpdater extends DatabaseUpdater {
                // initial-indexes.sql fails if the indexes are already present, so we perform a quick check if our database is newer.
                if ( $this->updateRowExists( 'initial_indexes' ) || $this->db->indexExists( 'user', 'user_name', __METHOD__ ) ) {
                        $this->output( "...have initial indexes\n" );
+
                        return;
                }
                $this->applyPatch( 'initial-indexes.sql', false, "Adding initial indexes" );
@@ -135,7 +136,7 @@ class SqliteUpdater extends DatabaseUpdater {
 
        protected function doEnableProfiling() {
                global $wgProfileToDatabase;
-               if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+               if ( $wgProfileToDatabase === true && !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
                        $this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
                }
        }
index 9fcd312..cbceed6 100644 (file)
@@ -155,8 +155,8 @@ class WebInstaller extends Installer {
                $this->setupLanguage();
 
                if ( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
-                       && $this->request->getVal( 'localsettings' ) )
-               {
+                       && $this->request->getVal( 'localsettings' )
+               {
                        $this->request->response()->header( 'Content-type: application/x-httpd-php' );
                        $this->request->response()->header(
                                'Content-Disposition: attachment; filename="LocalSettings.php"'
@@ -168,6 +168,7 @@ class WebInstaller extends Installer {
                                $ls->setGroupRights( $group, $rightsArr );
                        }
                        echo $ls->getText();
+
                        return $this->session;
                }
 
@@ -176,6 +177,7 @@ class WebInstaller extends Installer {
                        $cssDir = ( $cssDir == 'rtl' ? 'rtl' : 'ltr' );
                        $this->request->response()->header( 'Content-type: text/css' );
                        echo $this->output->getCSS( $cssDir );
+
                        return $this->session;
                }
 
@@ -199,6 +201,7 @@ class WebInstaller extends Installer {
                        $this->output->useShortHeader();
                        $this->output->allowFrames();
                        $page->submitCC();
+
                        return $this->finish();
                }
 
@@ -207,6 +210,7 @@ class WebInstaller extends Installer {
                        $this->output->useShortHeader();
                        $this->output->allowFrames();
                        $this->output->addHTML( $page->getCCDoneBox() );
+
                        return $this->finish();
                }
 
@@ -256,6 +260,7 @@ class WebInstaller extends Installer {
                        }
 
                        $this->output->redirect( $this->getUrl( array( 'page' => $nextPage ) ) );
+
                        return $this->finish();
                }
 
@@ -336,6 +341,7 @@ class WebInstaller extends Installer {
 
                if ( $this->phpErrors ) {
                        $this->showError( 'config-session-error', $this->phpErrors[0] );
+
                        return false;
                }
 
@@ -362,6 +368,7 @@ class WebInstaller extends Installer {
                        // the /mw-config/index.php. Kinda scary though?
                        $url = $m[1];
                }
+
                return md5( serialize( array(
                        'local path' => dirname( __DIR__ ),
                        'url' => $url,
@@ -614,9 +621,9 @@ class WebInstaller extends Installer {
         */
        private function endPageWrapper() {
                $this->output->addHTMLNoFlush(
-                                       "<div class=\"visualClear\"></div>\n" .
-                               "</div>\n" .
-                               "<div class=\"visualClear\"></div>\n" .
+                       "<div class=\"visualClear\"></div>\n" .
+                       "</div>\n" .
+                       "<div class=\"visualClear\"></div>\n" .
                        "</div>" );
        }
 
@@ -655,6 +662,7 @@ class WebInstaller extends Installer {
                $text = $this->parse( $text, true );
                $icon = ( $icon == false ) ? '../skins/common/images/info-32.png' : '../skins/common/images/' . $icon;
                $alt = wfMessage( 'config-information' )->text();
+
                return Html::infoBox( $text, $icon, $alt, $class, false );
        }
 
@@ -699,7 +707,7 @@ class WebInstaller extends Installer {
                $args = func_get_args();
                array_shift( $args );
                $html = '<div class="config-message">' .
-               $this->parse( wfMessage( $msg, $args )->useDatabase( false )->plain() ) .
+                       $this->parse( wfMessage( $msg, $args )->useDatabase( false )->plain() ) .
                        "</div>\n";
                $this->output->addHTML( $html );
        }
@@ -741,11 +749,12 @@ class WebInstaller extends Installer {
                        "  <div class=\"config-block-label\">\n" .
                        Xml::tags( 'label',
                                $attributes,
-                               $labelText ) . "\n" .
-                               $helpData .
+                               $labelText
+                       ) . "\n" .
+                       $helpData .
                        "  </div>\n" .
                        "  <div class=\"config-block-elements\">\n" .
-                               $contents .
+                       $contents .
                        "  </div>\n" .
                        "</div>\n";
        }
@@ -755,12 +764,12 @@ class WebInstaller extends Installer {
         *
         * @param $params Array
         *    Parameters are:
-        *      var:        The variable to be configured (required)
-        *      label:      The message name for the label (required)
-        *      attribs:    Additional attributes for the input element (optional)
+        *      var:         The variable to be configured (required)
+        *      label:       The message name for the label (required)
+        *      attribs:     Additional attributes for the input element (optional)
         *      controlName: The name for the input element (optional)
-        *      value:      The current value of the variable (optional)
-        *      help:           The html for the help text (optional)
+        *      value:       The current value of the variable (optional)
+        *      help:        The html for the help text (optional)
         *
         * @return string
         */
@@ -779,21 +788,22 @@ class WebInstaller extends Installer {
                if ( !isset( $params['help'] ) ) {
                        $params['help'] = "";
                }
+
                return $this->label(
-                               $params['label'],
+                       $params['label'],
+                       $params['controlName'],
+                       Xml::input(
                                $params['controlName'],
-                               Xml::input(
-                                       $params['controlName'],
-                                       30, // intended to be overridden by CSS
-                                       $params['value'],
-                                       $params['attribs'] + array(
-                                               'id' => $params['controlName'],
-                                               'class' => 'config-input-text',
-                                               'tabindex' => $this->nextTabIndex()
-                                       )
-                               ),
-                               $params['help']
-                       );
+                               30, // intended to be overridden by CSS
+                               $params['value'],
+                               $params['attribs'] + array(
+                                       'id' => $params['controlName'],
+                                       'class' => 'config-input-text',
+                                       'tabindex' => $this->nextTabIndex()
+                               )
+                       ),
+                       $params['help']
+               );
        }
 
        /**
@@ -801,12 +811,12 @@ class WebInstaller extends Installer {
         *
         * @param $params Array
         *    Parameters are:
-        *      var:        The variable to be configured (required)
-        *      label:      The message name for the label (required)
-        *      attribs:    Additional attributes for the input element (optional)
+        *      var:         The variable to be configured (required)
+        *      label:       The message name for the label (required)
+        *      attribs:     Additional attributes for the input element (optional)
         *      controlName: The name for the input element (optional)
-        *      value:      The current value of the variable (optional)
-        *      help:           The html for the help text (optional)
+        *      value:       The current value of the variable (optional)
+        *      help:        The html for the help text (optional)
         *
         * @return string
         */
@@ -825,22 +835,23 @@ class WebInstaller extends Installer {
                if ( !isset( $params['help'] ) ) {
                        $params['help'] = "";
                }
+
                return $this->label(
-                               $params['label'],
+                       $params['label'],
+                       $params['controlName'],
+                       Xml::textarea(
                                $params['controlName'],
-                               Xml::textarea(
-                                       $params['controlName'],
-                                       $params['value'],
-                                       30,
-                                       5,
-                                       $params['attribs'] + array(
-                                               'id' => $params['controlName'],
-                                               'class' => 'config-input-text',
-                                               'tabindex' => $this->nextTabIndex()
-                                       )
-                               ),
-                               $params['help']
-                       );
+                               $params['value'],
+                               30,
+                               5,
+                               $params['attribs'] + array(
+                                       'id' => $params['controlName'],
+                                       'class' => 'config-input-text',
+                                       'tabindex' => $this->nextTabIndex()
+                               )
+                       ),
+                       $params['help']
+               );
        }
 
        /**
@@ -849,12 +860,12 @@ class WebInstaller extends Installer {
         * Implements password hiding
         * @param $params Array
         *    Parameters are:
-        *      var:        The variable to be configured (required)
-        *      label:      The message name for the label (required)
-        *      attribs:    Additional attributes for the input element (optional)
+        *      var:         The variable to be configured (required)
+        *      label:       The message name for the label (required)
+        *      attribs:     Additional attributes for the input element (optional)
         *      controlName: The name for the input element (optional)
-        *      value:      The current value of the variable (optional)
-        *      help:           The html for the help text (optional)
+        *      value:       The current value of the variable (optional)
+        *      help:        The html for the help text (optional)
         *
         * @return string
         */
@@ -878,12 +889,12 @@ class WebInstaller extends Installer {
         *
         * @param $params Array
         *    Parameters are:
-        *      var:        The variable to be configured (required)
-        *      label:      The message name for the label (required)
-        *      attribs:    Additional attributes for the input element (optional)
+        *      var:         The variable to be configured (required)
+        *      label:       The message name for the label (required)
+        *      attribs:     Additional attributes for the input element (optional)
         *      controlName: The name for the input element (optional)
-        *      value:      The current value of the variable (optional)
-        *      help:           The html for the help text (optional)
+        *      value:       The current value of the variable (optional)
+        *      help:        The html for the help text (optional)
         *
         * @return string
         */
@@ -929,15 +940,15 @@ class WebInstaller extends Installer {
         *
         * @param $params Array
         *    Parameters are:
-        *      var:            The variable to be configured (required)
-        *      label:          The message name for the label (required)
+        *      var:             The variable to be configured (required)
+        *      label:           The message name for the label (required)
         *      itemLabelPrefix: The message name prefix for the item labels (required)
-        *      values:         List of allowed values (required)
-        *      itemAttribs     Array of attribute arrays, outer key is the value name (optional)
-        *      commonAttribs   Attribute array applied to all items
-        *      controlName:    The name for the input element (optional)
-        *      value:          The current value of the variable (optional)
-        *      help:           The html for the help text (optional)
+        *      values:          List of allowed values (required)
+        *      itemAttribs:     Array of attribute arrays, outer key is the value name (optional)
+        *      commonAttribs:   Attribute array applied to all items
+        *      controlName:     The name for the input element (optional)
+        *      value:           The current value of the variable (optional)
+        *      help:            The html for the help text (optional)
         *
         * @return string
         */
@@ -1067,6 +1078,7 @@ class WebInstaller extends Installer {
         */
        public function docLink( $linkText, $attribs, $parser ) {
                $url = $this->getDocUrl( $attribs['href'] );
+
                return '<a href="' . htmlspecialchars( $url ) . '">' .
                        htmlspecialchars( $linkText ) .
                        '</a>';
@@ -1089,6 +1101,7 @@ class WebInstaller extends Installer {
                $anchor = Html::rawElement( 'a',
                        array( 'href' => $this->getURL( array( 'localsettings' => 1 ) ) ),
                        $img . ' ' . wfMessage( 'config-download-localsettings' )->parse() );
+
                return Html::rawElement( 'div', array( 'class' => 'config-download-link' ), $anchor );
        }
 
@@ -1110,8 +1123,10 @@ class WebInstaller extends Installer {
                        $this->setVar( 'wgScriptPath', $uri );
                } else {
                        $this->showError( 'config-no-uri' );
+
                        return false;
                }
+
                return parent::envCheckPath();
        }
 
index 77e9a2c..1df8f05 100644 (file)
@@ -185,6 +185,7 @@ class WebInstallerOutput {
         */
        public function getDir() {
                global $wgLang;
+
                return is_object( $wgLang ) ? $wgLang->getDir() : 'ltr';
        }
 
@@ -193,6 +194,7 @@ class WebInstallerOutput {
         */
        public function getLanguageCode() {
                global $wgLang;
+
                return is_object( $wgLang ) ? $wgLang->getCode() : 'en';
        }
 
@@ -216,22 +218,23 @@ class WebInstallerOutput {
 
        public function outputHeader() {
                $this->headerDone = true;
-               $dbTypes = $this->parent->getDBTypes();
-
                $this->parent->request->response()->header( 'Content-Type: text/html; charset=utf-8' );
+
                if ( !$this->allowFrames ) {
                        $this->parent->request->response()->header( 'X-Frame-Options: DENY' );
                }
+
                if ( $this->redirectTarget ) {
                        $this->parent->request->response()->header( 'Location: ' . $this->redirectTarget );
+
                        return;
                }
 
                if ( $this->useShortHeader ) {
                        $this->outputShortHeader();
+
                        return;
                }
-
 ?>
 <?php echo Html::htmlHeader( $this->getHeadAttribs() ); ?>
 <head>
index 510ea6c..11c0a8e 100644 (file)
@@ -89,27 +89,35 @@ abstract class WebInstallerPage {
                if ( $continue ) {
                        // Fake submit button for enter keypress (bug 26267)
                        // Messages: config-continue, config-restart, config-regenerate
-                       $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
-                               array( 'name' => "enter-$continue", 'style' =>
-                                       'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
+                       $s .= Xml::submitButton(
+                               wfMessage( "config-$continue" )->text(),
+                               array(
+                                       'name' => "enter-$continue",
+                                       'style' => 'visibility:hidden;overflow:hidden;width:1px;margin:0'
+                               )
+                       ) . "\n";
                }
 
                if ( $back ) {
                        // Message: config-back
-                       $s .= Xml::submitButton( wfMessage( "config-$back" )->text(),
+                       $s .= Xml::submitButton(
+                               wfMessage( "config-$back" )->text(),
                                array(
                                        'name' => "submit-$back",
                                        'tabindex' => $this->parent->nextTabIndex()
-                               ) ) . "\n";
+                               )
+                       ) . "\n";
                }
 
                if ( $continue ) {
                        // Messages: config-continue, config-restart, config-regenerate
-                       $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
+                       $s .= Xml::submitButton(
+                               wfMessage( "config-$continue" )->text(),
                                array(
                                        'name' => "submit-$continue",
                                        'tabindex' => $this->parent->nextTabIndex(),
-                               ) ) . "\n";
+                               )
+                       ) . "\n";
                }
 
                $s .= "</div></form></div>\n";
@@ -211,6 +219,7 @@ class WebInstaller_Language extends WebInstallerPage {
                                if ( isset( $languages[$contLang] ) ) {
                                        $this->setVar( 'wgLanguageCode', $contLang );
                                }
+
                                return 'continue';
                        }
                } elseif ( $this->parent->showSessionWarning ) {
@@ -264,9 +273,9 @@ class WebInstaller_Language extends WebInstallerPage {
                        $s .= "\n" . Xml::option( "$code - $lang", $code, $code == $selectedCode );
                }
                $s .= "\n</select>\n";
+
                return $this->parent->label( $label, $name, $s );
        }
-
 }
 
 class WebInstaller_ExistingWiki extends WebInstallerPage {
@@ -280,8 +289,8 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
                // Check if the upgrade key supplied to the user has appeared in LocalSettings.php
                if ( $vars['wgUpgradeKey'] !== false
                        && $this->getVar( '_UpgradeKeySupplied' )
-                       && $this->getVar( 'wgUpgradeKey' ) === $vars['wgUpgradeKey'] )
-               {
+                       && $this->getVar( 'wgUpgradeKey' ) === $vars['wgUpgradeKey']
+               {
                        // It's there, so the user is authorized
                        $status = $this->handleExistingUpgrade( $vars );
                        if ( $status->isOK() ) {
@@ -290,6 +299,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
                                $this->startForm();
                                $this->parent->showStatusBox( $status );
                                $this->endForm( 'continue' );
+
                                return 'output';
                        }
                }
@@ -308,6 +318,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
                                        $this->getVar( 'wgUpgradeKey' ) . "';</pre>" )->plain()
                        ) );
                        $this->endForm( 'continue' );
+
                        return 'output';
                }
 
@@ -319,6 +330,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
                        if ( !$key || $key !== $vars['wgUpgradeKey'] ) {
                                $this->parent->showError( 'config-localsettings-badkey' );
                                $this->showKeyForm();
+
                                return 'output';
                        }
                        // Key was OK
@@ -328,10 +340,12 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
                        } else {
                                $this->parent->showStatusBox( $status );
                                $this->showKeyForm();
+
                                return 'output';
                        }
                } else {
                        $this->showKeyForm();
+
                        return 'output';
                }
        }
@@ -361,6 +375,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
                        }
                        $this->setVar( $name, $vars[$name] );
                }
+
                return $status;
        }
 
@@ -372,7 +387,8 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
        protected function handleExistingUpgrade( $vars ) {
                // Check $wgDBtype
                if ( !isset( $vars['wgDBtype'] ) ||
-                        !in_array( $vars['wgDBtype'], Installer::getDBTypes() ) ) {
+                       !in_array( $vars['wgDBtype'], Installer::getDBTypes() )
+               ) {
                        return Status::newFatal( 'config-localsettings-connection-error', '' );
                }
 
@@ -402,11 +418,13 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
                        // Adjust the error message to explain things correctly
                        $status->replaceMessage( 'config-connection-error',
                                'config-localsettings-connection-error' );
+
                        return $status;
                }
 
                // All good
                $this->setVar( '_ExistingDBSettings', true );
+
                return $status;
        }
 }
@@ -431,9 +449,9 @@ class WebInstaller_Welcome extends WebInstallerPage {
                } else {
                        $this->parent->showStatusMessage( $status );
                }
+
                return '';
        }
-
 }
 
 class WebInstaller_DBConnect extends WebInstallerPage {
@@ -449,6 +467,7 @@ class WebInstaller_DBConnect extends WebInstallerPage {
 
                        if ( $status->isGood() ) {
                                $this->setVar( '_UpgradeDone', false );
+
                                return 'continue';
                        } else {
                                $this->parent->showStatusBox( $status );
@@ -494,20 +513,21 @@ class WebInstaller_DBConnect extends WebInstallerPage {
 
                        // Messages: config-header-mysql, config-header-postgres, config-header-oracle,
                        // config-header-sqlite
-                       $settings .=
-                               Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type,
-                                               'class' => 'dbWrapper' ) ) .
+                       $settings .= Html::openElement(
+                                       'div',
+                                       array(
+                                               'id' => 'DB_wrapper_' . $type,
+                                               'class' => 'dbWrapper'
+                                       )
+                               ) .
                                Html::element( 'h3', array(), wfMessage( 'config-header-' . $type )->text() ) .
                                $installer->getConnectForm() .
                                "</div>\n";
                }
-               $types .= "</ul><br style=\"clear: left\"/>\n";
 
-               $this->addHTML(
-                       $this->parent->label( 'config-db-type', false, $types ) .
-                       $settings
-               );
+               $types .= "</ul><br style=\"clear: left\"/>\n";
 
+               $this->addHTML( $this->parent->label( 'config-db-type', false, $types ) . $settings );
                $this->endForm();
        }
 
@@ -522,9 +542,9 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                if ( !$installer ) {
                        return Status::newFatal( 'config-invalid-db-type' );
                }
+
                return $installer->submitConnectForm();
        }
-
 }
 
 class WebInstaller_Upgrade extends WebInstallerPage {
@@ -545,6 +565,7 @@ class WebInstaller_Upgrade extends WebInstallerPage {
                                // Show the done message again
                                // Make them click back again if they want to do the upgrade again
                                $this->showDoneMessage();
+
                                return 'output';
                        }
                }
@@ -573,6 +594,7 @@ class WebInstaller_Upgrade extends WebInstallerPage {
                                }
                                $this->setVar( '_UpgradeDone', true );
                                $this->showDoneMessage();
+
                                return 'output';
                        }
                }
@@ -596,15 +618,14 @@ class WebInstaller_Upgrade extends WebInstallerPage {
                        $this->parent->getInfoBox(
                                wfMessage( $msg,
                                        $this->getVar( 'wgServer' ) .
-                                               $this->getVar( 'wgScriptPath' ) . '/index' .
-                                               $this->getVar( 'wgScriptExtension' )
+                                       $this->getVar( 'wgScriptPath' ) . '/index' .
+                                       $this->getVar( 'wgScriptExtension' )
                                )->plain(), 'tick-32.png'
                        )
                );
                $this->parent->restoreLinkPopups();
                $this->endForm( $regenerate ? 'regenerate' : false, false );
        }
-
 }
 
 class WebInstaller_DBSettings extends WebInstallerPage {
@@ -633,7 +654,6 @@ class WebInstaller_DBSettings extends WebInstallerPage {
                $this->addHTML( $form );
                $this->endForm();
        }
-
 }
 
 class WebInstaller_Name extends WebInstallerPage {
@@ -728,6 +748,7 @@ class WebInstaller_Name extends WebInstallerPage {
                $this->setVar( 'wgMetaNamespace', $metaNS );
 
                $this->endForm();
+
                return 'output';
        }
 
@@ -841,7 +862,6 @@ class WebInstaller_Name extends WebInstallerPage {
 
                return $retVal;
        }
-
 }
 
 class WebInstaller_Options extends WebInstallerPage {
@@ -938,7 +958,7 @@ class WebInstaller_Options extends WebInstallerPage {
                        }
 
                        $extHtml .= $this->parent->getHelpBox( 'config-extensions-help' ) .
-                       $this->getFieldSetEnd();
+                               $this->getFieldSetEnd();
                        $this->addHTML( $extHtml );
                }
 
@@ -1053,6 +1073,7 @@ class WebInstaller_Options extends WebInstallerPage {
                                'lang' => $this->getVar( '_UserLang' ),
                                'stylesheet' => $styleUrl,
                        ) );
+
                return $iframeUrl;
        }
 
@@ -1082,6 +1103,7 @@ class WebInstaller_Options extends WebInstallerPage {
                // If you change this height, also change it in config.css
                $expandJs = str_replace( '$1', '54em', $js );
                $reduceJs = str_replace( '$1', '70px', $js );
+
                return '<p>' .
                        Html::element( 'img', array( 'src' => $this->getVar( 'wgRightsIcon' ) ) ) .
                        '&#160;&#160;' .
@@ -1108,6 +1130,7 @@ class WebInstaller_Options extends WebInstallerPage {
                        array( 'wgRightsUrl', 'wgRightsText', 'wgRightsIcon' ) );
                if ( count( $newValues ) != 3 ) {
                        $this->parent->showError( 'config-cc-error' );
+
                        return;
                }
                $this->setVar( '_CCDone', true );
@@ -1122,8 +1145,8 @@ class WebInstaller_Options extends WebInstallerPage {
                        'wgUseInstantCommons' ) );
 
                if ( !in_array( $this->getVar( '_RightsProfile' ),
-                       array_keys( $this->parent->rightsProfiles ) ) )
-               {
+                       array_keys( $this->parent->rightsProfiles ) )
+               {
                        reset( $this->parent->rightsProfiles );
                        $this->setVar( '_RightsProfile', key( $this->parent->rightsProfiles ) );
                }
@@ -1132,6 +1155,7 @@ class WebInstaller_Options extends WebInstallerPage {
                if ( $code == 'cc-choose' ) {
                        if ( !$this->getVar( '_CCDone' ) ) {
                                $this->parent->showError( 'config-cc-not-chosen' );
+
                                return false;
                        }
                } elseif ( in_array( $code, array_keys( $this->parent->licenses ) ) ) {
@@ -1166,28 +1190,33 @@ class WebInstaller_Options extends WebInstallerPage {
                        $memcServers = explode( "\n", $this->getVar( '_MemCachedServers' ) );
                        if ( !$memcServers ) {
                                $this->parent->showError( 'config-memcache-needservers' );
+
                                return false;
                        }
 
                        foreach ( $memcServers as $server ) {
                                $memcParts = explode( ":", $server, 2 );
                                if ( !isset( $memcParts[0] )
-                                               || ( !IP::isValid( $memcParts[0] )
-                                                       && ( gethostbyname( $memcParts[0] ) == $memcParts[0] ) ) ) {
+                                       || ( !IP::isValid( $memcParts[0] )
+                                               && ( gethostbyname( $memcParts[0] ) == $memcParts[0] ) )
+                               ) {
                                        $this->parent->showError( 'config-memcache-badip', $memcParts[0] );
+
                                        return false;
                                } elseif ( !isset( $memcParts[1] ) ) {
                                        $this->parent->showError( 'config-memcache-noport', $memcParts[0] );
+
                                        return false;
                                } elseif ( $memcParts[1] < 1 || $memcParts[1] > 65535 ) {
                                        $this->parent->showError( 'config-memcache-badport', 1, 65535 );
+
                                        return false;
                                }
                        }
                }
+
                return true;
        }
-
 }
 
 class WebInstaller_Install extends WebInstallerPage {
@@ -1219,6 +1248,7 @@ class WebInstaller_Install extends WebInstallerPage {
                        $this->addHTML( $this->parent->getInfoBox( wfMessage( 'config-install-begin' )->plain() ) );
                        $this->endForm();
                }
+
                return true;
        }
 
@@ -1249,7 +1279,6 @@ class WebInstaller_Install extends WebInstallerPage {
                        $this->parent->showStatusBox( $status );
                }
        }
-
 }
 
 class WebInstaller_Complete extends WebInstallerPage {
@@ -1259,10 +1288,11 @@ class WebInstaller_Complete extends WebInstallerPage {
                // to download the file
                $lsUrl = $this->getVar( 'wgServer' ) . $this->parent->getURL( array( 'localsettings' => 1 ) );
                if ( isset( $_SERVER['HTTP_USER_AGENT'] ) &&
-                        strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false ) {
+                       strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false
+               ) {
                        // JS appears to be the only method that works consistently with IE7+
                        $this->addHtml( "\n<script>jQuery( function () { document.location = " .
-                               Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
+                       Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
                } else {
                        $this->parent->request->response()->header( "Refresh: 0;url=$lsUrl" );
                }
@@ -1274,8 +1304,8 @@ class WebInstaller_Complete extends WebInstallerPage {
                                wfMessage( 'config-install-done',
                                        $lsUrl,
                                        $this->getVar( 'wgServer' ) .
-                                               $this->getVar( 'wgScriptPath' ) . '/index' .
-                                               $this->getVar( 'wgScriptExtension' ),
+                                       $this->getVar( 'wgScriptPath' ) . '/index' .
+                                       $this->getVar( 'wgScriptExtension' ),
                                        '<downloadlink/>'
                                )->plain(), 'tick-32.png'
                        )
@@ -1297,6 +1327,7 @@ class WebInstaller_Restart extends WebInstallerPage {
                        if ( $really ) {
                                $this->parent->reset();
                        }
+
                        return 'continue';
                }
 
@@ -1305,7 +1336,6 @@ class WebInstaller_Restart extends WebInstallerPage {
                $this->addHTML( $s );
                $this->endForm( 'restart' );
        }
-
 }
 
 abstract class WebInstaller_Document extends WebInstallerPage {
@@ -1322,12 +1352,12 @@ abstract class WebInstaller_Document extends WebInstallerPage {
 
        public function getFileContents() {
                $file = __DIR__ . '/../../' . $this->getFileName();
-               if ( ! file_exists( $file ) ) {
+               if ( !file_exists( $file ) ) {
                        return wfMessage( 'config-nofile', $file )->plain();
                }
+
                return file_get_contents( $file );
        }
-
 }
 
 class WebInstaller_Readme extends WebInstaller_Document {
index 81e7b73..10f2c97 100644 (file)
@@ -36,6 +36,9 @@ abstract class JobQueue {
        protected $maxTries; // integer; maximum number of times to try a job
        protected $checkDelay; // boolean; allow delayed jobs
 
+       /** @var BagOStuff */
+       protected $dupCache;
+
        const QOS_ATOMIC = 1; // integer; "all-or-nothing" job insertions
        const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions (b/c)
 
@@ -61,6 +64,7 @@ abstract class JobQueue {
                if ( $this->checkDelay && !$this->supportsDelayedJobs() ) {
                        throw new MWException( __CLASS__ . " does not support delayed jobs." );
                }
+               $this->dupCache = wfGetCache( CACHE_ANYTHING );
        }
 
        /**
@@ -439,8 +443,6 @@ abstract class JobQueue {
         * @return bool
         */
        protected function doDeduplicateRootJob( Job $job ) {
-               global $wgMemc;
-
                if ( !$job->hasRootJobParams() ) {
                        throw new MWException( "Cannot register root job; missing parameters." );
                }
@@ -452,13 +454,13 @@ abstract class JobQueue {
                // deferred till "transaction idle", do the same here, so that the ordering is
                // maintained. Having only the de-duplication registration succeed would cause
                // jobs to become no-ops without any actual jobs that made them redundant.
-               $timestamp = $wgMemc->get( $key ); // current last timestamp of this job
+               $timestamp = $this->dupCache->get( $key ); // current last timestamp of this job
                if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
                        return true; // a newer version of this root job was enqueued
                }
 
                // Update the timestamp of the last root job started at the location...
-               return $wgMemc->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+               return $this->dupCache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
        }
 
        /**
@@ -484,15 +486,14 @@ abstract class JobQueue {
         * @return bool
         */
        protected function doIsRootJobOldDuplicate( Job $job ) {
-               global $wgMemc;
-
                if ( !$job->hasRootJobParams() ) {
                        return false; // job has no de-deplication info
                }
                $params = $job->getRootJobParams();
 
+               $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
                // Get the last time this root job was enqueued
-               $timestamp = $wgMemc->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
+               $timestamp = $this->dupCache->get( $key );
 
                // Check if a new root job was started at the location after this one's...
                return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
index af21bc1..c39083d 100644 (file)
@@ -79,7 +79,7 @@ class JobQueueDB extends JobQueue {
                        return false;
                }
 
-               list( $dbr, $scope ) = $this->getSlaveDB();
+               $dbr = $this->getSlaveDB();
                try {
                        $found = $dbr->selectField( // unclaimed job
                                'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
@@ -105,7 +105,7 @@ class JobQueueDB extends JobQueue {
                }
 
                try {
-                       list( $dbr, $scope ) = $this->getSlaveDB();
+                       $dbr = $this->getSlaveDB();
                        $size = (int)$dbr->selectField( 'job', 'COUNT(*)',
                                array( 'job_cmd' => $this->type, 'job_token' => '' ),
                                __METHOD__
@@ -134,7 +134,7 @@ class JobQueueDB extends JobQueue {
                        return $count;
                }
 
-               list( $dbr, $scope ) = $this->getSlaveDB();
+               $dbr = $this->getSlaveDB();
                try {
                        $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
                                array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
@@ -167,7 +167,7 @@ class JobQueueDB extends JobQueue {
                        return $count;
                }
 
-               list( $dbr, $scope ) = $this->getSlaveDB();
+               $dbr = $this->getSlaveDB();
                try {
                        $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
                                array(
@@ -193,12 +193,12 @@ class JobQueueDB extends JobQueue {
         * @return bool
         */
        protected function doBatchPush( array $jobs, $flags ) {
-               list( $dbw, $scope ) = $this->getMasterDB();
+               $dbw = $this->getMasterDB();
 
                $that = $this;
                $method = __METHOD__;
                $dbw->onTransactionIdle(
-                       function() use ( $dbw, $that, $jobs, $flags, $method, $scope ) {
+                       function() use ( $dbw, $that, $jobs, $flags, $method ) {
                                $that->doBatchPushInternal( $dbw, $jobs, $flags, $method );
                        }
                );
@@ -216,7 +216,7 @@ class JobQueueDB extends JobQueue {
         * @return boolean
         * @throws type
         */
-       public function doBatchPushInternal( DatabaseBase $dbw, array $jobs, $flags, $method ) {
+       public function doBatchPushInternal( IDatabase $dbw, array $jobs, $flags, $method ) {
                if ( !count( $jobs ) ) {
                        return true;
                }
@@ -284,7 +284,7 @@ class JobQueueDB extends JobQueue {
                        return false; // queue is empty
                }
 
-               list( $dbw, $scope ) = $this->getMasterDB();
+               $dbw = $this->getMasterDB();
                try {
                        $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
                        $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
@@ -339,7 +339,7 @@ class JobQueueDB extends JobQueue {
         * @return Row|false
         */
        protected function claimRandom( $uuid, $rand, $gte ) {
-               list( $dbw, $scope ) = $this->getMasterDB();
+               $dbw = $this->getMasterDB();
                // Check cache to see if the queue has <= OFFSET items
                $tinyQueue = $this->cache->get( $this->getCacheKey( 'small' ) );
 
@@ -415,7 +415,7 @@ class JobQueueDB extends JobQueue {
         * @return Row|false
         */
        protected function claimOldest( $uuid ) {
-               list( $dbw, $scope ) = $this->getMasterDB();
+               $dbw = $this->getMasterDB();
 
                $row = false; // the row acquired
                do {
@@ -480,7 +480,7 @@ class JobQueueDB extends JobQueue {
                        throw new MWException( "Job of type '{$job->getType()}' has no ID." );
                }
 
-               list( $dbw, $scope ) = $this->getMasterDB();
+               $dbw = $this->getMasterDB();
                try {
                        $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
                        $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
@@ -518,9 +518,9 @@ class JobQueueDB extends JobQueue {
                // deferred till "transaction idle", do the same here, so that the ordering is
                // maintained. Having only the de-duplication registration succeed would cause
                // jobs to become no-ops without any actual jobs that made them redundant.
-               list( $dbw, $scope ) = $this->getMasterDB();
-               $cache = $this->cache;
-               $dbw->onTransactionIdle( function() use ( $cache, $params, $key, $scope ) {
+               $dbw = $this->getMasterDB();
+               $cache = $this->dupCache;
+               $dbw->onTransactionIdle( function() use ( $cache, $params, $key, $dbw ) {
                        $timestamp = $cache->get( $key ); // current last timestamp of this job
                        if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
                                return true; // a newer version of this root job was enqueued
@@ -538,8 +538,7 @@ class JobQueueDB extends JobQueue {
         * @return bool
         */
        protected function doDelete() {
-               list( $dbw, $scope ) = $this->getMasterDB();
-
+               $dbw = $this->getMasterDB();
                try {
                        $dbw->delete( 'job', array( 'job_cmd' => $this->type ) );
                } catch ( DBError $e ) {
@@ -582,12 +581,12 @@ class JobQueueDB extends JobQueue {
         * @return Iterator
         */
        public function getAllQueuedJobs() {
-               list( $dbr, $scope ) = $this->getSlaveDB();
+               $dbr = $this->getSlaveDB();
                try {
                        return new MappedIterator(
                                $dbr->select( 'job', '*',
                                        array( 'job_cmd' => $this->getType(), 'job_token' => '' ) ),
-                               function( $row ) use ( $scope ) {
+                               function( $row ) use ( $dbr ) {
                                        $job = Job::factory(
                                                $row->job_cmd,
                                                Title::makeTitle( $row->job_namespace, $row->job_title ),
@@ -611,7 +610,7 @@ class JobQueueDB extends JobQueue {
        }
 
        protected function doGetSiblingQueuesWithJobs( array $types ) {
-               list( $dbr, $scope ) = $this->getSlaveDB();
+               $dbr = $this->getSlaveDB();
                $res = $dbr->select( 'job', 'DISTINCT job_cmd',
                        array( 'job_cmd' => $types ), __METHOD__ );
 
@@ -623,7 +622,7 @@ class JobQueueDB extends JobQueue {
        }
 
        protected function doGetSiblingQueueSizes( array $types ) {
-               list( $dbr, $scope ) = $this->getSlaveDB();
+               $dbr = $this->getSlaveDB();
                $res = $dbr->select( 'job', array( 'job_cmd', 'COUNT(*) AS count' ),
                        array( 'job_cmd' => $types ), __METHOD__, array( 'GROUP BY' => 'job_cmd' ) );
 
@@ -642,7 +641,7 @@ class JobQueueDB extends JobQueue {
        public function recycleAndDeleteStaleJobs() {
                $now = time();
                $count = 0; // affected rows
-               list( $dbw, $scope ) = $this->getMasterDB();
+               $dbw = $this->getMasterDB();
 
                try {
                        if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
@@ -719,7 +718,30 @@ class JobQueueDB extends JobQueue {
        }
 
        /**
-        * @return Array (DatabaseBase, ScopedCallback)
+        * @param $job Job
+        * @return array
+        */
+       protected function insertFields( Job $job ) {
+               $dbw = $this->getMasterDB();
+               return array(
+                       // Fields that describe the nature of the job
+                       'job_cmd'       => $job->getType(),
+                       'job_namespace' => $job->getTitle()->getNamespace(),
+                       'job_title'     => $job->getTitle()->getDBkey(),
+                       'job_params'    => self::makeBlob( $job->getParams() ),
+                       // Additional job metadata
+                       'job_id'        => $dbw->nextSequenceValue( 'job_job_id_seq' ),
+                       'job_timestamp' => $dbw->timestamp(),
+                       'job_sha1'      => wfBaseConvert(
+                               sha1( serialize( $job->getDeduplicationInfo() ) ),
+                               16, 36, 31
+                       ),
+                       'job_random'    => mt_rand( 0, self::MAX_JOB_RANDOM )
+               );
+       }
+
+       /**
+        * @return DBConnRef
         */
        protected function getSlaveDB() {
                try {
@@ -730,7 +752,7 @@ class JobQueueDB extends JobQueue {
        }
 
        /**
-        * @return Array (DatabaseBase, ScopedCallback)
+        * @return DBConnRef
         */
        protected function getMasterDB() {
                try {
@@ -742,42 +764,13 @@ class JobQueueDB extends JobQueue {
 
        /**
         * @param $index integer (DB_SLAVE/DB_MASTER)
-        * @return Array (DatabaseBase, ScopedCallback)
+        * @return DBConnRef
         */
        protected function getDB( $index ) {
                $lb = ( $this->cluster !== false )
                        ? wfGetLBFactory()->getExternalLB( $this->cluster, $this->wiki )
                        : wfGetLB( $this->wiki );
-               $conn = $lb->getConnection( $index, array(), $this->wiki );
-               return array(
-                       $conn,
-                       new ScopedCallback( function() use ( $lb, $conn ) {
-                               $lb->reuseConnection( $conn );
-                       } )
-               );
-       }
-
-       /**
-        * @param $job Job
-        * @return array
-        */
-       protected function insertFields( Job $job ) {
-               list( $dbw, $scope ) = $this->getMasterDB();
-               return array(
-                       // Fields that describe the nature of the job
-                       'job_cmd'       => $job->getType(),
-                       'job_namespace' => $job->getTitle()->getNamespace(),
-                       'job_title'     => $job->getTitle()->getDBkey(),
-                       'job_params'    => self::makeBlob( $job->getParams() ),
-                       // Additional job metadata
-                       'job_id'        => $dbw->nextSequenceValue( 'job_job_id_seq' ),
-                       'job_timestamp' => $dbw->timestamp(),
-                       'job_sha1'      => wfBaseConvert(
-                               sha1( serialize( $job->getDeduplicationInfo() ) ),
-                               16, 36, 31
-                       ),
-                       'job_random'    => mt_rand( 0, self::MAX_JOB_RANDOM )
-               );
+               return $lb->getConnectionRef( $index, array(), $this->wiki );
        }
 
        /**
index eac2202..0603a9b 100644 (file)
@@ -4447,7 +4447,8 @@ class Parser {
 
                        # Add the section to the section tree
                        # Find the DOM node for this header
-                       while ( $node && !$isTemplate ) {
+                       $noOffset = ( $isTemplate || $sectionIndex === false );
+                       while ( $node && !$noOffset ) {
                                if ( $node->getName() === 'h' ) {
                                        $bits = $node->splitHeading();
                                        if ( $bits['i'] == $sectionIndex ) {
@@ -4465,7 +4466,7 @@ class Parser {
                                'number' => $numbering,
                                'index' => ( $isTemplate ? 'T-' : '' ) . $sectionIndex,
                                'fromtitle' => $titleText,
-                               'byteoffset' => ( $isTemplate ? null : $byteOffset ),
+                               'byteoffset' => ( $noOffset ? null : $byteOffset ),
                                'anchor' => $anchor,
                        );
 
index 56a674e..06c9e60 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Abi Azkia
  * @author Andri.h
+ * @author Ayie7791
  * @author Ezagren
  * @author Fadli Idris
  * @author Meno25
@@ -198,6 +199,8 @@ $messages = array(
 'tog-diffonly' => 'Bek peuleumah asoe halaman di yup beunida neuandam',
 'tog-showhiddencats' => 'Peuleumah kawan teusom',
 'tog-norollbackdiff' => "Bek peudeuh beunida 'oh lheueh geupeuriwang",
+'tog-useeditwarning' => 'Neupeuingat lôn meunyoë meukubah ôn andam ngon hana teukeubah',
+'tog-prefershttps' => 'Sabè neunguy seunambông teulindông meunyoë neutamöng log',
 
 'underline-always' => 'Sabe',
 'underline-never' => "H'an tom",
@@ -261,6 +264,9 @@ $messages = array(
 'oct' => 'Siplôh',
 'nov' => 'Siblaih',
 'dec' => 'Duwa Blaih',
+'january-date' => 'Buleuën Sa',
+'february-date' => 'Buleuën Duwa',
+'march-date' => 'Buleuën Lhèë',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kawan|Kawan}}',
@@ -342,6 +348,7 @@ $messages = array(
 'create-this-page' => 'Peugèt ôn nyoe',
 'delete' => 'Sampôh',
 'deletethispage' => 'Sampôh ôn nyoe',
+'undeletethispage' => 'Bèk neusampôh ôn nyoë',
 'undelete_short' => 'Bateuë sampôh {{PLURAL:$1|one edit|$1 edits}}',
 'viewdeleted_short' => 'Eu {{PLURAL:$1|saboh neuandam|$1 neuandam}} nyang geusampoh',
 'protect' => 'Peulindông',
@@ -388,7 +395,7 @@ $1",
 # 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).
 'aboutsite' => 'Bhaih {{SITENAME}}',
 'aboutpage' => 'Project:Bhaih',
-'copyright' => 'Asoë nyang na seusuai ngön $1.',
+'copyright' => 'Asoë nyang na saban ngön',
 'copyrightpage' => '{{ns:project}}:Hak karang',
 'currentevents' => 'Haba barô',
 'currentevents-url' => 'Project:Haba barô',
@@ -415,7 +422,7 @@ $1",
 'retrievedfrom' => 'Geurumpok nibak "$1"',
 'youhavenewmessages' => 'Droëneuh na $1 ($2).',
 'newmessageslink' => 'peusan barô',
-'newmessagesdifflink' => 'neuubah keuneulheuëh',
+'newmessagesdifflink' => 'neuubah seuneulheuëh',
 'youhavenewmessagesfromusers' => "Droeneuh na $1 nibak {{PLURAL:$3|ureueng nguy la'en|$3 ureueng nguy}} ($2).",
 'youhavenewmessagesmanyusers' => "Droeneuh na $1 nibak ureueng nguy la'en ($2)",
 'newmessageslinkplural' => '{{PLURAL:$1|saboh peusan baro|peusan baro}}',
@@ -468,6 +475,7 @@ Dapeuta on kusuih nyang sah jeuet neu'eu bak [[Special:SpecialPages|{{int:specia
 # General errors
 'error' => 'Seunalah',
 'databaseerror' => 'Kesalahan basis data',
+'databaseerror-text' => 'Saboh salah bak nè data ka teujadi. Nyoë meuhat na nyang han paih bak peukakaih droëneuh',
 'laggedslavemode' => 'Peuneugah: On nyoe kadang hana neuubah baro',
 'readonly' => 'Basis data geurok',
 'enterlockreason' => 'Pasoe daleh neurok ngon pajan jeuet geupeuhah',
@@ -515,9 +523,13 @@ Neulakee: $2',
 'actionthrottledtext' => 'Sibagoe saboh seunipat lawan-spam, droeneuh geupeubataih nibak neupeulaku buet nyoe le that go lam watee paneuk, ngon droeneuh ka leubeh nibak bataih.
 Neuci lom lam padum minet.',
 'viewsourcetext' => 'Droëneuh  jeuët neu’eu',
+'viewyourtext' => 'Droëneuh meuidzin kalon ngon neucok nè andam droëneuh u ôn nyoë',
+'ns-specialprotected' => 'Ôn khusuih bèk neuandam',
+'exception-nologin' => 'Hana tamong lom',
 
 # Login and logout pages
 'yourname' => 'Ureuëng nguy:',
+'userlogin-yourname-ph' => 'Peutamöng nan ureuëng nguy droëneuh',
 'yourpassword' => 'Lageuëm:',
 'yourpasswordagain' => 'Pasoë lom lageuëm:',
 'remembermypassword' => 'Ingat lôn tamong bak peuramban nyoë (keu paleng trep $1 {{PLURAL:$1|uroë|uroë}})',
@@ -534,7 +546,7 @@ Neuci lom lam padum minet.',
 'createaccount' => 'Peudapeuta nan barô',
 'gotaccount' => "Ka lheuëh neudapeuta? '''$1'''.",
 'gotaccountlink' => 'Tamong',
-'userlogin-resetlink' => 'Tuwoe-neuh ngon teuneurang tamong Droeneuh?',
+'userlogin-resetlink' => 'Tuwo ngon rincian tamong Droeneuh?',
 'loginsuccesstitle' => 'Meuhasé tamong',
 'loginsuccess' => "'''Droëneuh  jinoë ka neutamong di {{SITENAME}} sibagoë \"\$1\".'''",
 'nosuchuser' => 'Hana ureuëng nguy ngön nan "$1".
@@ -560,7 +572,7 @@ Meunyo ureueng la\'en nyang peugot neulakee nyoe, atawa meunyo droeneuh ka neuin
 'retypenew' => 'Pasoë teuma lageuëm barô:',
 
 # Edit page toolbar
-'bold_sample' => 'Rakam teubay naseukah nyoë',
+'bold_sample' => 'Rakam teubay',
 'bold_tip' => 'Haraih teubay',
 'italic_sample' => 'Rakam singèt naseukah nyoë',
 'italic_tip' => 'Rakam singèt',
@@ -651,7 +663,7 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'page_first' => 'phôn',
 'page_last' => 'keuneulheuëh',
 'histlegend' => "Piléh duwa teuneugön radiô, lheuëh nyan teugön teuneugön ''peubandéng'' keu peubandéng seunalén. Teugön saboh tanggay keu eu seunalén ôn bak tanggay nyan.<br />(skr) = bida ngön seunalén jinoë, (akhé) = bida ngön seunalén sigohlomjih. '''u''' = andam ubeut, '''b''' = andam bot, → = andam bideuëng, ← = ehtisa keudroë",
-'history-fieldset-title' => 'Jeulajah riwayat away',
+'history-fieldset-title' => 'Eu riwayat away',
 'history-show-deleted' => 'Nyang geusampoh mantong',
 'histfirst' => 'paléng trép',
 'histlast' => 'paléng barô',
@@ -777,8 +789,8 @@ Ceunatat: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = ôn barô,
 'minoreditletter' => 'b',
 'newpageletter' => 'B',
 'boteditletter' => 'b',
-'rc-enhanced-expand' => 'Peuleumah neurinci (peureulèë JavaScript)',
-'rc-enhanced-hide' => 'Peusom neurinci',
+'rc-enhanced-expand' => 'Peuleumah rincian',
+'rc-enhanced-hide' => 'Peusom rincian',
 
 # Recent changes linked
 'recentchangeslinked' => 'Neuubah meuhubông',
@@ -992,7 +1004,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'contributions' => 'Beuneuri {{GENDER:$1|ureuëng nguy}}',
 'contributions-title' => 'Beuneuri ureuëng nguy keu $1',
 'mycontris' => 'Beuneuri',
-'contribsub2' => 'Keu $1 ($2)',
+'contribsub2' => 'Keu {{GENDER:$3|$1}} ($2)',
 'uctop' => '(jinoë)',
 'month' => 'Yôh buleuën (ngön yôh goh lom nyan)',
 'year' => 'Yôh thôn (ngön yôh goh lom nyan)',
@@ -1038,7 +1050,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'blocklogpage' => 'Log peutheun',
 'blocklogentry' => 'theun [[$1]] ngön watèë maté tanggay $2 $3',
 'unblocklogentry' => 'peugadöh theun "$1"',
-'block-log-flags-nocreate' => 'pumeugöt nan geupumaté',
+'block-log-flags-nocreate' => 'pumeugöt akun geupumaté',
 
 # Move page
 'movepagetext' => "Formulir di yup nyoë geunguy keu jak ubah nan saboh ôn ngön jak peupinah ban dum data riwayat u nan barô. Nan nyang trép euntreuk jeuët keu ôn peupinah u nan nyang barô. Hubông u nan trép hana meu’ubah. Neupeupaseuti keu neupréksa peuninah ôn nyang reulöh atawa meuganda lheuëh neupinah. Droëneuh nyang mat tanggông jaweuëb keu neupeupaseuti meunyo hubông laju teusambông u ôn nyang patôt.
index 706bc2d..5d4a353 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Alnokta
  * @author Dudi
+ * @author Ebraminio
  * @author Ghaly
  * @author Meno25
  * @author Ouda
index c1eeaa2..e393e7d 100644 (file)
@@ -1176,7 +1176,7 @@ Həmçinin kimliyinizi gostərmədən belə, başqalarının sizinlə istifadə
 'action-suppressionlog' => 'xüsusi gündəliyə baxış',
 'action-block' => 'istifadəçinin redaktə etməsini əngəlləmək',
 'action-protect' => 'bu səhifənin mühafizə səviyyəsini dəyişmək',
-'action-import' => 'bu səhifəni başqa vikidən götürmək',
+'action-import' => 'başqa vikidən səhifələrin idxalı',
 'action-importupload' => 'fayl yükləmə vasitəsilə səhifələrin idxalı',
 'action-patrol' => 'Digərlərinin dəyişikliklərini patrullanmış olaraq işarələ',
 'action-autopatrol' => 'öz redaktələrinizi patrullanmış olarq işarələmək',
index 5bda6d8..fdf9f84 100644 (file)
@@ -721,6 +721,9 @@ $2',
 'userlogin-resetpassword-link' => 'Забылі пароль?',
 'helplogin-url' => 'Help:Уваход у сыстэму',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Дапамога па ўваходзе ў сыстэму]]',
+'userlogin-loggedin' => 'Вы ўжо ўвайшлі як {{GENDER:$1|$1}}.
+Для ўваходу пад іншым удзельнікам скарыстайцеся формай унізе.',
+'userlogin-createanother' => 'Стварыць іншы рахунак',
 'createacct-join' => 'Увядзіце свае зьвесткі ніжэй.',
 'createacct-another-join' => 'Увядзіце зьвесткі для новага рахунку ніжэй.',
 'createacct-emailrequired' => 'E-mail адрас',
@@ -2615,7 +2618,7 @@ $1',
 'contributions' => 'Унёсак {{GENDER:$1|удзельніка|удзельніцы}}',
 'contributions-title' => 'Унёсак {{GENDER:$1|удзельніка|удзельніцы}} $1',
 'mycontris' => 'Унёсак',
-'contribsub2' => 'Для $1 ($2)',
+'contribsub2' => 'Для {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ня знойдзена зьменаў, якія адпавядаюць гэтым крытэрыям.',
 'uctop' => '(апошняя)',
 'month' => 'Ад месяца (і раней):',
index 0c6cd4c..70d1bed 100644 (file)
@@ -529,6 +529,7 @@ $2',
 'userlogin-resetpassword-link' => 'শব্দচাবি পুনরায় ধার্য করুন',
 'helplogin-url' => 'Help:প্রবেশ',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|লগইন সংক্রান্ত সাহায্য]]',
+'userlogin-createanother' => 'আরেকটি অ্যাকাউন্ট তৈরি করুন',
 'createacct-join' => 'আপনার সম্পর্কিত তথ্য নিচে যোগ করুন।',
 'createacct-another-join' => 'নিচে আপনার নতুন অ্যাকাউন্টের তথ্য দিন।',
 'createacct-emailrequired' => 'ইমেইল ঠিকানা',
@@ -547,7 +548,7 @@ $2',
 'createacct-benefit-heading' => '{{SITENAME}} আপনার মত লোকেরই তৈরি।',
 'createacct-benefit-body1' => '{{PLURAL:$1|টি সম্পাদনা}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|টি পাতা}}',
-'createacct-benefit-body3' => 'সাম্প্রতিক {{PLURAL:$1|অবদানকারী}}',
+'createacct-benefit-body3' => 'à¦\9cন à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 {{PLURAL:$1|à¦\85বদানà¦\95ারà§\80}}',
 'badretype' => "আপনার প্রবেশ করানো শব্দচাবি'টি মিলছেনা।",
 'userexists' => 'এই ব্যবহারকারী নামটি ইতমধ্যে ব্যবহার করা হয়েছে।
 অনুগ্রহ করে অন্য নাম বেছে নিন।',
@@ -2264,7 +2265,7 @@ $UNWATCHURL
 এই পাতায় সর্বোশেষে [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) দ্বারা সম্পাদিত।',
 'editcomment' => "সম্পাদনা সারাংশ ছিল: \"''\$1''\"।",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]]) এর সম্পাদিত সংস্করণ হতে [[User:$1|$1]] এর সম্পাদিত সর্বশেষ সংস্করণে ফেরত যাওয়া হয়েছে।',
-'revertpage-nouser' => 'একজন গোপন ব্যবহারকারী কর্তৃক সম্পাদিত সম্পাদনাটি বাতিলপূর্বক [[User:$1|$1]]-এর সর্বশেষ সম্পাদনায় ফেরত যাওয়া হয়েছে।',
+'revertpage-nouser' => 'একজন গোপন ব্যবহারকারী কর্তৃক সম্পাদিত সম্পাদনাটি বাতিলপূর্বক {{GENDER:$1|[[User:$1|$1]]}}-এর সর্বশেষ সম্পাদনায় ফেরত যাওয়া হয়েছে।',
 'rollback-success' => '$1-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; $2-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।',
 
 # Edit tokens
@@ -2402,7 +2403,7 @@ $1',
 'contributions' => '{{GENDER:$1|ব্যবহারকারীর}} অবদান',
 'contributions-title' => '$1 ব্যবহারকারীর অবদানসমূহ',
 'mycontris' => 'অবদান',
-'contribsub2' => '$1 ($2)-এর জন্য',
+'contribsub2' => '{{GENDER:$3|$1}} ($2)-এর জন্য',
 'nocontribs' => 'এই শর্তগুলির সাথে মিলে যায়, এমন কোন পরিবর্তন খুঁজে পাওয়া যায়নি।',
 'uctop' => '(বর্তমান)',
 'month' => 'এই মাস (বা তার আগে) থেকে:',
@@ -2917,7 +2918,7 @@ $2',
 'pageinfo-views' => 'পরিদর্শন সংখ্যা',
 'pageinfo-watchers' => 'পাতাটি প্রদর্শনের সংখ্যা',
 'pageinfo-few-watchers' => '$1 জন {{PLURAL:$1|নজরকারীও}} কম',
-'pageinfo-redirects-name' => 'à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦°à¦¿à¦¡à¦¾à¦\87রà§\87à¦\95à§\8dà¦\9fসমূহের সংখ্যা',
+'pageinfo-redirects-name' => 'à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà§\81ননিরà§\8dদà§\87শনাসমূহের সংখ্যা',
 'pageinfo-subpages-name' => 'এই পাতার উপপাতাসমূহ',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|পুনর্নির্দেশ|পুনর্নির্দেশসমূহ}}; $3 {{PLURAL:$3|পুনর্নির্দেশ নেই|পুনর্নির্দেশ নেই}})',
 'pageinfo-firstuser' => 'পাতা তৈরী',
@@ -3767,7 +3768,10 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'tags-tag' => 'ট্যাগ নাম',
 'tags-display-header' => 'পরিনর্তন পাতার বৈশিষ্ট',
 'tags-description-header' => 'অর্থের পূর্ণ বণনা',
+'tags-active-header' => 'সক্রিয়?',
 'tags-hitcount-header' => 'ট্যাগকৃত পরিবর্সতনমূহ',
+'tags-active-yes' => 'হ্যাঁ',
+'tags-active-no' => 'না',
 'tags-edit' => 'সম্পাদনা',
 'tags-hitcount' => '$1 {{PLURAL:$1|পরিবর্তন|পরিবর্তনসমূহ}}',
 
@@ -3933,9 +3937,9 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'limitreport-ppvisitednodes' => 'প্রাক প্রসেসর পরিদর্শন সংযোগ গণনা',
 'limitreport-ppgeneratednodes' => 'প্রাক প্রসেসর উৎপন্ন সংযোগ গণনা',
 'limitreport-postexpandincludesize' => 'পরবর্তী-প্রসারিত অন্তর্ভুক্ত আকার',
-'limitreport-postexpandincludesize-value' => '$1/$2 বাইট',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|বাইট}}',
 'limitreport-templateargumentsize' => 'টেমপ্লেট প্যারামিটারের আকার',
-'limitreport-templateargumentsize-value' => '$1/$2 বাইট',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|বাইট}}',
 'limitreport-expansiondepth' => 'সর্বোচ্চ গভীরতা বিস্তার',
 'limitreport-expensivefunctioncount' => 'ব্যয়বহুল পার্সার ফাংশন গণনা',
 
index 12eaac5..8fcdb81 100644 (file)
@@ -2361,4 +2361,15 @@ PICT # тайп тайпан
 # Search suggestions
 'searchsuggest-search' => 'Лаха',
 
+# Limit report
+'limitreport-title' => 'АгӀона хӀоттам къасторан хаамаш:',
+'limitreport-cputime' => 'Процессоран хан лелор',
+'limitreport-walltime' => 'Йодуш йолу хенахь лелор',
+'limitreport-ppvisitednodes' => 'Препроцессор хьаьжна шадин дукхалла',
+'limitreport-ppgeneratednodes' => 'Препроцессорс сгенерировать бина шадин дукхалла',
+'limitreport-postexpandincludesize' => 'Схьаяьстина юккъерчаран барам',
+'limitreport-templateargumentsize' => 'Кепан аргументан барам',
+'limitreport-expansiondepth' => 'Шордаларан уггар йокха кӀоргалла',
+'limitreport-expensivefunctioncount' => 'АгӀона хӀоттам къасторан «иза» функцеш',
+
 );
index 9f586f8..94842dc 100644 (file)
@@ -868,8 +868,8 @@ $2',
 'userlogin-yourname' => 'نام کاربری',
 'userlogin-yourname-ph' => 'نام کاربریتان را وارد کنید',
 'createacct-another-username-ph' => 'نام کاربریتان را وارد کنید',
-'yourpassword' => 'گذرواژه:',
-'userlogin-yourpassword' => 'گذرواژه',
+'yourpassword' => 'رمز عبور:',
+'userlogin-yourpassword' => 'رمز عبور',
 'userlogin-yourpassword-ph' => 'گذرواژه را وارد کنید',
 'createacct-yourpassword-ph' => 'یک گذرواژه وارد کنید',
 'yourpasswordagain' => 'تکرار گذرواژه:',
@@ -905,10 +905,10 @@ $2',
 'userlogin-createanother' => 'ایجاد یک حساب کاربری دیگر',
 'createacct-join' => 'اطلاعاتتان را در زیر وارد کنید',
 'createacct-another-join' => 'در زیر اطلاعات کاربری جدیدتان را وارد کنید.',
-'createacct-emailrequired' => 'آدرس رایانامه',
-'createacct-emailoptional' => 'آدرس رایانامه (اختیاری)',
-'createacct-email-ph' => 'آدرس رایانامه را وارد کنید',
-'createacct-another-email-ph' => 'آدرس رایانامه را وارد کنید',
+'createacct-emailrequired' => 'نشانی رایانامه',
+'createacct-emailoptional' => 'نشانی رایانامه (اختیاری)',
+'createacct-email-ph' => 'نشانی رایانامه را وارد کنید',
+'createacct-another-email-ph' => 'نشانی رایانامه را وارد کنید',
 'createaccountmail' => 'استفاده از رمز عبور موقت تصادفی و فرستادن آن به نشانی ایمیل مشخص‌شده',
 'createacct-realname' => 'نام واقعی (اختیاری)',
 'createaccountreason' => 'دلیل:',
@@ -919,8 +919,8 @@ $2',
 'createacct-submit' => 'حسابتان را بسازید',
 'createacct-another-submit' => 'ایجاد حساب کاربری دیگر',
 'createacct-benefit-heading' => '{{SITENAME}} توسط افرادی مانند شما ساخته شده‌است',
-'createacct-benefit-body1' => '{{PLURAL:$1|ویرایش|ویرایش‌ها}}',
-'createacct-benefit-body2' => '{{PLURAL:$1|صفحه|صفحه‌ها}}',
+'createacct-benefit-body1' => '{{PLURAL:$1|ویرایش}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|صفحه}}',
 'createacct-benefit-body3' => '{{PLURAL:$1|مشارکت‌کنندهٔ|مشارکت‌کنندگان}} اخیر',
 'badretype' => 'گذرواژه‌هایی که وارد کرده‌اید یکسان نیستند.',
 'userexists' => 'نام کاربری‌ای که وارد کردید قبلاً استفاده شده‌است.
@@ -1001,7 +1001,7 @@ $2',
 
 # Email sending
 'php-mail-error-unknown' => 'خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی',
-'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس رایانامه.',
+'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک نشانی رایانامه.',
 'user-mail-no-body' => 'تلاش برای فرستادن پست‌الکترونیک بی‌دلیل کوتاه یا خالی',
 
 # Change password dialog
index 79da6f3..7c42ff4 100644 (file)
@@ -324,18 +324,18 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'Piilota tarkastetut sivut uusien sivujen listalta',
 'tog-extendwatchlist' => 'Laajenna tarkkailulista näyttämään kaikki tehdyt muutokset eikä vain viimeisimmät',
 'tog-usenewrc' => 'Ryhmittele muutokset sivun mukaan tuoreiden muutosten listalla ja tarkkailulistalla',
-'tog-numberheadings' => 'Numeroi otsikot',
+'tog-numberheadings' => 'Numeroi otsikot automaattisesti',
 'tog-showtoolbar' => 'Näytä työkalupalkki',
 'tog-editondblclick' => 'Muokkaa sivuja kaksoisnapsautuksella',
 'tog-editsection' => 'Näytä muokkauslinkit jokaisen osion yläpuolella',
 'tog-editsectiononrightclick' => 'Muokkaa osioita napsauttamalla osion otsikkoa hiiren oikealla painikkeella',
-'tog-showtoc' => 'Näytä sisällysluettelo sivuille, joilla on yli 3 otsikkoa',
+'tog-showtoc' => 'Näytä sisällysluettelo (sivuilla, joilla on yli kolme otsikkoa)',
 'tog-rememberpassword' => 'Muista kirjautuminen tässä selaimessa (enintään $1 {{PLURAL:$1|päivä|päivää}})',
 'tog-watchcreations' => 'Lisää luomani sivut ja tallentamani tiedostot tarkkailulistalleni',
-'tog-watchdefault' => 'Lisää muokkaamani sivut tarkkailulistalleni',
-'tog-watchmoves' => 'Lisää siirtämäni sivut tarkkailulistalleni',
-'tog-watchdeletion' => 'Lisää poistamani sivut tarkkailulistalleni',
-'tog-minordefault' => 'Muutokset ovat oletuksena pieniä',
+'tog-watchdefault' => 'Lisää muokkaamani sivut ja tiedostot tarkkailulistalleni',
+'tog-watchmoves' => 'Lisää siirtämäni sivut ja tiedostot tarkkailulistalleni',
+'tog-watchdeletion' => 'Lisää poistamani sivut ja tiedostot tarkkailulistalleni',
+'tog-minordefault' => 'Merkitse kaikki muutokset oletusarvoisesti pieniksi',
 'tog-previewontop' => 'Näytä esikatselu muokkauskentän yläpuolella',
 'tog-previewonfirst' => 'Näytä esikatselu heti, kun muokkaus aloitetaan',
 'tog-nocache' => 'Älä tallenna sivuja selaimen välimuistiin',
@@ -344,21 +344,21 @@ $messages = array(
 'tog-enotifminoredits' => 'Lähetä sähköpostiviesti myös pienistä muokkauksista',
 'tog-enotifrevealaddr' => 'Näytä sähköpostiosoitteeni muille lähetetyissä ilmoituksissa',
 'tog-shownumberswatching' => 'Näytä sivua tarkkailevien käyttäjien määrä',
-'tog-oldsig' => 'Nykyinen allekirjoitus',
+'tog-oldsig' => 'Nykyinen allekirjoitus:',
 'tog-fancysig' => 'Muotoilematon allekirjoitus ilman automaattista linkkiä',
 'tog-uselivepreview' => 'Käytä välitöntä esikatselua (kokeellinen)',
-'tog-forceeditsummary' => 'Huomauta, jos yhteenvetoa ei ole annettu',
-'tog-watchlisthideown' => 'Piilota omat muokkaukset',
-'tog-watchlisthidebots' => 'Piilota bottien muokkaukset',
-'tog-watchlisthideminor' => 'Piilota pienet muokkaukset',
+'tog-forceeditsummary' => 'Huomauta minua, jos en ole kirjoittanut yhteenvetoa',
+'tog-watchlisthideown' => 'Piilota omat muokkaukset tarkkailulistalta',
+'tog-watchlisthidebots' => 'Piilota bottien muokkaukset tarkkailulistalta',
+'tog-watchlisthideminor' => 'Piilota pienet muokkaukset tarkkailulistalta',
 'tog-watchlisthideliu' => 'Piilota kirjautuneiden käyttäjien muokkaukset tarkkailulistalta',
 'tog-watchlisthideanons' => 'Piilota rekisteröitymättömien käyttäjien muokkaukset tarkkailulistalta',
-'tog-watchlisthidepatrolled' => 'Piilota tarkastetut muokkaukset tarkkailulistalta',
+'tog-watchlisthidepatrolled' => 'Piilota muutostentarkastajien hyväksymät muokkaukset tarkkailulistalta',
 'tog-ccmeonemails' => 'Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista',
-'tog-diffonly' => 'Älä näytä sivun sisältöä versioita vertailtaessa',
+'tog-diffonly' => 'Älä näytä sivun sisältöä eroavaisuusvertailun alapuolella',
 'tog-showhiddencats' => 'Näytä piilotetut luokat',
 'tog-noconvertlink' => 'Älä muunna linkkien otsikoita toiseen kirjoitusjärjestelmään',
-'tog-norollbackdiff' => 'Älä näytä eroavaisuuksia palauttamisen jälkeen',
+'tog-norollbackdiff' => 'Älä näytä eroavaisuuksia, kun olet palauttanut muokkauksen palauta-työkalulla',
 'tog-useeditwarning' => 'Varoita minua, kun poistun muokkaussivulta tallentamatta muutoksia',
 'tog-prefershttps' => 'Käytä aina turvallista yhteyttä kun olet kirjautunut sisään',
 
@@ -464,7 +464,7 @@ $messages = array(
 'morenotlisted' => 'Tämä luettelo ei ole täydellinen.',
 'mypage' => 'Käyttäjäsivu',
 'mytalk' => 'Keskustelusivu',
-'anontalk' => 'Keskustele tämän IP:n kanssa',
+'anontalk' => 'Keskustelusivu tälle IP-muokkaajalle',
 'navigation' => 'Valikko',
 'and' => '&#32;ja',
 
@@ -524,7 +524,7 @@ $messages = array(
 'protect_change' => 'muuta',
 'protectthispage' => 'Suojaa tämä sivu',
 'unprotect' => 'Muuta suojausta',
-'unprotectthispage' => 'Muuta tämän sivun suojauksia',
+'unprotectthispage' => 'Muuta tämän sivun suojausta',
 'newpage' => 'Uusi sivu',
 'talkpage' => 'Keskustele tästä sivusta',
 'talkpagelinktext' => 'keskustelu',
@@ -607,9 +607,9 @@ $1',
 'toc' => 'Sisällysluettelo',
 'showtoc' => 'näytä',
 'hidetoc' => 'piilota',
-'collapsible-collapse' => 'Piilota',
-'collapsible-expand' => 'Näytä',
-'thisisdeleted' => 'Näytä tai palauta $1.',
+'collapsible-collapse' => 'Supista',
+'collapsible-expand' => 'Laajenna',
+'thisisdeleted' => 'Näytä tai palauta $1?',
 'viewdeleted' => 'Näytä $1?',
 'restorelink' => '{{PLURAL:$1|yksi poistettu muokkaus|$1 poistettua muokkausta}}',
 'feedlinks' => 'Syötteet:',
@@ -660,12 +660,12 @@ Ohjelmistossa saattaa olla vikaa (bugi).',
 'readonlytext' => 'Tietokanta on tällä hetkellä lukittu. Uusia sivuja ei voi luoda eikä muitakaan muutoksia tehdä. Syynä ovat todennäköisimmin rutiininomaiset tietokannan ylläpitotoimet.
 
 Tietokannan lukinneen ylläpitäjän selitys: $1',
-'missing-article' => 'Sivun sisältöä ei löytynyt tietokannasta: $1 $2.
+'missing-article' => 'Sivun sisältöä ei löytynyt tietokannasta nimellä "$1" $2.
 
-Useimmiten tämä johtuu vanhentuneesta vertailu- tai historiasivulinkistä poistettuun sivuun.
+Yleensä tämä johtuu vanhentuneesta vertailu- tai historialinkistä sivulle, joka on poistettu.
 
 Jos kyseessä ei ole poistettu sivu, olet ehkä löytänyt virheen ohjelmistossa.
-Ilmoita tämän sivun osoite wikin [[Special:ListUsers/sysop|ylläpitäjälle]].',
+Ilmoita tästä [[Special:ListUsers/sysop|ylläpitäjälle]] ja kerro viestissäsi sivun URL.',
 'missingarticle-rev' => '(versio: $1)',
 'missingarticle-diff' => '(vertailu: $1, $2)',
 'readonly_lag' => 'Tietokanta on automaattisesti lukittu, jotta kaikki tietokantapalvelimet saisivat kaikki tuoreet muutokset',
@@ -681,31 +681,32 @@ Ilmoita tämän sivun osoite wikin [[Special:ListUsers/sysop|ylläpitäjälle]].
 'fileexistserror' => 'Tiedostoon ”$1” kirjoittaminen epäonnistui: Tiedosto on olemassa.',
 'unexpected' => 'Odottamaton arvo: ”$1” on ”$2”.',
 'formerror' => 'Lomakkeen tiedot eivät kelpaa',
-'badarticleerror' => 'Toimintoa ei voi suorittaa tälle sivulle.',
+'badarticleerror' => 'Tätä toimintoa ei voi suorittaa tälle sivulle.',
 'cannotdelete' => 'Sivun tai tiedoston ”$1” poisto epäonnistui.
 Joku muu on saattanut poistaa sen.',
 'cannotdelete-title' => 'Sivua $1 ei voi poistaa',
 'delete-hook-aborted' => 'Laajennuskoodi esti poiston antamatta syytä.',
 'no-null-revision' => 'Nollamuokkausta sivulla "$1" ei voi tehdä',
 'badtitle' => 'Virheellinen otsikko',
-'badtitletext' => 'Pyytämäsi sivuotsikko oli virheellinen, tyhjä tai väärin linkitetty kieltenvälinen tai wikienvälinen linkki.',
+'badtitletext' => 'Pyytämäsi sivunimi oli virheellinen, tyhjä tai väärin linkitetty kieltenvälinen tai wikienvälinen nimi.
+Siinä saattaa olla yksi tai useampi sellainen merkki, jota ei voi käyttää sivujen nimissä.',
 'perfcached' => 'Nämä tiedot ovat välimuistista eivätkä välttämättä ole ajan tasalla. Välimuistissa on saatavilla enintään {{PLURAL:$1|yksi tulos|$1 tulosta}}.',
 'perfcachedts' => 'Nämä tiedot ovat välimuistista, ja ne on päivitetty viimeksi $1. Välimuistissa on saatavilla enintään {{PLURAL:$4|yksi tulos|$4 tulosta}}.',
 'querypage-no-updates' => 'Tämän sivun tietoja ei toistaiseksi päivitetä.',
 'wrong_wfQuery_params' => 'Virheelliset parametrit wfQuery()<br />Funktio: $1<br />Tiedustelu: $2',
-'viewsource' => 'Lähdekoodi',
+'viewsource' => 'Näytä wikiteksti',
 'viewsource-title' => 'Lähdekoodi sivulle $1',
 'actionthrottled' => 'Toiminto nopeusrajoitettu',
 'actionthrottledtext' => 'Ylläpitosyistä tämän toiminnon suorittamista on rajoitettu. Olet suorittanut tämän toiminnon liian monta kertaa lyhyen ajan sisällä. Yritä myöhemmin uudelleen.',
 'protectedpagetext' => 'Tämä sivu on suojattu muutoksilta.',
-'viewsourcetext' => 'Voit tarkastella ja kopioida tämän sivun lähdekoodia:',
+'viewsourcetext' => 'Voit katsoa ja kopioida tämän sivun lähdetekstiä:',
 'viewyourtext' => "Voit tarkastella ja kopioida lähdekoodin '''tekemistäsi muutoksista''' tähän sivuun:",
 'protectedinterface' => 'Tämä sivu sisältää ohjelmiston käyttöliittymätekstiä ja on suojattu häiriköinnin estämiseksi.
 Viestien kääntäminen tulisi tehdä [//translatewiki.net/ translatewiki.netissä] – MediaWikin kotoistusprojektissa.',
 'editinginterface' => "'''Varoitus:''' Muokkaat sivua, joka sisältää ohjelmiston käyttöliittymätekstiä.
 Muutokset tähän sivuun vaikuttavat muiden käyttäjien käyttöliittymän ulkoasuun tässä wikissä.
 Viestien kääntäminen tulisi tehdä [//translatewiki.net/ translatewiki.netissä] – MediaWikin kotoistusprojektissa.",
-'cascadeprotected' => 'Tämä sivu on suojattu muokkauksilta, koska se on sisällytetty alla {{PLURAL:$1|olevaan laajennetusti suojattuun sivuun|oleviin laajennetusti suojattuihin sivuihin}}:
+'cascadeprotected' => 'Tämä sivu on suojattu muokkauksilta, koska se on sisällytetty {{PLURAL:$1|seuraavaan tarttuvasti suojattuun sivuun|seuraaviin tarttuvasti suojattuihin sivuihin}}:
 $2',
 'namespaceprotected' => "Et voi muokata sivuja nimiavaruudessa '''$1'''.",
 'customcssprotected' => 'Sinulla ei ole oikeutta muuttaa tätä CSS-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
@@ -721,7 +722,7 @@ Syynä on: ''$2''.",
 
 Lukituksen asettanut ylläpitäjä on antanut seuraavan syyn toimenpiteelle: $3.',
 'invalidtitle-knownnamespace' => 'Virheellinen sivunimi, nimiavaruus "$2" ja teksti "$3"',
-'invalidtitle-unknownnamespace' => 'Virheellinen sivunimi, tuntematon nimiavaruus numero $1 ja teksti $2',
+'invalidtitle-unknownnamespace' => 'Virheellinen sivunimi, tuntematon nimiavaruus numero $1 ja teksti "$2"',
 'exception-nologin' => 'Et ole kirjautunut sisään',
 'exception-nologin-text' => 'Tämä sivu tai toiminto edellyttää sisäänkirjautumista tähän wikiin.',
 
@@ -737,26 +738,26 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
 'welcomeuser' => 'Tervetuloa $1!',
 'welcomecreation-msg' => 'Käyttäjätunnuksesi on luotu.
 Älä unohda virittää {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|asetuksiasi]].',
-'yourname' => 'Käyttäjätunnus',
+'yourname' => 'Käyttäjätunnus:',
 'userlogin-yourname' => 'Käyttäjätunnus',
 'userlogin-yourname-ph' => 'Kirjoita käyttäjätunnus',
 'createacct-another-username-ph' => 'Lisää käyttäjätunnus',
-'yourpassword' => 'Salasana',
+'yourpassword' => 'Salasana:',
 'userlogin-yourpassword' => 'Salasana',
 'userlogin-yourpassword-ph' => 'Kirjoita salasana',
 'createacct-yourpassword-ph' => 'Kirjoita salasana',
-'yourpasswordagain' => 'Salasana uudelleen',
+'yourpasswordagain' => 'Salasana uudelleen:',
 'createacct-yourpasswordagain' => 'Vahvista salasana',
 'createacct-yourpasswordagain-ph' => 'Kirjoita salasana uudelleen',
 'remembermypassword' => 'Muista minut (enintään $1 {{PLURAL:$1|päivä|päivää}})',
 'userlogin-remembermypassword' => 'Pidä minut kirjautuneena',
 'userlogin-signwithsecure' => 'Käytä salattua yhteyttä',
-'yourdomainname' => 'Verkkonimi',
+'yourdomainname' => 'Verkkonimi:',
 'password-change-forbidden' => 'Et voi muuttaa salasanoja tässä wikissä.',
 'externaldberror' => 'Tapahtui virhe ulkoisen autentikointitietokannan käytössä tai sinulla ei ole lupaa päivittää tunnustasi.',
 'login' => 'Kirjaudu sisään',
 'nav-login-createaccount' => 'Kirjaudu sisään tai luo tunnus',
-'loginprompt' => 'Kirjautumiseen tarvitaan evästeitä.',
+'loginprompt' => 'Sinun täytyy sallia evästeet, jotta voit kirjautua sivustolle {{SITENAME}}.',
 'userlogin' => 'Kirjaudu sisään tai luo tunnus',
 'userloginnocreate' => 'Kirjaudu sisään',
 'logout' => 'Kirjaudu ulos',
@@ -770,9 +771,12 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
 'gotaccount' => "Jos sinulla on jo tunnus, voit '''$1'''.",
 'gotaccountlink' => 'kirjautua sisään',
 'userlogin-resetlink' => 'Unohditko salasanasi?',
-'userlogin-resetpassword-link' => 'Salasanan alustus',
+'userlogin-resetpassword-link' => 'Vaihda salasanaasi',
 'helplogin-url' => 'Help:Sisäänkirjautuminen',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Auta sisäänkirjautumisessa]]',
+'userlogin-loggedin' => 'Olet jo kirjautunut sisään tunnuksella {{GENDER:$1|$1}}.
+Käytä alla olevaa lomaketta kirjautuaksesi sisään toisena käyttäjänä.',
+'userlogin-createanother' => 'Luo toinen käyttäjätunnus',
 'createacct-join' => 'Kirjoita tietosi alle.',
 'createacct-another-join' => 'Lisää uuden käyttäjätunnuksen tiedot alle.',
 'createacct-emailrequired' => 'Sähköpostiosoite',
@@ -780,29 +784,32 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
 'createacct-email-ph' => 'Anna sähköpostiosoitteesi',
 'createacct-another-email-ph' => 'Lisää sähköpostiosoite',
 'createaccountmail' => 'Käytä satunnaista väliaikaissalasanaa ja lähetä se alla olevaan sähköpostiosoitteeseen',
-'createacct-realname' => 'Oikea nimi (valinnainen)',
-'createaccountreason' => 'Syy',
+'createacct-realname' => 'Oikea nimi (vapaaehtoinen)',
+'createaccountreason' => 'Syy:',
 'createacct-reason' => 'Syy',
-'createacct-reason-ph' => 'Tunnuksen luomisen syy',
+'createacct-reason-ph' => 'Miksi olet luomassa toista käyttäjätunnusta',
 'createacct-captcha' => 'Turvatarkastus',
 'createacct-imgcaptcha-ph' => 'Kirjoita teksti, jonka näet edellä',
 'createacct-submit' => 'Luo tunnus',
 'createacct-another-submit' => 'Luo toinen käyttäjätunnus',
-'createacct-benefit-heading' => '{{SITENAME}} on sinun kaltaisesi ihmisten tekemä.',
+'createacct-benefit-heading' => '{{SITENAME}} on sinun kaltaistesi ihmisten tekemä.',
 'createacct-benefit-body1' => '{{PLURAL:$1|muokkaus|muokkausta}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|sivu|sivua}}',
 'createacct-benefit-body3' => '{{PLURAL:$1|viimeikainen muokkaaja|viimeaikaista muokkaajaa}}',
 'badretype' => 'Syöttämäsi salasanat ovat erilaiset.',
 'userexists' => 'Pyytämäsi käyttäjänimi on jo käytössä. Valitse toinen käyttäjänimi.',
 'loginerror' => 'Sisäänkirjautumisvirhe',
-'createacct-error' => 'Tunnuksen luontivirhe',
+'createacct-error' => 'Virhe tunnuksen luomisessa',
 'createaccounterror' => 'Tunnuksen luonti ei onnistunut: $1',
-'nocookiesnew' => 'Käyttäjä luotiin, mutta et ole kirjautunut sisään. {{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. Selaimesi ei salli evästeistä. Kytke ne päälle, ja sitten kirjaudu sisään juuri luomallasi käyttäjänimellä ja salasanalla.',
+'nocookiesnew' => 'Käyttäjätunnus on luotu, mutta et ole kirjautunut sisään. 
+{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. 
+Selaimesi ei salli evästeitä. 
+Salli evästeiden käyttö, ja sen jälkeen kirjaudu sisään juuri luomallasi käyttäjätunnuksella ja salasanalla.',
 'nocookieslogin' => '{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. Selaimesi ei salli evästeitä. Ota ne käyttöön, ja yritä uudelleen.',
 'nocookiesfornew' => 'Käyttäjätunnusta ei luotu, koska sen lähdettä ei kyetty varmistamaan. Varmista, että selaimessasi on käytössä evästeet, päivitä tämä sivu ja yritä uudelleen.',
 'noname' => 'Et ole määritellyt kelvollista käyttäjänimeä.',
 'loginsuccesstitle' => 'Sisäänkirjautuminen onnistui',
-'loginsuccess' => "'''Olet kirjautunut käyttäjänä $1.'''",
+'loginsuccess' => "'''Olet nyt kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''",
 'nosuchuser' => 'Käyttäjää ”$1” ei ole olemassa. Nimet ovat kirjainkoosta riippuvaisia. Tarkista kirjoititko nimen oikein, tai [[Special:UserLogin/signup|luo uusi käyttäjätunnus]].',
 'nosuchusershort' => 'Käyttäjää nimeltä ”$1” ei ole. Kirjoititko nimen oikein?',
 'nouserspecified' => 'Käyttäjätunnusta ei ole määritelty.',
@@ -813,13 +820,14 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
 'password-name-match' => 'Salasanasi täytyy olla eri kuin käyttäjätunnuksesi.',
 'password-login-forbidden' => 'Tämän käyttäjänimen ja salasanan käyttö on estetty.',
 'mailmypassword' => 'Lähetä uusi salasana sähköpostitse',
-'passwordremindertitle' => 'Salasanamuistutus {{GRAMMAR:elative|{{SITENAME}}}}',
+'passwordremindertitle' => 'Uusi väliaikainen salasana {{GRAMMAR:elative|{{SITENAME}}}}',
 'passwordremindertext' => 'Joku IP-osoitteesta $1 pyysi {{GRAMMAR:partitive|{{SITENAME}}}} ($4) lähettämään uuden salasanan. Väliaikainen salasana käyttäjälle $2 on nyt $3. Kirjaudu sisään ja vaihda salasana. Väliaikainen salasana vanhenee {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.
 
 Jos joku muu on tehnyt tämän pyynnön, tai jos olet muistanut salasanasi ja et halua vaihtaa sitä, voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.',
-'noemail' => "Käyttäjälle '''$1''' ei ole määritelty sähköpostiosoitetta.",
+'noemail' => 'Käyttäjälle "$1" ei ole määritelty sähköpostiosoitetta.',
 'noemailcreate' => 'Sinun on annettava voimassa oleva sähköpostiosoite',
-'passwordsent' => 'Uusi salasana on lähetetty käyttäjän <b>$1</b> sähköpostiosoitteeseen.',
+'passwordsent' => 'Uusi salasana on lähetetty käyttäjän <b>$1</b> sähköpostiosoitteeseen.
+Ole hyvä ja kirjaudu sisään kun olet saanut sen.',
 'blocked-mailpassword' => 'Osoitteellesi on asetettu muokkausesto, joka estää käyttämästä salasanamuistutustoimintoa.',
 'eauthentsent' => 'Varmennussähköposti on lähetetty annettuun sähköpostiosoitteeseen. Muita viestejä ei lähetetä, ennen kuin olet toiminut viestin ohjeiden mukaan ja varmistanut, että sähköpostiosoite kuuluu sinulle.',
 'throttled-mailpassword' => 'Salasananpalautusviesti on lähetetty {{PLURAL:$1|kuluvan|kuluvien $1}} tunnin aikana. Salasananpalautusviestejä lähetetään enintään {{PLURAL:$1|tunnin|$1 tunnin}} välein.',
@@ -837,17 +845,17 @@ Tästä johtuen tästä IP-osoitteesta ei voi tällä hetkellä luoda uusia tunn
 'accountcreatedtext' => 'Käyttäjätunnus [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|keskustelu]]) luotiin.',
 'createaccount-title' => 'Tunnuksen luominen {{GRAMMAR:illative|{{SITENAME}}}}',
 'createaccount-text' => 'Joku on luonut tunnuksen $2 {{GRAMMAR:illative|{{SITENAME}}}} ($4).
-Tunnuksen $2 salasana on $3. Kirjaudu sisään ja vaihda salasanasi.
+Tunnus on "$2" ja sen salasana on "$3". Sinun on syytä kirjautua sisään ja vaihtaa salasanasi heti.
 
-Sinun ei tarvitse huomioida tätä viestiä, jos tunnus on luotu virheellisesti.',
-'usernamehasherror' => 'Käyttäjätunnus ei voi sisältää tiivistemerkkejä.',
+Sinun ei tarvitse välittää tästä viestistä, jos tämä tunnus on luotu virheellisesti.',
+'usernamehasherror' => 'Käyttäjätunnus ei voi sisältää ristikkomerkkejä (#).',
 'login-throttled' => 'Olet tehnyt liian monta kirjautumisyritystä.
 Odota $1 ennen kuin yrität uudelleen.',
 'login-abort-generic' => 'Kirjautuminen epäonnistui – keskeytetty',
 'loginlanguagelabel' => 'Kieli: $1',
 'suspicious-userlogout' => 'Pyyntösi kirjautua ulos evättiin, koska se näytti rikkinäisen selaimen tai välimuistipalvelimen lähettämältä.',
 'createacct-another-realname-tip' => 'Oikea nimi on vapaaehtoinen.
-Nimeä käytetään jotta voidaan kertoa kuka sisältöä on tuottanut.',
+Jos kuitenkin kerrot sen, nimeä käytetään jotta voidaan kertoa kuka sisältöä on tuottanut.',
 
 # Email sending
 'php-mail-error-unknown' => 'Tuntematon virhe PHP:n mail()-funktiossa',
@@ -859,8 +867,8 @@ Nimeä käytetään jotta voidaan kertoa kuka sisältöä on tuottanut.',
 'resetpass_announce' => 'Kirjauduit sisään sähköpostitse lähetetyllä väliaikaissalasanalla. Päätä sisäänkirjautuminen asettamalla uusi salasana.',
 'resetpass_text' => '<!-- Lisää tekstiä tähän -->',
 'resetpass_header' => 'Muuta tunnuksen salasana',
-'oldpassword' => 'Vanha salasana',
-'newpassword' => 'Uusi salasana',
+'oldpassword' => 'Vanha salasana:',
+'newpassword' => 'Uusi salasana:',
 'retypenew' => 'Uusi salasana uudelleen',
 'resetpass_submit' => 'Aseta salasana ja kirjaudu sisään',
 'changepassword-success' => 'Salasanasi vaihtaminen onnistui.',
@@ -874,28 +882,28 @@ Olet saattanut jo onnistuneesti vaihtaa salasanasi tai pyytää uutta väliaikai
 'resetpass-abort-generic' => 'Lisäosa hylkäsi salasanan vaihdon.',
 
 # Special:PasswordReset
-'passwordreset' => 'Salasanan alustus',
+'passwordreset' => 'Salasanan vaihto',
 'passwordreset-text-one' => 'Täytä tämä lomake vaihtaaksesi salasanasi.',
 'passwordreset-text-many' => '{{PLURAL:$1|Täytä yksi kentistä nollataksesi salasanasi.}}',
 'passwordreset-legend' => 'Salasanan vaihto',
-'passwordreset-disabled' => 'Salasanojen alustus ei ole mahdollista tässä wikissä.',
+'passwordreset-disabled' => 'Salasanojen vaihtaminen ei ole mahdollista tässä wikissä.',
 'passwordreset-emaildisabled' => 'Sähköpostitoiminnot on poistettu käytöstä tässä wikissä.',
-'passwordreset-username' => 'Käyttäjätunnus',
-'passwordreset-domain' => 'Verkkotunnus',
-'passwordreset-capture' => 'Näytä lähetettävä sähköpostiviesti',
+'passwordreset-username' => 'Käyttäjätunnus:',
+'passwordreset-domain' => 'Verkkotunnus:',
+'passwordreset-capture' => 'Näytä lähetettävä sähköpostiviesti?',
 'passwordreset-capture-help' => 'Jos valitset tämän, sähköposti (tilapäisellä salasanalla) näytetään sinulle sekä lähetetään käyttäjälle.',
-'passwordreset-email' => 'Sähköpostiosoite',
+'passwordreset-email' => 'Sähköpostiosoite:',
 'passwordreset-emailtitle' => 'Tunnuksen tiedot {{GRAMMAR:inessive|{{SITENAME}}}}',
 'passwordreset-emailtext-ip' => 'Joku (todennäköisesti sinä, IP-osoitteesta $1) pyysi salasanasi
-palautusta sivustolla {{SITENAME}} ($4). {{PLURAL:$3|Seuraava käyttäjätili on|Seuraavat käyttäjätilit ovat}}
+vaihtamista sivustolla {{SITENAME}} ($4). {{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}}
 yhdistettynä tähän sähköpostiosoitteeseen:
 
 $2
 
-{{PLURAL:$3|Tämä väliaikainen salasana vanhenee|Nämä väliaikaiset salasanat vanhenevat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.
-Ole hyvä ja kirjaudu sisään nyt ja valitse uusi salasana. Jos joku toinen pyysi tätä,
-tai jos muistit jo vanhan salasanasi, etkä halua enää muuttaa sitä
-voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.',
+{{PLURAL:$3|Tämä väliaikainen salasana vanhentuu|Nämä väliaikaiset salasanat vanhentuvat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.
+Kirjaudu sisään nyt ja valitse uusi salasana heti. Jos joku toinen teki tämän pyynnön 
+tai jos muistitkin vanhan salasanasi etkä halua enää muuttaa sitä,
+voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanasi käyttämistä.',
 'passwordreset-emailtext-user' => 'Käyttäjä $1 pyysi muistutusta tunnuksesi tiedoista sivustolla {{SITENAME}} ($4).
 {{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}} liitetty tähän sähköpostiosoitteeseen:
 
@@ -907,8 +915,8 @@ pyynnön, tai muistat sittenkin vanhan salasanasi, etkä halua muuttaa sitä,
 voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.',
 'passwordreset-emailelement' => 'Käyttäjätunnus: $1
 Väliaikainen salasana: $2',
-'passwordreset-emailsent' => 'Salasananpalautusviesti on lähetetty.',
-'passwordreset-emailsent-capture' => 'Salasananpalautusviesti on lähetetty, se näkyy myös alla.',
+'passwordreset-emailsent' => 'Salasanan palautuksesta kertova viesti on lähetetty sähköpostitse.',
+'passwordreset-emailsent-capture' => 'Salasanan palautuksesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.',
 'passwordreset-emailerror-capture' => 'Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1',
 
 # Special:ChangeEmail
@@ -916,8 +924,8 @@ Väliaikainen salasana: $2',
 'changeemail-header' => 'Muuta tunnuksen sähköpostiosoite',
 'changeemail-text' => 'Voit vaihtaa sähköpostiosoitteesi täyttämällä tämän lomakkeen. Muutoksen vahvistamiseen tarvitaan myös salasana.',
 'changeemail-no-info' => 'Tämän sivun käyttö edellyttää sisäänkirjautumista.',
-'changeemail-oldemail' => 'Nykyinen sähköpostiosoite',
-'changeemail-newemail' => 'Uusi sähköpostiosoite',
+'changeemail-oldemail' => 'Nykyinen sähköpostiosoite:',
+'changeemail-newemail' => 'Uusi sähköpostiosoite:',
 'changeemail-none' => '(ei asetettu)',
 'changeemail-password' => 'Salasanasi sivustolla {{SITENAME}}',
 'changeemail-submit' => 'Muuta sähköpostiosoite',
@@ -933,8 +941,8 @@ Sinun pitää tehdä tämä jos olet vahingossa jakanut ne jonkun kanssa tai kä
 'resettokens-tokens' => 'Tunnisteet:',
 'resettokens-token-label' => '$1 (nykyinen arvo: $2)',
 'resettokens-watchlist-token' => 'Tarkkailulistan verkkosyötteen tunniste',
-'resettokens-done' => 'Tunnisteiden uudistaminen',
-'resettokens-resetbutton' => 'Uudista valitut tunnisteet',
+'resettokens-done' => 'Avaimet on uudistettu.',
+'resettokens-resetbutton' => 'Uudista valitut avaimet',
 
 # Edit page toolbar
 'bold_sample' => 'Lihavoitu teksti',
@@ -1014,7 +1022,7 @@ Se on saatettu siirtää tai poistaa äskettäin.',
 'loginreqpagetext' => 'Sinun täytyy $1, jotta voisit nähdä muut sivut.',
 'accmailtitle' => 'Salasana lähetetty.',
 'accmailtext' => 'Satunnaisesti generoitu salasana käyttäjälle [[User talk:$1|$1]] on lähetetty osoitteeseen $2. Sen voi vaihtaa kirjautumisen jälkeen [[Special:ChangePassword|asetussivulla]].',
-'newarticle' => '(uusi)',
+'newarticle' => '(Uusi)',
 'newarticletext' => 'Linkki toi sivulle, jota ei vielä ole.
 Voit luoda sivun kirjoittamalla alla olevaan kenttään (katso [[{{MediaWiki:Helppage}}|ohjesivulta]] lisätietoja).
 Jos et halua luoda sivua, käytä selaimen paluutoimintoa.',
@@ -1083,24 +1091,24 @@ Sinun täytyy yhdistää muutoksesi olemassa olevaan tekstiin.
 Saattaa olla paras leikata ja liimata tekstisi omaan tekstitiedostoosi ja tallentaa se tänne myöhemmin.
 
 Lukitsemisen syy: $1",
-'protectedpagewarning' => "'''Varoitus: Tämä sivu on lukittu siten, että vain ylläpitäjät voivat muokata sitä.'''
+'protectedpagewarning' => "'''Varoitus: Tämä sivu on suojattu niin, että vain ylläpitäjät voivat muokata sitä.'''
 Alla on viimeisin lokitapahtuma:",
-'semiprotectedpagewarning' => 'Tämä sivu on lukittu siten, että vain rekisteröityneet käyttäjät voivat muokata sitä.
-Alla on viimeisin lokitapahtuma:',
-'cascadeprotectedwarning' => '<strong>Vain ylläpitäjät voivat muokata tätä sivua, koska se on sisällytetty alla {{PLURAL:$1|olevaan laajennetusti suojattuun sivuun|oleviin laajennetusti suojattuihin sivuihin}}</strong>:',
+'semiprotectedpagewarning' => "'''Huomautus:''' Tämä sivu on suojattu niin, että vain rekisteröityneet käyttäjät voivat muokata sitä.
+Alla on viimeisin lokitapahtuma:",
+'cascadeprotectedwarning' => '<strong>Varoitus:</strong> Vain ylläpitäjät voivat muokata tätä sivua, koska se on sisällytetty {{PLURAL:$1|seuraavaan tarttuvasti suojattuun sivuun|seuraaviin tarttuvasti suojattuihin sivuihin}}:',
 'titleprotectedwarning' => "'''Varoitus: Tämä sivunimi on suojattu niin, että sivun luomiseen tarvitaan [[Special:ListGroupRights|erityisiä oikeuksia]].'''
 Alla on viimeisin lokitapahtuma:",
 'templatesused' => 'Tällä sivulla {{PLURAL:$1|käytetty malline|käytetyt mallineet}}:',
 'templatesusedpreview' => 'Esikatselussa mukana {{PLURAL:$1|oleva malline|olevat mallineet}}:',
 'templatesusedsection' => 'Tässä osiossa mukana {{PLURAL:$1|oleva malline|olevat mallineet}}:',
 'template-protected' => '(suojattu)',
-'template-semiprotected' => '(suojattu kirjautumattomilta ja uusilta käyttäjiltä)',
+'template-semiprotected' => '(osittain suojattu)',
 'hiddencategories' => 'Tämä sivu kuuluu {{PLURAL:$1|seuraavaan piilotettuun luokkaan|seuraaviin piilotettuihin luokkiin}}:',
 'edittools' => '<!-- Tässä oleva teksti näytetään muokkauskentän alla. -->',
 'nocreatetext' => 'Et voi luoda uusia sivuja. Voit muokata olemassa olevia sivuja tai [[Special:UserLogin|luoda käyttäjätunnuksen]].',
 'nocreate-loggedin' => 'Sinulla ei ole oikeuksia luoda uusia sivuja.',
-'sectioneditnotsupported-title' => 'Osiomuokkaaminen ei ole tuettu.',
-'sectioneditnotsupported-text' => 'Osiomuokkaaminen ei ole tuettu tällä sivulla.',
+'sectioneditnotsupported-title' => 'Osioiden muokkaamista ei tueta.',
+'sectioneditnotsupported-text' => 'Osioiden muokkaamista ei tueta tällä sivulla.',
 'permissionserrors' => 'Puutteelliset oikeudet',
 'permissionserrorstext' => 'Sinulla ei ole oikeutta suorittaa toimintoa {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}} johtuen:',
 'permissionserrorstext-withaction' => 'Sinulla ei ole lupaa {{lcfirst:$2}} {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}} johtuen:',
@@ -1413,19 +1421,19 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'changepassword' => 'Salasanan vaihto',
 'prefs-skin' => 'Ulkoasu',
 'skin-preview' => 'esikatselu',
-'datedefault' => 'Ei valintaa',
+'datedefault' => 'Ei omaa määrittelyä',
 'prefs-beta' => 'Beta-ominaisuudet',
 'prefs-datetime' => 'Aika ja päiväys',
-'prefs-labs' => 'Kokeelliset ominaisuudet',
+'prefs-labs' => 'Testattavana olevat ominaisuudet',
 'prefs-user-pages' => 'Käyttäjäsivut',
 'prefs-personal' => 'Käyttäjätiedot',
 'prefs-rc' => 'Tuoreet muutokset',
 'prefs-watchlist' => 'Tarkkailulista',
-'prefs-watchlist-days' => 'Tarkkailulistan ajanjakso',
+'prefs-watchlist-days' => 'Näytettävien päivien määrä tarkkailulistalla:',
 'prefs-watchlist-days-max' => 'Enintään $1 {{PLURAL:$1|päivä|päivää}}',
 'prefs-watchlist-edits' => 'Tarkkailulistalla näytettävien muokkausten määrä',
 'prefs-watchlist-edits-max' => 'Enintään 1000',
-'prefs-watchlist-token' => 'Tarkkailulistan avain',
+'prefs-watchlist-token' => 'Tarkkailulistan avain:',
 'prefs-misc' => 'Muut',
 'prefs-resetpass' => 'Muuta salasana',
 'prefs-changeemail' => 'Muuta sähköpostiosoite',
@@ -1433,7 +1441,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'prefs-email' => 'Sähköpostiasetukset',
 'prefs-rendering' => 'Ulkoasu',
 'saveprefs' => 'Tallenna asetukset',
-'resetprefs' => 'Palauta tallennetut asetukset',
+'resetprefs' => 'Tyhjennä tallentamattomat muutokset',
 'restoreprefs' => 'Palauta kaikki oletusasetuksiin (kaikissa asetusten osastoissa)',
 'prefs-editing' => 'Muokkaus',
 'rows' => 'Rivejä',
@@ -1485,7 +1493,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'yourlanguage' => 'Käyttöliittymän kieli',
 'yourvariant' => 'Sisällön kielivariantti',
 'prefs-help-variant' => 'Valitse se variantti tai ortografia, jolla haluat näyttää tämän wikin sisällön.',
-'yournick' => 'Allekirjoitus',
+'yournick' => 'Uusi allekirjoitus:',
 'prefs-help-signature' => 'Kommentit keskustelusivuilla allekirjoitetaan merkinnällä <nowiki>~~~~</nowiki>, joka muuntuu allekirjoitukseksi ja aikaleimaksi.',
 'badsig' => 'Allekirjoitus ei kelpaa.',
 'badsiglength' => 'Allekirjoitus on liian pitkä – sen on oltava alle $1 {{PLURAL:$1|merkki|merkkiä}}.',
@@ -1516,7 +1524,7 @@ Tämä tieto on julkinen.',
 'prefs-displayrc' => 'Perusasetukset',
 'prefs-displaysearchoptions' => 'Näyttöasetukset',
 'prefs-displaywatchlist' => 'Näyttöasetukset',
-'prefs-tokenwatchlist' => 'Tunniste',
+'prefs-tokenwatchlist' => 'Avain',
 'prefs-diffs' => 'Erot',
 'prefs-help-prefershttps' => 'Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.',
 
@@ -1532,17 +1540,17 @@ Tämä tieto on julkinen.',
 'editinguser' => "Käyttäjän '''[[User:$1|$1]]''' oikeudet $2",
 'userrights-editusergroup' => 'Käyttäjän ryhmät',
 'saveusergroups' => 'Tallenna',
-'userrights-groupsmember' => 'Käyttäjä on jäsenenä ryhmissä',
+'userrights-groupsmember' => 'Jäsenenä ryhmissä:',
 'userrights-groupsmember-auto' => 'Virtuaaliset ryhmät:',
 'userrights-groups-help' => 'Voit muuttaa ryhmiä, joissa tämä käyttäjä on.
 * Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä.
 * Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä.
 * <nowiki>*</nowiki> tarkoittaa, että et pysty kumoamaan kyseistä operaatiota.',
-'userrights-reason' => 'Syy',
+'userrights-reason' => 'Syy:',
 'userrights-no-interwiki' => 'Sinulla ei ole lupaa muokata käyttöoikeuksia muissa wikeissä.',
 'userrights-nodatabase' => 'Tietokantaa $1 ei ole tai se ei ole paikallinen.',
-'userrights-nologin' => 'Sinun täytyy [[Special:UserLogin|kirjautua sisään]] ylläpitäjätunnuksella, jotta voisit muuttaa käyttöoikeuksia.',
-'userrights-notallowed' => 'Tunnuksellasi ei ole lupaa lisätä tai poistaa käyttöoikeuksia.',
+'userrights-nologin' => 'Sinun täytyy [[Special:UserLogin|kirjautua sisään]] ylläpitäjätunnuksella, jotta voisit muuttaa käyttöoikeuksia.',
+'userrights-notallowed' => 'Sinulla ei ole lupaa lisätä tai poistaa käyttöoikeuksia.',
 'userrights-changeable-col' => 'Ryhmät, joita voit muuttaa',
 'userrights-unchangeable-col' => 'Ryhmät, joita et voi muuttaa',
 'userrights-conflict' => 'Päällekkäinen käyttöoikeuksien muutos! Tarkista tekemäsi muutokset ja vahvista ne.',
@@ -1611,7 +1619,7 @@ Tämä tieto on julkinen.',
 'right-ipblock-exempt' => 'Ohittaa IP-, automaattiset ja osoitealue-estot',
 'right-proxyunbannable' => 'Ohittaa automaattiset välityspalvelinestot',
 'right-unblockself' => 'Poistaa esto itseltään',
-'right-protect' => 'Muuttaa suojauksen tasoja ja muokata laajennetusti suojattuja sivuja',
+'right-protect' => 'Muuttaa suojaustasoja ja muokata tarttuvasti suojattuja sivuja',
 'right-editprotected' => 'Muokata sivuja, jotka on suojattu tasolle "{{int:protect-level-sysop}}"',
 'right-editsemiprotected' => 'Muokata sivuja, jotka on suojattu tasolle "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Muokata käyttöliittymätekstejä',
@@ -2188,11 +2196,11 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'deadendpagestext' => 'Seuraavat sivut eivät linkitä muihin sivuihin wikissä.',
 'protectedpages' => 'Suojatut sivut',
 'protectedpages-indef' => 'Vain ikuisesti suojatut',
-'protectedpages-cascade' => 'Vain laajennetusti suojatut',
-'protectedpagestext' => 'Seuraavat sivut ovat suojattuja siirtämiseltä tai muutoksilta',
+'protectedpages-cascade' => 'Vain tarttuvasti suojatut',
+'protectedpagestext' => 'Seuraavat sivut on suojattu siirrolta tai muokkauksilta',
 'protectedpagesempty' => 'Mitään sivuja ei ole tällä hetkellä suojattu näillä asetuksilla.',
 'protectedtitles' => 'Suojatut sivunimet',
-'protectedtitlestext' => 'Seuraavien sivujen luonti on estetty.',
+'protectedtitlestext' => 'Seuraavien sivujen luonti on estetty suojauksella.',
 'protectedtitlesempty' => 'Ei suojattuja sivunimiä näillä hakuehdoilla.',
 'listusers' => 'Käyttäjälista',
 'listusers-editsonly' => 'Näytä vain käyttäjät, joilla on muokkauksia',
@@ -2431,8 +2439,8 @@ $UNWATCHURL
 
 Palaute ja lisäapu osoitteessa:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
-'created' => 'luonut sivun',
-'changed' => 'muuttanut sivua',
+'created' => 'luonut',
+'changed' => 'muuttanut',
 
 # Delete
 'deletepage' => 'Poista sivu',
@@ -2457,9 +2465,9 @@ Sivulla $2 on lista viimeaikaisista poistoista.',
 'deleteotherreason' => 'Muu syy tai tarkennus',
 'deletereasonotherlist' => 'Muu syy',
 'deletereason-dropdown' => '*Yleiset poistosyyt
-** Lisääjän poistopyyntö
+** Tekijän poistopyyntö
 ** Tekijänoikeusrikkomus
-** Roskaa',
+** Vandalismi',
 'delete-edit-reasonlist' => 'Muokkaa poistosyitä',
 'delete-toobig' => 'Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistamista on rajoitettu suorituskykysyistä.',
 'delete-warning-toobig' => 'Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistaminen voi haitata sivuston suorituskykyä.',
@@ -2499,8 +2507,8 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 'protect-norestrictiontypes-text' => 'Tätä sivua ei voi suojata, koska mitään rajoitusvaihtoehtoja ei ole käytettävissä.',
 'protect-norestrictiontypes-title' => 'Ei suojattavissa oleva sivu',
 'protect-legend' => 'Suojaukset',
-'protectcomment' => 'Syy',
-'protectexpiry' => 'Vanhentuu',
+'protectcomment' => 'Syy:',
+'protectexpiry' => 'Vanhentuu:',
 'protect_expiry_invalid' => 'Vanhentumisaika ei kelpaa.',
 'protect_expiry_old' => 'Vanhentumisaika on menneisyydessä.',
 'protect-unchain-permissions' => 'Avaa lisäsuojausvalinnat',
@@ -2508,25 +2516,25 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 'protect-locked-blocked' => "Et voi muuttaa sivun suojauksia, koska sinut on estetty. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
 'protect-locked-dblock' => "Sivun suojauksia ei voi muuttaa, koska tietokanta on lukittu. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
 'protect-locked-access' => "Sinulla ei ole tarvittavia oikeuksia sivujen suojauksen muuttamiseen. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
-'protect-cascadeon' => 'Tämä sivu on suojauksen kohteena, koska se on sisällytetty alla {{PLURAL:$1|olevaan laajennetusti suojattuun sivuun|oleviin laajennetusti suojattuihin sivuihin}}. Voit muuttaa tämän sivun suojaustasoa, mutta se ei vaikuta laajennettuun suojaukseen.',
+'protect-cascadeon' => 'Tämä sivu on suojauksen kohteena, koska se on sisällytetty alla {{PLURAL:$1|olevaan tartuttavasti suojattuun sivuun|oleviin tartuttavasti suojattuihin sivuihin}}. Voit muuttaa tämän sivun suojaustasoa, mutta se ei vaikuta tarttuvaan suojaukseen.',
 'protect-default' => 'Salli kaikki käyttäjät',
 'protect-fallback' => 'Salli vain käyttäjät, joilla on oikeus $1',
 'protect-level-autoconfirmed' => 'Vain hyväksytyt käyttäjät',
 'protect-level-sysop' => 'Salli vain ylläpitäjät',
-'protect-summary-cascade' => 'laajennettu',
+'protect-summary-cascade' => 'tarttuva',
 'protect-expiring' => 'vanhentuu $1 (UTC)',
 'protect-expiring-local' => 'vanhentuu $1',
 'protect-expiry-indefinite' => 'ikuinen',
-'protect-cascade' => 'Laajenna suojaus koskemaan kaikkia tähän sivuun sisällytettyjä sivuja.',
-'protect-cantedit' => 'Et voi muuttaa sivun suojaustasoa, koska sinulla ei ole oikeutta muokata sivua.',
-'protect-othertime' => 'Muu kesto',
+'protect-cascade' => 'Laajenna suojaus koskemaan kaikkia tähän sivuun sisällytettyjä sivuja (tarttuva suojaus).',
+'protect-cantedit' => 'Et voi muuttaa tämän sivun suojaustasoa, koska sinulla ei ole oikeutta muokata sitä.',
+'protect-othertime' => 'Muu kesto:',
 'protect-othertime-op' => 'muu kesto',
 'protect-existing-expiry' => 'Nykyinen vanhentumisaika: $2 kello $3',
-'protect-otherreason' => 'Muu syy tai tarkennus',
+'protect-otherreason' => 'Muu syy tai tarkennus:',
 'protect-otherreason-op' => 'Muu syy',
 'protect-dropdown' => '*Yleiset suojaussyyt
 ** Jatkuva vandalismi
-** Jatkuva mainoslinkkien lisääminen
+** Jatkuva roskalinkkien lisääminen
 ** Muokkaussota
 ** Suuri näkyvyys',
 'protect-edit-reasonlist' => 'Muokkaa suojaussyitä',
@@ -2609,7 +2617,7 @@ $1',
 'contributions' => '{{GENDER:$1|Käyttäjän}} muokkaukset',
 'contributions-title' => 'Käyttäjän $1 muokkaukset',
 'mycontris' => 'Omat muokkaukset',
-'contribsub2' => 'Käyttäjän $1 ($2) muokkaukset',
+'contribsub2' => 'Käyttäjän {{GENDER:$3|$1}} ($2) muokkaukset',
 'nocontribs' => 'Näihin ehtoihin sopivia muokkauksia ei löytynyt.',
 'uctop' => '(uusin)',
 'month' => 'Kuukausi',
@@ -3015,7 +3023,8 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'tooltip-ca-talk' => 'Keskustele sisällöstä',
 'tooltip-ca-edit' => 'Muokkaa tätä sivua',
 'tooltip-ca-addsection' => 'Aloita keskustelu uudesta aiheesta',
-'tooltip-ca-viewsource' => 'Näytä sivun lähdekoodi',
+'tooltip-ca-viewsource' => 'Tämä sivu on suojattu muutoksilta.
+Voit katsella sivun lähteenä olevaa wikitekstiä.',
 'tooltip-ca-history' => 'Sivun aikaisemmat versiot',
 'tooltip-ca-protect' => 'Suojaa tämä sivu',
 'tooltip-ca-unprotect' => 'Muuta tämän sivun suojauksia',
@@ -3156,9 +3165,9 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'pageinfo-redirectsto-info' => 'tiedot',
 'pageinfo-contentpage' => 'Lasketaan sisältösivuksi',
 'pageinfo-contentpage-yes' => 'Kyllä',
-'pageinfo-protect-cascading' => 'Tämä on laajennetun suojauksen lähdesivu',
+'pageinfo-protect-cascading' => 'Tämä on tarttuvan suojauksen lähdesivu',
 'pageinfo-protect-cascading-yes' => 'Kyllä',
-'pageinfo-protect-cascading-from' => 'Laajennettu suojaus tulee sivulta',
+'pageinfo-protect-cascading-from' => 'Tarttuva suojaus tulee sivulta',
 'pageinfo-category-info' => 'Luokkatiedot',
 'pageinfo-category-pages' => 'Sivujen määrä',
 'pageinfo-category-subcats' => 'Alaluokkien määrä',
@@ -3629,11 +3638,11 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
 
 'exif-gpsdop-excellent' => 'Erinomainen ($1)',
 'exif-gpsdop-good' => 'Hyvä ($1)',
-'exif-gpsdop-moderate' => 'Tyydyttävä ($1)',
+'exif-gpsdop-moderate' => 'Kohtalainen ($1)',
 'exif-gpsdop-fair' => 'Välttävä ($1)',
 'exif-gpsdop-poor' => 'Huono ($1)',
 
-'exif-objectcycle-a' => 'vain aamulla',
+'exif-objectcycle-a' => 'Vain aamulla',
 'exif-objectcycle-p' => 'Vain illalla',
 'exif-objectcycle-b' => 'Sekä aamulla että illalla',
 
@@ -3817,7 +3826,7 @@ Yritä normaalia esikatselua.',
 'lag-warn-high' => 'Tietokannoilla on työjonoa. Muutokset, jotka ovat uudempia kuin $1 {{PLURAL:$1|sekunti|sekuntia}}, eivät välttämättä näy tällä sivulla.',
 
 # Watchlist editor
-'watchlistedit-numitems' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}} keskustelusivuja lukuun ottamatta.',
+'watchlistedit-numitems' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}, lukuun ottamatta keskustelusivuja.',
 'watchlistedit-noitems' => 'Tarkkailulistasi on tyhjä.',
 'watchlistedit-normal-title' => 'Tarkkailulistan muokkaus',
 'watchlistedit-normal-legend' => 'Sivut',
@@ -3853,7 +3862,7 @@ Voit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].',
 'version-specialpages' => 'Toimintosivut',
 'version-parserhooks' => 'Jäsenninkytkökset',
 'version-variables' => 'Muuttujat',
-'version-antispam' => 'Roskapostin ja mainoslinkkien estäminen',
+'version-antispam' => 'Roskalinkkien estäminen',
 'version-skins' => 'Ulkoasut',
 'version-other' => 'Muut',
 'version-mediahandlers' => 'Median käsittelijät',
@@ -3908,13 +3917,13 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P
 'specialpages-note' => '----
 * Normaalit toimintosivut.
 * <span class="mw-specialpagerestricted">Rajoitetut toimintosivut.</span>',
-'specialpages-group-maintenance' => 'Ylläpito',
+'specialpages-group-maintenance' => 'Sivujen huoltaminen',
 'specialpages-group-other' => 'Muut',
 'specialpages-group-login' => 'Sisäänkirjautuminen ja tunnusten luonti',
-'specialpages-group-changes' => 'Muutokset ja lokit',
+'specialpages-group-changes' => 'Tuoreet muutokset ja lokit',
 'specialpages-group-media' => 'Media',
-'specialpages-group-users' => 'Käyttäjät',
-'specialpages-group-highuse' => 'Sivujen käyttöaste',
+'specialpages-group-users' => 'Käyttäjät ja käyttöoikeudet',
+'specialpages-group-highuse' => 'Paljon käytetyt sivut',
 'specialpages-group-pages' => 'Sivulistaukset',
 'specialpages-group-pagetools' => 'Sivutyökalut',
 'specialpages-group-wiki' => 'Tiedot ja työkalut',
@@ -3945,7 +3954,10 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P
 'tags-tag' => 'Merkintänimi',
 'tags-display-header' => 'Näkyvyys muutosluetteloissa',
 'tags-description-header' => 'Täysi kuvaus tarkoituksesta',
+'tags-active-header' => 'Aktiivinen?',
 'tags-hitcount-header' => 'Merkityt muutokset',
+'tags-active-yes' => 'Kyllä',
+'tags-active-no' => 'Ei',
 'tags-edit' => 'muokkaa',
 'tags-hitcount' => '$1 {{PLURAL:$1|muutos|muutosta}}',
 
@@ -3956,10 +3968,10 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P
 'compare-page2' => 'Sivu 2',
 'compare-rev1' => 'Versio 1',
 'compare-rev2' => 'Versio 2',
-'compare-submit' => 'Vertaile',
+'compare-submit' => 'Vertaa',
 'compare-invalid-title' => 'Antamasi otsikko on virheellinen.',
-'compare-title-not-exists' => 'Määrittämääsi otsikkoa ei ole.',
-'compare-revision-not-exists' => 'Määrittämääsi muutosta ei ole olemassa.',
+'compare-title-not-exists' => 'Määrittämääsi sivua ei ole.',
+'compare-revision-not-exists' => 'Määrittämääsi versiota ei ole.',
 
 # Database error messages
 'dberr-header' => 'Wikissä on tietokantaongelma',
@@ -4040,7 +4052,7 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'feedback-thanks' => 'Kiitos. Palautteesi on jätetty sivulle [$2 $1].',
 'feedback-close' => 'Valmis',
 'feedback-bugcheck' => 'Hyvä! Varmista, että ohjelmointivirhe ei vielä löydy [$1 tästä listasta].',
-'feedback-bugnew' => 'Varmistin. Ilmoitan uuden ohjelmointivirheen',
+'feedback-bugnew' => 'Olen varmistanut. Ilmoitan uuden ohjelmointivirheen',
 
 # Search suggestions
 'searchsuggest-search' => 'Hae',
@@ -4056,12 +4068,12 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'api-error-duplicate-popup-title' => 'Tiedoston {{PLURAL:$1|kaksoiskappale|kaksoiskappaleet}}',
 'api-error-empty-file' => 'Määrittämäsi tiedosto on tyhjä.',
 'api-error-emptypage' => 'Ei ole sallittua luoda uutta, tyhjää sivua.',
-'api-error-fetchfileerror' => 'Sisäinen virhe: jotakin meni pieleen tiedoston haussa.',
+'api-error-fetchfileerror' => 'Sisäinen virhe: Jotakin meni pieleen kun tiedostoa haettiin.',
 'api-error-fileexists-forbidden' => 'Tiedosto nimellä "$1" on jo olemassa eikä sitä voi korvata.',
 'api-error-fileexists-shared-forbidden' => 'Tiedosto nimeltä "$1" on jo olemassa yhteisessä tietovarastossa eikä sitä voi korvata.',
 'api-error-file-too-large' => 'Määrittämäsi tiedosto on liian iso.',
 'api-error-filename-tooshort' => 'Tiedoston nimi on liian lyhyt.',
-'api-error-filetype-banned' => 'Tämän tyyppisiä tiedosta ei voi tallentaa.',
+'api-error-filetype-banned' => 'Tämän tyyppisten tiedostojen tallentaminen on kielletty.',
 'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|ei ole sallittu tiedostomuoto|eivät ole sallittuja tiedostomuotoja}}. {{PLURAL:$3|Sallittu tiedostomuoto on|Sallittuja tiedostomuotoja ovat}} $2.',
 'api-error-filetype-missing' => 'Tiedostolta puuttuu tiedostopääte.',
 'api-error-hookaborted' => 'Laajennuskoodi esti yrittämäsi muutoksen.',
@@ -4076,13 +4088,13 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'api-error-noimageinfo' => 'Tallennus onnistui, mutta palvelin ei antanut meille tietoja tiedostosta.',
 'api-error-nomodule' => 'Sisäinen virhe: tallennusmoduulia ei ole asetettu.',
 'api-error-ok-but-empty' => 'Sisäinen virhe: palvelimelta ei saatu vastausta.',
-'api-error-overwrite' => 'Olemassa olevan tiedoston korvaaminen ei ole sallittua.',
+'api-error-overwrite' => 'Olemassa olevan tiedoston korvaaminen toisella ei ole sallittua.',
 'api-error-stashfailed' => 'Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.',
 'api-error-publishfailed' => 'Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.',
 'api-error-timeout' => 'Palvelin ei vastannut odotetun ajan kuluessa.',
 'api-error-unclassified' => 'Tapahtui tuntematon virhe.',
 'api-error-unknown-code' => 'Tuntematon virhe: $1',
-'api-error-unknown-error' => 'Sisäinen virhe: jotain meni vikaan tiedoston siirrossa.',
+'api-error-unknown-error' => 'Sisäinen virhe: Jotain meni vikaan kun tiedostosi yritettiin tallentaa.',
 'api-error-unknown-warning' => 'Tuntematon varoitus: $1',
 'api-error-unknownerror' => 'Tuntematon virhe: $1.',
 'api-error-uploaddisabled' => 'Tiedostojen tallentaminen ei ole käytössä.',
@@ -4100,17 +4112,17 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'duration-millennia' => '$1 {{PLURAL:$1|vuosituhat|vuosituhatta}}',
 
 # Image rotation
-'rotate-comment' => 'Kuvaa käännettiin $1 aste{{PLURAL:$1||tta}} myötäpäivään',
+'rotate-comment' => 'Kuvaa käännettiin $1 {{PLURAL:$1|aste|astetta}} myötäpäivään',
 
 # Limit report
 'limitreport-title' => 'Jäsentimen profilointitiedot',
 'limitreport-cputime' => 'Suorittimen ajankäyttö',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
-'limitreport-walltime' => 'Oikea ajankäyttö',
+'limitreport-walltime' => 'Todellinen ajankäyttö',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|tavu|tavua}}',
 'limitreport-templateargumentsize' => 'Mallineen argumenttien koko',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|tavu|tavua}}',
-'limitreport-expansiondepth' => 'Korkein laajennussyvyys',
+'limitreport-expansiondepth' => 'Suurin laajennussyvyys',
 
 );
index 91834c5..caab916 100644 (file)
@@ -1606,7 +1606,7 @@ HTML टैग की जाँच करें।',
 'action-protect' => 'इस पृष्ठ के सुरक्षा स्तर बदलने',
 'action-rollback' => 'किसी पृष्ठ का अंतिम सम्पादन करने वाले सदस्य के सम्पादन वापिस लेने',
 'action-import' => 'किसी और विकि से यह पृष्ठ आयात करने',
-'action-importupload' => 'फ़ाà¤\87ल à¤\85पलà¥\8bड à¤¦à¥\8dवारा à¤¯à¤¹ à¤ªà¥\83षà¥\8dठ à¤\86यात à¤\95रनà¥\87',
+'action-importupload' => 'फ़ाइल अपलोड द्वारा यह पृष्ठ आयात करे',
 'action-patrol' => 'अन्य सदस्यों के सम्पादन जाँचे हुए चिन्हित करने',
 'action-autopatrol' => 'अपने सम्पादन स्वचालित रूप से जाँचे हुए चिन्हित करने',
 'action-unwatchedpages' => 'ऐसे पृष्ठ जो किसी की ध्यानसूची में नहीं हैं की सूची देखने',
@@ -1627,6 +1627,7 @@ HTML टैग की जाँच करें।',
 'recentchanges' => 'हाल में हुए बदलाव',
 'recentchanges-legend' => 'हाल के परिवर्तन संबंधी विकल्प',
 'recentchanges-summary' => 'इस विकि पर हाल में हुए बदलाव इस पन्ने पर देखे जा सकते हैं।',
+'recentchanges-noresult' => 'कोई परिवर्तन नहीं किए गए इन मापदंडों से मेल खाते ईस अवधि के दौरान।',
 'recentchanges-feed-description' => 'इस विकि पर हाल में हुए बदलाव इस फ़ीड में देखे जा सकते हैं।',
 'recentchanges-label-newpage' => 'इस संपादन से नया पृष्ठ बना',
 'recentchanges-label-minor' => 'यह एक छोटा सम्पादन है',
index d9de7db..f2b3727 100644 (file)
@@ -21,6 +21,7 @@
  * @author Herr Mlinka
  * @author Kaganer
  * @author Luka Krstulovic
+ * @author MaGa
  * @author MayaSimFan
  * @author Meno25
  * @author Mvrban
@@ -325,7 +326,7 @@ $messages = array(
 'tog-extendwatchlist' => 'Proširi popis praćenih stranica tako da prikaže sve promjene, ne samo najnovije',
 'tog-usenewrc' => 'Rabi poboljšan izgled nedavnih promjena (zahtijeva JavaScript)',
 'tog-numberheadings' => 'Automatski označi naslove brojevima',
-'tog-showtoolbar' => 'Prikaži traku s alatima za uređivanje',
+'tog-showtoolbar' => 'Prikaži traku s alatima za uređivanje (zahtijeva JavaScript)',
 'tog-editondblclick' => 'Dvoklik otvara uređivanje stranice (JavaScript)',
 'tog-editsection' => 'Prikaži poveznice za uređivanje pojedinih odlomaka',
 'tog-editsectiononrightclick' => 'Pritiskom na desnu tipku miša otvori uređivanje pojedinih odlomaka (JavaScript)',
@@ -359,6 +360,7 @@ $messages = array(
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
 'tog-norollbackdiff' => 'Izostavi razliku nakon upotrebe ukloni',
 'tog-useeditwarning' => 'Upozori me kad napuštam stranicu za uređivanje bez spremanja izmjena',
+'tog-prefershttps' => 'Uvijek koristi sigurnu vezu kod prijave',
 
 'underline-always' => 'Uvijek',
 'underline-never' => 'Nikad',
@@ -643,6 +645,7 @@ Za popis svih posebnih stranica posjetite [[Special:SpecialPages|ovdje]].',
 # General errors
 'error' => 'Pogreška',
 'databaseerror' => 'Pogreška baze podataka',
+'databaseerror-error' => 'Pogrješka: $1',
 'laggedslavemode' => 'Upozorenje: na stranici se možda ne nalaze najnovije promjene.',
 'readonly' => 'Baza podataka je zaključana',
 'enterlockreason' => 'Upiši razlog zaključavanja i procjenu vremena otključavanja',
@@ -720,7 +723,6 @@ Administrator koji je zaključao spremište naveo je sljedeći razlog: "$3".',
 # Login and logout pages
 'logouttext' => "'''Odjavili ste se.'''
 
-Možete nastaviti s korištenjem {{SITENAME}} neprijavljeni, ili se možete ponovo <span class='plainlinks'>[$1 prijaviti]</span> pod istim ili drugim imenom.
 Neke se stranice mogu prikazivati kao da ste još uvijek prijavljeni, sve dok ne očistite međuspremnik svog preglednika.",
 'welcomeuser' => 'Dobrodošli, $1!',
 'welcomecreation-msg' => 'Vaš je suradnički račun otvoren.
@@ -760,13 +762,14 @@ Ne zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
 'userlogin-resetpassword-link' => 'Ponovno postavi zaporku',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavi]]',
+'userlogin-createanother' => 'Stvori još jedan račun',
 'createacct-join' => 'Upišite ispod svoje podatke.',
 'createacct-another-join' => 'Upišite dolje podatke o novom računu.',
 'createacct-emailrequired' => 'Adresa e-pošte',
 'createacct-emailoptional' => 'Adresa e-pošte',
 'createacct-email-ph' => 'Upišite svoju adresu e-pošte',
 'createacct-another-email-ph' => 'Upišite adresu e-pošte',
-'createaccountmail' => 'Uporabite nasumice odabranu privremenu zaporku i pošaljite ju na dolje navedenu adresu e-pošte',
+'createaccountmail' => 'Uporabite nasumice odabranu privremenu zaporku i pošaljite ju na navedenu adresu e-pošte',
 'createacct-realname' => 'Stvarno ime (neobvezatno)',
 'createaccountreason' => 'Razlog:',
 'createacct-reason' => 'Razlog',
@@ -841,7 +844,7 @@ Molim unesite ispravno oblikovanu adresu ili ostavite polje praznim.',
 Možete zanemariti ovu poruku ako je suradnički račun stvoren nenamjerno.',
 'usernamehasherror' => 'Suradničko ime ne može sadržavati znakove #',
 'login-throttled' => 'Nedavno ste se previše puta pokušali prijaviti.
-Molimo Vas pričekajte prije nego što pokušate ponovno.',
+Molimo Vas pričekajte $1 prije nego što pokušate ponovno.',
 'login-abort-generic' => 'Vaša prijava bila je neuspješna - Prekinuto',
 'loginlanguagelabel' => 'Jezik: $1',
 'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer to izgleda kao da je poslan preko pokvarenog preglednika ili keširanog posrednika (proxyja).',
@@ -858,7 +861,7 @@ Molimo Vas pričekajte prije nego što pokušate ponovno.',
 'newpassword' => 'Nova lozinka',
 'retypenew' => 'Ponovno unesite lozinku',
 'resetpass_submit' => 'Postavite lozinku i prijavite se',
-'changepassword-success' => 'Lozinka uspješno postavljena! Prijava u tijeku...',
+'changepassword-success' => 'Zaporka je uspješno postavljena!',
 'resetpass_forbidden' => 'Lozinka ne može biti promijenjena',
 'resetpass-no-info' => 'Morate biti prijavljeni da biste izravno pristupili ovoj stranici.',
 'resetpass-submit-loggedin' => 'Promijeni lozinku',
@@ -994,7 +997,7 @@ Možda je premješten ili izbrisan dok ste pregledavali stranicu.',
 'accmailtitle' => 'Lozinka poslana.',
 'accmailtext' => "Nova lozinka za [[User talk:$1|$1]] je poslana na $2.
 
-Nakon prijave, lozinka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|promijeni lozinku]]''",
+Nakon prijave, lozinka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|promijeni lozinku]]'' nakon prijave.",
 'newarticle' => '(Novo)',
 'newarticletext' => "Došli ste na stranicu koja još ne postoji.
 Ako želite stvoriti tu stranicu, počnite tipkati u prozor ispod ovog teksta (pogledajte [[{{MediaWiki:Helppage}}|stranicu za pomoć]]).
@@ -1479,7 +1482,7 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'badsiglength' => 'Vaš potpis je predugačak.
 Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'yourgender' => 'Spol:',
-'gender-unknown' => 'Neodređeno',
+'gender-unknown' => 'Neodređeni',
 'gender-male' => 'Muški',
 'gender-female' => 'Ženski',
 'prefs-help-gender' => 'Mogućnost: softver koristi za ispravno oslovljavanje razlikujući spol. Ovaj podatak bit će javan.',
@@ -1493,7 +1496,7 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'prefs-signature' => 'Potpis',
 'prefs-dateformat' => 'Format datuma',
 'prefs-timeoffset' => 'Vremensko poravnavanje',
-'prefs-advancedediting' => 'Napredne opcije',
+'prefs-advancedediting' => 'Napredne mogućnosti',
 'prefs-editor' => 'Uređivač',
 'prefs-preview' => 'Prikaži kako će izgledati',
 'prefs-advancedrc' => 'Napredne opcije',
@@ -3426,7 +3429,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
 'exif-compression-4' => 'CCITT Grupa 4 faks kodiranje',
 
 'exif-copyrighted-true' => 'Zaštićeno autorskim pravom',
-'exif-copyrighted-false' => 'Javno dobro',
+'exif-copyrighted-false' => 'Status autorskih prava nije postavljen',
 
 'exif-unknowndate' => 'Datum nepoznat',
 
@@ -3689,19 +3692,19 @@ $5
 
 Valjanost ovog potvrdnog koda istječe $4.',
 'confirmemail_body_set' => 'Netko, najvjerojatnije vi, s IP adrese $1,
-otvorio je suradnički račun pod imenom "$2" s ovom e-mail adresom na {{SITENAME}}.
+otvorio je suradnički račun pod imenom "$2" s ovom adresom e-pošte na {{SITENAME}}.
 
 Kako biste potvrdili da je ovaj suradnički račun uistinu vaš i uključili 
-e-mail naredbe na {{SITENAME}}, otvorite u vašem pregledniku sljedeću poveznicu:
+mogućnosti e-poruka na {{SITENAME}}, otvorite u vašem pregledniku sljedeću poveznicu:
 
 $3
 
 Ako ovaj suradnički račun *ne* pripada vama, slijedite ovaj link 
-kako biste poništili potvrdu e-mail adrese:
+kako biste poništili potvrdu adrese elektroničke pošte:
 
 $5
 
-Valjanost ovog potvrdnog koda istječe u $4',
+Valjanost ovog potvrdnog kȏda istječe u $4',
 'confirmemail_invalidated' => 'Potvrda E-mail adrese je otkazana',
 'invalidateemail' => 'Poništi potvrđivanje elektroničke pošte',
 
@@ -3946,6 +3949,8 @@ Trebali ste primiti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju GNU opće javne lic
 'tags-display-header' => 'Izgled na popisima izmjena',
 'tags-description-header' => 'Puni opis značenja',
 'tags-hitcount-header' => 'Označene izmjene',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Ne',
 'tags-edit' => 'uredi',
 'tags-hitcount' => '$1 {{PLURAL:$1|promjena|promjene|promjena}}',
 
@@ -3966,6 +3971,7 @@ Trebali ste primiti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju GNU opće javne lic
 'dberr-problems' => 'Ispričavamo se! Ova stranica ima tehničkih poteškoća.',
 'dberr-again' => 'Pričekajte nekoliko minuta i ponovno učitajte.',
 'dberr-info' => '(Ne mogu se spojiti na poslužitelj baze: $1)',
+'dberr-info-hidden' => '(Ne mogu se spojiti na poslužitelj baze)',
 'dberr-usegoogle' => 'U međuvremenu pokušajte tražiti putem Googlea.',
 'dberr-outofdate' => 'Imajte na umu da su njihova kazala našeg sadržaja možda zastarjela.',
 'dberr-cachederror' => 'Sljedeće je dohvaćena kopija tražene stranice, te možda nije ažurirana.',
@@ -3983,6 +3989,7 @@ Trebali ste primiti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju GNU opće javne lic
 'htmlform-selectorother-other' => 'Drugi',
 'htmlform-no' => 'Ne',
 'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Odaberite opciju',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podrškom pretraživanja cijelog teksta',
@@ -4076,6 +4083,7 @@ Inače, možete ispuniti jednostavan obrazac u nastavku. Vaš komentar biti će
 'api-error-ok-but-empty' => 'Interna pogrješka: Nema odgovora od poslužitelja.',
 'api-error-overwrite' => 'Postavljanje preko postojeće datoteke nije dopušteno.',
 'api-error-stashfailed' => 'Interna pogrješka: Poslužitelj nije uspio spremiti privremenu datoteku.',
+'api-error-publishfailed' => 'Interna pogrješka: Poslužitelj nije uspio objaviti privremenu datoteku.',
 'api-error-timeout' => 'Poslužitelj nije odgovorio unutar očekivanog vrjemena.',
 'api-error-unclassified' => 'Dogodila se nepoznata pogrješka.',
 'api-error-unknown-code' => 'Nepoznata pogrješka: "$1"',
index a61585c..cb7b4d2 100644 (file)
@@ -605,6 +605,9 @@ Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].
 'userlogin-resetpassword-link' => 'Reinitialisar contrasigno',
 'helplogin-url' => 'Help:Aperir session',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Adjuta a aperir session]]',
+'userlogin-loggedin' => 'Tu ha jam aperite session como {{GENDER:$1|$1}}.
+Usa le formulario sequente pro aperir session como altere usator.',
+'userlogin-createanother' => 'Crear un altere conto',
 'createacct-join' => 'Specifica tu information hic infra.',
 'createacct-another-join' => 'Specifica le informationes del nove conto ci infra.',
 'createacct-emailrequired' => 'Adresse de e-mail',
@@ -2562,7 +2565,7 @@ $1',
 'contributions' => 'Contributiones del {{GENDER:$1|usator}}',
 'contributions-title' => 'Contributiones del usator $1',
 'mycontris' => 'Contributiones',
-'contribsub2' => 'Pro $1 ($2)',
+'contribsub2' => 'Pro {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Necun modification ha essite trovate secundo iste criterios.',
 'uctop' => '(ultime)',
 'month' => 'A partir del mense (e anterior):',
@@ -3927,7 +3930,10 @@ Vos deberea haber recipite [{{SERVER}}{{SCRIPTPATH}}/COPYING un exemplar del Lic
 'tags-tag' => 'Nomine del etiquetta',
 'tags-display-header' => 'Apparentia in listas de modificationes',
 'tags-description-header' => 'Description complete del significato',
+'tags-active-header' => 'Active?',
 'tags-hitcount-header' => 'Modificationes etiquettate',
+'tags-active-yes' => 'Si',
+'tags-active-no' => 'No',
 'tags-edit' => 'modificar',
 'tags-hitcount' => '$1 {{PLURAL:$1|modification|modificationes}}',
 
index c900581..a6c8d0f 100644 (file)
@@ -3039,8 +3039,8 @@ $2',
 'pageinfo-article-id' => 'გვერდის ID',
 'pageinfo-language' => 'გვერდის შინაარსის ენა',
 'pageinfo-robot-policy' => 'საძიებო სისტემის სტატუსი',
-'pageinfo-robot-index' => 'á\83\98á\83\9cá\83\93á\83\94á\83¥á\83¡á\83\98á\83 á\83\93á\83\94á\83\91ა',
-'pageinfo-robot-noindex' => 'á\83\90á\83  á\83\98á\83\9cá\83\93á\83\94á\83¥á\83¡á\83\98á\83 á\83\93á\83\94á\83\91á\83\90',
+'pageinfo-robot-index' => 'á\83\93á\83\90á\83¨á\83\95á\83\94á\83\91á\83£á\83\9aá\83\98ა',
+'pageinfo-robot-noindex' => 'á\83\90á\83  á\83\90á\83 á\83\98á\83¡ á\83\93á\83\90á\83¨á\83\95á\83\94á\83\91á\83£á\83\9aá\83\98',
 'pageinfo-views' => 'ხილვების რაოდენობა',
 'pageinfo-watchers' => 'გვერდის დამკვირვებელთა რაოდენობა',
 'pageinfo-few-watchers' => 'სულ მცირე $1 {{PLURAL:$1|დამკვირვებელი|დამკვირვებელი}}',
index 7e58199..649567c 100644 (file)
@@ -2700,7 +2700,7 @@ $1',
 'contributions' => '{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm}} $1 {{GENDER:$1|singe|singe|singe|iere|singe}} Beidräch',
 'contributions-title' => 'Beidräsch fum  $1',
 'mycontris' => 'Beidrähch',
-'contribsub2' => 'För dä Metmaacher: $1 ($2)',
+'contribsub2' => 'För {{GENDER:$3|dä|et|dä Metmaacher|de|dat}} $1: $1 ($2)',
 'nocontribs' => 'Mer han kein Änderunge jefonge, en de Logböcher, die do passe däte.',
 'uctop' => '(Neuste)',
 'month' => 'un Moohnt:',
index 080d942..1cf830a 100644 (file)
@@ -567,7 +567,7 @@ Ufro: $2',
 'viewsource' => 'Quelltext kucken',
 'viewsource-title' => 'Quelltext vun der Säit $1 weisen',
 'actionthrottled' => 'Dës Aktioun gouf gebremst',
-'actionthrottledtext' => 'Fir géint de Spam virzegoen, ass dës Aktioun esou programméiert datt Dir se an enger kuerzer Zäit nëmme limitéiert dacks maache kënnt. Dir hutt dës Limite iwwerschratt. Versicht et w.e.g. an e puer Minutten nach eng Kéier.',
+'actionthrottledtext' => 'Fir géint de Spam virzegoen, ass dës Aktioun sou programméiert datt Dir se an enger kuerzer Zäit nëmme limitéiert dacks maache kënnt. Dir hutt dës Limite iwwerschratt. Versicht et w.e.g. an e puer Minutten nach eng Kéier.',
 'protectedpagetext' => 'Dës Säit ass fir Ännerungen an aner Aktioune gespaart.',
 'viewsourcetext' => 'Dir kënnt de Quelltext vun dëser Säit kucken a kopéieren:',
 'viewyourtext' => "Dir kënnt de Quelltext vun '''Ären Ännerungen''' op dëser Säit kucken a kopéieren:",
@@ -604,7 +604,7 @@ Den Administrateur den d\'Schreiwe gespaart huet, huet dës Erklärung uginn: "$
 # Login and logout pages
 'logouttext' => "'''Dir sidd elo ausgeloggt.'''
 
-Opgepasst: Op verschiddene Säite kann et nach esou aus gesinn, wéi wann Dir nach ageloggt wiert, bis Dir Ärem Browser säin Tëschespäicher (cache) eidel maacht.",
+Opgepasst: Op verschiddene Säite kann et nach sou aus gesinn, wéi wann Dir nach ageloggt wiert, bis Dir Ärem Browser säin Tëschespäicher (cache) eidel maacht.",
 'welcomeuser' => 'Wëllkomm $1!',
 'welcomecreation-msg' => "Äre Benotzerkont gouf ugeluecht.
 Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'änneren",
@@ -710,7 +710,7 @@ Mellt Iech w.e.g. domat un, soubal Dir et kritt hutt.',
 '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}} 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.",
+Fir de Mëssbrauch vun dëser Funktioun ze verhënneren kann nëmmen all {{PLURAL:$1|Stonn|$1 Stonnen}} sou 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.',
@@ -735,7 +735,7 @@ Wann dëse Benotzerkont ongewollt ugeluecht gouf, kënnt Dir dës Noriicht einfa
 Waart w.e.g. $1 ier Dir et nach eng Kéier probéiert.',
 'login-abort-generic' => 'Dir sidd net ageloggt - Aloggen ofgebrach',
 'loginlanguagelabel' => 'Sprooch: $1',
-'suspicious-userlogout' => 'Är Ufro fir Iech auszeloggen gouf refuséiert well et esou ausgesäit wéi wann se vun engem Futtise Browser oder Proxy-Tëschespäicher kënnt.',
+'suspicious-userlogout' => 'Är Ufro fir Iech auszeloggen gouf refuséiert well et sou ausgesäit wéi wa se vun engem Futtise Browser oder Proxy-Tëschespäicher kënnt.',
 'createacct-another-realname-tip' => "De richtegen Numm ass fakultativ.
 
 Wann Dir en ugitt, gëtt e benotzt fir d'Benotzerattributiounen fir Är Aarbecht zouzeuerdnen.",
@@ -895,7 +895,7 @@ Gitt dës Donnéeë w.e.g bei allen Ufroen zu dëser Spär un.',
 'whitelistedittext' => 'Dir musst Iech $1, fir Säiten änneren ze kënnen.',
 'confirmedittext' => 'Dir musst är E-Mail-Adress confirméieren, ier Dir Ännerunge maache kënnt.
 Gitt w.e.g. eng E-Mailadrss a validéiert se op äre [[Special:Preferences|Benotzerastellungen]].',
-'nosuchsectiontitle' => 'Et gëtt keen esou en Abschnitt',
+'nosuchsectiontitle' => 'Et gëtt kee sou en Abschnitt',
 'nosuchsectiontext' => "Dir hutt versicht en Abschnitt z'änneren deen et net gëtt.
 Et ka sinn datt e geännert oder geläscht gouf iwwerdeems wou Dir d'Säit gekuckt hutt.",
 'loginreqtitle' => 'Umeldung néideg',
@@ -912,7 +912,7 @@ Sou eng IP Adress ka vun e puer Benotzer gedeelt ginn.
 Wann Dir en anonyme Benotzer sidd an Dir irrelevant Bemierkunge krut, [[Special:UserLogin/signup|maacht w.e.g. e Kont op]] oder [[Special:UserLogin|loggt Iech an]], fir weider Verwiesselunge mat aneren anonyme Benotzer ze verhënneren.''",
 'noarticletext' => 'Dës Säit huet momentan keen Text.
 Dir kënnt op anere Säiten no [[Special:Search/{{PAGENAME}}|dësem Säitentitel sichen]],
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an den entspriechende Logbicher nokucken] oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} esou eng Säit uleeën]</span>.',
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an den entspriechende Logbicher nokucken] oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} sou eng Säit uleeën]</span>.',
 'noarticletext-nopermission' => 'Elo ass keen Text op dëser Säit.
 Dir kënnt op anere Säiten [[Special:Search/{{PAGENAME}}|no dësem Säitentitel sichen]], oder <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an de Logbicher sichen]</span>, mä Dir hutt net déi néideg Rechter fir dës Säit unzeleeën.',
 'missing-revision' => 'D\'Versioun #$1 vun der Säit mam Numm "{{PAGENAME}}" gëtt et net.
@@ -987,7 +987,7 @@ Dir kënnt den Text kopéieren an an een Textfichier drasetzen an deen ofspäich
 
 Den Administrateur den d'Datebank gespaart huet, huet dës Erklärung ginn: $1",
 'protectedpagewarning' => "'''OPGEPASST: Dës Säit gouf gespaart a kann nëmme vun engem Administrateur geännert ginn.''' Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
-'semiprotectedpagewarning' => "'''Bemierkung:''' Dës Säit gouf esou gespaart, datt nëmme ugemellt Benotzer s'ännere kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
+'semiprotectedpagewarning' => "'''Bemierkung:''' Dës Säit gouf sou gespaart, datt nëmme ugemellt Benotzer s'ännere kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
 'cascadeprotectedwarning' => "'''Opgepasst:''' Dës Säit gouf gespaart a kann nëmme vu Benotzer mat Administreursrechter geännert ginn. Si ass an dës {{PLURAL:$1|Säit|Säiten}} agebonnen, déi duerch Cascadespäroptioun gespaart {{PLURAL:$1|ass|sinn}}:'''",
 'titleprotectedwarning' => "'''OPGEPASST: Dës Säit gouf gespaart sou datt [[Special:ListGroupRights|spezifesch Rechter]] gebraucht gi fir se uleeën ze kënnen.''' Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
 'templatesused' => '{{PLURAL:$1|Schabloun|Schablounen}} déi op dëser Säit am Gebrauch sinn:',
@@ -1047,7 +1047,7 @@ Et däerfen net méi wéi $2 {{PLURAL:$2|Ufro|Ufroe}} sinn, aktuell {{PLURAL:$2|
 'converter-manual-rule-error' => 'An der Regel iwwer déi manuell Ëmwandlung vun der Sprooch gouf e Feeler fonnt',
 
 # "Undo" feature
-'undo-success' => "D'Ännerung gëtt réckgängeg gemaach. Iwwerpréift w.e.g. de Verglach ënnendrënner fir nozekuckeen ob et esou richteg ass, duerno späichert w.e.g d'Ännerungen of, fir dës Aktioun ofzeschléissen.",
+'undo-success' => "D'Ännerung gëtt réckgängeg gemaach. Iwwerpréift w.e.g. de Verglach ënnendrënner fir nozekuckeen ob et sou richteg ass, duerno späichert w.e.g d'Ännerungen of, fir dës Aktioun ofzeschléissen.",
 'undo-failure' => "D'Ännerung konnt net réckgängeg gemaach ginn, wëll de betraffenen Abschnitt an der Tëschenzäit geännert gouf.",
 'undo-norev' => "D'Ännerung kann net zréckgesat ginn, well et se net gëtt oder well se scho geläscht ass.",
 'undo-summary' => 'Ännerung $1 vu(n) [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) annulléieren.',
@@ -1510,7 +1510,7 @@ Dës Informatioun ass ëffentlech.",
 'right-suppressrevision' => 'Virun den Administrateure verstoppte Versiounen nokucken a restauréieren',
 'right-suppressionlog' => 'Privat Lëschte kucken',
 'right-block' => 'Aner Benotzer fir Ännerunge spären',
-'right-blockemail' => 'E Benotzer spären esou datt hie keng Maile verschécke kann',
+'right-blockemail' => 'E Benotzer späre sou datt hie keng Maile verschécke kann',
 'right-hideuser' => 'E Benotzernumm spären, an deem e virun der Ëffentlechkeet verstoppt gëtt',
 'right-ipblock-exempt' => 'Ausname vun IP-Spären, automatesche Spären a vu Späre vu Plage vun IPen',
 'right-proxyunbannable' => 'Automatesche Proxyspären ëmgoen',
@@ -2032,7 +2032,7 @@ Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
 'doubleredirects' => 'Duebel Viruleedungen',
 'doubleredirectstext' => 'Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.
 An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun der zweeter Viruleedung, déi normalerweis déi "richteg" Zilsäit ass, op déi déi éischt Viruleedung hilinke soll.
-<del>Duerchgestrachen</del> Linke goufe schonn esou verännert datt déi duebel Viruleedung opgeléist ass.',
+<del>Duerchgestrachen</del> Linke goufe scho sou verännert datt déi duebel Viruleedung opgeléist ass.',
 'double-redirect-fixed-move' => '[[$1]] gouf geréckelt, et ass elo eng Viruleedung op [[$2]]',
 'double-redirect-fixed-maintenance' => 'Flécke vun der duebeler Viruleedung vu(n) [[$1]] op [[$2]].',
 'double-redirect-fixer' => 'Verbesserung vu Viruleedungen',
@@ -2073,7 +2073,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'wantedpages' => 'Gewënscht Säiten',
 'wantedpages-badtitle' => 'Net valabelen Titel am Resultat: $1',
 'wantedfiles' => 'Gewënscht Fichieren',
-'wantedfiletext-cat' => 'Dës Fichiere gi benotzt awer et gëtt se net. Fichiere aus frieme Repositorie kënnen hei gewise ginn och wann et se gëtt. All esou falsch Positiver ginn <del>duerchgestrach</del>. Zousätzlech gi Säiten an deene Fichieren dra sinn déi et net gëtt op [[:$1]] gewisen.',
+'wantedfiletext-cat' => 'Dës Fichiere gi benotzt awer et gëtt se net. Fichiere aus frieme Repositorie kënnen hei gewise ginn och wann et se gëtt. All sou falsch Positiver ginn <del>duerchgestrach</del>. Zousätzlech gi Säiten an deene Fichieren dra sinn déi et net gëtt op [[:$1]] gewisen.',
 'wantedfiletext-nocat' => 'Dës Fichiere gi benotzt existéieren awer net. Fichieren aus frieme Repertoiren kënnen trotzdeem opgelëscht ginn. All dës positiv Fichiere ginn <del>duergestrach</del>.',
 'wantedtemplates' => 'Gewënscht Schablounen',
 'mostlinked' => 'Dacks verlinkt Säiten',
@@ -2092,7 +2092,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'protectedpages' => 'Gespaart Säiten',
 'protectedpages-indef' => 'Nëmme onbegrenzt-gespaarte Säite weisen',
 'protectedpages-cascade' => 'Nëmme Säiten déi duerch Kaskade gespaart sinn',
-'protectedpagestext' => 'Dës Säite si gespaart esou datt si weder geännert nach geréckelt kënne ginn',
+'protectedpagestext' => 'Dës Säite si gespaart sou datt si weder geännert nach geréckelt kënne ginn',
 'protectedpagesempty' => 'Elo si keng Säite mat dëse Parameteren gespaart.',
 'protectedtitles' => 'Gespaarten Titel',
 'protectedtitlestext' => 'Dës Titele si gespaart an et ka keng Säit mat deenen Titelen ugeluecht ginn',
@@ -2370,7 +2370,7 @@ W.e.g. confirméiert, datt Dir dëst wierklech wëllt, datt Dir d'Konsequenze ve
 ** Vandalismus',
 'delete-edit-reasonlist' => 'Läschgrënn änneren',
 'delete-toobig' => "Dës Säit huet e laangen Historique, méi wéi $1 {{PLURAL:$1|Versioun|Versiounen}}.
-D'Läsche vun esou Säite gouf limitéiert fir ongewollte Stéierungen op {{SITENAME}} ze verhënneren.",
+D'Läsche vu sou Säite gouf limitéiert fir ongewollte Stéierungen op {{SITENAME}} ze verhënneren.",
 'delete-warning-toobig' => "Dës Säit huet eng laang Versiounsgeschicht, méi wéi $1 {{PLURAL:$1|Versioun|Versiounen}}.
 D'Läschen dovu kann zu Stéierungen am Fonctionnement vun {{SITENAME}} féieren;
 dës Aktioun soll mat Virsiicht gemaach ginn.",
@@ -2479,7 +2479,7 @@ Fir nëmmen eng bestëmmte Versioun vun der Säit ze restauréieren, markéiert
 'undeletehistory' => 'Wann Dir dës Säit restauréiert, ginn och all déi al Versioune restauréiert.
 Wann zanter dem Läschen eng nei Säit mat dem selwechten Numm ugeluecht gouf, ginn déi restauréiert Versioune chronologesch an den Historique agedroen.',
 'undeleterevdel' => "D'Restauratioun gëtt net gemaach wann dëst dozou féiert datt déi aktuell Versioun vun der Säit oder vum Fichier deelweis geläscht gëtt.
-An esou Fäll däerf déi neiste Versioun net markéiert ginn oder déi neiste geläschte Versioun muss nees ugewise ginn.",
+A sou Fäll däerf déi neiste Versioun net markéiert ginn oder déi neiste geläschte Versioun muss nees ugewise ginn.",
 'undeletehistorynoadmin' => "Dës Säit gouf geläscht. De Grond fir d'Läsche gesitt der ënnen, zesumme mat der Iwwersiicht vun den eenzele Versioune vun der Säit an hiren Auteuren. Déi verschidden Textversioune kënnen awer just vun Administrateure gekuckt a restauréiert ginn.",
 'undelete-revision' => 'Geläschte Versioun vu(n) $1 (Versioun vum $4 um $5 Auer) vum $3:',
 'undeleterevision-missing' => "Ongëlteg oder Versioun déi feelt. Entweder ass de Link falsch oder d'Versioun gouf aus dem Archiv restauréiert oder geläscht.",
@@ -2501,7 +2501,7 @@ Am [[Special:Log/delete|Läsch-Logbuch]] fannt Dir déi geläscht a restauréier
 'undelete-header' => 'Kuckt [[Special:Log/delete|Läschlescht]] fir rezent geläscht Säiten.',
 'undelete-search-title' => 'Geläscht Säite sichen',
 'undelete-search-box' => 'Sichen no geläschte Säiten',
-'undelete-search-prefix' => 'Weis Säiten déi esou ufänken:',
+'undelete-search-prefix' => 'Weis Säiten déi sou ufänken:',
 'undelete-search-submit' => 'Sichen',
 'undelete-no-results' => 'Et goufen am Archiv keng Säite fonnt déi op är Sich passen.',
 'undelete-filename-mismatch' => "D'Dateiversioun vum $1 konnt net restauréiert ginn: De Fichier gouf net fonnt.",
@@ -2601,7 +2601,7 @@ $1',
 'ipbotherreason' => 'Aneren oder zousätzleche Grond:',
 'ipbhidename' => 'Benotzernumm op Lëschten a bei Ännerunge verstoppen',
 'ipbwatchuser' => 'Dësem Benotzer seng Benotzer- an Diskussiouns-Säit iwwerwaachen',
-'ipb-disableusertalk' => "Dëse Benotzer dorun hënnere fir seng eegen Diskussiounssäit z'änneren esou laang wéi et gespaart ass",
+'ipb-disableusertalk' => "Dëse Benotzer dorun hënnere fir seng eegen Diskussiounssäit z'ännere sou laang wéi et gespaart ass",
 'ipb-change-block' => 'De Benotzer mat dese Parameteren nees spären',
 'ipb-confirm' => 'Spär confirméieren',
 'badipaddress' => "D'IP-Adress huet dat falscht Format.",
@@ -2691,7 +2691,7 @@ Si ass awer als Deel vun der Rei $2 gespaart, an dës Spär kann opgehuewe ginn.
 'sorbsreason' => 'Är IP Adress steet als oppene Proxy an der schwaarzer Lëscht (DNSBL) déi vu {{SITENAME}} benotzt gëtt.',
 'sorbs_create_account_reason' => 'Är IP-Adress steet als oppene Proxy an der schwaarzer Lëscht déi op {{SITENAME}} benotzt gëtt. DIr kënnt keen neie Benotzerkont opmaachen.',
 'xffblockreason' => 'Eng IP-Adress am X-Forwarded-For-Header gouf gespaart, entweder Är oder déi vum Proxyserver deen Dir benotzt. De Grond vun der Spär war: $1',
-'cant-block-while-blocked' => 'Dir däerft keng aner Benotzer spären, esou lang wéi dir selwer gespaart sidd.',
+'cant-block-while-blocked' => 'Dir däerft keng aner Benotzer spären, sou lang wéi Dir selwer gespaart sidd.',
 'cant-see-hidden-user' => "De Benotzer deen Dir versicht ze spären ass scho gespaart a verstoppt. Well Dir d'Recht ''Hideuser'' net hutt kënnt Dir dëse Benotzer net gesinn an dem Benotzer seng Spär net änneren.",
 'ipbblocked' => 'Dir kënnt keng aner Benotzer spären oder hir Spär ophiewen well Dir selwer gespaart sidd',
 'ipbnounblockself' => 'Dir kënnt Är Spär net selwer ophiewen',
@@ -2805,8 +2805,8 @@ Wëll Dir se läsche fir d\'Réckelen ze erméiglechen?',
 'imageinvalidfilename' => 'Den Numm vum Zil-Fichier ass ongëlteg',
 'fix-double-redirects' => 'All Viruleedungen déi op den Originaltitel weisen aktualiséieren',
 'move-leave-redirect' => 'Viruleedung uleeën',
-'protectedpagemovewarning' => "'''OPGEPASST:''' Dës Säit gouf gespaart esou datt nëmme Benotzer mat Administreurs-Rechter se réckele kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
-'semiprotectedpagemovewarning' => "'''OPGEPASST:''' Dës Säit gouf gespaart esou datt nëmme konfirméiert Benotzer se réckele kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
+'protectedpagemovewarning' => "'''OPGEPASST:''' Dës Säit gouf gespaart sou datt nëmme Benotzer mat Administreursrechter se réckele kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
+'semiprotectedpagemovewarning' => "'''OPGEPASST:''' Dës Säit gouf gespaart sou datt nëmme confirméiert Benotzer se réckele kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
 'move-over-sharedrepo' => '== De Fichier gëtt et ==
 [[:$1]] gëtt et op engem gedeelte Repertoire. Wann dir e Fichier op dësen Titel réckelt dann ass dee gedeelte Fichier net méi accessibel.',
 'file-exists-sharedrepo' => 'Den Numm vum Fichier deen dir erausgesicht hutt gëtt schonn op engem gemeinsame Repertoire benotzt.
@@ -3144,7 +3144,7 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
 'file-info-png-repeat' => 'gouf $1 {{PLURAL:$1|mol|mol}} gespillt',
 'file-info-png-frames' => '$1 {{PLURAL:$1|Frame|Framen}}',
 'file-no-thumb-animation' => "''''Informatioun: Wéinst technesche Limitatioune sinn d'Miniatur-Biller vun dësem Fichier net animéiert.'''",
-'file-no-thumb-animation-gif' => "'''Hiweis:Aus technesche Grënn gi Miniature mat enger héijer Opléisung vu GIF Biller, esou wéi dëst, net animéiert.'''",
+'file-no-thumb-animation-gif' => "'''Hiweis: Aus technesche Grënn gi Miniature mat enger héijer Opléisung vu GIF Biller, sou wéi dëst, net animéiert.'''",
 
 # Special:NewFiles
 'newimages' => 'Gallerie vun den neie Biller',
@@ -3548,7 +3548,7 @@ Déi aner sinn am Standard verstoppt.
 
 'exif-objectcycle-a' => 'Nëmme moies',
 'exif-objectcycle-p' => 'Nëmmen owes',
-'exif-objectcycle-b' => 'Esouwuel moies wéi owes',
+'exif-objectcycle-b' => 'Souwuel moies wéi owes',
 
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Tatsächlech Richtung',
@@ -3604,7 +3604,7 @@ Déi aner sinn am Standard verstoppt.
 # Email address confirmation
 'confirmemail' => 'E-Mailadress confirméieren',
 'confirmemail_noemail' => 'Dir hutt keng gëlteg E-Mail-Adress an Äre [[Special:Preferences|Benotzerastellungen]] agedro.',
-'confirmemail_text' => "Ier Dir d'E-Mailfunktioune vun {{SITENAME}} benotze kënnt musst dir als éischt Är E-Mail-Adress confirméieren. Dréckt w.e.g. de Knäppchen hei ënnendrënner fir eng Confirmatiouns-E-Mail op déi Adress ze schécken déi Dir uginn hutt. An där E-Mail steet e Link mat engem Code, deen dir dann an Ärem Browser opmaache musst fir esou ze bestätegen, datt Är Adress och wierklech existéiert a valabel ass.",
+'confirmemail_text' => "Ier Dir d'E-Mailfunktioune vun {{SITENAME}} benotze kënnt musst Dir als éischt Är E-Mail-Adress confirméieren. Dréckt w.e.g. de Knäppchen hei ënnendrënner fir eng Confirmatiouns-E-Mail op déi Adress ze schécken déi Dir uginn hutt. An där E-Mail steet e Link mat engem Code, deen dir dann an Ärem Browser opmaache musst fir sou ze bestätegen, datt Är Adress och wierklech existéiert a valabel ass.",
 'confirmemail_pending' => 'Dir krut schonn e Confirmatiouns-Code per E-Mail geschéckt. Wenn Dir Äre Benotzerkont eréischt elo kuerz opgemaach hutt, da gedëllegt Iech nach e puer Minutten bis Är E-Mail ukomm ass, ier Dir een neie Code ufrot.',
 'confirmemail_send' => 'Confirmatiouns-E-Mail schécken',
 'confirmemail_sent' => 'Confirmatiouns-E-Mail gouf geschéckt.',
@@ -3769,7 +3769,7 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
 'version-poweredby-others' => 'anerer',
 'version-poweredby-translators' => 'translatewiki.net Iwwersetzer',
 'version-credits-summary' => "Mir soen dëse Persoune 'Merci' fir hir Mataarbecht u [[Special:Version|MediaWiki]].",
-'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënner de Bedingunge vun der GNU-General Public License esou wéi se vun der Free Softare Foundation publizéiert ass; entweder ënner der Versioun 2 vun der Lizenz, oder (no Ärem Choix) enger spéiderer Versioun.
+'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënner de Bedingunge vun der GNU-General Public License sou wéi se vun der Free Softare Foundation publizéiert ass; entweder ënner der Versioun 2 vun der Lizenz, oder (no Ärem Choix) enger spéiderer Versioun.
 
 MediaWiki gëtt verdeelt an der Hoffnung datt se nëtzlech ass, awer OUNI IERGENDENG GARANTIE; ouni eng implizit Garantie vu Commercialisatioun oder Eegnung fir e bestëmmte Gebrauch. Kuckt d'GPL General Public License fir méi Informatiounen.
 
@@ -3828,14 +3828,14 @@ Dir misst eng [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun der GNU General Public
 'intentionallyblankpage' => 'Dës Säit ass absichtlech eidel. Si gëtt fir Benchmarking an Ähnleches benotzt.',
 
 # External image whitelist
-'external_image_whitelist' => "#Dës Zeil genee esou loosse wéi se ass<pre>
+'external_image_whitelist' => "#Dës Zeil genee sou loosse wéi se ass<pre>
 #Schreift hei ënnendrënner Fragmenter vu regulären Ausdréck (just den Deel zwëscht den // aginn)
 #Dës gi mat den URLe vu Biller aus externe Quelle verglach
 #Wann d'Resultat positiv ass, gëtt d'Bild gewisen, soss gëtt d'Bild just als Link gewisen
 #Zeilen, déi mat engem # ufänken, ginn als Bemierkung behandelt
 #Et gëtt en Ënnerscheed tëscht groussen a klenge Buschtawe gemaach
 
-#All regulär Ausdréck ënner dëser Zeil androen. Dës Zeil genee esou loosse wéi se ass</pre>",
+#All regulär Ausdréck ënner dëser Zeil androen. Dës Zeil genee sou loosse wéi se ass</pre>",
 
 # Special:Tags
 'tags' => 'Valabel Ännerungsmarkéierungen',
index 877054d..d763ea8 100644 (file)
@@ -96,6 +96,7 @@ $messages = array(
 'tog-showhiddencats' => 'Rādīt slēptās kategorijas',
 'tog-norollbackdiff' => 'Neņemt vērā atšķirības, veicot atriti',
 'tog-useeditwarning' => 'Brīdināt mani, kad es atstāju lapas rediģēšanu nesaglabājot izmaiņas',
+'tog-prefershttps' => 'Vienmēr izmantot drošu savienojumu pēc pieslēgšanās',
 
 'underline-always' => 'vienmēr',
 'underline-never' => 'Nekad',
@@ -479,6 +480,7 @@ Vari turpināt to izmantot anonīmi, vari <span class='plainlinks'>[$1 atgriezti
 'gotaccountlink' => 'Dodies iekšā',
 'userlogin-resetlink' => 'Esat aizmirsis savu pieslēgšanās informāciju?',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Palīdzība ar pieslēgšanos]]',
+'userlogin-createanother' => 'Izveidot citu kontu',
 'createacct-join' => 'Ievadiet savu informāciju zemāk.',
 'createacct-another-join' => 'Ievadiet jaunā konta informāciju zemāk.',
 'createacct-emailrequired' => 'E-pasta adrese',
@@ -572,9 +574,11 @@ Lūdzu, uzgaidiet $1 pirms mēģiniet vēlreiz.',
 'resetpass-wrong-oldpass' => 'Nepareiza pagaidu vai galvenā parole.
 Tu jau esi veiksmīgi nomainījis savu galveno paroli, vai arī esi pieprasījis jaunu pagaidu paroli.',
 'resetpass-temp-password' => 'Pagaidu parole:',
+'resetpass-abort-generic' => 'Paroles nomaiņu pārtrauca paplašinājums.',
 
 # Special:PasswordReset
 'passwordreset' => 'Paroles atiestatīšana',
+'passwordreset-text-one' => 'Aizpildiet šo veidlapu, lai atiestatītu savu paroli.',
 'passwordreset-legend' => 'Atiestatīt paroli',
 'passwordreset-disabled' => 'Paroles atiestates šajā viki ir atspējotas.',
 'passwordreset-username' => 'Lietotājvārds:',
@@ -1309,7 +1313,7 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 'rc_categories' => 'Ierobežot uz kategorijām (atdalīt ar "|")',
 'rc_categories_any' => 'Jebkas',
 'newsectionsummary' => '/* $1 */ jauna sadaļa',
-'rc-enhanced-expand' => 'Rādīt informāciju (nepieciešams JavaScript)',
+'rc-enhanced-expand' => 'Skatīt detaļas',
 'rc-enhanced-hide' => 'Paslēpt detaļas',
 'rc-old-title' => 'sākotnēji izveidota kā "$1 "',
 
@@ -3123,7 +3127,10 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'tags-tag' => 'Iezīmes nosaukums',
 'tags-display-header' => 'Izmainīto sarakstu izskats',
 'tags-description-header' => 'Nozīmes pilns apraksts',
+'tags-active-header' => 'Aktīvs?',
 'tags-hitcount-header' => 'Iezīmētās izmaiņas',
+'tags-active-yes' => 'Jā',
+'tags-active-no' => 'Nē',
 'tags-edit' => 'labot',
 'tags-hitcount' => '$1 {{PLURAL:$1|izmaiņa|izmaiņas}}',
 
@@ -3145,6 +3152,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 Šai vietnei ir radušās tehniskas problēmas.',
 'dberr-again' => 'Uzgaidiet dažas minūtes un pārlādējiet šo lapu.',
 'dberr-info' => '(Nevar sazināties ar datubāzes serveri: $1)',
+'dberr-info-hidden' => '(Nevar sazināties ar datubāzes serveri)',
 'dberr-usegoogle' => 'Pa to laiku Jūs varat izmantot Google meklēšanu.',
 'dberr-outofdate' => 'Ņemiet vērā, ka mūsu satura indeksācija var būt novecojusi.',
 'dberr-cachederror' => 'Šī ir lapas agrāk saglabātā kopija, tā var nebūt atjaunināta.',
@@ -3162,6 +3170,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'htmlform-selectorother-other' => 'Citi',
 'htmlform-no' => 'Nē',
 'htmlform-yes' => 'Jā',
+'htmlform-chosen-placeholder' => 'Izvēlieties iespēju',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 ar pilnteksta meklēšanas atbalstu',
@@ -3206,20 +3215,24 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'searchsuggest-containing' => 'Meklējamā frāze:',
 
 # API errors
+'api-error-badaccess-groups' => 'Jums nav atļauts augšupielādēt failus šajā wiki.',
 'api-error-copyuploaddisabled' => 'Augšupielāde no URL šajā serverī ir atspējota.',
 'api-error-filename-tooshort' => 'Faila nosaukums ir pārāk īss.',
 'api-error-filetype-banned' => 'Šis failu veids ir aizliegts.',
 'api-error-http' => 'Iekšēja kļūda: Nevar izveidot savienojumu ar serveri.',
+'api-error-mustbeloggedin' => 'Tev jāpieslēdzas, lai augšupielādētu failus.',
 'api-error-ok-but-empty' => 'Iekšēja kļūda: Nav atbildes no servera.',
 'api-error-timeout' => 'Serveris neatbildēja paredzētajā laikā.',
 'api-error-unclassified' => 'Nezināma kļūda.',
 'api-error-unknown-code' => 'Nezināma kļūda: " $1 "',
 'api-error-unknown-warning' => 'Nezināms brīdinājums: $1',
+'api-error-unknownerror' => 'Nezināma kļūda: "$1"',
 'api-error-uploaddisabled' => 'Augšupielāde šajā wiki  ir atslēgta.',
 
 # Limit report
 'limitreport-title' => 'Parsētāja profilēšanas dati:',
 'limitreport-postexpandincludesize-value' => '$1/$2 baiti',
-'limitreport-templateargumentsize-value' => '$1/$2 baiti',
+'limitreport-templateargumentsize' => 'Veidnes argumenta izmērs',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|baits|baiti}}',
 
 );
index 9df7763..ed3100a 100644 (file)
@@ -456,8 +456,8 @@ $messages = array(
 Возыметым нигӧлан пайдаланаш, тӧрлаташ ынет пу гын тышке тудым ит шыҥдаре.<br />
 Тыгак текстым шке возымо але тудым эрыкан вер гыч налме шотышто мутым пуэт.<br />
 '''АВТОР АЛЕ ТУДЫН ПРАВАМ АРАЛЫШЕ-ВЛАК ДЕЧ ЙОДДЕ МАТЕРИАЛЫМ ИТ ШЫҤДАРЕ!'''",
-'templatesused' => 'Тиде ÐºÑ\8bзÑ\8bÑ\82 Ñ\83лÑ\88о Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bÑ\88Ñ\82е ÐºÑ\83Ñ\87Ñ\8bлÑ\82мо {{PLURAL:$1|Ñ\8fмдÑ\8bлÑ\8bк|Ñ\8fмдÑ\8bлÑ\8bк-влак}}:',
-'templatesusedpreview' => 'Тиде Ð¾Ð½Ñ\87Ñ\8bлгоÑ\87 Ð¾Ð½Ñ\87Ñ\8bмаште кучылтмо {{PLURAL:$1|ямыдылык|ямдылык-влак}}:',
+'templatesused' => 'Тиде лаштыкыште кучылтмо {{PLURAL:$1|ямдылык|ямдылык-влак}}:',
+'templatesusedpreview' => 'Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bште кучылтмо {{PLURAL:$1|ямыдылык|ямдылык-влак}}:',
 'template-protected' => '(тӧрлаташ чарыме)',
 'template-semiprotected' => '(верын аралыме)',
 'hiddencategories' => 'Тиде лаштык $1 {{PLURAL:$1|шылтыме категорийыш|шылтыме категорийыш}} лектеш:',
@@ -860,7 +860,8 @@ $messages = array(
 'protect-text' => "Тыште тый '''$1''' лаштыкын шыгыремдымашыжым ончалаш да тӧрлаташ кертат.",
 'protect-locked-access' => "Тыйын лаштыкын шыгыремдымашыжым тӧрлаш кертмешет шагал.
 Ӱлнӧ '''$1''' лаштыкын кызытсе келыштарымаш.",
-'protect-cascadeon' => 'Тиде лаштыкым кыдалтше аралтышан {{PLURAL:$1|лаштыкыш, куштыжо|лаштык-влакыш, куштыжо}} пурымылан кӧра кызыт аралыме. Тый тиде лаштыкын шыгыремдымашыжым тӧрлатен кертат, тидын годым кылдалтше аралтыш огеш вашталт.',
+'protect-cascadeon' => 'Тиде лаштыкым тӧрлатымаш деч аралыме.  
+Каскадный аралымашан {{PLURAL:$1|лаштык-влак}} тудо пура.',
 'protect-default' => 'Чыла пайдаланыше-влаклан йӧным пуаш',
 'protect-fallback' => '«$1» кертеж кӱлеш',
 'protect-level-autoconfirmed' => 'Регистрацийым эртыдыме да у пайдаланыше-влак деч петыраш',
@@ -1023,7 +1024,7 @@ $messages = array(
 'tooltip-t-upload' => 'Файл-влакым пурташ',
 'tooltip-t-specialpages' => 'Лӱмын ыштыме лаштык-влак',
 'tooltip-t-print' => 'Савыкташлан келыштараш',
-'tooltip-t-permalink' => 'Тиде лаштык тӱрлыкыш эре улшо кылвер',
+'tooltip-t-permalink' => 'Тиде лашткыш кондышо кылвер (ссылка)',
 'tooltip-ca-nstab-main' => 'Лаштыкыште возымым ончыкташ',
 'tooltip-ca-nstab-user' => 'Пайдаланышын лаштыкшым ончалаш',
 'tooltip-ca-nstab-special' => 'Тиде лӱмын ыштыме лаштык, тудым тый тӧрлатен от керт',
@@ -1036,7 +1037,7 @@ $messages = array(
 'tooltip-preview' => 'Лаштыкым аралыме деч ончыч ончылгоч ончал!',
 'tooltip-diff' => 'Ончыкташ, могай тӧрлатымашым тый ыштенат.',
 'tooltip-compareselectedversions' => 'Кок ойырымо лаштык версийын ойыртемым ончалаш.',
-'tooltip-watch' => 'Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм Ñ\82Ñ\8bйÑ\8bн Ñ\8dÑ\81кеÑ\80Ñ\8bме-влак Ð»Ó±Ð¼ÐµÑ\80Ñ\8bÑ\88 ешараш',
+'tooltip-watch' => 'Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм Ñ\8dÑ\81кеÑ\80Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bÑ\88кеÑ\82 ешараш',
 'tooltip-rollback' => '"Пӧртылаш" ик темдалтыш дене пытартыш пайдаланышын тӧрлатымашым мӧҥгешла пӧртылеш',
 'tooltip-undo' => '"Чараш" тиде тӧрлатымашым мӧҥгешла пӧртыла да ончылгоч ончымашым почеш.
 Тый тӧрлатымаш амалже нерген возымо верыште  возын кертат.',
index a076760..ba3b133 100644 (file)
@@ -769,10 +769,10 @@ o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}
 'missing-revision' => "La revision nùmer $1 dla pàgina antitolà «{{PAGENAME}}» a esist pa.
 
 Sòn a l'é normalment causà da l'andèje dapress a na vej liura stòrica a na pàgina ch'a l'é stàita scancelà. Ij detaj a peulo esse trovà ant ël [registr ëd jë scancelament ëd {{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
-'userpage-userdoesnotexist' => 'Lë stranòm "<nowiki>$1</nowiki>" a l\'é pa registrà. Për piasì ch\'a varda se da bon a veul creé/modifiché sta pàgina.',
-'userpage-userdoesnotexist-view' => 'Ël cont utent "$1" a l\'é pa registrà.',
+'userpage-userdoesnotexist' => "Lë stranòm «<nowiki>$1</nowiki>» a l'é pa registrà. Për piasì ch'a varda se da bon a veul creé o modifiché costa pàgina.",
+'userpage-userdoesnotexist-view' => "Ël cont utent «$1» a l'é pa registrà.",
 'blocked-notice-logextract' => "S'utent a l'é al moment blocà.
-'Me arferiment, sì-sota a-i é la dariera anotassion da l'argistr dij blocagi.",
+'Me arferiment, sì-sota a-i é la dariera anotassion da l'argistr dij blocagi:",
 'clearyourcache' => "'''Nòta:''' na vira che a l'ha salvà, a peul esse che a-j fasa da manca ëd passé via la memorisassion ëd sò programa ëd navigassion për podèj ës-ciairé le modìfiche.
 * '''Firefox / Safari:''' Che a ten-a sgnacà ''Majùscole'' antramentre che a sgnaca col rat ansima a ''Agiorné'', ò pura che a sgnaca tut ansema ''Ctrl-F5'' o ''Cmd-R'' (''*'' ansima ai Mac);
 * '''Google Chrome:''' Che a sgnaca ''Ctrl-Shift-R'' (''*-Majùscole-R'' ansima ai Mac);
@@ -1390,6 +1390,7 @@ Costa anformassion a sarà pùblica.",
 'right-editmywatchlist' => "Modifiché la lista ëd lòn ch'as ten sot-euj. Ch'a nòta che chèiche assion a giontran ancora dle pàgine sensa 's drit.",
 'right-viewmyprivateinfo' => "Vëdde ij sò dàit përsonaj (pr'esempi adrëssa ëd pòsta eletrònica, nòm ver)",
 'right-editmyprivateinfo' => "Modifiché ij sò dàit privà (pr'esempi adrëssa ëd pòsta eletrònica, nòm ver)",
+'right-editmyoptions' => 'Modifiché ij sò gust',
 'right-rollback' => "Gavé an pressa le modìfiche ëd l'ùltim utent che a l'ha modificà na pàgina particolar",
 'right-markbotedits' => "Marché le modìfiche tirà andré com modìfiche d'un trigomiro",
 'right-noratelimit' => "Nen esse tocà dal lìmit d'assion",
@@ -1441,8 +1442,8 @@ Costa anformassion a sarà pùblica.",
 'action-block' => 'bloché cost utent-sì a modifiché',
 'action-protect' => 'cambié ij livej ëd protession për sta pàgina-sì',
 'action-rollback' => "gavé an pressa le modìfiche ëd l'ùltim utent che a l'ha modificà na pàgina particolar",
-'action-import' => "amporté costa pàgina da n'àutra wiki",
-'action-importupload' => "amporté costa pàgina da n'archivi carià",
+'action-import' => "amporté dle pàgine da n'àutra wiki",
+'action-importupload' => "amporté dle pàgine da n'archivi carià",
 'action-patrol' => "marché la modìfica dj'àutri com verificà",
 'action-autopatrol' => 'avèj soe modìfiche marcà com verificà',
 'action-unwatchedpages' => 'vardé la lista dle pàgine che gnun a ten sot-euj',
@@ -1451,12 +1452,19 @@ Costa anformassion a sarà pùblica.",
 'action-userrights-interwiki' => "modifiché ij drit ëd j'utent ansima a d'àutre wiki",
 'action-siteadmin' => 'bloché o dësbloché la base ëd dàit',
 'action-sendemail' => 'mandé dij mëssage an pòsta eletrònica',
+'action-editmywatchlist' => "modifiché la lista ëd la ròba ch'as ten sot-euj",
+'action-viewmywatchlist' => "vëdde la lista ëd la ròba ch'as ten sot-euj",
+'action-viewmyprivateinfo' => 'vëdde soe anformassion përsonaj',
+'action-editmyprivateinfo' => 'modifiché soe anformassion përsonaj',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modìfica|modìfiche}}',
+'enhancedrc-since-last-visit' => "$1 {{PLURAL:$1|da l'ùltima visita}}",
+'enhancedrc-history' => 'stòria',
 'recentchanges' => 'Ùltime modìfiche',
 'recentchanges-legend' => "Opsion dj'ùltime modìfiche",
 'recentchanges-summary' => 'An costa pàgina as ten cont dle modìfiche pì recente a la wiki.',
+'recentchanges-noresult' => 'Gnun-e modìfiche corëspondente a costi criteri ant ël perìod dàit.',
 'recentchanges-feed-description' => 'Trassé le modìfiche dla wiki pì davzin-e ant ël temp an cost fluss.',
 'recentchanges-label-newpage' => "Sta modìfica-sì a l'ha creà na neuva pàgina",
 'recentchanges-label-minor' => "Costa a l'é na modìfica cita",
@@ -1484,7 +1492,7 @@ Costa anformassion a sarà pùblica.",
 'rc_categories_any' => 'Qualsëssìa',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|byte}} apress ij cambi',
 'newsectionsummary' => '/* $1 */ session neuva',
-'rc-enhanced-expand' => 'Mostré ij detaj (a-i é da manca ëd JavaScript)',
+'rc-enhanced-expand' => 'Mostré ij detaj',
 'rc-enhanced-hide' => 'Stërmé ij detaj',
 'rc-old-title' => 'originalment creà com "$1"',
 
@@ -1504,7 +1512,7 @@ Le pàgine dzora a [[Special:Watchlist|la lista ëd lòn ch'as ten sot-euj]] a r
 'reuploaddesc' => "Chité e torné al formolari për carié dj'archivi",
 'upload-tryagain' => "Mandé la descrission ëd l'archivi modificà",
 'uploadnologin' => 'Nen rintrà ant ël sistema',
-'uploadnologintext' => "A dev [[Special:UserLogin|rintré ant ël sistema]] për podèj carié dj'archivi.",
+'uploadnologintext' => "A dev $1 për podèj carié dj'archivi.",
 'upload_directory_missing' => 'Ël repertòri ëd caria ($1) a-i é nen e a peul pa esse creà dal servent.',
 'upload_directory_read_only' => "Ël servent ëd l'aragnà a-i la fa nen a scrive ansima a la diretris ëd càrich ($1).",
 'uploaderror' => 'Eror dëmentré che as cariava',
@@ -1751,8 +1759,7 @@ Për na sicurëssa otimal, img_auth.php a l'é disabilità.",
 'upload_source_file' => "(n'archivi da sò ordinator)",
 
 # Special:ListFiles
-'listfiles-summary' => "Sta pàgina special-sì a smon tuti j'archivi ch'a son ëstàit carià.
-Quand a l'é filtrà da l'utent, a son mostrà mach j'archivi anté che l'utent a l'ha carià la version pi neuva dl'archivi.",
+'listfiles-summary' => "Sta pàgina special-sì a smon tuti j'archivi ch'a son ëstàit carià.",
 'listfiles_search_for' => "Arserché un nòm d'archivi multimojen:",
 'imgfile' => 'archivi',
 'listfiles' => "Lista d'archivi",
@@ -1763,6 +1770,10 @@ Quand a l'é filtrà da l'utent, a son mostrà mach j'archivi anté che l'utent
 'listfiles_size' => 'Amzura an otet',
 'listfiles_description' => 'Descrission',
 'listfiles_count' => 'Version',
+'listfiles-show-all' => 'Anclude le veje version ëd le plance',
+'listfiles-latestversion' => 'Version corenta',
+'listfiles-latestversion-yes' => 'É',
+'listfiles-latestversion-no' => 'Nò',
 
 # File description page
 'file-anchor-link' => 'Archivi',
@@ -1859,6 +1870,13 @@ Ch'as visa ëd controlé che në stamp a-j serva nen a dj'àutri stamp anans che
 'randompage' => 'Na pàgina qualsëssìa',
 'randompage-nopages' => 'A-i é pa gnun-a pàgina ant {{PLURAL:$2|lë spassi nominal|jë spassi nominaj}}: lë spassi nominal "$1"',
 
+# Random page in category
+'randomincategory' => "Pàgina a l'ancàpit ant la categorìa",
+'randomincategory-invalidcategory' => "«$1» a l'é pa un nòm ëd categorìa bon.",
+'randomincategory-nopages' => 'A-i é gnun-e pàgine ant la categorìa [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => "Pijé na pàgina a l'ancàpit da 'nt la categorìa: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Andé',
+
 # Random redirect
 'randomredirect' => 'Na ridiression qualsëssìa',
 'randomredirect-nopages' => 'A-i é pa gnun-a ridiression ant lë spassi nominal "$1".',
@@ -1884,6 +1902,14 @@ Ch'as visa ëd controlé che në stamp a-j serva nen a dj'àutri stamp anans che
 'statistics-users-active-desc' => "Utent che a l'han fàit n'assion ant {{PLURAL:$1|l'ùltim di|j'ùltim $1 di}}",
 'statistics-mostpopular' => "Pàgine ch'a 'ncontro dë pì",
 
+'pageswithprop' => 'Pàgine con na propietà ëd pàgina',
+'pageswithprop-legend' => 'Pàgine con na propietà ëd pàgina',
+'pageswithprop-text' => "Costa pàgina a lista le pàgine ch'a deuvro na propietà 'd pàgina particolar.",
+'pageswithprop-prop' => 'Nòm ëd la propietà:',
+'pageswithprop-submit' => 'Andé',
+'pageswithprop-prophidden-long' => 'valor ëd propietà ëd test longh stërmà ($1)',
+'pageswithprop-prophidden-binary' => 'valor ëd propietà binaria stërmà ($1)',
+
 'doubleredirects' => 'Ridiression dobie',
 'doubleredirectstext' => "Sta pàgina-sì a a lista dle pàgine ch'a armando a d'àutre pàgine ëd ridiression.
 Vira riga a l'ha andrinta j'anliure a la prima e a la sconda ridiression, ant sël pat ëd la prima riga ëd test dla seconda ridiression, che për sòlit a l'ha andrinta l'artìcol ëd destinassion vèir, col andoa che a dovrìa ëmné ëdcò la prima ridiression.
@@ -1941,6 +1967,7 @@ Adess a l'é na ridiression a [[$2]].",
 'mostrevisions' => 'Artìcoj pì modificà',
 'prefixindex' => "Tute le pàgine ch'a ancamin-o con",
 'prefixindex-namespace' => 'Tute le pàgine con prefiss ($1 spassi nominal)',
+'prefixindex-strip' => 'Gavé ël prefiss da la lista',
 'shortpages' => 'Pàgine curte',
 'longpages' => 'Pàgine longhe',
 'deadendpages' => 'Pàgine che a men-o da gnun-a part',
@@ -1956,6 +1983,7 @@ Adess a l'é na ridiression a [[$2]].",
 'listusers' => "Lista dj'utent",
 'listusers-editsonly' => "Mostré mach j'utent ch'a l'han fàit dle modìfiche",
 'listusers-creationsort' => 'Ordiné për data ëd creassion',
+'listusers-desc' => 'Ordiné an órdin calant',
 'usereditcount' => '$1 {{PLURAL:$1|modìfica|modìfiche}}',
 'usercreated' => '{{GENDER:$3|Creà}}  ël $1 a $2',
 'newpages' => 'Pàgine neuve',
@@ -2050,7 +2078,7 @@ A-i é dabzògn almanch d\'un domini a livel pi àut, për esempi "*.org".<br />
 # Special:ActiveUsers
 'activeusers' => "Lista dj'utent ativ",
 'activeusers-intro' => "Costa a l'é na lista d'utent ch'a l'han avù n'atività qualsëssìa ant j'ùltim $1 {{PLURAL:$1|di|di}}.",
-'activeusers-count' => "$1 {{PLURAL:$1|modìfica neuva|modìfiche neuve}} ant {{PLURAL:$3|l'ùltim di|j'ùltim $3 di}}",
+'activeusers-count' => "$1 {{PLURAL:$1|assion}} ant {{PLURAL:$3|l'ùltim di|j'ùltim $3 di}}",
 'activeusers-from' => "Smon-me j'utent a parte da:",
 'activeusers-hidebots' => 'Stërmé ij trigomiro',
 'activeusers-hidesysops' => "Stërmé j'aministrator",
@@ -2060,7 +2088,8 @@ A-i é dabzògn almanch d\'un domini a livel pi àut, për esempi "*.org".<br />
 'listgrouprights' => "Drit dël grup d'utent",
 'listgrouprights-summary' => "Ambelessì a-i é na lista dle partìe d'utent definìe ansima a costa wiki, con ij sò drit d'acess associà.
 A peulo ess-ie d'[[{{MediaWiki:Listgrouprights-helppage}}|anformassion adissionaj]] ansima a dij drit individuaj.",
-'listgrouprights-key' => '* <span class="listgrouprights-granted">Drit assignà</span>
+'listgrouprights-key' => 'Legenda:
+* <span class="listgrouprights-granted">Drit assignà</span>
 * <span class="listgrouprights-revoked">Drit revocà</span>',
 'listgrouprights-group' => 'Partìa',
 'listgrouprights-rights' => 'Drit',
@@ -2134,8 +2163,8 @@ Le modìfiche che a-i saran ant costa pàgina-sì e ant soa pàgina ëd discussi
 'notanarticle' => "Sòn a l'é pa n'artìcol",
 'notvisiblerev' => "La revision a l'é stàita scancelà",
 'watchlist-details' => "A l'é dëmentrè ch'as ten sot-euj {{PLURAL:$1|$1 pàgina|$1 pàgine}}, nen contand cole ëd discussion.",
-'wlheader-enotif' => 'Le notìfiche për pòsta eletrònica a son abilità.',
-'wlheader-showupdated' => "Cole pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
+'wlheader-enotif' => "La notìfica për pòsta eletrònica a l'é abilità.",
+'wlheader-showupdated' => "Le pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
 'watchmethod-recent' => "contròl a j'ùltime modìfiche fàite a le pàgine che as ten sot-euj",
 'watchmethod-list' => 'contròl ëd le pàgine che as ten sot-euj për vëdde se a-i sio staje dle modìfiche recente',
 'watchlistcontains' => "Soa lista dla ròba ch'as ten sot-euj a l'ha andrinta {{PLURAL:$1|na pàgina|$1 pàgine}}.",
@@ -2242,7 +2271,7 @@ cheidun d'àutr a l'ha già modificà ò pura anulà le modìfiche a sta pàgina
 L'ùltima modìfica a la pàgina a l'é stàita fàita da [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
 'editcomment' => "Ël coment dla modìfica a l'era: \"''\$1''\".",
 'revertpage' => "Gavà via le modìfiche ëd [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]); ël contnù a l'é stàit tirà andarè a l'ùltima version dl'utent [[User:$1|$1]]",
-'revertpage-nouser' => "Révoca dle modìfiche da part ëd (stranòm gavà) a l'ùltima version ëd [[User:$1|$1]]",
+'revertpage-nouser' => "Révoca dle modìfiche da part ëd n'utent ëstërmà a l'ùltima version ëd {{GENDER:$1|[[User:$1|$1]]}}",
 'rollback-success' => "Modìfiche anulà da $1; tirà andré a l'ùltima version da $2.",
 
 # Edit tokens
@@ -2381,7 +2410,7 @@ $1",
 'contributions' => "Contribussion dë st'{{GENDER:$1|utent}}-sì",
 'contributions-title' => 'Contribussion ëd $1',
 'mycontris' => 'Contribussion',
-'contribsub2' => 'Për $1 ($2)',
+'contribsub2' => 'Për {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "A l'é pa trovasse gnun-a modìfica che a fussa conforma a costi criteri-sì",
 'uctop' => '(corenta)',
 'month' => 'Mèis:',
@@ -2546,6 +2575,7 @@ Për piasì che a contata sò fornitor ëd conession e che a lo anforma. As trat
 'proxyblocksuccess' => 'Bele fàit.',
 'sorbsreason' => "Soa adrëssa IP a l'é listà coma arpetitor duvert (open proxy) ansima al DNSBL dovrà da {{SITENAME}}.",
 'sorbs_create_account_reason' => "Soa adrëssa IP a l'é listà coma arpetitor duvèrt (open proxy) ansima al DNSBL dovrà da {{SITENAME}}. A peul nen creésse un cont.",
+'xffblockreason' => "N'adrëssa IP ant l'antestassion X-Forwarded-For, la soa o cola d'un servent fantasma che chiel a deuvra, a l'é stàita blocà. La rason dël blocagi inissial a l'era: $1",
 'cant-block-while-blocked' => "A peul pa bloché d'àutri utent antramentre che chiel a l'é blocà.",
 'cant-see-hidden-user' => "L'utent ch'a l'é an camin ch'a preuva a bloché a l'é già stàit blocà e stërmà. Da già ch'a l'ha pa ël drit hideuser, a peul pa vëdde o modifiché ël blocagi ëd cost utent.",
 'ipbblocked' => "A peul pa bloché o dësbloché d'àutri utent, përchè a l'é blocà chiel-midem",
@@ -2577,15 +2607,15 @@ Për piasì, che an conferma che sòn a l'é da bon lòn che chiel a veul fé.",
 'move-page-legend' => 'Tramudé na pàgina',
 'movepagetext' => "An dovrand ël mòdul ambelessì-sota a cangerà nòm a na pàgina, tramudand-je dapress ëdcò tuta soa cronologìa anvers al nòm neuv.
 Ël vej tìtol a resterà trasformà ant na ridiression che a men-a al tìtol neuv.
-As peul modifichesse automaticament le ridiression che a men-o al tìtol original.
+As peul agiorné an automàtich le ridiression che a men-o al tìtol original.
 Se a decid ëd nen felo, ch'a contròla le [[Special:DoubleRedirects|ridiression dobie]] o le [[Special:BrokenRedirects|ridiression ch'a men-o da gnun-e part]].
-A l'é responsàbil ëd controlé che le liure a men-o andoa as pensa che a devo mné.
+A l'é responsàbil ëd controlé che le liure a men-o ancora andoa as pensa che a devo mné.
 
-Noté bin: la pàgina a sarà '''nen''' tramudà se a-i fussa già mai n'artìcol che a l'ha ël nòm neuv, gavà col cas che a sia na pàgina veujda ò pura na ridiression, sempre che bele che essend mach parèj a l'abia già nen na soa cronologìa.
-Sòn a veul dì che, se a l'avèissa mai da fé n'operassion nen giusta, a podrìa sempe torné a rinominé la pàgina col nòm vej, ma ant gnun cas a podrìa coaté na pàgina che a-i é già.
+Noté bin che la pàgina a sarà '''nen''' tramudà se a-i fussa già mai n'artìcol che a l'ha ël nòm neuv, gavà col cas che a sia na ridiression, e che a l'abia già nen na soa cronologìa.
+Sòn a veul dì che, se a fèissa n'operassion nen giusta, a podrìa sempe torné a rinominé la pàgina col nòm vej, ma ant gnun cas a podrìa coaté na pàgina che a-i é già.
 
 '''ATENSION!'''
-Un cambiament dràstich parèj a podrìa dé dle gran-e dzora a na pàgina motobin visità.
+Un cambiament dràstich e nen ëspetà parèj a podrìa dé dle gran-e dzora a na pàgina motobin visità.
 Che a varda mach dë esse pì che sigur d'avèj presente le conseguense, prima che fé che fé.",
 'movepagetext-noredirectfixer' => "Dovré ël formolari sì-sota a arnominërà na pàgina, tramudand tuta soa stòria al nòm neuv.
 Ël tìtol vèj a vnirà na pàgina ëd ridiression al tìtol neuv.
@@ -2713,6 +2743,8 @@ Për piasì, ch'a vìsita la [//www.mediawiki.org/wiki/Localisation Localisassio
 'thumbnail-more' => 'Slarghé',
 'filemissing' => 'Archivi che a manca',
 'thumbnail_error' => 'Eror antramentr che as fasìa la figurin-a: $1',
+'thumbnail_error_remote' => "Mëssagi d'eror ëd $1:
+$2",
 'djvu_page_error' => 'Pàgina DjVu fòra dij lìmit',
 'djvu_no_xml' => "As rièss pa a carié l'XML për l'archivi DjVu",
 'thumbnail-temp-create' => "Pa bon a creé l'archivi ëd miniadura temporania",
@@ -2907,12 +2939,13 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-length' => 'Longheur ëd la pàgina (an byte)',
 'pageinfo-article-id' => 'Identificativ ëd la pàgina',
 'pageinfo-language' => 'Lenga dël contnù dla pàgina',
-'pageinfo-robot-policy' => "Stat dël motor d'arserca",
-'pageinfo-robot-index' => 'Indesàbil',
-'pageinfo-robot-noindex' => 'Nen indesàbil',
+'pageinfo-robot-policy' => 'Indicisassion con robò',
+'pageinfo-robot-index' => 'Autorisà',
+'pageinfo-robot-noindex' => 'Vietà',
 'pageinfo-views' => 'Nùmer ëd vìsite',
 'pageinfo-watchers' => "Vàire utent ch'a ten-o sot-euj la pàgina",
-'pageinfo-redirects-name' => 'Ridiression a sta pàgina-sì',
+'pageinfo-few-watchers' => 'Men ëd $1 {{PLURAL:$1|osservator}}',
+'pageinfo-redirects-name' => 'Nùmer ëd ridiression vers costa pàgina-sì',
 'pageinfo-subpages-name' => 'Sot-pàgine ëd costa pàgina',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ridiression|ridiression}}; $3 {{PLURAL:$3|nen ridiression|nen ridiression}})',
 'pageinfo-firstuser' => 'Creator ëd la pàgina',
@@ -3015,11 +3048,24 @@ An fasend-lo marcé ansima a sò ordinator chiel a podrìa porteje ëd dann a s
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute}}',
 'hours' => '{{PLURAL:$1|$1 ora|$1 ore}}',
 'days' => '{{PLURAL:$1|$1 di|$1 di}}',
+'weeks' => '{{PLURAL:$1|$1 sman-a|$1 sman-e}}',
 'months' => '{{PLURAL:$1|$1 mèis}}',
 'years' => '{{PLURAL:$1|$1 ann|$1 agn}}',
 'ago' => '$1 fa',
 'just-now' => 'pròpi adess',
 
+# Human-readable timestamps
+'minutes-ago' => '$1 {{PLURAL:$1|minuta|minute}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1|second|second}} fa',
+'monday-at' => 'Lùn-es a $1',
+'tuesday-at' => 'Màrtes a $1',
+'wednesday-at' => 'Merco a $1',
+'thursday-at' => 'Giòbia a $1',
+'friday-at' => 'Vënner a $1',
+'saturday-at' => 'Saba a $1',
+'sunday-at' => 'Dùminica a $1',
+'yesterday-at' => 'Jer a $1',
+
 # Bad image list
 'bad_image_list' => "La forma a l'é costa-sì:
 
@@ -3232,7 +3278,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-compression-4' => 'CCITT Partìa 4 codìfica dël fax',
 
 'exif-copyrighted-true' => "Con drit d'autor",
-'exif-copyrighted-false' => 'Domini pùblich',
+'exif-copyrighted-false' => "Stat dij drit d'autor nen definì",
 
 'exif-unknowndate' => 'Data nen conossùa',
 
@@ -3507,15 +3553,13 @@ $5
 
 Ës còdes ëd conferma a scadrà ël $4.",
 'confirmemail_body_set' => "Quaidun, miraco chiel, da l'adrëssa IP $1,
-a l'ha ampostà l'adrëssa ëd pòsta eletrònica dël cont «$2» con costa adrëssa su {{SITENAME}}.
+a l'ha ampostà l'adrëssa ëd pòsta eletrònica dël cont «$2» a costa adrëssa su {{SITENAME}}.
 
-Për confirmé che sto cont a l'é pròpi sò e ativé torna
-le funsion ëd pòsta eletrònica su {{SITENAME}}, ch'a duverta cost'anliura an sò navigador:
+Për confirmé che sto cont a l'é pròpi sò e ativé le funsion ëd pòsta eletrònica su {{SITENAME}}, ch'a duverta cost'anliura an sò navigador:
 
 $3
 
-Se ël cont a l'é *pa* sò, ch'a-j vada dapress a st'anliura
-për scancelé la conferma ëd l'adrëssa ëd pòsta eletrònica:
+Se ël cont a l'é *pa* sò, ch'a-j vada dapress a st'anliura për anulé la conferma ëd l'adrëssa ëd pòsta eletrònica:
 
 $5
 
@@ -3655,6 +3699,7 @@ As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
 'version-license' => 'Licensa',
 'version-poweredby-credits' => "Costa wiki-sì a marcia mersì a '''[//www.mediawiki.org/ MediaWiki]''', licensa © 2001-$1 $2.",
 'version-poweredby-others' => 'àutri',
+'version-poweredby-translators' => 'tradutor ëd translatewiki.net',
 'version-credits-summary' => 'I tnoma a aringrassié le përson-e sì-dapress për soa contribussion a [[Special:Version|MediaWiki]].',
 'version-license-info' => "MediaWiki a l'é un programa lìber; a peul passelo an gir o modifichelo sota le condission dla Licensa Pùblica General GNU coma publicà da la Free Software Foundation; o la version 2 dla licensa o (a soa decision) qualsëssìa version apress.
 
@@ -3669,6 +3714,18 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'version-entrypoints-header-url' => "Adrëssa an sl'aragnà",
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Senté d\'artìcol]',
 
+# Special:Redirect
+'redirect' => 'Ridirigiù da archivi, utent o ID ëd revision',
+'redirect-legend' => "Ridirige a n'archivi o na pàgina",
+'redirect-summary' => "Costa pàgina special a ponta a n'archivi (dàit un nòm d'archivi), na pàgina (dàita n'ID a la revision) o na pàgina d'utent (dàit n'identificativ numérich a l'utent).",
+'redirect-submit' => 'Andé',
+'redirect-lookup' => 'Arserca:',
+'redirect-value' => 'Valor:',
+'redirect-user' => "ID dl'utent",
+'redirect-revision' => 'Revision ëd la pàgina',
+'redirect-file' => "Nòm ëd l'archivi",
+'redirect-not-exists' => 'Valor nen trovà',
+
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => "Arsërca dj'archivi dobi",
 'fileduplicatesearch-summary' => "Arsërca dj'archivi dobi a parte dal valor d'ordinament.",
@@ -3695,7 +3752,7 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'specialpages-group-highuse' => 'Pàgine motobin dovrà',
 'specialpages-group-pages' => 'Liste ëd pàgine',
 'specialpages-group-pagetools' => 'Utiss për le pàgine',
-'specialpages-group-wiki' => 'Dat e utiss ëd la wiki',
+'specialpages-group-wiki' => 'Dat e utiss',
 'specialpages-group-redirects' => 'Pàgine speciaj ëd ridiression',
 'specialpages-group-spam' => 'Utiss contra la rumenta',
 
@@ -3717,12 +3774,16 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'tags' => 'Tichëtte ëd le modìfiche vàlide',
 'tag-filter' => 'Filtror ëd le [[Special:Tags|tichëtte]]:',
 'tag-filter-submit' => 'Filtror',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tichëtta|Tichëtte}}]]: $2)',
 'tags-title' => 'Tichëtte',
 'tags-intro' => 'Costa pàgina a lista le tichëtte che ël programa a peul dovré për marché na modìfica, e sò significà.',
 'tags-tag' => 'Nòm ëd la tichëtta',
 'tags-display-header' => 'Aparensa ant la lista dle modìfiche',
 'tags-description-header' => 'Descrission completa dël significà',
+'tags-active-header' => 'Ativ?',
 'tags-hitcount-header' => 'Modìfiche con tichëtta',
+'tags-active-yes' => 'Bò',
+'tags-active-no' => 'Nò',
 'tags-edit' => 'modifiché',
 'tags-hitcount' => '$1 {{PLURAL:$1|cambiament|cambiament}}',
 
@@ -3743,6 +3804,7 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'dberr-problems' => "An dëspias! Ës sit a l'ha dle dificoltà técniche.",
 'dberr-again' => "Ch'a speta chèiche minute e ch'a preuva torna a carié.",
 'dberr-info' => '(Conession al servent ëd base ëd dàit impossìbil: $1)',
+'dberr-info-hidden' => '(Conession al servent ëd base ëd dàit impossìbil)',
 'dberr-usegoogle' => 'Antratant a peul prové a sërché con Google.',
 'dberr-outofdate' => "Ch'a ten-a da ment che soe indesassion dij nòstri contnù a podrìo esse nen agiornà.",
 'dberr-cachederror' => "Costa-sì a l'é na còpia an memòria local ëd la pàgina ciamà, e a peul esse nen agiornà.",
index 98598f3..74d7cc0 100644 (file)
@@ -968,7 +968,7 @@ Você deve fazê-lo se acidentalmente compartilhá-los com alguém ou se sua con
 'subject' => 'Assunto/cabeçalho:',
 'minoredit' => 'Marcar como edição menor',
 'watchthis' => 'Vigiar esta página',
-'savearticle' => 'Salvar página',
+'savearticle' => 'Gravar página',
 'preview' => 'Antevisão',
 'showpreview' => 'Antever resultado',
 'showlivepreview' => 'Antevisão em tempo real',
index a38f17c..381dbab 100644 (file)
@@ -2985,7 +2985,7 @@ This message indicates {{msg-mw|prefs-dateformat}} is default (= not specified).
 
 {{Identical|Recent changes}}',
 'prefs-watchlist' => 'Used in user preferences.
-{{Identical|My watchlist}}',
+{{Identical|Watchlist}}',
 'prefs-watchlist-days' => 'Used in [[Special:Preferences]], tab "Watchlist".',
 'prefs-watchlist-days-max' => 'Shown as hint in [[Special:Preferences]], tab "Watchlist". Parameters:
 * $1 - number of days
@@ -5306,14 +5306,14 @@ Parameters:
 'usermessage-template' => '{{optional}}',
 
 # Watchlist
-'watchlist' => '{{Identical|My watchlist}}',
+'watchlist' => '{{Identical|Watchlist}}',
 'mywatchlist' => 'Link at the upper right corner of the screen.
 
 See also:
 * {{msg-mw|Mywatchlist}}
 * {{msg-mw|Accesskey-pt-watchlist}}
 * {{msg-mw|Tooltip-pt-watchlist}}
-{{Identical|My watchlist}}',
+{{Identical|Watchlist}}',
 'watchlistfor2' => 'Subtitle on [[Special:Watchlist]].
 Parameters:
 * $1 - Username of current user
index 4cd7ce6..46e6c67 100644 (file)
@@ -1610,7 +1610,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'right-move-subpages' => 'Redenumește paginile cu tot cu subpagini',
 'right-move-rootuserpages' => 'Redenumește pagina principală a unui utilizator',
 'right-movefile' => 'Redenumește fișiere',
-'right-suppressredirect' => 'Nu crea o redirecționare de la vechiul nume atunci când muți o pagină',
+'right-suppressredirect' => 'Nu creează o redirecționare de la vechiul nume atunci când redenumește o pagină',
 'right-upload' => 'Încarcă fișiere',
 'right-reupload' => 'Suprascrie un fișier existent',
 'right-reupload-own' => 'Suprascrie un fișier existent propriu',
@@ -1623,20 +1623,20 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'right-apihighlimits' => 'Folosește o limită mai mare pentru rezultatele cererilor API',
 'right-writeapi' => 'Utilizează API la scriere',
 'right-delete' => 'Șterge pagini',
-'right-bigdelete' => 'Şterge pagini cu istoric lung',
+'right-bigdelete' => 'Șterge pagini cu istoric lung',
 'right-deletelogentry' => 'Șterge și recuperează intrări specifice din jurnale',
 'right-deleterevision' => 'Șterge și recuperează versiuni specifice ale paginilor',
-'right-deletedhistory' => 'Vezi intrările șterse din istoric, fără textul asociat',
-'right-deletedtext' => 'Vizualizați textul șters și modificările dintre versiunile șterse',
+'right-deletedhistory' => 'Vizualizează intrările șterse din istoric, fără textul asociat',
+'right-deletedtext' => 'Vizualizează textul șters și modificările dintre versiunile șterse',
 'right-browsearchive' => 'Caută pagini șterse',
 'right-undelete' => 'Recuperează pagini',
 'right-suppressrevision' => 'Examinează și restaurează reviziile ascunse față de administratori',
 'right-suppressionlog' => 'Vizualizează jurnale private',
-'right-block' => 'Blocare utilizatori la modificare',
-'right-blockemail' => 'Blocare utilizatori la trimitere email',
+'right-block' => 'Blochează alți utilizatori la modificare',
+'right-blockemail' => 'Blochează alți utilizatori la trimiterea e-mailurilor',
 'right-hideuser' => 'Blochează un nume de utilizator, ascunzându-l de public',
-'right-ipblock-exempt' => 'Nu au fost afectați de blocarea făcută IP-ului.',
-'right-proxyunbannable' => 'Treci peste blocarea automată a proxy-urilor',
+'right-ipblock-exempt' => 'Ocolește blocarea adresei IP, autoblocările și blocarea intervalelor IP',
+'right-proxyunbannable' => 'Trece peste blocarea automată a proxy-urilor',
 'right-unblockself' => 'Se deblochează singur',
 'right-protect' => 'Schimbă nivelurile de protejare și modifică pagini protejate în cascadă',
 'right-editprotected' => 'Modifică pagini protejate ca „{{int:protect-level-sysop}}”',
@@ -1652,7 +1652,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'right-viewmyprivateinfo' => 'Vizualizați-vă datele private (de ex. adresa de e-mail, numele real)',
 'right-editmyprivateinfo' => 'Modificați-vă datele private (de ex. adresa de e-mail, numele real)',
 'right-editmyoptions' => 'Modificați-vă preferințele',
-'right-rollback' => 'Revocarea rapidă a modificărilor ultimului utilizator care a modificat o pagină particulară',
+'right-rollback' => 'Revocă rapid modificările ultimului utilizator care a modificat o pagină particulară',
 'right-markbotedits' => 'Marchează revenirea ca modificare efectuată de robot',
 'right-noratelimit' => 'Neafectat de limitele raportului',
 'right-import' => 'Importă pagini de la alte wikiuri',
@@ -1660,7 +1660,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'right-patrol' => 'Marchează modificările altora ca patrulate',
 'right-autopatrol' => 'Modificările proprii marcate ca patrulate',
 'right-patrolmarks' => 'Vizualizează pagini recent patrulate',
-'right-unwatchedpages' => 'Vizualizezaă listă de pagini neurmărite',
+'right-unwatchedpages' => 'Vizualizează o listă de pagini neurmărite',
 'right-mergehistory' => 'Unește istoricele paginilor',
 'right-userrights' => 'Modifică toate permisiunile de utilizator',
 'right-userrights-interwiki' => 'Modifică permisiunile de utilizator pentru utilizatorii de pe alte wiki',
@@ -1695,7 +1695,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'action-writeapi' => 'utilizați scrierea prin API',
 'action-delete' => 'ștergeți această pagină',
 'action-deleterevision' => 'ștergeți această versiune',
-'action-deletedhistory' => 'vizualizați istoricul șters al aceste pagini',
+'action-deletedhistory' => 'vizualizați istoricul șters al acestei pagini',
 'action-browsearchive' => 'căutați pagini șterse',
 'action-undelete' => 'recuperați această pagină',
 'action-suppressrevision' => 'revizuiți și să restaurați această versiune ascunsă',
index 5480c4b..c715b9c 100644 (file)
@@ -1652,7 +1652,7 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'number_of_watching_users_pageview' => '[temo {{PLURAL:$1|spremlja|spremljata|spremljajo|spremlja|spremlja}} $1 {{PLURAL:$1|uporabnik|uporabnika|uporabniki|uporabnikov|uporabnikov}}]',
 'rc_categories' => 'Omejitev na kategorije (ločite jih z »|«)',
 'rc_categories_any' => 'Katero koli',
-'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajta|bajti|bajtov}} po spremembi',
+'rc-change-size-new' => 'po spremembi: $1 {{PLURAL:$1|zlog|zloga|zlogi|zlogov}}',
 'newsectionsummary' => '/* $1 */ nov razdelek',
 'rc-enhanced-expand' => 'Pokaži podrobnosti',
 'rc-enhanced-hide' => 'Skrij podrobnosti',
@@ -1706,7 +1706,7 @@ Za grafični pogled obiščite [[Special:NewFiles|galerijo novih datotek]].',
 'ignorewarnings' => 'Prezri vsa opozorila',
 'minlength1' => 'Imena datotek morajo biti dolga vsaj eno črko.',
 'illegalfilename' => 'Ime datoteke »$1« vsebuje v naslovih strani prepovedane znake. Prosimo, poskusite datoteko naložiti pod drugim imenom.',
-'filename-toolong' => 'Imena datotek ne smejo biti daljša od 240 bajtov.',
+'filename-toolong' => 'Imena datotek ne smejo biti daljša od 240 zlogov.',
 'badfilename' => 'Ime datoteke se je samodejno popravilo v »$1«.',
 'filetype-mime-mismatch' => 'Datotečna končnica ».$1« se ne ujema z zaznano MIME-vrsto datoteke ($2).',
 'filetype-badmime' => 'Datoteke MIME-vrste »$1« ni dovoljeno nalagati.',
@@ -2967,7 +2967,7 @@ Manjka začasna mapa.',
 'import-parse-failure' => 'Neuspeh razčlenitve uvoza XML',
 'import-noarticle' => 'Ni strani za uvoz!',
 'import-nonewrevisions' => 'Vse redakcije so bile že prej uvožene.',
-'xml-error-string' => '$1 v vrstici $2, znak $3 (bajt $4): $5',
+'xml-error-string' => '$1 v vrstici $2, znak $3 (zlog $4): $5',
 'import-upload' => 'Naložite podatke XML',
 'import-token-mismatch' => 'Izguba podatkov o seji.
 Prosimo, poskusite znova.',
@@ -4102,9 +4102,9 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 'limitreport-ppvisitednodes' => 'Število predprocesorjevih ogledanih vozlišč',
 'limitreport-ppgeneratednodes' => 'Število predprocesorjevih ustvarjenih vozlišč',
 'limitreport-postexpandincludesize' => 'Velikost vključitve po razširitvi',
-'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bajt|bajta|bajte|bajtov}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|zlog|zloga|zloge|zlogov}}',
 'limitreport-templateargumentsize' => 'Velikost argumentov predloge',
-'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bajt|bajta|bajte|bajtov}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|zlog|zloga|zloge|zlogov}}',
 'limitreport-expansiondepth' => 'Največja globina razširitve',
 'limitreport-expensivefunctioncount' => 'Število dragih funkcij razčlenjevalnika',
 
index b0ae349..0ae34e2 100644 (file)
@@ -600,7 +600,7 @@ $1',
 # 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).
 'aboutsite' => '{{SITENAME}} hakkında',
 'aboutpage' => 'Project:Hakkında',
-'copyright' => 'İçerik $1 altındadır.',
+'copyright' => 'Aksi belirtilmedikçe içerik $1 altındadır.',
 'copyrightpage' => '{{ns:project}}:Telif hakları',
 'currentevents' => 'Güncel olaylar',
 'currentevents-url' => 'Project:Güncel olaylar',
@@ -623,7 +623,7 @@ $1',
 'versionrequired' => "MediaWiki'nin $1 sürümü gerekiyor",
 'versionrequiredtext' => "Bu sayfayı kullanmak için MediaWiki'nin $1 sürümü gerekmektedir. [[Special:Version|Sürüm sayfasına]] bakınız.",
 
-'ok' => 'TAMAM',
+'ok' => 'Tamam',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
 'retrievedfrom' => '"$1" adresinden alındı.',
 'youhavenewmessages' => 'Yeni $1 var ($2).',
@@ -633,7 +633,7 @@ $1',
 'youhavenewmessagesmanyusers' => 'Birçok kullanıcıdan $1 var ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|yeni mesajınız|yeni mesajlarınız}}',
 'newmessagesdifflinkplural' => 'son {{PLURAL:$1|değişiklik|değişiklikler}}',
-'youhavenewmessagesmulti' => "$1'de yeni mesajınız var.",
+'youhavenewmessagesmulti' => "$1'de yeni mesajınız var",
 'editsection' => 'düzenle',
 'editold' => 'değiştir',
 'viewsourceold' => 'kaynağı gör',
@@ -1550,8 +1550,8 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 $1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.',
 'yourgender' => 'Nasıl açıklamayı tercih edersiniz?',
 'gender-unknown' => 'Söylemek istemiyorsanız',
-'gender-male' => 'Wiki düzenlemelerinde kadın olarak',
-'gender-female' => 'Bayan',
+'gender-male' => 'Wiki düzenlemelerinde erkek olarak',
+'gender-female' => 'Wiki düzenlemelerinde kadın olarak',
 'prefs-help-gender' => 'Bu tercih ayarı isteğe bağlıdır.
 Yazılımda söz değerlerinin başlarında bulunan cinsiyete uygun gramerler için kullanılır.
 Bu bilgiler herkes tarafından görülebilir.',
index 532cbdf..c9caa3c 100644 (file)
@@ -1945,7 +1945,7 @@ Para pagtrangka o pagtanggal han trangka han database, ini in kinahanglanon magi
 'revertmove' => 'igbalik',
 'delete_and_move' => 'Igapara ngan igbalhin',
 'delete_and_move_confirm' => 'Oo, paraa an pakli',
-'delete_and_move_reason' => 'Ginpara para makahatag hin aragian para makabalhin tikan "[[$1]]"',
+'delete_and_move_reason' => 'Ginpara para makahatag hin aragian para makabalhin tikang ha "[[$1]]"',
 'selfmove' => 'An tinikangan ngan kakadtoan nga mga titulo in parehas;
 diri makakabalhin ha iya kalugaringon ngahaw.',
 'immobile-source-namespace' => 'Diri nababalhin an mga pakli ha ngaran-lat\'ang nga "$1"',
index 59837ae..3dc962d 100644 (file)
@@ -812,6 +812,9 @@ $2',
 'userlogin-resetpassword-link' => '重置你的密码',
 'helplogin-url' => 'Help:登录',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登录帮助]]',
+'userlogin-loggedin' => '您已经作为{{GENDER:$1|$1}}登录。
+使用以下表单以作为另一账户登录。',
+'userlogin-createanother' => '创建另一个帐户',
 'createacct-join' => '请在下面输入你的信息。',
 'createacct-another-join' => '在下方输入新帐户信息。',
 'createacct-emailrequired' => '电子邮件地址',
index db045cf..3dc94c8 100644 (file)
@@ -170,11 +170,8 @@ class BackupDumper {
                                        break;
                                case "force-normal":
                                        if ( !function_exists( 'utf8_normalize' ) ) {
-                                               wfDl( "php_utfnormal.so" );
-                                               if ( !function_exists( 'utf8_normalize' ) ) {
-                                                       $this->fatalError( "Failed to load UTF-8 normalization extension. " .
-                                                               "Install or remove --force-normal parameter to use slower code." );
-                                               }
+                                               $this->fatalError( "UTF-8 normalization extension not loaded. " .
+                                                       "Install or remove --force-normal parameter to use slower code." );
                                        }
                                        break;
                                default:
index 48bb53e..cbd1be6 100644 (file)
@@ -109,8 +109,8 @@ class TableCleanup extends Maintenance {
                $dbr = wfGetDB( DB_SLAVE );
 
                if ( array_diff( array_keys( $params ),
-                       array( 'table', 'conds', 'index', 'callback' ) ) )
-               {
+                       array( 'table', 'conds', 'index', 'callback' ) )
+               {
                        throw new MWException( __METHOD__ . ': Missing parameter ' . implode( ', ', $params ) );
                }
 
@@ -120,7 +120,6 @@ class TableCleanup extends Maintenance {
                $this->init( $count, $table );
                $this->output( "Processing $table...\n" );
 
-
                $index = (array)$params['index'];
                $indexConds = array();
                $options = array(
index ae256ab..5b5ef18 100644 (file)
@@ -54,9 +54,10 @@ class TitleCleanup extends TableCleanup {
                if ( !is_null( $title )
                        && $title->canExist()
                        && $title->getNamespace() == $row->page_namespace
-                       && $title->getDBkey() === $row->page_title )
-               {
-                       $this->progress( 0 );  // all is fine
+                       && $title->getDBkey() === $row->page_title
+               ) {
+                       $this->progress( 0 ); // all is fine
+
                        return;
                }
 
@@ -83,6 +84,7 @@ class TitleCleanup extends TableCleanup {
                // This is reasonable, since cleanupImages.php only iterates over the image table.
                $dbr = wfGetDB( DB_SLAVE );
                $row = $dbr->selectRow( 'image', array( 'img_name' ), array( 'img_name' => $name ), __METHOD__ );
+
                return $row !== false;
        }
 
@@ -115,9 +117,11 @@ class TitleCleanup extends TableCleanup {
 
                $dest = $title->getDBkey();
                if ( $this->dryrun ) {
-                       $this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')\n" );
+                       $this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace," .
+                               "'$row->page_title') to ($row->page_namespace,'$dest')\n" );
                } else {
-                       $this->output( "renaming $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')\n" );
+                       $this->output( "renaming $row->page_id ($row->page_namespace," .
+                               "'$row->page_title') to ($row->page_namespace,'$dest')\n" );
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->update( 'page',
                                array( 'page_title' => $dest ),
@@ -160,9 +164,11 @@ class TitleCleanup extends TableCleanup {
                $dest = $title->getDBkey();
 
                if ( $this->dryrun ) {
-                       $this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($ns,'$dest')\n" );
+                       $this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace," .
+                               "'$row->page_title') to ($ns,'$dest')\n" );
                } else {
-                       $this->output( "renaming $row->page_id ($row->page_namespace,'$row->page_title') to ($ns,'$dest')\n" );
+                       $this->output( "renaming $row->page_id ($row->page_namespace," .
+                               "'$row->page_title') to ($ns,'$dest')\n" );
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->update( 'page',
                                array(
index 962b082..e98e9c0 100644 (file)
@@ -20,6 +20,7 @@
                                "name": "General",
                                "classes": [
                                        "mw.Title",
+                                       "mw.inspect",
                                        "mw.notification",
                                        "mw.user",
                                        "mw.util",
index 5cce68d..12458ee 100644 (file)
@@ -13,6 +13,7 @@
                "../../resources/mediawiki/mediawiki.log.js",
                "../../resources/mediawiki/mediawiki.util.js",
                "../../resources/mediawiki/mediawiki.Title.js",
+               "../../resources/mediawiki/mediawiki.inspect.js",
                "../../resources/mediawiki/mediawiki.notify.js",
                "../../resources/mediawiki/mediawiki.notification.js",
                "../../resources/mediawiki/mediawiki.user.js",
index 49f4e00..08188ca 100644 (file)
@@ -33,10 +33,7 @@ class Sqlite {
         * @return bool
         */
        public static function isPresent() {
-               wfSuppressWarnings();
-               $compiled = wfDl( 'pdo_sqlite' );
-               wfRestoreWarnings();
-               return $compiled;
+               return extension_loaded( 'pdo_sqlite' );
        }
 
        /**
index 880726b..6f4b9f7 100644 (file)
@@ -160,6 +160,7 @@ return array(
        ),
        'jquery.byteLength' => array(
                'scripts' => 'resources/jquery/jquery.byteLength.js',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.byteLimit' => array(
                'scripts' => 'resources/jquery/jquery.byteLimit.js',
@@ -646,6 +647,11 @@ return array(
                // must be loaded on the bottom
                'position' => 'bottom',
        ),
+       'mediawiki.inspect' => array(
+               'scripts' => 'resources/mediawiki/mediawiki.inspect.js',
+               'dependencies' => 'jquery.byteLength',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.feedback' => array(
                'scripts' => 'resources/mediawiki/mediawiki.feedback.js',
                'styles' => 'resources/mediawiki/mediawiki.feedback.css',
index ddf63a8..147a869 100644 (file)
                                                        $innerDiv: $innerDiv,
                                                        $imageDiv: $imageDiv,
                                                        $outerDiv: $outerDiv,
-                                                       resolved: false  /* Did the hook take action */
+                                                       // Whether the hook took action
+                                                       resolved: false
                                                };
-                                               // Allow other media handlers to hook in.
-                                               // If your hook resizes an image, it is expected it will
-                                               // set resolved to true. Additionally you should load
-                                               // your module in position top to ensure it is registered
-                                               // before this runs (FIXME: there must be a better way?)
-                                               // See TimedMediaHandler for an example.
+
+                                               /**
+                                                * Gallery resize.
+                                                *
+                                                * If your handler resizes an image, it should also set the resolved
+                                                * property to true. Additionally, because this module only exposes this
+                                                * logic temporarily, you should load your module in position top to
+                                                * ensure it is registered before this runs (FIXME: Don't use mw.hook)
+                                                *
+                                                * See TimedMediaHandler for an example.
+                                                *
+                                                * @event mediawiki_page_gallery_resize
+                                                * @member mw.hook
+                                                * @param {Object} hookInfo
+                                                */
                                                mw.hook( 'mediawiki.page.gallery.resize' ).fire( hookInfo );
 
                                                if ( !hookInfo.resolved ) {
diff --git a/resources/mediawiki/mediawiki.inspect.js b/resources/mediawiki/mediawiki.inspect.js
new file mode 100644 (file)
index 0000000..c4766ff
--- /dev/null
@@ -0,0 +1,102 @@
+/*!
+ * Tools for inspecting page composition and performance.
+ *
+ * @author Ori Livneh
+ * @since 1.22
+ */
+( function ( mw, $ ) {
+
+       /**
+        * @class mw.inspect
+        * @singleton
+        */
+       var inspect = {
+
+               /**
+                * Calculate the byte size of a ResourceLoader module.
+                *
+                * @param {string} moduleName The name of the module
+                * @return {number|null} Module size in bytes or null
+                */
+               getModuleSize: function ( moduleName ) {
+                       var module = mw.loader.moduleRegistry[ moduleName ],
+                               payload = 0;
+
+                       if ( mw.loader.getState( moduleName ) !== 'ready' ) {
+                               return null;
+                       }
+
+                       if ( !module.style && !module.script ) {
+                               return null;
+                       }
+
+                       // Tally CSS
+                       if ( module.style && $.isArray( module.style.css ) ) {
+                               $.each( module.style.css, function ( i, stylesheet ) {
+                                       payload += $.byteLength( stylesheet );
+                               } );
+                       }
+
+                       // Tally JavaScript
+                       if ( $.isFunction( module.script ) ) {
+                               payload += $.byteLength( module.script.toString() );
+                       }
+
+                       return payload;
+               },
+
+               /**
+                * Get a list of all loaded ResourceLoader modules.
+                *
+                * @return {Array} List of module names
+                */
+               getLoadedModules: function () {
+                       return $.grep( mw.loader.getModuleNames(), function ( module ) {
+                               return mw.loader.getState( module ) === 'ready';
+                       } );
+               },
+
+               /**
+                * Print a breakdown of all loaded modules and their size in kilobytes
+                * to the debug console. Modules are ordered from largest to smallest.
+                */
+               inspectModules: function () {
+                       var console = window.console;
+
+                       $( function () {
+                               // Map each module to a descriptor object.
+                               var modules = $.map( inspect.getLoadedModules(), function ( module ) {
+                                       return {
+                                               name: module,
+                                               size: inspect.getModuleSize( module )
+                                       };
+                               } );
+
+                               // Sort module descriptors by size, largest first.
+                               modules.sort( function ( a, b ) {
+                                       return b.size - a.size;
+                               } );
+
+                               // Convert size to human-readable string.
+                               $.each( modules, function ( i, module ) {
+                                       module.size = module.size > 1024 ?
+                                               ( module.size / 1024 ).toFixed( 2 ) + ' KB' :
+                                               ( module.size !== null ? module.size + ' B' : null );
+                               } );
+
+                               if ( console ) {
+                                       if ( console.table ) {
+                                               console.table( modules );
+                                       } else {
+                                               $.each( modules, function ( i, module ) {
+                                                       console.log( [ module.name, module.size ].join( '\t' ) );
+                                               } );
+                                       }
+                               }
+                       } );
+               }
+       };
+
+       mw.inspect = inspect;
+
+}( mediaWiki, jQuery ) );
index 39093e3..4138ac8 100644 (file)
@@ -1699,7 +1699,18 @@ var mw = ( function ( $, undefined ) {
                                 */
                                go: function () {
                                        mw.loader.load( 'mediawiki.user' );
+                               },
+
+                               /**
+                                * @inheritdoc mw.inspect#inspectModules
+                                * @method
+                                */
+                               inspect: function () {
+                                       mw.loader.using( 'mediawiki.inspect', function () {
+                                               mw.inspect.inspectModules();
+                                       } );
                                }
+
                        };
                }() ),
 
index ae35fd7..f1004fb 100644 (file)
@@ -2,7 +2,7 @@
 class CollationTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
-               if ( !wfDl( 'intl' ) ) {
+               if ( !extension_loaded( 'intl' ) ) {
                        $this->markTestSkipped( 'These tests require intl extension' );
                }
        }
index 94ba3a7..b222812 100644 (file)
@@ -3,7 +3,7 @@
 class StringUtilsTest extends MediaWikiTestCase {
 
        /**
-        * This test StringUtils::isUtf8 whenever we have mbstring extension
+        * This tests StringUtils::isUtf8 whenever we have the mbstring extension
         * loaded.
         *
         * @covers StringUtils::isUtf8
@@ -20,7 +20,7 @@ class StringUtilsTest extends MediaWikiTestCase {
        }
 
        /**
-        * This test StringUtils::isUtf8 making sure we use the pure PHP
+        * This tests StringUtils::isUtf8 making sure we use the pure PHP
         * implementation used as a fallback when mb_check_encoding() is
         * not available.
         *
@@ -64,95 +64,84 @@ class StringUtilsTest extends MediaWikiTestCase {
                $FAIL = false;
 
                return array(
-                       array( $PASS, 'Some ASCII' ),
-                       array( $PASS, "Euro sign €" ),
-
-                       // First possible sequences
-                       array( $PASS, "\x00" ),
-                       array( $PASS, "\xc2\x80" ),
-                       array( $PASS, "\xe0\xa0\x80" ),
-                       array( $PASS, "\xf0\x90\x80\x80" ),
-                       array( $FAIL, "\xf8\x88\x80\x80\x80" ),
-                       array( $FAIL, "\xfc\x84\x80\x80\x80\x80" ),
-
-                       // Last possible sequence
-                       array( $PASS, "\x7f" ),
-                       array( $PASS, "\xdf\xbf" ),
-                       array( $PASS, "\xef\xbf\xbf" ),
-                       array( $FAIL, "\xf7\xbf\xbf\xbf" ), // U+1FFFFF
-                       array( $FAIL, "\xfb\xbf\xbf\xbf\xbf" ),
-                       array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
-
-                       // Boundaries
-                       array( $PASS, "\xed\x9f\xbf" ),
-                       array( $PASS, "\xee\x80\x80" ),
-                       array( $PASS, "\xef\xbf\xbd" ),
-                       array( $PASS, "\xf2\x80\x80\x80" ),
-                       array( $PASS, "\xf3\xbf\xbf\xbf" ), // U+FFFFF
-                       array( $PASS, "\xf4\x80\x80\x80" ), // U+100000
-                       array( $PASS, "\xf4\x8f\xbf\xbf" ), // U+10FFFF
-                       array( $FAIL, "\xf4\x90\x80\x80" ), // U+110000
-
-                       // Malformed
-                       array( $FAIL, "\x80" ),
-                       array( $FAIL, "\xbf" ),
-                       array( $FAIL, "\x80\xbf" ),
-                       array( $FAIL, "\x80\xbf\x80" ),
-                       array( $FAIL, "\x80\xbf\x80\xbf" ),
-                       array( $FAIL, "\x80\xbf\x80\xbf\x80" ),
-                       array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
-                       array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
-
-                       // Last byte missing
-                       array( $FAIL, "\xc0" ),
-                       array( $FAIL, "\xe0\x80" ),
-                       array( $FAIL, "\xf0\x80\x80" ),
-                       array( $FAIL, "\xf8\x80\x80\x80" ),
-                       array( $FAIL, "\xfc\x80\x80\x80\x80" ),
-                       array( $FAIL, "\xdf" ),
-                       array( $FAIL, "\xef\xbf" ),
-                       array( $FAIL, "\xf7\xbf\xbf" ),
-                       array( $FAIL, "\xfb\xbf\xbf\xbf" ),
-                       array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
-
-                       // Extra continuation byte
-                       array( $FAIL, "e\xaf" ),
-                       array( $FAIL, "\xc3\x89\xaf" ),
-                       array( $FAIL, "\xef\xbc\xa5\xaf" ),
-                       array( $FAIL, "\xf0\x9d\x99\xb4\xaf" ),
-
-                       // Impossible bytes
-                       array( $FAIL, "\xfe" ),
-                       array( $FAIL, "\xff" ),
-                       array( $FAIL, "\xfe\xfe\xff\xff" ),
-
-                       // Overlong sequences
-                       array( $FAIL, "\xc0\xaf" ),
-                       array( $FAIL, "\xc1\xaf" ),
-                       array( $FAIL, "\xe0\x80\xaf" ),
-                       array( $FAIL, "\xf0\x80\x80\xaf" ),
-                       array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
-                       array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
-
-                       // Maximum overlong sequences
-                       array( $FAIL, "\xc1\xbf" ),
-                       array( $FAIL, "\xe0\x9f\xbf" ),
-                       array( $FAIL, "\xf0\x8f\xbf\xbf" ),
-                       array( $FAIL, "\xf8\x87\xbf\xbf" ),
-                       array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
-
-                       // Surrogates
-                       array( $PASS, "\xed\x9f\xbf" ), // U+D799
-                       array( $PASS, "\xee\x80\x80" ), // U+E000
-                       array( $FAIL, "\xed\xa0\x80" ), // U+D800
-                       array( $FAIL, "\xed\xaf\xbf" ), // U+DBFF
-                       array( $FAIL, "\xed\xb0\x80" ), // U+DC00
-                       array( $FAIL, "\xed\xbf\xbf" ), // U+DFFF
-                       array( $FAIL, "\xed\xa0\x80\xed\xb0\x80" ), // U+D800 U+DC00
-
-                       // Noncharacters
-                       array( $PASS, "\xef\xbf\xbe" ),
-                       array( $PASS, "\xef\xbf\xbf" ),
+                       'some ASCII' => array( $PASS, 'Some ASCII' ),
+                       'euro sign' => array( $PASS, "Euro sign €" ),
+
+                       'first possible sequence 1 byte' => array( $PASS, "\x00" ),
+                       'first possible sequence 2 bytes' => array( $PASS, "\xc2\x80" ),
+                       'first possible sequence 3 bytes' => array( $PASS, "\xe0\xa0\x80" ),
+                       'first possible sequence 4 bytes' => array( $PASS, "\xf0\x90\x80\x80" ),
+                       'first possible sequence 5 bytes' => array( $FAIL, "\xf8\x88\x80\x80\x80" ),
+                       'first possible sequence 6 bytes' => array( $FAIL, "\xfc\x84\x80\x80\x80\x80" ),
+
+                       'last possible sequence 1 byte' => array( $PASS, "\x7f" ),
+                       'last possible sequence 2 bytes' => array( $PASS, "\xdf\xbf" ),
+                       'last possible sequence 3 bytes' => array( $PASS, "\xef\xbf\xbf" ),
+                       'last possible sequence 4 bytes (U+1FFFFF)' => array( $FAIL, "\xf7\xbf\xbf\xbf" ),
+                       'last possible sequence 5 bytes' => array( $FAIL, "\xfb\xbf\xbf\xbf\xbf" ),
+                       'last possible sequence 6 bytes' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
+
+                       'boundary 1' => array( $PASS, "\xed\x9f\xbf" ),
+                       'boundary 2' => array( $PASS, "\xee\x80\x80" ),
+                       'boundary 3' => array( $PASS, "\xef\xbf\xbd" ),
+                       'boundary 4' => array( $PASS, "\xf2\x80\x80\x80" ),
+                       'boundary 5 (U+FFFFF)' => array( $PASS, "\xf3\xbf\xbf\xbf" ),
+                       'boundary 6 (U+100000)' => array( $PASS, "\xf4\x80\x80\x80" ),
+                       'boundary 7 (U+10FFFF)' => array( $PASS, "\xf4\x8f\xbf\xbf" ),
+                       'boundary 8 (U+110000)' => array( $FAIL, "\xf4\x90\x80\x80" ),
+
+                       'malformed 1' => array( $FAIL, "\x80" ),
+                       'malformed 2' => array( $FAIL, "\xbf" ),
+                       'malformed 3' => array( $FAIL, "\x80\xbf" ),
+                       'malformed 4' => array( $FAIL, "\x80\xbf\x80" ),
+                       'malformed 5' => array( $FAIL, "\x80\xbf\x80\xbf" ),
+                       'malformed 6' => array( $FAIL, "\x80\xbf\x80\xbf\x80" ),
+                       'malformed 7' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
+                       'malformed 8' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
+
+                       'last byte missing 1' => array( $FAIL, "\xc0" ),
+                       'last byte missing 2' => array( $FAIL, "\xe0\x80" ),
+                       'last byte missing 3' => array( $FAIL, "\xf0\x80\x80" ),
+                       'last byte missing 4' => array( $FAIL, "\xf8\x80\x80\x80" ),
+                       'last byte missing 5' => array( $FAIL, "\xfc\x80\x80\x80\x80" ),
+                       'last byte missing 6' => array( $FAIL, "\xdf" ),
+                       'last byte missing 7' => array( $FAIL, "\xef\xbf" ),
+                       'last byte missing 8' => array( $FAIL, "\xf7\xbf\xbf" ),
+                       'last byte missing 9' => array( $FAIL, "\xfb\xbf\xbf\xbf" ),
+                       'last byte missing 10' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
+
+                       'extra continuation byte 1' => array( $FAIL, "e\xaf" ),
+                       'extra continuation byte 2' => array( $FAIL, "\xc3\x89\xaf" ),
+                       'extra continuation byte 3' => array( $FAIL, "\xef\xbc\xa5\xaf" ),
+                       'extra continuation byte 4' => array( $FAIL, "\xf0\x9d\x99\xb4\xaf" ),
+
+                       'impossible bytes 1' => array( $FAIL, "\xfe" ),
+                       'impossible bytes 2' => array( $FAIL, "\xff" ),
+                       'impossible bytes 3' => array( $FAIL, "\xfe\xfe\xff\xff" ),
+
+                       'overlong sequences 1' => array( $FAIL, "\xc0\xaf" ),
+                       'overlong sequences 2' => array( $FAIL, "\xc1\xaf" ),
+                       'overlong sequences 3' => array( $FAIL, "\xe0\x80\xaf" ),
+                       'overlong sequences 4' => array( $FAIL, "\xf0\x80\x80\xaf" ),
+                       'overlong sequences 5' => array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
+                       'overlong sequences 6' => array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
+
+                       'maximum overlong sequences 1' => array( $FAIL, "\xc1\xbf" ),
+                       'maximum overlong sequences 2' => array( $FAIL, "\xe0\x9f\xbf" ),
+                       'maximum overlong sequences 3' => array( $FAIL, "\xf0\x8f\xbf\xbf" ),
+                       'maximum overlong sequences 4' => array( $FAIL, "\xf8\x87\xbf\xbf" ),
+                       'maximum overlong sequences 5' => array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
+
+                       'surrogates 1 (U+D799)' => array( $PASS, "\xed\x9f\xbf" ),
+                       'surrogates 2 (U+E000)' => array( $PASS, "\xee\x80\x80" ),
+                       'surrogates 3 (U+D800)' => array( $FAIL, "\xed\xa0\x80" ),
+                       'surrogates 4 (U+DBFF)' => array( $FAIL, "\xed\xaf\xbf" ),
+                       'surrogates 5 (U+DC00)' => array( $FAIL, "\xed\xb0\x80" ),
+                       'surrogates 6 (U+DFFF)' => array( $FAIL, "\xed\xbf\xbf" ),
+                       'surrogates 7 (U+D800 U+DC00)' => array( $FAIL, "\xed\xa0\x80\xed\xb0\x80" ),
+
+                       'noncharacters 1' => array( $PASS, "\xef\xbf\xbe" ),
+                       'noncharacters 2' => array( $PASS, "\xef\xbf\xbf" ),
                );
        }
 }
index b0efd19..c19b54e 100644 (file)
@@ -193,6 +193,40 @@ class ApiEditPageTest extends ApiTestCase {
                $this->assertEquals( $expected, $text );
        }
 
+       /**
+        * Test editing of sections
+        */
+       function testEditSection() {
+               $name = 'Help:ApiEditPageTest_testEditSection';
+               $page = WikiPage::factory( Title::newFromText( $name ) );
+               $text = "==section 1==\ncontent 1\n==section 2==\ncontent2";
+               // Preload the page with some text
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 'summary' );
+
+               list( $re ) = $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => $name,
+                       'section' => '1',
+                       'text' => "==section 1==\nnew content 1",
+               ) );
+               $this->assertEquals( 'Success', $re['edit']['result'] );
+               $newtext = WikiPage::factory( Title::newFromText( $name) )->getContent( Revision::RAW )->getNativeData();
+               $this->assertEquals( $newtext, "==section 1==\nnew content 1\n\n==section 2==\ncontent2" );
+
+               // Test that we raise a 'nosuchsection' error
+               try {
+                       $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $name,
+                               'section' => '9999',
+                               'text' => 'text',
+                       ) );
+                       $this->fail( "Should have raised a UsageException" );
+               } catch ( UsageException $e ) {
+                       $this->assertEquals( $e->getCodeString(), 'nosuchsection' );
+               }
+       }
+
        /**
         * Test action=edit&section=new
         * Run it twice so we test adding a new section on a
diff --git a/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php b/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
new file mode 100644 (file)
index 0000000..8138b70
--- /dev/null
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Holds tests for DatabaseMysqlBase MediaWiki class.
+ *
+ * @section LICENSE
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Antoine Musso
+ * @author Bryan Davis
+ * @copyright © 2013 Antoine Musso
+ * @copyright © 2013 Bryan Davis
+ * @copyright © 2013 Wikimedia Foundation Inc.
+ */
+
+/**
+ * Fake class around abstract class so we can call concrete methods.
+ */
+class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
+       // From DatabaseBase
+       protected function closeConnection() {}
+       protected function doQuery( $sql ) {}
+
+       // From DatabaseMysql
+       protected function mysqlConnect( $realServer ) {}
+       protected function mysqlFreeResult( $res ) {}
+       protected function mysqlFetchObject( $res ) {}
+       protected function mysqlFetchArray( $res ) {}
+       protected function mysqlNumRows( $res ) {}
+       protected function mysqlNumFields( $res ) {}
+       protected function mysqlFieldName( $res, $n ) {}
+       protected function mysqlDataSeek( $res, $row ) {}
+       protected function mysqlError( $conn = null ) {}
+       protected function mysqlFetchField( $res, $n ) {}
+       protected function mysqlPing() {}
+
+       // From interface DatabaseType
+       function insertId() {}
+       function lastErrno() {}
+       function affectedRows() {}
+       function getServerVersion() {}
+}
+
+class DatabaseMysqlBaseTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideDiapers
+        */
+       function testAddIdentifierQuotes( $expected, $in ) {
+               $db = new FakeDatabaseMysqlBase();
+               $quoted = $db->addIdentifierQuotes( $in );
+               $this->assertEquals($expected, $quoted);
+       }
+
+
+       /**
+        * Feeds testAddIdentifierQuotes
+        *
+        * Named per bug 20281 convention.
+        */
+       function provideDiapers() {
+               return array(
+                       // Format: expected, input
+                       array( '``', '' ),
+
+                       // Yeah I really hate loosely typed PHP idiocies nowadays
+                       array( '``', null ),
+
+                       // Dear codereviewer, guess what addIdentifierQuotes()
+                       // will return with thoses:
+                       array( '``', false ),
+                       array( '`1`', true ),
+
+                       // We never know what could happen
+                       array( '`0`', 0 ),
+                       array( '`1`', 1 ),
+
+                       // Whatchout! Should probably use something more meaningful
+                       array( "`'`", "'" ),  # single quote
+                       array( '`"`', '"' ),  # double quote
+                       array( '````', '`' ), # backtick
+                       array( '`’`', '’' ),  # apostrophe (look at your encyclopedia)
+
+                       // sneaky NUL bytes are lurking everywhere
+                       array( '``', "\0" ),
+                       array( '`xyzzy`', "\0x\0y\0z\0z\0y\0" ),
+
+                       // unicode chars
+                       array(
+                               self::createUnicodeString( '`\u0001a\uFFFFb`' ),
+                               self::createUnicodeString( '\u0001a\uFFFFb' )
+                       ),
+                       array(
+                               self::createUnicodeString( '`\u0001\uFFFF`' ),
+                               self::createUnicodeString( '\u0001\u0000\uFFFF\u0000' )
+                       ),
+                       array( '`☃`', '☃' ),
+                       array( '`メインページ`', 'メインページ' ),
+                       array( '`Басты_бет`', 'Басты_бет' ),
+
+                       // Real world:
+                       array( '`Alix`', 'Alix' ),  # while( ! $recovered ) { sleep(); }
+                       array( '`Backtick: ```', 'Backtick: `' ),
+                       array( '`This is a test`', 'This is a test' ),
+               );
+       }
+
+       private static function createUnicodeString($str) {
+               return json_decode( '"' . $str . '"' );
+       }
+
+}
index ffa6084..43792c1 100644 (file)
@@ -18,10 +18,10 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
         * translation (to en) where XMP should win.
         */
        public function testMultilingualCascade() {
-               if ( !wfDl( 'exif' ) ) {
+               if ( !extension_loaded( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
-               if ( !wfDl( 'xml' ) ) {
+               if ( !extension_loaded( 'xml' ) ) {
                        $this->markTestSkipped( "This test needs the xml extension." );
                }
 
@@ -115,7 +115,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
        }
 
        public function testPNGXMP() {
-               if ( !wfDl( 'xml' ) ) {
+               if ( !extension_loaded( 'xml' ) ) {
                        $this->markTestSkipped( "This test needs the xml extension." );
                }
                $handler = new BitmapMetadataHandler();
index 1109c47..532182c 100644 (file)
@@ -4,13 +4,14 @@ class ExifBitmapTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
+               if ( !extension_loaded( 'exif' ) ) {
+                       $this->markTestSkipped( "This test needs the exif extension." );
+               }
 
                $this->setMwGlobals( 'wgShowEXIF', true );
 
                $this->handler = new ExifBitmapHandler;
-               if ( !wfDl( 'exif' ) ) {
-                       $this->markTestSkipped( "This test needs the exif extension." );
-               }
+
        }
 
        public function testIsOldBroken() {
index f02e8b9..c16de8b 100644 (file)
@@ -8,6 +8,10 @@ class ExifRotationTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
+               if ( !extension_loaded( 'exif' ) ) {
+                       $this->markTestSkipped( "This test needs the exif extension." );
+               }
+
                $this->handler = new BitmapHandler();
                $filePath = __DIR__ . '/../../data/media';
 
@@ -22,9 +26,6 @@ class ExifRotationTest extends MediaWikiTestCase {
                                'containerPaths' => array( 'temp-thumb' => $tmpDir, 'data' => $filePath )
                        ) )
                ) );
-               if ( !wfDl( 'exif' ) ) {
-                       $this->markTestSkipped( "This test needs the exif extension." );
-               }
 
                $this->setMwGlobals( array(
                        'wgShowEXIF' => true,
index 6ad28ac..b84ed56 100644 (file)
@@ -3,12 +3,13 @@ class ExifTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
+               if ( !extension_loaded( 'exif' ) ) {
+                       $this->markTestSkipped( "This test needs the exif extension." );
+               }
 
                $this->mediaPath = __DIR__ . '/../../data/media/';
 
-               if ( !wfDl( 'exif' ) ) {
-                       $this->markTestSkipped( "This test needs the exif extension." );
-               }
+
 
                $this->setMwGlobals( 'wgShowEXIF', true );
        }
index f26d27e..bee0906 100644 (file)
@@ -4,7 +4,7 @@ class FormatMetadataTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
 
-               if ( !wfDl( 'exif' ) ) {
+               if ( !extension_loaded( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
                $filePath = __DIR__ . '/../../data/media';
index 05d3661..7775c41 100644 (file)
@@ -3,12 +3,13 @@ class JpegTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
-
-               $this->filePath = __DIR__ . '/../../data/media/';
-               if ( !wfDl( 'exif' ) ) {
+               if ( !extension_loaded( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
 
+               $this->filePath = __DIR__ . '/../../data/media/';
+
+
                $this->setMwGlobals( 'wgShowEXIF', true );
        }
 
index 91c35c4..1ec34d5 100644 (file)
@@ -3,6 +3,9 @@ class TiffTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
+               if ( !extension_loaded( 'exif' ) ) {
+                       $this->markTestSkipped( "This test needs the exif extension." );
+               }
 
                $this->setMwGlobals( 'wgShowEXIF', true );
 
@@ -11,17 +14,11 @@ class TiffTest extends MediaWikiTestCase {
        }
 
        public function testInvalidFile() {
-               if ( !wfDl( 'exif' ) ) {
-                       $this->markTestIncomplete( "This test needs the exif extension." );
-               }
                $res = $this->handler->getMetadata( null, $this->filePath . 'README' );
                $this->assertEquals( ExifBitmapHandler::BROKEN_FILE, $res );
        }
 
        public function testTiffMetadataExtraction() {
-               if ( !wfDl( 'exif' ) ) {
-                       $this->markTestIncomplete( "This test needs the exif extension." );
-               }
                $res = $this->handler->getMetadata( null, $this->filePath . 'test.tiff' );
                $expected = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
                // Re-unserialize in case there are subtle differences between how versions
index 25a43eb..aa0cdd2 100644 (file)
@@ -3,7 +3,7 @@ class XMPTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               if ( !wfDl( 'xml' ) ) {
+               if ( !extension_loaded( 'xml' ) ) {
                        $this->markTestSkipped( 'Requires libxml to do XMP parsing' );
                }
        }
index cacbb85..3cdbf15 100644 (file)
@@ -44,5 +44,44 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                        'text' => '<pre style="margin-left: 1.6em">foo</pre>',
                ), $ret, 'callParserFunction works for {{#tag:pre|foo|style=margin-left: 1.6em}}' );
        }
+
+       public function testGetSections() {
+               global $wgParser;
+
+               $title = Title::newFromText( str_replace( '::', '__', __METHOD__ ) );
+               $out = $wgParser->parse( "==foo==\n<h2>bar</h2>\n==baz==\n", $title, new ParserOptions() );
+               $this->assertSame( array(
+                       array(
+                               'toclevel' => 1,
+                               'level' => '2',
+                               'line' => 'foo',
+                               'number' => '1',
+                               'index' => '1',
+                               'fromtitle' => $title->getPrefixedDBkey(),
+                               'byteoffset' => 0,
+                               'anchor' => 'foo',
+                       ),
+                       array(
+                               'toclevel' => 1,
+                               'level' => '2',
+                               'line' => 'bar',
+                               'number' => '2',
+                               'index' => '',
+                               'fromtitle' => false,
+                               'byteoffset' => null,
+                               'anchor' => 'bar',
+                       ),
+                       array(
+                               'toclevel' => 1,
+                               'level' => '2',
+                               'line' => 'baz',
+                               'number' => '3',
+                               'index' => '2',
+                               'fromtitle' => $title->getPrefixedDBkey(),
+                               'byteoffset' => 21,
+                               'anchor' => 'baz',
+                       ),
+               ), $out->getSections(), 'getSections() with proper value when <h2> is used' );
+       }
        // TODO: Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
 }
index 3af805a..fe823fa 100644 (file)
@@ -3,10 +3,15 @@
  * Sanity checks for making sure registered resources are sane.
  *
  * @file
- * @author Niklas Laxström, 2012
- * @author Antoine Musso, 2012
- * @author Santhosh Thottingal, 2012
- * @author Timo Tijhof, 2012
+ * @author Antoine Musso
+ * @author Niklas Laxström
+ * @author Santhosh Thottingal
+ * @author Timo Tijhof
+ * @copyright © 2012, Antoine Musso
+ * @copyright © 2012, Niklas Laxström
+ * @copyright © 2012, Santhosh Thottingal
+ * @copyright © 2012, Timo Tijhof
+ *
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
  */
 class ResourcesTest extends MediaWikiTestCase {