Merge "Split change_tag sql patch"
authorMwalker <mwalker@wikimedia.org>
Fri, 18 Oct 2013 18:57:38 +0000 (18:57 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 18 Oct 2013 18:57:38 +0000 (18:57 +0000)
253 files changed:
RELEASE-NOTES-1.22
docs/hooks.txt
includes/AutoLoader.php
includes/DefaultSettings.php
includes/Exception.php
includes/FormOptions.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/HashRing.php
includes/Html.php
includes/IP.php
includes/LinksUpdate.php
includes/MimeMagic.php
includes/Revision.php
includes/SkinTemplate.php
includes/SpecialPage.php
includes/StatCounter.php
includes/Status.php
includes/Wiki.php
includes/WikiPage.php
includes/api/ApiOptions.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQuerySiteinfo.php
includes/cache/SquidUpdate.php
includes/content/ContentHandler.php
includes/context/DerivativeContext.php
includes/context/RequestContext.php
includes/db/Database.php
includes/db/DatabaseMysql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseMysqli.php [new file with mode: 0644]
includes/db/DatabaseSqlite.php
includes/diff/DifferenceEngine.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/file/LocalFile.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/job/JobQueueFederated.php
includes/json/FormatJson.php
includes/parser/Parser.php
includes/profiler/ProfilerSimpleUDP.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialTags.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialWatchlist.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
languages/messages/MessagesAce.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAr.php
languages/messages/MessagesArz.php
languages/messages/MessagesAst.php
languages/messages/MessagesAz.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesCu.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesGl.php
languages/messages/MessagesGu.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHr.php
languages/messages/MessagesHu.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIo.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKm.php
languages/messages/MessagesKo.php
languages/messages/MessagesKsh.php
languages/messages/MessagesLa.php
languages/messages/MessagesLb.php
languages/messages/MessagesLt.php
languages/messages/MessagesLv.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOr.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRo.php
languages/messages/MessagesRu.php
languages/messages/MessagesSco.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSo.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSv.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTh.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
languages/messages/MessagesUk.php
languages/messages/MessagesVi.php
languages/messages/MessagesVmf.php
languages/messages/MessagesVo.php
languages/messages/MessagesWar.php
languages/messages/MessagesWuu.php
languages/messages/MessagesYi.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/archives/patch-archive-ar_id.sql [new file with mode: 0644]
maintenance/archives/patch-externallinks-el_id.sql [new file with mode: 0644]
maintenance/backup.inc
maintenance/cleanupTable.inc
maintenance/cleanupTitles.php
maintenance/copyFileBackend.php
maintenance/createAndPromote.php
maintenance/importImages.php
maintenance/jsduck/categories.json
maintenance/jsduck/config.json
maintenance/language/checkDupeMessages.php
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/mergeMessageFileList.php
maintenance/mssql/tables.sql
maintenance/oracle/archives/patch-archive-ar_id.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-externallinks-el_id.sql [new file with mode: 0644]
maintenance/oracle/tables.sql
maintenance/postgres/archives/patch-profiling.sql
maintenance/postgres/tables.sql
maintenance/purgeChangedFiles.php [new file with mode: 0644]
maintenance/purgeChangedPages.php [new file with mode: 0644]
maintenance/purgeDeletedFiles.php [deleted file]
maintenance/showJobs.php
maintenance/sqlite.inc
maintenance/sqlite/archives/initial-indexes.sql
maintenance/sqlite/archives/patch-archive-ar_id.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-externallinks-el_id.sql [new file with mode: 0644]
maintenance/tables.sql
resources/Resources.php
resources/jquery/jquery.spinner.css
resources/mediawiki.action/mediawiki.action.edit.preview.js
resources/mediawiki.action/mediawiki.action.view.postEdit.js
resources/mediawiki.api/mediawiki.api.edit.js
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki.less/mediawiki.mixins.less
resources/mediawiki.page/mediawiki.page.gallery.js
resources/mediawiki.special/mediawiki.special.userLogin.css
resources/mediawiki.special/mediawiki.special.vforms.css
resources/mediawiki.ui/mediawiki.ui.default.css
resources/mediawiki.ui/mediawiki.ui.vector.css
resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss
resources/mediawiki/mediawiki.Title.js
resources/mediawiki/mediawiki.inspect.js [new file with mode: 0644]
resources/mediawiki/mediawiki.js
resources/startup.js
skins/Vector.php
skins/vector/beta/screen.less [new file with mode: 0644]
skins/vector/beta/variables.less [new file with mode: 0644]
skins/vector/collapsibleNav.less
skins/vector/screen-hd.css [deleted file]
skins/vector/screen-hd.less [new file with mode: 0644]
skins/vector/screen.less
skins/vector/styles-beta.less [new file with mode: 0644]
skins/vector/styles.less [new file with mode: 0644]
skins/vector/variables.less [new file with mode: 0644]
tests/phpunit/includes/CollationTest.php
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/StringUtilsTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php [new file with mode: 0644]
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTest.php
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
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/startup.test.js
thumb.php

index 7933e06..b988294 100644 (file)
@@ -58,6 +58,9 @@ production.
   default Sidebar.
 * The 'vector-simplesearch' preference is now enabled by default. Previously
   it was only enabled if the Vector extension was installed.
+* The precise format of metric datagrams produced by the UDP profiler and stats counter
+  may now be specified as $wgUDPProfilerFormatString and $wgStatsFormatString,
+  respectively.
 
 === New features in 1.22 ===
 * (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
@@ -215,8 +218,8 @@ production.
   and Special:AllMyUploads respectively.
 * IPv6 addresses in X-Forwarded-For headers are now normalised before checking
   against allowed proxy lists.
-* Add deferrable update support for callback/closure
-* Add TitleMove hook before page renames
+* Add deferrable update support for callback/closure.
+* Add TitleMove hook before page renames.
 * Revision deletion backend code is moved out of SpecialRevisiondelete
 * Add a variable (wgRedactedFunctionArguments) to redact the values sent as certain function
   parameters from exception stack traces.
@@ -234,8 +237,15 @@ production.
    for more details regarding custom functions.
 ** $wgResourceLoaderLESSImportPaths is an array of file system paths. Files
    referenced in LESS '@import' statements are looked up here first.
-* Added meta=filerepoinfo API module for getting information about foreign
-  image repositories, and related ForeignAPIRepo methods getInfo and getApiUrl.
+* ResourceLoader supports hashes as module cache invalidation trigger (instead
+  of or in addition to timestamps).
+* Added $wgExtensionEntryPointListFiles for use in mergeMessageFileList.php.
+* Added a hook, APIQuerySiteInfoStatisticsInfo, to allow extensions to modify
+  the output of the API query meta=siteinfo&siprop=statistics
+* Primary keys have been added to both the archive table and the externallinks
+  tables.
+* Added $wgEnableParserLimitReporting to control whether the NewPP limit report is
+  output in a HTML comment.
 
 === Bug fixes in 1.22 ===
 * Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
@@ -320,6 +330,7 @@ production.
   database is created.
 * (bug 47191) Fixed "Column 'si_title' cannot be part of FULLTEXT index"
   MySQL error when installing using the binary character set option.
+* (bug 45288) Support mysqli PHP extension
 
 === API changes in 1.22 ===
 * (bug 25553) The JSON output formatter now leaves forward slashes unescaped
@@ -378,6 +389,9 @@ production.
   "exists-normalized" instead of filename to be uploaded to.
 * (bug 53884) action=edit will now return an error when the specified section
   does not exist in the page.
+* Added meta=filerepoinfo API module for getting information about foreign
+  file repositories, and related ForeignAPIRepo methods getInfo and getApiUrl.
+* The new query module list=allfileusages to enumerate file usages was added.
 
 === Languages updated in 1.22===
 
@@ -482,6 +496,8 @@ changes to languages because of Bugzilla reports.
   of media handler overriding MediaHandler::parseParamString.
 * (bug 46512) The collapsibleNav feature from the Vector extension has been moved
   to the Vector skin in core.
+* SpecialRecentChanges::addRecentChangesJS() function has been renamed
+  to addModules() and made protected.
 
 == Compatibility ==
 
index 2d1001b..53993de 100644 (file)
@@ -432,6 +432,10 @@ sites general information.
 $module: the current ApiQuerySiteInfo module
 &$results: array of results, add things here
 
+'APIQuerySiteInfoStatisticsInfo': Use this hook to add extra information to the
+sites statistics information.
+&$results: array of results, add things here
+
 'APIQueryUsersTokens': Use this hook to add custom token to list=users. Every
 token has an action, which will be used in the ustoken parameter and in the
 output (actiontoken="..."), and a callback function which should return the
index 8d571ad..652fa54 100644 (file)
@@ -479,6 +479,7 @@ $wgAutoloadLocalClasses = array(
        'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
        'DatabaseMysql' => 'includes/db/DatabaseMysql.php',
        'DatabaseMysqlBase' => 'includes/db/DatabaseMysqlBase.php',
+       'DatabaseMysqli' => 'includes/db/DatabaseMysqli.php',
        'DatabaseOracle' => 'includes/db/DatabaseOracle.php',
        'DatabasePostgres' => 'includes/db/DatabasePostgres.php',
        'DatabaseSqlite' => 'includes/db/DatabaseSqlite.php',
index 19b2f41..a0a1b3e 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.
@@ -1879,11 +1872,6 @@ $wgAllowSlowParserFunctions = false;
  */
 $wgAllowSchemaUpdates = true;
 
-/**
- * Do DELETE/INSERT for link updates instead of incremental
- */
-$wgUseDumbLinkUpdate = false;
-
 /**
  * Anti-lock flags - bitfield
  *   - ALF_NO_LINK_LOCK:
@@ -4647,13 +4635,20 @@ $wgRateLimits = array(
                'ip' => null,
                'subnet' => null,
        ),
-       'mailpassword' => array(
+       'mailpassword' => array( // triggering password resets emails
                'anon' => null,
        ),
-       'emailuser' => array(
+       'emailuser' => array( // emailing other users using MediaWiki
                'user' => null,
        ),
-       'linkpurge' => array(
+       'linkpurge' => array( // purges of link tables
+               'anon' => null,
+               'user' => null,
+               'newbie' => null,
+               'ip' => null,
+               'subnet' => null,
+       ),
+       'renderfile' => array( // files rendered via thumb.php or thumb_handler.php
                'anon' => null,
                'user' => null,
                'newbie' => null,
@@ -5052,6 +5047,17 @@ $wgUDPProfilerHost = '127.0.0.1';
  */
 $wgUDPProfilerPort = '3811';
 
+/**
+ * Format string for the UDP profiler. The UDP profiler invokes sprintf() with
+ * (profile id, count, cpu, cpu_sq, real, real_sq, entry name) as arguments.
+ * You can use sprintf's argument numbering/swapping capability to repeat,
+ * re-order or omit fields.
+ *
+ * @see $wgStatsFormatString
+ * @since 1.22
+ */
+$wgUDPProfilerFormatString = "%s - %d %f %f %f %f %s\n";
+
 /**
  * Detects non-matching wfProfileIn/wfProfileOut calls
  */
@@ -5078,6 +5084,19 @@ $wgStatsMethod = 'cache';
  */
 $wgAggregateStatsID = false;
 
+/**
+ * When $wgStatsMethod is 'udp', this variable specifies how stats should be
+ * formatted. Its value should be a format string suitable for a sprintf()
+ * invocation with (id, count, key) arguments, where 'id' is either
+ * $wgAggregateStatsID or the DB name, 'count' is the value by which the metric
+ * is being incremented, and 'key' is the metric name.
+ *
+ * @see $wgUDPProfilerFormatString
+ * @see $wgAggregateStatsID
+ * @since 1.22
+ */
+$wgStatsFormatString = "stats/%s - %s 1 1 1 1 %s\n";
+
 /**
  * Whereas to count the number of time an article is viewed.
  * Does not work if pages are cached (for example with squid).
@@ -5894,6 +5913,13 @@ $wgExtensionFunctions = array();
  */
 $wgExtensionMessagesFiles = array();
 
+/**
+ * Array of files with list(s) of extension entry points to be used in
+ * maintenance/mergeMessageFileList.php
+ * @since 1.22
+ */
+$wgExtensionEntryPointListFiles = array();
+
 /**
  * Parser output hooks.
  * This is an associative array where the key is an extension-defined tag
@@ -5910,6 +5936,11 @@ $wgExtensionMessagesFiles = array();
  */
 $wgParserOutputHooks = array();
 
+/**
+ * Whether to include the NewPP limit report as a HTML comment
+ */
+$wgEnableParserLimitReporting = true;
+
 /**
  * List of valid skin names.
  * The key should be the name in all lower case, the value should be a properly
index 39fe6f4..fba857f 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup Exception
  */
 class MWException extends Exception {
-       var $logId;
 
        /**
         * Should the exception use $wgOut to output the error?
@@ -131,7 +130,7 @@ class MWException extends Exception {
                                "</p>\n";
                } else {
                        return "<div class=\"errorbox\">" .
-                               '[' . $this->getLogId() . '] ' .
+                               '[' . MWExceptionHandler::getLogId( $this ) . '] ' .
                                gmdate( 'Y-m-d H:i:s' ) .
                                ": Fatal exception of type " . get_class( $this ) . "</div>\n" .
                                "<!-- Set \$wgShowExceptionDetails = true; " .
@@ -169,43 +168,28 @@ class MWException extends Exception {
        }
 
        /**
-        * Get a random ID for this error.
-        * This allows to link the exception to its corresponding log entry when
-        * $wgShowExceptionDetails is set to false.
+        * Get a the ID for this error.
         *
+        * @since 1.20
+        * @deprecated since 1.22 Use MWExceptionHandler::getLogId instead.
         * @return string
         */
        function getLogId() {
-               if ( $this->logId === null ) {
-                       $this->logId = wfRandomString( 8 );
-               }
-               return $this->logId;
+               wfDeprecated( __METHOD__, '1.22' );
+               return MWExceptionHandler::getLogId( $this );
        }
 
        /**
         * Return the requested URL and point to file and line number from which the
         * exception occurred
         *
+        * @since 1.8
+        * @deprecated since 1.22 Use MWExceptionHandler::getLogMessage instead.
         * @return string
         */
        function getLogMessage() {
-               global $wgRequest;
-
-               $id = $this->getLogId();
-               $file = $this->getFile();
-               $line = $this->getLine();
-               $message = $this->getMessage();
-
-               if ( isset( $wgRequest ) && !$wgRequest instanceof FauxRequest ) {
-                       $url = $wgRequest->getRequestURL();
-                       if ( !$url ) {
-                               $url = '[no URL]';
-                       }
-               } else {
-                       $url = '[no req]';
-               }
-
-               return "[$id] $url   Exception from line $line of $file: $message";
+               wfDeprecated( __METHOD__, '1.22' );
+               return MWExceptionHandler::getLogMessage( $this );
        }
 
        /**
@@ -249,7 +233,7 @@ class MWException extends Exception {
        function report() {
                global $wgMimeType;
 
-               $this->logException();
+               MWExceptionHandler::logException( $this );
 
                if ( defined( 'MW_API' ) ) {
                        // Unhandled API exception, we can't be sure that format printer is alive
@@ -266,22 +250,6 @@ class MWException extends Exception {
                }
        }
 
-       /**
-        * Log the error message to the exception log (if enabled)
-        */
-       function logException() {
-               global $wgLogExceptionBacktrace;
-
-               $log = $this->getLogMessage();
-               if ( $log ) {
-                       if ( $wgLogExceptionBacktrace ) {
-                               wfDebugLog( 'exception', $log . "\n" . MWExceptionHandler::formatRedactedTrace( $this ) . "\n" );
-                       } else {
-                               wfDebugLog( 'exception', $log );
-                       }
-               }
-       }
-
        /**
         * Check whether we are in command line mode or not to report the exception
         * in the correct format.
@@ -737,24 +705,103 @@ class MWExceptionHandler {
                                }
                        }
 
-                       $finalExceptionText .= "#{$i} {$call['file']}({$call['line']}): ";
+                       if ( isset( $call['file'] ) && isset( $call['line'] ) ) {
+                               $finalExceptionText .= "#{$i} {$call['file']}({$call['line']}): ";
+                       } else {
+                               // 'file' and 'line' are unset for calls via call_user_func (bug 55634)
+                               // This matches behaviour of Exception::getTraceAsString to instead
+                               // display "[internal function]".
+                               $finalExceptionText .= "#{$i} [internal function]: ";
+                       }
+
                        if ( isset( $call['class'] ) ) {
                                $finalExceptionText .= $call['class'] . $call['type'] . $call['function'];
                        } else {
                                $finalExceptionText .= $call['function'];
                        }
                        $args = array();
-                       foreach ( $call['args'] as $arg ) {
-                               if ( is_object( $arg ) ) {
-                                       $args[] = 'Object(' . get_class( $arg ) . ')';
-                               } elseif( is_array( $arg ) ) {
-                                       $args[] = 'Array';
-                               } else {
-                                       $args[] = var_export( $arg, true );
+                       if ( isset( $call['args'] ) ) {
+                               foreach ( $call['args'] as $arg ) {
+                                       if ( is_object( $arg ) ) {
+                                               $args[] = 'Object(' . get_class( $arg ) . ')';
+                                       } elseif( is_array( $arg ) ) {
+                                               $args[] = 'Array';
+                                       } else {
+                                               $args[] = var_export( $arg, true );
+                                       }
                                }
                        }
                        $finalExceptionText .=  '(' . implode( ', ', $args ) . ")\n";
                }
                return $finalExceptionText . '#' . ( $i + 1 ) . ' {main}';
        }
+
+
+       /**
+        * Get the ID for this error.
+        *
+        * The ID is saved so that one can match the one output to the user (when
+        * $wgShowExceptionDetails is set to false), to the entry in the debug log.
+        *
+        * @since 1.22
+        * @param Exception $e
+        * @return string
+        */
+       public static function getLogId( Exception $e ) {
+               if ( !isset( $e->_mwLogId ) ) {
+                       $e->_mwLogId = wfRandomString( 8 );
+               }
+               return $e->_mwLogId;
+       }
+
+       /**
+        * Return the requested URL and point to file and line number from which the
+        * exception occurred.
+        *
+        * @since 1.22
+        * @param Exception $e
+        * @return string
+        */
+       public static function getLogMessage( Exception $e ) {
+               global $wgRequest;
+
+               $id = self::getLogId( $e );
+               $file = $e->getFile();
+               $line = $e->getLine();
+               $message = $e->getMessage();
+
+               if ( isset( $wgRequest ) && !$wgRequest instanceof FauxRequest ) {
+                       $url = $wgRequest->getRequestURL();
+                       if ( !$url ) {
+                               $url = '[no URL]';
+                       }
+               } else {
+                       $url = '[no req]';
+               }
+
+               return "[$id] $url   Exception from line $line of $file: $message";
+       }
+
+       /**
+        * Log an exception to the exception log (if enabled).
+        *
+        * This method must not assume the exception is an MWException,
+        * it is also used to handle PHP errors or errors from other libraries.
+        *
+        * @since 1.22
+        * @param Exception $e
+        */
+       public static function logException( Exception $e ) {
+               global $wgLogExceptionBacktrace;
+
+               $log = self::getLogMessage( $e );
+               if ( $log ) {
+                       if ( $wgLogExceptionBacktrace ) {
+                               wfDebugLog( 'exception', $log . "\n" . self::formatRedactedTrace( $e ) . "\n" );
+                       } else {
+                               wfDebugLog( 'exception', $log );
+                       }
+               }
+       }
+
 }
index 530b094..eff1756 100644 (file)
@@ -28,7 +28,8 @@
 /**
  * Helper class to keep track of options when mixing links and form elements.
  *
- * @todo This badly need some examples and tests :-)
+ * @todo This badly needs some examples and tests :) The usage in SpecialRecentchanges class is a
+ *     good ersatz in the meantime.
  */
 class FormOptions implements ArrayAccess {
        /** @name Type constants
@@ -50,12 +51,26 @@ class FormOptions implements ArrayAccess {
        /* @} */
 
        /**
-        * @todo Document!
+        * Map of known option names to information about them.
+        *
+        * Each value is an array with the following keys:
+        * - 'default' - the default value as passed to add()
+        * - 'value' - current value, start with null, can be set by various functions
+        * - 'consumed' - true/false, whether the option was consumed using
+        *   consumeValue() or consumeValues()
+        * - 'type' - one of the type constants (but never AUTO)
         */
        protected $options = array();
 
        # Setting up
 
+       /**
+        * Add an option to be handled by this FormOptions instance.
+        *
+        * @param string $name Request parameter name
+        * @param mixed $default Default value when the request parameter is not present
+        * @param int $type One of the type constants (optional, defaults to AUTO)
+        */
        public function add( $name, $default, $type = self::AUTO ) {
                $option = array();
                $option['default'] = $default;
@@ -71,20 +86,25 @@ class FormOptions implements ArrayAccess {
                $this->options[$name] = $option;
        }
 
+       /**
+        * Remove an option being handled by this FormOptions instance. This is the inverse of add().
+        *
+        * @param string $name Request parameter name
+        */
        public function delete( $name ) {
                $this->validateName( $name, true );
                unset( $this->options[$name] );
        }
 
        /**
-        * Used to find out which type the data is.
-        * All types are defined in the 'Type constants' section of this class
-        * Please note we do not support detection of INTNULL MediaWiki type
-        * which will be assumed as INT if the data is an integer.
+        * Used to find out which type the data is. All types are defined in the 'Type constants' section
+        * of this class.
         *
-        * @param $data Mixed: value to guess type for
-        * @throws MWException
-        * @exception MWException Unsupported datatype
+        * Detection of the INTNULL type is not supported; INT will be assumed if the data is an integer,
+        * MWException will be thrown if it's null.
+        *
+        * @param mixed $data Value to guess the type for
+        * @throws MWException If unable to guess the type
         * @return int Type constant
         */
        public static function guessType( $data ) {
@@ -102,12 +122,12 @@ class FormOptions implements ArrayAccess {
        # Handling values
 
        /**
-        * Verify the given option name exist.
+        * Verify that the given option name exists.
         *
-        * @param string $name option name
-        * @param $strict Boolean: throw an exception when the option does not exist (default false)
+        * @param string $name Option name
+        * @param bool $strict Throw an exception when the option doesn't exist instead of returning false
         * @throws MWException
-        * @return Boolean: true if option exist, false otherwise
+        * @return bool True if the option exists, false otherwise
         */
        public function validateName( $name, $strict = false ) {
                if ( !isset( $this->options[$name] ) ) {
@@ -117,6 +137,7 @@ class FormOptions implements ArrayAccess {
                                return false;
                        }
                }
+
                return true;
        }
 
@@ -124,9 +145,9 @@ class FormOptions implements ArrayAccess {
         * Use to set the value of an option.
         *
         * @param string $name option name
-        * @param $value Mixed: value for the option
-        * @param $force Boolean: whether to set the value when it is equivalent to the default value for this option (default false).
-        * @return null
+        * @param mixed $value value for the option
+        * @param bool $force Whether to set the value when it is equivalent to
+        * the default value for this option (default false).
         */
        public function setValue( $name, $value, $force = false ) {
                $this->validateName( $name, true );
@@ -144,7 +165,7 @@ class FormOptions implements ArrayAccess {
         * Internally use getValueReal()
         *
         * @param string $name option name
-        * @return Mixed
+        * @return mixed
         */
        public function getValue( $name ) {
                $this->validateName( $name, true );
@@ -155,7 +176,7 @@ class FormOptions implements ArrayAccess {
        /**
         * @todo Document
         * @param array $option array structure describing the option
-        * @return Mixed. Value or the default value if it is null
+        * @return mixed Value or the default value if it is null
         */
        protected function getValueReal( $option ) {
                if ( $option['value'] !== null ) {
@@ -167,9 +188,8 @@ class FormOptions implements ArrayAccess {
 
        /**
         * Delete the option value.
-        * This will make future calls to getValue()  return the default value.
-        * @param string $name option name
-        * @return null
+        * This will make future calls to getValue() return the default value.
+        * @param string $name Option name
         */
        public function reset( $name ) {
                $this->validateName( $name, true );
@@ -177,10 +197,13 @@ class FormOptions implements ArrayAccess {
        }
 
        /**
-        * @todo Document
+        * Get the value of given option and mark it as 'consumed'. Consumed options are not returned
+        * by getUnconsumedValues().
+        *
+        * @see consumeValues()
+        * @throws MWException If the option does not exist
         * @param string $name Option name
-        * @throws MWException If option does not exist.
-        * @return mixed Value or the default value if it is null.
+        * @return mixed Value, or the default value if it is null
         */
        public function consumeValue( $name ) {
                $this->validateName( $name, true );
@@ -190,11 +213,15 @@ class FormOptions implements ArrayAccess {
        }
 
        /**
-        * @todo Document
-        * @param array $names array of option names
-        * @return null
+        * Get the values of given options and mark them as 'consumed'. Consumed options are not returned
+        * by getUnconsumedValues().
+        *
+        * @see consumeValue()
+        * @throws MWException If any option does not exist
+        * @param array $names Array of option names as strings
+        * @return array Array of option values, or the default values if they are null
         */
-       public function consumeValues( /*Array*/ $names ) {
+       public function consumeValues( $names ) {
                $out = array();
 
                foreach ( $names as $name ) {
@@ -213,9 +240,7 @@ class FormOptions implements ArrayAccess {
         * @param string $name option name
         * @param int $min minimum value
         * @param int $max maximum value
-        * @throws MWException
-        * @exception MWException Option is not of type int
-        * @return null
+        * @throws MWException If option is not of type INT
         */
        public function validateIntBounds( $name, $min, $max ) {
                $this->validateName( $name, true );
@@ -231,9 +256,10 @@ class FormOptions implements ArrayAccess {
        }
 
        /**
-        * Getting the data out for use
-        * @param $all Boolean: whether to include unchanged options (default: false)
-        * @return Array
+        * Get all remaining values which have not been consumed by consumeValue() or consumeValues().
+        *
+        * @param bool $all Whether to include unchanged options (default: false)
+        * @return array
         */
        public function getUnconsumedValues( $all = false ) {
                $values = array();
@@ -251,7 +277,7 @@ class FormOptions implements ArrayAccess {
 
        /**
         * Return options modified as an array ( name => value )
-        * @return Array
+        * @return array
         */
        public function getChangedValues() {
                $values = array();
@@ -266,8 +292,8 @@ class FormOptions implements ArrayAccess {
        }
 
        /**
-        * Format options to an array ( name => value)
-        * @return Array
+        * Format options to an array ( name => value )
+        * @return array
         */
        public function getAllValues() {
                $values = array();
@@ -281,12 +307,22 @@ class FormOptions implements ArrayAccess {
 
        # Reading values
 
-       public function fetchValuesFromRequest( WebRequest $r, $values = false ) {
-               if ( !$values ) {
-                       $values = array_keys( $this->options );
+       /**
+        * Fetch values for all options (or selected options) from the given WebRequest, making them
+        * available for accessing with getValue() or consumeValue() etc.
+        *
+        * @param WebRequest $r The request to fetch values from
+        * @param array $optionKeys Which options to fetch the values for (default:
+        *     all of them). Note that passing an empty array will also result in
+        *     values for all keys being fetched.
+        * @throws MWException If the type of any option is invalid
+        */
+       public function fetchValuesFromRequest( WebRequest $r, $optionKeys = null ) {
+               if ( !$optionKeys ) {
+                       $optionKeys = array_keys( $this->options );
                }
 
-               foreach ( $values as $name ) {
+               foreach ( $optionKeys as $name ) {
                        $default = $this->options[$name]['default'];
                        $type = $this->options[$name]['type'];
 
@@ -314,29 +350,26 @@ class FormOptions implements ArrayAccess {
        }
 
        /** @name ArrayAccess functions
-        * Those function implements PHP ArrayAccess interface
+        * These functions implement the ArrayAccess PHP interface.
         * @see http://php.net/manual/en/class.arrayaccess.php
         */
        /* @{ */
-       /**
-        * Whether option exist
-        * @return bool
-        */
+       /** Whether the option exists. */
        public function offsetExists( $name ) {
                return isset( $this->options[$name] );
        }
-       /**
-        * Retrieve an option value
-        * @return Mixed
-        */
+
+       /** Retrieve an option value. */
        public function offsetGet( $name ) {
                return $this->getValue( $name );
        }
-       /**     Set an option to given value */
+
+       /** Set an option to given value. */
        public function offsetSet( $name, $value ) {
                $this->setValue( $name, $value );
        }
-       /**     Delete the option */
+
+       /** Delete the option. */
        public function offsetUnset( $name ) {
                $this->delete( $name );
        }
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 5de34d6..d260862 100644 (file)
@@ -94,7 +94,7 @@
 class HTMLForm extends ContextSource {
 
        // A mapping of 'type' inputs onto standard HTMLFormField subclasses
-       private static $typeMappings = array(
+       public static $typeMappings = array(
                'api' => 'HTMLApiField',
                'text' => 'HTMLTextField',
                'textarea' => 'HTMLTextAreaField',
@@ -187,6 +187,7 @@ class HTMLForm extends ContextSource {
                'table',
                'div',
                'raw',
+               'vform',
        );
 
        /**
@@ -223,8 +224,15 @@ class HTMLForm extends ContextSource {
                        }
 
                        $field = self::loadInputFromParameters( $fieldname, $info );
+                       // FIXME During field's construct, the parent form isn't available!
+                       // could add a 'parent' name-value to $info, could add a third parameter.
                        $field->mParent = $this;
 
+                       // vform gets too much space if empty labels generate HTML.
+                       if ( $this->isVForm() ) {
+                               $field->setShowEmptyLabel( false );
+                       }
+
                        $setSection =& $loadedDescriptor;
                        if ( $section ) {
                                $sectionParts = explode( '/', $section );
@@ -272,6 +280,15 @@ class HTMLForm extends ContextSource {
                return $this->displayFormat;
        }
 
+       /**
+        * Test if displayFormat is 'vform'
+        * @since 1.22
+        * @return Bool
+        */
+       public function isVForm() {
+               return $this->displayFormat === 'vform';
+       }
+
        /**
         * Add the HTMLForm-specific JavaScript, if it hasn't been
         * done already.
@@ -626,6 +643,11 @@ class HTMLForm extends ContextSource {
                # For good measure (it is the default)
                $this->getOutput()->preventClickjacking();
                $this->getOutput()->addModules( 'mediawiki.htmlform' );
+               if ( $this->isVForm() ) {
+                       $this->getOutput()->addModuleStyles( 'mediawiki.ui' );
+                       // TODO should vertical form set setWrapperLegend( false )
+                       // to hide ugly fieldsets?
+               }
 
                $html = ''
                        . $this->getErrors( $submitResult )
@@ -660,13 +682,16 @@ class HTMLForm extends ContextSource {
                $attribs = array(
                        'action' => $this->getAction(),
                        'method' => $this->getMethod(),
-                       'class' => 'visualClear',
+                       'class' => array( 'visualClear' ),
                        'enctype' => $encType,
                );
                if ( !empty( $this->mId ) ) {
                        $attribs['id'] = $this->mId;
                }
 
+               if ( $this->isVForm() ) {
+                       array_push( $attribs['class'], 'mw-ui-vform', 'mw-ui-container' );
+               }
                return Html::rawElement( 'form', $attribs, $html );
        }
 
@@ -717,9 +742,22 @@ class HTMLForm extends ContextSource {
                                $attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
                        }
 
-                       $attribs['class'] = 'mw-htmlform-submit';
+                       $attribs['class'] = array( 'mw-htmlform-submit' );
+
+                       if ( $this->isVForm() ) {
+                               // mw-ui-block is necessary because the buttons aren't necessarily in an 
+                               // immediate child div of the vform.
+                               array_push( $attribs['class'], 'mw-ui-button', 'mw-ui-big', 'mw-ui-primary', 'mw-ui-block' );
+                       }
 
                        $html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
+
+                       // Buttons are top-level form elements in table and div layouts,
+                       // but vform wants all elements inside divs to get spaced-out block
+                       // styling.
+                       if ( $this->isVForm() ) {
+                               $html = Html::rawElement( 'div', null, "\n$html\n" );
+                       }
                }
 
                if ( $this->mShowReset ) {
@@ -913,7 +951,8 @@ class HTMLForm extends ContextSource {
        /**
         * Prompt the whole form to be wrapped in a "<fieldset>", with
         * this text as its "<legend>" element.
-        * @param string $legend HTML to go inside the "<legend>" element.
+        * @param string|false $legend HTML to go inside the "<legend>" element, or
+        * false for no <legend>
         *       Will be escaped
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -982,7 +1021,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * @todo Document
-        * @param $fields array[]|HTMLFormField[] array of fields (either arrays or objects)
+        * @param array[]|HTMLFormField[] $fields array of fields (either arrays or objects)
         * @param string $sectionName ID attribute of the "<table>" tag for this section, ignored if empty
         * @param string $fieldsetIDPrefix ID prefix for the "<fieldset>" tag of each subsection, ignored if empty
         * @param boolean &$hasUserVisibleFields Whether the section had user-visible fields
@@ -995,7 +1034,17 @@ class HTMLForm extends ContextSource {
                $subsectionHtml = '';
                $hasLabel = false;
 
-               $getFieldHtmlMethod = ( $displayFormat == 'table' ) ? 'getTableRow' : 'get' . ucfirst( $displayFormat );
+               switch( $displayFormat ) {
+                       case 'table':
+                               $getFieldHtmlMethod = 'getTableRow';
+                               break;
+                       case 'vform':
+                               // Close enough to a div.
+                               $getFieldHtmlMethod = 'getDiv';
+                               break;
+                       default:
+                               $getFieldHtmlMethod = 'get' . ucfirst( $displayFormat );
+               }
 
                foreach ( $fields as $key => $value ) {
                        if ( $value instanceof HTMLFormField ) {
@@ -1061,7 +1110,7 @@ class HTMLForm extends ContextSource {
                        if ( $displayFormat === 'table' ) {
                                $html = Html::rawElement( 'table', $attribs,
                                        Html::rawElement( 'tbody', array(), "\n$html\n" ) ) . "\n";
-                       } elseif ( $displayFormat === 'div' ) {
+                       } elseif ( $displayFormat === 'div' || $displayFormat === 'vform' ) {
                                $html = Html::rawElement( 'div', $attribs, "\n$html\n" );
                        }
                }
@@ -1268,6 +1317,18 @@ abstract class HTMLFormField {
                return true;
        }
 
+       /**
+        * Tell the field whether to generate a separate label element if its label
+        * is blank.
+        *
+        * @since 1.22
+        * @param bool $show Set to false to not generate a label.
+        * @return void
+        */
+       public function setShowEmptyLabel( $show ) {
+               $this->mShowEmptyLabels = $show;
+       }
+
        /**
         * Get the value that this input has been set to from a posted form,
         * or the input's default value if it has not been set.
@@ -1431,8 +1492,12 @@ abstract class HTMLFormField {
                        array( 'class' => $outerDivClass ) + $cellAttributes,
                        $inputHtml . "\n$errors"
                );
+               $divCssClasses = array( "mw-htmlform-field-$fieldType", $this->mClass, $errorClass );
+               if ( $this->mParent->isVForm() ) {
+                       $divCssClasses[] = 'mw-ui-vform-div';
+               }
                $html = Html::rawElement( 'div',
-                       array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass" ),
+                       array( 'class' => $divCssClasses ),
                        $label . $field );
                $html .= $helptext;
                return $html;
@@ -1876,8 +1941,25 @@ class HTMLCheckField extends HTMLFormField {
                        $attr['class'] = $this->mClass;
                }
 
-               return Xml::check( $this->mName, $value, $attr ) . '&#160;' .
-                       Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
+               if ( $this->mParent->isVForm() ) {
+                       // Nest checkbox inside label.
+                       return Html::rawElement(
+                                       'label',
+                                       array(
+                                               'class' => 'mw-ui-checkbox-label'
+                                       ),
+                                       Xml::check(
+                                               $this->mName,
+                                               $value,
+                                               $attr
+                                       ) .
+                                       // Html:rawElement doesn't escape contents.
+                                       htmlspecialchars( $this->mLabel )
+                               );
+               } else {
+                       return Xml::check( $this->mName, $value, $attr ) . '&#160;' .
+                               Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
+               }
        }
 
        /**
@@ -1889,6 +1971,13 @@ class HTMLCheckField extends HTMLFormField {
                return '&#160;';
        }
 
+       /**
+        * checkboxes don't need a label.
+        */
+       protected function needsLabel() {
+               return false;
+       }
+
        /**
         * @param  $request WebRequest
         * @return String
index cd39ad8..930f8c0 100644 (file)
@@ -27,6 +27,8 @@
  * @since 1.22
  */
 class HashRing {
+       /** @var Array (location => weight) */
+       protected $sourceMap = array();
        /** @var Array (location => (start, end)) */
        protected $ring = array();
 
@@ -40,6 +42,7 @@ class HashRing {
                if ( !count( $map ) ) {
                        throw new MWException( "Ring is empty or all weights are zero." );
                }
+               $this->sourceMap = $map;
                // Sort the locations based on the hash of their names
                $hashes = array();
                foreach ( $map as $location => $weight ) {
@@ -112,4 +115,28 @@ class HashRing {
                }
                return $locations;
        }
+
+       /**
+        * Get the map of locations to weight (ignores 0-weight items)
+        *
+        * @return array
+        */
+       public function getLocationWeights() {
+               return $this->sourceMap;
+       }
+
+       /**
+        * Get a new hash ring with a location removed from the ring
+        *
+        * @param string $location
+        * @return HashRing|bool Returns false if no non-zero weighted spots are left
+        */
+       public function newWithoutLocation( $location ) {
+               $map = $this->sourceMap;
+               unset( $map[$location] );
+               if ( count( $map ) ) {
+                       return new self( $map );
+               }
+               return false;
+       }
 }
index 3fea3e1..932f753 100644 (file)
@@ -422,6 +422,7 @@ class Html {
                $ret = '';
                $attribs = (array)$attribs;
                foreach ( $attribs as $key => $value ) {
+                       // Support intuitive array( 'checked' => true/false ) form
                        if ( $value === false || is_null( $value ) ) {
                                continue;
                        }
index fc76310..73834a5 100644 (file)
@@ -39,18 +39,11 @@ define( 'RE_IPV6_ADD',
                ':(?::|(?::' . RE_IPV6_WORD . '){1,7})' .
        '|' . // ends with "::" (except "::")
                RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){0,6}::' .
-       '|' . // contains one "::" in the middle, ending in "::WORD"
-               RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){0,5}' . '::' . RE_IPV6_WORD .
-       '|' . // contains one "::" in the middle, not ending in "::WORD" (regex for PCRE 4.0+)
-               RE_IPV6_WORD . '(?::(?P<abn>:(?P<iabn>))?' . RE_IPV6_WORD . '(?!:(?P=abn))){1,5}' .
-                       ':' . RE_IPV6_WORD . '(?P=iabn)' .
-               // NOTE: (?!(?P=abn)) fails iff "::" used twice; (?P=iabn) passes iff a "::" was found.
+       '|' . // contains one "::" in the middle (the ^ makes the test fail if none found)
+               RE_IPV6_WORD . '(?::((?(-1)|:))?' . RE_IPV6_WORD . '){1,6}(?(-2)|^)' .
        '|' . // contains no "::"
                RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){7}' .
        ')'
-       // NOTE: With PCRE 7.2+, we can combine the two '"::" in the middle' cases into:
-       //              RE_IPV6_WORD . '(?::((?(-1)|:))?' . RE_IPV6_WORD . '){1,6}(?(-2)|^)'
-       // This also improves regex concatenation by using relative references.
 );
 // An IPv6 block is an IP address and a prefix (d1 to d128)
 define( 'RE_IPV6_BLOCK', RE_IPV6_ADD . '\/' . RE_IPV6_PREFIX );
index 0b7393a..fdd0e3c 100644 (file)
@@ -43,6 +43,16 @@ class LinksUpdate extends SqlDataUpdate {
                $mOptions,       //!< SELECT options to be used (array)
                $mRecursive;     //!< Whether to queue jobs for recursive updates
 
+       /**
+        * @var null|array Added links if calculated.
+        */
+       private $linkInsertions = null;
+
+       /**
+        * @var null|array Deleted links if calculated.
+        */
+       private $linkDeletions = null;
+
        /**
         * Constructor
         *
@@ -112,14 +122,8 @@ class LinksUpdate extends SqlDataUpdate {
         * Update link tables with outgoing links from an updated article
         */
        public function doUpdate() {
-               global $wgUseDumbLinkUpdate;
-
                wfRunHooks( 'LinksUpdate', array( &$this ) );
-               if ( $wgUseDumbLinkUpdate ) {
-                       $this->doDumbUpdate();
-               } else {
-                       $this->doIncrementalUpdate();
-               }
+               $this->doIncrementalUpdate();
                wfRunHooks( 'LinksUpdateComplete', array( &$this ) );
        }
 
@@ -128,8 +132,9 @@ class LinksUpdate extends SqlDataUpdate {
 
                # Page links
                $existing = $this->getExistingLinks();
-               $this->incrTableUpdate( 'pagelinks', 'pl', $this->getLinkDeletions( $existing ),
-                       $this->getLinkInsertions( $existing ) );
+               $this->linkDeletions = $this->getLinkDeletions( $existing );
+               $this->linkInsertions = $this->getLinkInsertions( $existing );
+               $this->incrTableUpdate( 'pagelinks', 'pl', $this->linkDeletions, $this->linkInsertions );
 
                # Image links
                $existing = $this->getExistingImages();
@@ -197,46 +202,6 @@ class LinksUpdate extends SqlDataUpdate {
                wfProfileOut( __METHOD__ );
        }
 
-       /**
-        * Link update which clears the previous entries and inserts new ones
-        * May be slower or faster depending on level of lock contention and write speed of DB
-        * Also useful where link table corruption needs to be repaired, e.g. in refreshLinks.php
-        */
-       protected function doDumbUpdate() {
-               wfProfileIn( __METHOD__ );
-
-               # Refresh category pages and image description pages
-               $existing = $this->getExistingCategories();
-               $categoryInserts = array_diff_assoc( $this->mCategories, $existing );
-               $categoryDeletes = array_diff_assoc( $existing, $this->mCategories );
-               $categoryUpdates = $categoryInserts + $categoryDeletes;
-               $existing = $this->getExistingImages();
-               $imageUpdates = array_diff_key( $existing, $this->mImages ) + array_diff_key( $this->mImages, $existing );
-
-               $this->dumbTableUpdate( 'pagelinks', $this->getLinkInsertions(), 'pl_from' );
-               $this->dumbTableUpdate( 'imagelinks', $this->getImageInsertions(), 'il_from' );
-               $this->dumbTableUpdate( 'categorylinks', $this->getCategoryInsertions(), 'cl_from' );
-               $this->dumbTableUpdate( 'templatelinks', $this->getTemplateInsertions(), 'tl_from' );
-               $this->dumbTableUpdate( 'externallinks', $this->getExternalInsertions(), 'el_from' );
-               $this->dumbTableUpdate( 'langlinks', $this->getInterlangInsertions(), 'll_from' );
-               $this->dumbTableUpdate( 'iwlinks', $this->getInterwikiInsertions(), 'iwl_from' );
-               $this->dumbTableUpdate( 'page_props', $this->getPropertyInsertions(), 'pp_page' );
-
-               # Update the cache of all the category pages and image description
-               # pages which were changed, and fix the category table count
-               $this->invalidateCategories( $categoryUpdates );
-               $this->updateCategoryCounts( $categoryInserts, $categoryDeletes );
-               $this->invalidateImageDescriptions( $imageUpdates );
-
-               # Refresh links of all pages including this page
-               # This will be in a separate transaction
-               if ( $this->mRecursive ) {
-                       $this->queueRecursiveJobs();
-               }
-
-               wfProfileOut( __METHOD__ );
-       }
-
        /**
         * Queue recursive jobs for this page
         *
@@ -296,21 +261,6 @@ class LinksUpdate extends SqlDataUpdate {
                $this->invalidatePages( NS_FILE, array_keys( $images ) );
        }
 
-       /**
-        * @param $table
-        * @param $insertions
-        * @param $fromField
-        */
-       private function dumbTableUpdate( $table, $insertions, $fromField ) {
-               $this->mDb->delete( $table, array( $fromField => $this->mId ), __METHOD__ );
-               if ( count( $insertions ) ) {
-                       # The link array was constructed without FOR UPDATE, so there may
-                       # be collisions. This may cause minor link table inconsistencies,
-                       # which is better than crippling the site with lock contention.
-                       $this->mDb->insert( $table, $insertions, __METHOD__, array( 'IGNORE' ) );
-               }
-       }
-
        /**
         * Update a table by doing a delete query then an insert query
         * @param $table
@@ -821,6 +771,40 @@ class LinksUpdate extends SqlDataUpdate {
                        }
                }
        }
+
+       /**
+        * Fetch page links added by this LinksUpdate.  Only available after the update is complete.
+        * @since 1.22
+        * @return null|array of Titles
+        */
+       public function getAddedLinks() {
+               if ( $this->linkInsertions === null ) {
+                       return null;
+               }
+               $result = array();
+               foreach ( $this->linkInsertions as $insertion ) {
+                       $result[] = Title::makeTitle( $insertion[ 'pl_namespace' ], $insertion[ 'pl_title' ] );
+               }
+               return $result;
+       }
+
+       /**
+        * Fetch page links removed by this LinksUpdate.  Only available after the update is complete.
+        * @since 1.22
+        * @return null|array of Titles
+        */
+       public function getRemovedLinks() {
+               if ( $this->linkDeletions === null ) {
+                       return null;
+               }
+               $result = array();
+               foreach ( $this->linkDeletions as $ns => $titles ) {
+                       foreach ( $titles as $title => $unused ) {
+                               $result[] = Title::makeTitle( $ns, $title );
+                       }
+               }
+               return $result;
+       }
 }
 
 /**
@@ -868,8 +852,6 @@ class LinksDeletionUpdate extends SqlDataUpdate {
 
                # If using cascading deletes, we can skip some explicit deletes
                if ( !$this->mDb->cascadingDeletes() ) {
-                       $this->mDb->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
-
                        # Delete outgoing links
                        $this->mDb->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
                        $this->mDb->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
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 d968d79..44cafe9 100644 (file)
@@ -1280,12 +1280,14 @@ class SkinTemplate extends Skin {
                                );
                        }
 
-                       $sur = new UserrightsPage;
-                       $sur->setContext( $this->getContext() );
-                       if ( $sur->userCanExecute( $this->getUser() ) ) {
-                               $nav_urls['userrights'] = array(
-                                       'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
-                               );
+                       if ( !$user->isAnon() ) {
+                               $sur = new UserrightsPage;
+                               $sur->setContext( $this->getContext() );
+                               if ( $sur->userCanExecute( $this->getUser() ) ) {
+                                       $nav_urls['userrights'] = array(
+                                               'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
+                                       );
+                               }
                        }
                }
 
index 61630a9..a6195fc 100644 (file)
@@ -982,7 +982,13 @@ abstract class FormSpecialPage extends SpecialPage {
 
                $form = new HTMLForm( $this->fields, $this->getContext(), $this->getMessagePrefix() );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
-               $form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
+               // If the form is a compact vertical form, then don't output this ugly
+               // fieldset surrounding it.
+               // XXX Special pages can setDisplayFormat to 'vform' in alterForm(), but that
+               // is called after this.
+               if ( !$form->isVForm() ) {
+                       $form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
+               }
 
                $headerMsg = $this->msg( $this->getMessagePrefix() . '-text' );
                if ( !$headerMsg->isDisabled() ) {
@@ -1227,7 +1233,7 @@ class SpecialListBots extends SpecialRedirectToSpecial {
  */
 class SpecialCreateAccount extends SpecialRedirectToSpecial {
        function __construct() {
-               parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'uselang' ) );
+               parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'returnto', 'returntoquery', 'uselang' ) );
        }
 
        // No reason to hide this link on Special:Specialpages
index 374d5ca..1373f3d 100644 (file)
@@ -91,20 +91,20 @@ class StatCounter {
         * @return void
         */
        protected function sendDeltasUDP( array $deltas ) {
-               global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
+               global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID,
+                       $wgStatsFormatString;
 
                $id = strlen( $wgAggregateStatsID ) ? $wgAggregateStatsID : wfWikiID();
 
                $lines = array();
                foreach ( $deltas as $key => $count ) {
-                       $lines[] = "stats/{$id} - {$count} 1 1 1 1 {$key}\n";
+                       $lines[] = sprintf( $wgStatsFormatString, $id, $count, $key );
                }
 
                if ( count( $lines ) ) {
                        static $socket = null;
                        if ( !$socket ) {
                                $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-                               array_unshift( $lines, "stats/{$id} - 1 1 1 1 1 -total\n" );
                        }
                        $packet = '';
                        $packets = array();
index 7ec1b0f..7a84fed 100644 (file)
  * An operation which is not OK should have errors so that the user can be
  * informed as to what went wrong. Calling the fatal() function sets an error
  * message and simultaneously switches off the OK flag.
+ *
+ * The recommended pattern for Status objects is to return a Status object
+ * unconditionally, i.e. both on success and on failure -- so that the
+ * developer of the calling code is reminded that the function can fail, and
+ * so that a lack of error-handling will be explicit.
  */
 class Status {
        var $ok = true;
index 48e56ab..edfbba2 100644 (file)
@@ -511,9 +511,31 @@ class MediaWiki {
 
                $request = $this->context->getRequest();
 
+               // Send Ajax requests to the Ajax dispatcher.
+               if ( $wgUseAjax && $request->getVal( 'action', 'view' ) == 'ajax' ) {
+
+                       // Set a dummy title, because $wgTitle == null might break things
+                       $title = Title::makeTitle( NS_MAIN, 'AJAX' );
+                       $this->context->setTitle( $title );
+                       $wgTitle = $title;
+
+                       $dispatcher = new AjaxDispatcher();
+                       $dispatcher->performAction();
+                       wfProfileOut( __METHOD__ );
+                       return;
+               }
+
+               // Get title from request parameters,
+               // is set on the fly by parseTitle the first time.
+               $title = $this->getTitle();
+               $action = $this->getAction();
+               $wgTitle = $title;
+
                // If the user has forceHTTPS set to true, or if the user
                // is in a group requiring HTTPS, or if they have the HTTPS
                // preference set, redirect them to HTTPS.
+               // Note: Do this after $wgTitle is setup, otherwise the hooks run from
+               // isLoggedIn() will do all sorts of weird stuff.
                if (
                        (
                                $request->getCookie( 'forceHTTPS', '' ) ||
@@ -554,26 +576,6 @@ class MediaWiki {
                        return;
                }
 
-               // Send Ajax requests to the Ajax dispatcher.
-               if ( $wgUseAjax && $request->getVal( 'action', 'view' ) == 'ajax' ) {
-
-                       // Set a dummy title, because $wgTitle == null might break things
-                       $title = Title::makeTitle( NS_MAIN, 'AJAX' );
-                       $this->context->setTitle( $title );
-                       $wgTitle = $title;
-
-                       $dispatcher = new AjaxDispatcher();
-                       $dispatcher->performAction();
-                       wfProfileOut( __METHOD__ );
-                       return;
-               }
-
-               // Get title from request parameters,
-               // is set on the fly by parseTitle the first time.
-               $title = $this->getTitle();
-               $action = $this->getAction();
-               $wgTitle = $title;
-
                if ( $wgUseFileCache && $title->getNamespace() >= 0 ) {
                        wfProfileIn( 'main-try-filecache' );
                        if ( HTMLFileCache::useFileCache( $this->context ) ) {
index 048dd68..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.
@@ -541,6 +542,7 @@ class WikiPage implements Page, IDBAccessObject {
                $db = wfGetDB( DB_SLAVE );
                $revSelectFields = Revision::selectFields();
 
+               $row = null;
                while ( $continue ) {
                        $row = $db->selectRow(
                                array( 'page', 'revision' ),
@@ -1023,8 +1025,8 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Get the last N authors
-        * @param $num Integer: number of revisions to get
-        * @param string $revLatest the latest rev_id, selected from the master (optional)
+        * @param int $num Number of revisions to get
+        * @param int|string $revLatest the latest rev_id, selected from the master (optional)
         * @return array Array of authors, duplicates not removed
         */
        public function getLastNAuthors( $num, $revLatest = 0 ) {
@@ -1095,8 +1097,8 @@ class WikiPage implements Page, IDBAccessObject {
         * The parser cache will be used if possible.
         *
         * @since 1.19
-        * @param $parserOptions ParserOptions to use for the parse operation
-        * @param $oldid Revision ID to get the text from, passing null or 0 will
+        * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
+        * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
         *               get the current revision (default value)
         *
         * @return ParserOutput or false if the revision was not found
@@ -1622,7 +1624,7 @@ class WikiPage implements Page, IDBAccessObject {
         * edit-already-exists error will be returned. These two conditions are also possible with
         * auto-detection due to MediaWiki's performance-optimised locking strategy.
         *
-        * @param bool|\the $baseRevId the revision ID this edit was based off, if any
+        * @param bool|int $baseRevId the revision ID this edit was based off, if any
         * @param $user User the user doing the edit
         * @param $serialisation_format String: format for storing the content in the database
         *
@@ -1710,6 +1712,10 @@ class WikiPage implements Page, IDBAccessObject {
 
                $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
                $serialized = $editInfo->pst;
+
+               /**
+                * @var Content $content
+                */
                $content = $editInfo->pstContent;
                $newsize = $content->getSize();
 
@@ -1979,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???
@@ -2174,7 +2182,7 @@ class WikiPage implements Page, IDBAccessObject {
                ContentHandler::deprecated( __METHOD__, "1.21" );
 
                $content = ContentHandler::makeContent( $text, $this->getTitle() );
-               return $this->doQuickEditContent( $content, $user, $comment, $minor );
+               $this->doQuickEditContent( $content, $user, $comment, $minor );
        }
 
        /**
@@ -2182,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 );
@@ -2696,6 +2706,10 @@ class WikiPage implements Page, IDBAccessObject {
                        return $status;
                }
 
+               if ( !$dbw->cascadingDeletes() ) {
+                       $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
+               }
+
                $this->doDeleteUpdates( $id, $content );
 
                // Log the deletion, if the page was suppressed, log it at Oversight instead
@@ -3353,7 +3367,7 @@ class WikiPage implements Page, IDBAccessObject {
        public function viewUpdates() {
                wfDeprecated( __METHOD__, '1.18' );
                global $wgUser;
-               return $this->doViewUpdates( $wgUser );
+               $this->doViewUpdates( $wgUser );
        }
 
        /**
@@ -3438,7 +3452,7 @@ class PoolWorkArticleView extends PoolCounterWork {
        /**
         * Constructor
         *
-        * @param $page Page
+        * @param $page Page|WikiPage
         * @param $revid Integer: ID of the revision being parsed
         * @param $useParserCache Boolean: whether to use the parser cache
         * @param $parserOptions parserOptions to use for the parse operation
index b5aec77..7256066 100644 (file)
@@ -54,7 +54,7 @@ class ApiOptions extends ApiBase {
                }
 
                if ( $params['reset'] ) {
-                       $user->resetOptions( $params['resetkinds'] );
+                       $user->resetOptions( $params['resetkinds'], $this->getContext() );
                        $changed = true;
                }
 
index ce59118..e03837f 100644 (file)
@@ -64,6 +64,7 @@ class ApiQuery extends ApiBase {
         */
        private static $QueryListModules = array(
                'allcategories' => 'ApiQueryAllCategories',
+               'allfileusages' => 'ApiQueryAllLinks',
                'allimages' => 'ApiQueryAllImages',
                'alllinks' => 'ApiQueryAllLinks',
                'allpages' => 'ApiQueryAllPages',
index 3744e3c..47d1bce 100644 (file)
@@ -37,7 +37,9 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                $prefix = 'al';
                                $this->table = 'pagelinks';
                                $this->tablePrefix = 'pl_';
+                               $this->fieldTitle = 'title';
                                $this->dfltNamespace = NS_MAIN;
+                               $this->hasNamespace = true;
                                $this->indexTag = 'l';
                                $this->description = 'Enumerate all links that point to a given namespace';
                                $this->descriptionWhat = 'link';
@@ -48,13 +50,28 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                $prefix = 'at';
                                $this->table = 'templatelinks';
                                $this->tablePrefix = 'tl_';
+                               $this->fieldTitle = 'title';
                                $this->dfltNamespace = NS_TEMPLATE;
+                               $this->hasNamespace = true;
                                $this->indexTag = 't';
                                $this->description = 'List all transclusions (pages embedded using {{x}}), including non-existing';
                                $this->descriptionWhat = 'transclusion';
                                $this->descriptionTargets = 'transcluded titles';
                                $this->descriptionLinking = 'transcluding';
                                break;
+                       case 'allfileusages':
+                               $prefix = 'af';
+                               $this->table = 'imagelinks';
+                               $this->tablePrefix = 'il_';
+                               $this->fieldTitle = 'to';
+                               $this->dfltNamespace = NS_FILE;
+                               $this->hasNamespace = false;
+                               $this->indexTag = 'f';
+                               $this->description = 'List all file usages, including non-existing';
+                               $this->descriptionWhat = 'file';
+                               $this->descriptionTargets = 'file titles';
+                               $this->descriptionLinking = 'using';
+                               break;
                        default:
                                ApiBase::dieDebug( __METHOD__, 'Unknown module name' );
                }
@@ -83,9 +100,15 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                $params = $this->extractRequestParams();
 
                $pfx = $this->tablePrefix;
+               $fieldTitle = $this->fieldTitle;
                $prop = array_flip( $params['prop'] );
                $fld_ids = isset( $prop['ids'] );
                $fld_title = isset( $prop['title'] );
+               if ( $this->hasNamespace ) {
+                       $namespace = $params['namespace'];
+               } else {
+                       $namespace = $this->dfltNamespace;
+               }
 
                if ( $params['unique'] ) {
                        if ( $fld_ids ) {
@@ -97,7 +120,9 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                }
 
                $this->addTables( $this->table );
-               $this->addWhereFld( $pfx . 'namespace', $params['namespace'] );
+               if ( $this->hasNamespace ) {
+                       $this->addWhereFld( $pfx . 'namespace', $namespace );
+               }
 
                $continue = !is_null( $params['continue'] );
                if ( $continue ) {
@@ -106,14 +131,14 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                        if ( $params['unique'] ) {
                                $this->dieContinueUsageIf( count( $continueArr ) != 1 );
                                $continueTitle = $db->addQuotes( $continueArr[0] );
-                               $this->addWhere( "{$pfx}title $op= $continueTitle" );
+                               $this->addWhere( "{$pfx}{$fieldTitle} $op= $continueTitle" );
                        } else {
                                $this->dieContinueUsageIf( count( $continueArr ) != 2 );
                                $continueTitle = $db->addQuotes( $continueArr[0] );
                                $continueFrom = intval( $continueArr[1] );
                                $this->addWhere(
-                                       "{$pfx}title $op $continueTitle OR " .
-                                       "({$pfx}title = $continueTitle AND " .
+                                       "{$pfx}{$fieldTitle} $op $continueTitle OR " .
+                                       "({$pfx}{$fieldTitle} = $continueTitle AND " .
                                        "{$pfx}from $op= $continueFrom)"
                                );
                        }
@@ -122,22 +147,24 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                // 'continue' always overrides 'from'
                $from = ( $continue || is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
                $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
-               $this->addWhereRange( $pfx . 'title', 'newer', $from, $to );
+               $this->addWhereRange( $pfx . $fieldTitle, 'newer', $from, $to );
 
                if ( isset( $params['prefix'] ) ) {
-                       $this->addWhere( $pfx . 'title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+                       $this->addWhere( $pfx . $fieldTitle . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
                }
 
-               $this->addFields( array( 'pl_title' => $pfx . 'title' ) );
+               $this->addFields( array( 'pl_title' => $pfx . $fieldTitle ) );
                $this->addFieldsIf( array( 'pl_from' => $pfx . 'from' ), !$params['unique'] );
 
-               $this->addOption( 'USE INDEX', $pfx . 'namespace' );
+               if ( $this->hasNamespace ) {
+                       $this->addOption( 'USE INDEX', $pfx . 'namespace' );
+               }
                $limit = $params['limit'];
                $this->addOption( 'LIMIT', $limit + 1 );
 
                $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                $orderBy = array();
-               $orderBy[] = $pfx . 'title' . $sort;
+               $orderBy[] = $pfx . $fieldTitle . $sort;
                if ( !$params['unique'] ) {
                        $orderBy[] = $pfx . 'from' . $sort;
                }
@@ -166,7 +193,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                        $vals['fromid'] = intval( $row->pl_from );
                                }
                                if ( $fld_title ) {
-                                       $title = Title::makeTitle( $params['namespace'], $row->pl_title );
+                                       $title = Title::makeTitle( $namespace, $row->pl_title );
                                        ApiQueryBase::addTitleInfo( $vals, $title );
                                }
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
@@ -179,7 +206,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                        break;
                                }
                        } elseif ( $params['unique'] ) {
-                               $titles[] = Title::makeTitle( $params['namespace'], $row->pl_title );
+                               $titles[] = Title::makeTitle( $namespace, $row->pl_title );
                        } else {
                                $pageids[] = $row->pl_from;
                        }
@@ -195,7 +222,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               return array(
+               $allowedParams = array(
                        'continue' => null,
                        'from' => null,
                        'to' => null,
@@ -228,6 +255,10 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                )
                        ),
                );
+               if ( !$this->hasNamespace ) {
+                       unset( $allowedParams['namespace'] );
+               }
+               return $allowedParams;
        }
 
        public function getParamDescription() {
@@ -235,7 +266,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                $what = $this->descriptionWhat;
                $targets = $this->descriptionTargets;
                $linking = $this->descriptionLinking;
-               return array(
+               $paramDescription = array(
                        'from' => "The title of the $what to start enumerating from",
                        'to' => "The title of the $what to stop enumerating at",
                        'prefix' => "Search for all $targets that begin with this value",
@@ -253,6 +284,10 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                        'continue' => 'When more results are available, use this to continue',
                        'dir' => 'The direction in which to list',
                );
+               if ( !$this->hasNamespace ) {
+                       unset( $paramDescription['namespace'] );
+               }
+               return $paramDescription;
        }
 
        public function getResultProperties() {
index fbba98c..a776706 100644 (file)
@@ -123,6 +123,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['mainpage'] = $mainPage->getPrefixedText();
                $data['base'] = wfExpandUrl( $mainPage->getFullURL(), PROTO_CURRENT );
                $data['sitename'] = $GLOBALS['wgSitename'];
+               $data['logo'] = $GLOBALS['wgLogo'];
                $data['generator'] = "MediaWiki {$GLOBALS['wgVersion']}";
                $data['phpversion'] = phpversion();
                $data['phpsapi'] = PHP_SAPI;
@@ -420,6 +421,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['activeusers'] = intval( SiteStats::activeUsers() );
                $data['admins'] = intval( SiteStats::numberingroup( 'sysop' ) );
                $data['jobs'] = intval( SiteStats::jobs() );
+
+               wfRunHooks( 'APIQuerySiteInfoStatisticsInfo', array( &$data ) );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
index d060d4b..71afeba 100644 (file)
  * @ingroup Cache
  */
 class SquidUpdate {
-       var $urlArr, $mMaxTitles;
 
        /**
-        * @param $urlArr array
-        * @param $maxTitles bool|int
+        * Collection of URLs to purge.
+        * @var array
         */
-       function __construct( $urlArr = array(), $maxTitles = false ) {
+       protected $urlArr;
+
+       /**
+        * @param array $urlArr Collection of URLs to purge
+        * @param bool|int $maxTitles Maximum number of unique URLs to purge
+        */
+       public function __construct( $urlArr = array(), $maxTitles = false ) {
                global $wgMaxSquidPurgeTitles;
                if ( $maxTitles === false ) {
-                       $this->mMaxTitles = $wgMaxSquidPurgeTitles;
-               } else {
-                       $this->mMaxTitles = $maxTitles;
+                       $maxTitles = $wgMaxSquidPurgeTitles;
                }
-               $urlArr = array_unique( $urlArr ); // Remove duplicates
-               if ( count( $urlArr ) > $this->mMaxTitles ) {
-                       $urlArr = array_slice( $urlArr, 0, $this->mMaxTitles );
+
+               // Remove duplicate URLs from list
+               $urlArr = array_unique( $urlArr );
+               if ( count( $urlArr ) > $maxTitles ) {
+                       // Truncate to desired maximum URL count
+                       $urlArr = array_slice( $urlArr, 0, $maxTitles );
                }
                $this->urlArr = $urlArr;
        }
 
        /**
-        * @param $title Title
+        * Create a SquidUpdate from the given Title object.
+        *
+        * The resulting SquidUpdate will purge the given Title's URLs as well as
+        * the pages that link to it. Capped at $wgMaxSquidPurgeTitles total URLs.
         *
+        * @param Title $title
         * @return SquidUpdate
         */
-       static function newFromLinksTo( &$title ) {
+       public static function newFromLinksTo( Title $title ) {
                global $wgMaxSquidPurgeTitles;
                wfProfileIn( __METHOD__ );
 
@@ -79,12 +89,11 @@ class SquidUpdate {
        /**
         * Create a SquidUpdate from an array of Title objects, or a TitleArray object
         *
-        * @param $titles array
-        * @param $urlArr array
-        *
+        * @param array $titles
+        * @param array $urlArr
         * @return SquidUpdate
         */
-       static function newFromTitles( $titles, $urlArr = array() ) {
+       public static function newFromTitles( $titles, $urlArr = array() ) {
                global $wgMaxSquidPurgeTitles;
                $i = 0;
                foreach ( $titles as $title ) {
@@ -97,20 +106,19 @@ class SquidUpdate {
        }
 
        /**
-        * @param $title Title
-        *
+        * @param Title $title
         * @return SquidUpdate
         */
-       static function newSimplePurge( &$title ) {
+       public static function newSimplePurge( Title $title ) {
                $urlArr = $title->getSquidURLs();
                return new SquidUpdate( $urlArr );
        }
 
        /**
-        * Purges the list of URLs passed to the constructor
+        * Purges the list of URLs passed to the constructor.
         */
-       function doUpdate() {
-               SquidUpdate::purge( $this->urlArr );
+       public function doUpdate() {
+               self::purge( $this->urlArr );
        }
 
        /**
@@ -119,10 +127,9 @@ class SquidUpdate {
         * (example: $urlArr[] = 'http://my.host/something')
         * XXX report broken Squids per mail or log
         *
-        * @param $urlArr array
-        * @return void
+        * @param array $urlArr List of full URLs to purge
         */
-       static function purge( $urlArr ) {
+       public static function purge( $urlArr ) {
                global $wgSquidServers, $wgHTCPRouting;
 
                if ( !$urlArr ) {
@@ -132,14 +139,18 @@ class SquidUpdate {
                wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) . "\n" );
 
                if ( $wgHTCPRouting ) {
-                       SquidUpdate::HTCPPurge( $urlArr );
+                       self::HTCPPurge( $urlArr );
                }
 
                wfProfileIn( __METHOD__ );
 
-               $urlArr = array_unique( $urlArr ); // Remove duplicates
-               $maxSocketsPerSquid = 8; //  socket cap per Squid
-               $urlsPerSocket = 400; // 400 seems to be a good tradeoff, opening a socket takes a while
+               // Remove duplicate URLs
+               $urlArr = array_unique( $urlArr );
+               // Maximum number of parallel connections per squid
+               $maxSocketsPerSquid = 8;
+               // Number of requests to send per socket
+               // 400 seems to be a good tradeoff, opening a socket takes a while
+               $urlsPerSocket = 400;
                $socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
                if ( $socketsPerSquid > $maxSocketsPerSquid ) {
                        $socketsPerSquid = $maxSocketsPerSquid;
@@ -162,14 +173,17 @@ class SquidUpdate {
        }
 
        /**
+        * Send Hyper Text Caching Protocol (HTCP) CLR requests.
+        *
         * @throws MWException
-        * @param $urlArr array
+        * @param array $urlArr Collection of URLs to purge
         */
-       static function HTCPPurge( $urlArr ) {
+       public static function HTCPPurge( $urlArr ) {
                global $wgHTCPRouting, $wgHTCPMulticastTTL;
                wfProfileIn( __METHOD__ );
 
-               $htcpOpCLR = 4; // HTCP CLR
+               // HTCP CLR operation
+               $htcpOpCLR = 4;
 
                // @todo FIXME: PHP doesn't support these socket constants (include/linux/in.h)
                if ( !defined( "IPPROTO_IP" ) ) {
@@ -191,21 +205,23 @@ class SquidUpdate {
                // Set socket options
                socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_LOOP, 0 );
                if ( $wgHTCPMulticastTTL != 1 ) {
+                       // Set multicast time to live (hop count) option on socket
                        socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_TTL,
                                $wgHTCPMulticastTTL );
                }
 
-               $urlArr = array_unique( $urlArr ); // Remove duplicates
+               // Remove duplicate URLs from collection
+               $urlArr = array_unique( $urlArr );
                foreach ( $urlArr as $url ) {
                        if ( !is_string( $url ) ) {
                                wfProfileOut( __METHOD__ );
                                throw new MWException( 'Bad purge URL' );
                        }
-                       $url = SquidUpdate::expand( $url );
+                       $url = self::expand( $url );
                        $conf = self::getRuleForURL( $url, $wgHTCPRouting );
                        if ( !$conf ) {
                                wfDebugLog( 'squid', __METHOD__ .
-                                       "No HTCP rule configured for URL $url , skipping\n" );
+                                       "No HTCP rule configured for URL {$url} , skipping\n" );
                                continue;
                        }
 
@@ -260,11 +276,10 @@ class SquidUpdate {
         *
         * Client functions should not need to call this.
         *
-        * @param $url string
-        *
+        * @param string $url
         * @return string
         */
-       static function expand( $url ) {
+       public static function expand( $url ) {
                return wfExpandUrl( $url, PROTO_INTERNAL );
        }
 
@@ -274,7 +289,7 @@ class SquidUpdate {
         * @param array $rules Array of rules, see $wgHTCPRouting for format and behavior
         * @return mixed Element of $rules that matched, or false if nothing matched
         */
-       static function getRuleForURL( $url, $rules ) {
+       private static function getRuleForURL( $url, $rules ) {
                foreach ( $rules as $regex => $routing ) {
                        if ( $regex === '' || preg_match( $regex, $url ) ) {
                                return $routing;
index a8fa9ed..2a92e23 100644 (file)
@@ -938,7 +938,7 @@ abstract class ContentHandler {
         * @return ParserOptions
         */
        public function makeParserOptions( $context ) {
-               global $wgContLang;
+               global $wgContLang, $wgEnableParserLimitReporting;
 
                if ( $context instanceof IContextSource ) {
                        $options = ParserOptions::newFromContext( $context );
@@ -950,7 +950,7 @@ abstract class ContentHandler {
                        throw new MWException( "Bad context for parser options: $context" );
                }
 
-               $options->enableLimitReport(); // show inclusion/loop reports
+               $options->enableLimitReport( $wgEnableParserLimitReporting ); // show inclusion/loop reports
                $options->setTidy( true ); // fix bad HTML
 
                return $options;
index d4caf05..fd9bf96 100644 (file)
@@ -100,7 +100,10 @@ class DerivativeContext extends ContextSource {
         *
         * @param Title $t
         */
-       public function setTitle( Title $t ) {
+       public function setTitle( $t ) {
+               if ( $t !== null && !$t instanceof Title ) {
+                       throw new MWException( __METHOD__ . " expects an instance of Title" );
+               }
                $this->title = $t;
        }
 
index b9dbe77..01ec57c 100644 (file)
@@ -90,7 +90,10 @@ class RequestContext implements IContextSource {
         *
         * @param Title $t
         */
-       public function setTitle( Title $t ) {
+       public function setTitle( $t ) {
+               if ( $t !== null && !$t instanceof Title ) {
+                       throw new MWException( __METHOD__ . " expects an instance of Title" );
+               }
                $this->title = $t;
                // Erase the WikiPage so a new one with the new title gets created.
                $this->wikipage = null;
index 4b25bd3..c3850b9 100644 (file)
@@ -662,6 +662,18 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Constructor.
+        *
+        * FIXME: It is possible to construct a Database object with no associated
+        * connection object, by specifying no parameters to __construct(). This
+        * feature is deprecated and should be removed.
+        *
+        * FIXME: The long list of formal parameters here is not really appropriate
+        * for MySQL, and not at all appropriate for any other DBMS. It should be
+        * replaced by named parameters as in DatabaseBase::factory().
+        *
+        * DatabaseBase subclasses should not be constructed directly in external
+        * code. DatabaseBase::factory() should be used instead.
+        *
         * @param string $server database server host
         * @param string $user database user name
         * @param string $password database user password
@@ -717,7 +729,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Given a DB type, construct the name of the appropriate child class of
         * DatabaseBase. This is designed to replace all of the manual stuff like:
-        *      $class = 'Database' . ucfirst( strtolower( $type ) );
+        *      $class = 'Database' . ucfirst( strtolower( $dbType ) );
         * as well as validate against the canonical list of DB types we have
         *
         * This factory function is mostly useful for when you need to connect to a
@@ -732,17 +744,47 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * @param string $dbType A possible DB type
         * @param array $p An array of options to pass to the constructor.
-        *    Valid options are: host, user, password, dbname, flags, tablePrefix
+        *    Valid options are: host, user, password, dbname, flags, tablePrefix, driver
         * @return DatabaseBase subclass or null
         */
        final public static function factory( $dbType, $p = array() ) {
                $canonicalDBTypes = array(
-                       'mysql', 'postgres', 'sqlite', 'oracle', 'mssql'
+                       'mysql'    => array( 'mysqli', 'mysql' ),
+                       'postgres' => array(),
+                       'sqlite'   => array(),
+                       'oracle'   => array(),
+                       'mssql'    => array(),
                );
+
+               $driver = false;
                $dbType = strtolower( $dbType );
-               $class = 'Database' . ucfirst( $dbType );
+               if ( isset( $canonicalDBTypes[$dbType] ) && $canonicalDBTypes[$dbType] ) {
+                       $possibleDrivers = $canonicalDBTypes[$dbType];
+                       if ( !empty( $p['driver'] ) ) {
+                               if ( in_array( $p['driver'], $possibleDrivers ) ) {
+                                       $driver = $p['driver'];
+                               } else {
+                                       throw new MWException( __METHOD__ .
+                                               " cannot construct Database with type '$dbType' and driver '{$p['driver']}'" );
+                               }
+                       } else {
+                               foreach ( $possibleDrivers as $posDriver ) {
+                                       if ( extension_loaded( $posDriver ) ) {
+                                               $driver = $posDriver;
+                                               break;
+                                       }
+                               }
+                       }
+               } else {
+                       $driver = $dbType;
+               }
+               if ( $driver === false ) {
+                       throw new MWException( __METHOD__ .
+                               " no viable database extension found for type '$dbType'" );
+               }
 
-               if ( in_array( $dbType, $canonicalDBTypes ) || ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) ) {
+               $class = 'Database' . ucfirst( $driver );
+               if ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) {
                        return new $class(
                                isset( $p['host'] ) ? $p['host'] : false,
                                isset( $p['user'] ) ? $p['user'] : false,
@@ -2301,8 +2343,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * If it's a string, adds quotes and backslashes
-        * Otherwise returns as-is
+        * Adds quotes and backslashes.
         *
         * @param $s string
         *
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..49579b6 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 )  . '`';
        }
 
        /**
@@ -1004,7 +1006,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
  */
 class MySQLField implements Field {
        private $name, $tablename, $default, $max_length, $nullable,
-               $is_pk, $is_unique, $is_multiple, $is_key, $type;
+               $is_pk, $is_unique, $is_multiple, $is_key, $type, $binary;
 
        function __construct( $info ) {
                $this->name = $info->name;
@@ -1017,6 +1019,7 @@ class MySQLField implements Field {
                $this->is_multiple = $info->multiple_key;
                $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
                $this->type = $info->type;
+               $this->binary = isset( $info->binary ) ? $info->binary : false;
        }
 
        /**
@@ -1064,6 +1067,10 @@ class MySQLField implements Field {
        function isMultipleKey() {
                return $this->is_multiple;
        }
+
+       function isBinary() {
+               return $this->binary;
+       }
 }
 
 class MySQLMasterPos implements DBMasterPos {
diff --git a/includes/db/DatabaseMysqli.php b/includes/db/DatabaseMysqli.php
new file mode 100644 (file)
index 0000000..7761abe
--- /dev/null
@@ -0,0 +1,194 @@
+<?php
+/**
+ * This is the MySQLi database abstraction layer.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Database abstraction object for PHP extension mysqli.
+ *
+ * @ingroup Database
+ * @since 1.22
+ * @see Database
+ */
+class DatabaseMysqli extends DatabaseMysqlBase {
+
+       /**
+        * @param $sql string
+        * @return resource
+        */
+       protected function doQuery( $sql ) {
+               if ( $this->bufferResults() ) {
+                       $ret = $this->mConn->query( $sql );
+               } else {
+                       $ret = $this->mConn->query( $sql, MYSQLI_USE_RESULT );
+               }
+               return $ret;
+       }
+
+       protected function mysqlConnect( $realServer ) {
+               # Fail now
+               # Otherwise we get a suppressed fatal error, which is very hard to track down
+               if ( !function_exists( 'mysqli_init' ) ) {
+                       throw new DBConnectionError( $this, "MySQLi functions missing,"
+                               . " have you compiled PHP with the --with-mysqli option?\n" );
+               }
+
+               $connFlags = 0;
+               if ( $this->mFlags & DBO_SSL ) {
+                       $connFlags |= MYSQLI_CLIENT_SSL;
+               }
+               if ( $this->mFlags & DBO_COMPRESS ) {
+                       $connFlags |= MYSQLI_CLIENT_COMPRESS;
+               }
+               if ( $this->mFlags & DBO_PERSISTENT ) {
+                       $realServer = 'p:' . $realServer;
+               }
+
+               $mysqli = mysqli_init();
+               $numAttempts = 2;
+
+               for ( $i = 0; $i < $numAttempts; $i++ ) {
+                       if ( $i > 1 ) {
+                               usleep( 1000 );
+                       }
+                       if ( $mysqli->real_connect( $realServer, $this->mUser,
+                               $this->mPassword, $this->mDBname, null, null, $connFlags ) )
+                       {
+                               return $mysqli;
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * @return bool
+        */
+       protected function closeConnection() {
+               return $this->mConn->close();
+       }
+
+       /**
+        * @return int
+        */
+       function insertId() {
+               return $this->mConn->insert_id;
+       }
+
+       /**
+        * @return int
+        */
+       function lastErrno() {
+               if ( $this->mConn ) {
+                       return $this->mConn->errno;
+               } else {
+                       return mysqli_connect_errno();
+               }
+       }
+
+       /**
+        * @return int
+        */
+       function affectedRows() {
+               return $this->mConn->affected_rows;
+       }
+
+       /**
+        * @param $db
+        * @return bool
+        */
+       function selectDB( $db ) {
+               $this->mDBname = $db;
+               return $this->mConn->select_db( $db );
+       }
+
+       /**
+        * @return string
+        */
+       function getServerVersion() {
+               return $this->mConn->server_info;
+       }
+
+       protected function mysqlFreeResult( $res ) {
+               $res->free_result();
+               return true;
+       }
+
+       protected function mysqlFetchObject( $res ) {
+               $object = $res->fetch_object();
+               if ( $object === null ) {
+                       return false;
+               }
+               return $object;
+       }
+
+       protected function mysqlFetchArray( $res ) {
+               $array = $res->fetch_array();
+               if ( $array === null ) {
+                       return false;
+               }
+               return $array;
+       }
+
+       protected function mysqlNumRows( $res ) {
+               return $res->num_rows;
+       }
+
+       protected function mysqlNumFields( $res ) {
+               return $res->field_count;
+       }
+
+       protected function mysqlFetchField( $res, $n ) {
+               $field = $res->fetch_field_direct( $n );
+               $field->not_null = $field->flags & MYSQLI_NOT_NULL_FLAG;
+               $field->primary_key = $field->flags & MYSQLI_PRI_KEY_FLAG;
+               $field->unique_key = $field->flags & MYSQLI_UNIQUE_KEY_FLAG;
+               $field->multiple_key = $field->flags & MYSQLI_MULTIPLE_KEY_FLAG;
+               $field->binary = $field->flags & MYSQLI_BINARY_FLAG;
+               return $field;
+       }
+
+       protected function mysqlFieldName( $res, $n ) {
+               $field = $res->fetch_field_direct( $n );
+               return $field->name;
+       }
+
+       protected function mysqlDataSeek( $res, $row ) {
+               return $res->data_seek( $row );
+       }
+
+       protected function mysqlError( $conn = null ) {
+               if ($conn === null) {
+                       return mysqli_connect_error();
+               } else {
+                       return $conn->error;
+               }
+       }
+
+       protected function mysqlRealEscapeString( $s ) {
+               return $this->mConn->real_escape_string( $s );
+       }
+
+       protected function mysqlPing() {
+               return $this->mConn->ping();
+       }
+
+}
index a8270bf..4a51226 100644 (file)
@@ -52,7 +52,7 @@ class DatabaseSqlite extends DatabaseBase {
                $this->mName = $dbName;
                parent::__construct( $server, $user, $password, $dbName, $flags );
                // parent doesn't open when $user is false, but we can work with $dbName
-               if ( $dbName ) {
+               if ( $dbName && !$this->isOpen() ) {
                        global $wgSharedDB;
                        if ( $this->open( $server, $user, $password, $dbName ) && $wgSharedDB ) {
                                $this->attachDatabase( $wgSharedDB );
@@ -90,6 +90,7 @@ class DatabaseSqlite extends DatabaseBase {
        function open( $server, $user, $pass, $dbName ) {
                global $wgSQLiteDataDir;
 
+               $this->close();
                $fileName = self::generateFileName( $wgSQLiteDataDir, $dbName );
                if ( !is_readable( $fileName ) ) {
                        $this->mConn = false;
@@ -655,7 +656,11 @@ class DatabaseSqlite extends DatabaseBase {
                if ( $this->mTrxLevel == 1 ) {
                        $this->commit( __METHOD__ );
                }
-               $this->mConn->beginTransaction();
+               try {
+                       $this->mConn->beginTransaction();
+               } catch ( PDOException $e ) {
+                       throw new DBUnexpectedError( $this, 'Error in BEGIN query: ' . $e->getMessage() );
+               }
                $this->mTrxLevel = 1;
        }
 
@@ -663,7 +668,11 @@ class DatabaseSqlite extends DatabaseBase {
                if ( $this->mTrxLevel == 0 ) {
                        return;
                }
-               $this->mConn->commit();
+               try {
+                       $this->mConn->commit();
+               } catch ( PDOException $e ) {
+                       throw new DBUnexpectedError( $this, 'Error in COMMIT query: ' . $e->getMessage() );
+               }
                $this->mTrxLevel = 0;
        }
 
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 02d83bb..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;
@@ -159,33 +175,18 @@ class ForeignAPIRepo extends FileRepo {
                                'action' => 'query',
                                'redirects' => 'true'
                        ) );
+
                if ( !isset( $query['uselang'] ) ) { // uselang is unset or null
                        $query['uselang'] = $wgLanguageCode;
                }
-               if ( $this->mApiBase ) {
-                       $url = wfAppendQuery( $this->mApiBase, $query );
-               } else {
-                       $url = $this->makeUrl( $query, 'api' );
-               }
 
-               if ( !isset( $this->mQueryCache[$url] ) ) {
-                       $key = $this->getLocalCacheKey( 'ForeignAPIRepo', 'Metadata', md5( $url ) );
-                       $data = $wgMemc->get( $key );
-                       if ( !$data ) {
-                               $data = self::httpGet( $url );
-                               if ( !$data ) {
-                                       return null;
-                               }
-                               $wgMemc->set( $key, $data, 3600 );
-                       }
+               $data = $this->httpGetCached( 'Metadata', $query );
 
-                       if ( count( $this->mQueryCache ) > 100 ) {
-                               // Keep the cache from growing infinitely
-                               $this->mQueryCache = array();
-                       }
-                       $this->mQueryCache[$url] = $data;
+               if ( $data ) {
+                       return FormatJson::decode( $data, true );
+               } else {
+                       return null;
                }
-               return FormatJson::decode( $this->mQueryCache[$url], true );
        }
 
        /**
@@ -433,6 +434,24 @@ class ForeignAPIRepo extends FileRepo {
        function getInfo() {
                $info = parent::getInfo();
                $info['apiurl'] = $this->getApiUrl();
+
+               $query = array(
+                       'format' => 'json',
+                       'action' => 'query',
+                       'meta' => 'siteinfo',
+                       'siprop' => 'general',
+               );
+
+               $data = $this->httpGetCached( 'SiteInfo', $query, 7200 );
+
+               if ( $data ) {
+                       $siteInfo = FormatJson::decode( $data, true );
+                       $general = $siteInfo['query']['general'];
+
+                       $info['articlepath'] = $general['articlepath'];
+                       $info['server'] = $general['server'];
+               }
+
                return $info;
        }
 
@@ -466,6 +485,46 @@ class ForeignAPIRepo extends FileRepo {
                }
        }
 
+       /**
+        * HTTP GET request to a mediawiki API (with caching)
+        * @param $target string Used in cache key creation, mostly
+        * @param $query array The query parameters for the API request
+        * @param $cacheTTL int Time to live for the memcached caching
+        */
+       public function httpGetCached( $target, $query, $cacheTTL = 3600 ) {
+               if ( $this->mApiBase ) {
+                       $url = wfAppendQuery( $this->mApiBase, $query );
+               } else {
+                       $url = $this->makeUrl( $query, 'api' );
+               }
+
+               if ( !isset( $this->mQueryCache[$url] ) ) {
+                       global $wgMemc;
+
+                       $key = $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) );
+                       $data = $wgMemc->get( $key );
+
+                       if ( !$data ) {
+                               $data = self::httpGet( $url );
+
+                               if ( !$data ) {
+                                       return null;
+                               }
+
+                               $wgMemc->set( $key, $data, $cacheTTL );
+                       }
+
+                       if ( count( $this->mQueryCache ) > 100 ) {
+                               // Keep the cache from growing infinitely
+                               $this->mQueryCache = array();
+                       }
+
+                       $this->mQueryCache[$url] = $data;
+               }
+
+               return $this->mQueryCache[$url];
+       }
+
        /**
         * @param $callback Array|string
         * @throws MWException
index 627defd..0c34f3e 100644 (file)
@@ -539,7 +539,7 @@ class LocalFile extends File {
                                'img_media_type' => $this->media_type,
                                'img_major_mime' => $major,
                                'img_minor_mime' => $minor,
-                               'img_metadata' => $this->metadata,
+                               'img_metadata' => $dbw->encodeBlob($this->metadata),
                                'img_sha1' => $this->sha1,
                        ),
                        array( 'img_name' => $this->getName() ),
@@ -1225,7 +1225,7 @@ class LocalFile extends File {
                                'img_description' => $comment,
                                'img_user' => $user->getId(),
                                'img_user_text' => $user->getName(),
-                               'img_metadata' => $this->metadata,
+                               'img_metadata' => $dbw->encodeBlob($this->metadata),
                                'img_sha1' => $this->sha1
                        ),
                        __METHOD__,
@@ -1276,7 +1276,7 @@ class LocalFile extends File {
                                        'img_description' => $comment,
                                        'img_user'        => $user->getId(),
                                        'img_user_text'   => $user->getName(),
-                                       'img_metadata'    => $this->metadata,
+                                       'img_metadata'    => $dbw->encodeBlob($this->metadata),
                                        'img_sha1'        => $this->sha1
                                ),
                                array( 'img_name' => $this->getName() ),
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 d349bf5..edf5ff2 100644 (file)
@@ -3446,6 +3446,10 @@ MediaWiki vyžaduje ke správné funkci podporu UTF-8.",
 To je pravděpodobně příliš málo.
 Instalace může selhat!",
        'config-ctype' => "'''Kritická chyba''': PHP musí být přeloženo s podporou pro [http://www.php.net/manual/en/ctype.installation.php rozšíření Ctype].",
+       'config-json' => "'''Kritická chyba:''' PHP bylo přeloženo bez podpory JSON.
+Před instalací MediaWiki musíte buď nainstalovat rozšíření PHP JSON nebo rozšíření [http://pecl.php.net/package/jsonc PECL jsonc].
+* Rozšíření PHP je součástí Red Hat Enterprise Linux (CentOS) 5 a 6, avšak musí se povolit v <code>/etc/php.ini</code> nebo <code>/etc/php.d/json.ini</code>.
+* V některých linuxových distribucích vydaných po květnu 2013 může toto rozšíření PHP chybět a místo toho mohou používat rozšíření PECL jako <code>php5-json</code> nebo <code>php-pecl-jsonc</code>.",
        'config-xcache' => 'Je nainstalována [http://xcache.lighttpd.net/ XCache]',
        'config-apc' => 'Je nainstalováno [http://www.php.net/apc APC]',
        'config-wincache' => 'Je nainstalována [http://www.iis.net/download/WinCacheForPhp WinCache]',
@@ -4072,6 +4076,10 @@ MediaWiki benötigt die UTF-8-Unterstützung, um fehlerfrei lauffähig zu sein."
 Dieser Wert ist wahrscheinlich zu niedrig.
 Der Installationsvorgang könnte daher scheitern!",
        'config-ctype' => "'''Fataler Fehler:''' PHP muss mit Unterstützung für das [http://www.php.net/manual/de/ctype.installation.php Modul ctype] kompiliert werden.",
+       'config-json' => "'''Fatal:''' PHP wurde ohne JSON-Support kompiliert.
+Du musst entweder die PHP-JSON- oder die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren, bevor du MediaWiki installierst.
+* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in <code>/etc/php.ini</code> oder <code>/etc/php.d/json.ini</code> aktiviert werden.
+* Einige Linux-Distributionen, die nach Mai 2013 veröffentlicht wurden, lassen die PHP-Erweiterung weg, stattdessen wird die PECL-Erweiterung als <code>php5-json</code> oder <code>php-pecl-jsonc</code> mitgeliefert.",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] ist installiert',
        'config-apc' => '[http://www.php.net/apc APC] ist installiert',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert',
@@ -5883,6 +5891,10 @@ MédiaWiki nécessite la gestion d’UTF-8 pour fonctionner correctement.",
 Cette valeur est probablement trop faible.
 Il est possible que l’installation échoue !",
        'config-ctype' => "'''Fatal ''': PHP doit être compilé avec le support pour l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
+       'config-json' => "'''Erreur fatale :''' PHP a été compilé sans le support de JSON.
+Vous devez soit installez l’extension JSON de PHP ou l’extension [http://pecl.php.net/package/jsonc PECL jsonc] avant d’installer MediaWiki.
+* L’extension PHP est comprise dans Red Hat Enterprise Linux (CentOS) 5 et 6, mais doit être activée dans <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.
+* Certaines distributions Linux après mai 2013 ne comprennent pas l’extension PHP, mais oint mis à la place l’extension PECL sous al forme <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] est installé',
        'config-apc' => '[http://www.php.net/apc APC] est installé',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] est installé',
@@ -6704,7 +6716,11 @@ MediaWiki necesita soporte UTF-8 para funcionar correctamente.",
        'config-memory-bad' => "'''Atención:''' O parámetro <code>memory_limit</code> do PHP é $1.
 Probablemente é un valor baixo de máis.
 A instalación pode fallar!",
-       'config-ctype' => "'''Fatal:''' O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+       'config-ctype' => "'''Erro fatal:''' O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+       'config-json' => "'''Erro fatal:''' O PHP compilouse sen o soporte de JSON.
+Debe instalar ben a extensión JSON do PHP ou a extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.
+* A extensión do PHP está incluída en Red Hat Enterprise Linux (CentOS) 5 e 6, mais debe activarse <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.
+* Algunhas distribucións do Linux lanzadas despois de maio de 2013 omiten a extensión do PHP, pero inclúen a extensión PECL como <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] está instalado',
        'config-apc' => '[http://www.php.net/apc APC] está instalado',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado',
@@ -11016,7 +11032,7 @@ $messages['kbd-cyrl'] = array(
  * @author Rachitrali
  */
 $messages['khw'] = array(
-       'mainpagetext' => "\"<big>'''میڈیاوکیو کامیابیو سورا چالو کورونو بیتی شیر۔.'''</big>\"",
+       'mainpagetext' => "'''میڈیاوکیو کامیابیو سورا چالو کورونو بیتی شیر۔.'''",
 );
 
 /** Kirmanjki (Kırmancki)
@@ -12648,11 +12664,11 @@ Jums reikės atsisiųsti ir įdėti jį į savo wiki įdiegimo bazę (pačiame k
 
 Jei atsisiuntimas nebuvo pasiūlytas, arba jį atšaukėte, galite iš naujo atsisiųsti paspaudę žemiau esančią nuorodą:
 
-<span class=\"notranslate\" versti=\"no\">\$3</span>
+$3
 
 '''Pastaba:''' Jei jūs to nepadarysite dabar, tada šis sukurtas konfigūracijos failas nebus galimas vėliau, jei išeisite iš įdiegimo be atsisiuntimo.
 
-Kai baigsite, jūs galėsite '''[\$2 įeiti į savo wiki]'''.",
+Kai baigsite, jūs galėsite '''[$2 įeiti į savo wiki]'''.",
        'config-download-localsettings' => 'Atsisiųsti <code>LocalSettings.php</code>',
        'config-help' => 'pagalba',
        'mainpagetext' => "'''MediaWiki sėkmingai įdiegta.'''",
 Ова е веројатно премалку.
 Инсталацијата може да не успее!",
        'config-ctype' => "'''Фатална грешка''': PHP мора да се состави со поддршка за [http://www.php.net/manual/en/ctype.installation.php додатокот Ctype].",
+       'config-json' => "'''Кобно:''' PHP беше срочен без поддршка од JSON.
+Ќе мора да го инсталирате додатокот за JSON во PHP, или додатокот [http://pecl.php.net/package/jsonc PECL jsonc] пред да го инсталирате МедијаВики.
+* Додатокот за PHP е вклучен во верзиите 5 и 6 на Linux (од Red Hat Enterprise) (CentOS), но мора да се активира во <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.
+* Некои варијанти на Linux излезени по мај 2013 г. не го содржат додатокот за PHP, туку го пакуваат додатокот PECL како <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] е инсталиран',
        'config-apc' => '[http://www.php.net/apc APC] е инсталиран',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] е инсталиран',
@@ -16482,6 +16502,7 @@ $messages['ps'] = array(
  * @author SandroHc
  * @author Waldir
  * @author 아라
+ * @author 555
  */
 $messages['pt'] = array(
        'config-desc' => 'O instalador do MediaWiki',
@@ -16536,7 +16557,7 @@ Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code>
        'config-restart' => 'Sim, reiniciar',
        'config-welcome' => '=== Verificações do ambiente ===
 São realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.
-Se necessitar de pedir ajuda durante a instalação, deve fornecer os resultados destas verificações.',
+Se necessitar de pedir ajuda durante a instalação, deve fornecer os resultados destas verificações.', # Fuzzy
        'config-copyright' => "=== Direitos de autor e Condições de uso ===
 
 $1
@@ -16563,7 +16584,7 @@ Não pode instalar o MediaWiki.',
        'config-env-php' => 'O PHP $1 está instalado.',
        'config-env-php-toolow' => 'O PHP $1 está instalado.
 No entanto, o MediaWiki requer o PHP $2 ou superior.',
-       'config-unicode-using-utf8' => 'A usar o utf8_normalize.so, por Brian Viper, para a normalização Unicode.',
+       'config-unicode-using-utf8' => 'A usar o utf8_normalize.so, por Brion Vibber, para a normalização Unicode.',
        'config-unicode-using-intl' => 'A usar a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.',
        'config-unicode-pure-php-warning' => "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.
 Se o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [//www.mediawiki.org/wiki/Unicode_normalization_considerations/pt normalização Unicode].",
@@ -17110,7 +17131,7 @@ Você pode instalar o MediaWiki.',
        'config-env-bad' => 'O ambiente foi verificado.
 Você não pode instalar o MediaWiki.',
        'config-env-php' => 'O PHP $1 está instalado.',
-       'config-unicode-using-utf8' => 'A usar o utf8_normalize.so, de Brian Viper, para a normalização Unicode.',
+       'config-unicode-using-utf8' => 'Usando o utf8_normalize.so, de Brion Vibber, para a normalização Unicode.',
        'config-unicode-using-intl' => 'Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.',
        'config-unicode-pure-php-warning' => "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode sendo usada, em seu lugar, a lenta implementação de PHP puro.
 Se o seu site tem um alto volume de tráfego, informe-se sobre a [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalização Unicode].",
@@ -17124,11 +17145,11 @@ Se você instalou o PHP a partir de um pacote do Debian ou do Ubuntu, instale ta
        'config-register-globals' => "' ' 'Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''
 ' ' 'Desative-a, se puder.'''
 O MediaWiki funcionará mesmo assim, mas o seu servidor ficará exposto a potenciais vulnerabilidades de segurança.",
-       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binário',
+       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
        'config-mysql-innodb' => 'InnoDB',
        'config-mysql-myisam' => 'MyISAM',
-       'config-mysql-binary' => 'Binário',
+       'config-mysql-binary' => 'Binary',
        'config-mysql-utf8' => 'UTF-8',
        'config-ns-generic' => 'Projeto',
        'config-admin-box' => 'Conta de administrador',
@@ -17539,6 +17560,11 @@ 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-json' => "'''Фатальная ошибка:''' PHP был скомпилирован без поддержка JSON.
+Вам необходимо установить либо расширение PHP JSON, либо расширение [http://pecl.php.net/package/jsonc PECL jsonc] перед установкой MediaWiki.
+* PHP-расширение входит в состав Red Hat Enterprise Linux (CentOS) 5 и 6, хотя должна быть включено в <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.
+* Некоторые дистрибутивы Linux, выпущенные после мая 2013 года, не включают расширение PHP, вместо того, чтобы упаковывать расширение PECL как <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] установлен',
        'config-apc' => '[http://www.php.net/apc APC] установлен',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] установлен',
@@ -17547,6 +17573,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>.
 Возможно отображение миниатюр изображений, если вы разрешите закачки файлов.',
@@ -17738,6 +17765,12 @@ chmod a+w $3</pre>',
 
 Если ваша установка MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.
 Если ваша установка MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
+       'config-mysql-only-myisam-dep' => "'''Предупреждение:''' MyISAM является единственной доступной системой хранения данных для MySQL, которая, однако, не рекомендуется для использования с MediaWiki, потому что:
+ * он слабо поддерживает параллелизм из-за блокировки таблиц
+ * она больше других систем подвержена повреждению
+ * кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует
+
+Ваша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
        'config-mysql-engine-help' => "'''InnoDB''' почти всегда предпочтительнее, так как он лучше справляется с параллельным доступом.
 
 '''MyISAM''' может оказаться быстрее для вики с одним пользователем или с минимальным количеством поступающих правок, однако базы данных на нём портятся чаще, чем на InnoDB.",
@@ -17949,6 +17982,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 справочном руководстве].
 
@@ -18447,8 +18483,13 @@ Vnesite ime dovoljenja ročno.',
        'config-download-localsettings' => 'Prenesi <code>LocalSettings.php</code>',
        'config-help' => 'pomoč',
        'mainpagetext' => "'''Programje MediaWiki je bilo uspešno nameščeno.'''",
-       'mainpagedocfooter' => 'Za uporabo in pomoč pri nastavitvi, prosimo, preglejte [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentacijo za prilagajanje vmesnika]
-in [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Uporabniški priročnik].', # Fuzzy
+       'mainpagedocfooter' => 'Oglejte si [//meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.
+
+== Kako začeti ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]
+* [//www.mediawiki.org/wiki/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]',
 );
 
 /** Lower Silesian (Schläsch)
@@ -19891,6 +19932,10 @@ MediaWiki вимагає підтримку UTF-8 для коректної ро
 Імовірно, це замало.
 Встановлення може не вдатись!",
        'config-ctype' => "'''Помилка''': PHP має бути зібраним з підтримкою [http://www.php.net/manual/en/ctype.installation.php розширення Ctype].",
+       'config-json' => "'''Fatal:''' PHP був скомпільований без підтримки JSON.
+Вам потрібно встановити або розширення PHP JSON або розширення[http://pecl.php.net/package/jsonc PECL jsonc] перед встановлення Медіавікі.
+* Розширення PHP включено у Red Hat Enterprise Linux (CentOS) 5 та 6, хоча має бути доступним у  <code>/etc/php.ini</code> або <code>/etc/php.d/json.ini</code>.
+* Деякі дистрибутиви Лінукса, випущені після травня 2013, пропустили розширення PHP, натомість упакували розширення  PECL як <code>php5-json</code> або <code>php-pecl-jsonc</code>.",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] встановлено',
        'config-apc' => '[http://www.php.net/apc APC] встановлено',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] встановлено',
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..5e420b6 100644 (file)
@@ -72,7 +72,7 @@ class MysqlInstaller extends DatabaseInstaller {
         * @return Bool
         */
        public function isCompiled() {
-               return self::checkExtension( 'mysql' );
+               return self::checkExtension( 'mysql' ) || self::checkExtension( 'mysqli' );
        }
 
        /**
@@ -149,18 +149,18 @@ class MysqlInstaller extends DatabaseInstaller {
        public function openConnection() {
                $status = Status::newGood();
                try {
-                       $db = new DatabaseMysql(
-                               $this->getVar( 'wgDBserver' ),
-                               $this->getVar( '_InstallUser' ),
-                               $this->getVar( '_InstallPassword' ),
-                               false,
-                               0,
-                               $this->getVar( 'wgDBprefix' )
-                       );
+                       $db = DatabaseBase::factory( 'mysql', array(
+                               'host' => $this->getVar( 'wgDBserver' ),
+                               'user' => $this->getVar( '_InstallUser' ),
+                               'password' => $this->getVar( '_InstallPassword' ),
+                               'dbname' => false,
+                               'flags' => 0,
+                               'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
                        $status->value = $db;
                } catch ( DBConnectionError $e ) {
                        $status->fatal( 'config-connection-error', $e->getMessage() );
                }
+
                return $status;
        }
 
@@ -170,6 +170,7 @@ class MysqlInstaller extends DatabaseInstaller {
                $status = $this->getConnection();
                if ( !$status->isOK() ) {
                        $this->parent->showStatusError( $status );
+
                        return;
                }
                /**
@@ -243,6 +244,7 @@ class MysqlInstaller extends DatabaseInstaller {
                        }
                }
                $engines = array_intersect( $this->supportedEngines, $engines );
+
                return $engines;
        }
 
@@ -327,6 +329,7 @@ class MysqlInstaller extends DatabaseInstaller {
                        // Can't grant everything
                        return false;
                }
+
                return true;
        }
 
@@ -350,7 +353,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 +385,8 @@ class MysqlInstaller extends DatabaseInstaller {
                                                'class' => 'hideShowRadio',
                                                'rel' => 'dbMyisamWarning'
                                        )
-                       )));
+                               )
+                       ) );
                        $s .= $this->parent->getHelpBox( 'config-mysql-engine-help' );
                }
 
@@ -402,7 +406,7 @@ class MysqlInstaller extends DatabaseInstaller {
                                'label' => 'config-mysql-charset',
                                'itemLabelPrefix' => 'config-mysql-',
                                'values' => $charsets
-                       ));
+                       ) );
                        $s .= $this->parent->getHelpBox( 'config-mysql-charset-help' );
                }
 
@@ -431,14 +435,13 @@ class MysqlInstaller extends DatabaseInstaller {
                if ( !$create ) {
                        // Test the web account
                        try {
-                               new DatabaseMysql(
-                                       $this->getVar( 'wgDBserver' ),
-                                       $this->getVar( 'wgDBuser' ),
-                                       $this->getVar( 'wgDBpassword' ),
-                                       false,
-                                       0,
-                                       $this->getVar( 'wgDBprefix' )
-                               );
+                               $db = DatabaseBase::factory( 'mysql', array(
+                                       'host' => $this->getVar( 'wgDBserver' ),
+                                       'user' => $this->getVar( 'wgDBuser' ),
+                                       'password' => $this->getVar( 'wgDBpassword' ),
+                                       'dbname' => false,
+                                       'flags' => 0,
+                                       'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
                        } catch ( DBConnectionError $e ) {
                                return Status::newFatal( 'config-connection-error', $e->getMessage() );
                        }
@@ -454,6 +457,7 @@ class MysqlInstaller extends DatabaseInstaller {
                if ( !in_array( $this->getVar( '_MysqlCharset' ), $charsets ) ) {
                        $this->setVar( '_MysqlCharset', reset( $charsets ) );
                }
+
                return Status::newGood();
        }
 
@@ -481,6 +485,7 @@ class MysqlInstaller extends DatabaseInstaller {
                        $conn->selectDB( $dbName );
                }
                $this->setupSchemaVars();
+
                return $status;
        }
 
@@ -507,14 +512,13 @@ class MysqlInstaller extends DatabaseInstaller {
                if ( $this->getVar( '_CreateDBAccount' ) ) {
                        // Before we blindly try to create a user that already has access,
                        try { // first attempt to connect to the database
-                               new DatabaseMysql(
-                                       $server,
-                                       $dbUser,
-                                       $password,
-                                       false,
-                                       0,
-                                       $this->getVar( 'wgDBprefix' )
-                               );
+                               $db = DatabaseBase::factory( 'mysql', array(
+                                       'host' => $server,
+                                       'user' => $dbUser,
+                                       'password' => $password,
+                                       'dbname' => false,
+                                       'flags' => 0,
+                                       'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
                                $grantableNames[] = $this->buildFullUserName( $dbUser, $server );
                                $tryToCreate = false;
                        } catch ( DBConnectionError $e ) {
@@ -603,11 +607,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 +628,7 @@ class MysqlInstaller extends DatabaseInstaller {
                if ( $this->getVar( '_MysqlCharset' ) !== null ) {
                        $options[] = 'DEFAULT CHARSET=' . $this->getVar( '_MysqlCharset' );
                }
+
                return implode( ', ', $options );
        }
 
@@ -645,8 +650,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 261d02a..93ea773 100644 (file)
@@ -231,6 +231,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        // 1.22
                        array( 'doIwlinksIndexNonUnique' ),
                        array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title',  'patch-iwlinks-from-title-index.sql' ),
+                       array( 'addField',      'archive',      'ar_id',                    'patch-archive-ar_id.sql' ),
+                       array( 'addField',      'externallinks',  'el_id',  'patch-externallinks-el_id.sql' ),
                );
        }
 
@@ -247,11 +249,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        return true;
                }
 
-               $tableName = $this->db->tableName( $table );
-               $res = $this->db->query( "SELECT $field FROM $tableName LIMIT 0", __METHOD__ );
-               $flags = explode( ' ', mysql_field_flags( $res->result, 0 ) );
-
-               if ( in_array( 'binary', $flags ) ) {
+               $fieldInfo = $this->db->fieldInfo( $table, $field );
+               if ( $fieldInfo->isBinary() ) {
                        $this->output( "...$table table has correct $field encoding.\n" );
                } else {
                        $this->applyPatch( $patchFile, false, "Fixing $field encoding on $table table" );
@@ -276,11 +275,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 +297,7 @@ class MysqlUpdater extends DatabaseUpdater {
 
                if ( $this->db->tableExists( "interwiki", __METHOD__ ) ) {
                        $this->output( "...already have interwiki table\n" );
+
                        return;
                }
 
@@ -313,6 +315,7 @@ class MysqlUpdater extends DatabaseUpdater {
                }
                if ( $meta->isMultipleKey() ) {
                        $this->output( "...indexes seem up to 20031107 standards.\n" );
+
                        return;
                }
 
@@ -328,6 +331,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 +348,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 +366,7 @@ class MysqlUpdater extends DatabaseUpdater {
        function doSchemaRestructuring() {
                if ( $this->db->tableExists( 'page', __METHOD__ ) ) {
                        $this->output( "...page table already exists.\n" );
+
                        return;
                }
 
@@ -379,7 +385,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 +558,7 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doPagelinksUpdate() {
                if ( $this->db->tableExists( 'pagelinks', __METHOD__ ) ) {
                        $this->output( "...already have pagelinks table.\n" );
+
                        return;
                }
 
@@ -589,6 +596,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 +629,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        } else {
                                $this->output( "...user_groups table exists and is in current format.\n" );
                        }
+
                        return;
                }
 
@@ -633,6 +642,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 +680,7 @@ class MysqlUpdater extends DatabaseUpdater {
                }
                if ( $info->isNullable() ) {
                        $this->output( "...wl_notificationtimestamp is already nullable.\n" );
+
                        return;
                }
 
@@ -696,6 +707,7 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doTemplatelinksUpdate() {
                if ( $this->db->tableExists( 'templatelinks', __METHOD__ ) ) {
                        $this->output( "...templatelinks table already exists\n" );
+
                        return;
                }
 
@@ -719,7 +731,6 @@ class MysqlUpdater extends DatabaseUpdater {
                                                'tl_title' => $row->pl_title,
                                        ), __METHOD__
                                );
-
                        }
                } else {
                        // Fast update
@@ -739,8 +750,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 +764,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 +786,7 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doCategoryPopulation() {
                if ( $this->updateRowExists( 'populate category' ) ) {
                        $this->output( "...category table already populated.\n" );
+
                        return;
                }
 
@@ -807,7 +820,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 +834,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 +846,7 @@ class MysqlUpdater extends DatabaseUpdater {
                if ( !$info ) {
                        $this->applyPatch( 'patch-filearchive-user-index.sql', false, "Updating filearchive indices" );
                }
+
                return true;
        }
 
@@ -838,10 +854,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 +869,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 +879,7 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function doClFieldsUpdate() {
                if ( $this->updateRowExists( 'cl_fields_update' ) ) {
                        $this->output( "...categorylinks up-to-date.\n" );
+
                        return;
                }
 
@@ -889,6 +909,7 @@ class MysqlUpdater extends DatabaseUpdater {
                }
                if ( $info->isNullable() ) {
                        $this->output( "...user_last_timestamp is already nullable.\n" );
+
                        return;
                }
 
@@ -899,10 +920,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..8484189 100644 (file)
@@ -73,7 +73,9 @@ class OracleUpdater extends DatabaseUpdater {
                        array( 'addField',      'revision',     'rev_content_format',           'patch-revision-rev_content_format.sql' ),
                        array( 'addField',      'revision',     'rev_content_model',            'patch-revision-rev_content_model.sql' ),
                        array( 'addField',      'archive',      'ar_content_format',            'patch-archive-ar_content_format.sql' ),
-                       array( 'addField',      'archive',      'ar_content_model',                 'patch-archive-ar_content_model.sql' ),
+                       array( 'addField',      'archive',      'ar_content_model',             'patch-archive-ar_content_model.sql' ),
+                       array( 'addField',      'archive',      'ar_id',                        'patch-archive-ar_id.sql' ),
+                       array( 'addField',      'externallinks',        'el_id',                'patch-externallinks-el_id.sql' ),
                        array( 'addField',      'page',     'page_content_model',               'patch-page-page_content_model.sql' ),
                        array( 'dropField', 'site_stats', 'ss_admins',  'patch-ss_admins.sql' ),
                        array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
@@ -212,6 +214,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 +250,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..f0e4aec 100644 (file)
@@ -103,8 +103,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'archive',       'ar_content_model',     'TEXT' ),
                        array( 'addPgField', 'archive',       'ar_content_format',    'TEXT' ),
                        array( 'addPgField', 'categorylinks', 'cl_sortkey_prefix',    "TEXT NOT NULL DEFAULT ''"),
-                       array( 'addPgField', 'categorylinks', 'cl_collation',         "TEXT NOT NULL DEFAULT 0"),
-                       array( 'addPgField', 'categorylinks', 'cl_type',              "TEXT NOT NULL DEFAULT 'page'"),
+                       array( 'addPgField', 'categorylinks', 'cl_collation',         "TEXT NOT NULL DEFAULT 0" ),
+                       array( 'addPgField', 'categorylinks', 'cl_type',              "TEXT NOT NULL DEFAULT 'page'" ),
                        array( 'addPgField', 'image',         'img_sha1',             "TEXT NOT NULL DEFAULT ''" ),
                        array( 'addPgField', 'ipblocks',      'ipb_allow_usertalk',   'SMALLINT NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'ipblocks',      'ipb_anon_only',        'SMALLINT NOT NULL DEFAULT 0' ),
@@ -159,6 +159,9 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'job',           'job_token',            "TEXT NOT NULL DEFAULT ''" ),
                        array( 'addPgField', 'job',           'job_token_timestamp',  "TIMESTAMPTZ" ),
                        array( 'addPgField', 'job',           'job_sha1',             "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'archive',       'ar_id',                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('archive_ar_id_seq')" ),
+                       array( 'addPgField', 'externallinks', 'el_id',                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq')" ),
+
 
                        # type changes
                        array( 'changeField', 'archive',       'ar_deleted',      'smallint', '' ),
@@ -205,6 +208,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'changeField', 'templatelinks', 'tl_namespace',    'smallint', 'tl_namespace::smallint' ),
                        array( 'changeField', 'user_newtalk',  'user_ip',         'text',     'host(user_ip)' ),
                        array( 'changeField', 'uploadstash',   'us_image_bits',   'smallint', '' ),
+                       array( 'changeField', 'profiling',     'pf_time',         'float', '' ),
+                       array( 'changeField', 'profiling',     'pf_memory',       'float', '' ),
 
                        # null changes
                        array( 'changeNullableField', 'oldimage', 'oi_bits',       'NULL' ),
@@ -371,25 +376,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 +408,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 +417,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 +491,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 +515,7 @@ END;
                        return null;
                }
                $d = $row[0];
+
                return $d;
        }
 
@@ -524,6 +532,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 +559,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 +567,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 +590,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 +651,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 +683,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 e64847d..0b572f6 100644 (file)
@@ -95,7 +95,6 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'addField', 'archive',  'ar_content_format',  'patch-archive-ar_content_format.sql' ),
                        array( 'addField', 'archive',  'ar_content_model',   'patch-archive-ar_content_model.sql' ),
                        array( 'addField', 'page',     'page_content_model', 'patch-page-page_content_model.sql' ),
-
                        array( 'dropField', 'site_stats',    'ss_admins',         'patch-drop-ss_admins.sql' ),
                        array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
                        array( 'addTable', 'sites',                            'patch-sites.sql' ),
@@ -109,6 +108,8 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'addIndex', 'page_props', 'pp_propname_page',  'patch-page_props-propname-page-index.sql' ),
                        array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
                        array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title',  'patch-iwlinks-from-title-index.sql' ),
+                       array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ),
+                       array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ),
                );
        }
 
@@ -116,6 +117,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 +137,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..6556ee8 100644 (file)
@@ -36,8 +36,10 @@ 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)
 
        const ROOTJOB_TTL = 2419200; // integer; seconds to remember root jobs (28 days)
 
@@ -61,6 +63,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 +442,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 +453,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 +485,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 d788c98..ce2f3c7 100644 (file)
  *
  * If used for performance, then $wgMainCacheType should be set to memcached/redis.
  * Note that "fifo" cannot be used for the ordering, since the data is distributed.
- * One can still use "timestamp" instead, as in "roughly timestamp ordered".
+ * One can still use "timestamp" instead, as in "roughly timestamp ordered". Also,
+ * queue classes used by this should ignore down servers (with TTL) to avoid slowness.
  *
  * @ingroup JobQueue
  * @since 1.22
  */
 class JobQueueFederated extends JobQueue {
-       /** @var Array (wiki ID => section name) */
-       protected $sectionsByWiki = array();
-       /** @var Array (section name => (partition name => weight)) */
-       protected $partitionsBySection = array();
-       /** @var Array (section name => config array) */
-       protected $configByPartition = array();
-       /** @var Array (partition names => integer) */
-       protected $partitionsNoPush = array();
-
-       /** @var HashRing */
-       protected $partitionRing;
+       /** @var Array (partition name => weight) */
+       protected $partitionMap = array();
        /** @var Array (partition name => JobQueue) */
        protected $partitionQueues = array();
+       /** @var HashRing */
+       protected $partitionPushRing;
        /** @var BagOStuff */
        protected $cache;
 
@@ -82,36 +76,38 @@ class JobQueueFederated extends JobQueue {
         */
        protected function __construct( array $params ) {
                parent::__construct( $params );
-               $this->sectionsByWiki = isset( $params['sectionsByWiki'] )
-                       ? $params['sectionsByWiki']
-                       : array(); // all in "default" section
-               $this->partitionsBySection = $params['partitionsBySection'];
-               $this->configByPartition = $params['configByPartition'];
+               $section = isset( $params['sectionsByWiki'][$this->wiki] )
+                       ? $params['sectionsByWiki'][$this->wiki]
+                       : 'default';
+               if ( !isset( $params['partitionsBySection'][$section] ) ) {
+                       throw new MWException( "No configuration for section '$section'." );
+               }
+               $this->partitionMap = $params['partitionsBySection'][$section];
+               $partitionPushMap = $this->partitionMap;
                if ( isset( $params['partitionsNoPush'] ) ) {
-                       $this->partitionsNoPush = array_flip( $params['partitionsNoPush'] );
+                       foreach ( $params['partitionsNoPush'] as $partition ) {
+                               unset( $partitionPushMap[$partition] );
+                       }
                }
+               // Get the config to pass to merge into each partition queue config
                $baseConfig = $params;
                foreach ( array( 'class', 'sectionsByWiki',
                        'partitionsBySection', 'configByPartition', 'partitionsNoPush' ) as $o )
                {
                        unset( $baseConfig[$o] );
                }
-               foreach ( $this->getPartitionMap() as $partition => $w ) {
-                       if ( !isset( $this->configByPartition[$partition] ) ) {
+               // Get the partition queue objects
+               foreach ( $this->partitionMap as $partition => $w ) {
+                       if ( !isset( $params['configByPartition'][$partition] ) ) {
                                throw new MWException( "No configuration for partition '$partition'." );
                        }
                        $this->partitionQueues[$partition] = JobQueue::factory(
-                               $baseConfig + $this->configByPartition[$partition]
-                       );
+                               $baseConfig + $params['configByPartition'][$partition] );
                }
                // Get the ring of partitions to push job de-duplication information into
-               $partitionsTry = array_diff_key(
-                       $this->getPartitionMap(),
-                       $this->partitionsNoPush
-               ); // (partition => weight)
-               $this->partitionRing = new HashRing( $partitionsTry );
+               $this->partitionPushRing = new HashRing( $partitionPushMap );
                // Aggregate cache some per-queue values if there are multiple partition queues
-               $this->cache = $this->isFederated() ? wfGetMainCache() : new EmptyBagOStuff();
+               $this->cache = count( $this->partitionMap ) > 1 ? wfGetMainCache() : new EmptyBagOStuff();
        }
 
        protected function supportedOrders() {
@@ -198,36 +194,26 @@ class JobQueueFederated extends JobQueue {
                if ( !count( $jobs ) ) {
                        return true; // nothing to do
                }
-
-               $partitionsTry = array_diff_key(
-                       $this->getPartitionMap(),
-                       $this->partitionsNoPush
-               ); // (partition => weight)
-
+               // Local ring variable that may be changed to point to a new ring on failure
+               $partitionRing = $this->partitionPushRing;
                // Try to insert the jobs and update $partitionsTry on any failures
-               $jobsLeft = $this->tryJobInsertions( $jobs, $partitionsTry, $flags );
+               $jobsLeft = $this->tryJobInsertions( $jobs, $partitionRing, $flags );
                if ( count( $jobsLeft ) ) { // some jobs failed to insert?
                        // Try to insert the remaning jobs once more, ignoring the bad partitions
-                       return !count( $this->tryJobInsertions( $jobsLeft, $partitionsTry, $flags ) );
-               } else {
-                       return true;
+                       return !count( $this->tryJobInsertions( $jobsLeft, $partitionRing, $flags ) );
                }
+               return true;
        }
 
        /**
         * @param array $jobs
-        * @param array $partitionsTry
+        * @param HashRing $partitionRing
         * @param integer $flags
         * @return array List of Job object that could not be inserted
         */
-       protected function tryJobInsertions( array $jobs, array &$partitionsTry, $flags ) {
-               if ( !count( $partitionsTry ) ) {
-                       return $jobs; // can't insert anything
-               }
-
+       protected function tryJobInsertions( array $jobs, HashRing &$partitionRing, $flags ) {
                $jobsLeft = array();
 
-               $partitionRing = new HashRing( $partitionsTry );
                // Because jobs are spread across partitions, per-job de-duplication needs
                // to use a consistent hash to avoid allowing duplicate jobs per partition.
                // When inserting a batch of de-duplicated jobs, QOS_ATOMIC is disregarded.
@@ -253,7 +239,7 @@ class JobQueueFederated extends JobQueue {
                foreach ( $uJobsByPartition as $partition => $jobBatch ) {
                        $queue = $this->partitionQueues[$partition];
                        try {
-                               $ok = $queue->doBatchPush( $jobBatch, $flags );
+                               $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
                        } catch ( JobQueueError $e ) {
                                $ok = false;
                                wfDebugLog( 'exception', $e->getLogMessage() );
@@ -262,30 +248,33 @@ class JobQueueFederated extends JobQueue {
                                $key = $this->getCacheKey( 'empty' );
                                $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
                        } else {
-                               unset( $partitionsTry[$partition] ); // blacklist partition
+                               $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
+                               if ( !$partitionRing ) {
+                                       throw new JobQueueError( "Could not insert job(s), all partitions are down." );
+                               }
                                $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
                        }
                }
+
                // Insert the jobs that are not de-duplicated into the queues...
                foreach ( $nuJobBatches as $jobBatch ) {
-                       $partition = ArrayUtils::pickRandom( $partitionsTry );
-                       if ( $partition === false ) { // all partitions at 0 weight?
-                               $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+                       $partition = ArrayUtils::pickRandom( $partitionRing->getLocationWeights() );
+                       $queue = $this->partitionQueues[$partition];
+                       try {
+                               $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
+                       } catch ( JobQueueError $e ) {
+                               $ok = false;
+                               wfDebugLog( 'exception', $e->getLogMessage() );
+                       }
+                       if ( $ok ) {
+                               $key = $this->getCacheKey( 'empty' );
+                               $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
                        } else {
-                               $queue = $this->partitionQueues[$partition];
-                               try {
-                                       $ok = $queue->doBatchPush( $jobBatch, $flags );
-                               } catch ( JobQueueError $e ) {
-                                       $ok = false;
-                                       wfDebugLog( 'exception', $e->getLogMessage() );
-                               }
-                               if ( $ok ) {
-                                       $key = $this->getCacheKey( 'empty' );
-                                       $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
-                               } else {
-                                       unset( $partitionsTry[$partition] ); // blacklist partition
-                                       $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+                               $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
+                               if ( !$partitionRing ) {
+                                       throw new JobQueueError( "Could not insert job(s), all partitions are down." );
                                }
+                               $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
                        }
                }
 
@@ -300,7 +289,7 @@ class JobQueueFederated extends JobQueue {
                        return false;
                }
 
-               $partitionsTry = $this->getPartitionMap(); // (partition => weight)
+               $partitionsTry = $this->partitionMap; // (partition => weight)
 
                while ( count( $partitionsTry ) ) {
                        $partition = ArrayUtils::pickRandom( $partitionsTry );
@@ -335,7 +324,7 @@ class JobQueueFederated extends JobQueue {
 
        protected function doIsRootJobOldDuplicate( Job $job ) {
                $params = $job->getRootJobParams();
-               $partitions = $this->partitionRing->getLocations( $params['rootJobSignature'], 2 );
+               $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
                try {
                        return $this->partitionQueues[$partitions[0]]->doIsRootJobOldDuplicate( $job );
                } catch ( MWException $e ) {
@@ -348,7 +337,7 @@ class JobQueueFederated extends JobQueue {
 
        protected function doDeduplicateRootJob( Job $job ) {
                $params = $job->getRootJobParams();
-               $partitions = $this->partitionRing->getLocations( $params['rootJobSignature'], 2 );
+               $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
                try {
                        return $this->partitionQueues[$partitions[0]]->doDeduplicateRootJob( $job );
                } catch ( MWException $e ) {
@@ -422,17 +411,22 @@ class JobQueueFederated extends JobQueue {
        }
 
        public function getCoalesceLocationInternal() {
-               return "JobQueueFederated:wiki:" . $this->wiki;
+               return "JobQueueFederated:wiki:{$this->wiki}" .
+                       sha1( serialize( array_keys( $this->partitionMap ) ) );
        }
 
        protected function doGetSiblingQueuesWithJobs( array $types ) {
                $result = array();
                foreach ( $this->partitionQueues as $queue ) {
-                       $nonEmpty = $queue->doGetSiblingQueuesWithJobs( $types );
-                       if ( is_array( $nonEmpty ) ) {
-                               $result = array_merge( $result, $nonEmpty );
-                       } else {
-                               return null; // not supported on all partitions; bail
+                       try {
+                               $nonEmpty = $queue->doGetSiblingQueuesWithJobs( $types );
+                               if ( is_array( $nonEmpty ) ) {
+                                       $result = array_merge( $result, $nonEmpty );
+                               } else {
+                                       return null; // not supported on all partitions; bail
+                               }
+                       } catch ( JobQueueError $e ) {
+                               wfDebugLog( 'exception', $e->getLogMessage() );
                        }
                }
                return array_values( array_unique( $result ) );
@@ -441,13 +435,17 @@ class JobQueueFederated extends JobQueue {
        protected function doGetSiblingQueueSizes( array $types ) {
                $result = array();
                foreach ( $this->partitionQueues as $queue ) {
-                       $sizes = $queue->doGetSiblingQueueSizes( $types );
-                       if ( is_array( $sizes ) ) {
-                               foreach ( $sizes as $type => $size ) {
-                                       $result[$type] = isset( $result[$type] ) ? $result[$type] + $size : $size;
+                       try {
+                               $sizes = $queue->doGetSiblingQueueSizes( $types );
+                               if ( is_array( $sizes ) ) {
+                                       foreach ( $sizes as $type => $size ) {
+                                               $result[$type] = isset( $result[$type] ) ? $result[$type] + $size : $size;
+                                       }
+                               } else {
+                                       return null; // not supported on all partitions; bail
                                }
-                       } else {
-                               return null; // not supported on all partitions; bail
+                       } catch ( JobQueueError $e ) {
+                               wfDebugLog( 'exception', $e->getLogMessage() );
                        }
                }
                return $result;
@@ -459,26 +457,6 @@ class JobQueueFederated extends JobQueue {
                }
        }
 
-       /**
-        * @return Array Map of (partition name => weight)
-        */
-       protected function getPartitionMap() {
-               $section = isset( $this->sectionsByWiki[$this->wiki] )
-                       ? $this->sectionsByWiki[$this->wiki]
-                       : 'default';
-               if ( !isset( $this->partitionsBySection[$section] ) ) {
-                       throw new MWException( "No configuration for section '$section'." );
-               }
-               return $this->partitionsBySection[$section];
-       }
-
-       /**
-        * @return bool The queue is actually split up across multiple queue partitions
-        */
-       protected function isFederated() {
-               return ( count( $this->getPartitionMap() ) > 1 );
-       }
-
        /**
         * @return string
         */
index 91e1e87..bc2fff1 100644 (file)
@@ -90,10 +90,10 @@ class FormatJson {
         * @return string|bool: String if successful; false upon failure
         */
        public static function encode( $value, $pretty = false, $escaping = 0 ) {
-               if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
-                       return self::encode53( $value, $pretty, $escaping );
+               if ( defined( 'JSON_UNESCAPED_UNICODE' ) ) {
+                       return self::encode54( $value, $pretty, $escaping );
                }
-               return self::encode54( $value, $pretty, $escaping );
+               return self::encode53( $value, $pretty, $escaping );
        }
 
        /**
@@ -103,9 +103,8 @@ class FormatJson {
         * @param bool $assoc When true, returned objects will be converted into associative arrays.
         *
         * @return mixed: the value encoded in JSON in appropriate PHP type.
-        * Values `"true"`, `"false"`, and `"null"` (case-insensitive) are returned as `true`, `false`
-        * and `null` respectively. `null` is returned if the JSON cannot be
-        * decoded or if the encoded data is deeper than the recursion limit.
+        * `null` is returned if the JSON cannot be decoded or if the encoded data is deeper than
+        * the recursion limit.
         */
        public static function decode( $value, $assoc = false ) {
                return json_decode( $value, $assoc );
@@ -121,8 +120,8 @@ class FormatJson {
         */
        private static function encode54( $value, $pretty, $escaping ) {
                // PHP escapes '/' to prevent breaking out of inline script blocks using '</script>',
-               // which is hardly useful when '<' and '>' are escaped, and such escaping negatively
-               // impacts the human readability of URLs and similar strings.
+               // which is hardly useful when '<' and '>' are escaped (and inadequate), and such
+               // escaping negatively impacts the human readability of URLs and similar strings.
                $options = JSON_UNESCAPED_SLASHES;
                $options |= $pretty ? JSON_PRETTY_PRINT : 0;
                $options |= ( $escaping & self::UTF8_OK ) ? JSON_UNESCAPED_UNICODE : 0;
@@ -152,7 +151,11 @@ class FormatJson {
                if ( $json === false ) {
                        return false;
                }
-               $json = str_replace( '\\/', '/', $json ); // emulate JSON_UNESCAPED_SLASHES
+
+               // Emulate JSON_UNESCAPED_SLASHES. Because the JSON contains no unescaped slashes
+               // (only escaped slashes), a simple string replacement works fine.
+               $json = str_replace( '\/', '/', $json );
+
                if ( $escaping & self::UTF8_OK ) {
                        // JSON hex escape sequences follow the format \uDDDD, where DDDD is four hex digits
                        // indicating the equivalent UTF-16 code unit's value. To most efficiently unescape
@@ -166,7 +169,11 @@ class FormatJson {
                        $json = json_decode( preg_replace( "/\\\\\\\\u(?!00[0-7])/", "\\\\u", "\"$json\"" ) );
                        $json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
                }
-               return $pretty ? self::prettyPrint( $json ) : $json;
+
+               if ( $pretty ) {
+                       return self::prettyPrint( $json );
+               }
+               return $json;
        }
 
        /**
@@ -188,14 +195,14 @@ class FormatJson {
                                        break;
                                case '[':
                                case '{':
-                                       $indent++; // falls through
+                                       ++$indent;
+                                       // falls through
                                case ',':
                                        $buf .= $json[$i] . "\n" . str_repeat( '    ', $indent );
                                        break;
                                case ']':
                                case '}':
-                                       $indent--;
-                                       $buf .= "\n" . str_repeat( '    ', $indent ) . $json[$i];
+                                       $buf .= "\n" . str_repeat( '    ', --$indent ) . $json[$i];
                                        break;
                                case '"':
                                        $skip = strcspn( $json, '"', $i + 1 ) + 2;
index eac2202..221a630 100644 (file)
@@ -355,7 +355,7 @@ class Parser {
                 * to internalParse() which does all the real work.
                 */
 
-               global $wgUseTidy, $wgAlwaysUseTidy;
+               global $wgUseTidy, $wgAlwaysUseTidy, $wgShowHostnames;
                $fname = __METHOD__ . '-' . wfGetCaller();
                wfProfileIn( __METHOD__ );
                wfProfileIn( $fname );
@@ -532,6 +532,9 @@ class Parser {
                        wfRunHooks( 'ParserLimitReportPrepare', array( $this, $this->mOutput ) );
 
                        $limitReport = "NewPP limit report\n";
+                       if ( $wgShowHostnames ) {
+                               $limitReport .= 'Parsed by ' . wfHostname() . "\n";
+                       }
                        foreach ( $this->mOutput->getLimitReportData() as $key => $value ) {
                                if ( wfRunHooks( 'ParserLimitReportFormat',
                                        array( $key, $value, &$limitReport, false, false )
@@ -4447,7 +4450,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 +4469,7 @@ class Parser {
                                'number' => $numbering,
                                'index' => ( $isTemplate ? 'T-' : '' ) . $sectionIndex,
                                'fromtitle' => $titleText,
-                               'byteoffset' => ( $isTemplate ? null : $byteOffset ),
+                               'byteoffset' => ( $noOffset ? null : $byteOffset ),
                                'anchor' => $anchor,
                        );
 
index 9204763..0a1f3b1 100644 (file)
@@ -32,7 +32,7 @@ class ProfilerSimpleUDP extends ProfilerSimple {
        }
 
        public function logData() {
-               global $wgUDPProfilerHost, $wgUDPProfilerPort;
+               global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgUDPProfilerFormatString;
 
                $this->close();
 
@@ -57,7 +57,7 @@ class ProfilerSimpleUDP extends ProfilerSimple {
                                || !isset( $pfdata['real_sq'] ) ) {
                                continue;
                        }
-                       $pfline = sprintf( "%s %s %d %f %f %f %f %s\n", $this->getProfileID(), "-", $pfdata['count'],
+                       $pfline = sprintf( $wgUDPProfilerFormatString, $this->getProfileID(), $pfdata['count'],
                                $pfdata['cpu'], $pfdata['cpu_sq'], $pfdata['real'], $pfdata['real_sq'], $entry );
                        $length = strlen( $pfline );
                        /* printf("<!-- $pfline -->"); */
index 81390dc..19d019d 100644 (file)
@@ -178,12 +178,12 @@ class ResourceLoader {
 
                        // Save filtered text to Memcached
                        $cache->set( $key, $result );
-               } catch ( Exception $exception ) {
-                       $exception->logException();
-                       wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $exception" );
+               } catch ( Exception $e ) {
+                       MWExceptionHandler::logException( $e );
+                       wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $e" );
                        $this->hasErrors = true;
                        // Return exception as a comment
-                       $result = self::formatException( $exception );
+                       $result = self::formatException( $e );
                }
 
                wfProfileOut( __METHOD__ );
@@ -477,7 +477,7 @@ class ResourceLoader {
                try {
                        $this->preloadModuleInfo( array_keys( $modules ), $context );
                } catch ( Exception $e ) {
-                       $e->logException();
+                       MWExceptionHandler::logException( $e );
                        wfDebugLog( 'resourceloader', __METHOD__ . ": preloading module info failed: $e" );
                        $this->hasErrors = true;
                        // Add exception to the output as a comment
@@ -497,7 +497,7 @@ class ResourceLoader {
                                // Calculate maximum modified time
                                $mtime = max( $mtime, $module->getModifiedTime( $context ) );
                        } catch ( Exception $e ) {
-                               $e->logException();
+                               MWExceptionHandler::logException( $e );
                                wfDebugLog( 'resourceloader', __METHOD__ . ": calculating maximum modified time failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
@@ -724,7 +724,7 @@ class ResourceLoader {
                        try {
                                $blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
-                               $e->logException();
+                               MWExceptionHandler::logException( $e );
                                wfDebugLog( 'resourceloader', __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
@@ -832,7 +832,7 @@ class ResourceLoader {
                                                break;
                                }
                        } catch ( Exception $e ) {
-                               $e->logException();
+                               MWExceptionHandler::logException( $e );
                                wfDebugLog( 'resourceloader', __METHOD__ . ": generating module package failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
index c9c7e4e..9ed181e 100644 (file)
@@ -722,21 +722,17 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Generate a cache key for a LESS file.
         *
-        * The cache key varies on the file name, the names and values of global
-        * LESS variables, and the value of $wgShowExceptionDetails. Varying on
-        * $wgShowExceptionDetails ensures the CSS comment indicating compilation
-        * failure shows the right level of detail.
+        * The cache key varies on the file name and the names and values of global
+        * LESS variables.
         *
         * @since 1.22
         * @param string $fileName File name of root LESS file.
         * @return string: Cache key
         */
        protected static function getLESSCacheKey( $fileName ) {
-               global $wgShowExceptionDetails;
-
                $vars = json_encode( ResourceLoader::getLESSVars() );
                $hash = md5( $fileName . $vars );
-               return wfMemcKey( 'resourceloader', 'less', (string)$wgShowExceptionDetails, $hash );
+               return wfMemcKey( 'resourceloader', 'less', $hash );
        }
 
        /**
@@ -753,8 +749,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @return string: CSS source
         */
        protected function compileLESSFile( $fileName ) {
-               global $wgShowExceptionDetails;
-
                $key = self::getLESSCacheKey( $fileName );
                $cache = wfGetCache( CACHE_ANYTHING );
 
@@ -767,34 +761,16 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                }
 
                $compiler = ResourceLoader::getLessCompiler();
-               $expire = 0;
-               try {
-                       $result = $compiler->cachedCompile( $source );
-                       if ( !is_array( $result ) ) {
-                               throw new Exception( 'LESS compiler result has type ' . gettype( $result ) . '; array expected.' );
-                       }
-               } catch ( Exception $e ) {
-                       // The exception might have been caused by an imported file rather
-                       // than the root node. But we don't know which files were imported,
-                       // because compilation failed; we thus cannot rely on file mtime to
-                       // know when to reattempt compilation. Expire in 5 mins. instead.
-                       $expire = 300;
-                       wfDebugLog( 'resourceloader', __METHOD__ . ": $e" );
-                       $result = array();
-                       $result['root'] = $fileName;
-
-                       if ( $wgShowExceptionDetails ) {
-                               $result['compiled'] = ResourceLoader::makeComment( 'LESS error: ' . $e->getMessage() );
-                       } else {
-                               $result['compiled'] = ResourceLoader::makeComment( 'LESS stylesheet compilation failed. ' .
-                                       'Set "$wgShowExceptionDetails = true;" to show detailed debugging information.' );
-                       }
+               $result = null;
 
-                       $result['files'] = array( $fileName => self::safeFilemtime( $fileName ) );
-                       $result['updated'] = time();
+               $result = $compiler->cachedCompile( $source );
+
+               if ( !is_array( $result ) ) {
+                       throw new MWException( 'LESS compiler result has type ' . gettype( $result ) . '; array expected.' );
                }
+
                $this->localFileRefs += array_keys( $result['files'] );
-               $cache->set( $key, $result, $expire );
+               $cache->set( $key, $result );
                return $result['compiled'];
        }
 }
index e840300..fa0fbf8 100644 (file)
@@ -75,9 +75,10 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
                return $this->language->separatorTransformTable();
        }
 
-
        /**
-        * Get all the dynamic data for the content language to an array
+        * Get all the dynamic data for the content language to an array.
+        *
+        * NOTE: Before calling this you HAVE to make sure $this->language is set.
         *
         * @return array
         */
@@ -105,26 +106,20 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
 
        /**
         * @param $context ResourceLoaderContext
-        * @return array|int|Mixed
+        * @return int: UNIX timestamp
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
-               $this->language = Language::factory( $context->getLanguage() );
-               $cache = wfGetCache( CACHE_ANYTHING );
-               $key = wfMemcKey( 'resourceloader', 'langdatamodule', 'changeinfo' );
+               return max( 1, $this->getHashMtime( $context ) );
+       }
 
-               $data = $this->getData();
-               $hash = md5( serialize( $data ) );
+       /**
+        * @param $context ResourceLoaderContext
+        * @return string: Hash
+        */
+       public function getModifiedHash( ResourceLoaderContext $context ) {
+               $this->language = Language::factory( $context->getLanguage() );
 
-               $result = $cache->get( $key );
-               if ( is_array( $result ) && $result['hash'] === $hash ) {
-                       return $result['timestamp'];
-               }
-               $timestamp = wfTimestamp();
-               $cache->set( $key, array(
-                       'hash' => $hash,
-                       'timestamp' => $timestamp,
-               ) );
-               return $timestamp;
+               return md5( serialize( $this->getData() ) );
        }
 
        /**
index 298f1fe..11264fc 100644 (file)
@@ -382,14 +382,59 @@ abstract class ResourceLoaderModule {
         * If you want this to happen, you'll need to call getMsgBlobMtime()
         * yourself and take its result into consideration.
         *
-        * @param ResourceLoaderContext $context
-        * @return int: UNIX timestamp
+        * NOTE: The mtime of the module's hash is NOT automatically included.
+        * If your module provides a getModifiedHash() method, you'll need to call getHashMtime()
+        * yourself and take its result into consideration.
+        *
+        * @param ResourceLoaderContext $context Context object
+        * @return integer UNIX timestamp
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
                // 0 would mean now
                return 1;
        }
 
+       /**
+        * Helper method for calculating when the module's hash (if it has one) changed.
+        *
+        * @param ResourceLoaderContext $context
+        * @return integer: UNIX timestamp or 0 if there is no hash provided
+        */
+       public function getHashMtime( ResourceLoaderContext $context ) {
+               $hash = $this->getModifiedHash( $context );
+               if ( !is_string( $hash ) ) {
+                       return 0;
+               }
+
+               $cache = wfGetCache( CACHE_ANYTHING );
+               $key = wfMemcKey( 'resourceloader', 'modulemodifiedhash', $this->getName() );
+
+               $data = $cache->get( $key );
+               if ( is_array( $data ) && $data['hash'] === $hash ) {
+                       // Hash is still the same, re-use the timestamp of when we first saw this hash.
+                       return $data['timestamp'];
+               }
+
+               $timestamp = wfTimestamp();
+               $cache->set( $key, array(
+                       'hash' => $hash,
+                       'timestamp' => $timestamp,
+               ) );
+
+               return $timestamp;
+       }
+
+       /**
+        * Get the last modification timestamp of the message blob for this
+        * module in a given language.
+        *
+        * @param ResourceLoaderContext $context
+        * @return string|null: Hash
+        */
+       public function getModifiedHash( ResourceLoaderContext $context ) {
+               return null;
+       }
+
        /**
         * Check whether this module is known to be empty. If a child class
         * has an easy and cheap way to determine that this module is
index 784ad04..f1992c0 100644 (file)
@@ -96,8 +96,9 @@ class SpecialBlockList extends SpecialPage {
                                'default' => 50,
                        ),
                );
-               $form = new HTMLForm( $fields, $this->getContext() );
-               $form->setTitle( $this->getTitle() ); // Remove subpage
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
+               $form = new HTMLForm( $fields, $context );
                $form->setMethod( 'get' );
                $form->setWrapperLegendMsg( 'ipblocklist-legend' );
                $form->setSubmitTextMsg( 'ipblocklist-submit' );
index b6005de..501552e 100644 (file)
@@ -547,8 +547,9 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        $this->toc = false;
                }
 
-               $form = new EditWatchlistNormalHTMLForm( $fields, $this->getContext() );
-               $form->setTitle( $this->getTitle() );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
+               $form = new EditWatchlistNormalHTMLForm( $fields, $context );
                $form->setSubmitTextMsg( 'watchlistedit-normal-submit' );
                # Used message keys: 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
                $form->setSubmitTooltip( 'watchlistedit-normal-submit' );
@@ -610,8 +611,9 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                'default' => $titles,
                        ),
                );
-               $form = new HTMLForm( $fields, $this->getContext() );
-               $form->setTitle( $this->getTitle( 'raw' ) );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle( 'raw' ) ); // Reset subpage
+               $form = new HTMLForm( $fields, $context );
                $form->setSubmitTextMsg( 'watchlistedit-raw-submit' );
                # Used message keys: 'accesskey-watchlistedit-raw-submit', 'tooltip-watchlistedit-raw-submit'
                $form->setSubmitTooltip( 'watchlistedit-raw-submit' );
index 27188c3..2e90d99 100644 (file)
@@ -148,11 +148,12 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 
                $this->mTargetObj = $ret;
 
-               $form = new HTMLForm( $this->getFormFields(), $this->getContext() );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
+               $form = new HTMLForm( $this->getFormFields(), $context );
                // By now we are supposed to be sure that $this->mTarget is a user name
                $form->addPreText( $this->msg( 'emailpagetext', $this->mTarget )->parse() );
                $form->setSubmitTextMsg( 'emailsend' );
-               $form->setTitle( $this->getTitle() );
                $form->setSubmitCallback( array( __CLASS__, 'uiSubmit' ) );
                $form->setWrapperLegendMsg( 'email-legend' );
                $form->loadData();
index 814e213..37d2973 100644 (file)
@@ -181,8 +181,9 @@ class NewFilesPager extends ReverseChronologicalPager {
                        unset( $fields['like'] );
                }
 
-               $form = new HTMLForm( $fields, $this->getContext() );
-               $form->setTitle( $this->getTitle() );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
+               $form = new HTMLForm( $fields, $context );
                $form->setSubmitTextMsg( 'ilsubmit' );
                $form->setMethod( 'get' );
                $form->setWrapperLegendMsg( 'newimages-legend' );
index 69c4056..c486ba0 100644 (file)
@@ -105,6 +105,13 @@ class SpecialPasswordReset extends FormSpecialPage {
        public function alterForm( HTMLForm $form ) {
                global $wgPasswordResetRoutes;
 
+               $form->setDisplayFormat( 'vform' );
+               // Turn the old-school line around the form off.
+               // XXX This wouldn't be necessary here if we could set the format of
+               // the HTMLForm to 'vform' at its creation, but there's no way to do so
+               // from a FormSpecialPage class.
+               $form->setWrapperLegend( false );
+
                $i = 0;
                if ( isset( $wgPasswordResetRoutes['username'] ) && $wgPasswordResetRoutes['username'] ) {
                        $i++;
index fe91ada..ce7a45b 100644 (file)
@@ -75,10 +75,11 @@ class SpecialPreferences extends SpecialPage {
 
                $this->getOutput()->addWikiMsg( 'prefs-reset-intro' );
 
-               $htmlForm = new HTMLForm( array(), $this->getContext(), 'prefs-restore' );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle( 'reset' ) ); // Reset subpage
+               $htmlForm = new HTMLForm( array(), $context, 'prefs-restore' );
 
                $htmlForm->setSubmitTextMsg( 'restoreprefs' );
-               $htmlForm->setTitle( $this->getTitle( 'reset' ) );
                $htmlForm->setSubmitCallback( array( $this, 'submitReset' ) );
                $htmlForm->suppressReset();
 
@@ -91,7 +92,7 @@ class SpecialPreferences extends SpecialPage {
                }
 
                $user = $this->getUser();
-               $user->resetOptions( 'all' );
+               $user->resetOptions( 'all', $this->getContext() );
                $user->saveSettings();
 
                $url = $this->getTitle()->getFullURL( 'success' );
index a408beb..a42a217 100644 (file)
@@ -41,16 +41,17 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         */
        public function getDefaultOptions() {
                $opts = new FormOptions();
+               $user = $this->getUser();
 
-               $opts->add( 'days', $this->getUser()->getIntOption( 'rcdays' ) );
-               $opts->add( 'limit', $this->getUser()->getIntOption( 'rclimit' ) );
+               $opts->add( 'days', $user->getIntOption( 'rcdays' ) );
+               $opts->add( 'limit', $user->getIntOption( 'rclimit' ) );
                $opts->add( 'from', '' );
 
-               $opts->add( 'hideminor', $this->getUser()->getBoolOption( 'hideminor' ) );
+               $opts->add( 'hideminor', $user->getBoolOption( 'hideminor' ) );
                $opts->add( 'hidebots', true );
                $opts->add( 'hideanons', false );
                $opts->add( 'hideliu', false );
-               $opts->add( 'hidepatrolled', $this->getUser()->getBoolOption( 'hidepatrolled' ) );
+               $opts->add( 'hidepatrolled', $user->getBoolOption( 'hidepatrolled' ) );
                $opts->add( 'hidemyself', false );
 
                $opts->add( 'namespace', '', FormOptions::INTNULL );
@@ -154,7 +155,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $opts = $this->getOptions();
                $this->setHeaders();
                $this->outputHeader();
-               $this->addRecentChangesJS();
+               $this->addModules();
 
                // Fetch results, prepare a batch link existence check query
                $conds = $this->buildMainQueryConds( $opts );
@@ -424,59 +425,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        return false;
                }
 
-               // Don't use the new_namespace_time timestamp index if:
-               // (a) "All namespaces" selected
-               // (b) We want pages in more than one namespace (inverted/associated)
-               // (c) There is a tag to filter on (use tag index instead)
-               // (d) UNION + sort/limit is not an option for the DBMS
-               if ( $namespace === ''
-                       || ( $invert || $associated )
-                       || $opts['tagfilter'] != ''
-                       || !$dbr->unionSupportsOrderAndLimit()
-               ) {
-                       $res = $dbr->select( $tables, $fields, $conds, __METHOD__,
-                               array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit ) +
-                                       $query_options,
-                               $join_conds );
-               } else {
-                       // We have a new_namespace_time index! UNION over new=(0,1) and sort result set!
-
-                       // New pages
-                       $sqlNew = $dbr->selectSQLText(
-                               $tables,
-                               $fields,
-                               array( 'rc_new' => 1 ) + $conds,
-                               __METHOD__,
-                               array(
-                                       'ORDER BY' => 'rc_timestamp DESC',
-                                       'LIMIT' => $limit,
-                                       'USE INDEX' => array( 'recentchanges' => 'new_name_timestamp' )
-                               ),
-                               $join_conds
-                       );
-
-                       // Old pages
-                       $sqlOld = $dbr->selectSQLText(
-                               $tables,
-                               $fields,
-                               array( 'rc_new' => 0 ) + $conds,
-                               __METHOD__,
-                               array(
-                                       'ORDER BY' => 'rc_timestamp DESC',
-                                       'LIMIT' => $limit,
-                                       'USE INDEX' => array( 'recentchanges' => 'new_name_timestamp' )
-                               ),
-                               $join_conds
-                       );
-
-                       # Join the two fast queries, and sort the result set
-                       $sql = $dbr->unionQueries( array( $sqlNew, $sqlOld ), false ) .
-                               ' ORDER BY rc_timestamp DESC';
-                       $sql = $dbr->limitResult( $sql, $limit, false );
-                       $res = $dbr->query( $sql, __METHOD__ );
-               }
-
-               return $res;
+               // rc_new is not an ENUM, but adding a redundant rc_new IN (0,1) gives mysql enough
+               // knowledge to use an index merge if it wants (it may use some other index though).
+               return $dbr->select(
+                       $tables,
+                       $fields,
+                       $conds + array( 'rc_new' => array( 0, 1 ) ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit ) + $query_options,
+                       $join_conds
+               );
        }
 
        /**
@@ -954,9 +912,9 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        }
 
        /**
-        * Add JavaScript to the page
+        * Add page-specific modules.
         */
-       function addRecentChangesJS() {
+       protected function addModules() {
                $this->getOutput()->addModules( array(
                        'mediawiki.special.recentchanges',
                ) );
index 7e34e98..077e7cb 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialTags extends SpecialPage {
+       /**
+        * @var array List of defined tags
+        */
+       public $definedTags;
 
        function __construct() {
                parent::__construct( 'Tags' );
@@ -55,7 +59,11 @@ class SpecialTags extends SpecialPage {
                        $html .= $this->doTagRow( $tag, $hitcount );
                }
 
-               $out->addHTML( Xml::tags( 'table', array( 'class' => 'wikitable sortable mw-tags-table' ), $html ) );
+               $out->addHTML( Xml::tags(
+                       'table',
+                       array( 'class' => 'wikitable sortable mw-tags-table' ),
+                       $html
+               ) );
        }
 
        function doTagRow( $tag, $hitcount ) {
@@ -66,7 +74,10 @@ class SpecialTags extends SpecialPage {
                $disp = ChangeTags::tagDescription( $tag );
                if ( $user->isAllowed( 'editinterface' ) ) {
                        $disp .= ' ';
-                       $editLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ), $this->msg( 'tags-edit' )->escaped() );
+                       $editLink = Linker::link(
+                               Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ),
+                               $this->msg( 'tags-edit' )->escaped()
+                       );
                        $disp .= $this->msg( 'parentheses' )->rawParams( $editLink )->escaped();
                }
                $newRow .= Xml::tags( 'td', null, $disp );
@@ -75,16 +86,26 @@ class SpecialTags extends SpecialPage {
                $desc = !$msg->exists() ? '' : $msg->parse();
                if ( $user->isAllowed( 'editinterface' ) ) {
                        $desc .= ' ';
-                       $editDescLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ), $this->msg( 'tags-edit' )->escaped() );
+                       $editDescLink = Linker::link(
+                               Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ),
+                               $this->msg( 'tags-edit' )->escaped()
+                       );
                        $desc .= $this->msg( 'parentheses' )->rawParams( $editDescLink )->escaped();
                }
                $newRow .= Xml::tags( 'td', null, $desc );
 
-               $active = $this->msg( isset( $this->definedTags[$tag] ) ? 'tags-active-yes' : 'tags-active-no' )->escaped();
+               $active = isset( $this->definedTags[$tag] ) ? 'tags-active-yes' : 'tags-active-no';
+               $active = $this->msg( $active )->escaped();
                $newRow .= Xml::tags( 'td', null, $active );
 
                $hitcountLabel = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
-               $hitcountLink = Linker::link( SpecialPage::getTitleFor( 'Recentchanges' ), $hitcountLabel, array(), array( 'tagfilter' => $tag ) );
+               $hitcountLink = Linker::link(
+                       SpecialPage::getTitleFor( 'Recentchanges' ),
+                       $hitcountLabel,
+                       array(),
+                       array( 'tagfilter' => $tag )
+               );
+
                // add raw $hitcount for sorting, because tags-hitcount contains numbers and letters
                $newRow .= Xml::tags( 'td', array( 'data-sort-value' => $hitcount ), $hitcountLink );
 
index 51a0a86..09facf4 100644 (file)
@@ -221,6 +221,8 @@ class SpecialUpload extends SpecialPage {
         */
        protected function getUploadForm( $message = '', $sessionKey = '', $hideIgnoreWarning = false ) {
                # Initialize form
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
                $form = new UploadForm( array(
                        'watch' => $this->getWatchCheck(),
                        'forreupload' => $this->mForReUpload,
@@ -232,8 +234,7 @@ class SpecialUpload extends SpecialPage {
                        'texttop' => $this->uploadFormTextTop,
                        'textaftersummary' => $this->uploadFormTextAfterSummary,
                        'destfile' => $this->mDesiredDestName,
-               ), $this->getContext() );
-               $form->setTitle( $this->getTitle() );
+               ), $context );
 
                # Check the token, but only if necessary
                if (
index 002e949..87b6442 100644 (file)
@@ -343,15 +343,16 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                // create the form, which will also be used to execute a callback to process incoming form data
                // this design is extremely dubious, but supposedly HTMLForm is our standard now?
 
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
                $form = new HTMLForm( array(
                        'Clear' => array(
                                'type' => 'hidden',
                                'default' => true,
                                'name' => 'clear',
                        )
-               ), $this->getContext(), 'clearStashedUploads' );
+               ), $context, 'clearStashedUploads' );
                $form->setSubmitCallback( array( __CLASS__, 'tryClearStashedUploads' ) );
-               $form->setTitle( $this->getTitle() );
                $form->setSubmitTextMsg( 'uploadstash-clear' );
 
                $form->prepareForm();
index 7a93ade..90c4c35 100644 (file)
@@ -173,7 +173,8 @@ class LoginForm extends SpecialPage {
                        $query = array(
                                'returnto' => $this->mReturnTo,
                                'returntoquery' => $this->mReturnToQuery,
-                       );
+                               'title' => null,
+                       ) + $this->mRequest->getQueryValues();
                        $url = $title->getFullURL( $query, false, PROTO_HTTPS );
                        if ( $wgSecureLogin && wfCanIPUseHTTPS( $this->getRequest()->getIP() ) ) {
                                $url = wfAppendQuery( $url, 'fromhttp=1' );
@@ -1167,12 +1168,8 @@ class LoginForm extends SpecialPage {
                $template->set( 'remember', $user->getOption( 'rememberpassword' ) || $this->mRemember );
                $template->set( 'cansecurelogin', ( $wgSecureLogin === true ) );
                $template->set( 'stickhttps', (int)$this->mStickHTTPS );
-
-               if ( $this->mType === 'signup' && $user->isLoggedIn() ) {
-                       $template->set( 'createAnother', true );
-               } else {
-                       $template->set( 'createAnother', false );
-               }
+               $template->set( 'loggedin', $user->isLoggedIn() );
+               $template->set( 'loggedinuser', $user->getName() );
 
                if ( $this->mType == 'signup' ) {
                        if ( !self::getCreateaccountToken() ) {
@@ -1231,9 +1228,7 @@ class LoginForm extends SpecialPage {
         * @return bool
         */
        private function showCreateOrLoginLink( &$user ) {
-               if ( $user->isLoggedIn() ) {
-                       return false;
-               } elseif ( $this->mType == 'signup' ) {
+               if ( $this->mType == 'signup' ) {
                        return true;
                } elseif ( $user->isAllowed( 'createaccount' ) ) {
                        return true;
index 59f0dfe..11632a3 100644 (file)
@@ -100,7 +100,7 @@ class SpecialWatchlist extends SpecialPage {
 
                // @todo use FormOptions!
                $defaults = array(
-               /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */
+               /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ),
                /* bool  */ 'hideMinor' => (int)$user->getBoolOption( 'watchlisthideminor' ),
                /* bool  */ 'hideBots' => (int)$user->getBoolOption( 'watchlisthidebots' ),
                /* bool  */ 'hideAnons' => (int)$user->getBoolOption( 'watchlisthideanons' ),
@@ -121,7 +121,7 @@ class SpecialWatchlist extends SpecialPage {
                # Extract variables from the request, falling back to user preferences or
                # other default values if these don't exist
                $values = array();
-               $values['days'] = $request->getVal( 'days', $defaults['days'] );
+               $values['days'] = floatval( $request->getVal( 'days', $defaults['days'] ) );
                $values['hideMinor'] = (int)$request->getBool( 'hideMinor', $defaults['hideMinor'] );
                $values['hideBots'] = (int)$request->getBool( 'hideBots', $defaults['hideBots'] );
                $values['hideAnons'] = (int)$request->getBool( 'hideAnons', $defaults['hideAnons'] );
@@ -158,18 +158,6 @@ class SpecialWatchlist extends SpecialPage {
                $values['invert'] = $invert;
                $values['associated'] = $associated;
 
-               if ( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
-                       $big = 1000; /* The magical big */
-                       if ( $nitems > $big ) {
-                               # Set default cutoff shorter
-                               $values['days'] = $defaults['days'] = ( 12.0 / 24.0 ); # 12 hours...
-                       } else {
-                               $values['days'] = $defaults['days']; # default cutoff for shortlisters
-                       }
-               } else {
-                       $values['days'] = floatval( $values['days'] );
-               }
-
                // Dump everything here
                $nondefaults = array();
                foreach ( $defaults as $name => $defValue ) {
@@ -191,14 +179,6 @@ class SpecialWatchlist extends SpecialPage {
                        $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $values['days'] * 86400 ) ) );
                }
 
-               # If the watchlist is relatively short, it's simplest to zip
-               # down its entirety and then sort the results.
-
-               # If it's relatively long, it may be worth our while to zip
-               # through the time-sorted page list checking for watched items.
-
-               # Up estimate of watched items by 15% to compensate for talk pages...
-
                # Toggles
                if ( $values['hideOwn'] ) {
                        $conds[] = 'rc_user != ' . $user->getId();
index 3d848cf..7a4b9f2 100644 (file)
  * @ingroup Templates
  */
 
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( -1 );
-}
-
 class UsercreateTemplate extends BaseTemplate {
 
        /**
@@ -46,245 +42,242 @@ class UsercreateTemplate extends BaseTemplate {
                $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
 ?>
 <div class="mw-ui-container">
-       <?php
-       if ( $this->haveData( 'languages' ) ) {
-       ?>
+       <?php if ( $this->haveData( 'languages' ) ) { ?>
                <div id="languagelinks">
                        <p><?php $this->html( 'languages' ); ?></p>
                </div>
-       <?php
-       }
-       ?>
-<div id="userloginForm">
-<h2 class="createaccount-join">
-       <?php
-       $this->msg( $this->data['createAnother'] ?
-               'createacct-another-join' : 'createacct-join' );
-       ?>
-</h2>
-<form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
-       <section class="mw-form-header">
-               <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
-       </section>
-       <?php
-       if ( $this->data['message'] ) {
-?>
-               <div class="<?php $this->text( 'messagetype' ); ?>box">
-               <?php if ( $this->data['messagetype'] == 'error' ) { ?>
-                       <strong><?php $this->msg( 'createacct-error' ); ?></strong><br />
-               <?php } ?>
-               <?php $this->html( 'message' ); ?>
-               </div>
        <?php } ?>
-               <div>
-                       <label for='wpName2'>
-                               <?php $this->msg( 'userlogin-yourname' ); ?>
-
-                               <span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername' )->parse(); ?></span>
-                       </label>
-                       <?php
-                       echo Html::input( 'wpName', $this->data['name'], 'text', array(
-                               'class' => 'mw-input loginText',
-                               'id' => 'wpName2',
-                               'tabindex' => '1',
-                               'size' => '20',
-                               'required',
-                               'placeholder' => $this->getMsg( $this->data['createAnother'] ?
-                                       'createacct-another-username-ph' : 'userlogin-yourname-ph' )->text(),
-                       ) );
-                       ?>
-               </div>
-               <div>
-               <?php if ( $this->data['createemail'] ) { ?>
-                       <label class="mw-ui-checkbox-label">
-                               <input name="wpCreateaccountMail" type="checkbox" value="1" id="wpCreateaccountMail" tabindex="2"
-                                       <?php if ( $this->data['createemailset'] ) {
-                                               echo 'checked="checked"';
-                                       } ?>
-                               >
-                               <?php $this->msg( 'createaccountmail' ); ?>
-                       </label>
-               <?php } ?>
-               </div>
-               <div class="mw-row-password">
-                       <label for='wpPassword2'><?php $this->msg( 'userlogin-yourpassword' ); ?></label>
-                       <?php echo Html::input( 'wpPassword', null, 'password', array(
-                               'class' => 'mw-input loginPassword',
-                               'id' => 'wpPassword2',
-                               'tabindex' => '3',
-                               'size' => '20',
-                               'required',
-                               'placeholder' => $this->getMsg( 'createacct-yourpassword-ph' )->text()
-                       ) + User::passwordChangeInputAttribs() ); ?>
-               </div>
-       <?php if ( $this->data['usedomain'] ) {
-               $doms = "";
-               foreach ( $this->data['domainnames'] as $dom ) {
-                       $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
-               }
-       ?>
-               <div id="mw-user-domain-section">
-                       <label for="wpDomain"><?php $this->msg( 'yourdomainname' ); ?></label>
-                       <div class="mw-input">
-                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>"
-                                       tabindex="4">
-                                       <?php echo $doms ?>
-                               </select>
-                       </div>
-               </div>
-       <?php } ?>
-               <div class="mw-row-password">
-                       <label for='wpRetype'><?php $this->msg( 'createacct-yourpasswordagain' ); ?></label>
-                       <?php
-                       echo Html::input( 'wpRetype', null, 'password', array(
-                               'class' => 'mw-input loginPassword',
-                               'id' => 'wpRetype',
-                               'tabindex' => '5',
-                               'size' => '20',
-                               'required',
-                               'placeholder' => $this->getMsg( 'createacct-yourpasswordagain-ph' )->text()
-                               ) + User::passwordChangeInputAttribs() );
-                       ?>
-               </div>
-               <div>
-               <?php if ( $this->data['useemail'] ) { ?>
-                       <label for='wpEmail'>
-                               <?php
-                                       $this->msg( $this->data['emailrequired'] ?
-                                               'createacct-emailrequired' :
-                                               'createacct-emailoptional'
-                                       );
-                               ?>
-                       </label>
-                       <?php
-                               echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
-                                       'class' => 'mw-input loginText',
-                                       'id' => 'wpEmail',
-                                       'tabindex' => '6',
-                                       'size' => '20',
-                                       'placeholder' => $this->getMsg( $this->data['createAnother'] ?
-                                               'createacct-another-email-ph' : 'createacct-email-ph' )->text()
-                               ) + ( $this->data['emailrequired'] ? array() : array( 'required' => '' ) ) );
-                       ?>
-               <?php } ?>
-               </div>
-               <?php if ( $this->data['userealname'] ) { ?>
-                       <div>
-                               <label for='wpRealName'><?php $this->msg( 'createacct-realname' ); ?></label>
-                               <input type='text' class='mw-input loginText' name="wpRealName" id="wpRealName"
-                                       tabindex="7"
-                                       value="<?php $this->text( 'realname' ); ?>" size='20' />
-                               <div class="prefsectiontip">
-                                       <?php $this->msgWiki( $this->data['createAnother'] ? 'createacct-another-realname-tip' : 'prefs-help-realname' ); ?>
+       <div id="userloginForm">
+               <h2 class="createaccount-join">
+                       <?php $this->msg( $this->data['loggedin'] ? 'createacct-another-join' : 'createacct-join' ); ?>
+               </h2>
+               <form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+                       <section class="mw-form-header">
+                               <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+                       </section>
+                       <?php if ( $this->data['message'] ) { ?>
+                               <div class="<?php $this->text( 'messagetype' ); ?>box">
+                                       <?php if ( $this->data['messagetype'] == 'error' ) { ?>
+                                               <strong><?php $this->msg( 'createacct-error' ); ?></strong>
+                                               <br />
+                                       <?php } ?>
+                                       <?php $this->html( 'message' ); ?>
                                </div>
-                       </div>
-               <?php }
-               if ( $this->data['usereason'] ) { ?>
+                       <?php } ?>
+
                        <div>
-                               <label for='wpReason'><?php $this->msg( 'createacct-reason' ); ?></label>
-                               <?php echo Html::input( 'wpReason', $this->data['reason'], 'text', array(
+                               <label for='wpName2'>
+                                       <?php $this->msg( 'userlogin-yourname' ); ?>
+
+                                       <span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername' )->parse(); ?></span>
+                               </label>
+                               <?php
+                               echo Html::input( 'wpName', $this->data['name'], 'text', array(
                                        'class' => 'mw-input loginText',
-                                       'id' => 'wpReason',
-                                       'tabindex' => '8',
+                                       'id' => 'wpName2',
+                                       'tabindex' => '1',
                                        'size' => '20',
-                                       'placeholder' => $this->getMsg( 'createacct-reason-ph' )->text()
-                               ) ); ?>
+                                       'required',
+                                       'placeholder' => $this->getMsg( $this->data['loggedin'] ?
+                                               'createacct-another-username-ph' : 'userlogin-yourname-ph' )->text(),
+                               ) );
+                               ?>
                        </div>
-               <?php }
-               $tabIndex = 9;
-               if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
-                       foreach ( $this->data['extraInput'] as $inputItem ) { ?>
+
                        <div>
-                               <?php
-                               // If it's a checkbox, output the whole thing (assume it has a msg).
-                               if ( $inputItem['type'] == 'checkbox' ) {
-                               ?>
+                               <?php if ( $this->data['createemail'] ) { ?>
                                        <label class="mw-ui-checkbox-label">
-                                               <input
-                                                       name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
-                                                       id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
-                                                       type="checkbox" value="1"
-                                                       tabindex="<?php echo $tabIndex++; ?>"
-                                                       <?php if ( !empty( $inputItem['value'] ) ) {
+                                               <input name="wpCreateaccountMail" type="checkbox" value="1" id="wpCreateaccountMail" tabindex="2"
+                                                       <?php if ( $this->data['createemailset'] ) {
                                                                echo 'checked="checked"';
                                                        } ?>
                                                >
-                                               <?php $this->msg( $inputItem['msg'] ); ?>
+                                               <?php $this->msg( 'createaccountmail' ); ?>
                                        </label>
+                               <?php } ?>
+                       </div>
+
+                       <div class="mw-row-password">
+                               <label for='wpPassword2'><?php $this->msg( 'userlogin-yourpassword' ); ?></label>
                                <?php
-                               } else {
-                                       // Not a checkbox.
-                                       // TODO (bug 31909) support other input types, e.g. select boxes.
-                                       if ( !empty( $inputItem['msg'] ) ) {
-                                               // Output the message label
-                                       ?>
-                                               <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
-                                                       <?php $this->msgWiki( $inputItem['msg'] ); ?>
-                                               </label>
-                                       <?php
-                                       }
-                                       ?>
-                                       <input
-                                               type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>"
-                                               class="mw-input"
-                                               name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
-                                               tabindex="<?php echo $tabIndex++; ?>"
-                                               value="<?php echo htmlspecialchars( $inputItem['value'] ); ?>"
-                                               id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
-                                       />
-                               <?php
-                               }
-                               if ( $inputItem['helptext'] !== false ) {
+                               echo Html::input( 'wpPassword', null, 'password', array(
+                                       'class' => 'mw-input loginPassword',
+                                       'id' => 'wpPassword2',
+                                       'tabindex' => '3',
+                                       'size' => '20',
+                                       'required',
+                                       'placeholder' => $this->getMsg( 'createacct-yourpassword-ph' )->text()
+                               ) + User::passwordChangeInputAttribs() );
                                ?>
-                                       <div class="prefsectiontip">
-                                               <?php $this->msgWiki( $inputItem['helptext'] ); ?>
+                       </div>
+
+                       <?php
+                       if ( $this->data['usedomain'] ) {
+                               $doms = "";
+                               foreach ( $this->data['domainnames'] as $dom ) {
+                                       $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+                               }
+                       ?>
+                               <div id="mw-user-domain-section">
+                                       <label for="wpDomain"><?php $this->msg( 'yourdomainname' ); ?></label>
+                                       <div class="mw-input">
+                                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>" tabindex="4">
+                                                       <?php echo $doms ?>
+                                               </select>
                                        </div>
+                               </div>
+                       <?php } ?>
+
+                       <div class="mw-row-password">
+                               <label for='wpRetype'><?php $this->msg( 'createacct-yourpasswordagain' ); ?></label>
                                <?php
-                               }
+                               echo Html::input( 'wpRetype', null, 'password', array(
+                                       'class' => 'mw-input loginPassword',
+                                       'id' => 'wpRetype',
+                                       'tabindex' => '5',
+                                       'size' => '20',
+                                       'required',
+                                       'placeholder' => $this->getMsg( 'createacct-yourpasswordagain-ph' )->text()
+                                       ) + User::passwordChangeInputAttribs() );
                                ?>
+                       </div>
+
+                       <div>
+                               <?php if ( $this->data['useemail'] ) { ?>
+                                       <label for='wpEmail'>
+                                               <?php
+                                                       $this->msg( $this->data['emailrequired'] ?
+                                                               'createacct-emailrequired' :
+                                                               'createacct-emailoptional'
+                                                       );
+                                               ?>
+                                       </label>
+                                       <?php
+                                               echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
+                                                       'class' => 'mw-input loginText',
+                                                       'id' => 'wpEmail',
+                                                       'tabindex' => '6',
+                                                       'size' => '20',
+                                                       'placeholder' => $this->getMsg( $this->data['loggedin'] ?
+                                                               'createacct-another-email-ph' : 'createacct-email-ph' )->text()
+                                               ) + ( $this->data['emailrequired'] ? array() : array( 'required' => '' ) ) );
+                                       ?>
+                               <?php } ?>
+                       </div>
+
+                       <?php if ( $this->data['userealname'] ) { ?>
+                               <div>
+                                       <label for='wpRealName'><?php $this->msg( 'createacct-realname' ); ?></label>
+                                       <input type='text' class='mw-input loginText' name="wpRealName" id="wpRealName"
+                                               tabindex="7"
+                                               value="<?php $this->text( 'realname' ); ?>" size='20' />
+                                       <div class="prefsectiontip">
+                                               <?php $this->msgWiki( $this->data['loggedin'] ? 'createacct-another-realname-tip' : 'prefs-help-realname' ); ?>
+                                       </div>
                                </div>
+                       <?php } ?>
+
+                       <?php if ( $this->data['usereason'] ) { ?>
+                               <div>
+                                       <label for='wpReason'><?php $this->msg( 'createacct-reason' ); ?></label>
+                                       <?php echo Html::input( 'wpReason', $this->data['reason'], 'text', array(
+                                               'class' => 'mw-input loginText',
+                                               'id' => 'wpReason',
+                                               'tabindex' => '8',
+                                               'size' => '20',
+                                               'placeholder' => $this->getMsg( 'createacct-reason-ph' )->text()
+                                       ) ); ?>
+                               </div>
+                       <?php } ?>
+
                        <?php
+                       $tabIndex = 9;
+                       if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
+                               foreach ( $this->data['extraInput'] as $inputItem ) { ?>
+                                       <div>
+                                               <?php
+                                               // If it's a checkbox, output the whole thing (assume it has a msg).
+                                               if ( $inputItem['type'] == 'checkbox' ) {
+                                               ?>
+                                                       <label class="mw-ui-checkbox-label">
+                                                               <input
+                                                                       name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                                                       id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                                                       type="checkbox" value="1"
+                                                                       tabindex="<?php echo $tabIndex++; ?>"
+                                                                       <?php if ( !empty( $inputItem['value'] ) ) {
+                                                                               echo 'checked="checked"';
+                                                                       } ?>
+                                                               >
+                                                               <?php $this->msg( $inputItem['msg'] ); ?>
+                                                       </label>
+                                               <?php
+                                               } else {
+                                                       // Not a checkbox.
+                                                       // TODO (bug 31909) support other input types, e.g. select boxes.
+                                               ?>
+                                                       <?php if ( !empty( $inputItem['msg'] ) ) { ?>
+                                                               <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
+                                                                       <?php $this->msgWiki( $inputItem['msg'] ); ?>
+                                                               </label>
+                                                       <?php } ?>
+                                                       <input
+                                                               type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>"
+                                                               class="mw-input"
+                                                               name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                                               tabindex="<?php echo $tabIndex++; ?>"
+                                                               value="<?php echo htmlspecialchars( $inputItem['value'] ); ?>"
+                                                               id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                                       />
+                                               <?php } ?>
+                                               <?php if ( $inputItem['helptext'] !== false ) { ?>
+                                                       <div class="prefsectiontip">
+                                                               <?php $this->msgWiki( $inputItem['helptext'] ); ?>
+                                                       </div>
+                                               <?php } ?>
+                                       </div>
+                               <?php
+                               }
                        }
-               }
-               // JS attempts to move the image CAPTCHA below this part of the form,
-               // so skip one index.
-               $tabIndex++;
-               ?>
-               <div class="mw-submit">
+
+                       // JS attempts to move the image CAPTCHA below this part of the form,
+                       // so skip one index.
+                       $tabIndex++;
+                       ?>
+                       <div class="mw-submit">
+                               <?php
+                               echo Html::input(
+                                       'wpCreateaccount',
+                                       $this->getMsg( $this->data['loggedin'] ? 'createacct-another-submit' : 'createacct-submit' ),
+                                       'submit',
+                                       array(
+                                               'class' => "mw-ui-button mw-ui-big mw-ui-block mw-ui-primary",
+                                               'id' => 'wpCreateaccount',
+                                               'tabindex' => $tabIndex++
+                                       )
+                               );
+                               ?>
+                       </div>
+                       <?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+                       <?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+               </form>
+       </div>
+       <div class="mw-createacct-benefits-container">
+               <h2><?php $this->msg( 'createacct-benefit-heading' ); ?></h2>
+               <div class="mw-createacct-benefits-list">
                        <?php
-                       echo Html::input( 'wpCreateaccount',
-                               $this->getMsg( $this->data['createAnother'] ?
-                                       'createacct-another-submit' : 'createacct-submit' ),
-                               'submit',
-                               array(
-                                       'class' => "mw-ui-button mw-ui-big mw-ui-block mw-ui-primary",
-                                       'id' => 'wpCreateaccount',
-                                       'tabindex' => $tabIndex++
-                               ) );
+                       for ( $benefitIdx = 1; $benefitIdx <= $this->data['benefitCount']; $benefitIdx++ ) {
+                               // Pass each benefit's head text (by default a number) as a parameter to the body's message for PLURAL handling.
+                               $headUnescaped = $this->getMsg( "createacct-benefit-head$benefitIdx" )->text();
                        ?>
+                               <div class="mw-number-text <?php $this->msg( "createacct-benefit-icon$benefitIdx" ); ?>">
+                                       <h3><?php $this->msg( "createacct-benefit-head$benefitIdx" ); ?></h3>
+                                       <p><?php echo $this->getMsg( "createacct-benefit-body$benefitIdx" )->params( $headUnescaped )->escaped(); ?></p>
+                               </div>
+                       <?php } ?>
                </div>
-<?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-<?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
-</form>
-</div>
-<div class="mw-createacct-benefits-container">
-       <h2><?php $this->msg( 'createacct-benefit-heading' ); ?></h2>
-       <div class="mw-createacct-benefits-list">
-       <?php
-       for ( $benefitIdx = 1; $benefitIdx <= $this->data['benefitCount']; $benefitIdx++ ) {
-               // Pass each benefit's head text (by default a number) as a parameter to the body's message for PLURAL handling.
-               $headUnescaped = $this->getMsg( "createacct-benefit-head$benefitIdx" )->text();
-       ?>
-               <div class="mw-number-text <?php $this->msg( "createacct-benefit-icon$benefitIdx" ); ?>">
-                       <h3><?php $this->msg( "createacct-benefit-head$benefitIdx" ); ?></h3>
-                       <p><?php echo $this->getMsg( "createacct-benefit-body$benefitIdx" )->params( $headUnescaped )->escaped(); ?></p>
-               </div>
-       <?php
-       }
-       ?>
        </div>
 </div>
-</div>
 <?php
 
        }
index 39091ef..f5ae353 100644 (file)
@@ -28,152 +28,159 @@ class UserloginTemplate extends BaseTemplate {
                $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
 ?>
 <div class="mw-ui-container">
-       <?php
-       if ( $this->haveData( 'languages' ) ) {
-       ?>
+       <?php if ( $this->haveData( 'languages' ) ) { ?>
                <div id="languagelinks">
                        <p><?php $this->html( 'languages' ); ?></p>
                </div>
-       <?php
-       }
-       ?>
-<div id="userloginForm">
-<form name="userlogin" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
-       <section class="mw-form-header">
-               <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
-       </section>
-       <?php
+       <?php } ?>
+       <div id="userloginForm">
+               <form name="userlogin" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+                       <?php if ( $this->data['loggedin'] ) { ?>
+                               <div class="warningbox">
+                                       <?php echo $this->getMsg( 'userlogin-loggedin' )->params( $this->data['loggedinuser'] )->parse(); ?>
+                               </div>
+                       <?php } ?>
+                       <section class="mw-form-header">
+                               <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+                       </section>
 
-       if ( $this->data['message'] ) {
-       ?>
-               <div class="<?php $this->text( 'messagetype' ); ?>box">
-               <?php
-               if ( $this->data['messagetype'] == 'error' ) {
-               ?>
-                       <strong><?php $this->msg( 'loginerror' ) ?></strong><br />
-               <?php
-               }
-               $this->html( 'message' );
-               ?>
-               </div>
-       <?php
-       }
-       ?>
-               <div>
-                       <label for='wpName1'>
-                               <?php
-                               $this->msg( 'userlogin-yourname' );
-                               if ( $this->data['secureLoginUrl'] ) {
-                                       echo Html::element( 'a', array(
+                       <?php if ( $this->data['message'] ) { ?>
+                               <div class="<?php $this->text( 'messagetype' ); ?>box">
+                                       <?php if ( $this->data['messagetype'] == 'error' ) { ?>
+                                               <strong><?php $this->msg( 'loginerror' ); ?></strong>
+                                               <br />
+                                       <?php } ?>
+                                       <?php $this->html( 'message' ); ?>
+                               </div>
+                       <?php } ?>
+
+                       <div>
+                               <label for='wpName1'>
+                                       <?php
+                                       $this->msg( 'userlogin-yourname' );
+
+                                       if ( $this->data['secureLoginUrl'] ) {
+                                               echo Html::element( 'a', array(
                                                        'href' => $this->data['secureLoginUrl'],
                                                        'class' => 'mw-ui-flush-right mw-secure',
                                                ), $this->getMsg( 'userlogin-signwithsecure' )->text() );
-                               } ?>
-                       </label>
+                                       }
+                                       ?>
+                               </label>
+                               <?php
+                               $extraAttrs = array();
+                               // Set focus to this field if it's blank.
+                               if ( !$this->data['name'] ) {
+                                       $extraAttrs['autofocus'] = '';
+                               }
+                               echo Html::input( 'wpName', $this->data['name'], 'text', array(
+                                       'class' => 'loginText',
+                                       'id' => 'wpName1',
+                                       'tabindex' => '1',
+                                       'size' => '20',
+                                       // 'required' is blacklisted for now in Html.php due to browser issues.
+                                       // Keeping here in case that changes.
+                                       'required',
+                                       'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text()
+                               ) + $extraAttrs );
+                               ?>
+                       </div>
+
+                       <div>
+                               <label for='wpPassword1'>
+                                       <?php
+                                       $this->msg( 'userlogin-yourpassword' );
+
+                                       if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
+                                               echo ' ' . Linker::link(
+                                                       SpecialPage::getTitleFor( 'PasswordReset' ),
+                                                       $this->getMsg( 'userlogin-resetpassword-link' )->parse(),
+                                                       array( 'class' => 'mw-ui-flush-right' )
+                                               );
+                                       }
+                                       ?>
+                               </label>
+                               <?php
+                               $extraAttrs = array();
+                               // Set focus to this field if username is filled in.
+                               if ( $this->data['name'] ) {
+                                       $extraAttrs['autofocus'] = '';
+                               }
+                               echo Html::input( 'wpPassword', null, 'password', array(
+                                       'class' => 'loginPassword',
+                                       'id' => 'wpPassword1',
+                                       'tabindex' => '2',
+                                       'size' => '20',
+                                       'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text()
+                               ) + $extraAttrs );
+                               ?>
+                       </div>
+
                        <?php
-                       $extraAttrs = array();
-                       // Set focus to this field if its blank.
-                       if ( !$this->data['name'] ) {
-                               $extraAttrs['autofocus'] = '';
-                       }
-                       echo Html::input( 'wpName', $this->data['name'], 'text', array(
-                               'class' => 'loginText',
-                               'id' => 'wpName1',
-                               'tabindex' => '1',
-                               'size' => '20',
-                               // 'required' is blacklisted for now in Html.php due to browser issues.
-                               // Keeping here in case that changes
-                               'required',
-                               'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text()
-                       ) + $extraAttrs );
+                       if ( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
+                               $doms = "";
+                               foreach ( $this->data['domainnames'] as $dom ) {
+                                       $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+                               }
                        ?>
-               </div>
-               <div>
-                       <label for='wpPassword1'>
-                       <?php
-                       $this->msg( 'userlogin-yourpassword' );
+                               <div id="mw-user-domain-section">
+                                       <label for='wpDomain'><?php $this->msg( 'yourdomainname' ); ?></label>
+                                       <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>" tabindex="3">
+                                               <?php echo $doms; ?>
+                                       </select>
+                               </div>
+                       <?php } ?>
 
-                       if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
-                               echo ' ' . Linker::link(
-                                       SpecialPage::getTitleFor( 'PasswordReset' ),
-                                       $this->getMsg( 'userlogin-resetpassword-link' )->parse(),
-                                       array( 'class' => 'mw-ui-flush-right' )
-                                       );
-                       }
-                       ?>
-                       </label>
                        <?php
-                       $extraAttrs = array();
-                       // Set focus to this field if username is filled in.
-                       if ( $this->data['name'] ) {
-                               $extraAttrs['autofocus'] = '';
+                       if ( $this->haveData( 'extrafields' ) ) {
+                               echo $this->data['extrafields'];
                        }
-                       echo Html::input( 'wpPassword', null, 'password', array(
-                               'class' => 'loginPassword',
-                               'id' => 'wpPassword1',
-                               'tabindex' => '2',
-                               'size' => '20',
-                               'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text()
-                       ) + $extraAttrs );
                        ?>
-               </div>
-       <?php
-       if ( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
-               $doms = "";
-               foreach ( $this->data['domainnames'] as $dom ) {
-                       $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
-               }
-       ?>
-               <div id="mw-user-domain-section">
-                       <label for='wpDomain'><?php $this->msg( 'yourdomainname' ); ?></label>
-                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>"
-                                       tabindex="3">
-                                       <?php echo $doms ?>
-                               </select>
-               </div>
-       <?php }
 
-       if ( $this->haveData( 'extrafields' ) ) {
-               echo $this->data['extrafields'];
-       } ?>
-
-               <div>
+                       <div>
+                               <?php if ( $this->data['canremember'] ) { ?>
+                                       <label class="mw-ui-checkbox-label">
+                                               <input name="wpRemember" type="checkbox" value="1" id="wpRemember" tabindex="4"
+                                                       <?php if ( $this->data['remember'] ) {
+                                                               echo 'checked="checked"';
+                                                       } ?>
+                                               >
+                                               <?php echo $this->getMsg( 'userlogin-remembermypassword' )->numParams( $expirationDays )->escaped(); ?>
+                                       </label>
+                               <?php } ?>
+                       </div>
 
-       <?php if ( $this->data['canremember'] ) { ?>
-               <label class="mw-ui-checkbox-label">
-                       <input name="wpRemember" type="checkbox" value="1" id="wpRemember" tabindex="4"
-                               <?php if ( $this->data['remember'] ) {
-                                       echo 'checked="checked"';
-                               } ?>
-                       >
-                       <?php echo $this->getMsg( 'userlogin-remembermypassword' )->numParams( $expirationDays )->escaped(); ?>
-               </label>
-       <?php } ?>
-               </div>
+                       <div>
+                               <?php
+                               echo Html::input( 'wpLoginAttempt', $this->getMsg( 'login' )->text(), 'submit', array(
+                                       'id' => 'wpLoginAttempt',
+                                       'tabindex' => '6',
+                                       'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-primary'
+                               ) );
+                               ?>
+                       </div>
 
-               <div>
-                       <?php
-                       echo Html::input( 'wpLoginAttempt', $this->getMsg( 'login' )->text(), 'submit', array(
-                               'id' => 'wpLoginAttempt',
-                               'tabindex' => '6',
-                               'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-primary'
-                       ) );
-                       ?>
-               </div>
-               <div id="mw-userlogin-help">
-                       <?php echo $this->getMsg( 'userlogin-helplink' )->parse(); ?>
-               </div>
-               <?php if ( $this->haveData( 'createOrLoginHref' ) ) { ?>
-                       <div id="mw-createaccount-cta">
-                               <h3 id="mw-userloginlink"><?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button mw-ui-constructive"><?php $this->msg( 'userlogin-joinproject' ); ?></a></h3>
+                       <div id="mw-userlogin-help">
+                               <?php echo $this->getMsg( 'userlogin-helplink' )->parse(); ?>
                        </div>
-               <?php } ?>
-<?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-<?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
-<?php if ( $this->data['cansecurelogin'] ) {?><input type="hidden" name="wpForceHttps" value="<?php $this->text( 'stickhttps' ); ?>" /><?php } ?>
-</form>
-</div>
+                       <?php if ( $this->haveData( 'createOrLoginHref' ) ) { ?>
+                               <?php if ( $this->data['loggedin'] ) { ?>
+                                       <div id="mw-createaccount-another">
+                                               <h3 id="mw-userloginlink"><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button"><?php $this->msg( 'userlogin-createanother' ); ?></a></h3>
+                                       </div>
+                               <?php } else { ?>
+                                       <div id="mw-createaccount-cta">
+                                               <h3 id="mw-userloginlink"><?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button mw-ui-constructive"><?php $this->msg( 'userlogin-joinproject' ); ?></a></h3>
+                                       </div>
+                               <?php } ?>
+                       <?php } ?>
+                       <?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+                       <?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+                       <?php if ( $this->data['cansecurelogin'] ) {?><input type="hidden" name="wpForceHttps" value="<?php $this->text( 'stickhttps' ); ?>" /><?php } ?>
+               </form>
+       </div>
 </div>
 <?php
+
        }
 }
index 1a418c4..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}}',
@@ -313,7 +319,7 @@ $messages = array(
 'vector-simplesearch-preference' => 'Peuudep beunteueng mita biasa (kulet Vector khong)',
 'vector-view-create' => 'Peugöt',
 'vector-view-edit' => 'Andam',
-'vector-view-history' => 'Atra u likôt',
+'vector-view-history' => 'Eu riwayat',
 'vector-view-view' => 'Beuët',
 'vector-view-viewsource' => 'Eu nè',
 'actions' => 'Buët',
@@ -329,8 +335,8 @@ $messages = array(
 'searchbutton' => 'Mita',
 'go' => 'Jak u',
 'searcharticle' => 'Jak u',
-'history' => 'Atra u likot',
-'history_short' => 'Atra u likôt',
+'history' => 'Riwayat ôn',
+'history_short' => 'Riwayat',
 'updatedmarker' => 'geuubah yoh seunaweue keuneulheueh lon phon kon',
 'printableversion' => 'Seunalén rakam',
 'permalink' => 'Hubông teutap',
@@ -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',
@@ -356,7 +363,7 @@ $messages = array(
 'personaltools' => 'Peukakaih droë',
 'postcomment' => 'Beunagi baro',
 'articlepage' => 'Eu ôn asoë',
-'talk' => 'Peugah haba',
+'talk' => 'Marit',
 'views' => 'Ôn',
 'toolbox' => 'Plôk alat',
 'userpage' => 'Eu on ureueng nguy',
@@ -370,7 +377,7 @@ $messages = array(
 'otherlanguages' => 'Bahsa la’én',
 'redirectedfrom' => '(Geupeupinah nibak $1)',
 'redirectpagesub' => 'Ôn peuninah',
-'lastmodifiedat' => 'Ôn nyoë keuneulheuëh geu’ubah bak $2, $1.',
+'lastmodifiedat' => 'Ôn nyoë seuneulheuëh geuubah bak $2, $1.',
 'viewcount' => 'On nyoe ka geusaweue {{PLURAL:$1|sigo|$sigo}}.<br />',
 'protectedpage' => 'Ôn teupeulindông',
 'jumpto' => 'Lansông u:',
@@ -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,20 +572,20 @@ 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_tip' => 'Citak teubay',
+'bold_sample' => 'Rakam teubay',
+'bold_tip' => 'Haraih teubay',
 'italic_sample' => 'Rakam singèt naseukah nyoë',
 'italic_tip' => 'Rakam singèt',
 'link_sample' => 'Nan hubông',
 'link_tip' => 'Hubông dalam',
-'extlink_sample' => 'http://www.example.com nan neuhubông',
+'extlink_sample' => 'http://www.example.com nan hubông',
 'extlink_tip' => 'Hubông luwa (bèk tuwoë bôh http:// bak away)',
 'headline_sample' => 'Naseukah nan',
 'headline_tip' => 'Aneuk beunagi tingkat 1',
 'nowiki_sample' => 'Bèk format naseukah nyoë',
 'nowiki_tip' => 'Bèk seutot beuntuk wiki',
 'image_tip' => 'Pasoë beureukaih',
-'media_tip' => 'Hubông beureukah alat',
+'media_tip' => 'Hubông beureukaih',
 'sig_tip' => 'Tanda jaroë Droëneuh ngön tanda watèë',
 'hr_tip' => 'Garéh data',
 
@@ -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',
@@ -806,7 +818,7 @@ Ceunatat: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = ôn barô,
 # File description page
 'file-anchor-link' => 'Beureukaih',
 'filehist' => 'Riwayat beureukaih',
-'filehist-help' => 'Teugon bak uroë buleuën/watèë keu eu beureukaih nyoë ‘oh watèë nyan.',
+'filehist-help' => "Neuteugon bak uroë buleuën/watèë keu neu'eu beureukaih nyoë ‘oh watèë nyan.",
 'filehist-revert' => 'peuriwang',
 'filehist-current' => 'jinoë hat',
 'filehist-datetime' => 'Uroë buleuën/Watèë',
@@ -815,7 +827,7 @@ Ceunatat: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = ôn barô,
 'filehist-user' => 'Ureuëng nguy',
 'filehist-dimensions' => 'Dimènsi',
 'filehist-filesize' => 'Rayek beureukah',
-'filehist-comment' => 'Tapeusé',
+'filehist-comment' => "Seuneu'ôt",
 'imagelinks' => 'Neunguy beureukaih',
 'linkstoimage' => 'Ôn di yup nyoë na {{PLURAL:$1|hubông|$1 hubông}} u beureukah nyoë:',
 'nolinkstoimage' => 'Hana ôn nyang na hubông u beureukah nyoë.',
@@ -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.
@@ -1085,7 +1097,7 @@ Lam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugab
 'tooltip-pt-userpage' => 'Ôn ureuëng nguy Droëneuh',
 'tooltip-pt-mytalk' => 'Ôn marit Droëneuh',
 'tooltip-pt-preferences' => 'Atô',
-'tooltip-pt-watchlist' => 'Dapeuta ôn nyang lôn kalön',
+'tooltip-pt-watchlist' => 'Dapeuta ôn nyang lônkalön',
 'tooltip-pt-mycontris' => 'Dapeuta beuneuri Droëneuh',
 'tooltip-pt-login' => 'Droëneuh geupadan keu tamong log, bah pih nyan hana geupeuwajéb.',
 'tooltip-pt-logout' => 'Teubiët',
@@ -1094,7 +1106,7 @@ Lam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugab
 'tooltip-ca-addsection' => 'Puphôn beunagi barô',
 'tooltip-ca-viewsource' => 'Ôn nyoë geupeulindông.
 Droëneuh jeuët neu’eu nèjih.',
-'tooltip-ca-history' => 'Seunalén-seunalén sigohlomjih nibak ôn nyoë',
+'tooltip-ca-history' => 'Seunalén away nibak ôn nyoë',
 'tooltip-ca-protect' => 'Peulindông ôn nyoë',
 'tooltip-ca-delete' => 'Sampôh ôn nyoë',
 'tooltip-ca-move' => 'Peupinah ôn nyoë',
@@ -1103,16 +1115,16 @@ Droëneuh jeuët neu’eu nèjih.',
 'tooltip-search' => 'Mita {{SITENAME}}',
 'tooltip-search-go' => 'Mita saboh ôn ngon nan nyang peureuséh lagèë nyoë meunyo na',
 'tooltip-search-fulltext' => 'Mita ôn nyang na asoë lagèë nyoë',
-'tooltip-p-logo' => 'Saweuë Ã\94n Keuë',
-'tooltip-n-mainpage' => 'Jak u Ã\94n Keuë',
-'tooltip-n-mainpage-description' => 'Saweuë Ã\94n Keuë',
+'tooltip-p-logo' => 'Saweuë Ã´n keuë',
+'tooltip-n-mainpage' => 'Jak u Ã´n keuë',
+'tooltip-n-mainpage-description' => 'Saweuë Ã´n keuë',
 'tooltip-n-portal' => 'Bhaih buët, peuë nyang jeuët neupeulaku, pat tamita sipeuë hay',
 'tooltip-n-currentevents' => 'Mita haba barô',
 'tooltip-n-recentchanges' => 'Dapeuta neuubah baro lam wiki.',
 'tooltip-n-randompage' => 'Peuleumah ôn beurangkari',
 'tooltip-n-help' => 'Bak mita bantu.',
 'tooltip-t-whatlinkshere' => 'Dapeuta ban dum ôn wiki nyang na neuhubông u ôn nyoë',
-'tooltip-t-recentchangeslinked' => 'Neuubah barô ôn-ôn nyang na neuhubông u ôn nyoë',
+'tooltip-t-recentchangeslinked' => 'Neuubah barô ôn nyang na seuneumat u ôn nyoë',
 'tooltip-feed-rss' => 'Umpeuën RSS keu ôn nyoë',
 'tooltip-feed-atom' => 'Umpeuën Atom keu ôn nyoë',
 'tooltip-t-contributions' => 'Eu dapeuta nyang ka geutuléh lé ureuëng nguy nyoë',
@@ -1120,7 +1132,7 @@ Droëneuh jeuët neu’eu nèjih.',
 'tooltip-t-upload' => 'Peutamong beureukaih',
 'tooltip-t-specialpages' => 'Dapeuta ban dum ôn kusuih',
 'tooltip-t-print' => 'Seunalén rakam ôn nyoë',
-'tooltip-t-permalink' => 'Neuhubông teutap keu geunantoë ôn nyoë',
+'tooltip-t-permalink' => 'Hubông teutap keu geunantoë ôn nyoë',
 'tooltip-ca-nstab-main' => 'Eu ôn asoë',
 'tooltip-ca-nstab-user' => 'Eu ôn ureuëng nguy',
 'tooltip-ca-nstab-special' => 'Nyoë nakeuh ôn kusuih nyang h’an jeuët geu’andam.',
@@ -1131,7 +1143,7 @@ Droëneuh jeuët neu’eu nèjih.',
 'tooltip-ca-nstab-category' => 'Eu ôn kawan',
 'tooltip-minoredit' => 'Bôh tanda keu nyoë sibagoë andam bacut',
 'tooltip-save' => 'Keubah neuubah Droëneuh',
-'tooltip-preview' => 'Peuleumah neuubah Droëneuh, nguy nyoë sigohlom keubah!',
+'tooltip-preview' => 'Peuleumah neuubah Droëneuh, neunguy nyoë sigohlom neukeubah!',
 'tooltip-diff' => 'Peuleumah neuubah nyang ka Droëneuh peugöt',
 'tooltip-compareselectedversions' => 'Ngiëng bida antara duwa curak ôn nyang jipilèh.',
 'tooltip-watch' => 'Peutamah ôn nyoë u dapeuta keunalön Droëneuh',
index 06db089..10330ed 100644 (file)
@@ -264,7 +264,7 @@ $messages = array(
 'cancel' => 'Cancelar',
 'moredotdotdot' => 'Más...',
 'mypage' => 'A mía pachina',
-'mytalk' => 'Pachina de descusión',
+'mytalk' => 'Pachina de discusión',
 'anontalk' => "Pachina de descusión d'ista IP",
 'navigation' => 'Navego',
 'and' => '&#32;y',
@@ -731,8 +731,8 @@ Diferents usuarios pueden compartir una mesma adreza IP.
 Si vusté ye un usuario anonimo y creye que l'han escrito comentarios no relevants, [[Special:UserLogin/signup|creye una cuenta]] u [[Special:UserLogin/signup|identifique-se]] ta privar confusions futuras con atros usuarios anonimos.''",
 'noarticletext' => 'Por agora no bi ha garra texto en ista pachina. Puet [[Special:Search/{{PAGENAME}}|mirar o títol d\'ista pachina]] en atras pachinas, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mirar os rechistros relacionatos] u [{{fullurl:{{FULLPAGENAME}}|action=edit}} escribir ista pachina]</span>.',
 'noarticletext-nopermission' => 'Por l\'inte no i hai garra texto en ista pachina.
-Puet [[Special:Search/{{PAGENAME}}|mirar iste títol]] en atras páginas,
-u bien <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mirar en os rechistros relacionatos]</span>.',
+Puede [[Special:Search/{{PAGENAME}}|mirar iste titol]] en atras pachinas,
+u bien <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mirar en os rechistros relacionatos]</span>, pero no tien permiso ta creyar ista pachina.',
 'userpage-userdoesnotexist' => 'A cuenta d\'usuario "<nowiki>$1</nowiki>" no ye rechistrada. Piense si quiere creyar u editar ista pachina.',
 'userpage-userdoesnotexist-view' => 'A cuenta d\'usuario "$1" no ye rechistrada.',
 'blocked-notice-logextract' => "Ista cuenta d'usuario ye actualment bloqueyata.
@@ -755,7 +755,7 @@ A zaguera dentrada d'o rechistro de bloqueyos s'amuestra contino:",
 'userinvalidcssjstitle' => "'''Pare cuenta:''' No bi ha garra aparencia clamata \"\$1\". Remere que as pachinas presonalizatas .css y .js tienen un títol en minusclas, p.e. {{ns:user}}:Foo/vector.css en cuenta de {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Esviellato)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''Pare cuenta que isto no ye que l'anvista previa d'a pachina; os cambeos encara no s'ha alzato!'''",
+'previewnote' => "'''Pare cuenta que isto no ye que l'anvista previa.''' Os cambeos encara no s'ha alzato!",
 'previewconflict' => "L'anvista previa li amostrará l'aparencia d'o texto dimpués d'alzar os cambeos.",
 'session_fail_preview' => "'''Ya lo sentimos, pero no hemos puesto alzar a suya edición por una perda d'os datos de sesion. Por favor, prebe de fer-lo una atra vez, y si encara no funciona, [[Special:UserLogout|salga d'a sesión]] y torne a identificar-se.'''",
 'session_fail_preview_html' => "'''Ya lo sentimos, pero no s'ha puesto procesar a suya edición por haber-se trafegato os datos de sesión.'''
@@ -870,8 +870,8 @@ A razón indicada por $3 ye ''$2''",
 Leyenda: '''({{int:cur}})''' = esferencias con a versión actual, '''({{int:last}})''' = esferencias con a versión anterior, '''{{int:minoreditletter}}''' = edición menor",
 'history-fieldset-title' => 'Mirar en o historial',
 'history-show-deleted' => 'Nomás os borratos',
-'histfirst' => 'Primeras contrebucions',
-'histlast' => 'Zagueras',
+'histfirst' => 'primeras',
+'histlast' => 'zagueras',
 'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
 'historyempty' => '(buedo)',
 
@@ -1383,7 +1383,7 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
 'rc_categories_any' => 'Todas',
 'rc-change-size-new' => "$1 {{PLURAL:$1|byte|bytes}} dimpués d'o cambio",
 'newsectionsummary' => 'Nueva sección: /* $1 */',
-'rc-enhanced-expand' => 'Amostrar detalles (cal JavaScript)',
+'rc-enhanced-expand' => 'Amostrar detalles',
 'rc-enhanced-hide' => 'Amagar detalles',
 
 # Recent changes linked
@@ -2212,10 +2212,10 @@ $1",
 'blanknamespace' => '(Prencipal)',
 
 # Contributions
-'contributions' => "Contrebucions de l'usuario",
+'contributions' => "Contribucions de {{GENDER:$1|l'usuario|la usuaria}}",
 'contributions-title' => "Contribucions de l'usuario $1",
-'mycontris' => 'Contrebucions',
-'contribsub2' => 'De $1 ($2)',
+'mycontris' => 'Contribucions',
+'contribsub2' => 'Ta {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "No s'han trobato cambeos que concordasen con ixos criterios",
 'uctop' => '(zaguer cambeo)',
 'month' => 'Dende o mes (y anteriors):',
index 7aa3c73..3c723b7 100644 (file)
@@ -156,13 +156,13 @@ $messages = array(
 'pagecategories' => '{{PLURAL:$1|Flocc|Floccas}}',
 'category_header' => 'Trametas in "$1" flocce',
 'subcategories' => 'Underfloccas',
-'category-media-header' => 'Missenmiddel in flocce "$1"',
-'category-empty' => "''Þes flocc hæfþ nū nǣngu geƿritu oþþe missenmiddel.''",
+'category-media-header' => 'Missenmiddel in "$1" flocce',
+'category-empty' => "''Þes flocc hæfþ nū nǣngu gewritu oþþe missenmiddel.''",
 'hidden-categories' => '{{PLURAL:$1|Gehȳded flocc|$1 Gehȳdedra flocca}}',
 'hidden-category-category' => 'Gehȳdede floccas',
 'category-subcat-count' => '{{PLURAL:$2|Þes flocc hæfþ synderlīce þone folgiendan underflocc.|Þes flocc hæfþ {{PLURAL:$1|þone folgiendan underflocc|þā folgiendan $1 underflocca}} - þæt fulle rīm is $2.}}',
 'category-subcat-count-limited' => 'Þes flocc hæfþ {{PLURAL:$1|þisne underflocc|$1 þās underfloccas}}.',
-'category-article-count' => '{{PLURAL:$2|Þes flocc hæfþ synderlīce þone folgiendan ānne tramet.|{{PLURAL:$1|Se folgienda tramet is|Þā folgiendan $1 trametaa sind}} in þissum flocce - þæt fulle rīm is $2.}}',
+'category-article-count' => '{{PLURAL:$2|Þes flocc hæfþ synderlīce þone folgiendan tramet.|{{PLURAL:$1|Se folgienda tramet is|Þā folgiendan $1 trameta sind}} in þissum flocce - þæt fulle rīm is $2.}}',
 'category-article-count-limited' => '{{PLURAL:$1|Se folgienda tramet is|$1 Þā folgiendan trametas sind}} on þissum flocce hēr.',
 'category-file-count' => '{{PLURAL:$2|Þes flocc hæfþ synderlīce þā folgiendan ymelan.|{{PLURAL:$1|Sēo folgiende ymele is|Þā folgiendan $1 ymelena sind}} in þissum flocce - þæt fulle rīm is $2.}}',
 'category-file-count-limited' => '{{PLURAL:$1|Þēos ymele is|$1 Þās ymelan sind}} in þissum flocce hēr.',
@@ -171,7 +171,7 @@ $messages = array(
 'noindex-category' => 'Ungetǣcnede trametas',
 'broken-file-category' => 'Trametas þā habbaþ gebrocene hlencan mid ymelum',
 
-'about' => 'Gecȳþness',
+'about' => 'Cȳþþu',
 'article' => 'Innunge tramet',
 'newwindow' => '(openaþ in nīwum ēagþyrele)',
 'cancel' => 'Undōn',
@@ -194,7 +194,7 @@ $messages = array(
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-addsection' => 'Ēacnian mid mearcunge',
+'vector-action-addsection' => 'Besettan mearcunge',
 'vector-action-delete' => 'Forlēosan',
 'vector-action-move' => 'Wegan',
 'vector-action-protect' => 'Beorgan',
@@ -403,10 +403,10 @@ Cnāw þæt sume trametas mihten gīet wesan geīwde swā þū wǣre gīet inmel
 'notloggedin' => 'Nā ingemeldod',
 'userlogin-noaccount' => 'Слерде аккаунт јок по?',
 'userlogin-joinproject' => '{{SITENAME}} кирер',
-'nologin' => 'Слерде аккаунт јок по? $1.',
+'nologin' => 'Næfst þū reccinge? $1',
 'nologinlink' => 'Scieppan reccinge',
 'createaccount' => 'Scieppan reccinge',
-'gotaccount' => 'Белен аккаунт бар ба? $1.',
+'gotaccount' => 'Hafast þū reccinge ǣr? $1.',
 'gotaccountlink' => 'Inmeldian',
 'createaccountmail' => 'Notian sceortne tīman hlētlic þafungword and sendan hit to þǣm spearcǣrenda naman þe is niðer',
 'createaccountreason' => 'Racu:',
@@ -425,7 +425,7 @@ Stafena micelnessa sind hefiga and ānlica on brūcendnamum.
 Scēawa þīne wrītunge eft, oþþe [[Special:UserLogin/signup|sciepp nīwe reccinge]].',
 'nosuchusershort' => 'Þǣr nis nān brūcend mid þǣm naman "$1".  Scēawa þīne wrītunge.',
 'passwordtooshort' => 'Þafungword sculon habban læst {{PLURAL:$1|1 stafan|$1 stafena}}.',
-'mailmypassword' => 'Sendan nīwe þafungword on spearcǣrend',
+'mailmypassword' => 'Sendan nīwe þafungword on spearcǣrende',
 'acct_creation_throttle_hit' => 'Hwæt, þu hæfst gēo geseted {{PLURAL:$1|1 hordcleofan|$1 -}}. Þu ne canst settan ǣnige māran.',
 'accountcreated' => 'Scōp reccinge',
 'loginlanguagelabel' => 'Sprǣc: $1',
@@ -511,10 +511,10 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'nocreate-loggedin' => 'Þū ne hæfst þafunge to scieppenne nīwe trametas.',
 'permissionserrors' => 'Þafunga wōh',
 'permissionserrorstext-withaction' => 'Þū ne hæfst þafunge tō $2, for {{PLURAL:$1|þisre race|þissum racum}}:',
-'recreate-moveddeleted-warn' => "'''Warnung: Þu edsciepst tramet þe wæs ǣr āfeorsod.'''
+'recreate-moveddeleted-warn' => "'''Warnung: Þū edsciepst tramet þe wæs ǣr forloren.'''
 
-Þu sceoldest smēagan, hwæðer hit gerādlic sīe, forþ tō gānne mid ādihtunge þisses trametes.
-Þæt āfeorsungbred þisses trametes is hēr geīeht for behēfnesse:",
+Þu sceoldest smēagan, hwæðer hit gerādlīc sīe, forþ tō gānne mid þǣre adihtunge þisses trametes.
+Þæt forlēosunge and wegunge ealdhord þisses trametes is hēr geīeht for behēfnesse:",
 
 # History pages
 'viewpagelogs' => 'Sēon þisses trametes ealdhold',
@@ -528,8 +528,8 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'next' => 'nīehst',
 'last' => 'ǣr',
 'history-fieldset-title' => 'Sēcan stǣr',
-'histfirst' => 'Ǣrest',
-'histlast' => 'Nīwost',
+'histfirst' => 'ieldeste',
+'histlast' => 'nīwoste',
 'historyempty' => '(æmettig)',
 
 # Revision feed
@@ -627,7 +627,7 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'default' => 'gewunelic',
 'youremail' => 'Spearcǣrenda nama:',
 'username' => '{{GENDER:$1|Brūcendnama}}:',
-'yourrealname' => 'Þīn rihtnama*',
+'yourrealname' => 'Þīn sōða nama:',
 'yourlanguage' => 'Brūcendofermearces sprǣc',
 'yourvariant' => 'Sprǣce wendung:',
 'yourgender' => 'Gecynd:',
@@ -676,7 +676,7 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'recentchanges-label-newpage' => 'Þēos adihtung scōp nīwne tramet',
 'recentchanges-label-minor' => 'Þēos is lytel adihtung',
 'recentchanges-label-bot' => 'Searuþrǣl fremede þās adihtunge',
-'rcnote' => "Under {{PLURAL:$1|... '''1''' ...|sind þā æftemestan '''$1''' hweorfunga}} in {{PLURAL:$2|...|þǣm æftemestum '''$2''' dagum}}, . . $5, $4.",
+'rcnote' => "Beneoðan {{PLURAL:$1|is '''1''' andwendung|sind þā æftemestan '''$1''' andwendunga}} in {{PLURAL:$2|þǣm æftermestan dæge|þǣm æftemestum '''$2''' daga}}, fram $5 on $4.",
 'rcnotefrom' => "Niðer sind þā andwendunga fram '''$2''' (mǣst īweþ '''$1''').",
 'rclistfrom' => 'Īwan nīwa andwendunga fram $1 and siþþan',
 'rcshowhideminor' => '$1 lytela adihtunga',
@@ -693,7 +693,7 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'newpageletter' => 'N',
 'boteditletter' => 'þr',
 'rc_categories_any' => 'Ǣnig',
-'rc-enhanced-expand' => 'Īwan stafas (þearf JavaScript)',
+'rc-enhanced-expand' => 'Īwan stafas',
 'rc-enhanced-hide' => 'Hȳdan stafas',
 
 # Recent changes linked
@@ -816,8 +816,8 @@ Gif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūc
 'ancientpages' => 'Ieldestan trametas',
 'move' => 'Wegan',
 'movethispage' => 'Wegan þisne tramet',
-'pager-newer-n' => '{{PLURAL:$1|nīwran 1|nīwran $1}}',
-'pager-older-n' => '{{PLURAL:$1|ieldran 1|ieldran $1}}',
+'pager-newer-n' => '{{PLURAL:$1|nīwre 1|nīwran $1}}',
+'pager-older-n' => '{{PLURAL:$1|ieldre 1|ieldran $1}}',
 
 # Book sources
 'booksources' => 'Bōcfruman',
@@ -887,10 +887,10 @@ Gif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūc
 'watchthispage' => 'Behealdan þisne tramet',
 'unwatch' => 'Ablinnan behealdunge',
 'unwatchthispage' => 'Ablinnan behealdunge',
-'watchlist-details' => '{{PLURAL:$1|Þǣr is $1 tramet|Þǣr sind $1 trameta}} on þīnum behealdunggetæle, nā arīmedum mōtungum.',
+'watchlist-details' => '{{PLURAL:$1|Þǣr is $1 tramet|Þǣr sind $1 trameta}} on þīnum behealdunggetæle, nā arīmedum mōtunga trametum.',
 'watchlistcontains' => 'Þīn behealdungtæl hæfþ $1 {{PLURAL:$1|tramet|trameta}}.',
 'wlnote' => "Niðer {{PLURAL:$1|is sēo nīwoste andwendung|sind þā nīwostan '''$1''' andwendunga}} in {{PLURAL:$2|þǣre latostan tīde|þǣm latostan '''$2''' tīda}}, fram: $3, $4.",
-'wlshowlast' => 'Īwan þā latostan $1 tīda $2 daga $3',
+'wlshowlast' => 'Īwan þā nīwostan $1 tīda $2 daga $3',
 'watchlist-options' => 'Behealdungtæles cyras',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -971,16 +971,16 @@ Gif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūc
 
 # Contributions
 'contributions' => '{{GENDER:$1|Brūcendes}} forðunga',
-'contributions-title' => 'Brūcendforðunga for $1',
+'contributions-title' => 'Brūcendes forðunga for $1',
 'mycontris' => 'Mīna forðunga',
 'contribsub2' => 'For $1 ($2)',
-'uctop' => '(hēafod)',
-'month' => 'Fram mōnþe (and ǣror)',
-'year' => 'Fram ȝēare (and ǣror)',
+'uctop' => '(genge)',
+'month' => 'Fram mōnþe (and ǣr)',
+'year' => 'Fram iēare (and ǣr)',
 
 'sp-contributions-talk' => 'mōtung',
 'sp-contributions-search' => 'Sēcan forðunga',
-'sp-contributions-username' => 'IP address oþþe brūcendnama:',
+'sp-contributions-username' => 'IP nama oþþe brūcendes nama:',
 'sp-contributions-submit' => 'Sēcan',
 
 # What links here
@@ -1046,7 +1046,7 @@ Cēos ōðerne naman lā.',
 
 # Namespace 8 related
 'allmessagesname' => 'Nama',
-'allmessagesdefault' => 'Gewunelic ǣrendgewrites traht',
+'allmessagesdefault' => 'Gewunelīc ǣrendgewrites traht',
 'allmessagescurrent' => 'Þisses tīman ǣrendgewrites traht',
 'allmessages-filter-unmodified' => 'Nā andwended',
 'allmessages-filter-all' => 'Eall',
@@ -1139,7 +1139,7 @@ Cēos ōðerne naman lā.',
 'thumbsize' => 'Þumannæglmicelnes:',
 'file-info-size' => '$1 × $2 pixels, ymelan micelu: $3, MIME cynn: $4',
 'file-nohires' => 'Þǣr nis nǣnig māre micelness.',
-'svg-long-desc' => 'SVG ymele, rihte $1 × $2 pixels, ymelan micelness: $3',
+'svg-long-desc' => 'SVG ymele, rihte $1 × $2 pixela, ymelan micelness: $3',
 'show-big-image' => 'Full micelness',
 
 # Special:NewFiles
@@ -1268,8 +1268,8 @@ $5
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Sēon andwendunga',
-'watchlisttools-edit' => 'Sēon and adihtan behealdungtæle',
-'watchlisttools-raw' => 'Adihtan hrēaw behealdungtæle',
+'watchlisttools-edit' => 'Sēon and adihtan behealdungtæl',
+'watchlisttools-raw' => 'Adihtan hrēaw behealdungtæl',
 
 # Special:Version
 'version' => 'Fadung',
index d6a0d08..16cc385 100644 (file)
@@ -67,6 +67,7 @@
  * @author عصام بايزيدي
  * @author عمرو
  * @author محمد الجداوي
+ * @author مشعل الحربي
  * @author نصوح
  * @author وهراني
  */
@@ -937,6 +938,8 @@ $2',
 'userlogin-resetpassword-link' => 'صفّر كلمة سرّك',
 'helplogin-url' => 'Help:تسجيل الدخول',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|المساعدة في تسجيل الدخول]]',
+'userlogin-loggedin' => 'أنت {{GENDER:$1|مسجل|مسجلة}} الدخول مسبقًا باسم $1. {{GENDER:$1|استخدم|استخدمي}} النموذج بالأسفل لتسجيل الدخول بحساب آخر.',
+'userlogin-createanother' => 'إنشاء حساب آخر',
 'createacct-join' => 'قم بإدخال المعلومات الخاصة بك أدناه.',
 'createacct-another-join' => 'أدخل معلومات الحساب الجديد أدناه.',
 'createacct-emailrequired' => 'عنوان البريد الإلكتروني',
index 706bc2d..5d4a353 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Alnokta
  * @author Dudi
+ * @author Ebraminio
  * @author Ghaly
  * @author Meno25
  * @author Ouda
index 7b8e172..b2782db 100644 (file)
@@ -525,6 +525,9 @@ Nun t'escaezas de camudar les tos [[Special:Preferences|preferencies de {{SITENA
 'userlogin-resetpassword-link' => 'Reaniciar la contraseña',
 'helplogin-url' => 'Help:Aniciar sesión',
 'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Ayuda p'aniciar sesión]]",
+'userlogin-loggedin' => "Yá anició sesión como {{GENDER:$1|$1}}.
+Utilice'l formulariu de más abaxo p'aniciar sesión como otru usuariu.",
+'userlogin-createanother' => 'Crear otra cuenta',
 'createacct-join' => 'Escriba abaxo la so información.',
 'createacct-another-join' => 'Escriba abaxo la información de la cuenta nueva.',
 'createacct-emailrequired' => 'Direición de corréu electrónicu',
@@ -2288,10 +2291,12 @@ Mira en $2 la llista de les últimes páxines esborraes.',
 'deletecomment' => 'Motivu:',
 'deleteotherreason' => 'Motivu distintu/adicional:',
 'deletereasonotherlist' => 'Otru motivu',
-'deletereason-dropdown' => "*Motivos comunes d'esborráu
+'deletereason-dropdown' => "*Motivos comúnes d'esborráu
+** Puxarra
+** Vandalismu
+** Violación de drechos d'autor
 ** A pidimientu del autor
-** Violación de Copyright
-** Vandalismu",
+** Redireición frañada",
 'delete-edit-reasonlist' => "Editar los motivos d'esborráu",
 'delete-toobig' => "Esta páxina tien un historial d'ediciones grande, más de $1 {{PLURAL:$1|revisión|revisiones}}.
 Restrinxóse l'esborráu d'estes páxines pa evitar perturbaciones accidentales de {{SITENAME}}.",
@@ -2455,7 +2460,7 @@ $1",
 'contributions' => 'Collaboraciones {{GENDER:$1|del usuariu|de la usuaria}}',
 'contributions-title' => "Contribuciones d'usuariu pa $1",
 'mycontris' => 'Collaboraciones',
-'contribsub2' => 'Pa $1 ($2)',
+'contribsub2' => 'Pa {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "Nun s'atoparon cambeos que coincidan con esi criteriu.",
 'uctop' => '(actual)',
 'month' => "Dende'l mes (y anteriores):",
@@ -3817,7 +3822,10 @@ Tendría d'haber recibío [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Llic
 'tags-tag' => "Nome d'etiqueta",
 'tags-display-header' => 'Aspeutu nes llistes de cambios',
 'tags-description-header' => 'Descripción completa del significáu',
+'tags-active-header' => '¿Activu?',
 'tags-hitcount-header' => 'Cambios etiquetaos',
+'tags-active-yes' => 'Sí',
+'tags-active-no' => 'Non',
 'tags-edit' => 'editar',
 'tags-hitcount' => '$1 {{PLURAL:$1|cambiu|cambios}}',
 
index 6d25010..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',
@@ -2880,7 +2880,10 @@ Variants for Chinese language
 'tags-title' => 'Etiketlər',
 'tags-tag' => 'Etiket adı',
 'tags-description-header' => 'Anlamının tam açıqlaması',
+'tags-active-header' => 'Aktiv?',
 'tags-hitcount-header' => 'Etiketli dəyişikliklər',
+'tags-active-yes' => 'Bəli',
+'tags-active-no' => 'Xeyr',
 'tags-edit' => 'redaktə',
 'tags-hitcount' => '$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}}',
 
index 06c1e77..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 адрас',
@@ -1065,7 +1068,7 @@ $2
 'templatesusedsection' => 'У гэтай сэкцыі {{PLURAL:$1|выкарыстаны наступны шаблён|выкарыстаныя наступныя шаблёны}}:',
 'template-protected' => '(абаронены)',
 'template-semiprotected' => '(часткова абароненая)',
-'hiddencategories' => 'Гэтая старонка належыць да $1 {{PLURAL:$1|схаванай катэгорыі|схаваных катэгорыяў|схаваных катэгорыяў}}:',
+'hiddencategories' => 'Гэтая старонка належыць да $1 {{PLURAL:$1|схаванай катэгорыі|схаваных катэгорыяў}}:',
 'nocreatetext' => 'У {{GRAMMAR:месны|{{SITENAME}}}} абмежаванае стварэньне новых старонак.
 Вы можаце вярнуцца і рэдагаваць існуючую старонку, альбо [[Special:UserLogin|ўвайсьці ў сыстэму ці стварыць рахунак]].',
 'nocreate-loggedin' => 'Вы ня маеце дазволу на стварэньне новых старонак.',
@@ -2184,6 +2187,7 @@ $1',
 'listusers' => 'Сьпіс удзельнікаў і ўдзельніц',
 'listusers-editsonly' => 'Паказаць толькі ўдзельнікаў, якія маюць рэдагаваньні',
 'listusers-creationsort' => 'Адсартаваць па даце стварэньня',
+'listusers-desc' => 'Сартаваць па зьмяншэньні',
 'usereditcount' => '$1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}',
 'usercreated' => '{{GENDER:$3|Створаны|Створаная}} $1 у $2',
 'newpages' => 'Новыя старонкі',
@@ -2614,7 +2618,7 @@ $1',
 'contributions' => 'Унёсак {{GENDER:$1|удзельніка|удзельніцы}}',
 'contributions-title' => 'Унёсак {{GENDER:$1|удзельніка|удзельніцы}} $1',
 'mycontris' => 'Унёсак',
-'contribsub2' => 'Для $1 ($2)',
+'contribsub2' => 'Для {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ня знойдзена зьменаў, якія адпавядаюць гэтым крытэрыям.',
 'uctop' => '(апошняя)',
 'month' => 'Ад месяца (і раней):',
@@ -3965,7 +3969,10 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 '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|зьмена|зьмены|зьменаў}}',
 
index ad62950..d421698 100644 (file)
@@ -486,7 +486,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}}',
 'aboutpage' => 'Project:За {{SITENAME}}',
-'copyright' => 'Съдържанието е достъпно при условията на $1.',
+'copyright' => 'Ð\9eÑ\81вен Ð°ÐºÐ¾ Ð½Ðµ Ðµ Ð¿Ð¾Ñ\81оÑ\87ено Ð´Ñ\80Ñ\83го, Ñ\81ъдържанието е достъпно при условията на $1.',
 'copyrightpage' => '{{ns:project}}:Авторски права',
 'currentevents' => 'Текущи събития',
 'currentevents-url' => 'Project:Текущи събития',
@@ -570,6 +570,8 @@ $1',
 # General errors
 'error' => 'Грешка',
 'databaseerror' => 'Грешка при работа с базата от данни',
+'databaseerror-text' => 'Възникна грешка при заявката за базата данни.
+Това може да означава бъг в софтуера.',
 'databaseerror-query' => 'Заявка: $1',
 'databaseerror-function' => 'Функция: $1',
 'databaseerror-error' => 'Грешка: $1',
@@ -603,6 +605,7 @@ $1',
 'badarticleerror' => 'Действието не може да се изпълни върху страницата.',
 'cannotdelete' => 'Указаната страница или файл "$1" не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от някой друг.',
 'cannotdelete-title' => 'Страницата „$1“ не може да бъде изтрита',
+'no-null-revision' => 'Не може да бъде създадена празна версия на страницата „$1“',
 'badtitle' => 'Невалидно заглавие',
 'badtitletext' => 'Желаното заглавие на страница е невалидно, празно или неправилна препратка към друго уики. Възможно е да съдържа знаци, които не са позволени в заглавия.',
 'perfcached' => 'Следните данни са извлечени от склада и затова може да не отговарят на текущото състояние. В складираното копие {{PLURAL:$1|е допустим най-много един резултат|са допустими най-много $1 резултата}}.',
@@ -629,6 +632,7 @@ $2',
 'customjsprotected' => 'Нямате права за редактиране на тази Джаваскрипт страница, защото тя съдържа чужди потребителски настройки.',
 'mycustomcssprotected' => 'Нямате права за редактиране на тази CSS страница.',
 'mycustomjsprotected' => 'Нямате права за редактиране на тази JavaScript страница.',
+'mypreferencesprotected' => 'Нямате права да редактирате настройките си.',
 'ns-specialprotected' => 'Специалните страници не могат да бъдат редактирани.',
 'titleprotected' => "Тази страница е била защитена срещу създаване от [[User:$1|$1]].
 Посочената причина е ''$2''.",
@@ -686,6 +690,7 @@ $2',
 'userlogin-resetpassword-link' => 'Възстановяване на паролата',
 'helplogin-url' => 'Help:Влизане',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помощ за влизане]] в системата',
+'userlogin-createanother' => 'Създаване на друга сметка',
 'createacct-join' => 'Въведете своите данни по-долу.',
 'createacct-emailrequired' => 'Адрес за електронна поща',
 'createacct-emailoptional' => 'Адрес за електронна поща (незадължително)',
@@ -695,6 +700,7 @@ $2',
 'createacct-reason' => 'Причина',
 'createacct-imgcaptcha-ph' => 'Въведете текста, който виждате по-горе',
 'createacct-submit' => 'Създаване на сметката',
+'createacct-another-submit' => 'Създаване на друга сметка',
 'createacct-benefit-heading' => '{{SITENAME}} се създава от хора като вас.',
 'createacct-benefit-body1' => '{{PLURAL:$1|редакция|редакции}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|страница|страници}}',
@@ -702,6 +708,7 @@ $2',
 'userexists' => 'Въведеното потребителско име вече се използва.
 Изберете друго име.',
 'loginerror' => 'Грешка при влизане',
+'createacct-error' => 'Грешка при създаване на сметка',
 'createaccounterror' => 'Не може да бъде създадена сметка: $1',
 'nocookiesnew' => 'Потребителската сметка беше създадена, но все още не сте влезли. {{SITENAME}} използва бисквитки при влизането на потребителите. Разрешете бисквитките в браузъра си, тъй като те са забранени, а след това влезте с потребителското си име и парола.',
 'nocookieslogin' => '{{SITENAME}} използва бисквитки (cookies) за запис на влизанията. Разрешете бисквитките в браузъра си, тъй като те са забранени, и опитайте отново.',
@@ -781,9 +788,11 @@ $2',
 'resetpass-wrong-oldpass' => 'Невалидна временна или текуща парола.
 Възможно е вече успешно да сте сменили паролата си или да сте поискали нова временна парола.',
 'resetpass-temp-password' => 'Временна парола:',
+'resetpass-abort-generic' => 'Промяната на паролата беше прекъсната от използвано разширение.',
 
 # Special:PasswordReset
 'passwordreset' => 'Възстановяване на парола',
+'passwordreset-text-many' => '{{PLURAL:$1|За възстановяване на паролата е необходимо да се попълни едно от полетата.}}',
 'passwordreset-legend' => 'Възстановяване на парола',
 'passwordreset-disabled' => 'Възстановяването на паролата е изключено в това уики.',
 'passwordreset-username' => 'Потребителско име:',
@@ -1084,8 +1093,8 @@ $2
 <em>Легенда:</em> (<strong>тек</strong>) = разлика с текущата версия, (<strong>пред</strong>) = разлика с предишната версия, <strong>м</strong>&nbsp;=&nbsp;малка промяна',
 'history-fieldset-title' => 'Търсене в историята',
 'history-show-deleted' => 'Само изтритите',
-'histfirst' => 'Ð\9fÑ\8aÑ\80ви',
-'histlast' => 'Ð\9fоÑ\81ледни',
+'histfirst' => 'най-Ñ\81Ñ\82аÑ\80и',
+'histlast' => 'най-нови',
 'historysize' => '({{PLURAL:$1|1 байт|$1 байта}})',
 'historyempty' => '(празна)',
 
@@ -1391,9 +1400,9 @@ $1",
 'badsiglength' => 'Вашият подпис е твърде дълъг.
 Подписите не могат да надвишават $1 {{PLURAL:$1|знак|знака}}.',
 'yourgender' => 'Пол:',
-'gender-unknown' => 'Ð\9dе Ðµ Ð¿Ð¾Ñ\81оÑ\87ено',
-'gender-male' => 'Ð\9cÑ\8aж',
-'gender-female' => 'Ð\96ена',
+'gender-unknown' => 'Ð\9fÑ\80едпоÑ\87иÑ\82ам Ð´Ð° Ð½Ðµ Ð¿Ð¾Ñ\81оÑ\87а',
+'gender-male' => 'Той Ñ\80едакÑ\82иÑ\80а Ñ\83ики Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е',
+'gender-female' => 'ТÑ\8f Ñ\80едакÑ\82иÑ\80а Ñ\83ики Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е',
 'prefs-help-gender' => 'По желание: използва се за коректно обръщение по род в системните съобщения на софтуера. Тази информация е публично достъпна.',
 'email' => 'Е-поща',
 'prefs-help-realname' => '* <strong>Истинско име</strong> <em>(незадължително)</em>: Ако го посочите, на него ще бъдат приписани вашите приноси.',
@@ -1406,7 +1415,7 @@ $1",
 'prefs-signature' => 'Подпис',
 'prefs-dateformat' => 'Формат на датата',
 'prefs-timeoffset' => 'Часово отместване',
-'prefs-advancedediting' => 'РазÑ\88иÑ\80ени настройки',
+'prefs-advancedediting' => 'Ð\9eбÑ\89и настройки',
 'prefs-preview' => 'Преглед',
 'prefs-advancedrc' => 'Разширени настройки',
 'prefs-advancedrendering' => 'Разширени настройки',
@@ -1416,6 +1425,7 @@ $1",
 'prefs-displaysearchoptions' => 'Настройки на изгледа',
 'prefs-displaywatchlist' => 'Видими настройки',
 'prefs-diffs' => 'Разлики',
+'prefs-help-prefershttps' => 'Това предпочитание ще бъде активирано при следващото влизане.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Адресът за е-поща изглежда валиден',
@@ -2266,9 +2276,12 @@ $UNWATCHURL
 'deleteotherreason' => 'Друга/допълнителна причина:',
 'deletereasonotherlist' => 'Друга причина',
 'deletereason-dropdown' => '*Стандартни причини за изтриване
+** Спам
 ** По молба на автора
 ** Нарушение на авторски права
-** Вандализъм',
+** Вандализъм
+** По желание на автора
+** Грешно пренасочване',
 'delete-edit-reasonlist' => 'Редактиране на причините за изтриване',
 'delete-toobig' => 'Тази страница има голяма редакционна история с над $1 {{PLURAL:$1|версия|версии}}. Изтриването на такива страници е ограничено, за да се предотвратят евентуални поражения на {{SITENAME}}.',
 'delete-warning-toobig' => 'Тази страница има голяма редакционна история с над $1 {{PLURAL:$1|версия|версии}}. Възможно е изтриването да наруши някои операции в базата данни на {{SITENAME}}; необходимо е особено внимание при продължаване на действието.',
@@ -2418,7 +2431,7 @@ $1',
 'contributions' => '{{GENDER:$1|Потребителски}} приноси',
 'contributions-title' => 'Потребителски приноси за $1',
 'mycontris' => 'Приноси',
-'contribsub2' => 'За $1 ($2)',
+'contribsub2' => 'За {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Не са намерени промени, отговарящи на критерия.',
 'uctop' => '(текуща)',
 'month' => 'Месец:',
@@ -3662,6 +3675,8 @@ MediaWiki се разпространява с надеждата, че ще б
 'tags-display-header' => 'Изглед в списъците с промени',
 'tags-description-header' => 'Пълно описание на значението',
 'tags-hitcount-header' => 'Отбелязани промени',
+'tags-active-yes' => 'Да',
+'tags-active-no' => 'Не',
 'tags-edit' => 'редактиране',
 'tags-hitcount' => '$1 {{PLURAL:$1|промяна|промени}}',
 
@@ -3810,7 +3825,7 @@ $1 е автоматично повишен от $4 до $5',
 # Limit report
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунда|секунди}}',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунда|секунди}}',
-'limitreport-postexpandincludesize-value' => '$1/$2 байта',
-'limitreport-templateargumentsize-value' => '$1/$2 байта',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байта}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байта}}',
 
 );
index 0c6cd4c..66db1f2 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' => 'এই ব্যবহারকারী নামটি ইতমধ্যে ব্যবহার করা হয়েছে।
 অনুগ্রহ করে অন্য নাম বেছে নিন।',
@@ -1149,7 +1150,7 @@ $1",
 'searchprofile-images-tooltip' => 'ফাইলের জন্য অনুসন্ধান',
 'searchprofile-everything-tooltip' => 'সকল বিষয়বস্তু অনুসন্ধান করো (আলাপের পাতা সহ)',
 'searchprofile-advanced-tooltip' => 'স্বনির্ধারিত নামস্থানে অনুসন্ধান করো',
-'search-result-size' => '$1 ({{PLURAL:$2|1 শব্দ|$2 শব্দসমূহ}})',
+'search-result-size' => '$1 ({{PLURAL:$2|১টি শব্দ|$2টি শব্দ}})',
 'search-result-category-size' => '{{PLURAL: $1 | 1 সদস্য | $1 সদস্যবৃন্দ}} ({{PLURAL: $2 | 1 উপবিষয়শ্রেণীটি | $2 টি}}, {{PLURAL: $3 | 1 ফাইল | $3 ফাইল}})',
 'search-result-score' => 'মিলেছে: $1%',
 'search-redirect' => '(পুনর্নিদেশনা $1)',
@@ -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 6713409..1dd3e15 100644 (file)
@@ -1399,6 +1399,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'prefs-displaywatchlist' => 'Dibarzhioù diskwel',
 'prefs-tokenwatchlist' => 'Jedouer',
 'prefs-diffs' => "Diforc'hioù",
+'prefs-help-prefershttps' => "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => "Reizh eo ar chomlec'h postel war a seblant",
@@ -2516,7 +2517,7 @@ $1',
 'contributions' => 'Degasadennoù an {{GENDER:$1|implijer|implijerez}}',
 'contributions-title' => 'Degasadennoù an implijer evit $1',
 'mycontris' => 'Ma degasadennoù',
-'contribsub2' => 'Evit $1 ($2)',
+'contribsub2' => 'Evit {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "N'eus bet kavet kemm ebet o klotañ gant an dezverkoù-se.",
 'uctop' => '(red)',
 'month' => 'Abaoe miz (hag a-raok) :',
@@ -3872,7 +3873,10 @@ Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar
 'tags-tag' => 'Anv ar valizenn',
 'tags-display-header' => "Neuz e rolloù ar c'hemmoù",
 'tags-description-header' => 'Deskrivadur klok ar valizenn',
+'tags-active-header' => 'Oberiant ?',
 'tags-hitcount-header' => 'Kemmoù balizennet',
+'tags-active-yes' => 'Ya',
+'tags-active-no' => 'Ket',
 'tags-edit' => 'aozañ',
 'tags-hitcount' => '$1 {{PLURAL:$1|kemm|kemm}}',
 
index 58f90fc..a5d49ac 100644 (file)
@@ -723,7 +723,7 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} pode
 'userlogout' => 'Odjavi me',
 'notloggedin' => 'Niste prijavljeni',
 'userlogin-noaccount' => 'Nemate korisnički račun?',
-'userlogin-joinproject' => 'Pridružite se {{SITENAME}}',
+'userlogin-joinproject' => 'Pridružite se {{GRAMMAR:dativ|{{SITENAME}}}}',
 'nologin' => 'Nemate korisničko ime? $1.',
 'nologinlink' => 'Napravite nalog',
 'createaccount' => 'Napravi korisnički račun',
@@ -2468,7 +2468,7 @@ nastavite s oprezom.',
 Posljednja izmjena je bila od korisnika [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Sažetak izmjene je bio: \"''\$1''\".",
 'revertpage' => 'Vraćene izmjene [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu korisnika [[User:$1|$1]]',
-'revertpage-nouser' => 'Vraćene izmjene skrivenog korisnika na posljednju reviziju koju je načinio [[User:$1|$1]]',
+'revertpage-nouser' => 'Vraćene izmjene skrivenog korisnika na posljednju reviziju koju je {{GENDER:$1|načinio|načinila}} [[User:$1|$1]]',
 'rollback-success' => 'Poništene izmjene korisnika $1;
 vraćeno na posljednju verziju koju je sačuvao $2.',
 
@@ -4015,6 +4015,8 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'tags-display-header' => 'Vidljivost na spisku izmjena',
 'tags-description-header' => 'Puni opis značenja',
 'tags-hitcount-header' => 'Označene izmjene',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Ne',
 'tags-edit' => 'uređivanje',
 'tags-hitcount' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
 
@@ -4170,4 +4172,7 @@ Inače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan
 # Image rotation
 'rotate-comment' => 'Slika rotirana za $1 {{PLURAL:$1|stepen|stepeni}} u smjeru kazaljke na satu',
 
+# Limit report
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}',
+
 );
index 6add99e..ee209f9 100644 (file)
@@ -209,7 +209,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Amaga edicions patrullades als canvis recents',
 'tog-newpageshidepatrolled' => 'Amaga pàgines patrullades de la llista de pàgines noves',
 'tog-extendwatchlist' => 'Desplega la llista de seguiment per a mostrar tots els canvis afectats, no només els més recents',
-'tog-usenewrc' => 'Canvis de grup per pàgina en canvis recents i llista de seguiment (cal JavaScript)',
+'tog-usenewrc' => 'Agrupa els canvis per pàgina en canvis recents i llista de seguiment',
 'tog-numberheadings' => 'Enumera automàticament els encapçalaments',
 'tog-showtoolbar' => "Mostra la barra d'eines d'edició (cal JavaScript)",
 'tog-editondblclick' => 'Edita les pàgines amb un doble clic (cal JavaScript)',
@@ -658,6 +658,9 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
 'userlogin-resetpassword-link' => 'Reinicia la contrasenya',
 'helplogin-url' => 'Help:Registrar-se',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda]]',
+'userlogin-loggedin' => 'Heu iniciat una sessió com {{GENDER:$1|$1}}.
+Feu servir el formulari de sota per iniciar la sessió com un altre usuari.',
+'userlogin-createanother' => 'Crea un altre compte',
 'createacct-join' => 'Introduïu les vostres dades.',
 'createacct-another-join' => 'Introdueix la informació del nou compte a continuació:',
 'createacct-emailrequired' => 'Adreça de correu electrònic',
@@ -812,6 +815,9 @@ Contrasenya temporal: $2",
 
 # Special:ResetTokens
 'resettokens' => 'Reinicia els testimonis',
+'resettokens-text' => "Des d'aquí podeu reiniciar els testimonis que permeten l'accés a certes dades privades associades amb el vostre compte.
+
+Ho hauríeu de fer si accidentalment els heu compartit amb algú o si el vostre compte ha estat compromès.",
 'resettokens-no-tokens' => 'No hi ha testimonis per reiniciar.',
 'resettokens-legend' => 'Reinicia els testimonis',
 'resettokens-tokens' => 'Testimonis:',
@@ -1450,6 +1456,8 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'userrights-notallowed' => "No teniu autorització per concedir o retirar permisos d'usuari.",
 'userrights-changeable-col' => 'Grups que podeu canviar',
 'userrights-unchangeable-col' => 'Grups que no podeu canviar',
+'userrights-conflict' => "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
+'userrights-removed-self' => 'Heu suprimit els propis permisos correctament. Per tant, ja no podreu tornar a accedir a aquesta pàgina.',
 
 # Groups
 'group' => 'Grup:',
@@ -1516,11 +1524,17 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'right-unblockself' => 'Desblocar-se a si mateixos',
 'right-protect' => 'Canviar el nivell de protecció i modificar pàgines protegides',
 'right-editprotected' => 'Modificar pàgines protegides (sense protecció de cascada)',
+'right-editsemiprotected' => 'Edita les pàgines protegides com «{{int:protect-level-autoconfirmed}}»',
 'right-editinterface' => "Editar la interfície d'usuari",
 'right-editusercssjs' => "Editar els fitxers de configuració CSS i JS d'altres usuaris",
 'right-editusercss' => "Editar els fitxers de configuració CSS d'altres usuaris",
 'right-edituserjs' => "Editar els fitxers de configuració JS d'altres usuaris",
+'right-editmyusercss' => 'Editeu els fitxers CSS propis',
+'right-editmyuserjs' => 'Editeu els propis fitxers de JavaScript',
 'right-viewmywatchlist' => 'Mostra la llista de seguiment pròpia',
+'right-editmywatchlist' => 'Edita la llista de seguiment pròpia. Tingueu en compte que algunes accions encara afegiran pàgina fins i tot sense aquest permís.',
+'right-viewmyprivateinfo' => 'Mostra les dades privades (p. ex., adreça electrònica o nom real)',
+'right-editmyprivateinfo' => 'Modifica les dades privades  (p. ex., adreça electrònica o nom real)',
 'right-editmyoptions' => 'Edita les pròpies preferències',
 'right-rollback' => "Revertir ràpidament l'últim editor d'una pàgina particular",
 'right-markbotedits' => 'Marcar les reversions com a edicions de bot',
@@ -1573,8 +1587,8 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'action-block' => 'blocar aquest usuari per a què no pugui editar',
 'action-protect' => "canviar els nivells de protecció d'aquesta pàgina",
 'action-rollback' => "desfer ràpidament les modificacions de l'últim usuari que va editar una determinada pàgina",
-'action-import' => "importar aquesta pàgina des d'un altre wiki",
-'action-importupload' => "importar aquesta pàgina mitjançant la càrrega des d'un fitxer",
+'action-import' => "importa pàgines des d'un altre wiki",
+'action-importupload' => "importa pàgines mitjançant la càrrega d'un fitxer",
 'action-patrol' => 'marcar les edicions dels altres com a supervisades',
 'action-autopatrol' => 'marcar les vostres edicions com a supervisades',
 'action-unwatchedpages' => 'visualitzar la llista de pàgines no vigilades',
@@ -2011,6 +2025,8 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 'pageswithprop-text' => 'Aquesta pàgina llista les pàgines que utilitzen una propietat de pàgina en particular.',
 'pageswithprop-prop' => 'Nom de la propietat:',
 'pageswithprop-submit' => 'Vés',
+'pageswithprop-prophidden-long' => 'valor de propietat text llarg ocult ($1)',
+'pageswithprop-prophidden-binary' => 'valor de propietat binària oculta ($1)',
 
 'doubleredirects' => 'Redireccions dobles',
 'doubleredirectstext' => 'Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.
@@ -2068,6 +2084,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
 'mostrevisions' => 'Pàgines més modificades',
 'prefixindex' => 'Totes les pàgines per prefix',
 'prefixindex-namespace' => 'Totes les pàgines amb prefix (espai de noms $1)',
+'prefixindex-strip' => 'Suprimeix el prefix a la llista',
 'shortpages' => 'Pàgines curtes',
 'longpages' => 'Pàgines llargues',
 'deadendpages' => 'Pàgines atzucac',
@@ -2083,6 +2100,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
 'listusers' => "Llista d'usuaris",
 'listusers-editsonly' => 'Mostra només usuaris amb edicions',
 'listusers-creationsort' => 'Ordena per data de creació',
+'listusers-desc' => 'Ordena en ordre descendent',
 'usereditcount' => '$1 {{PLURAL:$1|modificació|modificacions}}',
 'usercreated' => '{{GENDER:$3|Creat}}: $1 a les $2',
 'newpages' => 'Pàgines noves',
@@ -2346,9 +2364,11 @@ Vegeu $2 per a un registre dels esborrats més recents.',
 'deleteotherreason' => 'Motiu diferent o addicional:',
 'deletereasonotherlist' => 'Altres motius',
 'deletereason-dropdown' => "*Motius freqüents d'esborrat
-** Demanada per l'autor
+** Brossa
+** Vandalisme
 ** Violació del copyright
-** Vandalisme",
+** Demanada per l'autor
+** Redirecció trencada",
 'delete-edit-reasonlist' => "Edita els motius d'eliminació",
 'delete-toobig' => "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. L'eliminació d'aquestes pàgines està restringida per a prevenir que hi pugui haver un desajustament seriós de la base de dades de tot el projecte {{SITENAME}} per accident.",
 'delete-warning-toobig' => "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. Eliminar-la podria suposar un seriós desajustament de la base de dades de tot el projecte {{SITENAME}}; aneu en compte abans dur a terme l'acció.",
@@ -2367,7 +2387,7 @@ de l'usuari [[User:$2|$2]] ([[User talk:$2|Discussió]]{{int:pipe-separator}}[[S
 La darrera modificació ha estat feta per l'usuari [[User:$3|$3]] ([[User talk:$3|Discussió]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
 'editcomment' => "El resum d'edició ha estat: «$1».",
 'revertpage' => "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]) a l'última versió de [[User:$1|$1]]",
-'revertpage-nouser' => "Les edicions realitzades per un usuari ocult s'han eliminat fins a l'última revisió de [[User:$1|$1]]",
+'revertpage-nouser' => "Edicions revertides per un usuari ocult a l'última revisió de {{GENDER:$1|[[User:$1|$1]]}}",
 'rollback-success' => "Edicions revertides de $1; s'ha canviat a la darrera versió de $2.",
 
 # Edit tokens
@@ -2507,7 +2527,7 @@ $1",
 'contributions' => "Contribucions de {{GENDER:$1|l'usuari|la usuària}}",
 'contributions-title' => "Contribucions de l'usuari $1",
 'mycontris' => 'Contribucions',
-'contribsub2' => 'Per $1 ($2)',
+'contribsub2' => 'Per a {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "No s'ha trobat canvis que encaixessin amb aquests criteris.",
 'uctop' => '(actual)',
 'month' => 'Mes (i anteriors):',
@@ -3791,6 +3811,7 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
 # Special:Redirect
 'redirect' => 'Redirigeix per fitxer, usuari o ID de la revisió',
 'redirect-legend' => 'Redirigeix a un fitxer o a una pàgina',
+'redirect-summary' => "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), una pàgina (donada un ID de la revisió), o a una pàgina d'usuari (donat un ID numèric d'usuari).",
 'redirect-submit' => 'Vés-hi',
 'redirect-lookup' => 'Consulta:',
 'redirect-value' => 'Valor:',
@@ -3853,7 +3874,9 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
 'tags-tag' => "Nom de l'etiqueta",
 'tags-display-header' => 'Aparença de la llista de canvis',
 'tags-description-header' => 'Descripció completa del significat',
+'tags-active-header' => 'Actiu?',
 'tags-hitcount-header' => 'Canvis etiquetats',
+'tags-active-yes' => 'Sí',
 'tags-edit' => 'modifica',
 'tags-hitcount' => '$1 {{PLURAL:$1|canvi|canvis}}',
 
@@ -4019,9 +4042,9 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 'limitreport-ppvisitednodes' => 'Nombre de nodes visitats pel preprocessador',
 'limitreport-ppgeneratednodes' => 'Nombre de nodes generats pel preprocessador',
 'limitreport-postexpandincludesize' => "Mida d'inclusió post-expansió",
-'limitreport-postexpandincludesize-value' => '$1/$2 bytes',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 'limitreport-templateargumentsize' => "Mida de l'argument de plantilla",
-'limitreport-templateargumentsize-value' => '$1/$2 bytes',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 'limitreport-expansiondepth' => "Profunditat màxima d'expansió",
 'limitreport-expensivefunctioncount' => "Número de funcions d'anàlisi dispendioses",
 
index 806ea86..80ae8e2 100644 (file)
@@ -1421,6 +1421,10 @@ PICT # тайп тайпан
 # Random page
 'randompage' => 'Цахууш нисйелла агӀо',
 
+# Random page in category
+'randomincategory' => 'Категори чу цахууш нийса елла агӀо',
+'randomincategory-selectcategory' => 'Категори чу цахууш нийса елла агӀона чу гӀо: $1 $2.',
+
 # Random redirect
 'randomredirect' => 'Цахууш нисделла дIасахьажор',
 
@@ -1521,13 +1525,13 @@ PICT # тайп тайпан
 'logempty' => 'Тептарш чохь хӀокху агӀона дӀаяздарш дац.',
 
 # Special:AllPages
-'allpages' => 'Массо агlонаш',
+'allpages' => 'Массо агӀонаш',
 'alphaindexline' => 'оцу $1 кху $2',
 'nextpage' => 'Тlаьхьа йогlу агlо ($1)',
 'prevpage' => 'Хьалхалера агlо ($1)',
 'allpagesfrom' => 'Гучé яха агlонаш, йуьлалуш йолу оцу:',
 'allpagesto' => 'Арайахар сацадé оцу:',
-'allarticles' => 'Массо агlонаш',
+'allarticles' => 'Массо агӀонаш',
 'allinnamespace' => 'Массо агlонаш оцу цlери анахь «$1»',
 'allpagesnext' => 'Тlаьхьайогlурш',
 'allpagessubmit' => 'Кхочушдé',
@@ -1702,6 +1706,7 @@ PICT # тайп тайпан
 # Restrictions (nouns)
 'restriction-edit' => 'Тадар',
 'restriction-move' => 'ЦӀе хийцар',
+'restriction-create' => 'Кхоллар',
 'restriction-upload' => 'Чуйолуш',
 
 # Restriction levels
@@ -1758,6 +1763,8 @@ PICT # тайп тайпан
 'sp-contributions-logs' => 'тéптарш',
 'sp-contributions-talk' => 'дийцаре',
 'sp-contributions-userrights' => 'декъашхочун бакъона урхалладар',
+'sp-contributions-blocked-notice-anon' => 'ХӀара IP-адрес хӀинца блоктоьхна ду.
+Лахахь гойту блоктохаршан тептар чура тӀаьхьарлера дӀаяздар:',
 'sp-contributions-search' => 'Къинхьегам лахар',
 'sp-contributions-username' => 'IP-адрес я декъашхочун цӀе:',
 'sp-contributions-toponly' => 'ТӀаьхьара бина хийцамаш гайта',
@@ -2000,9 +2007,9 @@ PICT # тайп тайпан
 'tooltip-search' => 'Лаха иза дош',
 'tooltip-search-go' => 'Билгала и санна цlе йолучу агlон чу дехьа вала',
 'tooltip-search-fulltext' => 'Лаха агlонаш ше чулацамехь хlара йоза долуш',
-'tooltip-p-logo' => 'Коьрта агIо',
-'tooltip-n-mainpage' => 'Ð\94еÑ\85Ñ\8cавалаÑ\80 ÐºÐ¾Ñ\8cÑ\80Ñ\82а Ð°Ð³lонÑ\87Ñ\83',
-'tooltip-n-mainpage-description' => 'Ð\94еÑ\85Ñ\8cавалаÑ\80 ÐºÐ¾Ñ\8cÑ\80Ñ\82а Ð°Ð³lонÑ\87Ñ\83',
+'tooltip-p-logo' => 'Коьрта агӀона дехьа гӀо',
+'tooltip-n-mainpage' => 'Ð\9aоÑ\8cÑ\80Ñ\82а Ð°Ð³Ó\80она Ð´ÐµÑ\85Ñ\8cа Ð³Ó\80о',
+'tooltip-n-mainpage-description' => 'Ð\9aоÑ\8cÑ\80Ñ\82а Ð°Ð³Ó\80она Ð´ÐµÑ\85Ñ\8cа Ð³Ó\80о',
 'tooltip-n-portal' => 'Оцу кхолламах, мичахь хlу йу лаьташ а хlудалур ду шуьга',
 'tooltip-n-currentevents' => 'Дlаоьхуш болу хаамашна могlам',
 'tooltip-n-recentchanges' => 'Тlаьххьаралера хийцаман могlам',
@@ -2336,6 +2343,7 @@ PICT # тайп тайпан
 'dberr-outofdate' => 'Хьуна хаалахь, цуьна йолу меттиг хила мега тишйелла черахь.',
 
 # HTML forms
+'htmlform-invalid-input' => 'Ахьа яздинчу цхьан дакхано гӀалат далина',
 'htmlform-submit' => 'ДӀадахьийта',
 'htmlform-reset' => 'Цаоьшу хийцамаш',
 'htmlform-selectorother-other' => 'Кхин',
@@ -2359,4 +2367,17 @@ PICT # тайп тайпан
 # Search suggestions
 'searchsuggest-search' => 'Лаха',
 
+# Limit report
+'limitreport-title' => 'АгӀона хӀоттам къасторан хаамаш:',
+'limitreport-cputime' => 'Процессоран хан лелор',
+'limitreport-walltime' => 'Йодуш йолу хенахь лелор',
+'limitreport-ppvisitednodes' => 'Препроцессор хьаьжна шадин дукхалла',
+'limitreport-ppgeneratednodes' => 'Препроцессорс сгенерировать бина шадин дукхалла',
+'limitreport-postexpandincludesize' => 'Схьаяьстина юккъерчаран барам',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байташ}}',
+'limitreport-templateargumentsize' => 'Кепан аргументан барам',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байташ}}',
+'limitreport-expansiondepth' => 'Шордаларан уггар йокха кӀоргалла',
+'limitreport-expensivefunctioncount' => 'АгӀона хӀоттам къасторан «еза» функцеш',
+
 );
index 57574a9..3090f3f 100644 (file)
@@ -2436,7 +2436,7 @@ $1',
 'blocklog-showlog' => 'ئەم بەکارھێنەرە پێشتر بربەست کراوە.
 لۆگی بەربەستن لە ژێرەوە ھاتووە:',
 'blocklogentry' => '[[$1]]ی بۆ ماوەی $2 بەربەست کرد $3',
-'reblock-logentry' => 'دÛ\86Ø®Û\8c Ø¦Ø§Ø³ØªÛ\95Ù\86Ú¯ Ú©Ø±Ø¯Ù\86Û\8c [[$1]]  Ø¨Û\86 گۆڕدرا بۆ ماوەی $2 $3',
+'reblock-logentry' => 'دÛ\86Ø®Û\8c Ø¨Û\95ربÛ\95ستÙ\86Û\8c [[$1]]  گۆڕدرا بۆ ماوەی $2 $3',
 'blocklogtext' => 'ئەمە لۆگێکی کردەوەکانی بەربەستن یان لابردنی بەربەستنی بەکارھێنەرە.
 ئەو ئایپی ئەدرەسانە خۆکارانە بەربستکراون بە ڕیز نەکراون.
 سەیری [[Special:BlockList|لیستی بەربەستن]] بکە بۆ بینینی ئەو بەرگری و بەربەستنانە ئێستا لە بەرکاردان.',
index 4b6034c..81ba616 100644 (file)
@@ -819,6 +819,9 @@ Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SI
 'userlogin-resetpassword-link' => 'Obnovit heslo',
 'helplogin-url' => 'Help:Přihlášení',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Nápověda k přihlašování]]',
+'userlogin-loggedin' => 'Již jste {{GENDER:$1|přihlášen|přihlášena}} jako $1.
+Pomocí formuláře níže se můžete přihlásit jako jiný uživatel.',
+'userlogin-createanother' => 'Vytvořit jiný účet',
 'createacct-join' => 'Níže zadejte své údaje.',
 'createacct-another-join' => 'Níže zadejte údaje nového účtu.',
 'createacct-emailrequired' => 'E-mailová adresa',
@@ -1602,14 +1605,14 @@ Vaše adresa v takovém případě není prozrazena.',
 'userrights-lookup-user' => 'Spravovat uživatelské skupiny',
 'userrights-user-editname' => 'Zadejte uživatelské jméno:',
 'editusergroup' => 'Upravit uživatelské skupiny',
-'editinguser' => "Úprava práv uživatele '''[[User:$1|$1]]''' $2",
+'editinguser' => "Úprava práv {{GENDER:$1|uživatele|uživatelky}} '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Upravit uživatelské skupiny',
 'saveusergroups' => 'Uložit uživatelské skupiny',
-'userrights-groupsmember' => 'Člen skupin:',
-'userrights-groupsmember-auto' => 'Automaticky člen skupin:',
-'userrights-groups-help' => 'Můžete měnit skupiny, do nichž je uživatel zařazen.
-* Zaškrtnuté políčko znamená, že uživatel je v dané skupině.
-* Nezaškrtnuté políčko značí, že uživatel v dané skupině není.
+'userrights-groupsmember' => '{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupin}}:',
+'userrights-groupsmember-auto' => 'Automaticky {{GENDER:$2|člen|členka}} {{PLURAL:$1|skupiny|skupin}}:',
+'userrights-groups-help' => 'Můžete měnit skupiny, do nichž je {{GENDER:$1|uživatel zařazen|uživatelka zařazena}}.
+* Zaškrtnuté políčko znamená, že {{GENDER:$1|uživatel|uživatelka}} je v dané skupině.
+* Nezaškrtnuté políčko značí, že {{GENDER:$1|uživatel|uživatelka}} v dané skupině není.
 * Hvězdička (*) znamená, že nemůžete danou skupinu odstranit, jakmile ji přidáte, nebo naopak.',
 'userrights-reason' => 'Důvod:',
 'userrights-no-interwiki' => 'Nemáte povoleno měnit uživatelská práva na jiných wiki.',
@@ -2539,10 +2542,12 @@ Rady a kontakt:
 'deletecomment' => 'Důvod:',
 'deleteotherreason' => 'Jiný/další důvod:',
 'deletereasonotherlist' => 'Jiný důvod',
-'deletereason-dropdown' => '*Obvyklé důvody smazání
-** Na žádost autora
+'deletereason-dropdown' => '* Obvyklé důvody smazání
+** Spam
+** Vandalismus
 ** Porušení autorských práv
-** Vandalismus',
+** Na žádost autora
+** Rozbité přesměrování',
 'delete-edit-reasonlist' => 'Editovat důvody smazání',
 'delete-toobig' => 'Tato stránka má velkou historii editací, přes $1 {{plural:$1|verzi|verze|verzí}}. Mazání takových stránek je omezeno, aby se předešlo nechtěnému narušení {{grammar:2sg|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Tato stránka má velkou historii editací, přes $1 {{plural:$1|verzi|verze|verzí}}. Mazání takových stránek může narušit databázové operace {{grammar:2sg|{{SITENAME}}}}; postupujte opatrně.',
@@ -2697,7 +2702,7 @@ $1',
 'contributions' => 'Příspěvky {{GENDER:$1|uživatele|uživatelky}}',
 'contributions-title' => 'Příspěvky uživatele $1',
 'mycontris' => 'Příspěvky',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|uživatele|uživatelky}} $1 ($2)',
 'nocontribs' => 'Nenalezeny žádné změny vyhovující kritériím.',
 'uctop' => '(aktuální)',
 'month' => 'Do měsíce:',
@@ -4102,7 +4107,10 @@ MediaWiki je distribuována v naději, že bude užitečná, avšak BEZ JAKÉKOL
 'tags-tag' => 'Název značky',
 'tags-display-header' => 'Zobrazení na seznamech změn',
 'tags-description-header' => 'Úplný popis významu',
+'tags-active-header' => 'Aktivní?',
 'tags-hitcount-header' => 'Označené změny',
+'tags-active-yes' => 'Ano',
+'tags-active-no' => 'Ne',
 'tags-edit' => 'editovat',
 'tags-hitcount' => '$1 {{PLURAL:$1|změna|změny|změn}}',
 
index a6572a6..e9c7e05 100644 (file)
@@ -814,7 +814,7 @@ $messages = array(
 'blocklink' => 'ꙁагради',
 'contribslink' => 'добродѣꙗниꙗ',
 'blocklogpage' => 'ꙁаграждєниꙗ їсторїꙗ',
-'blocklogentry' => 'ꙁаградихъ [[$1]] на врѣмѧ $2 $3',
+'blocklogentry' => 'ꙁаградилъ [[$1]] на врѣмѧ $2 $3',
 'block-log-flags-anononly' => 'тъкъмо анѡнѷмьнꙑ польꙃєватєлє',
 
 # Move page
index 4ac7606..5ffe6a2 100644 (file)
@@ -572,6 +572,9 @@ Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddec
 'userlogin-resetpassword-link' => 'Ailosod eich cyfrinair',
 'helplogin-url' => 'Help:Mewngofnodi',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Cymorth i fewngofnodi]]',
+'userlogin-loggedin' => 'Rydych eisoes wedi mewngofnodi wrth yr enw {{GENDER:$1|$1}}.
+Defnyddiwch y ffurflen isod i fewngofnodi wrth rhyw enw arall.',
+'userlogin-createanother' => 'Creu cyfrif ychwanegol',
 'createacct-join' => 'Rhowch eich manylion isod',
 'createacct-another-join' => 'Rhowch fanylion y cyfrif newydd isod.',
 'createacct-emailrequired' => 'Cyfeiriad ebost',
@@ -2285,9 +2288,11 @@ Gwelwch y $2 am gofnod o\'r dileuon diweddar.',
 'deleteotherreason' => 'Rheswm arall:',
 'deletereasonotherlist' => 'Rheswm arall',
 'deletereason-dropdown' => "*Rhesymau arferol dros ddileu
-** Ar gais yr awdur
+** Sbam
+** Fandaliaeth
 ** Torri'r hawlfraint
-** Fandaliaeth",
+** Ar gais yr awdur
+** Ailgyfeiriad wedi torri",
 'delete-edit-reasonlist' => 'Golygu rhestr y rhesymau dros ddileu',
 'delete-toobig' => "Cafwyd dros $1 {{PLURAL:$1|o olygiadau}} i'r dudalen hon.
 Cyfyngwyd ar y gallu i ddileu tudalennau sydd wedi eu golygu cymaint â hyn, er mwyn osgoi amharu ar weithrediad databas {{SITENAME}} yn ddamweiniol.",
@@ -2448,7 +2453,7 @@ $1',
 'contributions' => "{{GENDER:$1|Cyfraniadau'r defnyddiwr}}",
 'contributions-title' => "Cyfraniadau'r defnyddiwr am $1",
 'mycontris' => 'Cyfraniadau',
-'contribsub2' => 'Dros $1 ($2)',
+'contribsub2' => 'Gan {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "Heb ddod o hyd i newidiadau gyda'r meini prawf hyn.",
 'uctop' => '(cyfredol)',
 'month' => 'Cyfraniadau hyd at fis (ac yn gynharach):',
@@ -2929,6 +2934,7 @@ Mae ffolder dros dro yn eisiau.',
 Gellir ychwanegu rheswm dros y dadwneud yn y crynodeb.',
 'tooltip-preferences-save' => 'Rhodder y dewisiadau ar gadw',
 'tooltip-summary' => 'Rhowch grynodeb byr',
+'tooltip-iwiki' => '$1 - $2',
 
 # Metadata
 'notacceptable' => "Dydy gweinydd y wici ddim yn medru rhoi'r data mewn fformat darllenadwy i'ch cleient.",
@@ -3774,7 +3780,10 @@ Dylech fod wedi derbyn [{{SERVER}}{{SCRIPTPATH}}/COPYING gopi o GNU General Publ
 'tags-tag' => "Enw'r tag",
 'tags-display-header' => 'Y nodyn a welir ar logiau',
 'tags-description-header' => 'Disgrifiad llawn y tag',
+'tags-active-header' => 'Yn weithredol?',
 'tags-hitcount-header' => 'Nifer wedi tagio',
+'tags-active-yes' => 'Ydy',
+'tags-active-no' => 'Nacydy',
 'tags-edit' => 'golygu',
 'tags-hitcount' => '$1 {{PLURAL:$1|newid}}',
 
index 54e7628..04e3d8e 100644 (file)
@@ -200,12 +200,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Skjul patruljerede redigeringer i seneste ændringer',
 'tog-newpageshidepatrolled' => 'Skjul patruljerede sider på listen over nye sider',
 'tog-extendwatchlist' => 'Udvid overvågningslisten til at vise alle ændringer og ikke kun den nyeste',
-'tog-usenewrc' => 'Gruppér ændringerne per side i listen over seneste ændringer og overvågningslisten (kræver JavaScript)',
+'tog-usenewrc' => 'Gruppér ændringerne per side i listen over seneste ændringer og i overvågningslisten',
 'tog-numberheadings' => 'Automatisk nummerering af overskrifter',
-'tog-showtoolbar' => 'Vis værktøjslinje til redigering (JavaScript)',
-'tog-editondblclick' => 'Redigér sider med dobbeltklik (JavaScript)',
+'tog-showtoolbar' => 'Vis værktøjslinje til redigering',
+'tog-editondblclick' => 'Redigér sider med dobbeltklik',
 'tog-editsection' => 'Redigér afsnit ved hjælp af [redigér]-henvisninger',
-'tog-editsectiononrightclick' => 'Redigér afsnit ved at højreklikke på deres titler (JavaScript)',
+'tog-editsectiononrightclick' => 'Redigér afsnit ved at højreklikke på deres titler',
 'tog-showtoc' => 'Vis indholdsfortegnelse (på sider med mere end tre afsnit)',
 'tog-rememberpassword' => 'Husk mit login i denne browser (højst $1 {{PLURAL:$1|dag|dage}})',
 'tog-watchcreations' => 'Tilføj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste',
@@ -223,7 +223,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Vis antal brugere, der overvåger',
 'tog-oldsig' => 'Nuværende signatur:',
 'tog-fancysig' => 'Behandl signatur som wikitekst uden automatisk henvisning',
-'tog-uselivepreview' => 'Brug automatisk forhåndsvisning (kræver JavaScript og er på forsøgsstadiet)',
+'tog-uselivepreview' => 'Brug automatisk forhåndsvisning (er på forsøgsstadiet)',
 'tog-forceeditsummary' => 'Advar mig hvis jeg ikke udfylder beskrivelsesfeltet',
 'tog-watchlisthideown' => 'Skjul egne ændringer i overvågningslisten',
 'tog-watchlisthidebots' => 'Skjul ændringer fra bots i overvågningslisten',
@@ -338,7 +338,7 @@ $messages = array(
 'newwindow' => '(åbner i et nyt vindue)',
 'cancel' => 'Afbryd',
 'moredotdotdot' => 'Mere...',
-'morenotlisted' => 'Mere ikke angivet...',
+'morenotlisted' => 'Denne liste er ikke komplet.',
 'mypage' => 'Side',
 'mytalk' => 'Diskussion',
 'anontalk' => 'Diskussionsside for denne IP-adresse',
@@ -441,7 +441,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' => 'Om {{SITENAME}}',
 'aboutpage' => 'Project:Om',
-'copyright' => 'Indholdet er udgivet under $1.',
+'copyright' => 'Indholdet er udgivet under $1 medmindre andet er angivet.',
 'copyrightpage' => '{{ns:project}}:Ophavsret',
 'currentevents' => 'Aktuelle begivenheder',
 'currentevents-url' => 'Project:Aktuelle begivenheder',
@@ -476,7 +476,7 @@ $1',
 'youhavenewmessagesmulti' => 'Du har nye beskeder på $1',
 'editsection' => 'redigér',
 'editold' => 'redigér',
-'viewsourceold' => 'vis kildekode',
+'viewsourceold' => 'vis wikikode',
 'editlink' => 'redigér',
 'viewsourcelink' => 'vis kildetekst',
 'editsectionhint' => 'Rediger afsnit: $1',
@@ -523,6 +523,12 @@ En liste over gyldige specialsider findes på [[Special:SpecialPages|{{int:speci
 # General errors
 'error' => 'Fejl',
 'databaseerror' => 'Databasefejl',
+'databaseerror-text' => 'Der opstod fejl i en forespørgsel til databasen.
+Dette kan indikere en fejl i softwaren.',
+'databaseerror-textcl' => 'Der opstod fejl i en forespørgsel til databasen.',
+'databaseerror-query' => 'Forespørgsel: $1',
+'databaseerror-function' => 'Funktion: $1',
+'databaseerror-error' => 'Fejl: $1',
 'laggedslavemode' => "'''Bemærk:''' Den viste side indeholder muligvis ikke de nyeste ændringer.",
 'readonly' => 'Databasen er skrivebeskyttet',
 'enterlockreason' => 'Skriv en begrundelse for skrivebeskyttelsen, med samt en vurdering af, hvornår skrivebeskyttelsen ophæves igen',
@@ -644,6 +650,9 @@ Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].',
 'userlogin-resetpassword-link' => 'Nulstil din adgangskode',
 'helplogin-url' => 'Help:Logge på',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjælp til at logge på]]',
+'userlogin-loggedin' => 'Du er allerede logget på som {{GENDER:$1|$1}}.
+Brug formularen nedenfor til at logge på som en anden bruger.',
+'userlogin-createanother' => 'Opret en anden konto',
 'createacct-join' => 'Indtast dine oplysninger nedenfor.',
 'createacct-another-join' => 'Angiv den nye kontos oplysninger nedenfor.',
 'createacct-emailrequired' => 'Mailadresse',
@@ -730,6 +739,8 @@ Vent venligst $1, før du prøver igen.',
 'login-abort-generic' => 'Det lykkedes dig ikke at logge på - afbrudt',
 'loginlanguagelabel' => 'Sprog: $1',
 'suspicious-userlogout' => 'Din anmodning om at logge ud blev nægtet, fordi det ser ud som den blev sendt af en ødelagt browser eller caching proxy.',
+'createacct-another-realname-tip' => 'Angivelse af rigtigt navn er valgfrit.
+Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit arbejde.',
 
 # Email sending
 'php-mail-error-unknown' => "Ukendt fejl i PHP's mail()-funtion",
@@ -799,7 +810,17 @@ Midlertidig adgangskode: $2',
 'changeemail-cancel' => 'Afbryd',
 
 # Special:ResetTokens
+'resettokens' => 'Nulstil nøgler',
+'resettokens-text' => 'Du kan nulstille nøgler, som giver adgang til visse private data i forbindelse med din konto her.
+
+Du bør gøre det, hvis du ved et uheld deler dem med nogen, eller hvis din konto er blevet kompromitteret.',
+'resettokens-no-tokens' => 'Der er ingen nøgler at nulstille.',
+'resettokens-legend' => 'Nulstil nøgler',
+'resettokens-tokens' => 'Nøgler:',
 'resettokens-token-label' => '$1(aktuel værdi: $2)',
+'resettokens-watchlist-token' => 'Nøgle for web-feed (Atom/RSS) af [[Special:Watchlist|ændringer af sider på din overvågningsliste]]',
+'resettokens-done' => 'Nøgler er nulstillet.',
+'resettokens-resetbutton' => 'Nulstil valgte nøgler',
 
 # Edit page toolbar
 'bold_sample' => 'Fed tekst',
@@ -1316,7 +1337,7 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
 'prefs-rendering' => 'Udseende',
 'saveprefs' => 'Gem indstillinger',
 'resetprefs' => 'Gendan indstillinger',
-'restoreprefs' => 'Gendan alle standardindstillinger',
+'restoreprefs' => 'Gendan alle standardindstillinger (i alle sektioner)',
 'prefs-editing' => 'Redigering',
 'rows' => 'Rækker',
 'columns' => 'Kolonner',
@@ -1404,6 +1425,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'prefs-displaywatchlist' => 'Visningsmuligheder',
 'prefs-tokenwatchlist' => 'Mærke',
 'prefs-diffs' => 'Forskelle',
+'prefs-help-prefershttps' => 'Denne indstilling træder i kraft næste gang du logger på.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mailadressen ser ud til at være gyldig',
@@ -1562,8 +1584,8 @@ Vær venlig at gennemse og bekræft dine ændringer.',
 'action-block' => 'blokere denne bruger fra at redigere',
 'action-protect' => 'ændre på beskyttelsen af denne side',
 'action-rollback' => 'hurtigt gendanne alle redigeringerne foretaget af den bruger, som senest redigerede en bestemt side,',
-'action-import' => 'importere denne side fra en anden wiki',
-'action-importupload' => 'importere denne side fra en filoplægning',
+'action-import' => 'importere sider fra en anden wiki',
+'action-importupload' => 'importere sider fra en filoplægning',
 'action-patrol' => 'patruljere andres redigeringer',
 'action-autopatrol' => 'patruljere din redigering',
 'action-unwatchedpages' => 'se listen over uovervågede sider',
@@ -1579,6 +1601,8 @@ Vær venlig at gennemse og bekræft dine ændringer.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ændring|ændringer}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|siden sidste besøg}}',
+'enhancedrc-history' => 'historik',
 'recentchanges' => 'Seneste ændringer',
 'recentchanges-legend' => 'Indstillinger for seneste ændringer',
 'recentchanges-summary' => "På denne side kan du følge de seneste ændringer på '''{{SITENAME}}'''.",
@@ -1870,8 +1894,7 @@ For optimal sikkerhed er img_auth.php deaktiveret.",
 'upload_source_file' => ' (en fil på din computer)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Denne specialside viser alle oplagte filer.
-Når der filtreres efter bruger, vil kun filer, hvor den pågældende bruger lagde den seneste version af filen op, blive vist.',
+'listfiles-summary' => 'Denne specialside viser alle oplagte filer.',
 'listfiles_search_for' => 'Søge efter fil:',
 'imgfile' => 'Fil',
 'listfiles' => 'Filliste',
@@ -1882,6 +1905,10 @@ Når der filtreres efter bruger, vil kun filer, hvor den pågældende bruger lag
 'listfiles_size' => 'Størrelse (Byte)',
 'listfiles_description' => 'Beskrivelse',
 'listfiles_count' => 'Versioner',
+'listfiles-show-all' => 'Vis også gamle versioner af billeder',
+'listfiles-latestversion' => 'Nuværende version',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nej',
 
 # File description page
 'file-anchor-link' => 'Fil',
@@ -2015,8 +2042,8 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
 'pageswithprop-text' => 'Denne side viser en liste over sider, der har en bestemt sideegenskab.',
 'pageswithprop-prop' => 'Egenskabsnavn:',
 'pageswithprop-submit' => 'Vis',
-'pageswithprop-prophidden-long' => 'lang tekst egenskabsværdien skjult ($1 KB)',
-'pageswithprop-prophidden-binary' => 'binære egenskabsværdien skjult ($1 KB)',
+'pageswithprop-prophidden-long' => 'lang tekst værdi for egenskaben skjult ($1)',
+'pageswithprop-prophidden-binary' => 'binær værdi for egenskaben skjult ($1)',
 
 'doubleredirects' => 'Dobbelte omdirigeringer',
 'doubleredirectstext' => 'Dette er en liste over sider som omdirigerer til andre omdirigeringssider.
@@ -2090,6 +2117,7 @@ Hver linje indeholder henvisninger til den første og den anden omdirigering, s
 'listusers' => 'Brugerliste',
 'listusers-editsonly' => 'Vis kun brugere med redigeringer',
 'listusers-creationsort' => 'Sorter efter oprettelsesdato',
+'listusers-desc' => 'Sortér i faldende rækkefølge',
 'usereditcount' => '{{PLURAL:$1|én redigering|$1 redigeringer}}',
 'usercreated' => '{{GENDER:$3|Oprettet}} den $1 $2',
 'newpages' => 'Nyeste sider',
@@ -2373,7 +2401,7 @@ en anden har allerede redigeret siden eller fjernet redigeringen.
 Den seneste redigering er foretaget af [[User:$3|$3]] ([[User talk:$3|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Redigeringsbeskrivelsen var: \"''\$1''\".",
 'revertpage' => 'Gendannet til seneste version af [[User:$1|$1]], fjerner ændringer fra [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]])',
-'revertpage-nouser' => 'Gendannet til seneste version af [[User:$1|$1]], fjerner ændringer fra en skjult bruger',
+'revertpage-nouser' => 'Gendannet til seneste version af {{GENDER:$1|[[User:$1|$1]]}}, fjerner ændringer fra en skjult bruger',
 'rollback-success' => 'Ændringerne fra $1 er fjernet,
 og den seneste version af $2 er gendannet.',
 
@@ -2512,7 +2540,7 @@ $1',
 'contributions' => '{{GENDER:$1|Brugerbidrag}}',
 'contributions-title' => 'Brugerbidrag for $1',
 'mycontris' => 'Bidrag',
-'contribsub2' => 'For $1 ($2)',
+'contribsub2' => 'For {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ingen ændringer er fundet som opfylder disse kriterier.',
 'uctop' => '(seneste)',
 'month' => 'Måned:',
@@ -3837,7 +3865,10 @@ Du skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General
 'tags-tag' => 'Tagnavn',
 'tags-display-header' => 'Udseende på ændringslister',
 'tags-description-header' => 'Beskrivelse af betydning',
+'tags-active-header' => 'Aktivt?',
 'tags-hitcount-header' => 'Taggede ændringer',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nej',
 'tags-edit' => 'Redigér',
 'tags-hitcount' => '{{PLURAL:$1|en ændring|$1 ændringer}}',
 
@@ -3858,6 +3889,7 @@ Du skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General
 'dberr-problems' => 'Undskyld! Siden har tekniske problemer.',
 'dberr-again' => 'Prøv at vente et par minutter og opdater så siden igen.',
 'dberr-info' => '(Kan ikke komme i kontakt med databaseserveren: $1)',
+'dberr-info-hidden' => '(Kan ikke komme i kontakt med databaseserveren)',
 'dberr-usegoogle' => 'Du kan prøve at søge med Google imens.',
 'dberr-outofdate' => 'Bemærk at deres indeks over vores sider kan være forældet.',
 'dberr-cachederror' => 'Det følgende er en mellemlagret kopi af den forespurgte side. Den kan være forældet.',
@@ -3994,9 +4026,16 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
 'rotate-comment' => 'Billedet roteres med $1 {{PLURAL:$1| grad|grader}} med uret',
 
 # Limit report
+'limitreport-title' => 'Profildata for parser:',
 'limitreport-cputime' => 'Brugt CPU-tid',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
 'limitreport-walltime' => 'Brugt reel tid',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-ppvisitednodes' => 'Antal nodebesøg for preprocessor',
+'limitreport-ppgeneratednodes' => 'Antal noder genereret af preprocessor',
+'limitreport-postexpandincludesize' => 'Inkluderet størrelse efter udvidelse',
+'limitreport-templateargumentsize' => 'Skabelon argumentstørrelse',
+'limitreport-expansiondepth' => 'Største udvidelsesdybde',
+'limitreport-expensivefunctioncount' => 'Antal dyre parserfunktioner',
 
 );
index 05533a6..afea089 100644 (file)
@@ -880,6 +880,9 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ände
 'userlogin-resetpassword-link' => 'Passwort zurücksetzen',
 'helplogin-url' => 'Help:Anmelden',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hilfe beim Anmelden]]',
+'userlogin-loggedin' => 'Du bist bereits als {{GENDER:$1|$1}} angemeldet.
+Benutze das unten stehende Formular, um sich unter einem anderen Benutzer anzumelden.',
+'userlogin-createanother' => 'Ein weiteres Benutzerkonto erstellen',
 'createacct-join' => 'Gib unten deine Informationen ein.',
 'createacct-another-join' => 'Gib unten die Informationen des neuen Benutzerkontos ein.',
 'createacct-emailrequired' => 'E-Mail-Adresse',
@@ -2600,9 +2603,11 @@ Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'deleteotherreason' => 'Anderer/ergänzender Grund:',
 'deletereasonotherlist' => 'Anderer Grund',
 'deletereason-dropdown' => '* Allgemeine Löschgründe
-** Wunsch des Autors
+** Spam
+** Vandalismus
 ** Urheberrechtsverletzung
-** Vandalismus',
+** Wunsch des Autors
+** Defekte Weiterleitung',
 'delete-edit-reasonlist' => 'Löschgründe bearbeiten',
 'delete-toobig' => 'Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen solcher Seiten wurde eingeschränkt, um eine versehentliche Überlastung der Server zu verhindern.',
 'delete-warning-toobig' => 'Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen kann zu Störungen im Datenbankbetrieb führen.',
@@ -2759,7 +2764,7 @@ $1',
 'contributions' => '{{GENDER:$1|Benutzerbeiträge}}',
 'contributions-title' => 'Benutzerbeiträge von „$1“',
 'mycontris' => 'Beiträge',
-'contribsub2' => 'Von $1 ($2)',
+'contribsub2' => 'Von {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Es wurden keine Benutzerbeiträge mit diesen Kriterien gefunden.',
 'uctop' => '(aktuell)',
 'month' => 'und Monat:',
@@ -2879,8 +2884,8 @@ Zur Aufhebung der Sperre siehe die [[Special:BlockList|Liste aller aktiven Sperr
 'blocklist-nousertalk' => 'darf eigene Diskussionsseite nicht bearbeiten',
 'ipblocklist-empty' => 'Die Liste enthält keine Einträge.',
 'ipblocklist-no-results' => 'Die gesuchte IP-Adresse/der Benutzername ist nicht gesperrt.',
-'blocklink' => 'sperren',
-'unblocklink' => 'freigeben',
+'blocklink' => 'Sperren',
+'unblocklink' => 'Freigeben',
 'change-blocklink' => 'Sperre ändern',
 'contribslink' => 'Beiträge',
 'emaillink' => 'E-Mail senden',
@@ -3230,6 +3235,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'tooltip-undo' => 'Macht lediglich diese eine Änderung rückgängig und zeigt das Resultat in der Vorschau an, damit in der Zusammenfassungszeile eine Begründung angegeben werden kann.',
 'tooltip-preferences-save' => 'Einstellungen speichern',
 'tooltip-summary' => 'Gib eine kurze Zusammenfassung ein.',
+'tooltip-iwiki' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */',
index e0987e7..d87a09c 100644 (file)
@@ -1689,8 +1689,8 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'action-block' => 'enê karberi vurnayışi ra bıreyne',
 'action-protect' => 'seviyeyê pawitişî se ena pele bivurne',
 'action-rollback' => 'Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao',
-'action-import' => 'ena pele yewna wiki ra azere de',
-'action-importupload' => 'ena pele yew dosyayê bar kerdişî ra import bike',
+'action-import' => 'ena pele yewna wikira azered',
+'action-importupload' => 'ena pele yew dosyayê bar kerdışira azered',
 'action-patrol' => 'vurnayîşê karberanê binî nişan bike patrol biye',
 'action-autopatrol' => 'vurnayîşê xoye nişan bike ke belli biyo patrol biye',
 'action-unwatchedpages' => 'listeyê pelanê seyirnibiya bivîne',
@@ -2506,7 +2506,7 @@ yewna ten pel de vurnayiş kerdo u pel tepiya nêgeriyeno.
 oyo ke vurnayişo peyin kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "kılmnuşteyê vurnayişibi: \"''\$1''\".",
 'revertpage' => 'Hetê [[Special:Contributions/$2|$2]] ([[User talk:$2|Mesac]]) ra vurnayiş biyo u ney vurnayişi tepiya geriyayo u no [[User:$1|$1]] kes o ke cuwa ver revizyon kerdo revizyonê no kesi tepiya anciyayo.',
-'revertpage-nouser' => '(nameyê karberi veteyo) no keso ke vuriyayiş kerdo vuriyayişê no kesi hetê no [[User:$1|$1]] kesi ra tepiya anciyayo',
+'revertpage-nouser' => 'No keso ke vuriyayiş kerdo vuriyayişé{{GENDER:$1|[[User:$1|$1]]}} ker o',
 'rollback-success' => 'vurnayişê no kesi $1 tepiya geriyayo u hetê no
 $2 kesi ra cıwa ver o ke revizyon biyo no revizyon tepiya anciyayo.',
 
@@ -2649,7 +2649,7 @@ $1',
 'contributions' => 'İştıraqê {{GENDER:$1|karber}}i',
 'contributions-title' => 'Dekerdenê karber de $1',
 'mycontris' => 'İştıraqi',
-'contribsub2' => 'Qandê $1 ($2)',
+'contribsub2' => 'Qandê {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
 'uctop' => '(weziyet)',
 'month' => 'Aşm:',
@@ -4186,7 +4186,10 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'tags-tag' => 'Nameyê etiketi',
 'tags-display-header' => 'Listeyê vurnayîşî de esayîş',
 'tags-description-header' => 'Deskripsyonê manay ê hemî',
+'tags-active-header' => 'Activ o?',
 'tags-hitcount-header' => 'Vurnayîşî ke etiket biyê',
+'tags-active-yes' => 'E',
+'tags-active-no' => 'Nê',
 'tags-edit' => 'bıvurne',
 'tags-hitcount' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}}',
 
index 15900d9..22e7b4e 100644 (file)
@@ -774,7 +774,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Έχετε αποσυνδεθεί.'''
 
-Έχετε υπόψη σας πως αρκετές σελίδες θα συνεχίσουν να εμφανίζονται κανονικά, σαν να μην έχετε αποσυνδεθεί, μέχρι να καθαρίσετε τη λανθάνουσα μνήμη του φυλλομετρητή σας.",
+Έχετε υπόψη σας πως αρκετές σελίδες θα συνεχίσουν να εμφανίζονται κανονικά, σαν να μην έχετε αποσυνδεθεί, μέχρι να καθαρίσετε την προσωρινή μνήμη του φυλλομετρητή σας.",
 'welcomeuser' => 'Καλώς ορίσατε, $1!',
 'welcomecreation-msg' => 'Ο λογαριασμός σας έχει δημιουργηθεί.
 Μην ξεχάσετε να αλλάξετε τις [[Special:Preferences|{{SITENAME}} προτιμήσεις]] σας.',
@@ -2139,7 +2139,7 @@ $1',
 'unusedtemplateswlh' => 'άλλοι σύνδεσμοι',
 
 # Random page
-'randompage' => 'ΤÏ\85Ï\87αία Ï\83ελίδα',
+'randompage' => 'ΤÏ\85Ï\87αίο Î»Î®Î¼Î¼α',
 'randompage-nopages' => 'Δεν υπάρχουν σελίδες {{PLURAL:$2|στον ακόλουθο ονοματοχώρο|στους ακόλουθους ονοματοχώρους}}: $1.',
 
 # Random page in category
@@ -4091,8 +4091,8 @@ $5
 'rightsnone' => '(κανένα)',
 
 # Feedback
-'feedback-bugornote' => 'Εάν είστε έτοιμοι να περιγράψετε ένα τεχνικό πρόβλημα λεπτομερώς παρακαλώ [ $1  κάντε μια αναφορά σφάλματος].
-Διαφορετικά, μπορείτε να χρησιμοποιήσετε την παρακάτω απλή φόρμα. Το σχόλιό σας θα προστεθεί στη σελίδα "[ $3  $2 ]", μαζί με το όνομα χρήστη σας και ποιο πρόγραμμα περιήγησης χρησιμοποιείτε.',
+'feedback-bugornote' => 'Εάν είστε έτοιμοι να περιγράψετε ένα τεχνικό πρόβλημα λεπτομερώς παρακαλούμε [$1  κάντε μια αναφορά σφάλματος].
+Διαφορετικά, μπορείτε να χρησιμοποιήσετε την παρακάτω απλή φόρμα. Το σχόλιό σας θα προστεθεί στη σελίδα "[$3  $2]", μαζί με το όνομα χρήστη σας.',
 'feedback-subject' => 'Θέμα:',
 'feedback-message' => 'Μήνυμα:',
 'feedback-cancel' => 'Ακύρωση',
@@ -4103,7 +4103,7 @@ $5
 'feedback-error3' => 'Σφάλμα: Καμία απάντηση από το API',
 'feedback-thanks' => 'Ευχαριστούμε! Τα σχόλιά σας έχουν καταχωρηθεί στη σελίδα "[$2 $1]".',
 'feedback-close' => 'Ολοκληρώθηκε',
-'feedback-bugcheck' => 'Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [ $1  γνωστά σφάλματα].',
+'feedback-bugcheck' => 'Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [$1 γνωστά σφάλματα].',
 'feedback-bugnew' => 'Έλεγξα. Αναφέρετε ένα νέο σφάλμα',
 
 # Search suggestions
index 3dedbb9..e247442 100644 (file)
@@ -1134,6 +1134,9 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'userlogin-resetpassword-link'    => 'Reset your password',
 'helplogin-url'                   => 'Help:Logging in',
 'userlogin-helplink'              => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]',
+'userlogin-loggedin'              => 'You are already logged in as {{GENDER:$1|$1}}.
+Use the form below to log in as another user.',
+'userlogin-createanother'         => 'Create another account',
 'createacct-join'                 => 'Enter your information below.',
 'createacct-another-join'         => "Enter the new account's information below.",
 'createacct-emailrequired'        => 'Email address',
@@ -3053,10 +3056,12 @@ See $2 for a record of recent deletions.',
 'deletecomment'          => 'Reason:',
 'deleteotherreason'      => 'Other/additional reason:',
 'deletereasonotherlist'  => 'Other reason',
-'deletereason-dropdown'  => '*Common delete reasons
-** Author request
+'deletereason-dropdown'  => '* Common delete reasons
+** Spam
+** Vandalism
 ** Copyright violation
-** Vandalism',
+** Author request
+** Broken redirect',
 'delete-edit-reasonlist' => 'Edit deletion reasons',
 'delete-toobig'          => 'This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.
 Deletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.',
@@ -3318,8 +3323,8 @@ Fill in a specific reason below (for example, citing particular pages that were
 'blockipsuccesssub'               => 'Block succeeded',
 'blockipsuccesstext'              => '[[Special:Contributions/$1|$1]] has been blocked.<br />
 See the [[Special:BlockList|block list]] to review blocks.',
-'ipb-blockingself'                => 'You are about to block yourself!  Are you sure you want to do that?',
-'ipb-confirmhideuser'             => 'You are about to block a user with "hide user" enabled.  This will suppress the user\'s name in all lists and log entries.  Are you sure you want to do that?',
+'ipb-blockingself'                => 'You are about to block yourself! Are you sure you want to do that?',
+'ipb-confirmhideuser'             => 'You are about to block a user with "hide user" enabled. This will suppress the user\'s name in all lists and log entries. Are you sure you want to do that?',
 'ipb-edit-dropdown'               => 'Edit block reasons',
 'ipb-unblock-addr'                => 'Unblock $1',
 'ipb-unblock'                     => 'Unblock a username or IP address',
@@ -4617,7 +4622,7 @@ This confirmation code will expire at $4.',
 'confirmrecreate'          => "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:
 : ''$2''
 Please confirm that you really want to recreate this page.",
-'confirmrecreate-noreason' => 'User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing.  Please confirm that you really want to recreate this page.',
+'confirmrecreate-noreason' => 'User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing. Please confirm that you really want to recreate this page.',
 'recreate'                 => 'Recreate',
 
 'unit-pixel' => 'px', # only translate this message to other languages if you have to change it
index c10e236..fb5be50 100644 (file)
@@ -2449,10 +2449,12 @@ Vidu la paĝon $2 por registro de lastatempaj forigoj.',
 'deletecomment' => 'Kialo:',
 'deleteotherreason' => 'Alia/plua kialo:',
 'deletereasonotherlist' => 'Alia kialo',
-'deletereason-dropdown' => '*Oftaj kialoj por forigo
-** Peto de aŭtoro
+'deletereason-dropdown' => '* Oftaj kialoj por forigo
+** Trudmesaĝoj
+** Vandalismo
 ** Neglekto de aŭtorrajto
-** Vandalismo',
+** Postulo de la aŭtoro
+** Nefunkcianta alidirektilo',
 'delete-edit-reasonlist' => 'Redakti kialojn de forigo',
 'delete-toobig' => 'Ĉi tiu paĝo havas grandan redakto-historion, pli ol $1 {{PLURAL:$1|version|versiojn}}. Forigo de ĉi tiaj paĝoj estis limigitaj por preventi akcidentan disrompigon de {{SITENAME}}.',
 'delete-warning-toobig' => 'Ĉi tiu paĝo havas grandan redakto-historion, pli ol $1 {{PLURAL:$1|version|versiojn}}. Forigo de ĝi povas disrompigi operacion de {{SITENAME}}; forigu singarde.',
index 7798a37..be82bc2 100644 (file)
@@ -76,6 +76,7 @@
  * @author Penarc
  * @author PerroVerd
  * @author Pertile
+ * @author Pginer
  * @author Piolinfax
  * @author Platonides
  * @author PoLuX124
@@ -830,6 +831,9 @@ No olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]]
 'userlogin-resetpassword-link' => 'Restablecer la contraseña',
 'helplogin-url' => 'Help:Inicio de sesión',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ayuda]]',
+'userlogin-loggedin' => 'Ya estás conectado como {{GENDER:$1|$1}}.
+Usa el formulario de abajo para iniciar sesión como otro usuario.',
+'userlogin-createanother' => 'Crear otra cuenta',
 'createacct-join' => 'Introduce tus datos debajo.',
 'createacct-another-join' => 'Introduzca la información de la nueva cuenta a continuación.',
 'createacct-emailrequired' => 'Dirección de correo electrónico',
@@ -1004,7 +1008,7 @@ Deberías hacerlo si accidentalmente la has compartido con alguien o si su cuent
 'resettokens-legend' => 'Restablecer claves',
 'resettokens-tokens' => 'Claves:',
 'resettokens-token-label' => '$1 (valor actual: $2)',
-'resettokens-watchlist-token' => 'Clave para la lista de seguimiento (RSS/Atom) de los [[special:Watchlist|cambios a las páginas en tu lista de segumiento]]',
+'resettokens-watchlist-token' => 'Clave para la lista de seguimiento (RSS/Atom) de los [[Special:Watchlist|cambios a las páginas en tu lista de seguimiento]]',
 'resettokens-done' => 'Restablecimiento de claves.',
 'resettokens-resetbutton' => 'Restablecer las claves',
 
@@ -1775,8 +1779,8 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'action-block' => 'bloquear a este usuario para que no edite',
 'action-protect' => 'cambiar los niveles de protección para esta página',
 'action-rollback' => 'revertir rápidamente las ediciones del último usuario que modificó una página en particular',
-'action-import' => 'importar esta página desde otro wiki',
-'action-importupload' => 'importar esta página mediante la carga de un archivo',
+'action-import' => 'importar páginas desde otro wiki',
+'action-importupload' => 'importar páginas mediante la carga de un archivo',
 'action-patrol' => 'marcar ediciones de otros como patrulladas',
 'action-autopatrol' => 'marcar como patrulladas tus propias ediciones',
 'action-unwatchedpages' => 'ver la lista de páginas no vigiladas',
@@ -2312,6 +2316,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
 'listusers' => 'Lista de usuarios',
 'listusers-editsonly' => 'Muestra sólo usuarios con ediciones',
 'listusers-creationsort' => 'Ordenado por fecha de creación',
+'listusers-desc' => 'Ordenar de forma descendente',
 'usereditcount' => '$1 {{PLURAL:$1|edición|ediciones}}',
 'usercreated' => '{{GENDER:$3|Registrado|Registrada}} el $1 a las $2',
 'newpages' => 'Páginas nuevas',
@@ -2570,9 +2575,11 @@ Véase $2 para un registro de los borrados recientes.',
 'deleteotherreason' => 'Otro motivo:',
 'deletereasonotherlist' => 'Otro motivo',
 'deletereason-dropdown' => '*Razones comunes de borrado
-** A petición del mismo autor
+** Spam
+** Vandalismo
 ** Violación de copyright
-** Vandalismo',
+** A petición del mismo autor
+** Redirección incorrecta',
 'delete-edit-reasonlist' => 'Editar razones de borrado',
 'delete-toobig' => 'Esta página tiene un historial muy grande, con más de $1 {{PLURAL:$1|revisión|revisiones}}. Borrar este tipo de páginas ha sido restringido para prevenir posibles problemas en {{SITENAME}}.',
 'delete-warning-toobig' => 'Esta página tiene un historial de más de $1 {{PLURAL:$1|revisión|revisiones}}. Eliminarla puede perturbar las operaciones de la base de datos de {{SITENAME}}. Ten cuidado al borrar.',
@@ -2731,7 +2738,7 @@ $1',
 'contributions' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}}',
 'contributions-title' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}} $1',
 'mycontris' => 'Contribuciones',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'No se encontraron cambios que cumplieran estos criterios.',
 'uctop' => '(edición actual)',
 'month' => 'Desde el mes (y anteriores):',
@@ -4092,7 +4099,9 @@ Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública
 'tags-tag' => 'Nombre de etiqueta',
 'tags-display-header' => 'Apariencia de la lista de cambios',
 'tags-description-header' => 'Descripción completa de significado',
+'tags-active-header' => '¿Activo?',
 'tags-hitcount-header' => 'Cambios etiquetados',
+'tags-active-yes' => 'Sí',
 'tags-edit' => 'editar',
 'tags-hitcount' => '$1 {{PLURAL:$1|cambio|cambios}}',
 
@@ -4263,5 +4272,6 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'limitreport-templateargumentsize' => 'Argumento del tamaño de la plantilla',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 'limitreport-expansiondepth' => 'Profundidad máxima de expansión',
+'limitreport-expensivefunctioncount' => 'Cuenta de la funcion expansiva del analizador',
 
 );
index 259ed97..74f1332 100644 (file)
@@ -595,8 +595,8 @@ Vaata [[Special:Version|versiooni lehekülge]].',
 'page-rss-feed' => '"$1" RSS-toide',
 'page-atom-feed' => '"$1" Atom-toide',
 'red-link-title' => '$1 (pole veel kirjutatud)',
-'sort-descending' => 'Järjesta kahanevalt',
-'sort-ascending' => 'Järjesta kasvavalt',
+'sort-descending' => 'Järjesta laskuvalt',
+'sort-ascending' => 'Järjesta tõusvalt',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Artikkel',
@@ -1218,7 +1218,7 @@ Saad soovi korral siiski [$1 seda muudatust vaadata].",
 Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Kustutamislogis] võib leiduda üksikasju.",
 'rev-suppressed-diff-view' => "Üks selle lehekülje muudatustest on '''varjatud'''.
 Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Varjamislogis] võib üksikasju olla.",
-'rev-delundel' => 'näita/peida',
+'rev-delundel' => 'muuda nähtavust',
 'rev-showdeleted' => 'näita',
 'revisiondelete' => 'Redaktsioonide kustutamine või taastamine',
 'revdelete-nooldid-title' => 'Sellist redaktsiooni pole.',
@@ -1327,7 +1327,7 @@ Pane tähele, et navigeerimislinkide kasutamine lähtestab redaktsioonide valiku
 'difference-multipage' => '(Lehekülgede erinevus)',
 'lineno' => '$1. rida:',
 'compareselectedversions' => 'Võrdle valitud redaktsioone',
-'showhideselectedversions' => 'Näita/peida valitud versioonid',
+'showhideselectedversions' => 'Muuda valitud redaktsioonide nähtavust',
 'editundo' => 'eemalda',
 'diff-empty' => '(Erinevus puudub)',
 'diff-multi' => '({{PLURAL:$1|Ühte|$1}} vahepealset {{PLURAL:$2|ühe|$2}} kasutaja redaktsiooni ei näidata.)',
@@ -1680,8 +1680,8 @@ See teave on avalik.',
 'action-block' => 'selle kasutaja redigeerimisõigust blokeerida',
 'action-protect' => 'selle lehekülje kaitsetasemeid muuta',
 'action-rollback' => 'tühistada otsekohe lehekülge viimati redigeerinud kasutaja muudatusi',
-'action-import' => 'seda lehekülge teisest vikist importida',
-'action-importupload' => 'seda lehekülge faili üleslaadimise abil importida',
+'action-import' => 'lehekülgi teisest vikist importida',
+'action-importupload' => 'lehekülgi faili üleslaadimise teel importida',
 'action-patrol' => 'teiste muudatusi kontrollituks märkida',
 'action-autopatrol' => 'oma muudatusi kontrollituks märkida',
 'action-unwatchedpages' => 'jälgimata lehekülgede loendit vaadata',
@@ -2192,6 +2192,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'listusers' => 'Kasutajad',
 'listusers-editsonly' => 'Näita vaid kasutajaid, kes on teinud muudatusi',
 'listusers-creationsort' => 'Järjesta konto loomise aja järgi',
+'listusers-desc' => 'Järjesta laskuvalt',
 'usereditcount' => '$1 {{PLURAL:$1|redigeerimine|redigeerimist}}',
 'usercreated' => 'Konto {{GENDER:$3|loomise}} aeg: $1 kell $2',
 'newpages' => 'Uued leheküljed',
@@ -2227,7 +2228,7 @@ Pane tähele, et teised võrgukohad võivad viidata failile otselingiga ja seega
 Valiku kitsendamiseks vali logitüüp, sisesta kasutajanimi (tõstutundlik) või huvipakkuva lehekülje pealkiri (samuti tõstutundlik).',
 'logempty' => 'Logis puuduvad vastavad kirjed.',
 'log-title-wildcard' => 'Selle tekstiga algavad pealkirjad',
-'showhideselectedlogentries' => 'Näita valitud logisissekandeid või peida need',
+'showhideselectedlogentries' => 'Muuda valitud logisissekannete nähtavust',
 
 # Special:AllPages
 'allpages' => 'Kõik leheküljed',
@@ -2618,7 +2619,7 @@ $1',
 'contributions' => '{{GENDER:$1|Kasutaja}} kaastöö',
 'contributions-title' => 'Kasutaja $1 kaastöö',
 'mycontris' => 'Kaastöö',
-'contribsub2' => 'Kasutaja $1 ($2) jaoks',
+'contribsub2' => 'Kasutaja {{GENDER:$3|$1}} ($2) jaoks',
 'nocontribs' => 'Antud kriteeriumitele vastavaid muudatusi ei leitud.',
 'uctop' => '(praegune)',
 'month' => 'Alates kuust (ja varasemad):',
@@ -3925,7 +3926,10 @@ GNU Üldise Avaliku Litsentsi [{{SERVER}}{{SCRIPTPATH}}/COPYING eksemplar] peaks
 'tags-tag' => 'Märgise nimi',
 'tags-display-header' => 'Tähistus muudatusloendis',
 'tags-description-header' => 'Täiskirjeldus',
+'tags-active-header' => 'Aktiivne?',
 'tags-hitcount-header' => 'Märgistatud muudatused',
+'tags-active-yes' => 'Jah',
+'tags-active-no' => 'Ei',
 'tags-edit' => 'muuda',
 'tags-hitcount' => '$1 {{PLURAL:$1|muudatus|muudatust}}',
 
index 2007ae1..de17d41 100644 (file)
@@ -30,6 +30,7 @@
  * @author Meno25
  * @author Mjbmr
  * @author Mormegil
+ * @author Omidh
  * @author Omnia
  * @author Pouyana
  * @author Reza1615
@@ -443,7 +444,7 @@ $messages = array(
 'tog-hidepatrolled' => 'ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند',
 'tog-newpageshidepatrolled' => 'صفحه‌های نهگبانی‌شده از فهرست صفحه‌های تازه پنهان شوند',
 'tog-extendwatchlist' => 'گسترش فهرست پی‌گیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها',
-'tog-usenewrc' => 'گروه‌بندی تغییرات بر پایه صفحه در تغییرات اخیر و فهرست پیگیری‌ها (نیازمند جاوااسکریپت)',
+'tog-usenewrc' => 'گروه‌بندی تغییرات بر پایهٔ صفحه‌های تغییرات اخیر و فهرست پیگیری‌ها (نیازمند جاوااسکریپت)',
 'tog-numberheadings' => 'شماره‌گذاری خودکار عنوان‌ها',
 'tog-showtoolbar' => 'نوار ابزار جعبهٔ ویرایش نمایش یابد',
 'tog-editondblclick' => 'ویرایش صفحه‌ها با دوکلیک (نیازمند جاوااسکریپت)',
@@ -581,7 +582,7 @@ $messages = array(
 'newwindow' => '(در پنجرهٔ جدید باز می‌شود)',
 'cancel' => 'لغو',
 'moredotdotdot' => 'بیشتر...',
-'morenotlisted' => 'ادامه لیست...',
+'morenotlisted' => 'این فهرست کامل نیست.',
 'mypage' => 'صفحه',
 'mytalk' => 'بحث',
 'anontalk' => 'بحث برای این آی‌پی',
@@ -684,7 +685,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}}',
 'aboutpage' => 'Project:درباره',
-'copyright' => 'محتوا تحت اجازه‌نامهٔ $1 در دسترس است.',
+'copyright' => 'محتوایات تحت اجازه‌نامهٔ $1 هستند مگر اینکه خلافش ذکر شده باشد.',
 'copyrightpage' => '{{ns:project}}:حق تکثیر',
 'currentevents' => 'رویدادهای کنونی',
 'currentevents-url' => 'Project:رویدادهای کنونی',
@@ -771,6 +772,12 @@ $1',
 # General errors
 'error' => 'خطا',
 'databaseerror' => 'خطای پایگاه داده',
+'databaseerror-text' => 'مشکلی در پایگاه‌داده‌ها رخ داده‌است. 
+این ممکن است نشان‌دهندهٔ ایرادی در نرم‌افزار باشد.',
+'databaseerror-textcl' => 'یک خطای پرس‌وجوی پایگاه داده‌های رخ داده‌است.',
+'databaseerror-query' => 'پرس‌وجو: $1',
+'databaseerror-function' => 'تابع: $1',
+'databaseerror-error' => 'خطا: $1',
 'laggedslavemode' => "'''هشدار:''' صفحه ممکن است به‌روزرسانی‌های اخیر را شامل نشود.",
 'readonly' => 'پایگاه داده قفل شد',
 'enterlockreason' => 'دلیلی برای قفل کردن ذکر کنید، که حاوی تقریبی از زمانی باشد که قفل برداشته خواهد شد',
@@ -863,7 +870,7 @@ $2',
 'userlogin-yourname' => 'نام کاربری',
 'userlogin-yourname-ph' => 'نام کاربریتان را وارد کنید',
 'createacct-another-username-ph' => 'نام کاربریتان را وارد کنید',
-'yourpassword' => 'گذرواژه:',
+'yourpassword' => 'رمز عبور:',
 'userlogin-yourpassword' => 'گذرواژه',
 'userlogin-yourpassword-ph' => 'گذرواژه را وارد کنید',
 'createacct-yourpassword-ph' => 'یک گذرواژه وارد کنید',
@@ -895,12 +902,15 @@ $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' => 'آدرس رایانامه',
-'createacct-emailoptional' => 'آدرس رایانامه (اختیاری)',
-'createacct-email-ph' => 'آدرس رایانامه را وارد کنید',
-'createacct-another-email-ph' => 'آدرس رایانامه را وارد کنید',
+'createacct-emailrequired' => 'نشانی رایانامه',
+'createacct-emailoptional' => 'نشانی رایانامه (اختیاری)',
+'createacct-email-ph' => 'نشانی رایانامه را وارد کنید',
+'createacct-another-email-ph' => 'نشانی رایانامه را وارد کنید',
 'createaccountmail' => 'استفاده از رمز عبور موقت تصادفی و فرستادن آن به نشانی ایمیل مشخص‌شده',
 'createacct-realname' => 'نام واقعی (اختیاری)',
 'createaccountreason' => 'دلیل:',
@@ -911,8 +921,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' => 'نام کاربری‌ای که وارد کردید قبلاً استفاده شده‌است.
@@ -993,8 +1003,8 @@ $2',
 
 # Email sending
 'php-mail-error-unknown' => 'خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی',
-'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس رایانامه.',
-'user-mail-no-body' => 'تلاش برای فرستادن پست‌الکترونیک بی‌دلیل کوتاه یا خالی',
+'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک نشانی رایانامه.',
+'user-mail-no-body' => 'تلاش برای فرستادن رایانامه بی‌دلیل کوتاه یا خالی',
 
 # Change password dialog
 'resetpass' => 'تغییر گذرواژه',
@@ -1435,7 +1445,7 @@ $1",
 'revdel-restore-visible' => 'نسخه‌های پیدا',
 'pagehist' => 'تاریخچهٔ صفحه',
 'deletedhist' => 'تاریخچهٔ حذف‌شده',
-'revdelete-hide-current' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه، نسخهٔ اخیر می‌باشد و قابل پنهان کردن نیست.',
+'revdelete-hide-current' => 'خطا در پنهان‌کردن مورد مورخ $2 ساعت $1: این نسخه، نسخهٔ اخیر است و قابل پنهان‌کردن نیست.',
 'revdelete-show-no-access' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.',
 'revdelete-modify-no-access' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.',
 'revdelete-modify-missing' => 'خطا در پنهان کردن مورد شمارهٔ $1: این نسخه در پایگاه داده وجود ندارد!',
@@ -1601,7 +1611,7 @@ $1",
 'prefs-rendering' => 'نمایش صفحه',
 'saveprefs' => 'ذخیره',
 'resetprefs' => 'صفرکردن ترجیحات',
-'restoreprefs' => 'برگرداندن تمام تنظیمات پیش‌فرض',
+'restoreprefs' => 'برگرداندن تمام تنظیمات پیش‌فرض (در تمامی قسمت‌ها)',
 'prefs-editing' => 'ویرایش',
 'rows' => 'تعداد سطرها:',
 'columns' => 'تعداد ستون‌ها:',
@@ -1664,8 +1674,9 @@ $1",
 'gender-unknown' => 'ترجیح می‌دهم مشخص نکنم',
 'gender-male' => 'مرد',
 'gender-female' => 'زن',
-'prefs-help-gender' => 'اختیاری: برای خطاب‌شدن با جنسیت درست توسط نرم‌افزار به کار می‌رود.
-این اطلاعات عمومی خواهد بود.',
+'prefs-help-gender' => 'انجام این تنظیم اختیاری است.
+نرم‌افزار از این مقدار برای اشارهٔ صحیح به جنسیت شما و ذکر شما برای دیگران با استفاده از قوائد درست دستور زبان استفاده می‌کند.
+این اطلاعات عمومی خواهند بود.',
 'email' => 'رایانامه',
 'prefs-help-realname' => 'نام واقعی اختیاری است.
 اگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.',
@@ -1688,7 +1699,9 @@ $1",
 'prefs-displayrc' => 'گزینه‌های نمایش',
 'prefs-displaysearchoptions' => 'گزینه‌های نمایش',
 'prefs-displaywatchlist' => 'گزینه‌های نمایش',
+'prefs-tokenwatchlist' => 'نشانه',
 'prefs-diffs' => 'تفاوت‌ها',
+'prefs-help-prefershttps' => 'تأثیر این ترجیح بعد از ورود بعدی شما اعمال خواهد شد.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'نشانی رایانامه معتبر به نظر می‌رسد',
@@ -1712,10 +1725,10 @@ $1",
 'userrights-no-interwiki' => 'شما اجازهٔ تغییر اختیارات کاربران دیگر ویکی‌ها را ندارید.',
 'userrights-nodatabase' => 'پایگاه دادهٔ $1 وجود ندارد یا محلی نیست.',
 'userrights-nologin' => 'شما باید با یک حساب کاربری مدیر [[Special:UserLogin|به سامانه وارد شوید]] تا بتوانید اختیارات کاربران را تعیین کنید.',
-'userrights-notallowed' => 'حساب Ú©Ø§Ø±Ø¨Ø±Û\8c Ø´Ù\85ا Ø§Ø¬Ø§Ø²Ù\87 Ø§Ù\81زÙ\88دÙ\86 Û\8cا Ø­Ø°Ù\81 Ú©Ø±Ø¯Ù\86 Ø§Ø®ØªÛ\8cارات Ú©Ø§Ø±Ø¨Ø±Û\8c Ø±Ø§ Ù\86دارد.',
+'userrights-notallowed' => 'Ø´Ù\85ا Ù\85جÙ\88ز Ø¨Ø±Ø§Û\8c Ø§Ù\81زÙ\88دÙ\86 Û\8cا Ø­Ø°Ù\81 Ø­Ù\82Ù\88Ù\82 Ú©Ø§Ø±Ø¨Ø± Ø±Ø§ Ù\86دارÛ\8cد.',
 'userrights-changeable-col' => 'گروه‌هایی که می‌توانید تغییر دهید',
 'userrights-unchangeable-col' => 'گروه‌هایی که نمی‌توانید تغییر دهید',
-'userrights-conflict' => 'تعارض Ø¯Ø³ØªØ±Ø³Û\8câ\80\8cÙ\87اÛ\8c Ú©Ø§Ø±Ø¨Ø±Û\8c! Ù\84Ø·Ù\81اÙ\8b ØªØºÛ\8cÛ\8cراتتاÙ\86 Ø±Ø§ Ø¯Ù\88بارÙ\87 Ø§Ø¹Ù\85اÙ\84 کنید.',
+'userrights-conflict' => 'تعارض Ø¯Ø³ØªØ±Ø³Û\8câ\80\8cÙ\87اÛ\8c Ú©Ø§Ø±Ø¨Ø±Û\8c! Ù\84Ø·Ù\81اÙ\8b Ø¨Ø±Ø±Ø³Û\8c Ú©Ù\86Û\8cد Ù\88 ØªØºÛ\8cÛ\8cرات Ø±Ø§ ØªØ£Û\8cÛ\8cد کنید.',
 'userrights-removed-self' => 'شما با موفقیت دسترسی‌های خود را واستاندید. به این ترتیب شما دیگر به این صفحه دسترسی ندارید.',
 
 # Groups
@@ -1846,8 +1859,8 @@ $1",
 'action-block' => 'قطع دسترسی این کاربر از ویرایش کردن',
 'action-protect' => 'تغییر سطح محافظت این صفحه',
 'action-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است',
-'action-import' => 'Ù\88ارد Ú©Ø±Ø¯Ù\86 Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø§Ø² Û\8cÚ© Ù\88Û\8cÚ©ی دیگر',
-'action-importupload' => 'وارد کردن این صفحه از طریق بارگذاری پرونده',
+'action-import' => 'Ù\88ارد Ú©Ø±Ø¯Ù\86 ØµÙ\81Ø­Ù\87 Ø§Ø² Ù\88Û\8cÚ©Û\8c Ù\87ای دیگر',
+'action-importupload' => 'واردکردن صفحه از طریق بارگذاری پرونده',
 'action-patrol' => 'گشت زدن ویرایش دیگران',
 'action-autopatrol' => 'گشت زدن ویرایش خودتان',
 'action-unwatchedpages' => 'مشاهدهٔ صفحه‌های پی‌گیری نشده',
@@ -1863,6 +1876,8 @@ $1",
 
 # Recent changes
 'nchanges' => '$1 تغییر',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|از آخرین بازدید}}',
+'enhancedrc-history' => 'تاریخچه',
 'recentchanges' => 'تغییرات اخیر',
 'recentchanges-legend' => 'گزینه‌های تغییرات اخیر',
 'recentchanges-summary' => 'آخرین تغییرات ویکی را در این صفحه پی‌گیری کنید.',
@@ -2158,8 +2173,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'upload_source_file' => '(پرونده‌ای در رایانهٔ شما)',
 
 # Special:ListFiles
-'listfiles-summary' => 'این صفحهٔ ویژه تمام پرونده‌های بارگذاری شده را نمایش می‌دهد.
-در صورت پالایش بر اساس کاربر، تنها پرونده‌هایی که آخرین نسخه‌شان توسط کاربر موردنظر بارگذاری شده باشد نمایش می‌یابند.',
+'listfiles-summary' => 'این صفحهٔ ویژه تمام پرونده‌های بارگذاری‌شده را نمایش می‌دهد.',
 'listfiles_search_for' => 'جستجو به دنبال نام پرونده چندرسانه‌ای:',
 'imgfile' => 'پرونده',
 'listfiles' => 'فهرست پرونده‌ها',
@@ -2170,6 +2184,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'listfiles_size' => 'اندازه',
 'listfiles_description' => 'توضیح',
 'listfiles_count' => 'نسخه‌ها',
+'listfiles-show-all' => 'شامل نسخه‌های قدیمی عکس‌ها',
+'listfiles-latestversion' => 'نسخهٔ فعلی',
+'listfiles-latestversion-yes' => 'بله',
+'listfiles-latestversion-no' => 'خیر',
 
 # File description page
 'file-anchor-link' => 'پرونده',
@@ -2267,6 +2285,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'randompage' => 'مقالهٔ تصادفی',
 'randompage-nopages' => 'هیچ صفحه‌ای در این {{PLURAL:$2|فضای نام|فضاهای نام}} موجود نیست: $1.',
 
+# Random page in category
+'randomincategory' => 'صفحهٔ تصادفی در رده',
+'randomincategory-invalidcategory' => '«$1» نامی معتبر برای یک ردهٔ نیست.',
+'randomincategory-nopages' => 'هیج صفحه‌ای در رده [[:Category:$1|$1]] وجود ندارد.',
+'randomincategory-selectcategory' => 'دریافت صفحه‌ای تصادفی از دسته‌بندی: $1 $2.',
+'randomincategory-selectcategory-submit' => 'برو',
+
 # Random redirect
 'randomredirect' => 'تغییرمسیر تصادفی',
 'randomredirect-nopages' => 'هیج صفحهٔ تغییرمسیری در فضای نام «$1» موجود نیست.',
@@ -2297,6 +2322,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'pageswithprop-text' => 'این صفحه فهرستی است از صفحه‌هایی که از یک خاصیت صفحهٔ خاص استفاده می‌کنند.',
 'pageswithprop-prop' => 'نام خاصیت:',
 'pageswithprop-submit' => 'برو',
+'pageswithprop-prophidden-long' => 'جزییات مخفی متن طولانی ($1)',
+'pageswithprop-prophidden-binary' => 'جزییات مقدار مخفی باینری ($1)',
 
 'doubleredirects' => 'تغییرمسیرهای دوتایی',
 'doubleredirectstext' => 'این صفحه فهرستی از صفحه‌های تغییرمسیری را ارائه می‌کند که به صفحهٔ تغییرمسیر دیگری اشاره می‌کنند.
@@ -2354,6 +2381,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'mostrevisions' => 'صفحه‌های دارای بیشترین نسخه',
 'prefixindex' => 'تمام صفحه‌ها با پیشوند',
 'prefixindex-namespace' => 'همهٔ صفحه‌های دارای پیشوند (فضای‌نام $1)',
+'prefixindex-strip' => 'حذف پیشوند در فهرست',
 'shortpages' => 'صفحه‌های کوتاه',
 'longpages' => 'صفحه‌های بلند',
 'deadendpages' => 'صفحه‌های بن‌بست',
@@ -2369,6 +2397,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'listusers' => 'فهرست کاربران',
 'listusers-editsonly' => 'فقط کاربرانی که ویرایش دارند را نشان بده',
 'listusers-creationsort' => 'مرتب کردن بر اساس تاریخ ایجاد',
+'listusers-desc' => 'ترتیب نزولی',
 'usereditcount' => '$1 {{PLURAL:$1|ویرایش|ویرایش}}',
 'usercreated' => '{{GENDER:$3|ایجادشده}} در تاریخ $1 در ساعت $2',
 'newpages' => 'صفحه‌های تازه',
@@ -2474,8 +2503,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'listgrouprights' => 'اختیارات گروه‌های کاربری',
 'listgrouprights-summary' => 'فهرست زیر شامل گروه‌های کاربری تعریف شده در این ویکی و اختیارات داده شده به آن‌ها است.
 اطلاعات بیشتر در مورد هر یک از اختیارات را در [[{{MediaWiki:Listgrouprights-helppage}}]] بیابید.',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">اختیارات داده شده</span>
-* <span class="listgrouprights-revoked">اختیارات گرفته شده</span>',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">اختیارات دادهشده</span>
+* <span class="listgrouprights-revoked">اختیارات گرفتهشده</span>',
 'listgrouprights-group' => 'گروه',
 'listgrouprights-rights' => 'دسترسی‌ها',
 'listgrouprights-helppage' => 'Help:دسترسی‌های گروهی',
@@ -2630,9 +2659,11 @@ $PAGEINTRO $NEWPAGE
 'deleteotherreason' => 'دلیل دیگر/اضافی:',
 'deletereasonotherlist' => 'دلیل دیگر',
 'deletereason-dropdown' => '*دلایل متداول حذف
-** درخواست کاربر
+** هرزنگار
+** خرابکاری
 ** نقض حق تکثیر
-** خرابکاری',
+** درخواست کاربر
+** تغییرمسیر شکسته',
 'delete-edit-reasonlist' => 'ویرایش دلایل حذف',
 'delete-toobig' => 'این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.
 به منظور جلوگیری از اختلال ناخواسته در {{SITENAME}} حذف این گونه صفحه‌ها محدود شده‌است.',
@@ -2655,7 +2686,7 @@ $PAGEINTRO $NEWPAGE
 آخرین ویرایش توسط [[User:$3|$3]] ([[User talk:$3|بحث]]{{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' => 'ویرایش‌های انجام‌شده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.',
 'rollback-success' => 'ویرایش‌های $1 واگردانی شد؛
 صفحه به آخرین ویرایش $2 برگردانده شد.',
 
@@ -2801,7 +2832,7 @@ $1',
 'contributions' => 'مشارکت‌های {{GENDER:$1|کاربر}}',
 'contributions-title' => 'مشارکت‌های کاربری $1',
 'mycontris' => 'مشارکت‌ها',
-'contribsub2' => 'برای $1 ($2)',
+'contribsub2' => 'برای {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'هیچ تغییری با این مشخصات یافت نشد.',
 'uctop' => '(بالا)',
 'month' => 'در این ماه (و پیش از آن):',
@@ -3328,13 +3359,13 @@ $2',
 'pageinfo-length' => 'حجم صفحه  (بایت)',
 'pageinfo-article-id' => 'شناسهٔ صفحه',
 'pageinfo-language' => 'زبان محتوای صفحه',
-'pageinfo-robot-policy' => 'وضعیت موتور جستجو',
-'pageinfo-robot-index' => 'Ù\81Ù\87رستâ\80\8cپذÛ\8cر',
-'pageinfo-robot-noindex' => 'عدÙ\85 Ù\81Ù\87رستâ\80\8cپذÛ\8cرÛ\8c',
+'pageinfo-robot-policy' => '‌فهرست‌کردن توسط ربات‌ها',
+'pageinfo-robot-index' => 'Ù\85جاز',
+'pageinfo-robot-noindex' => 'غÛ\8cر Ù\85جاز',
 'pageinfo-views' => 'شمار بازدیدها',
 'pageinfo-watchers' => 'شمار پی‌گیری‌کنندگان صفحه',
 'pageinfo-few-watchers' => 'کمتر از  $1 {{PLURAL:$1| پی‌گیر|پی‌گیر}}',
-'pageinfo-redirects-name' => 'تغییرمسیرها به این صفحه',
+'pageinfo-redirects-name' => 'تعداد ØªØºÛ\8cÛ\8cرÙ\85سÛ\8cرÙ\87ا Ø¨Ù\87 Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87',
 'pageinfo-subpages-name' => 'زیرصفحه‌های این صفحه',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|تغییرمسیر|تغییرمسیر}}; $3 {{PLURAL:$3|غیرتغییرمسیر|غیرتغییرمسیر}})',
 'pageinfo-firstuser' => 'به‌وجود آورندهٔ صفحه',
@@ -3938,7 +3969,8 @@ $3
 $5
 
 این تأییدیه در $4 منقضی می‌گردد.',
-'confirmemail_body_set' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 نشانی رایانامه حساب «$2» در {{SITENAME}} را به این نشانی تغییر داده‌است.
+'confirmemail_body_set' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1,
+نشانی رایانامه حساب «$2» در {{SITENAME}} را به این نشانی تغییر داده‌است.
 
 برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی رایانامه در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
 
@@ -3980,6 +4012,7 @@ $5
 # Separators for various lists, etc.
 'semicolon-separator' => '؛&#32;',
 'comma-separator' => '،&#32;',
+'percent' => '$1٪',
 
 # Multipage image navigation
 'imgmultipageprev' => '&rarr; صفحهٔ پیشین',
@@ -4132,6 +4165,7 @@ $5
 'version-license' => 'اجازه‌نامه',
 'version-poweredby-credits' => "این ویکی توسط '''[//www.mediawiki.org/ مدیاویکی]''' پشتیبانی می‌شود، کلیهٔ حقوق محفوظ است © 2001-$1 $2.",
 'version-poweredby-others' => 'دیگران',
+'version-poweredby-translators' => 'مترجمان translatewiki.net',
 'version-credits-summary' => 'افراد زیر را به خاطر ویرایش‌هایش در [[Special:Version|مدیاویکی]] معرفی می‌نمائیم.',
 'version-license-info' => 'مدیاویکی نرم‌افزاری رایگان است؛ می‌توانید آن را تحت شرایط مجوز عمومی همگانی گنو که توسط بنیاد نرم‌افزار رایگان منتشر شده‌است، بازنشر کنید؛ یا نسخهٔ ۲ از این مجوز، یا (بنا به اختیار) نسخه‌های بعدی.
 
@@ -4212,7 +4246,10 @@ $5
 '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|تغییر|تغییر}}',
 
@@ -4233,6 +4270,7 @@ $5
 'dberr-problems' => 'شرمنده! این تارنما از مشکلات فنی رنج می‌برد.',
 'dberr-again' => 'چند دقیقه صبر کند و دوباره صفحه را بارگیری کنید.',
 'dberr-info' => '(امکان برقراری ارتباط با کارساز پایگاه داده وجود ندارد: $1)',
+'dberr-info-hidden' => '(امکان تماس با پایگاه‌داده‌ها کارساز امکان‌پذیر نیست)',
 'dberr-usegoogle' => 'شما در این مدت می‌توانید با استفاده از گوگل جستجو کنید.',
 'dberr-outofdate' => 'توجه کنید که نمایه‌های آن‌ها از محتوای ما ممکن است به روز نباشد.',
 'dberr-cachederror' => 'آن‌چه در ادامه می‌آید یک کپی از صفحهٔ درخواست شده است که در کاشه قرار دارد، و ممکن است به روز نباشد.',
@@ -4369,5 +4407,17 @@ $5
 
 # Limit report
 'limitreport-title' => 'داده‌های رخ‌نمانگاری تجزیه‌کننده:',
+'limitreport-cputime' => 'زمان مصرف سی‌پی‌یو',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|ثانیه}}',
+'limitreport-walltime' => 'استفاده زمان واقعی',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|ثانیه|ثانیه}}',
+'limitreport-ppvisitednodes' => 'شمارش گرهٔ پیش‌پردازنده مشاهده‌شده',
+'limitreport-ppgeneratednodes' => 'شمارش گره پیش‌پردازنده تولیدشده',
+'limitreport-postexpandincludesize' => 'شامل اندازه پس گسترش',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|بایت|بایت}}',
+'limitreport-templateargumentsize' => 'اندازه عملگر الگو',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|بایت|بایت}}',
+'limitreport-expansiondepth' => 'بیشترین عمق گسترش',
+'limitreport-expensivefunctioncount' => 'تعداد تابع تجزیه‌گر پرمصرف',
 
 );
index 79da6f3..804552b 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,9 +867,9 @@ 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',
-'retypenew' => 'Uusi salasana uudelleen',
+'oldpassword' => 'Vanha salasana:',
+'newpassword' => 'Uusi salasana:',
+'retypenew' => 'Uusi salasana uudelleen:',
 'resetpass_submit' => 'Aseta salasana ja kirjaudu sisään',
 'changepassword-success' => 'Salasanasi vaihtaminen onnistui.',
 'resetpass_forbidden' => 'Salasanoja ei voi vaihtaa.',
@@ -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',
@@ -974,7 +982,7 @@ IP-osoitteesi kirjataan tämän sivun muutoshistoriaan.",
 'missingcommentheader' => 'Et ole antanut otsikkoa kommentillesi. Napsauta ”{{int:savearticle}}”, jos et halua antaa otsikkoa.',
 'summary-preview' => 'Yhteenvedon esikatselu:',
 'subject-preview' => 'Otsikon esikatselu:',
-'blockedtitle' => 'Pääsy estetty',
+'blockedtitle' => 'Käyttäjä on estetty',
 'blockedtext' => "'''Käyttäjätunnuksesi tai IP-osoitteesi on estetty.'''
 
 Eston on asettanut $1.
@@ -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.',
@@ -1025,11 +1033,12 @@ Voit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta,
 tai [{{fullurl:{{FULLPAGENAME}}|action=edit}} muokata tätä sivua]</span>.',
 'noarticletext-nopermission' => 'Tällä hetkellä tällä sivulla ei ole tekstiä.
 Voit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta tai <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheeseen liittyviä lokeja]</span>, mutta sinulla ei ole oikeutta luoda tätä sivua.',
-'missing-revision' => 'Sivusta {{PAGENAME}} ei ole olemassa versiota $1.
+'missing-revision' => 'Sivusta "{{PAGENAME}}" ei ole olemassa versiota $1.
 
-Useimmiten tämä johtuu vanhentuneesta historialinkistä poistettuun sivuun.
-Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].',
-'userpage-userdoesnotexist' => 'Käyttäjätunnusta <nowiki>$1</nowiki> ei ole rekisteröity. Varmista haluatko muokata tätä sivua.',
+Yleensä tämä johtuu vanhentuneesta historialinkistä sivulle, joka on poistettu.
+Tarkempia tietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].',
+'userpage-userdoesnotexist' => 'Käyttäjätunnusta "$1" ei ole rekisteröity. 
+Varmista, haluatko luoda tämän sivun tai muokata sitä.',
 'userpage-userdoesnotexist-view' => 'Käyttäjätunnusta ”$1” ei ole rekisteröity.',
 'blocked-notice-logextract' => 'Tämä käyttäjä on tällä hetkellä estetty.
 Alla on viimeisin estolokin tapahtuma:',
@@ -1083,30 +1092,31 @@ 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:',
-'recreate-moveddeleted-warn' => "'''Olet luomassa sivua, joka on aikaisemmin poistettu.'''
+'permissionserrorstext' => 'Sinulla ei ole oikeutta suorittaa toimintoa {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:',
+'permissionserrorstext-withaction' => 'Sinulla ei ole oikeutta {{lcfirst:$2}} {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:',
+'recreate-moveddeleted-warn' => "'''Varoitus: Olet luomassa sellaista sivua, joka on aikaisemmin poistettu.'''
 
-Harkitse, kannattaako sivua luoda uudelleen. Alla on tämän sivun poisto- ja siirtohistoria:",
+Harkitse, kannattaako tätä sivua luoda uudelleen. 
+Alla on tämän sivun poisto- ja siirtohistoria:",
 'moveddeleted-notice' => 'Tämä sivu on poistettu. Alla on tämän sivun poisto- ja siirtohistoria.',
 'log-fulllog' => 'Näytä loki kokonaan',
 'edit-hook-aborted' => 'Laajennuskoodi esti muokkauksen antamatta syytä.',
@@ -1122,7 +1132,7 @@ Se on jo olemassa.',
 'invalid-content-data' => 'Virheellinen sisältö',
 'content-not-allowed-here' => 'Sivun [[$2]] sisältö ei voi olla tyyppiä $1.',
 'editwarning-warning' => 'Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.
-Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa osiossa »Muokkaus».',
+Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa osiossa "Muokkaus".',
 
 # Content models
 'content-model-wikitext' => 'wikiteksti',
@@ -1152,15 +1162,16 @@ Nämä muuttujat on jätetty käsittelemättä.",
 'converter-manual-rule-error' => 'Kielivarianttisäännössä on virhe',
 
 # "Undo" feature
-'undo-success' => 'Kumoaminen onnistui. Valitse <em>tallenna</em> toteuttaaksesi muutokset.',
-'undo-failure' => 'Muokkausta ei voitu kumota välissä olevien ristiriitaisten muutosten vuoksi. Kumoa muutokset käsin.',
-'undo-norev' => 'Muokkausta ei voitu perua, koska sitä ei ole olemassa tai se on poistettu.',
+'undo-success' => 'Kumoaminen voidaan suorittaa.
+Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen tallenna alla näkyvät muutokset.',
+'undo-failure' => 'Muokkausta ei voi kumota välissä olevien ristiriitaisten muutosten vuoksi.',
+'undo-norev' => 'Muokkausta ei voida kumota, koska sitä ei ole olemassa tai se on poistettu.',
 'undo-summary' => 'Kumottu muokkaus $1, jonka teki [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]])',
-'undo-summary-username-hidden' => 'Kumoa muutos $1, jonka on tehnyt piilotettu käyttäjä',
+'undo-summary-username-hidden' => 'Kumottu muokkaus $1, jonka on tehnyt piilotettu käyttäjä',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'Tunnuksen luominen epäonnistui',
-'cantcreateaccount-text' => "Käyttäjä [[User:$3|$3]] on estänyt käyttäjätunnusten luomisen tästä IP-osoitteesta ($1).
+'cantcreateaccounttitle' => 'Tunnusta ei voida luoda',
+'cantcreateaccount-text' => "Tunnusten luonti tästä IP-osoitteesta ('''$1''') on estetty. Estäjänä on [[User:$3|$3]].
 
 Käyttäjän $3 antama syy on ''$2''",
 
@@ -1225,7 +1236,7 @@ Voit silti [$1 nähdä tämän muutoksen], jos haluat jatkaa.",
 Voit silti nähdä tämän muutoksen. Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
 'rev-suppressed-diff-view' => "Yksi tämän muutosvertailun versioista on '''häivytetty'''.
 Voit silti nähdä tämän muutoksen. Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} häivytyslokista].",
-'rev-delundel' => 'näytä tai piilota',
+'rev-delundel' => 'muuta näkyvyyttä',
 'rev-showdeleted' => 'näytä',
 'revisiondelete' => 'Poista tai palauta versioita',
 'revdelete-nooldid-title' => 'Ei kohdeversiota',
@@ -1257,10 +1268,10 @@ Muut ylläpitäjät {{GRAMMAR:inessive|{{SITENAME}}}} voivat silti tarkastella p
 'revdelete-radio-unset' => 'Ei',
 'revdelete-suppress' => 'Häivytä tiedot myös ylläpitäjien näkyviltä samalla kun piilotat ne muilta käyttäjiltä',
 'revdelete-unsuppress' => 'Poista rajoitukset palautetuilta versioilta',
-'revdelete-log' => 'Syy',
+'revdelete-log' => 'Syy:',
 'revdelete-submit' => 'Toteuta {{PLURAL:$1|valittuun versioon|valittuihin versioihin}}',
 'revdelete-success' => "'''Version näkyvyys päivitetty.'''",
-'revdelete-failure' => "'''Version näkyvyyttä ei voitu päivittää:'''
+'revdelete-failure' => "'''Version näkyvyyden muuttaminen ei onnistunut:'''
 $1",
 'logdelete-success' => "'''Lokitapahtuman näkyvyyttä on muutettu.'''",
 'logdelete-failure' => "'''Lokin näkyvyyttä ei voitu asettaa:'''
@@ -1283,10 +1294,10 @@ Sinulla ei ole oikeutta siihen.',
 ** Sopimattomat henkilötiedot
 ** Sopimaton käyttäjätunnus
 ** Mahdollinen kunnianloukkaus',
-'revdelete-otherreason' => 'Muu syy tai tarkennus',
+'revdelete-otherreason' => 'Muu syy tai tarkennus:',
 'revdelete-reasonotherlist' => 'Muu syy',
 'revdelete-edit-reasonlist' => 'Muokkaa poistosyitä',
-'revdelete-offender' => 'Version tekijä',
+'revdelete-offender' => 'Version tekijä:',
 
 # Suppression log
 'suppressionlog' => 'Häivytysloki',
@@ -1294,7 +1305,7 @@ Sinulla ei ole oikeutta siihen.',
 [[Special:BlockList|Estolistassa]] on lueteltu voimassa olevat muokkauskiellot ja muokkausestot.',
 
 # History merging
-'mergehistory' => 'Yhdistä muutoshistoriat',
+'mergehistory' => 'Yhdistä sivujen muutoshistoriat',
 'mergehistory-header' => 'Tämä sivu mahdollistaa sivun muutoshistorian yhdistämisen uudemman sivun muutoshistoriaan.
 Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa mennä ristikkäin.',
 'mergehistory-box' => 'Yhdistä kahden sivun muutoshistoria',
@@ -1413,19 +1424,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 +1444,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ä',
@@ -1442,7 +1453,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'resultsperpage' => 'Tuloksia sivua kohti',
 'stub-threshold' => '<a href="#" class="stub">Tynkäsivun</a> osoituskynnys',
 'stub-threshold-disabled' => 'Ei käytössä',
-'recentchangesdays' => 'Näytettävien päivien määrä tuoreissa muutoksissa',
+'recentchangesdays' => 'Näytettävien päivien määrä tuoreissa&nbsp;muutoksissa',
 'recentchangesdays-max' => 'Enintään $1 {{PLURAL:$1|päivä|päivää}}',
 'recentchangescount' => 'Näytettävien muutoksien määrä oletuksena',
 'prefs-help-recentchangescount' => 'Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.',
@@ -1485,7 +1496,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,8 +1527,8 @@ Tämä tieto on julkinen.',
 'prefs-displayrc' => 'Perusasetukset',
 'prefs-displaysearchoptions' => 'Näyttöasetukset',
 'prefs-displaywatchlist' => 'Näyttöasetukset',
-'prefs-tokenwatchlist' => 'Tunniste',
-'prefs-diffs' => 'Erot',
+'prefs-tokenwatchlist' => 'Avain',
+'prefs-diffs' => 'Eroavaisuudet',
 'prefs-help-prefershttps' => 'Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.',
 
 # User preference: email validation using jQuery
@@ -1526,27 +1537,27 @@ Tämä tieto on julkinen.',
 
 # User rights
 'userrights' => 'Käyttöoikeuksien hallinta',
-'userrights-lookup-user' => 'Käyttöoikeuksien hallinta',
+'userrights-lookup-user' => 'Hallinnoi käyttäjän ryhmiä',
 'userrights-user-editname' => 'Käyttäjätunnus',
 'editusergroup' => 'Muokkaa käyttäjän ryhmiä',
-'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-auto' => 'Virtuaaliset ryhmät:',
-'userrights-groups-help' => 'Voit muuttaa ryhmiä, joissa tämä käyttäjä on.
+'editinguser' => "Muutetaan käyttäjän '''[[User:$1|$1]]''' $2 oikeuksia",
+'userrights-editusergroup' => 'Muuta käyttäjän ryhmiä',
+'saveusergroups' => 'Tallenna nämä käyttäjäryhmät',
+'userrights-groupsmember' => 'Jäsenenä ryhmissä:',
+'userrights-groupsmember-auto' => 'Automaattisesti jäsenenä ryhmissä:',
+'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-no-interwiki' => 'Sinulla ei ole lupaa muokata käyttöoikeuksia muissa wikeissä.',
+* <nowiki>*</nowiki> tarkoittaa, että et pysty poistamaan käyttäjää tästä ryhmästä kun olet hänet siihen lisännyt tai päinvastoin',
+'userrights-reason' => 'Syy:',
+'userrights-no-interwiki' => 'Sinulla ei ole oikeutta 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 oikeutta lisätä tai poistaa käyttäjien 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.',
-'userrights-removed-self' => 'Poistit onnistuneesti omat oikeutesi. Tämän myötä sinulla ei ole enää oikeutta käyttää tätä sivua.',
+'userrights-removed-self' => 'Poistit onnistuneesti omat oikeutesi. Tämän jälkeen et enää pääse tälle sivulle.',
 
 # Groups
 'group' => 'Ryhmä',
@@ -1611,7 +1622,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 +2199,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 +2442,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 +2468,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 +2510,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 +2519,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ä',
@@ -2561,9 +2572,12 @@ Voit palauttaa versioita valikoivasti valitsemalla vain niiden versioiden valint
 'undeletehistory' => 'Jos palautat sivun, kaikki versiot lisätään sivun historiaan. Jos uusi sivu samalla nimellä on luotu poistamisen jälkeen, palautetut versiot lisätään sen historiaan.',
 'undeleterevdel' => 'Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain piilotettu. 
 Tässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus.',
-'undeletehistorynoadmin' => 'Tämä sivu on poistettu. Syy sivun poistamiseen näkyy yhteenvedossa, jossa on myös tiedot, ketkä ovat muokanneet tätä sivua ennen poistamista. Sivujen varsinainen sisältö on vain ylläpitäjien luettavissa.',
+'undeletehistorynoadmin' => 'Tämä sivu on poistettu. 
+Syy sivun poistamiseen näkyy alla olevassa yhteenvedossa, jossa on myös tiedot, ketkä olivat muokanneet tätä sivua ennen poistamista. 
+Näiden poistettujen versioiden varsinainen tekstisisältö on vain ylläpitäjien luettavissa.',
 'undelete-revision' => 'Poistettu sivu $1 hetkellä $4 kello $5. Tekijä: $3.',
-'undeleterevision-missing' => 'Virheellinen tai puuttuva versio. Se on saatettu palauttaa tai poistaa arkistosta.',
+'undeleterevision-missing' => 'Virheellinen tai puuttuva versio. 
+Sinulla on kenties käytössä väärä linkki, tai sitten versio on saatettu palauttaa tai poistaa arkistosta.',
 'undelete-nodiff' => 'Aikaisempaa versiota ei löytynyt.',
 'undeletebtn' => 'Palauta',
 'undeletelink' => 'näytä tai palauta',
@@ -2609,7 +2623,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',
@@ -2708,7 +2722,7 @@ Voimassa olevat estot näkyvät [[Special:BlockList|estolistasta]].',
 'blocklist-userblocks' => 'Piilota tunnusten estot',
 'blocklist-tempblocks' => 'Piilota väliaikaiset estot',
 'blocklist-addressblocks' => 'Piilota yksittäiset IP-estot',
-'blocklist-rangeblocks' => 'Piilota ryhmäestot',
+'blocklist-rangeblocks' => 'Piilota avaruusestot',
 'blocklist-timestamp' => 'Päiväys',
 'blocklist-target' => 'Kohde',
 'blocklist-expiry' => 'Vanhentuu',
@@ -2757,7 +2771,7 @@ Alla on ote häivytyslokista.',
 'ipb_already_blocked' => '”$1” on jo estetty.',
 'ipb-needreblock' => '$1 on jo estetty. Haluatko muuttaa eston asetuksia?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Muu esto|Muut estot}}',
-'unblock-hideuser' => 'Et voi poistaa estoa tältä käyttäjältä, kun käyttäjänimi on piilotettuna.',
+'unblock-hideuser' => 'Et voi poistaa estoa tältä käyttäjältä, koska hänen käyttäjätunnuksensa on piilotettu.',
 'ipb_cant_unblock' => 'Estoa ”$1” ei löytynyt. Se on saatettu poistaa.',
 'ipb_blocked_as_range' => 'IP-osoite $1 on estetty välillisesti ja sen estoa ei voi poistaa. Se on estetty osana verkkoaluetta $2, jonka eston voi poistaa',
 'ip_range_invalid' => 'Virheellinen IP-alue.',
@@ -2767,30 +2781,33 @@ Alla on ote häivytyslokista.',
 'proxyblocker-disabled' => 'Tämä toiminto ei ole käytössä.',
 'proxyblockreason' => 'IP-osoitteestasi on estetty muokkaukset, koska se on avoin välityspalvelin. Ota yhteyttä Internet-palveluntarjoajaasi tai tekniseen tukeen ja kerro heille tästä tietoturvaongelmasta.',
 'proxyblocksuccess' => 'Valmis.',
-'sorbsreason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBLin mustalla listalla.',
-'sorbs_create_account_reason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBLin mustalla listalla. Et voi luoda käyttäjätunnusta.',
+'sorbsreason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}.',
+'sorbs_create_account_reason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}. 
+Et voi luoda käyttäjätunnusta.',
 'xffblockreason' => 'Yhteydet IP-osoitteesta, joka löytyy sinun tai käyttämäsi välipalvelimen X-Forwarded-For-otsakkeesta, on estetty. Alkuperäinen estämisen syy oli: $1',
-'cant-block-while-blocked' => 'Et voi estää muita käyttäjiä ollessasi estetty.',
+'cant-block-while-blocked' => 'Et voi estää muita käyttäjiä kun olet itse estetty.',
 'cant-see-hidden-user' => 'Käyttäjä, jota yrität estää on jo estetty ja piilotettu. Koska sinulla ei ole hideuser-oikeutta, et voi nähdä tai muokata käyttäjän estoa.',
 'ipbblocked' => 'Et voi estää tai poistaa estoja muilta käyttäjiltä, koska itse olet estettynä',
 'ipbnounblockself' => 'Et ole oikeutettu poistamaan estoa itseltäsi',
 
 # Developer tools
 'lockdb' => 'Lukitse tietokanta',
-'unlockdb' => 'Vapauta tietokanta',
-'lockdbtext' => 'Tietokannan lukitseminen estää käyttäjiä muokkaamasta sivuja, vaihtamasta asetuksia, muokkaamasta tarkkailulistoja ja tekemästä muita tietokannan muuttamista vaativia toimia. Ole hyvä ja vahvista, että tämä on tarkoituksesi, ja että vapautat tietokannan kun olet suorittanut ylläpitotehtävät.',
-'unlockdbtext' => 'Tietokannan vapauttaminen antaa käyttäjille mahdollisuuden muokata sivuja, vaihtaa asetuksia, muokata tarkkailulistoja ja tehdä muita tietokannan muuttamista vaativia toimia. Ole hyvä ja vahvista, että tämä on tarkoituksesi.',
+'unlockdb' => 'Poista tietokannan lukitus',
+'lockdbtext' => 'Tietokannan lukitseminen estää kaikkia käyttäjiä muokkaamasta sivuja, vaihtamasta asetuksia, muokkaamasta tarkkailulistoja ja tekemästä muita toimia, jotka vaativat tietokannan muuttamista. Ole hyvä ja vahvista, että tämä on tarkoituksesi ja että poistat tietokannan lukituksen kun olet suorittanut huoltotehtävät.',
+'unlockdbtext' => 'Tietokannan lukituksen poistaminen antaa käyttäjille mahdollisuuden muokata sivuja, vaihtaa asetuksia, muokata tarkkailulistoja ja tehdä muita tietokannan muuttamista vaativia toimia. 
+Ole hyvä ja vahvista, että tämä on tarkoituksesi.',
 'lockconfirm' => 'Kyllä, haluan varmasti lukita tietokannan.',
-'unlockconfirm' => 'Kyllä, haluan varmasti vapauttaa tietokannan.',
+'unlockconfirm' => 'Kyllä, haluan varmasti poistaa tietokannan lukituksen.',
 'lockbtn' => 'Lukitse tietokanta',
-'unlockbtn' => 'Vapauta tietokanta',
-'locknoconfirm' => 'Et merkinnyt vahvistuslaatikkoa.',
+'unlockbtn' => 'Poista tietokannan lukitus',
+'locknoconfirm' => 'Et vahvistanut toimenpidettä.',
 'lockdbsuccesssub' => 'Tietokannan lukitseminen onnistui',
-'unlockdbsuccesssub' => 'Tietokannan vapauttaminen onnistui',
-'lockdbsuccesstext' => 'Tietokanta on lukittu.<br />Muista vapauttaa tietokanta ylläpitotoimenpiteiden jälkeen.',
-'unlockdbsuccesstext' => 'Tietokanta on vapautettu.',
+'unlockdbsuccesssub' => 'Tietokannan lukitus on poistettu',
+'lockdbsuccesstext' => 'Tietokanta on lukittu.<br />
+Muista [[Special:UnlockDB|poistaa tietokannan lukitus]] kun huolto on tehty.',
+'unlockdbsuccesstext' => 'Tietokannan lukitus on poistettu.',
 'lockfilenotwritable' => 'Tietokannan lukitustiedostoa ei voi kirjoittaa. Tarkista oikeudet.',
-'databasenotlocked' => 'Tietokanta ei ole lukittu.',
+'databasenotlocked' => 'Tietokantaa ei ole lukittu.',
 'lockedbyandtime' => '(lukinnut {{GENDER:$1|$1}} $2 kello $3)',
 
 # Move page
@@ -2814,21 +2831,20 @@ Huomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan s
 Tämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.
 
 Tämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
-'movepagetalktext' => "Sivuun mahdollisesti kytketty keskustelusivu siirretään automaattisesti, '''paitsi jos''':
-*Siirrät sivua nimiavaruudesta toiseen
-*Kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai
-*Kumoat alla olevan ruudun asetuksen.
+'movepagetalktext' => "Sivuun mahdollisesti liittyvä keskustelusivu siirtyy automaattisesti mukana, '''paitsi:'''
+*jos siirron kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai
+*jos otat pois rastin alla olevasta ruudusta.
 
-Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.",
-'movearticle' => 'Siirrettävä sivu',
+Näissä tapauksissa sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
+'movearticle' => 'Siirrettävä sivu:',
 'moveuserpage-warning' => "'''Varoitus:''' Olet siirtämässä käyttäjäsivua. Huomaa, että vain sivu siirretään ja käyttäjää ''ei'' nimetä uudelleen.",
 'movenologin' => 'Et ole kirjautunut sisään',
 'movenologintext' => 'Sinun pitää olla rekisteröitynyt käyttäjä ja [[Special:UserLogin|kirjautua sisään]], jotta voisit siirtää sivun.',
-'movenotallowed' => 'Sinulla ei ole oikeuksia siirtää sivuja.',
-'movenotallowedfile' => 'Sinulla ei ole oikeuksia siirtää tiedostoja.',
-'cant-move-user-page' => 'Sinulla ei ole lupaa siirtää käyttäjäsivuja (lukuun ottamatta alasivuja).',
-'cant-move-to-user-page' => 'Sinulla ei ole lupaa siirtää sivuja käyttäjäsivuiksi (paitsi alasivuiksi).',
-'newtitle' => 'Uusi nimi sivulle',
+'movenotallowed' => 'Sinulla ei ole oikeutta siirtää sivuja.',
+'movenotallowedfile' => 'Sinulla ei ole oikeutta siirtää tiedostoja.',
+'cant-move-user-page' => 'Sinulla ei ole oikeutta siirtää käyttäjäsivuja (lukuun ottamatta alasivuja).',
+'cant-move-to-user-page' => 'Sinulla ei ole oikeutta siirtää sivua käyttäjäsivuksi (paitsi käyttäjän alasivuksi).',
+'newtitle' => 'Uusi nimi sivulle:',
 'move-watch' => 'Tarkkaile tätä sivua',
 'movepagebtn' => 'Siirrä sivu',
 'pagemovedsub' => 'Siirto onnistui',
@@ -2838,7 +2854,7 @@ Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.",
 'articleexists' => 'Kohdesivu on jo olemassa, tai valittu nimi ei ole sopiva. Ole hyvä ja valitse uusi nimi.',
 'cantmove-titleprotected' => 'Sivua ei voi siirtää tälle nimelle, koska tämän nimisen sivun luonti on estetty.',
 'talkexists' => 'Sivun siirto onnistui, mutta keskustelusivua ei voitu siirtää, koska uuden otsikon alla on jo keskustelusivu. Keskustelusivujen sisältö täytyy yhdistää käsin.',
-'movedto' => 'Siirretty uudelle otsikolle',
+'movedto' => 'Siirretty uudelle nimelle',
 'movetalk' => 'Siirrä myös keskustelusivu',
 'move-subpages' => 'Siirrä kaikki alasivut (enintään $1)',
 'move-talk-subpages' => 'Siirrä kaikki keskustelusivun alasivut (enintään $1)',
@@ -2852,11 +2868,13 @@ $1 {{PLURAL:$1|sivu|sivua}} siirrettiin.',
 'movesubpage' => '{{PLURAL:$1|Alasivu|Alasivut}}',
 'movesubpagetext' => 'Tällä sivulla on $1 {{PLURAL:$1|alasivu|alasivua}}, jotka näkyvät alla.',
 'movenosubpage' => 'Tällä sivulla ei ole alasivuja.',
-'movereason' => 'Syy',
-'revertmove' => 'kumoa',
+'movereason' => 'Syy:',
+'revertmove' => 'kumoa siirto',
 'delete_and_move' => 'Poista kohdesivu ja siirrä',
-'delete_and_move_text' => 'Kohdesivu [[:$1]] on jo olemassa. Haluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää?',
-'delete_and_move_confirm' => 'Poista sivu',
+'delete_and_move_text' => '==Poistamista edellyttävä siirto==
+Kohdesivu [[:$1]] on jo olemassa. 
+Haluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää?',
+'delete_and_move_confirm' => 'Kyllä, poista kohdesivu',
 'delete_and_move_reason' => 'Sivu on sivun [[$1]] siirron tiellä.',
 'selfmove' => 'Lähde- ja kohdenimi ovat samat.',
 'immobile-source-namespace' => 'Sivuja ei voi siirtää nimiavaruudessa ”$1”',
@@ -2869,7 +2887,7 @@ $1 {{PLURAL:$1|sivu|sivua}} siirrettiin.',
 'nonfile-cannot-move-to-file' => 'Sivuja ei voi siirtää tiedostonimiavaruuteen.',
 'imagetypemismatch' => 'Uusi tiedostopääte ei vastaa tiedoston tyyppiä',
 'imageinvalidfilename' => 'Kohdenimi on virheellinen',
-'fix-double-redirects' => 'Päivitä kaikki tänne viittaavat ohjaukset ohjaamaan uudelle nimelle',
+'fix-double-redirects' => 'Päivitä kaikki vanhalle nimelle viittaavat ohjaukset ohjaamaan uudelle nimelle',
 'move-leave-redirect' => 'Jätä paikalle ohjaus',
 'protectedpagemovewarning' => "'''Varoitus:''' Tämä sivu on lukittu siten, että vain ylläpitäjät voivat siirtää sitä.
 Alla on viimeisin lokitapahtuma:",
@@ -3015,7 +3033,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 +3175,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 +3648,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 +3836,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 +3872,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 +3927,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 +3964,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 +3978,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 +4062,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 +4078,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 +4098,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 +4122,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 d1afd7f..1206c92 100644 (file)
@@ -848,6 +848,9 @@ N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAM
 'userlogin-resetpassword-link' => 'Réinitialiser le mot de passe',
 'helplogin-url' => 'Help:Connexion',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aide à la connexion]]',
+'userlogin-loggedin' => 'Vous êtes déjà connecté en tant que {{GENDER:$1|$1}}.
+Utilisez le formulaire ci-dessous pour vous connecter avec un autre utilisateur.',
+'userlogin-createanother' => 'Créer un autre compte',
 'createacct-join' => 'Entrez vos informations ci-dessous.',
 'createacct-another-join' => 'Saisir les informations du nouveau compte ci-dessous.',
 'createacct-emailrequired' => 'Adresse de courriel',
@@ -2574,10 +2577,12 @@ Voir $2 pour une liste des suppressions récentes.',
 'deletecomment' => 'Motif :',
 'deleteotherreason' => 'Motif autre ou supplémentaire :',
 'deletereasonotherlist' => 'Autre motif',
-'deletereason-dropdown' => "* Motifs de suppression les plus courants
-** Demande de l'auteur
-** Violation des droits d'auteur
-** Vandalisme",
+'deletereason-dropdown' => '* Motifs de suppression les plus courants
+** Pourriel
+** Vandalisme
+** Violation des droits d’auteur
+** Demande de l’auteur
+** Redirection cassée',
 'delete-edit-reasonlist' => 'Modifier les motifs de suppression de page',
 'delete-toobig' => 'Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.
 La suppression de telles pages a été restreinte pour prévenir des perturbations accidentelles de {{SITENAME}}.',
@@ -2745,7 +2750,7 @@ $1',
 'contributions' => 'Contributions de l’{{GENDER:$1|utilisateur|utilisatrice}}',
 'contributions-title' => 'Liste des contributions de l’utilisat{{GENDER:$1|eur|rice|eur}} $1',
 'mycontris' => 'Contributions',
-'contribsub2' => 'Pour $1 ($2)',
+'contribsub2' => 'Pour {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "Aucune modification correspondant à ces critères n'a été trouvée.",
 'uctop' => '(actuel)',
 'month' => 'À partir du mois (et précédents) :',
@@ -3219,6 +3224,7 @@ Vous pouvez toutefois en visualiser la source.',
 'tooltip-undo' => '« Annuler » rétablit la modification précédente et ouvre la fenêtre de modification en mode prévisualisation. Il est possible d’ajouter une raison dans le résumé.',
 'tooltip-preferences-save' => 'Sauvegarder les préférences',
 'tooltip-summary' => 'Entrez un bref résumé',
+'tooltip-iwiki' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* Le CSS placé ici sera appliqué à tous les habillages. */',
@@ -3300,7 +3306,7 @@ Vous pouvez toutefois en visualiser la source.',
 'pageinfo-magic-words' => '{{PLURAL:$1|Mot magique|Mots magiques}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Catégorie cachée|Catégories cachées}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Modèle inclu|Modèles inclus}} ($1)',
-'pageinfo-transclusions' => '{{PLURAL:$1|Page traduite|Pages traduites}} sur ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Page dans laquelle|Pages dans lesquelles}} elle est incluse ($1)',
 'pageinfo-toolboxlink' => 'Information sur la page',
 'pageinfo-redirectsto' => 'Rediriger vers',
 'pageinfo-redirectsto-info' => 'info',
@@ -4184,7 +4190,10 @@ Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licen
 'tags-tag' => 'Nom de la balise',
 'tags-display-header' => 'Apparence dans les listes de modifications',
 'tags-description-header' => 'Description complète de la balise',
+'tags-active-header' => 'Actif ?',
 'tags-hitcount-header' => 'Modifications balisées',
+'tags-active-yes' => 'Oui',
+'tags-active-no' => 'Non',
 'tags-edit' => 'modifier',
 'tags-hitcount' => '$1 modification{{PLURAL:$1||s}}',
 
index 5a110dd..3683045 100644 (file)
@@ -714,6 +714,9 @@ Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENA
 'userlogin-resetpassword-link' => 'Restablecer o seu contrasinal',
 'helplogin-url' => 'Help:Rexistro',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Axuda co rexistro]]',
+'userlogin-loggedin' => 'Xa accedeu ao sistema como {{GENDER:$1|$1}}.
+Utilice o formulario inferior para acceder como outro usuario.',
+'userlogin-createanother' => 'Crear outra conta',
 'createacct-join' => 'Insira a súa información embaixo.',
 'createacct-another-join' => 'Insira a información da nova conta embaixo.',
 'createacct-emailrequired' => 'Enderezo de correo electrónico',
@@ -2482,10 +2485,12 @@ No $2 pode ver unha lista cos borrados máis recentes.',
 'deletecomment' => 'Motivo:',
 'deleteotherreason' => 'Outro motivo:',
 'deletereasonotherlist' => 'Outro motivo',
-'deletereason-dropdown' => '*Motivos frecuentes para borrar
-** Solicitado pola persoa que o creou
+'deletereason-dropdown' => '* Motivos frecuentes para borrar
+** Spam
+** Vandalismo
 ** Violación dos dereitos de autoría
-** Vandalismo',
+** Solicitado pola persoa que creou a páxina
+** Redirección rota',
 'delete-edit-reasonlist' => 'Editar os motivos de borrado',
 'delete-toobig' => 'Esta páxina conta cun historial longo, de máis {{PLURAL:$1|dunha revisión|de $1 revisións}}.
 Limitouse a eliminación destas páxinas para previr problemas de funcionamento accidentais en {{SITENAME}}.',
@@ -2650,7 +2655,7 @@ $1',
 'contributions' => 'Contribucións {{GENDER:$1|do usuario|da usuaria}}',
 'contributions-title' => 'Contribucións de $1',
 'mycontris' => 'Contribucións',
-'contribsub2' => 'De $1 ($2)',
+'contribsub2' => 'De {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Non se deron atopado cambios con eses criterios.',
 'uctop' => '(última revisión)',
 'month' => 'Desde o mes de (e anteriores):',
@@ -4016,7 +4021,10 @@ Debería recibir [{{SERVER}}{{SCRIPTPATH}}/COPYING unha copia da licenza públic
 'tags-tag' => 'Nome da etiqueta',
 'tags-display-header' => 'Aparición nas listas de cambios',
 'tags-description-header' => 'Descrición completa do significado',
+'tags-active-header' => 'Activa?',
 'tags-hitcount-header' => 'Edicións etiquetadas',
+'tags-active-yes' => 'Si',
+'tags-active-no' => 'Non',
 'tags-edit' => 'editar',
 'tags-hitcount' => '$1 {{PLURAL:$1|modificación|modificacións}}',
 
index 19e56df..100e2ad 100644 (file)
@@ -615,6 +615,7 @@ $2',
 'userlogin-resetpassword-link' => 'તમારી ગુપ્તસંજ્ઞા બદલો',
 'helplogin-url' => 'Help:પ્રવેશ માટે',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|પ્રવેશવા માટેની મદદ]]',
+'userlogin-createanother' => 'બીજું ખાતું બનાવો',
 'createacct-join' => 'તમારી માહિતી નીચે દાખલ કરો.',
 'createacct-another-join' => 'નવા ખાતાંની માહિતી નીચે દાખલ કરો.',
 'createacct-emailrequired' => 'ઇમેલ સરનામું',
@@ -710,6 +711,8 @@ $2',
 'login-abort-generic' => 'તમારું પ્રવેશ નિષ્ફળ થયું - છોડી દેવાયું',
 'loginlanguagelabel' => 'ભાષા: $1',
 'suspicious-userlogout' => 'લોગ આઉટ કરવાની તમારી વિનંતિ પૂરી ન કરી શકાઇ. એમ લાગે છે કે તેને તૃટિ પામેલ બ્રાઉઝર કે પ્રોક્સી દ્વારા મોકલાઈ હતી.',
+'createacct-another-realname-tip' => 'સાચું નામ મરજીયાત છે.
+જો તમે તે આપવાનું પસંદ કરશો, તો તેનો ઉપયોગ તમે કરેલ યોગદાનનું શ્રેય આપવા માટે થશે.',
 
 # Email sending
 'php-mail-error-unknown' => 'PHPની મેલ() કામગીરીમાં અજ્ઞાત ત્રુટિ',
@@ -779,6 +782,7 @@ $2
 
 # Special:ResetTokens
 'resettokens' => 'નિશાનીઓ ફરી ગોઠવો',
+'resettokens-no-tokens' => 'અહીં ફરી ગોઠવવા માટેનાં કોઇ ટોકન નથી',
 'resettokens-legend' => 'નિશાનીઓ ફરી ગોઠવો',
 'resettokens-tokens' => 'નિશાનીઓ:',
 'resettokens-token-label' => '$1 (હાલની કિંમત: $2)',
@@ -1403,6 +1407,7 @@ HTML નાકું ચકાસો',
 'saveusergroups' => 'સભ્ય સમુહો સાચવો',
 'userrights-groupsmember' => 'સભ્યપદ:',
 'userrights-groupsmember-auto' => 'આનો અભિપ્રેત સભ્ય:',
+'userrights-groupsmember-type' => ' $1',
 'userrights-groups-help' => 'અ સ્ભ્ય જેનો સભ્ય છે તે સમ્હૂહને બદલી શકો છો:
 * અંકિત કરેલું ખાનું બતાવે છે સભ્ય તેનો સમૂહમાં શામિલ છે.
 * જો ખાનું અંકિત ન હોય તો સભ્ય તે સમૂહમાં શામિલ નથી.
@@ -1483,7 +1488,11 @@ HTML નાકું ચકાસો',
 'right-editusercssjs' => 'અન્ય સભ્યોની CSS અને JavaScript ફાઇલમાં ફેરફાર કરો',
 'right-editusercss' => 'અન્ય સભ્યોની CSS ફાઇલમાં ફેરફાર કરો',
 'right-edituserjs' => 'અન્ય સભ્યોની JavaScript ફાઇલમાં ફેરફાર કરો',
+'right-editmyusercss' => 'તમારી પોતાની CSS ફાઇલોમાં ફેરફાર કરો',
+'right-editmyuserjs' => 'તમારી પોતાની જાવાસ્ક્રિપ્ટ ફાઇલોમાં ફેરફાર કરો',
 'right-viewmywatchlist' => 'તમારી પોતાની ધ્યાનસૂચી જુઓ',
+'right-viewmyprivateinfo' => 'તમારી પોતાની અંગત માહિતી જુઓ (દા.ત. ઇમેલ સરનામું, ખરું નામ)',
+'right-editmyprivateinfo' => 'તમારી પોતાની અંગત માહિતીમાં ફેરફાર કરો (દા.ત. ઇમેલ સરનામું, ખરું નામ)',
 'right-editmyoptions' => 'તમારી પોતાની પ્રાથમિકતાઓમાં ફેરફાર કરો',
 'right-rollback' => 'ચોક્કસ પાનામાં જે છેલ્લા સભ્યએ ફેરફારો કર્યાં હોય તેને ઝડપથી ઉલટાવો',
 'right-markbotedits' => 'ઉલટાવનારા અને બોટ ફેરફારો નોંધો',
@@ -1553,6 +1562,7 @@ HTML નાકું ચકાસો',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|છેલ્લી મુલાકાતથી}}',
 'enhancedrc-history' => 'ઇતિહાસ',
 'recentchanges' => 'તાજા ફેરફારો',
 'recentchanges-legend' => 'હાલમાં થયેલા ફેરફારોના વિકલ્પ',
@@ -1848,6 +1858,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'listfiles_size' => 'માપ',
 'listfiles_description' => 'વર્ણન',
 'listfiles_count' => 'આવૃત્તિ',
+'listfiles-show-all' => 'ચિત્રોની જૂની આવૃત્તિઓનો સમાવેશ કરો',
 'listfiles-latestversion' => 'વર્તમાન આવૃતિ',
 'listfiles-latestversion-yes' => 'હા',
 'listfiles-latestversion-no' => 'ના',
@@ -2335,7 +2346,7 @@ Deleting it may disrupt database operations of {{SITENAME}};',
 આ પાના પર ના છેલ્લા ફેરફારો [[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|talk]])દ્વારા ફેરફરોને  [[User:$1|$1]] દ્વારા કરેલા છેલ્લા સુધારા સુધી ઉલટાવાયા.',
-'revertpage-nouser' => 'ગુપ્ત સભ્ય વડે કરાયેલ ફેરફારને [[User:$1|$1]] વડે કરેલ છેલ્લા પુનરાવર્તન પર પાછા લઇ જવાયું.',
+'revertpage-nouser' => 'ગુપ્ત સભ્ય વડે કરાયેલ ફેરફારને {{GENDER:$1|[[User:$1|$1]]}} વડે કરેલ છેલ્લા પુનરાવર્તન પર પાછા લઇ જવાયું.',
 'rollback-success' => '$1 દ્વારા થયેલા ફેરફારો ઉલટાવાયા
 તેને $2 દ્વારા થયેલ સંપાદન સુધી લઇ જવાયું',
 
@@ -2479,7 +2490,7 @@ $1',
 'contributions' => '{{GENDER:$1|સભ્ય}}નું યોગદાન',
 'contributions-title' => 'સભ્ય $1નું યોગદાન',
 'mycontris' => 'યોગદાન',
-'contribsub2' => '$1 માટે ($2)',
+'contribsub2' => '($2) માટે {{GENDER:$3|$1}}',
 'nocontribs' => 'આ પરિમાણને મળતી પરિણામ નથી મળ્યાં',
 'uctop' => '(વર્તમાન)',
 'month' => ':મહિનાથી (અને પહેલાનાં)',
@@ -2500,7 +2511,7 @@ $1',
 તમરા સંદર્ભ માટે તાજી પ્રતિબંધ યાદિ આપી છે.',
 'sp-contributions-search' => 'યોગદાન શોધો',
 'sp-contributions-username' => 'IP સરનામું અથવા સભ્યનામ:',
-'sp-contributions-toponly' => 'તાàª\9cà«\87તરમાàª\82 àª¥àª¯à«\87લા àª«à«\87રફારà«\8b àª\9cબતાવો',
+'sp-contributions-toponly' => 'માતà«\8dર àª\9bà«\87લà«\8dલà«\80 àª\86વà«\83તà«\8dતિના àª«à«\87રફારà«\8b àª\9c àª¦àª°à«\8dશાવો',
 'sp-contributions-submit' => 'શોધો',
 
 # What links here
@@ -3789,7 +3800,10 @@ $5
 '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|ફેરફાર|ફેરફારો}}',
 
@@ -3941,7 +3955,9 @@ $5
 'rotate-comment' => 'ચિત્ર $1 {{PLURAL:$1|ડિગ્રી|ડિગ્રીઓ}} ઘડિયાળની દિશામાં ફેરવવામાં આવ્યું',
 
 # Limit report
+'limitreport-cputime' => 'CPU સમય વપરાશ',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|સેકંડ|સેકંડો}}',
+'limitreport-walltime' => 'ખરો સમય વપરાશ',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|સેકંડ|સેકંડો}}',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|બાઇટ|બાઇટ્સ}}',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|બાઇટ|બાઇટ્સ}}',
index 9500b3c..d26e1b7 100644 (file)
@@ -823,6 +823,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' => 'כתובת דוא"ל',
@@ -2578,9 +2581,11 @@ $UNWATCHURL
 'deleteotherreason' => 'סיבה נוספת/אחרת:',
 'deletereasonotherlist' => 'סיבה אחרת',
 'deletereason-dropdown' => '* סיבות מחיקה נפוצות
-** לבקשת הכותב
+** ספאם
+** השחתה
 ** הפרת זכויות יוצרים
-** השחתה',
+** לבקשת הכותב
+** הפניה שבורה',
 'delete-edit-reasonlist' => 'עריכת סיבות המחיקה',
 'delete-toobig' => 'דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקת דפים כאלה הוגבלה כדי למנוע פגיעה בביצועי האתר.',
 'delete-warning-toobig' => 'דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקה שלו עלולה להפריע לפעולות בבסיס הנתונים; אנא שקלו שנית את המחיקה.',
@@ -2738,7 +2743,7 @@ $1',
 'contributions' => 'תרומות {{GENDER:$1|המשתמש|המשתמשת}}',
 'contributions-title' => 'תרומות של המשתמש $1',
 'mycontris' => 'תרומות',
-'contribsub2' => 'עבור $1 ($2)',
+'contribsub2' => 'עבור {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'לא נמצאו שינויים המתאימים לקריטריונים אלו.',
 'uctop' => '(נוכחי)',
 'month' => 'עד החודש:',
@@ -3196,7 +3201,7 @@ $2',
 'tooltip-ca-nstab-main' => 'צפייה בדף התוכן',
 'tooltip-ca-nstab-user' => 'צפייה בדף המשתמש',
 'tooltip-ca-nstab-media' => 'צפייה בפריט המדיה',
-'tooltip-ca-nstab-special' => '×\96×\94×\95 ×\93×£ ×\9e×\99×\95×\97×\93, ×\90×\99 ×\90פשר לערוך אותו',
+'tooltip-ca-nstab-special' => '×\96×\94×\95 ×\93×£ ×\9e×\99×\95×\97×\93, ×\9c×\90 × ×\99ת×\9f לערוך אותו',
 'tooltip-ca-nstab-project' => 'צפייה בדף המיזם',
 'tooltip-ca-nstab-image' => 'צפייה בדף הקובץ',
 'tooltip-ca-nstab-mediawiki' => 'צפייה בהודעת המערכת',
@@ -4165,7 +4170,10 @@ $5
 'tags-tag' => 'שם התגית',
 'tags-display-header' => 'הופעה ברשימות השינויים',
 'tags-description-header' => 'תיאור מלא של המשמעות',
+'tags-active-header' => 'פעילה?',
 'tags-hitcount-header' => 'שינויים עם תגיות',
+'tags-active-yes' => 'כן',
+'tags-active-no' => 'לא',
 'tags-edit' => 'עריכה',
 'tags-hitcount' => '{{PLURAL:$1|שינוי אחד|$1 שינויים}}',
 
@@ -4211,7 +4219,7 @@ $5
 'sqlite-no-fts' => '$1 ללא תמיכה בחיפוש בטקסט מלא',
 
 # New logging system
-'logentry-delete-delete' => '$1 {{GENDER:$2|מחק|מחקה}} את הדף $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|מחק|מחקה}} את הדף $3&rlm;',
 'logentry-delete-restore' => '$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3&rlm;',
 'logentry-delete-event' => '$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
 'logentry-delete-revision' => '$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4',
@@ -4241,7 +4249,7 @@ $5
 'logentry-newusers-create2' => 'חשבון המשתמש $3 נוצר על ידי $1',
 'logentry-newusers-byemail' => 'חשבון המשתמש $3 נוצר על ידי $1 והסיסמה נשלחה בדוא"ל',
 'logentry-newusers-autocreate' => 'חשבון המשתמש $1 {{GENDER:$2|נוצר}} אוטומטית',
-'logentry-rights-rights' => '$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3 מ$4 ל$5',
+'logentry-rights-rights' => '$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3 מ$4 ל$5&rlm;',
 'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3',
 'logentry-rights-autopromote' => '$1 קודם אוטומטית מ$4 ל$5',
 'rightsnone' => '(כלום)',
index 91834c5..bf00410 100644 (file)
@@ -192,8 +192,8 @@ $messages = array(
 'tog-underline' => 'कड़ियाँ अधोरेखन:',
 'tog-justify' => 'परिच्छेद समान करें',
 'tog-hideminor' => 'हाल में हुए बदलावों में छोटे बदलाव छिपाएँ',
-'tog-hidepatrolled' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f बदलाव छिपाएँ',
-'tog-newpageshidepatrolled' => 'नà¤\8f à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95à¥\8b छिपाएँ',
+'tog-hidepatrolled' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤ªà¤°à¥\80à¤\95à¥\8dषित बदलाव छिपाएँ',
+'tog-newpageshidepatrolled' => 'नà¤\8f à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤ªà¤°à¥\80à¤\95à¥\8dषित à¤ªà¥\83षà¥\8dठ छिपाएँ',
 'tog-extendwatchlist' => 'केवल हालिया ही नहीं, बल्कि सभी परिवर्तनों को दिखाने के लिए ध्यानसूची को विस्तारित करें',
 'tog-usenewrc' => 'हाल में हुए परिवर्तनों में और ध्यानसूची में परिवर्तनों को पृष्ठ अनुसार समूहों में बाँटें',
 'tog-numberheadings' => 'शीर्षक स्व-क्रमांकित करें',
@@ -225,7 +225,7 @@ $messages = array(
 'tog-watchlisthideminor' => 'मेरी ध्यानसूची से छोटे परिवर्तन छिपाएँ',
 'tog-watchlisthideliu' => 'मेरी ध्यानसूची में सत्रारम्भित सदस्यों के सम्पादन न दिखाएँ',
 'tog-watchlisthideanons' => 'आइ॰पी सदस्यों द्वारा किए सम्पादनों को मेरी ध्यानसूची में न दिखाएँ',
-'tog-watchlisthidepatrolled' => 'à¤\9cाà¤\81à¤\9aà¥\87 à¤\97à¤\8f à¤¸à¤®à¥\8dपादनà¥\8bà¤\82 à¤\95à¥\8b à¤®à¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¨ à¤¦à¤¿à¤\96ाएँ',
+'tog-watchlisthidepatrolled' => 'परà¥\80à¤\95à¥\8dषित à¤¸à¤®à¥\8dपादन à¤®à¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9bà¥\81पाएँ',
 'tog-ccmeonemails' => 'मेरे द्वारा अन्य सदस्यों को भेजे ई-मेलों की प्रतियाँ मुझे भी भेजें',
 'tog-diffonly' => 'अवतरणों में अन्तर दर्शाते समय पुराने अवतरण न दिखाएँ',
 'tog-showhiddencats' => 'छिपाई हुई श्रेणियाँ दिखाएँ',
@@ -1559,9 +1559,9 @@ HTML टैग की जाँच करें।',
 'right-noratelimit' => 'रेट लिमिट्स से बेअसर हों',
 'right-import' => 'अन्य विकियों से पृष्ठ आयात करें',
 'right-importupload' => 'फ़ाइल अपलोड द्वारा पृष्ठ आयात करें',
-'right-patrol' => 'à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f चिन्हित करें',
-'right-autopatrol' => 'à¤\85पनà¥\87 à¤¸à¤®à¥\8dपादन à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f चिन्हित करें',
-'right-patrolmarks' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤\9cाà¤\81à¤\9a चिन्ह देखें',
+'right-patrol' => 'à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤ªà¤°à¥\80à¤\95à¥\8dषित चिन्हित करें',
+'right-autopatrol' => 'à¤\85पनà¥\87 à¤¸à¤®à¥\8dपादन à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤ªà¤°à¥\80à¤\95à¥\8dषित चिन्हित करें',
+'right-patrolmarks' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤ªà¤°à¥\80à¤\95à¥\8dषण चिन्ह देखें',
 'right-unwatchedpages' => 'ऐसे पृष्ठों की सूची देखें जो किसी की ध्यानसूची में नहीं हैं',
 'right-mergehistory' => 'पृष्ठ इतिहास एकत्रित करें',
 'right-userrights' => 'सभी सदस्य अधिकार बदलें',
@@ -1606,9 +1606,9 @@ HTML टैग की जाँच करें।',
 'action-protect' => 'इस पृष्ठ के सुरक्षा स्तर बदलने',
 'action-rollback' => 'किसी पृष्ठ का अंतिम सम्पादन करने वाले सदस्य के सम्पादन वापिस लेने',
 'action-import' => 'किसी और विकि से यह पृष्ठ आयात करने',
-'action-importupload' => 'फ़ाà¤\87ल à¤\85पलà¥\8bड à¤¦à¥\8dवारा à¤¯à¤¹ à¤ªà¥\83षà¥\8dठ à¤\86यात à¤\95रनà¥\87',
-'action-patrol' => 'à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f à¤\9aिनà¥\8dहित करने',
-'action-autopatrol' => 'à¤\85पनà¥\87 à¤¸à¤®à¥\8dपादन à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f à¤\9aिनà¥\8dहित करने',
+'action-importupload' => 'फ़ाइल अपलोड द्वारा यह पृष्ठ आयात करे',
+'action-patrol' => 'à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤ªà¤°à¥\80à¤\95à¥\8dषित करने',
+'action-autopatrol' => 'à¤\85पनà¥\87 à¤¸à¤®à¥\8dपादन à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤ªà¤°à¥\80à¤\95à¥\8dषित करने',
 'action-unwatchedpages' => 'ऐसे पृष्ठ जो किसी की ध्यानसूची में नहीं हैं की सूची देखने',
 'action-mergehistory' => 'इस पृष्ठ का इतिहास एकत्रित करने',
 'action-userrights' => 'सभी सदस्य अधिकार बदलने',
@@ -1627,6 +1627,7 @@ HTML टैग की जाँच करें।',
 'recentchanges' => 'हाल में हुए बदलाव',
 'recentchanges-legend' => 'हाल के परिवर्तन संबंधी विकल्प',
 'recentchanges-summary' => 'इस विकि पर हाल में हुए बदलाव इस पन्ने पर देखे जा सकते हैं।',
+'recentchanges-noresult' => 'इस अवधि के दौरान इन मापदंडों को पूर्ण करते कोई परिवर्तन नहीं किए गए हैं।',
 'recentchanges-feed-description' => 'इस विकि पर हाल में हुए बदलाव इस फ़ीड में देखे जा सकते हैं।',
 'recentchanges-label-newpage' => 'इस संपादन से नया पृष्ठ बना',
 'recentchanges-label-minor' => 'यह एक छोटा सम्पादन है',
@@ -1639,7 +1640,7 @@ HTML टैग की जाँच करें।',
 'rcshowhidebots' => 'बॉट $1',
 'rcshowhideliu' => 'लॉग्ड इन सदस्यों के बदलाव $1',
 'rcshowhideanons' => 'आइ॰पी सदस्यों के बदलाव $1',
-'rcshowhidepatr' => 'à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f सम्पादन $1',
+'rcshowhidepatr' => 'परà¥\80à¤\95à¥\8dषित सम्पादन $1',
 'rcshowhidemine' => 'मेरे बदलाव $1',
 'rclinks' => 'पिछले $2 दिनों में हुए $1 बदलाव दिखाएँ<br />$3',
 'diff' => 'अंतर',
@@ -2533,7 +2534,7 @@ $2 द्वारा संपादित अन्तिम अवतरण 
 'undeleteviewlink' => 'देखें',
 'undeletereset' => 'पूर्ववत करें',
 'undeleteinvert' => 'चुनाव उलटें',
-'undeletecomment' => 'à¤\9fिपà¥\8dपणà¥\80 à¤¹à¤\9fाना',
+'undeletecomment' => 'à¤\95ारण:',
 'undeletedrevisions' => '{{PLURAL:$1|एक रूपान्तर वापस लाया गया|$1 रूपान्तर वापस लाये गये}} है',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 अवतरण|$1 अवतरण}} और {{PLURAL:$2|1 फ़ाईल|$2 फ़ाइलें}} पुनर्स्थापित कर दियें',
 'undeletedfiles' => '{{PLURAL:$1|1 फ़ाईल|$1 फ़ाईलें}} पुनर्स्थापित',
@@ -2573,7 +2574,7 @@ $1',
 'contributions' => '{{GENDER:$1|सदस्य}} योगदान',
 'contributions-title' => '$1 के योगदान',
 'mycontris' => 'योगदान',
-'contribsub2' => '$1 के लिये ($2)',
+'contribsub2' => '{{GENDER:$3|$1}} ($2) के लिये',
 'nocontribs' => 'इन कसौटियों से मिलनेवाले बदलाव मिले नहीं।',
 'uctop' => '(मौजूदा)',
 'month' => 'इस महिनेसे (और पुरानें):',
@@ -3133,22 +3134,22 @@ $1 को बाध्य करने का कारण है: "$2"',
 'pageinfo-category-files' => 'फ़ाइलों की संख्या',
 
 # Patrolling
-'markaspatrolleddiff' => 'दà¥\87à¤\96 à¤²à¤¿à¤¯à¤¾ à¤\90सा à¤®à¤¾à¤°à¥\8dà¤\95 करें',
-'markaspatrolledtext' => 'à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¦à¥\87à¤\96 à¤²à¤¿à¤¯à¤¾ à¤\90सा à¤®à¤¾à¤°à¥\8dà¤\95 करें',
-'markedaspatrolled' => 'दà¥\87à¤\96 à¤²à¤¿à¤¯à¤¾ à¤\90सा à¤®à¤¾à¤°à¥\8dà¤\95 à¤\95रà¥\87à¤\82',
+'markaspatrolleddiff' => 'à¤\9cाà¤\81à¤\9aा à¤¹à¥\81à¤\86 à¤\9aिनà¥\8dहित करें',
+'markaspatrolledtext' => 'à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤\9cाà¤\81à¤\9aा à¤¹à¥\81à¤\86 à¤\9aिनà¥\8dहित करें',
+'markedaspatrolled' => 'à¤\9cाà¤\81à¤\9aा à¤¹à¥\81à¤\86 à¤\9aिनà¥\8dहित à¤\95िया',
 'markedaspatrolledtext' => '[[:$1]] का चयनित अवतरण जाँचा हुआ चिन्हित किया गया।',
-'rcpatroldisabled' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤ªà¤° à¤¨à¤\9cर à¤°à¤\96ना à¤¬à¤\82द à¤\95र à¤¦à¤¿à¤¯à¤¾ à¤¹à¥\88à¤\82',
-'rcpatroldisabledtext' => 'हाल में हुए बदलावोंपर नजर रखने की सुविधा बंद कर दी ग‍ईं हैं।',
-'markedaspatrollederror' => 'दà¥\87à¤\96 à¤²à¤¿à¤¯à¤¾ à¤\90सा à¤®à¤¾à¤°à¥\8dà¤\95 à¤¨à¤¹à¥\80à¤\82 à¤\95र à¤ªà¤¾à¤¯à¥\87à¤\82',
-'markedaspatrollederrortext' => 'नà¤\9cर à¤°à¤\96नà¥\87 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\86पà¤\95à¥\8b à¤\8fà¤\95 à¤\85वतरणà¤\95à¥\8b चुनना होगा।',
-'markedaspatrollederror-noautopatrol' => 'आप खुद अपने बदलावोंपर नजर नहीं रख सकतें हैं।',
+'rcpatroldisabled' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤\95ा à¤ªà¤°à¥\80à¤\95à¥\8dषण à¤\85à¤\95à¥\8dषम à¤¹à¥\88',
+'rcpatroldisabledtext' => 'हाल में हुए बदलावों के परीक्षण की सुविधा अभी अक्षम है।',
+'markedaspatrollederror' => 'à¤\9cाà¤\81à¤\9aा à¤¹à¥\81à¤\86 à¤\9aिनà¥\8dहित à¤¨à¤¹à¥\80à¤\82 à¤\95र à¤ªà¤¾à¤\8f',
+'markedaspatrollederrortext' => 'à¤\9cाà¤\81à¤\9aा à¤¹à¥\81à¤\86 à¤\9aिनà¥\8dहित à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\86पà¤\95à¥\8b à¤\8fà¤\95 à¤\85वतरण चुनना होगा।',
+'markedaspatrollederror-noautopatrol' => 'आपको अपने बदलाव परीक्षित करने की अनुमति नहीं है।',
 'markedaspatrollednotify' => '$1 पृष्ठ में किया गया ये बदलाव जाँचा हुआ चिन्हित कर दिया गया है।',
 'markedaspatrollederrornotify' => 'जाँचा हुआ चिन्हित करना असफल रहा।',
 
 # Patrol log
-'patrol-log-page' => 'नà¤\9cर à¤°à¤\96नà¥\87à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80',
-'patrol-log-header' => 'यह à¤¨à¤¿à¤\97रानà¥\80 à¤®à¥\87à¤\82 à¤¬à¤¨à¥\87 à¤¸à¤\82सà¥\8dà¤\95रणà¥\8bà¤\82 à¤\95ा à¤\9aिà¤\9fà¥\8dठा है।',
-'log-show-hide-patrol' => 'à¤\97शà¥\8dतà¥\80 à¤\85भिलà¥\87à¤\96 $1',
+'patrol-log-page' => 'परà¥\80à¤\95à¥\8dषण à¤²à¥\89à¤\97',
+'patrol-log-header' => 'यह à¤ªà¤°à¥\80à¤\95à¥\8dषित à¤\85वतरणà¥\8bà¤\82 à¤\95à¥\80 à¤²à¥\89à¤\97 है।',
+'log-show-hide-patrol' => 'परà¥\80à¤\95à¥\8dषण à¤²à¥\89à¤\97 $1',
 
 # Image deletion
 'deletedrevision' => 'पुराना अवतरण $1 हटा दिया',
@@ -4010,8 +4011,8 @@ $5
 'logentry-move-move-noredirect' => '$1 ने $3 पर पुनर्निर्देश छोड़े बिना उसे $4 पर {{GENDER:$2|स्थानांतरित}} किया',
 'logentry-move-move_redir' => '$1 ने $4 से पुनर्निर्देश हटाकर $3 को उसपर {{GENDER:$2|स्थानांतरित}} किया',
 'logentry-move-move_redir-noredirect' => '$1 ने $4 से पुनार्निर्देश हटाकर $3 पर पुनर्निर्देश छोड़े बिना $3 को $4 पर {{GENDER:$2|स्थानांतरित}} किया',
-'logentry-patrol-patrol' => '$1 à¤¨à¥\87 $3 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 $4 à¤\85वतरण à¤\95à¥\8b à¤¦à¥\87à¤\96ा à¤¹à¥\81à¤\86 {{GENDER:$2|चिन्हित}} किया',
-'logentry-patrol-patrol-auto' => '$1 à¤¨à¥\87 $3 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 $4 à¤\85वतरण à¤\95à¥\8b à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤¦à¥\87à¤\96ा à¤¹à¥\81à¤\86 {{GENDER:$2|चिन्हित}} किया',
+'logentry-patrol-patrol' => '$1 à¤¨à¥\87 $3 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 $4 à¤\85वतरण à¤\95à¥\8b à¤ªà¤°à¥\80à¤\95à¥\8dषित {{GENDER:$2|चिन्हित}} किया',
+'logentry-patrol-patrol-auto' => '$1 à¤¨à¥\87 $3 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 $4 à¤\85वतरण à¤\95à¥\8b à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤ªà¤°à¥\80à¤\95à¥\8dषित {{GENDER:$2|चिन्हित}} किया',
 'logentry-newusers-newusers' => 'सदस्य खाता $1 {{GENDER:$2|बनाया}} गया',
 'logentry-newusers-create' => 'सदस्य खाता $1 {{GENDER:$2|बनाया}} गया',
 'logentry-newusers-create2' => 'सदस्य खाता $3 $1 द्वारा {{GENDER:$2|बनाया}} गया था',
index d9de7db..0869055 100644 (file)
@@ -21,6 +21,7 @@
  * @author Herr Mlinka
  * @author Kaganer
  * @author Luka Krstulovic
+ * @author MaGa
  * @author MayaSimFan
  * @author Meno25
  * @author Mvrban
@@ -319,13 +320,13 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Podcrtane poveznice',
 'tog-justify' => 'Poravnaj odlomke i zdesna',
-'tog-hideminor' => 'Sakrij manje izmjene na stranici Nedavnih promjena',
+'tog-hideminor' => 'Sakrij manje izmjene u nedavnim promjenama',
 'tog-hidepatrolled' => 'Sakrij pregledane izmjene u nedavnim promjenama',
 'tog-newpageshidepatrolled' => 'Sakrij pregledane stranice iz popisa novih stranica',
 '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-usenewrc' => 'Grupne promjene po stranici u popisu nedavnih izmjena i popisu praćenih stranica (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)',
@@ -346,7 +347,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj suradnika koji prate stranicu (u nedavnim izmjenama, popisu praćenja i samim člancima)',
 'tog-oldsig' => 'Pregled postojećeg potpisa:',
 'tog-fancysig' => 'Običan potpis kao wikitekst (bez automatske poveznice)',
-'tog-uselivepreview' => 'Uključi trenutačni pretpregled (JavaScript) (eksperimentalno)',
+'tog-uselivepreview' => 'Uključi trenutačni pretpregled (zahtijeva JavaScript) (eksperimentalno)',
 'tog-forceeditsummary' => 'Podsjeti me ako sažetak uređivanja ostavljam praznim',
 'tog-watchlisthideown' => 'Sakrij moja uređivanja s popisa praćenja',
 'tog-watchlisthidebots' => 'Sakrij uređivanja botova s popisa praćenja',
@@ -359,13 +360,14 @@ $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',
 'underline-default' => 'Prema postavkama preglednika',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Uredi područje font stila:',
+'editfont-style' => 'Font u okviru za uređivanje',
 'editfont-default' => 'Prema postavkama preglednika',
 'editfont-monospace' => 'Font s jednakim razmakom',
 'editfont-sansserif' => 'Font Sans-serif',
@@ -459,6 +461,7 @@ $messages = array(
 'newwindow' => '(otvara se u novom prozoru)',
 'cancel' => 'Odustani',
 'moredotdotdot' => 'Više...',
+'morenotlisted' => 'Ovaj popis nije potpun.',
 'mypage' => 'Stranica',
 'mytalk' => 'Moj razgovor',
 'anontalk' => 'Razgovor za ovu IP adresu',
@@ -514,6 +517,7 @@ $messages = array(
 'create-this-page' => 'Započni ovu stranicu',
 'delete' => 'Izbriši',
 'deletethispage' => 'Izbriši ovu stranicu',
+'undeletethispage' => 'Vrati ovu stranicu',
 'undelete_short' => 'Vrati {{PLURAL:$1|$1 uređivanje|$1 uređivanja}}',
 'viewdeleted_short' => 'Prikaži $1 {{plural: $1|izbrisano uređivanje|izbrisana uređivanja|izbrisanih uređivanja}}',
 'protect' => 'Zaštiti',
@@ -643,6 +647,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 +725,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 +764,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',
@@ -824,7 +829,7 @@ Da bi spriječili zloupotrebu, moguće je poslati samo jedan e-mail za promjenu
 'mailerror' => 'Pogrješka pri slanju e-pošte: $1',
 'acct_creation_throttle_hit' => 'Posjetitelji ovog wikija koji rabe Vašu IP adresu napravili su {{PLURAL:$1|1 račun|$1 računa}} u posljednjem danu, što je najveći dopušteni broj u tom vremenskom razdoblju.
 Zbog toga posjetitelji s ove IP adrese trenutačno ne mogu otvoriti nove suradničke račune.',
-'emailauthenticated' => 'Vaša e-mail adresa je ovjerena $2 u $3.',
+'emailauthenticated' => 'vaša e-mail adresa je ovjerena $2 u $3.',
 'emailnotauthenticated' => 'Vaša e-mail adresa još nije ovjerena.
 Ne možemo poslati e-mail ni u jednoj od sljedećih naredbi.',
 'noemailprefs' => 'Nije navedena adresa elektroničke pošte, stoga sljedeće naredbe ne će raditi.',
@@ -841,7 +846,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).',
@@ -849,6 +854,7 @@ Molimo Vas pričekajte prije nego što pokušate ponovno.',
 # Email sending
 'php-mail-error-unknown' => 'Nepoznata pogrješka u funkciji PHP-poruke()',
 'user-mail-no-addy' => 'Pokušaj slanja e-maila bez e-mail adrese.',
+'user-mail-no-body' => 'Pokušali ste poslati e-mail bez sadržaja ili s prekratkim sadržajem.',
 
 # Change password dialog
 'resetpass' => 'Promijeni lozinku',
@@ -858,7 +864,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',
@@ -873,6 +879,7 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste zatražili novu priv
 'passwordreset-text-one' => 'Ispunite ovaj obrazac ako želite ponovno postaviti Vašu zaporku.',
 'passwordreset-legend' => 'Poništi lozinku',
 'passwordreset-disabled' => 'Poništavanje lozinke je onemogućeno na ovom wikiju.',
+'passwordreset-emaildisabled' => 'Funkcija e-pošte je onemogućena na ovom wikiju.',
 'passwordreset-username' => 'Suradničko ime:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'Pogledati krajnju poruku?',
@@ -994,7 +1001,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ć]]).
@@ -1325,6 +1332,7 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
 'compareselectedversions' => 'Usporedi odabrane inačice',
 'showhideselectedversions' => 'Otkrij/sakrij odabrane izmjene',
 'editundo' => 'ukloni ovu izmjenu',
+'diff-empty' => 'Nema razlike inačica',
 'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} {{PLURAL:$2|jednog|$2|$2}} suradnika)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} više od {{PLURAL:$2|jednog|$2|$2}} suradnika)',
 'difference-missing-revision' => '{{PLURAL:$2|Uređivanje|$2 uređivanja}} sljedeće šifre ($1) ne {{PLURAL:$2|postoji|postoje}}.
@@ -1433,7 +1441,7 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'stub-threshold-disabled' => 'Onemogućeno',
 'recentchangesdays' => 'Broj dana prikazanih u nedavnim promjenama:',
 'recentchangesdays-max' => '(maksimalno $1 {{PLURAL:$1|dan|dana}})',
-'recentchangescount' => 'Broj izmjena za prikaz kao zadano:',
+'recentchangescount' => 'Zadani broj izmjena koje se prikazuju:',
 'prefs-help-recentchangescount' => 'Ovo uključuje nedavne promjene, stare izmjene, i evidencije.',
 'savedprefs' => 'Vaše postavke su sačuvane.',
 'timezonelegend' => 'Vremenska zona:',
@@ -1479,10 +1487,10 @@ 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.',
+'prefs-help-gender' => 'Mogućnost softvera da ispravno oslovljava razlikujući spol. Ovaj podatak bit će javan.',
 'email' => 'Adresa elektroničke pošte *',
 'prefs-help-realname' => 'Pravo ime nije obvezno. Ako ga navedete, bit će korišteno za pravnu atribuciju Vaših doprinosa.',
 'prefs-help-email' => 'E-mail adresa nije obvezna, ali je potrebna za obnovu lozinke u slučaju da ju zaboravite.',
@@ -1493,17 +1501,18 @@ 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',
-'prefs-advancedrendering' => 'Napredne opcije',
-'prefs-advancedsearchoptions' => 'Napredne opcije',
-'prefs-advancedwatchlist' => 'Napredne opcije',
+'prefs-advancedrc' => 'Napredne mogućnosti',
+'prefs-advancedrendering' => 'Napredne mogućnosti',
+'prefs-advancedsearchoptions' => 'Napredne mogućnosti',
+'prefs-advancedwatchlist' => 'Napredne mogućnosti',
 'prefs-displayrc' => 'Prikaži opcije',
-'prefs-displaysearchoptions' => 'Opcije prikaza',
-'prefs-displaywatchlist' => 'Opcije prikaza',
+'prefs-displaysearchoptions' => 'Mogućnosti prikaza',
+'prefs-displaywatchlist' => 'Mogućnosti prikaza',
 'prefs-diffs' => 'razl',
+'prefs-help-prefershttps' => 'Ova mogućnost će stupiti na snagu kod sljedeće prijave.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Adresa e-pošte pokazuje se ispravnom',
@@ -1672,6 +1681,7 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}}',
+'enhancedrc-history' => 'povijest',
 'recentchanges' => 'Nedavne promjene',
 'recentchanges-legend' => 'Izbornik nedavnih promjena',
 'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne promjene u wikiju.',
@@ -1947,8 +1957,8 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
 'upload_source_file' => '(datoteka na Vašem računalu)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Ova posebna stranica pokazuje sve postavljene datoteke.
-Kad je filtriran po korisniku, popis prikazuje samo one datoteke čiju posljednju inačicu je postavio taj korisnik.',
+'listfiles-summary' => 'Ova stranica pokazuje sve postavljene datoteke.
+Kad je filtriran po suradniku, popis prikazuje samo one datoteke čije je posljednje inačice postavio taj suradnik.',
 'listfiles_search_for' => 'Traži ime slike:',
 'imgfile' => 'datoteka',
 'listfiles' => 'Popis slika',
@@ -1959,6 +1969,8 @@ Kad je filtriran po korisniku, popis prikazuje samo one datoteke čiju posljednj
 'listfiles_size' => 'Veličina (u bajtovima)',
 'listfiles_description' => 'Opis',
 'listfiles_count' => 'Inačice',
+'listfiles-latestversion-yes' => 'Da',
+'listfiles-latestversion-no' => 'Ne',
 
 # File description page
 'file-anchor-link' => 'Slika',
@@ -2052,6 +2064,9 @@ Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
 'randompage' => 'Slučajna stranica',
 'randompage-nopages' => 'Nema stranica u {{PLURAL:$2|imenskom prostoru|imenskim prostorima}}: $1.',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Idi',
+
 # Random redirect
 'randomredirect' => 'Slučajno preusmjeravanje',
 'randomredirect-nopages' => 'Nema preusmjeravanja u imenskom prostoru "$1".',
@@ -2077,6 +2092,7 @@ Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
 'statistics-users-active-desc' => 'Suradnici koji su napravili neku od radnji u posljednjih {{PLURAL:$1|dan|$1 dana}}',
 'statistics-mostpopular' => 'Najposjećenije stranice',
 
+'pageswithprop-prop' => 'Ime osobine:',
 'pageswithprop-submit' => 'Idi',
 
 'doubleredirects' => 'Dvostruka preusmjeravanja',
@@ -2455,6 +2471,7 @@ Pogledajte [[Special:ProtectedPages|zaštićene stranice]] za popis trenutačno
 'prot_1movedto2' => '$1 premješteno na $2',
 'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
 'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru ne mogu se zaštititi.',
+'protect-norestrictiontypes-title' => 'Stranicu nije moguće zaštititi',
 'protect-legend' => 'Potvrda zaštite',
 'protectcomment' => 'Razlog:',
 'protectexpiry' => 'Trajanje zaštite:',
@@ -3117,6 +3134,7 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
 'pageinfo-protect-cascading' => 'Prenosiva zaštita počinje od ove stranice',
 'pageinfo-protect-cascading-yes' => 'Da',
 'pageinfo-protect-cascading-from' => 'Prenosiva zaštita počinje od',
+'pageinfo-category-info' => 'Informacije o kategoriji',
 'pageinfo-category-pages' => 'Broj stranica',
 'pageinfo-category-subcats' => 'Broj podkategorija',
 'pageinfo-category-files' => 'Broj datoteka',
@@ -3426,7 +3444,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 +3707,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 +3964,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 +3986,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 +4004,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 +4098,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 37a9600..a6e681f 100644 (file)
@@ -1443,6 +1443,9 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
 'recentchangesdays-max' => '(maximum {{PLURAL:$1|egy|$1}} nap)',
 'recentchangescount' => 'Az alapértelmezettként mutatott szerkesztések száma:',
 'prefs-help-recentchangescount' => 'Ez vonatkozik a friss változtatásokra, laptörténetekre és naplókra is.',
+'prefs-help-watchlist-token2' => 'Ez a titkos kulcs a figyelőlistádhoz.
+Aki ismeri, meg tudja nézni, milyen lapokat figyelsz, úgyhogy ne oszdd meg másokkal.
+[[Special:ResetTokens|Kattints ide, ha meg akarod változtatni]].',
 'savedprefs' => 'Az új beállításaid érvénybe léptek.',
 'timezonelegend' => 'Időzóna:',
 'localtime' => 'Helyi idő:',
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 c308967..b070bde 100644 (file)
@@ -34,6 +34,7 @@
  * @author Rex
  * @author Rv77ax
  * @author Urhixidur
+ * @author William Surya Permana
  * @author לערי ריינהארט
  */
 
@@ -348,10 +349,10 @@ $messages = array(
 'tog-extendwatchlist' => 'Kembangkan daftar pantauan untuk menunjukkan semua perubahan, tidak hanya yang terbaru',
 'tog-usenewrc' => 'Kelompokkan suntingan di tampilan perubahan terbaru dan daftar pantauan berdasarkan halaman',
 'tog-numberheadings' => 'Beri nomor judul secara otomatis',
-'tog-showtoolbar' => 'Perlihatkan bilah alat penyuntingan',
-'tog-editondblclick' => 'Sunting halaman dengan klik ganda (JavaScript)',
+'tog-showtoolbar' => 'Tampilkan bilah alat penyuntingan',
+'tog-editondblclick' => 'Sunting halaman dengan klik ganda',
 'tog-editsection' => 'Fungsikan penyuntingan subbagian melalui pranala [sunting]',
-'tog-editsectiononrightclick' => 'Fungsikan penyuntingan subbagian dengan mengeklik kanan pada judul bagian (JavaScript)',
+'tog-editsectiononrightclick' => 'Fungsikan penyuntingan bagian dengan mengeklik kanan pada judul bagian',
 'tog-showtoc' => 'Perlihatkan daftar isi (untuk halaman yang mempunyai lebih dari 3 subbagian)',
 'tog-rememberpassword' => 'Ingat kata sandi saya di peramban ini (selama $1 {{PLURAL:$1|hari}})',
 'tog-watchcreations' => 'Tambahkan halaman yang saya buat ke daftar pantauan',
@@ -369,7 +370,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Tunjukkan jumlah pemantau',
 'tog-oldsig' => 'Tanda tangan sekarang:',
 'tog-fancysig' => 'Perlakukan tanda tangan sebagai teks wiki (tanpa suatu pranala otomatis)',
-'tog-uselivepreview' => 'Gunakan pratayang langsung (JavaScript) (eksperimental)',
+'tog-uselivepreview' => 'Gunakan pratayang langsung (eksperimental)',
 'tog-forceeditsummary' => 'Ingatkan saya bila kotak ringkasan suntingan masih kosong',
 'tog-watchlisthideown' => 'Sembunyikan suntingan saya di daftar pantauan',
 'tog-watchlisthidebots' => 'Sembunyikan suntingan bot di daftar pantauan',
@@ -383,6 +384,7 @@ $messages = array(
 'tog-noconvertlink' => 'Matikan konversi judul pranala',
 'tog-norollbackdiff' => 'Jangan tampilkan perbedaan setelah melakukan pengembalian',
 'tog-useeditwarning' => 'Ingatkan saya bila meninggalkan halaman penyuntingan sebelum menyimpan perubahan',
+'tog-prefershttps' => 'Selalu gunakan koneksi aman ketika masuk log',
 
 'underline-always' => 'Selalu',
 'underline-never' => 'Tidak pernah',
@@ -486,7 +488,7 @@ $messages = array(
 'newwindow' => '(buka di jendela baru)',
 'cancel' => 'Batalkan',
 'moredotdotdot' => 'Lainnya...',
-'morenotlisted' => 'Selanjutnya...',
+'morenotlisted' => 'Daftar ini belum lengkap.',
 'mypage' => 'Halaman',
 'mytalk' => 'Pembicaraan',
 'anontalk' => 'Pembicaraan IP ini',
@@ -589,7 +591,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' => 'Tentang {{SITENAME}}',
 'aboutpage' => 'Project:Perihal',
-'copyright' => 'Seluruh teks tersedia sesuai dengan $1.',
+'copyright' => 'Konten tersedia sesuai di bawah $1.',
 'copyrightpage' => '{{ns:project}}:Hak cipta',
 'currentevents' => 'Peristiwa terkini',
 'currentevents-url' => 'Project:Peristiwa terkini',
@@ -675,6 +677,12 @@ Daftar halaman istimewa yang sah dapat dilihat di [[Special:SpecialPages|{{int:s
 # General errors
 'error' => 'Kesalahan',
 'databaseerror' => 'Kesalahan basis data',
+'databaseerror-text' => 'Sebuah galat kueri basis data telah terjadi.
+Hal ini mungkin mengindikasikan ada kesalahan pada perangkat lunaknya.',
+'databaseerror-textcl' => 'Sebuah galat kueri basis data telah terjadi.',
+'databaseerror-query' => 'Kueri: $1',
+'databaseerror-function' => 'Fungsi: $1',
+'databaseerror-error' => 'Kesalahan: $1',
 'laggedslavemode' => 'Peringatan: Halaman mungkin tidak berisi perubahan terbaru.',
 'readonly' => 'Basis data dikunci',
 'enterlockreason' => 'Masukkan alasan penguncian, termasuk perkiraan kapan kunci akan dibuka',
@@ -790,6 +798,9 @@ Ingatlah bahwa beberapa halaman mungkin masih menampilkan anda seperti masih mas
 'userlogin-resetpassword-link' => 'Buat ulang kata sandi',
 'helplogin-url' => 'Help:Masuk log',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan masuk log]]',
+'userlogin-loggedin' => 'Andan telah masuk log sebagai $1.
+Gunakan formulir di bawah untuk masuk log sebagai pengguna lain.',
+'userlogin-createanother' => 'Buat akun lain',
 'createacct-join' => 'Masukkan informasi Anda di bawah ini.',
 'createacct-another-join' => 'Masukkan informasi akun baru di bawah ini.',
 'createacct-emailrequired' => 'Alamat surel',
@@ -867,11 +878,13 @@ Harap masukkan alamat surel dalam format yang benar atau kosongkan isian tersebu
 
 Anda dapat mengabaikan pesan ini jika akun ini dibuat karena suatu kesalahan.',
 'usernamehasherror' => 'Nama pengguna tidak bisa mengandung tanda pagar',
-'login-throttled' => 'Anda telah berkali-kali mencoba masuk log.
+'login-throttled' => 'Anda sudah terlalu sering mencoba masuk log.
 Silakan menunggu sebelum mencoba lagi.',
 'login-abort-generic' => 'Proses masuk Anda tidak berhasil - Dibatalkan',
 'loginlanguagelabel' => 'Bahasa: $1',
 'suspicious-userlogout' => 'Permintaan Anda untuk keluar log ditolak karena tampaknya dikirim oleh penjelajah yang rusak atau proksi penyinggah.',
+'createacct-another-realname-tip' => 'Nama asli bersifat opsional.
+Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan atas hasil kerja Anda.',
 
 # Email sending
 'php-mail-error-unknown' => 'Kesalahan yang tidak dikenal dalam fungsi mail() PHP',
@@ -887,7 +900,7 @@ Silakan menunggu sebelum mencoba lagi.',
 'newpassword' => 'Kata sandi baru:',
 'retypenew' => 'Ketik ulang kata sandi baru:',
 'resetpass_submit' => 'Atur kata sandi dan masuk log',
-'changepassword-success' => 'Kata sandi Anda telah berhasil diubah! Sekarang memproses masuk log Anda...',
+'changepassword-success' => 'Kata sandi Anda telah berhasil diubah!',
 'resetpass_forbidden' => 'Kata sandi tidak dapat diubah',
 'resetpass-no-info' => 'Anda harus masuk log untuk mengakses halaman ini secara langsung.',
 'resetpass-submit-loggedin' => 'Ganti kata sandi',
@@ -956,7 +969,7 @@ Anda harus melakukannya jika Anda secara tidak sengaja berbagi dengan seseorang
 'resettokens-legend' => 'Reset token',
 'resettokens-tokens' => 'Token:',
 'resettokens-token-label' => '$1 (nilai saat ini: $2)',
-'resettokens-watchlist-token' => 'Daftar pantauan token web feed',
+'resettokens-watchlist-token' => 'Token untuk sindikasi web (Atom/RSS) dari [[Special:Watchlist|perubahan di daftar pantauan Anda]]',
 'resettokens-done' => 'Reset token.',
 'resettokens-resetbutton' => 'Reset token yang dipilih',
 
@@ -1039,7 +1052,7 @@ Subbagian ini mungkin dipindahkan atau dihapus ketika Anda membukanya.',
 'loginreqlink' => 'masuk log',
 'loginreqpagetext' => 'Anda harus $1 untuk dapat melihat halaman lainnya.',
 'accmailtitle' => 'Kata sandi telah terkirim.',
-'accmailtext' => "Sebuah kata sandi acak untuk [[User talk:$1|$1]] telah dibuat dan dikirimkan ke $2.
+'accmailtext' => "Sebuah kata sandi acak untuk [[User talk:$1|$1]] telah dikirimkan ke $2.
 
 Kata sandi untuk akun baru ini dapat diubah di halaman ''[[Special:ChangePassword|pengubahan kata sandi]]'' setelah masuk log.",
 'newarticle' => '(Baru)',
@@ -1543,7 +1556,8 @@ Jangan lebih dari $1 {{PLURAL:$1|karakter|karakter}}.',
 'gender-unknown' => 'Tak dinyatakan',
 'gender-male' => 'Laki-laki',
 'gender-female' => 'Perempuan',
-'prefs-help-gender' => 'Opsional: digunakan untuk perbaikan penyebutan gender oleh perangkat lunak. Informasi ini akan terbuka untuk umum.',
+'prefs-help-gender' => 'Opsional: digunakan untuk perbaikan penyebutan jender oleh perangkat lunak. 
+Informasi ini akan terbuka untuk umum.',
 'email' => 'Surel',
 'prefs-help-realname' => 'Nama asli bersifat opsional.
 Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan atas hasil kerja Anda.',
@@ -1567,6 +1581,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'prefs-displaywatchlist' => 'Pilihan tampilan',
 'prefs-tokenwatchlist' => 'Tanda',
 'prefs-diffs' => 'Beda',
+'prefs-help-prefershttps' => 'Preferensi ini akan diaktifkan kali berikutnya Anda masuk log.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Alamat surel tampaknya sah',
@@ -1743,6 +1758,8 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sejak kunjungan terakhir}}',
+'enhancedrc-history' => 'riwayat',
 'recentchanges' => 'Perubahan terbaru',
 'recentchanges-legend' => 'Opsi perubahan terbaru',
 'recentchanges-summary' => "Temukan perubahan terbaru dalam wiki di halaman ini.<br />
@@ -1777,7 +1794,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'rc-change-size' => '$1',
 'rc-change-size-new' => '$1 {{PLURAL:$1|bita|bita}} setelah perubahan',
 'newsectionsummary' => '/* $1 */ bagian baru',
-'rc-enhanced-expand' => 'Tampilkan rincian (memerlukan JavaScript)',
+'rc-enhanced-expand' => 'Tampilkan rincian',
 'rc-enhanced-hide' => 'Sembunyikan rincian',
 'rc-old-title' => 'awalnya dibuat sebagai "$1"',
 
@@ -2036,7 +2053,7 @@ Untuk pilihan keamanan, img_auth.php dinonaktifkan.',
 
 # Special:ListFiles
 'listfiles-summary' => 'Halaman istimewa ini menampilkan semua berkas yang telah diunggah.
-Ketika disaring oleh pengguna, hanya vesi berkas terbaru dari berkas yang pengguna unggah yang ditampilkan.',
+Ketika disaring oleh pengguna, hanya versi berkas terbaru dari berkas yang diunggah oleh pengguna tersebut yang ditampilkan.',
 'listfiles_search_for' => 'Cari nama berkas:',
 'imgfile' => 'berkas',
 'listfiles' => 'Daftar berkas',
@@ -2047,6 +2064,10 @@ Ketika disaring oleh pengguna, hanya vesi berkas terbaru dari berkas yang penggu
 'listfiles_size' => 'Ukuran',
 'listfiles_description' => 'Deskripsi',
 'listfiles_count' => 'Versi',
+'listfiles-show-all' => 'Termasuk versi lama gambar',
+'listfiles-latestversion' => 'Versi terkini',
+'listfiles-latestversion-yes' => 'Ya',
+'listfiles-latestversion-no' => 'Tidak',
 
 # File description page
 'file-anchor-link' => 'Berkas',
@@ -2181,8 +2202,8 @@ Cek dahulu pranala lain ke templat tersebut sebelum menghapusnya.',
 'pageswithprop-text' => 'Halaman ini berisi daftar halaman yang menggunakan properti halaman tertentu.',
 'pageswithprop-prop' => 'Nama properti:',
 'pageswithprop-submit' => 'Lanjut',
-'pageswithprop-prophidden-long' => 'teks panjang nilai properti tersembunyi ($1 kilobita)',
-'pageswithprop-prophidden-binary' => 'nilai properti biner yang tersembunyi ($1 kilobita)',
+'pageswithprop-prophidden-long' => 'nilai properti teks panjang tersembunyi ($1 kilobita)',
+'pageswithprop-prophidden-binary' => 'nilai properti biner tersembunyi ($1 kilobita)',
 
 'doubleredirects' => 'Pengalihan ganda',
 'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
@@ -2256,6 +2277,7 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
 'listusers' => 'Daftar pengguna',
 'listusers-editsonly' => 'Tampilkan hanya pengguna yang memiliki kontribusi',
 'listusers-creationsort' => 'Urutkan menurut tanggal pendaftaran',
+'listusers-desc' => 'Urutkan menurun',
 'usereditcount' => '$1 {{PLURAL:$1|suntingan|suntingan}}',
 'usercreated' => '{{GENDER:$3|Dibuat}} pada $1 pukul $2',
 'newpages' => 'Halaman baru',
@@ -2542,7 +2564,7 @@ pengguna lain telah menyunting atau melakukan pengembalian terhadap halaman ini.
 Suntingan terakhir dilakukan oleh [[User:$3|$3]] ([[User talk:$3|bicara]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Komentar penyuntingan adalah: \"''\$1''\".",
 'revertpage' => '←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]',
-'revertpage-nouser' => 'Mengembalikan suntingan oleh pengguna tersembunyi ke suntingan terakhir oleh [[User:$1|$1]]',
+'revertpage-nouser' => 'Mengembalikan suntingan oleh (nama pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]',
 'rollback-success' => 'Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.',
 
 # Edit tokens
@@ -2678,7 +2700,7 @@ $1',
 'contributions' => 'Kontribusi {{GENDER:$1|pengguna}}',
 'contributions-title' => 'Kontribusi pengguna untuk $1',
 'mycontris' => 'Kontribusi',
-'contribsub2' => 'Untuk $1 ($2)',
+'contribsub2' => 'Untuk {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Tidak ada perubahan yang sesuai dengan kriteria tersebut.',
 'uctop' => '(saat ini)',
 'month' => 'Sejak bulan (dan sebelumnya):',
@@ -4164,7 +4186,10 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
 'tags-tag' => 'Nama tag',
 'tags-display-header' => 'Tampilan di daftar perubahan',
 'tags-description-header' => 'Deskripsi lengkap atau makna',
+'tags-active-header' => 'Aktif?',
 'tags-hitcount-header' => 'Perubahan bertag',
+'tags-active-yes' => 'Ya',
+'tags-active-no' => 'Tidak',
 'tags-edit' => 'sunting',
 'tags-hitcount' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
 
@@ -4185,6 +4210,7 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
 'dberr-problems' => 'Maaf! Situs ini mengalami masalah teknis.',
 'dberr-again' => 'Cobalah menunggu beberapa menit dan muat ulang.',
 'dberr-info' => '(Tak dapat tersambung dengan server basis data: $1)',
+'dberr-info-hidden' => '(Tidak dapat menghubungi peladen basis data)',
 'dberr-usegoogle' => 'Anda dapat mencoba pencarian melalui Google untuk sementara waktu.',
 'dberr-outofdate' => 'Harap diperhatikan bahwa indeks mereka terhadap isi kami mungkin sudah kedaluwarsa.',
 'dberr-cachederror' => 'Berikut adalah salinan tersimpan halaman yang diminta, dan mungkin bukan yang terbaru.',
@@ -4320,4 +4346,13 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
 # Image rotation
 'rotate-comment' => 'Gambar diputar $1 {{PLURAL:$1|derajat}} searah jarum jam',
 
+# Limit report
+'limitreport-cputime' => 'Penggunaan waktu CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|detik|detik}}',
+'limitreport-walltime' => 'Penggunaan waktu riil',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|detik|detik}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bita|bita}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bita|bita}}',
+'limitreport-expensivefunctioncount' => 'Perhitungan fungsi parser yang mahal',
+
 );
index de1e9a7..d87b481 100644 (file)
@@ -1468,8 +1468,8 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'action-block' => 'serraan daytoy nga agar-aramat manipud ti panag-urnos',
 'action-protect' => 'sukatan dagiti lessaad ti salaknib iti daytoy a panid',
 'action-rollback' => 'pardasan nga ipasubli dagiti inurnos ti kinaudi nga agar-aramat a nagurnos ti naisangsangayan a panid',
-'action-import' => 'agala ka ti panid iti sabali a wiki',
-'action-importupload' => 'alaem daytoy a panid idiay naipan a papeles',
+'action-import' => 'agala ti pampanid manipud ti sabali a wiki',
+'action-importupload' => 'agala ti pampanid manipud ti naipan a papeles',
 'action-patrol' => 'markaan a kas napatruliaan dagiti inurnos ti dadduma',
 'action-autopatrol' => 'markaam dagiti napatruliam nga inurnos',
 'action-unwatchedpages' => 'kitaen ti listaan dagiti saan a nabambantayan a panid',
@@ -2004,6 +2004,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'listusers' => 'Listaan dagiti agar-aramat',
 'listusers-editsonly' => 'Ipakita laeng dagiti agar-aramat nga adda inurnosda',
 'listusers-creationsort' => 'Ilasin no ania a petsa ti pannakaaramid',
+'listusers-desc' => 'Paglalasinen iti agpababa nga urnos',
 'usereditcount' => '$1 {{PLURAL:$1|nga inurnos|kadagiti inurnos}}',
 'usercreated' => '{{GENDER:$3|Inaramid}} idi $1 idi $2',
 'newpages' => 'Baro a pampanid',
@@ -2290,7 +2291,7 @@ adda sabali a naurnos wenno nagipasubli ti panid.
 Ti kinaudi a panagurnos ti daytoy a panid ket babaen ni [[User:$3|$3]] ([[User talk:$3|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Ti panagurnos a pakabuklan idi ket: \"''\$1''\".",
 'revertpage' => 'Insubli ti panagurnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli ti kinaudi a panagbaliw babaen ni [[User:$1|$1]]',
-'revertpage-nouser' => 'Naisubli ti panagurnos babaen ti nailemmeng nga agar-aramat iti kinaudi a panagbalbaliw babaen ni [[User:$1|$1]]',
+'revertpage-nouser' => 'Naisubli dagiti inurnos babaen ti nailemmeng nga agar-aramat iti kinaudi a panagbalbaliw babaen ni {{GENDER:$1|[[User:$1|$1]]}}',
 'rollback-success' => 'Naibabawi dagiti panag-urnos babaen ni $1;
 naisubli manen ti naudi a panagbaliw babaen ni $2.',
 
@@ -2436,7 +2437,7 @@ $1',
 'contributions' => 'Naar-aramid ti {{GENDER:$1|Agar-aramat}}',
 'contributions-title' => 'Inar-aramid ti agar-aramat para kenni $1',
 'mycontris' => 'Naar-aramid',
-'contribsub2' => 'Para iti $1 ($2)',
+'contribsub2' => 'Para kenni {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Awan ti nasarakan a nasukatan a kapada daytoy a kita.',
 'uctop' => '(agdama)',
 'month' => 'Manipud iti bulan ti (ken nasapsapa pay):',
@@ -3772,7 +3773,10 @@ Naka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
 'tags-tag' => 'Nagan ti etiketa',
 'tags-display-header' => 'Tabas dagiti listaan ti panagsukat',
 'tags-description-header' => 'Napno a panangipalpalawag iti kayatna a saoen.',
+'tags-active-header' => 'Aktibo?',
 'tags-hitcount-header' => 'Dagiti etiketa a sinukatan',
+'tags-active-yes' => 'Wen',
+'tags-active-no' => 'Saan',
 'tags-edit' => 'urnosen',
 'tags-hitcount' => '$1 {{PLURAL:$1|a sinukatan|kadagiti sinukatan}}',
 
index 5ce7498..e93d0c2 100644 (file)
@@ -1395,6 +1395,9 @@ Vu darfos adjuntar kauso en la rezumo.',
 # Spam protection
 'spamprotectiontitle' => 'Filtrilo kontre spamo',
 
+# Info page
+'pageinfo-toolboxlink' => 'Informo di ca pagino',
+
 # Browsing diffs
 'previousdiff' => '← Plu anciena versiono',
 'nextdiff' => 'Plu recenta versiono →',
index 0725aba..a625b42 100644 (file)
@@ -25,6 +25,7 @@
  * @author Dakrismeno
  * @author Danmaz74
  * @author Darth Kule
+ * @author DexterMorgan
  * @author F. Cosoleto
  * @author Felis
  * @author FollowTheMedia
@@ -291,7 +292,7 @@ $linkTrail = '/^([a-zàéèíîìóòúù]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sottolinea i collegamenti:',
-'tog-justify' => 'Allineamento dei paragrafi giustificato',
+'tog-justify' => 'Allineamento giustificato dei paragrafi',
 'tog-hideminor' => 'Nascondi le modifiche minori nelle ultime modifiche',
 'tog-hidepatrolled' => 'Nascondi le modifiche verificate nelle ultime modifiche',
 'tog-newpageshidepatrolled' => "Nascondi le pagine verificate dall'elenco delle pagine più recenti",
@@ -748,6 +749,9 @@ Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITEN
 'userlogin-resetpassword-link' => 'Reimposta la tua password',
 'helplogin-url' => 'Help:Login',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aiuto con il login]]',
+'userlogin-loggedin' => 'Sei già connesso come {{GENDER:$1|$1}}.
+Usa il modulo sottostante per accedere come altro utente.',
+'userlogin-createanother' => "Crea un'altra utenza",
 'createacct-join' => 'Inserisci i tuoi dati qui sotto.',
 'createacct-another-join' => 'Inserisci le informazioni per la registrazione qui sotto.',
 'createacct-emailrequired' => 'Indirizzo email',
@@ -2447,10 +2451,12 @@ Consultare il log delle $2 per un elenco delle pagine cancellate di recente.',
 'deletecomment' => 'Motivo:',
 'deleteotherreason' => 'Altra motivazione o motivazione aggiuntiva:',
 'deletereasonotherlist' => 'Altra motivazione',
-'deletereason-dropdown' => "*Motivazioni più comuni per la cancellazione
-** Richiesta dell'autore
+'deletereason-dropdown' => "* Motivazioni più comuni per la cancellazione
+** Spam
+** Vandalismo
 ** Violazione di copyright
-** Vandalismo",
+** Richiesta dell'autore
+** Redirect rotto",
 'delete-edit-reasonlist' => 'Modifica i motivi di cancellazione',
 'delete-toobig' => 'La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|revisione|revisioni}}). La sua cancellazione è stata limitata per evitare di creare accidentalmente dei problemi di funzionamento al database di {{SITENAME}}.',
 'delete-warning-toobig' => 'La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|revisione|revisioni}}). La sua cancellazione può creare dei problemi di funzionamento al database di {{SITENAME}}; procedere con cautela.',
@@ -2605,7 +2611,7 @@ $1',
 'contributions' => 'Contributi {{GENDER:$1|utente}}',
 'contributions-title' => 'Contributi di $1',
 'mycontris' => 'contributi',
-'contribsub2' => 'Per $1 ($2)',
+'contribsub2' => 'Per {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Non sono state trovate modifiche che soddisfino i criteri di ricerca.',
 'uctop' => '(attuale)',
 'month' => 'Dal mese (e precedenti):',
@@ -3958,7 +3964,10 @@ Questo programma deve essere distribuito assieme ad [{{SERVER}}{{SCRIPTPATH}}/CO
 'tags-tag' => "Nome dell'etichetta",
 'tags-display-header' => 'Aspetto nella lista delle modifiche',
 'tags-description-header' => 'Descrizione completa del significato',
+'tags-active-header' => 'Attivo?',
 'tags-hitcount-header' => 'Modifiche che hanno etichetta',
+'tags-active-yes' => 'Sì',
+'tags-active-no' => 'No',
 'tags-edit' => 'modifica',
 'tags-hitcount' => '$1 {{PLURAL:$1|modifica|modifiche}}',
 
index 4b08752..fddfca2 100644 (file)
@@ -742,8 +742,8 @@ URL を間違って入力したか、正しくないリンクをたどった可
 理由は不明です。',
 'no-null-revision' => 'ページ「$1」に新しい空編集の版を作成できませんでした。',
 'badtitle' => '正しくないページ名',
-'badtitletext' => '要求されたページ名は、無効、空、正しくない言語間リンク/ウィキ間リンクのページ名、のいずれかです。
-ページ名に使用できない文字が1つ以上含まれている可能性があります。',
+'badtitletext' => '無効または空のページ名が指定されたか、言語間/ウィキ間リンクの方法に誤りがあります。
+ページ名に使用できない文字が含まれている可能性があります。',
 'perfcached' => '以下のデータはキャッシュされており、最新ではない可能性があります。最大 $1 {{PLURAL:$1|件の結果}}がキャッシュされます。',
 'perfcachedts' => '以下のデータはキャッシュされており、最終更新日時は $1 です。最大 $4 {{PLURAL:$4|件の結果}}がキャッシュされます。',
 'querypage-no-updates' => 'ページの更新は無効になっています。
@@ -832,6 +832,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' => 'メールアドレス',
@@ -2633,9 +2636,11 @@ $UNWATCHURL
 'deleteotherreason' => '他の、または追加の理由:',
 'deletereasonotherlist' => 'その他の理由',
 'deletereason-dropdown' => '*よくある削除理由
-** 投稿者依頼
+** スパム
+** 荒らし
 ** 著作権侵害
-** 荒らし',
+** 投稿者依頼
+** 破損リダイレクト',
 'delete-edit-reasonlist' => '削除理由を編集',
 'delete-toobig' => 'このページには、$1版を超える編集履歴があります。
 このようなページの削除は、{{SITENAME}}の偶発的な問題を避けるため、制限されています。',
@@ -2805,7 +2810,7 @@ $1',
 'contributions' => '{{GENDER:$1|利用者}}の投稿記録',
 'contributions-title' => '$1の投稿記録',
 'mycontris' => '投稿記録',
-'contribsub2' => '利用者: $1 ($2)',
+'contribsub2' => '利用者: {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'これらの条件に一致する変更は見つかりませんでした。',
 'uctop' => '(最新)',
 'month' => 'この月以前:',
@@ -4320,7 +4325,10 @@ MediaWikiは、有用であることを期待して配布されていますが
 '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|回の変更}}',
 
index 291790a..b43f299 100644 (file)
@@ -507,6 +507,9 @@ $1',
 # General errors
 'error' => 'შეცდომა',
 'databaseerror' => 'შეცდომა მონაცემთა ბაზაში',
+'databaseerror-query' => 'მოთხოვნა: $1',
+'databaseerror-function' => 'ფუნქცია: $1',
+'databaseerror-error' => 'შეცდომა: $1',
 'laggedslavemode' => 'ყურადღება: გვერდი შესაძლოა არ შეიცავდეს ბოლო ცვლილებებს.',
 'readonly' => 'მონაცემთა ბაზა დახურულია',
 'enterlockreason' => 'მიუთიეთ ბლოკირების მიზეზი და ხანგრძლივობის ვადა',
@@ -595,6 +598,7 @@ $2',
 'yourname' => 'მომხმარებელი:',
 'userlogin-yourname' => 'მომხმარებლის სახელი',
 'userlogin-yourname-ph' => 'შეიყვანეთ თქვენი მომხმარებლის სახელი',
+'createacct-another-username-ph' => 'შეიყვანეთ მომხმარებლის სახელი',
 'yourpassword' => 'პაროლი:',
 'userlogin-yourpassword' => 'პაროლი',
 'userlogin-yourpassword-ph' => 'შეიყვანეთ თქვენი პაროლი',
@@ -631,6 +635,7 @@ $2',
 'createacct-emailrequired' => 'ელ. ფოსტის მისამართი',
 'createacct-emailoptional' => 'ელ. ფოსტის მისამართი (არასავალდებულო)',
 'createacct-email-ph' => 'შეიყვანეთ თქვენი ელ. ფოსტის მისამართი',
+'createacct-another-email-ph' => 'შეიყვანეთ ელ.ფოსტის მისამართი',
 'createaccountmail' => 'გამოიყენეთ შემთხვევითობის მეთოდით შერჩეული დროებითი პაროლი და მისი გაგზავნა ქვემოთ მითითებულ ელ. ფოსტის მისამართზე:',
 'createacct-realname' => 'ნამდვილი სახელი (არააუცილებელი)',
 'createaccountreason' => 'მიზეზი:',
@@ -639,6 +644,7 @@ $2',
 'createacct-captcha' => 'უსაფრთხოების შემოწმება',
 'createacct-imgcaptcha-ph' => 'შეიყვანეთ ზემოთ მოცემული ტექსტი',
 'createacct-submit' => 'შექმენით თქვენი ანგარიში',
+'createacct-another-submit' => 'სხვა ანგარიშის შექმნა',
 'createacct-benefit-heading' => '{{SITENAME}} შექმნილია თქვენნაირი ადამიანების მიერ.',
 'createacct-benefit-body1' => '{{PLURAL:$1|რედაქტირება|რედაქტირება}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|გვერდი|გვერდი}}',
@@ -791,6 +797,10 @@ $2
 'changeemail-submit' => 'ელ-ფოსტის შეცვლა',
 'changeemail-cancel' => 'გაუქმება',
 
+# Special:ResetTokens
+'resettokens-tokens' => 'ჟეტონები:',
+'resettokens-token-label' => '$1 (მიმდინარე მნიშვნელობა: $2)',
+
 # Edit page toolbar
 'bold_sample' => 'მუქი ტექსტი',
 'bold_tip' => 'მუქი ტექსტი',
@@ -981,8 +991,7 @@ $2
 
 გთხოვთ დაფიქრდეთ, მისაღები არის თუ არა ამ გვერდის რედაქტირების გაგრძელება.
 ინფორმაციისთვის ქვემოთ მოყვანილია ამ გვერდის წაშლის ისტორია:",
-'moveddeleted-notice' => 'ეს გვერდი წაიშალა
-ინფორმაციის მისაღებად ქვემოთ წარმდგენილია შესაბამისი ჩანაწერები წაშლისა და გადაქრმევის ჟურნალებიდან.',
+'moveddeleted-notice' => 'ეს გვერდი წაიშალა. ინფორმაციის მისაღებად ქვემოთ წარმდგენილია შესაბამისი ჩანაწერები წაშლისა და გადაქრმევის ჟურნალებიდან.',
 'log-fulllog' => 'ყველა ჟურნალის ხილვა',
 'edit-hook-aborted' => 'შესწორება გაუქმებულია გადამჭერით.
 დამატებითი ახსნა არ ჩაწერილა.',
@@ -1212,6 +1221,7 @@ $1",
 'compareselectedversions' => 'არჩეული ვერსიების შედარება',
 'showhideselectedversions' => 'ჩვენება/დამალვა არჩეული ვერსიებისა',
 'editundo' => 'გაუქმება',
+'diff-empty' => '(განსხვავება არ არის)',
 'diff-multi' => '({{PLURAL:$2|ერთი მომხმარებლის|$2 მომხმარებლების}} {{PLURAL:$1|ერთი შუალედური ვერსია|$1 შუალედური ვერსიები}} არ არის ნაჩვენები.)',
 'diff-multi-manyusers' => '({{PLURAL:$2|ერთი მომხმარებლის|$2 მომხმარებლების}} {{PLURAL:$1|ერთი შუალედური ვერსია|$1 შუალედური ვერსიები}}, რომლებიც არ არის ნაჩვენები.)',
 'difference-missing-revision' => '{{PLURAL:$2|$2 ვერსია}} ამ შედარებისათვის ($1) {{PLURAL:$2|ვერ მოიძებნა}}.
@@ -1369,10 +1379,10 @@ $1",
 'badsig' => 'არასწორი ნედლი ხელმოწერა; შეამოწმეთ HTML ჭდეები.',
 'badsiglength' => 'ხელმოწერა ძალიან გრძელია.
 უნდა შედგებოდეს მაქსიმუმ $1 ნიშნისაგან.',
-'yourgender' => 'á\83¡á\83¥á\83\94á\83¡á\83\98:',
+'yourgender' => 'á\83 á\83\9dá\83\9bá\83\94á\83\9aá\83\98 á\83\90á\83¦á\83¬á\83\94á\83 á\83\90 á\83£á\83¤á\83 á\83\9d á\83¨á\83\94á\83\92á\83\94á\83¤á\83\94á\83 á\83\94á\83\91á\83\90á\83\97 á\83\97á\83¥á\83\95á\83\94á\83\9c?',
 'gender-unknown' => 'მითითებას არ ვთვლი საჭიროდ',
-'gender-male' => 'ის არედაქტირებს ვიკი-გვერდებს',
-'gender-female' => 'ის არედაქტირებს ვიკი-გვერდებს',
+'gender-male' => 'ის (მამრობითი) არედაქტირებს ვიკი-გვერდებს',
+'gender-female' => 'ის (მდედრობითი) არედაქტირებს ვიკი-გვერდებს',
 'prefs-help-gender' => 'არასავალდებულო ველი: გამოიყენება პროგრამული უზრუნველყოფის იმ შეტყობინებებისთვის, რომლებიც ადამიანის სქესზეა დამოკიდებული.
 ეს ინფორმაცია საზოგადოებრივი  იქნება.',
 'email' => 'ელ. ფოსტა',
@@ -1387,6 +1397,7 @@ $1",
 'prefs-timeoffset' => 'სასაათო სარტყლის ცვლილება',
 'prefs-advancedediting' => 'მთავარი პარამეტრები',
 'prefs-editor' => 'რედაქტორი',
+'prefs-preview' => 'წინასწარი გადახედვა',
 'prefs-advancedrc' => 'გაფართოებული პარამეტრები',
 'prefs-advancedrendering' => 'გაფართოებული პარამეტრები',
 'prefs-advancedsearchoptions' => 'გაფართოებული პარამეტრები',
@@ -1394,6 +1405,7 @@ $1",
 'prefs-displayrc' => 'გამოსახვის კონფიგურაციები',
 'prefs-displaysearchoptions' => 'გამოსახვის კონფიგურაციები',
 'prefs-displaywatchlist' => 'გამოსახვის კონფიგურაციები',
+'prefs-tokenwatchlist' => 'ჟეტონი',
 'prefs-diffs' => 'სხვაობა ვერსიებს შორის',
 'prefs-help-prefershttps' => 'ამ კონფიგურაციის არჩევა შედეგს გამოიღებს შემდგომი ავტორიზაციის შედმეგ.',
 
@@ -1491,12 +1503,14 @@ $1",
 'right-unblockself' => 'საკუთარი თავის განბლოკვა',
 'right-protect' => 'გვერდების დაცვის დონის შეცვლა და დაცული გვერდების რედაქტირება',
 'right-editprotected' => 'გვერდების რედაქტირება რომლებიც დაცულია როგორც „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'გვერდების რედაქტირება რომლებიც დაცულია როგორც „{{int:protect-level-autoconfirmed}}“',
 'right-editinterface' => 'მომხმარებლის ინტერფეისის შეცვლა',
 'right-editusercssjs' => 'სხვა მომხმარებლების CSS- и JS- ფაილების შესწორება',
 'right-editusercss' => 'სხვა მომხმარებლების CSS- ფაილების შესწორება',
 'right-edituserjs' => 'სხვა მომხმარებლების JS- ფაილების შესწორება',
 'right-editmyusercss' => 'თქვენი საკუთარი CSS-ფაილების რედაქტირება',
 'right-editmyuserjs' => 'თქვენი საკუთარი JavaScript-ფაილების რედაქტირება',
+'right-viewmywatchlist' => 'თქვენი კონტროლის სიის ხილვა',
 'right-rollback' => 'გარკვეულ გვერდზე ბოლო მომხმარებლის რედაქტირების სწრაფი გაუქმება',
 'right-markbotedits' => 'გაუქმებული შესწორებების მონიშვნა როგორც ბოტის',
 'right-noratelimit' => 'სიჩქარის შეზღუდვის არ არსებობა',
@@ -1548,8 +1562,8 @@ $1",
 'action-block' => 'ამ მომხმარებლისთვის რედაქტირების დაბლოკვა',
 'action-protect' => 'ამ გვერდის დაცვის დონის შეცვლა',
 'action-rollback' => 'გარკვეულ გვერდზე ბოლო მომხმარებლის რედაქტირების სწრაფი გაუქმება',
-'action-import' => 'á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93ის იმპორტი სხვა ვიკიდან',
-'action-importupload' => 'á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93ის იმპორტი ატვირთული ფაილიდან',
+'action-import' => 'á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91ის იმპორტი სხვა ვიკიდან',
+'action-importupload' => 'á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91ის იმპორტი ატვირთული ფაილიდან',
 'action-patrol' => 'სხვა მომხმარებლის შესწორების მონიშვნა შემოწმებულად',
 'action-autopatrol' => 'თქვენი ცვლილების მონიშვნა პატრულირებადით',
 'action-unwatchedpages' => 'იმ გვერდების ხილვა, რომლებიც არავის კონტროლში არ არის შესული',
@@ -1559,10 +1573,14 @@ $1",
 'action-siteadmin' => 'მონაცემთა ბაზის დაბლოკვა და განბლოკვა',
 'action-sendemail' => 'ელ-ფოსტების გაგზავნა',
 'action-editmywatchlist' => 'თქვენი კონტროლის სიის რედაქტირება',
+'action-viewmywatchlist' => 'თქვენი კონტროლის სიის ხილვა',
+'action-viewmyprivateinfo' => 'თქვენი პირადი ინფორმაციის ხილვა',
 'action-editmyprivateinfo' => 'თქვენი პირადი ინფორმაციის რედაქტირება',
 
 # Recent changes
 'nchanges' => '$1 ცვლილება',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ბოლო ვიზიტის შემდეგ}}',
+'enhancedrc-history' => 'ისტორია',
 'recentchanges' => 'ბოლო ცვლილებები',
 'recentchanges-legend' => 'ბოლო ცვლილებების პარამეტრები',
 'recentchanges-summary' => 'უთვალთვალეთ ვიკიში ბოლო ცვლილებებს ამ გვერდზე.',
@@ -1615,7 +1633,7 @@ $1",
 'reuploaddesc' => 'გააუქმეთ ატვირთვა და დაუბრუნდით ატვირთვის ფორმას.',
 'upload-tryagain' => 'შეინახეთ ფაილის შეცვლილი აღწერა',
 'uploadnologin' => 'რეგისტრაცია არ გაქვთ გავლილი',
-'uploadnologintext' => 'ფაილის ასატვირთად თქვენ უნდა [[Special:UserLogin|შეხვიდეთ]] სისტემაში.',
+'uploadnologintext' => 'ფაილის ასატვირთად თქვენ უნდა $1.',
 'upload_directory_missing' => 'შესანახი დირექტორია ($1) არ არსებობს და მისი აღდგენა ვებ-სერვერის მიერ შეუძლებელია.',
 'upload_directory_read_only' => 'ვებსერვერი ვერ იწერს ატვირთვის დირექტორიაში ($1).',
 'uploaderror' => 'ატვირთვის შეცდომა',
@@ -1696,7 +1714,7 @@ $1",
 'uploadwarning' => 'გადატვირთვის შეხსენება',
 'uploadwarning-text' => 'გთხოვთ ჩაასწოროთ ფაილის აღწერა ქვევით და ხელმეორედ სცადოთ.',
 'savefile' => 'ფაილის შენახვა',
-'uploadedimage' => 'á\83\93á\83\90á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\90 "[[$1]]"',
+'uploadedimage' => 'á\83\90á\83\98á\83¢á\83\95á\83\98á\83 á\83\97á\83\90 â\80\9e[[$1]]â\80\9c',
 'overwroteimage' => 'ატვირთულია „[[$1]]-ის“ ახალი ვერსია',
 'uploaddisabled' => 'ატვირთვა შეუძლებელია',
 'copyuploaddisabled' => 'URL ატვირთვა გაღიშულია',
@@ -1858,6 +1876,9 @@ $1',
 'listfiles_size' => 'ზომა (ბაიტები)',
 'listfiles_description' => 'აღწერილობა',
 'listfiles_count' => 'ვერსიები',
+'listfiles-show-all' => 'სურათების ძველი ვერსიების ჩართვა',
+'listfiles-latestversion-yes' => 'დიახ',
+'listfiles-latestversion-no' => 'არა',
 
 # File description page
 'file-anchor-link' => 'ფაილი',
@@ -1954,6 +1975,9 @@ $1',
 'randompage' => 'ნებისმიერი გვერდი',
 'randompage-nopages' => '{{PLURAL:$2|სახელთა შემდეგი სივრცე|სახელთა შემდეგ სივრცეში}} "$1" არ არის გვერდები.',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'მიდი',
+
 # Random redirect
 'randomredirect' => 'ნებისმიერი გადამისამართება',
 'randomredirect-nopages' => 'სახელთა სივრცეში „$1“ არ არის გადამისამართებები.',
@@ -2960,6 +2984,7 @@ $2',
 'tooltip-undo' => 'შეტანილი ცვლილებების გაუქმება და წინასწარ გადახედვის ჩვენება, გაუქმების მიზეზის სქოლიოში ჩაწერასთან ერთად.',
 'tooltip-preferences-save' => 'შეინახეთ კონფიგურაცია',
 'tooltip-summary' => 'შეიყვანეთ მოკლე სქოლიო',
+'tooltip-iwiki' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/** აქ ჩასმული CSS გამოყენებული იქნება გაფორმების ყველა გარეკანზე */',
@@ -3013,12 +3038,12 @@ $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|დამკვირვებელი|დამკვირვებელი}}',
-'pageinfo-redirects-name' => 'გადამისამართება ამ გვერდზე',
+'pageinfo-redirects-name' => 'á\83\92á\83\90á\83\93á\83\90á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83 á\83\90á\83\9dá\83\93á\83\94á\83\9cá\83\9dá\83\91á\83\90 á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'ამ გვერდის ქვეგვერდები',
 'pageinfo-subpages-value' => '$1($2 {{PLURAL:$2|გადამისამართება|გადამისამართება}}; $3 {{PLURAL:$3|ჩვეულებრივი|ჩვეულებრივი}})',
@@ -3390,7 +3415,7 @@ $8',
 'exif-compression-34712' => 'JPEG2000',
 
 'exif-copyrighted-true' => 'საავტორო უფლებებით დაცული',
-'exif-copyrighted-false' => 'á\83¡á\83\90á\83\96á\83\9dá\83\92á\83\90á\83\93á\83\9dá\83\94á\83\91á\83 á\83\98á\83\95á\83\98 á\83\93á\83\9dá\83\9bá\83\94á\83\9cი',
+'exif-copyrighted-false' => 'á\83¡á\83\90á\83\90á\83\95á\83¢á\83\9dá\83 á\83\9d á\83£á\83¤á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98 á\83\90á\83  á\83\90á\83 á\83\98á\83¡ á\83\90á\83 á\83©á\83\94á\83£á\83\9aი',
 
 'exif-photometricinterpretation-2' => 'RGB',
 'exif-photometricinterpretation-6' => 'YCbCr',
@@ -3834,6 +3859,7 @@ $5
 'version-license' => 'ლიცენზია',
 'version-poweredby-credits' => "ეს ვიკი მუშაობს '''[//www.mediawiki.org/ MediaWiki]'''-ს ძრავზე, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'სხვები',
+'version-poweredby-translators' => 'translatewiki.net-ის მთარგმნელები',
 'version-credits-summary' => 'გვინდა მადლობა გადავუხადოთ შემდეგ მომხმარებლებს მათი წვლილისათვის [[Special:Version|მედიავიკის]] განვითარებაში.',
 'version-license-info' => 'MediaWiki არის თავისუფალი პროგრამული უზრუნველყოფა; შეგიძლიათ მისი გავრცელება ან/და მოდიფიცირება GNU General Public License ლიცენზიის პირობების შესაბამისად. როგორც გამოქვეყნებულია თავისუფალი პროგრამული უზრუნველყოფის ფონდის მიერ; ან ლიცენზიის მეორე ვერსიაში, ან (თქვენი აზრით) უფრო ახალში.
 
@@ -3906,11 +3932,14 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'tag-filter' => '[[Special:Tags|მონიშვნათა]] ფილტრი',
 'tag-filter-submit' => 'გაფილტვრა',
 'tags-title' => 'მონიშვნები',
-'tags-intro' => 'á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 á\83¬á\83\90á\83 á\83\9bá\83\9dá\83\93á\83\92á\83\94á\83\9cá\83\98á\83\9aá\83\98á\83\90 á\83\98á\83\9b á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\90á\83\97á\83\90 á\83¡á\83\98á\83\90, á\83 á\83\9dá\83\9bá\83\9aá\83\98á\83\97á\83\90á\83ª á\83\9eá\83 á\83\9dá\83\92á\83 á\83\90á\83\9bá\83£á\83\9aá\83\98 á\83£á\83\96á\83 á\83£á\83\9cá\83\95á\83\94á\83\9aá\83§á\83\9dá\83¤á\83\90 á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\9cá\83\90á\83\95á\83¡ á\83¨á\83\94á\83¡á\83¬á\83\9dá\83 á\83\94á\83\91á\83\94á\83\91á\83¡ á\83\93á\83\90 á\83\90á\83¡á\83\94á\83\95á\83\94 á\83\90á\83\9b á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\90á\83\97á\83\90 á\83\9bá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\94á\83\9aá\83\9dá\83\91á\83\94á\83\91á\83¡.',
+'tags-intro' => 'á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 á\83¬á\83\90á\83 á\83\9bá\83\9dá\83\93á\83\92á\83\94á\83\9cá\83\98á\83\9aá\83\98á\83\90 á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\90á\83\97á\83\90 á\83¡á\83\98á\83\90, á\83 á\83\9dá\83\9bá\83\9aá\83\98á\83\97á\83\90á\83ª á\83\9eá\83 á\83\9dá\83\92á\83 á\83\90á\83\9bá\83£á\83\9aá\83\98 á\83£á\83\96á\83 á\83£á\83\9cá\83\95á\83\94á\83\9aá\83§á\83\9dá\83¤á\83\90 á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\9cá\83\90á\83\95á\83¡ á\83¨á\83\94á\83¡á\83¬á\83\9dá\83 á\83\94á\83\91á\83\94á\83\91á\83¡, á\83\90á\83¡á\83\94á\83\95á\83\94 á\83\90á\83\9b á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\90á\83\97á\83\90 á\83\9bá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\94á\83\9aá\83\9dá\83\91á\83\90.',
 '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 ცვლილება',
 
@@ -3931,6 +3960,7 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'dberr-problems' => 'ბოდიში! საიტზე დროებითი ტექნიკური პრობლემებია',
 'dberr-again' => 'ეცადეთ რამდენიმე წუთით დაცდა და ამ გვერდის გადატვირთვა',
 'dberr-info' => 'ვერ მოხერხდა ინფორმაციის $1 სერვერთან დაკავშირება',
+'dberr-info-hidden' => '(მონაცემთა ბაზის სერვერთან დაკავშირება შეუძლებელია)',
 'dberr-usegoogle' => 'ამ დროს კი  შეგიძლიათ Google-ით ძიება',
 'dberr-outofdate' => 'გაითვალისწინეთ, რომ თქვენი კონტენტის ინდექსები შეიძლება შეუსაბამო იყოს',
 'dberr-cachederror' => 'ეს არის მოთხოვნილი გვერდის კეშირებული ვერსია, და შესაძლება მოძველდა.',
@@ -4066,4 +4096,10 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 # Image rotation
 'rotate-comment' => 'სურათი მოტრიალებულია $1 {{PLURAL:$1|გრადუსით|გრადუსით}} საათის ისრის მიმართულებით',
 
+# Limit report
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|წამი}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|წამი}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|ბაიტი}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|ბაიტი}}',
+
 );
index 918c89f..23528c1 100644 (file)
@@ -1048,6 +1048,8 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
 * Басқа беттерден [[Special:Search/{{PAGENAME}}|бұл бет атауын іздеу]],
 * <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Журналдардан бұл бетке қатысты сәйкес жазбаларды табу]</span>,
 * <span class=\"plainlinks\">'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Бұл бетті жаңадан бастау]'''</span>.",
+'noarticletext-nopermission' => 'Ағымда бұл бетте еш мәтін жоқ.
+Сіз [[Special:Search/{{PAGENAME}}|бұл бет атауын]] басқа беттерден іздей аласыз, немесе <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдардан бұл бетке қатысты сәйкес жазбаларды таба аласыз]</span>. Ал бұл бетті жаңадан бастауға сізде рұқсат жоқ.',
 'userpage-userdoesnotexist' => '«<nowiki>$1</nowiki>» қатысушы тіркелгісі жазып алынбаған. Бұл бетті бастау/өңдеу талабыңызды тексеріп шығыңыз.',
 'userpage-userdoesnotexist-view' => '«$1» қатысушы есімі тіркелмеген.',
 'blocked-notice-logextract' => 'Бұл қатысушы қазіргі уақытта  бұғатталған.
@@ -1360,6 +1362,7 @@ $1",
 'searchall' => 'барлық',
 'showingresults' => "Төменде нөмір '''$2''' орнынан бастап барынша '''$1''' нәтиже көрсетіледі.",
 'showingresultsnum' => "Төменде нөмір '''$2''' орнынан бастап '''$3''' нәтиже көрсетіледі.",
+'showingresultsheader' => "«'''$4'''» үшін {{PLURAL:$5|тек '''$1''' нәтиже табылды|табылған '''$3''' нәтиженің '''$1—$2''' аралығы көрсетілген}}",
 'nonefound' => "'''Аңғартпа''': Әдепкіден тек кейбір есім аялардан ізделінеді. Барлық мағлұмат түрін (соның ішінде талқылау беттерді, үлгілерді т.б.) іздеу үшін сұранымыңызды ''барлық:'' деп бастаңыз, немесе қалаған есім аясын бастауыш есебінде қолданыңыз.",
 'search-nonefound' => 'Сұрауға сәйкес нәтижелер табылмады.',
 'powersearch' => 'Кеңейтілген іздеу',
@@ -1686,7 +1689,7 @@ $1",
 'rc_categories_any' => 'Кез келген',
 'rc-change-size-new' => 'Өңдеуден кейінгі көлемі: $1{{PLURAL:$1|байт|байт}}',
 'newsectionsummary' => '/* $1 */ жаңа бөлім',
-'rc-enhanced-expand' => 'Толық ақпаратты көрсету (JavaScript-ті керек етеді)',
+'rc-enhanced-expand' => 'Толық ақпаратты көрсету',
 'rc-enhanced-hide' => 'Толық ақпаратты жасыру',
 'rc-old-title' => 'Бастапқы «$1» сияқты жасалған',
 
@@ -3403,7 +3406,7 @@ $1',
 
 # External editor support
 'edit-externally' => 'Бұл файлды шеттік қондырма арқылы өңдеу',
-'edit-externally-help' => '(көбірек ақпарат үшін [//www.mediawiki.org/wiki/Manual:External_editors орнату нұсқауларын] қараңыз.',
+'edit-externally-help' => '(көбірек ақпарат үшін [//www.mediawiki.org/wiki/Manual:External_editors орнату нұсқауларын] қараңыз)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'барлық',
index 5f0e462..b962cdd 100644 (file)
@@ -285,7 +285,7 @@ $messages = array(
 'tog-previewontop' => 'បង្ហាញ​ការមើលមុន​ពីលើ​ប្រអប់​កែប្រែ',
 'tog-previewonfirst' => 'បង្ហាញ​ការមើលមុនសម្រាប់កំណែប្រែ​ដំបូងគេ',
 'tog-nocache' => 'មិនប្រើសតិភ្ជាប់​នៃ​ទំព័រ',
-'tog-enotifwatchlistpages' => 'ផ្ញើá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\98á\9e¶á\9e\93á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\93á\9f\83á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\8eá\9e¶á\9e\98á\9e½á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86',
+'tog-enotifwatchlistpages' => 'ផ្ញើâ\80\8bá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bâ\80\8bá\9e\98á\9e\80â\80\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bâ\80\8bá\9e\80á\9e¶á\9e\9bâ\80\8bá\9e\94á\9e¾â\80\8bâ\80\8bá\9e\98á\9e¶á\9e\93â\80\8bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\93á\9f\83â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\8eá\9e¶â\80\8bá\9e\98á\9e½á\9e\99â\80\8bá\9e\8aá\9f\82á\9e\9bâ\80\8bá\9e\98á\9e¶á\9e\93â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¸â\80\8bá\9e\8fá\9e¶á\9e\98â\80\8bá\9e\8aá\9e¶á\9e\93â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bâ\80\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86',
 'tog-enotifusertalkpages' => 'ផ្ញើអ៊ីមែល​មកខ្ញុំ​កាលបើ​មានបន្លាស់ប្ដូរ​នៅ​ក្នុងទំព័រពិភាក្សា​របស់ខ្ញុំ',
 'tog-enotifminoredits' => 'ផ្ញើអ៊ីមែល​មកខ្ញុំពេលមានបន្លាស់ប្ដូរតិចតួច​លើទំព័រឬឯកសារផងដែរ​',
 'tog-enotifrevealaddr' => 'បង្ហាញ​អាសយដ្ឋានអ៊ីមែល​របស់ខ្ញុំ​ក្នុង​​អ៊ីមែល​ក្រើនរំលឹក​',
@@ -326,13 +326,13 @@ $messages = array(
 'thursday' => 'ថៃ្ងព្រហស្បតិ៍',
 'friday' => 'ថ្ងៃសុក្រ',
 'saturday' => 'ថ្ងៃសៅរ៍',
-'sun' => 'អាទិត្យ',
-'mon' => 'ច័ន្ទ',
-'tue' => 'អង្គារ',
-'wed' => 'ពុ',
-'thu' => 'ព្រហស្បតិ៍',
-'fri' => 'សុក្រ',
-'sat' => 'សៅរ៍',
+'sun' => 'អា',
+'mon' => 'ច',
+'tue' => 'អ',
+'wed' => 'ពុ',
+'thu' => 'ព្រ',
+'fri' => 'សុ',
+'sat' => 'ស',
 'january' => 'ខែមករា',
 'february' => 'ខែកុម្ភៈ',
 'march' => 'ខែមីនា',
@@ -345,18 +345,18 @@ $messages = array(
 'october' => 'ខែតុលា',
 'november' => 'ខែវិច្ឆិកា',
 'december' => 'ខែធ្នូ',
-'january-gen' => 'á\9e\81á\9f\82á\9e\98á\9e\80á\9e\9aá\9e¶',
-'february-gen' => 'á\9e\81á\9f\82á\9e\80á\9e»á\9e\98á\9f\92á\9e\97á\9f\88',
-'march-gen' => 'á\9e\81á\9f\82á\9e\98á\9e¸á\9e\93á\9e¶',
-'april-gen' => 'á\9e\81á\9f\82á\9e\98á\9f\81á\9e\9fá\9e¶',
-'may-gen' => 'á\9e\81á\9f\82á\9e§á\9e\9fá\9e\97á\9e¶',
-'june-gen' => 'á\9e\81á\9f\82á\9e\98á\9e·á\9e\90á\9e»á\9e\93á\9e¶',
-'july-gen' => 'á\9e\81á\9f\82á\9e\80á\9e\80á\9f\92á\9e\80á\9e\8aá\9e¶',
-'august-gen' => 'á\9e\81á\9f\82á\9e\9fá\9e¸á\9e á\9e¶',
-'september-gen' => 'á\9e\81á\9f\82á\9e\80á\9e\89á\9f\92á\9e\89á\9e¶',
-'october-gen' => 'á\9e\81á\9f\82á\9e\8fá\9e»á\9e\9bá\9e¶',
-'november-gen' => 'á\9e\81á\9f\82á\9e\9cá\9e·á\9e\85á\9f\92á\9e\86á\9e·á\9e\80á\9e¶',
-'december-gen' => 'á\9e\81á\9f\82á\9e\92á\9f\92á\9e\93á\9e¼',
+'january-gen' => 'មករា',
+'february-gen' => 'កុម្ភៈ',
+'march-gen' => 'មីនា',
+'april-gen' => 'មេសា',
+'may-gen' => 'ឧសភា',
+'june-gen' => 'មិថុនា',
+'july-gen' => 'កក្កដា',
+'august-gen' => 'សីហា',
+'september-gen' => 'កញ្ញា',
+'october-gen' => 'តុលា',
+'november-gen' => 'វិច្ឆិកា',
+'december-gen' => 'ធ្នូ',
 'jan' => 'មករា',
 'feb' => 'កុម្ភៈ',
 'mar' => 'មីនា',
@@ -384,7 +384,7 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ចំណាត់ថ្នាក់ក្រុម|ចំណាត់ថ្នាក់ក្រុម}}',
-'category_header' => 'ទំព័រដែលមាន​ក្នុងចំណាត់ថ្នាក់ក្រុម"$1"',
+'category_header' => 'ទំព័រ​ក្នុង​ចំណាត់​ថ្នាក់​ក្រុម "$1"',
 'subcategories' => 'កូនចំណាត់ថ្នាក់ក្រុម',
 'category-media-header' => 'ឯកសារមេឌា​ដែលមានក្នុង​ចំណាត់ថ្នាក់ក្រុម "$1"',
 'category-empty' => "''ចំណាត់ថ្នាក់ក្រុមនេះ​មិនមានផ្ទុកអត្ថបទឬ​ឯកសារមេឌា​ណាមួយទេ។''",
@@ -1991,12 +1991,12 @@ $1',
 'sharedupload' => 'ឯកសារ​នេះ​​បាន​មក​ពី $1 និង​អាច​ត្រូវ​បាន​ប្រើប្រាស់​នៅ​គម្រោង​ដទៃ​ទៀត។',
 'sharedupload-desc-there' => 'ឯកសារ​នេះ​មក​ពី ​$1 និង​អាច​ត្រូវ​បាន​ប្រើប្រាស់​ដោយ​គម្រោង​ផ្សេង​ៗ​ដទៃ​ទៀត​។
 សូម​មើល​[ទំព័របរិយាយ​ឯកសារ​ $2] សម្រាប់​ព័ត៌មាន​បន្ថែម​។',
-'sharedupload-desc-here' => 'ឯកសារនេះមានប្រភពមកពី $1  និងអាចត្រូវបានប្រើដោយគម្រោងដ៏ទៃទៀត។
-ការពណ៌នានៅលើ[$2 ទំព័រពណ៌នា]អំពីវា មានបង្ហាញខាងក្រោមនេះ។',
-'sharedupload-desc-edit' => 'ឯកសារនេះមានប្រភពមកពី $1  និងអាចត្រូវបានប្រើដោយគម្រោងដ៏ទៃទៀត។
-ប្រហែលជាអ្នកចង់កែប្រែការពណ៌នានៅលើ[$2 ទំព័រពណ៌នា]អំពីវានៅទីនោះ។',
-'sharedupload-desc-create' => 'ឯកសារនេះមានប្រភពមកពី $1  និងអាចត្រូវបានប្រើដោយគម្រោងដ៏ទៃទៀត។
-ប្រហែលជាអ្នកកែប្រែការពណ៌នានៅលើ[$2 ទំព័រពណ៌នា]អំពីវានៅទីនោះ។',
+'sharedupload-desc-here' => 'ឯកសារ​នេះ​មាន​ប្រភព​មក​ពី $1  និង​អាច​ត្រូវ​បាន​ប្រើ​ដោយ​គម្រោង​ដទៃ​ទៀត។
+ការ​ពណ៌នា​នៅ​លើ[$2 ទំព័រពណ៌នា]អំពី​វា មាន​បង្ហាញ​ខាង​ក្រោម​នេះ។',
+'sharedupload-desc-edit' => 'ឯកសារ​នេះ​មាន​ប្រភព​មក​ពី $1  និង​អាច​ត្រូវ​បាន​ប្រើ​ដោយ​គម្រោង​ដទៃ​ទៀត។
+ប្រហែល​ជា​អ្នក​ចង់​កែប្រែ​ការ​ពណ៌នា​នៅ​លើ[$2 ទំព័រពណ៌នា]អំពី​វា​នៅ​ទី​នោះ។',
+'sharedupload-desc-create' => 'ឯកសារ​នេះ​មាន​ប្រភព​មក​ពី $1  និង​អាច​ត្រូវ​បាន​ប្រើ​ដោយ​គម្រោង​ដទៃ​ទៀត។
+ប្រហែល​ជា​អ្នក​ចង់​កែប្រែ​ការ​ពណ៌នា​នៅ​លើ[$2 ទំព័រពណ៌នា]អំពី​វា​នៅ​ទី​នោះ។',
 'filepage-nofile' => 'គ្មានឯកសារ​ដែលមានឈ្មោះនេះទេ។',
 'filepage-nofile-link' => 'គ្មានរូបភាពដែលមានឈ្មោះនេះទេ។ ប៉ុន្តែអ្នកអាច[$1 ផ្ទុក​វា​ឡើង​] ។',
 'uploadnewversion-linktext' => 'ផ្ទុកឡើងមួយកំណែថ្មីនៃឯកសារនេះ',
index 3d68e3b..fc1999f 100644 (file)
@@ -19,6 +19,7 @@
  * @author Gjue
  * @author Ha98574
  * @author Hoo
+ * @author Hym411
  * @author IRTC1015
  * @author ITurtle
  * @author Idh0854
@@ -804,7 +805,7 @@ $2',
 'userlogin-noaccount' => '계정이 없나요?',
 'userlogin-joinproject' => '{{SITENAME}}에 가입하세요',
 'nologin' => '계정이 없나요? $1.',
-'nologinlink' => 'ê³\84ì \95ì\9d\84 ë§\8cë\93¤ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤',
+'nologinlink' => 'ê³\84ì \95ì\9d\84 ë§\8cë\93\9cì\84¸ì\9a\94',
 'createaccount' => '계정 만들기',
 'gotaccount' => '계정이 이미 있다면, $1.',
 'gotaccountlink' => '로그인하세요',
@@ -812,6 +813,8 @@ $2',
 'userlogin-resetpassword-link' => '내 비밀번호 재설정',
 'helplogin-url' => 'Help:로그인',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|로그인에 관한 도움말]]',
+'userlogin-loggedin' => '이미 $1로 로그인되어 있습니다. 아래의 양식으로 다른 계정으로 로그인하세요.',
+'userlogin-createanother' => '다른 계정 만들기',
 'createacct-join' => '아래에 정보를 입력하세요.',
 'createacct-another-join' => '아래에 새 계정의 정보를 입력하세요.',
 'createacct-emailrequired' => '이메일 주소',
@@ -1180,7 +1183,7 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'hiddencategories' => '이 문서는 다음 {{PLURAL:$1|숨은 분류 1개|숨은 분류 $1개}}에 속해 있습니다:',
 'edittools' => '<!-- 이 문서는 편집 창과 파일 올리기 창에 출력됩니다. -->',
 'nocreatetext' => '{{SITENAME}}에서 새로운 문서를 만드는 것은 제한되어 있습니다.
-이미 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그인하거나 계정을 만들 수 있습니다]].',
+이미 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그인하거나 계정을 만들]] 수 있습니다.',
 'nocreate-loggedin' => '새 문서를 만들 권한이 없습니다.',
 'sectioneditnotsupported-title' => '부분 편집 지원 안됨',
 'sectioneditnotsupported-text' => '이 문서에서는 문단 편집을 지원하지 않습니다.',
@@ -1418,7 +1421,7 @@ $1",
 'mergelogpagetext' => '다음은 한 문서의 역사를 다른 문서의 역사와 합친 최근 기록입니다.',
 
 # Diffs
-'history-title' => '"$1"ì\9d\98 í\8c\90 ë\82´ì\97­',
+'history-title' => '"$1"ì\9d\98 í\8e¸ì§\91 ì\97­ì\82¬',
 'difference-title' => '"$1"의 두 판 사이의 차이',
 'difference-title-multipage' => '"$1" 문서와 "$2" 문서 사이의 차이',
 'difference-multipage' => '(문서 사이의 차이)',
@@ -2593,10 +2596,12 @@ $UNWATCHURL
 'deletecomment' => '이유:',
 'deleteotherreason' => '다른 이유/추가적인 이유:',
 'deletereasonotherlist' => '다른 이유',
-'deletereason-dropdown' => '*일반적인 삭제 이유
-** 작성자의 요청
+'deletereason-dropdown' => '* 일반적인 삭제 이유
+** 스팸
+** 훼손 행위
 ** 저작권 침해
-** 훼손 행위',
+** 작성자의 요청
+** 깨진 넘겨주기',
 'delete-edit-reasonlist' => '삭제 이유 편집',
 'delete-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
 편집 역사가 긴 문서를 삭제하면 {{SITENAME}}에 큰 혼란을 줄 수 있기 때문에 삭제할 수 없습니다.',
@@ -2764,7 +2769,7 @@ $1',
 'contributions' => '{{GENDER:$1|사용자}} 기여',
 'contributions-title' => '$1 사용자의 기여 목록',
 'mycontris' => '기여 목록',
-'contribsub2' => '$1($2)의 기여',
+'contribsub2' => '{{GENDER:$3|$1}}($2)의 기여',
 'nocontribs' => '지정한 조건과 일치하는 바뀜을 찾을 수 없습니다.',
 'uctop' => '(최신)',
 'month' => '월:',
@@ -3250,6 +3255,7 @@ $2',
 'tooltip-undo' => '"편집 취소" 기능을 사용하면 이 편집이 되돌려지고 차이 보기 기능이 미리 보기 형식으로 나타납니다. 편집 요약에 이 편집을 왜 되돌리는지에 대한 이유를 쓸 수 있습니다.',
 'tooltip-preferences-save' => '환경 설정 저장하기',
 'tooltip-summary' => '짧은 요약을 적어주세요',
+'tooltip-iwiki' => '$2 - $1',
 
 # Stylesheets
 'common.css' => '/* 이 CSS 설정은 모든 스킨에 동일하게 적용됩니다 */',
@@ -4151,7 +4157,10 @@ $5
 '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|바뀜}}',
 
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 8464587..ff7a910 100644 (file)
@@ -169,7 +169,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Redactiones censae inter nuper mutatas celandae',
 'tog-newpageshidepatrolled' => 'Paginae censae inter nouissime creatas celandae',
 'tog-extendwatchlist' => 'Indicem paginarum obseruandarum cunctas mutatas praeter nouissimas includere decet',
-'tog-usenewrc' => 'Indice nuper mutatarum excelsa uti (JavaScript necesse est)',
+'tog-usenewrc' => 'Indice nuper mutatarum excelsa uti',
 'tog-numberheadings' => 'Subtituli numeris adornandi',
 'tog-showtoolbar' => 'Affigere trabem redigentem',
 'tog-editondblclick' => 'Percussus duplex redactionem hortetur',
@@ -390,7 +390,7 @@ $messages = array(
 # 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' => 'De {{grammar:ablative|{{SITENAME}}}}',
 'aboutpage' => 'Project:De {{GRAMMAR:ablative|{{SITENAME}}}}',
-'copyright' => 'Res ad manum sub $1.',
+'copyright' => 'Res ad manum sub $1 nisi aliter denuntiatum est.',
 'copyrightpage' => '{{ns:project}}:Verba privata',
 'currentevents' => 'Novissima',
 'currentevents-url' => 'Project:Novissima',
@@ -1001,7 +1001,7 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 {{PLURAL:$1|Una littera est|$1 litterae sunt}} longitudo maxima.',
 'yourgender' => 'Sexus:',
 'gender-unknown' => 'Indefinitus',
-'gender-male' => 'Mas',
+'gender-male' => 'Masculinum',
 'gender-female' => 'Femina',
 'email' => 'Litterae electronicae',
 'prefs-help-realname' => 'Nomen verum non necesse est.
@@ -1427,7 +1427,7 @@ Fortasse [$2 paginam descriptionis fasciculi] ibi sitam recensere vis.',
 
 # Special:Log
 'specialloguserlabel' => 'Usor:',
-'speciallogtitlelabel' => 'Titulus:',
+'speciallogtitlelabel' => 'Destinatum (titulus aut usor):',
 'log' => 'Acta',
 'all-logs-page' => 'Acta publica omnia',
 'alllogstext' => 'Ostentantur omnia acta {{grammar:genitive|{{SITENAME}}}}.
@@ -1610,9 +1610,11 @@ Adfirma quaesumus te paginam re vera delere velle, te consequentias intellere, e
 'deleteotherreason' => 'Causa alia vel explicatio:',
 'deletereasonotherlist' => 'Causa alia',
 'deletereason-dropdown' => '*Causae deletionum communes
-** Desiderium auctoris
+** Spam
+** Vandalismus
 ** Violatio verborum privatorum
-** Vandalismus',
+** Desiderium auctoris
+** Redirectio fracta',
 'delete-edit-reasonlist' => 'Causas deletionum recensere',
 
 # Rollback
@@ -2428,7 +2430,7 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
 'tags' => 'Affixa mutationum validarum',
 'tag-filter-submit' => 'Filtrum',
 'tags-title' => 'Affixa',
-'tags-edit' => 'mutatum',
+'tags-edit' => 'recensere',
 'tags-hitcount' => '$1 {{PLURAL:$1|mutatum|mutata}}',
 
 # Special:ComparePages
index 44707c9..73cc82c 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",
@@ -644,6 +644,9 @@ Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'ännere
 'userlogin-resetpassword-link' => 'Setzt Äert Passwuert zréck',
 'helplogin-url' => 'Help:Aloggen',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hëllef beim Aloggen]]',
+'userlogin-loggedin' => 'Dir sidd schonn als {{GENDER:$1|$1}} ageloggt.
+Benotzt de Formulaire hei drënner fir Iech als een anere Benotzer anzeloggen.',
+'userlogin-createanother' => 'Maacht een anere Benotzerkont op',
 'createacct-join' => 'Gitt Är Informatioune hei drënner an.',
 'createacct-another-join' => "Gitt d'Informatioune fir den neie Benotzerkont hei drënner an.",
 'createacct-emailrequired' => 'E-Mail-Adress',
@@ -707,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.',
@@ -732,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.",
@@ -892,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',
@@ -909,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.
@@ -984,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:',
@@ -1044,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.',
@@ -1507,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',
@@ -2029,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',
@@ -2070,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',
@@ -2089,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',
@@ -2364,12 +2367,14 @@ W.e.g. confirméiert, datt Dir dëst wierklech wëllt, datt Dir d'Konsequenze ve
 'deletereason-dropdown' => '* Heefegst Grënn fir eng Säit ze läschen
 ** Wonsch vum Auteur
 ** Verletzung vun engem Copyright
-** Vandalismus',
+** Vandalismus
+** Futtis Viruleedung
+** Spam',
 '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 Funktionnement vun {{SITENAME}} féieren;
+D'Läschen dovu kann zu Stéierungen am Fonctionnement vun {{SITENAME}} féieren;
 dës Aktioun soll mat Virsiicht gemaach ginn.",
 
 # Rollback
@@ -2476,7 +2481,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.",
@@ -2498,7 +2503,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.",
@@ -2525,7 +2530,7 @@ $1',
 'contributions' => '{{GENDER:$1|Benotzer}}kontributiounen',
 'contributions-title' => 'Kontributioune vum $1',
 'mycontris' => 'Kontributiounen',
-'contribsub2' => 'Fir $1 ($2)',
+'contribsub2' => "Fir {{GENDER:$3|den $1|d'$1|de Benotzer $1}} ($2)",
 'nocontribs' => 'Et goufe keng Ännerunge fonnt, déi dëse Kritèren entspriechen.',
 'uctop' => '(aktuell)',
 'month' => 'Vum Mount (a virdrun):',
@@ -2598,7 +2603,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.",
@@ -2688,7 +2693,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',
@@ -2802,8 +2807,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.
@@ -2874,6 +2879,7 @@ All Transwiki-Import-Aktioune ginn am [[Special:Log/import|Import-Logbuch]] prot
 'import-interwiki-templates' => 'Mat alle Schablounen',
 'import-interwiki-submit' => 'Import',
 'import-interwiki-namespace' => 'Zil-Nummraum:',
+'import-interwiki-rootpage' => 'Zil-Stamm-Säit (fakultativ):',
 'import-upload-filename' => 'Numm vum Fichier:',
 'import-comment' => 'Bemierkung:',
 'importtext' => 'Exportéiert de Fichier w.e.g. vun der Source-Wiki mat der [[Special:Export|Export-Funktioun]].
@@ -2959,7 +2965,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 'tooltip-n-mainpage' => "Besicht d'Haaptsäit",
 'tooltip-n-mainpage-description' => "Besicht d'Haaptsäit",
 'tooltip-n-portal' => 'Iwwer de Portal, wat Dir maache kënnt, wou wat ze fannen ass',
-'tooltip-n-currentevents' => "D'Aktualitéit a wat derhannert ass",
+'tooltip-n-currentevents' => "D'Aktualitéit a wat derhanner ass",
 'tooltip-n-recentchanges' => 'Lëscht vun de rezenten Ännerungen op {{SITENAME}}.',
 'tooltip-n-randompage' => 'Zoufälleg Säit',
 'tooltip-n-help' => 'Hëllefsäiten weisen.',
@@ -2998,6 +3004,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 Erlaabt et e Grond an de Resumé derbäizesetzen.',
 'tooltip-preferences-save' => 'Astellunge späicheren',
 'tooltip-summary' => 'Gitt e kuerze Resumé an',
+'tooltip-iwiki' => '$1 - $2',
 
 # Stylesheets
 'common.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick''  */",
@@ -3140,7 +3147,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',
@@ -3544,7 +3551,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',
@@ -3600,7 +3607,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.',
@@ -3742,7 +3749,7 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
 
 # Core parser functions
 'unknown_extension_tag' => 'Onbekannten Erweiderungs-Tag "$1"',
-'duplicate-defaultsort' => '\'\'\'Opgepasst:\'\'\' Den Zortéierschlëssel "$2" iwwerschreift de viregen Standard-Zortéierschlëssel "$1".',
+'duplicate-defaultsort' => '\'\'\'Opgepasst:\'\'\' Den Zortéierschlëssel "$2" iwwerschreift de virege Standard-Zortéierschlëssel "$1".',
 
 # Special:Version
 'version' => 'Versioun',
@@ -3765,7 +3772,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.
 
@@ -3824,14 +3831,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 673991c..0efe4a3 100644 (file)
@@ -28,6 +28,7 @@
  * @author Siggis
  * @author Tomasdd
  * @author Urhixidur
+ * @author Vilius2001
  * @author Vpovilaitis
  * @author לערי ריינהארט
  */
@@ -1526,8 +1527,8 @@ teisės",
 'action-block' => 'neleisti šiam naudotojui redaguoti',
 'action-protect' => 'pakeisti apsaugos lygius šiam puslapiui',
 'action-rollback' => 'greitai atmesti paskutinio naudotojo atliktų tam tikro puslapio pakeitimų',
-'action-import' => 'importuoti šį puslapį iš kitos wiki',
-'action-importupload' => 'importuoti šį puslapį iš įkelto failo',
+'action-import' => 'importuoti puslapius iš kitos wiki',
+'action-importupload' => 'importuoti puslapius iš įkelto failo',
 'action-patrol' => 'pažymėti kitų keitimus kaip patikrintus',
 'action-autopatrol' => 'savo keitimų pažymėjimas patikrintais',
 'action-unwatchedpages' => 'žiūrėti nestebimų puslapių sąrašą',
@@ -2302,7 +2303,7 @@ kažkas jau pakeitė puslapį arba suspėjo pirmas atmesti keitimą.
 Paskutimas keitimas darytas naudotojo [[User:$3|$3]] ([[User talk:$3|Aptarimas]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Redagavimo komentaras: „''$1''“.",
 'revertpage' => 'Atmestas [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarimas]]) pakeitimas; sugrąžinta [[User:$1|$1]] versija',
-'revertpage-nouser' => 'Atmesti (naudotojo vardas pašalintas) pakeitimai, grąžinta prieš tai buvusi [[User:$1|$1]] versija',
+'revertpage-nouser' => 'Atversti pakeitimai paslėpto vartotojo, grąžino prieš tai buvusią versiją {{GENDER:$1|[[User:$1|$1]]}}',
 'rollback-success' => 'Atmesti $1 pakeitimai;
 grąžinta prieš tai buvusi $2 versija.',
 
@@ -2442,7 +2443,7 @@ $1',
 'contributions' => '{{GENDER:$1|Naudotojo}} įndėlis',
 'contributions-title' => '{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis',
 'mycontris' => 'Įnašai',
-'contribsub2' => 'Naudotojo $1 ($2)',
+'contribsub2' => 'Dėl {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Jokie keitimai neatitiko šių kriterijų.',
 'uctop' => '(dabartinis)',
 'month' => 'Nuo mėnesio (ir anksčiau):',
index 877054d..c97461d 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:',
@@ -1191,10 +1195,10 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 'right-move-rootuserpages' => 'Pārvietot saknes lietotāja lapas',
 'right-movefile' => 'Pārvietot failus',
 'right-suppressredirect' => 'Neveidot pāradresāciju no vecā nosaukuma, pārvietojot lapu',
-'right-upload' => 'Augšuplādēt failus',
+'right-upload' => 'Augšupielādēt failus',
 'right-reupload' => 'Pārrakstīt esošu failu',
 'right-reupload-own' => 'Pārrakstīt paša augšuplādētu esošu failu',
-'right-upload_by_url' => 'Augšuplādēt failu no URL',
+'right-upload_by_url' => 'Augšupielādēt failus no URL',
 'right-autoconfirmed' => 'Izmainīt daļēji aizsargātas lapas',
 'right-delete' => 'Dzēst lapas',
 'right-bigdelete' => 'Dzēst lapas ar lielām hronoloģijām',
@@ -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 "',
 
@@ -1324,8 +1328,8 @@ Lapas, kas ir tavā [[Special:Watchlist|uzraugāmo rakstu sarakstā]] ir '''trek
 'recentchangeslinked-to' => 'Rādīt izmaiņas lapās, kurās ir saites uz šo lapu (nevis lapās uz kurām ir saites no šīs lapas)',
 
 # Upload
-'upload' => 'Augšuplādēt failu',
-'uploadbtn' => 'Augšuplādēt',
+'upload' => 'Augšupielādēt failu',
+'uploadbtn' => 'Augšupielādēt',
 'reuploaddesc' => 'Atcelt augšupielādi un atgriezties pie augšupielādes veidnes.',
 'upload-tryagain' => 'Iesniegt izmainīto faila aprakstu',
 'uploadnologin' => 'Neesi iegājis',
@@ -1338,7 +1342,7 @@ Lapas, kas ir tavā [[Special:Watchlist|uzraugāmo rakstu sarakstā]] ir '''trek
  Dzēšanas un pārvietošanas reģistri šai lapai ir uzskaitīti šeit:",
 'uploadtext' => "Pirms tu kaut ko augšupielādē, noteikti izlasi un ievēro [[Project:Attēlu izmantošanas noteikumi|attēlu izmantošanas noteikumus]].
 
-Lai aplūkotu vai meklētu agrāk augšuplādētus attēlus,
+Lai aplūkotu vai meklētu agrāk augšupielādētus attēlus,
 dodies uz [[Special:FileList|augšupielādēto attēlu sarakstu]].
 Augšupielādes un dzēšanas tiek reģistrētas [[Special:Log/upload|augšupielādes reģistrā]] un [[Special:Log/delete|dzēšanas reģistrā]].
 
@@ -1346,7 +1350,7 @@ Izmanto šo veidni, lai augšupielādētu jaunus attēlu failus, ar kuriem ilust
 Gandrīz visos pārlūkos tev vajadzētu redzēt pogu '''\"Choose...\",''' kuru spiežot parādīsies faila atvēršanas dialogs.
 Izvēloties kādu failu, tā adrese parādīsies ailītē blakus šai pogai.
 Tev ir arī jāatzīmē ailīte, kas apstiprina, ka tu nepārkāp nekādas autortiesības, augšupielādējot šo failu.
-Spied pogu '''Augšuplādēt''', lai pabeigtu augšupielādi.
+Spied pogu '''Augšupielādēt''', lai pabeigtu augšupielādi.
 Tas var ieilgt, ja tavs interneta pieslēgums ir lēns.
 
 Ieteicamie formāti ir:
@@ -1360,7 +1364,7 @@ Lūdzu, pārliecinies, ka faila nosaukums ir pietiekami aprakstošs, lai izvair
 vai skaņām
 * '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fails.ogg]]</nowiki>'''
 
-Lūdzu, ņem vērā, ka tāpat kā citas wiki lapas arī tevis augšuplādētos failus citi var mainīt vai dzēst, ja uzskata, ka tas nāktu par labu šim projektam, kā arī atceries, ka tev var tikt liegta augšupielādes iespēja, ja tu šo sistēmu.",
+Lūdzu, ņem vērā, ka tāpat kā citas wiki lapas arī tevis augšupielādētos failus citi var mainīt vai dzēst, ja uzskata, ka tas nāktu par labu šim projektam, kā arī atceries, ka tev var tikt liegta augšupielādes iespēja, ja tu šo sistēmu.",
 'upload-permitted' => 'Atļautie failu tipi: $1.',
 'upload-preferred' => 'Ieteicamie failu tipi: $1.',
 'upload-prohibited' => 'Aizliegtie failu tipi: $1.',
@@ -1378,11 +1382,11 @@ Pārskatāmāka versija ir pieejama [[Special:NewFiles|jauno attēlu galerijā]]
 'ignorewarning' => 'Ignorēt brīdinājumu un saglabāt failu',
 'ignorewarnings' => 'Ignorēt visus brīdinājumus',
 'minlength1' => 'Failu vārdiem jābūt vismaz vienu simbolu gariem.',
-'illegalfilename' => 'Faila nosaukumā "$1" ir simboli, kas nav atļauti virsrakstos. Lūdzu, pārdēvē failu un mēģini to vēlreiz augšuplādēt.',
+'illegalfilename' => 'Faila nosaukumā "$1" ir simboli, kas nav atļauti virsrakstos. Lūdzu, pārdēvējiet failu un mēģiniet to vēlreiz augšupielādēt.',
 'filename-toolong' => 'Failu nosaukumi nedrīkst pārsniegt 240 baitus.',
 'badfilename' => 'Attēla nosaukums ir nomainīts, tagad tas ir "$1".',
 'filetype-mime-mismatch' => 'Faila paplašinājums ".$1" neatbilst noteiktajam MIME tipam ($2).',
-'filetype-badmime' => 'Šeit nav atļauts augšuplādēt failus ar MIME tipu "$1".',
+'filetype-badmime' => 'Šeit nav atļauts augšupielādēt failus ar MIME tipu "$1".',
 'filetype-bad-ie-mime' => 'Nevar augšupielādēt šo failu, jo Internet Explorer to uzskatītu kā "$1", kas ir neatļauts un potenciāli bīstams faila tips.',
 'filetype-unwanted-type' => "'''\".\$1\"''' ir nevēlams failu tips.  {{PLURAL:\$3|Ieteicamais faila tips|Ieteicamie failu tipi}} ir \$2.",
 'filetype-banned-type' => "'''\".\$1\"''' nav atļautais failu tips.  {{PLURAL:\$3|Atļautais faila tips|Atļautie failu tipi}} ir \$2.",
@@ -1400,7 +1404,9 @@ Pārskatāmāka versija ir pieejama [[Special:NewFiles|jauno attēlu galerijā]]
 'large-file' => 'Ieteicams, lai faili nebūtu lielāki par $1;
 šī faila izmērs ir $2.',
 'largefileserver' => 'Šis fails ir lielāks nekā serveris ņem pretī.',
-'emptyfile' => 'Šķiet, ka tu esi augšuplādējis tukšu failu. Iespējams, faila nosaukumā esi pieļāvis kļūdu. Lūdzu, pārbaudi, vai tiešām tu vēlies augšuplādēt tieši šo failu.',
+'emptyfile' => 'Šķiet, ka jūs esat augšupielādējis tukšu failu.
+Iespējams, faila nosaukumā esat pieļāvis kļūdu.
+Lūdzu, pārbaudiet, vai tiešām jūs vēlaties augšupielādēt tieši šo failu.',
 'windows-nonascii-filename' => 'Šī viki neatbalsta failu nosaukumus ar īpašām rakstzīmēm.',
 'fileexists' => 'Fails ar šādu nosaukumu jau pastāv, lūdzu, pārbaudi <strong>[[:$1]]</strong>, ja neesi drošs, ka vēlies to mainīt.
 [[$1|thumb]]',
@@ -1412,7 +1418,8 @@ Lūdzu, izvēlieties citu nosaukumu.',
 Izskatās, ka šis ir samazināts attēls ''(thumbnail)''.
 Ja tev ir šis pats attēls pilnā izmērā, augšuplādē to, ja nav, tad nomaini faila vārdu.",
 'fileexists-forbidden' => 'Fails ar šādu nosaukumu jau eksistē un to nevar aizvietot ar jaunu.
-Ja tu joprojām gribi augšuplādēt šo failu, tad mēģini vēlreiz, ar citu faila vārdu. [[File:$1|thumb|center|$1]]',
+Ja jūs joprojām gribat augšupielādēt šo failu, tad mēģiniet vēlreiz ar citu faila nosaukumu.
+[[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Fails ir kopija {{PLURAL:$1|šim failam|šiem failiem}}:',
 'uploadwarning' => 'Augšupielādes brīdinājums',
 'uploadwarning-text' => 'Lūdzu, pārveido zemāk esošo faila aprakstu un mēģini vēlreiz.',
@@ -1437,8 +1444,8 @@ Java failu augšupielāde nav atļauta, jo tas var radīt iespējas apiet droš
 'upload-description' => 'Faila apraksts',
 'upload-options' => 'Augšupielādes iestatījumi',
 'watchthisupload' => 'Uzraudzīt šo failu',
-'filewasdeleted' => 'Fails ar šādu nosaukumu jau ir bijis augšuplādēts un pēc tam izdzēsts.
-Apskaties $1 pirms turpini šo failu augšuplādēt atkārtoti.',
+'filewasdeleted' => 'Fails ar šādu nosaukumu jau ir bijis augšupielādēts un pēc tam izdzēsts.
+Apskatiet $1 pirms turpiniet šo failu augšupielādēt atkārtoti.',
 'filename-bad-prefix' => "Faila vārds failam, kuru tu mēģini augšpulādēt, sākas ar '''\"\$1\"''', kas ir neaprakstošs vārds, kādu parasti uzģenerē digitālais fotoaparāts.
 Lūdzu izvēlies aprakstošāku vārdu šim failam.",
 'upload-success-subj' => 'Augšupielāde veiksmīga',
@@ -2014,7 +2021,7 @@ Pašreizējie lapas '''$1''' iestatījumi ir:",
 'restriction-edit' => 'Izmainīt',
 'restriction-move' => 'Pārvietot',
 'restriction-create' => 'Izveidot',
-'restriction-upload' => 'Augšuplādēt',
+'restriction-upload' => 'Augšupielādēt',
 
 # Restriction levels
 'restriction-level-sysop' => 'pilnā aizsardzība',
@@ -2458,7 +2465,7 @@ Lūdzu, mēģiniet vēlreiz.',
 'tooltip-feed-atom' => 'Šīs lapas Atom barotne',
 'tooltip-t-contributions' => 'Apskatīt šā lietotāja ieguldījumu uzskaitījumu.',
 'tooltip-t-emailuser' => 'Sūtīt e-pastu šim lietotājam',
-'tooltip-t-upload' => 'Augšuplādēt attēlus vai multimēdiju failus',
+'tooltip-t-upload' => 'Augšupielādēt failus',
 'tooltip-t-specialpages' => 'Visu īpašo lapu uzskaitījums',
 'tooltip-t-print' => 'Drukājama lapas versija',
 'tooltip-t-permalink' => 'Paliekoša saite uz šo lapas versiju',
@@ -3123,7 +3130,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 +3155,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 +3173,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 +3218,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..5952fe5 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|шылтыме категорийыш|шылтыме категорийыш}} лектеш:',
@@ -483,8 +483,8 @@ $messages = array(
 'histlegend' => "Таҥастарашлаш ӱлыл версийыште ойырымаш полдышым да Enter-ым темдал.<br />
 Умылтарымаш: (кызыт) = кызытсе версий деч ойыртем, (ончычсо) = ончычсо версий деч ойыртем, '''и''' = изи тӧрлатымаш.",
 'history-fieldset-title' => 'Эртымгорным ончыкташ',
-'histfirst' => 'Эн тошто',
-'histlast' => 'Эн у',
+'histfirst' => 'эн тошто',
+'histlast' => 'эн у',
 'historyempty' => '(яра)',
 
 # Revision feed
@@ -526,6 +526,8 @@ $messages = array(
 'notextmatches' => 'Лаштык-влакыште икгайлык возымо уке',
 'prevn' => 'кодшо {{PLURAL:$1|$1}}',
 'nextn' => 'весе {{PLURAL:$1|$1}}',
+'prevn-title' => 'Кодшо $1 {{PLURAL:$1|результат}}',
+'nextn-title' => 'Весе $1 {{PLURAL:$1|результат}}',
 'shown-title' => 'Лаштыкыште $1 {{PLURAL:$1|возымаш|возымашым}} ончыкташ',
 'viewprevnext' => 'Ончал ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-new' => "'''Тиде вики-проектыште «[[:$1]]» лӱман лаштыкым ышташ!'''",
@@ -549,6 +551,7 @@ $messages = array(
 'search-interwiki-more' => '(эше)',
 'searchrelated' => 'кылдалтше',
 'searchall' => 'чыла',
+'showingresultsheader' => "'''$4'''лан {{PLURAL:$5|'''$3''' гыч '''$1''' результат|'''$3''' гыч '''$1 - $2''' результат}}",
 'nonefound' => "'''Ешартыш''':  Посна палемдыме огыл гын, кычалмаш южо лӱм-влак коклаште гына эрта. Чыла лаштык-влак коклаште кычалашлан (каҥашымаш, ямдылык-влак да т.м.) шке йодмашыштет ''all:'' префиксым кучылт, але кӱлешан лӱм-влакым палемде.",
 'search-nonefound' => 'Тыйын йодышет почеш нимо муалтын огыл',
 'powersearch' => 'Сайынрак кычал',
@@ -661,7 +664,7 @@ $messages = array(
 'minoreditletter' => 'и',
 'newpageletter' => 'У',
 'boteditletter' => 'б',
-'rc-enhanced-expand' => 'Ð\9fоказаÑ\82Ñ\8c Ð´ÐµÑ\82али  (JavaScript ÐºÓ±Ð»ÐµÑ\88)',
+'rc-enhanced-expand' => 'ТиÑ\87маÑ\88Ñ\8bн Ð¾Ð½Ñ\87Ñ\8bкÑ\82аÑ\88',
 'rc-enhanced-hide' => 'Рашлык-влакым шылташ',
 
 # Recent changes linked
@@ -793,6 +796,7 @@ $messages = array(
 'linksearch' => 'Ӧрдыж кылвер-влак',
 'linksearch-ns' => 'Лӱм-влакын кумдыкышт:',
 'linksearch-ok' => 'Кычал',
+'linksearch-line' => '$2 лаштыкыште $1 ончыкталтын',
 
 # Special:ListUsers
 'listusers-submit' => 'ончыкташ',
@@ -821,7 +825,7 @@ $messages = array(
 'watchthispage' => 'Тиде лаштыкым эскераш',
 'unwatch' => 'Эскерыман огыл',
 'unwatchthispage' => 'Эскерымым чарнаш',
-'watchlist-details' => 'Эскерымаш лӱмерыштет $1 {{PLURAL:$1|лаштык|лаштык}} (каҥашымаш лаштык-влакым шотлыде)',
+'watchlist-details' => 'Эскерымаш лӱмерыштет $1 {{PLURAL:$1|лаштык}}, каҥашымаш лаштык-влакым шотлыде',
 'watchlistcontains' => 'Тыйын лӱмерыште $1 {{PLURAL:$1|лаштык|лаштык}}.',
 'wlshowlast' => 'Пытартыш $1 шагат $2 кечылан $3 ончыкташ',
 'watchlist-options' => 'Эскерыме лӱмерын келыштарымаш',
@@ -860,7 +864,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' => 'Регистрацийым эртыдыме да у пайдаланыше-влак деч петыраш',
@@ -876,6 +881,7 @@ $messages = array(
 
 # Undelete
 'undeletelink' => 'ончалаш/тӧрлатен шындаш',
+'undeleteviewlink' => 'ончыкташ',
 'undelete-search-submit' => 'Кычал',
 
 # Namespace form on various pages
@@ -983,6 +989,7 @@ $messages = array(
 
 # Thumbnails
 'thumbnail-more' => 'Кугемдаш',
+'thumbnail_error' => 'Изи сӱретым ыштыме годым йоҥылыш: $1',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Тыйын лаштыкет',
@@ -1023,7 +1030,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 +1043,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 f41922c..d467be4 100644 (file)
@@ -816,6 +816,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' => 'Е-пошта',
@@ -2588,10 +2591,12 @@ $UNWATCHURL
 'deletecomment' => 'Причина:',
 'deleteotherreason' => 'Друга/дополнителна причина:',
 'deletereasonotherlist' => 'Друга причина',
-'deletereason-dropdown' => '*Вообичаени причини за бришење
-** На барање на авторот
+'deletereason-dropdown' => '* Вообичаени причини за бришење
+** Спам
+** Вандализам
 ** Прекршување на авторски права
-** Вандализам',
+** На барање на авторот
+** Прекинато пренасочување',
 'delete-edit-reasonlist' => 'Уреди причини за бришење',
 'delete-toobig' => 'Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|ревизија|ревизии}}.
 Бришењето на ваквии страници е забрането со цел {{SITENAME}} да се заштити од оштетувања.',
@@ -2760,7 +2765,7 @@ $1',
 'contributions' => '{{GENDER:$1|Кориснички}} придонеси',
 'contributions-title' => 'Придонеси на корисникот $1',
 'mycontris' => 'придонеси',
-'contribsub2' => 'За $1 ($2)',
+'contribsub2' => 'За {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Не се пронајдени промени што одговараат на овој критериум.',
 'uctop' => '(тековно)',
 'month' => 'Од месец (и порано):',
@@ -3244,6 +3249,7 @@ $2',
 'tooltip-undo' => '„Откажи“ го поништува ова уредување и ве носи на уредувањето во режим на преглед. Дава можност за наведување на причина во описот.',
 'tooltip-preferences-save' => 'Зачувај',
 'tooltip-summary' => 'Внесете краток опис',
+'tooltip-iwiki' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* Тука поставениот CSS ќе се применува врз сите рува */',
@@ -4285,7 +4291,10 @@ $5
 '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|промена|промени}}',
 
index 5e4d339..6da9f87 100644 (file)
@@ -799,6 +799,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' => 'ഇമെയിൽ വിലാസം',
@@ -2665,7 +2668,7 @@ $1',
 'contributions' => '{{GENDER:$1|ഉപയോക്താവിന്റെ}} സംഭാവനകൾ',
 'contributions-title' => '$1 എന്ന ഉപയോക്താവിന്റെ സംഭാവനകൾ',
 'mycontris' => 'സംഭാവനകൾ',
-'contribsub2' => '$1 എന്ന ഉപയോക്താവിന്റെ $2.',
+'contribsub2' => 'ഉപയോക്താവ് {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'ഈ മാനദണ്ഡങ്ങളുമായി യോജിക്കുന്ന മാറ്റങ്ങൾ ഒന്നും കണ്ടില്ല.',
 'uctop' => '(നിലവിലുള്ളത്)',
 'month' => 'മാസം:',
@@ -4023,7 +4026,10 @@ $5
 'tags-tag' => 'റ്റാഗിന്റെ പേര്‌',
 'tags-display-header' => 'മാറ്റങ്ങളുടെ പട്ടികകളിലെ രൂപം',
 'tags-description-header' => 'അർത്ഥത്തിന്റെ പൂർണ്ണ വിവരണം',
+'tags-active-header' => 'സീജീവമാണോ?',
 'tags-hitcount-header' => 'അനുബന്ധമുള്ള മാറ്റങ്ങൾ',
+'tags-active-yes' => 'അതെ',
+'tags-active-no' => 'അല്ല',
 'tags-edit' => 'തിരുത്തുക',
 'tags-hitcount' => '{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}',
 
index bfb72eb..4c6ba0e 100644 (file)
@@ -314,12 +314,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Wiezigingen die emarkeerd bin verbargen in "Leste wiezigingen"',
 'tog-newpageshidepatrolled' => 'Ziejen die emarkeerd bin, verbargen in de lieste mit nieje artikels',
 'tog-extendwatchlist' => 'Volglieste uutbreien, zodat alle wiezigingen zichtbaor bin, en niet allinnig de leste wieziging',
-'tog-usenewrc' => 'Groepeer wiezigingen per zied in "Leste wiezigingen" en "Mien volglieste" (hierveur he\'j JavaScript neudig)',
+'tog-usenewrc' => 'Groepeer wiezigingen per zied in "Leste wiezigingen" en "Mien volglieste"',
 'tog-numberheadings' => 'Koppen vanzelf nummeren',
 'tog-showtoolbar' => 'Laot de warkbalke zien',
-'tog-editondblclick' => 'Mit dubbelklik bewarken (JavaScript)',
+'tog-editondblclick' => 'Mit dubbelklik bewarken',
 'tog-editsection' => 'Mit bewarkgedeelten',
-'tog-editsectiononrightclick' => 'Bewarkgedeelte mit rechtermuusknoppe bewarken (JavaScript)',
+'tog-editsectiononrightclick' => 'Bewarken van deelziejen meugelik maken mit n rechtermuusklik op n tussenkop',
 'tog-showtoc' => 'Samenvatting laoten zien van de zaken die an bod koemen (mit meer as dree onderwarpen)',
 'tog-rememberpassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
 'tog-watchcreations' => "Spul wa'k anmake op mien volglieste zetten",
@@ -337,7 +337,7 @@ $messages = array(
 'tog-shownumberswatching' => 't Antal gebrukers bekieken die disse zied volgt',
 'tog-oldsig' => 'Bestaonde haandtekening:',
 'tog-fancysig' => 'Ondertekening zien as wikitekste (zonder automatiese verwiezing)',
-'tog-uselivepreview' => 'Gebruuk "rechtstreeks naokieken" (mu\'j JavaScript veur hebben - experimenteel)',
+'tog-uselivepreview' => 'Gebruuk "rechtstreeks naokieken" (experimenteel)',
 'tog-forceeditsummary' => 'Geef n melding bie n lege samenvatting',
 'tog-watchlisthideown' => 'Verbarg mien eigen bewarkingen',
 'tog-watchlisthidebots' => 'Verbarg botgebrukers',
@@ -351,6 +351,7 @@ $messages = array(
 'tog-noconvertlink' => 'Ziednaamkonversie uutschakelen',
 'tog-norollbackdiff' => 'Wiezigingen vortlaoten nao t weerummedreien',
 'tog-useeditwarning' => "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
+'tog-prefershttps' => "Altied n beveiligde verbiending gebruken a'j an-emeld bin",
 
 'underline-always' => 'Altied',
 'underline-never' => 'Nooit',
@@ -451,7 +452,7 @@ $messages = array(
 'newwindow' => '(niej vienster)',
 'cancel' => 'Aofbreken',
 'moredotdotdot' => 'Meer...',
-'morenotlisted' => 'Meer niet in de lieste...',
+'morenotlisted' => 'Disse lieste is niet kompleet...',
 'mypage' => 'Gebrukerszied',
 'mytalk' => 'Mien overleg',
 'anontalk' => 'Overlegzied veur dit IP-adres',
@@ -542,19 +543,19 @@ $messages = array(
 'jumpto' => 'Gao naor:',
 'jumptonavigation' => 'navigasie',
 'jumptosearch' => 'zeuk',
-'view-pool-error' => "De servers bin noen overbelast.
-Te veule meensen proberen disse zied te bekieken.
-Wacht even veurda'j opniej toegang proberen te kriegen tot disse zied.
+'view-pool-error' => "De servers bin op heden overbelast.
+Te veule gebrukers proberen disse zied te bekieken.
+Wacht effen veurda'j opniej toegang proberen te kriegen tot disse zied.
 
 $1",
-'pool-timeout' => 'Wachttied tiejens t wachten op vergrendeling',
+'pool-timeout' => 'De maximumwachttied veur databankvergrendeling is verleupen.',
 'pool-queuefull' => 'De wachtrie van de poel is vol',
 'pool-errorunknown' => 'Onbekende fout',
 
 # 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' => 'Over {{SITENAME}}',
 'aboutpage' => 'Project:Info',
-'copyright' => 'De inhoud is beschikbaor onder de $1.',
+'copyright' => 'De inhoud is beschikbaor onder de $1 as der niks aanders an-egeven is.',
 'copyrightpage' => '{{ns:project}}:Auteursrechten',
 'currentevents' => 'In t niejs',
 'currentevents-url' => 'Project:In t niejs',
@@ -637,6 +638,12 @@ n Lieste mit bestaonde spesiale ziejen ku'j vienen op [[Special:SpecialPages|{{i
 # General errors
 'error' => 'Foutmelding',
 'databaseerror' => 'Fout in de databanke',
+'databaseerror-text' => 'Der is wat mis egaon bie n databankzeukopdrachte.
+Dit kan betekenen dat der n fout in de programmtuur zit.',
+'databaseerror-textcl' => 'Der is wat mis egaon bie n databankzeukopdrachte.',
+'databaseerror-query' => 'Zeukopdrachte: $1',
+'databaseerror-function' => 'Funksie: $1',
+'databaseerror-error' => 'Fout: $1',
 'laggedslavemode' => '<strong>Waorschuwing:</strong> t is meugelik dat leste wiezigingen in de tekste van dit artikel nog niet verwarkt bin.',
 'readonly' => 'De databanke is beveiligd',
 'enterlockreason' => 'Waorumme en veur hoe lange is t eblokkeerd?',
@@ -755,6 +762,9 @@ Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] an te pas
 'userlogin-resetpassword-link' => 'Joew wachtwoord opniej instellen',
 'helplogin-url' => 'Help:Anmelden',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulpe bie t anmelden]]',
+'userlogin-loggedin' => 'Je bin al an-emeld as {{GENDER:$1|$1}}.
+Gebruuk t onderstaonde formulier um an te melden as n aandere gebruker.',
+'userlogin-createanother' => 'n Aandere gebrukerskonto anmaken',
 'createacct-join' => 'Geef joew gegevens hieronder op.',
 'createacct-another-join' => 'Vul hieronder de informasie van de nieje gebruker in.',
 'createacct-emailrequired' => 'Netpostadres',
@@ -843,6 +853,8 @@ Je mutten effen $1 wachten veurda'j t opniej proberen.",
 'login-abort-generic' => 'Je bin niet an-emeld. De procedure is aofebreuken.',
 'loginlanguagelabel' => 'Taal: $1',
 'suspicious-userlogout' => 'Joew verzeuk um of te melden is aofewezen umdat t dernaor uutziet dat t verstuurd is deur n kepotte webkieker of tussenopslagbuffer',
+'createacct-another-realname-tip' => "Joew echte naam opgeven is niet verplicht.
+A'j t invullen, dan zu'w t gebruken um erkenning te geven veur joew warkzaamhejen.",
 
 # Email sending
 'php-mail-error-unknown' => 'Der was n onbekende fout mit de mail()-funksie van PHP',
@@ -922,7 +934,7 @@ Do dit a'j ze per ongelok mit ene edeeld hebben of as onbevoegden toegang ekrege
 'resettokens-legend' => 'Tokens ongedaonmaken',
 'resettokens-tokens' => 'Tokens:',
 'resettokens-token-label' => '$1 (aktuele weerde: $2)',
-'resettokens-watchlist-token' => 'Token veur webvoer van volglieste',
+'resettokens-watchlist-token' => 'Token veur webvoer (Atom/RSS) van [[Special:Watchlist|wiezigingen van ziejen die joew volglieste staon]]',
 'resettokens-done' => 'Tokens ongedaonmaken.',
 'resettokens-resetbutton' => 'Ekeuzen tokens ongedaonmaken',
 
@@ -1437,7 +1449,7 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'prefs-rendering' => 'Ziedweergave',
 'saveprefs' => 'Veurkeuren opslaon',
 'resetprefs' => 'Standardveurkeuren herstellen',
-'restoreprefs' => 'Alle standardinstellingen weerummezetten',
+'restoreprefs' => 'Alle standardinstellingen weerummezetten (veur alle seksies)',
 'prefs-editing' => 'Bewarkingsveld',
 'rows' => 'Regels',
 'columns' => 'Kolommen',
@@ -1526,6 +1538,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'prefs-displaywatchlist' => 'Weergave-instellingen',
 'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Verschillen',
+'prefs-help-prefershttps' => "Disse veurkeur wörden toe-epast a'j je eigen de volgende keer anmelden.",
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Geldig netpostadres',
@@ -1683,8 +1696,8 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'action-block' => 'disse gebruker blokkeren',
 'action-protect' => 't beveiligingsnivo van disse zied anpassen',
 'action-rollback' => 'bewarkingen van de leste gebruker die n zied hef ewiezigd rap weerummedreien',
-'action-import' => 'disse zied van n aandere wiki invoeren',
-'action-importupload' => 'disse zied invoeren vanaof n op-estuurd bestaand',
+'action-import' => 'ziejen van n aandere wiki invoeren',
+'action-importupload' => 'ziejen invoeren vanaof n op-estuurd bestaand',
 'action-patrol' => 'bewarkingen van aandere luui op nao-ekeken zetten',
 'action-autopatrol' => 'eigen bewarkingen op nao-ekeken zetten',
 'action-unwatchedpages' => 'bekiek de lieste mit ziejen die niet evolgd wörden',
@@ -1700,6 +1713,8 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sinds joew leste bezeuk}}',
+'enhancedrc-history' => 'geschiedenisse',
 'recentchanges' => 'Leste wiezigingen',
 'recentchanges-legend' => 'Opsies veur leste wiezigingen',
 'recentchanges-summary' => "Op disse zied ku'j de leste wiezigingen van disse wiki bekieken.",
@@ -1732,7 +1747,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'rc_categories_any' => 'alles',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} nao de wieziging',
 'newsectionsummary' => 'Niej onderwarp: /* $1 */',
-'rc-enhanced-expand' => "Details bekieken (hier he'j JavaScript veur neudig)",
+'rc-enhanced-expand' => 'Details bekieken',
 'rc-enhanced-hide' => 'Details verbargen',
 'rc-old-title' => 'oorspronkelik an-emaakt as "$1"',
 
@@ -1965,14 +1980,14 @@ Um beveiligingsredens is img_auth.php uutezet.',
 'http-invalid-scheme' => 'Webadressen mit de opmaak "$1" wörden niet ondersteund.',
 'http-request-error' => 'Fout bie t verzenden van t verzeuk.',
 'http-read-error' => 'Fout bie t lezen van HTTP',
-'http-timed-out' => 'Wachttied bie t HTTP verzeuk',
+'http-timed-out' => 'Tiedsoverschriejing bie t HTTP-verzeuk',
 'http-curl-error' => 'Fout bie t ophaolen van t webadres: $1',
 'http-bad-status' => 'Der is n probleem mit t HTTP-verzeuk: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Kon webadres niet bereiken',
 'upload-curl-error6-text' => "t Webadres kon niet bereikt wörden. Kiek effen nao o'j t goeie adres in-evoerd hebben en of de webstee bereikbaor is.",
-'upload-curl-error28' => 'Wachttied veur t versturen van t bestaand',
+'upload-curl-error28' => 'Tiedsoverschriejing veur t versturen van t bestaand',
 'upload-curl-error28-text' => 't Duren te lange veurdat de webstee reageren. Kiek effen nao of de webstee bereikbaor is, wacht effen en probeer t daornao weer. Probeer t aanders as t wat rustiger is.',
 
 'license' => 'Lisensie',
@@ -1983,8 +1998,7 @@ Um beveiligingsredens is img_auth.php uutezet.',
 'upload_source_file' => ' (n bestaand op de hardeschieve)',
 
 # Special:ListFiles
-'listfiles-summary' => "Op disse spesiale zied ku'j alle bestaanden bekieken die lestens op-estuurd bin.
-As disse zied efilterd wörden op gebruker, zie'j allinnig bestaanden waor de gebruker de leste versie van hef op-estuurd.",
+'listfiles-summary' => "Op disse spesiale zied ku'j alle bestaanden bekieken die lestens op-estuurd bin.",
 'listfiles_search_for' => 'Zeuk naor bestaand:',
 'imgfile' => 'bestaand',
 'listfiles' => 'Bestaandslieste',
@@ -1995,6 +2009,10 @@ As disse zied efilterd wörden op gebruker, zie'j allinnig bestaanden waor de ge
 'listfiles_size' => 'Grootte (bytes)',
 'listfiles_description' => 'Beschrieving',
 'listfiles_count' => 'Versies',
+'listfiles-show-all' => 'Ouwe versies van aofbeeldingen opnemen',
+'listfiles-latestversion' => 'Aktuele versie',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nee',
 
 # File description page
 'file-anchor-link' => 'Bestaand',
@@ -2125,8 +2143,8 @@ Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
 'pageswithprop-text' => 'Op disse zied staon ziejen mit n bepaolde ziedeigenschap.',
 'pageswithprop-prop' => 'Naam van de eigenschap:',
 'pageswithprop-submit' => 'Zeuk',
-'pageswithprop-prophidden-long' => 'lange tekste-eigenschapsweerde verbörgen ({{PLURAL:$1|$1 kilobyte}})',
-'pageswithprop-prophidden-binary' => 'binaere eigenschapsweerde verbörgen ({{PLURAL:$1|$1 kilobyte}})',
+'pageswithprop-prophidden-long' => 'lange teksteigenschapsweerde verbörgen ($1)',
+'pageswithprop-prophidden-binary' => 'binaere eigenschapsweerde verbörgen ($1)',
 
 'doubleredirects' => 'Dubbele deurverwiezingen',
 'doubleredirectstext' => 'Op disse lieste staon alle ziejen die deurverwiezen naor aandere deurverwiezingen.
@@ -2200,6 +2218,7 @@ Meestentieds is leste zied de gewunste doelzied, waor oek de eerste zied heer zo
 'listusers' => 'Gebrukerslieste',
 'listusers-editsonly' => 'Allinnig gebrukers mit bewarkingen laoten zien',
 'listusers-creationsort' => 'Sorteren op inschriefdaotum',
+'listusers-desc' => 'Sorteren in aoflopende volgorde',
 'usereditcount' => '$1 {{PLURAL:$1|bewarking|bewarkingen}}',
 'usercreated' => '{{GENDER:$3|Eregistreerd}} op $1 um $2',
 'newpages' => 'Nieje artikels',
@@ -2489,7 +2508,7 @@ n Aander hef disse zied al bewarkt of hersteld naor n eerdere versie.
 De leste bewarking op disse zied is edaon deur [[User:$3|$3]] ([[User talk:$3|Overleg]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "De bewarkingssamenvatting was: ''$1''.",
 'revertpage' => 'Wiezigingen deur [[Special:Contributions/$2|$2]] hersteld tot de versie nao de leste wieziging deur $1',
-'revertpage-nouser' => 'Wiezigingen deur n verbörgen gebruker weerummedreid naor de leste versie deur [[User:$1|$1]]',
+'revertpage-nouser' => 'Wiezigingen deur n verbörgen gebruker weerummedreid naor de leste versie deur {{GENDER:$1|[[User:$1|$1]]}}',
 'rollback-success' => 'Wiezigingen van $1; weerummedreid naor de leste versie van $2.',
 
 # Edit tokens
@@ -2626,7 +2645,7 @@ $1',
 'contributions' => '{{GENDER:$1|Biedragen van disse gebruker}}',
 'contributions-title' => 'Biedragen van $1',
 'mycontris' => 'Mien biedragen',
-'contribsub2' => 'Veur $1 ($2)',
+'contribsub2' => 'Veur {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Gien wiezigingen evunnen die an de estelde criteria voldoon.',
 'uctop' => '(leste wieziging)',
 'month' => 'Maond:',
@@ -3101,6 +3120,7 @@ De tiedelike map is niet anwezig.',
 Iej könt in de bewearkingssamenvatting n reden opgeven.',
 'tooltip-preferences-save' => 'Vuurkeuren opsloan',
 'tooltip-summary' => 'Voer ne korte samenvatting in',
+'tooltip-iwiki' => '$1 – $2',
 
 # Metadata
 'notacceptable' => 'De wikiserver kan de gegevens niet leveren in n vorm die joew kliënt kan lezen.',
@@ -3953,7 +3973,10 @@ Samen mit dit programma heur je n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de
 'tags-tag' => 'Etiketnaam',
 'tags-display-header' => 'Weergave in wiezigingsliesten',
 'tags-description-header' => 'Beschrieving van de betekenisse',
+'tags-active-header' => 'Aktief?',
 'tags-hitcount-header' => 'Bewarkingen mit etiket',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nee',
 'tags-edit' => 'bewarking',
 'tags-hitcount' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
 
@@ -3974,6 +3997,7 @@ Samen mit dit programma heur je n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de
 'dberr-problems' => 't Spiet ons, mer disse webstee hef op t moment wat techniese problemen.',
 'dberr-again' => 'Wach n paor minuten en probeer t daornao opniej.',
 'dberr-info' => '(Kan gien verbiending maken mit de databankeserver: $1)',
+'dberr-info-hidden' => '(Kan gien verbiending maken mit de databankserver)',
 'dberr-usegoogle' => "Misschien ku'j ondertussen zeuken via Google.",
 'dberr-outofdate' => 'Let op: indexen die zee hebben van onze ziejen bin misschien niet aktueel.',
 'dberr-cachederror' => 'Disse zied is n kopie uut t tussengeheugen en is misschien niet aktueel.',
@@ -4111,9 +4135,17 @@ Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew kommentaar zal
 
 # Limit report
 'limitreport-title' => 'Parser-profieldata:',
+'limitreport-cputime' => 'Tiedsgebruuk van de prosessor',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekonde|sekonden}}',
+'limitreport-walltime' => 'Reëel tiedsgebruuk',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekonde|sekonden}}',
-'limitreport-postexpandincludesize-value' => '$1/$2 byte',
-'limitreport-templateargumentsize-value' => '$1/$2 byte',
+'limitreport-ppvisitednodes' => 'Antal verbiendingsknopen bezöcht tiejens de veurverwarking:',
+'limitreport-ppgeneratednodes' => 'Antal verbiedingsknopen an-emaakt tiejens de veurverwarking:',
+'limitreport-postexpandincludesize' => 'Inklusiegrootte nao uutbreien',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Grootte van malparameters',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Hoogste uutbreidingsdiepte',
+'limitreport-expensivefunctioncount' => 'Antal kostbaore parserfunksies',
 
 );
index 9b8355e..cd42746 100644 (file)
@@ -62,10 +62,10 @@ $messages = array(
 'tog-extendwatchlist' => 'निगरानी सूचीलाई सबै परिवर्तनहरू देखाउने गरी बढाउने , हालैको  बाहेक',
 'tog-usenewrc' => 'पृष्ठका भर्खरका परिवर्तन र अवलोकन सूचीको आधारमा सामूहिक परिवर्तनहरु ( जाभास्क्रिप्ट चाहिन्छ)',
 'tog-numberheadings' => 'शीर्षकहरुलाई स्वत:अङ्कित गर्नुहोस्',
-'tog-showtoolbar' => 'सम्पादन औजारबट्टा देखाउने( जाभा स्क्रिप्ट चाहिन्छ)',
-'tog-editondblclick' => 'दोहोरो क्लिकमा पृष्ठ सम्पादन गर्ने (जाभा स्क्रिप्ट चाहिन्छ)',
+'tog-showtoolbar' => 'सम्पादन औजारबट्टा देखाउने',
+'tog-editondblclick' => 'दोहोरो क्लिकमा पृष्ठ सम्पादन गर्ने',
 'tog-editsection' => '[सम्पादन] सम्बन्ध मार्फत हुने खण्ड सम्पादनलाई सक्षम पार्ने',
-'tog-editsectiononrightclick' => 'शीर्षकमा दाहिने क्लिकद्वारा खण्ड सम्पादन सक्षम पार्ने ( जाभा स्क्रिप्ट चाहिने )',
+'tog-editsectiononrightclick' => 'शीर्षकमा दाहिने क्लिकद्वारा खण्ड सम्पादन सक्षम पार्ने',
 'tog-showtoc' => 'सामग्री तालिका हेर्ने (तीन भन्दा बढी शीर्षक भएमा)',
 'tog-rememberpassword' => 'यस ब्राउजरमा मेरो प्रवेशलाई सम्झनुहोस् (अधिकतम $1 {{PLURAL:$1|दिन|दिनहरु}} सम्म)',
 'tog-watchcreations' => 'मेरो निगरानी सूचीमा मैले सृजना गरेको पृष्ठ र अपलोड जोड्ने',
@@ -83,7 +83,7 @@ $messages = array(
 'tog-shownumberswatching' => 'निगरानी गरिरहेका प्रयोगकर्ताहरुको संख्या देखाउने',
 'tog-oldsig' => 'वर्तमान हस्ताक्षर:',
 'tog-fancysig' => 'मेरो दस्तखतलाई विकि पाठको रुपमा लिने(स्वत सम्वन्ध बिना)',
-'tog-uselivepreview' => 'प्रत्यक्ष पूर्वरुप प्रयोग गर्नुहोस् ( जाभा स्क्रिप्ट आवश्यक) (प्रयोगात्मक)',
+'tog-uselivepreview' => 'प्रत्यक्ष पूर्वरुप प्रयोग गर्नुहोस् (प्रयोगात्मक)',
 'tog-forceeditsummary' => 'खाली सम्पादन सार प्रविष्टि गरेमा मलाई सोध्ने',
 'tog-watchlisthideown' => 'मेरा सम्पादनहरू निगनारी सूचीबाट लुकाउने',
 'tog-watchlisthidebots' => 'बोट सम्पादनहरू निगरानी सूचीबाट लुकाउने',
@@ -96,6 +96,8 @@ $messages = array(
 'tog-showhiddencats' => 'लुकाइएको प्रकारहरु देखाउने',
 'tog-noconvertlink' => 'सम्बन्ध शीर्षक रुपान्तरण निस्क्रिय पार्ने',
 'tog-norollbackdiff' => 'पूर्वस्थितिमा फर्काएपछि  diff हटाउने',
+'tog-useeditwarning' => 'सम्पादनहरू सङ्ग्रह गरिनसकेको अवस्थामा अर्को पृष्ठमा जान खोज्दा चेतावनी देखाउने',
+'tog-prefershttps' => 'प्रवेश गर्दा जहिले पनि सुरक्षित जडान प्रयोग गर्ने',
 
 'underline-always' => 'सधैँ',
 'underline-never' => 'कहिल्यै',
@@ -159,6 +161,18 @@ $messages = array(
 'oct' => 'अक्टोबर',
 'nov' => 'नोभेम्बर',
 'dec' => 'डिसेम्बर',
+'january-date' => 'जनवरी $1',
+'february-date' => 'फेब्रुअरी $1',
+'march-date' => 'मार्च $1',
+'april-date' => 'अप्रिल $1',
+'may-date' => 'मे $1',
+'june-date' => 'जुन $1',
+'july-date' => 'जुलाई $1',
+'august-date' => 'अगस्ट $1',
+'september-date' => 'सेप्टेम्बर $1',
+'october-date' => 'अक्टोबर $1',
+'november-date' => 'नोभेम्बर $1',
+'december-date' => 'डिसेम्बर $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|श्रेणी|श्रेणीहरु}}',
@@ -186,7 +200,7 @@ $messages = array(
 'newwindow' => '(नयाँ विन्डोमा खुल्छ)',
 'cancel' => 'रद्द',
 'moredotdotdot' => 'थप...',
-'morenotlisted' => 'थप à¤\9cानà¤\95ारà¥\80 à¤¦à¤¿à¤\87à¤\8fà¤\95à¥\8b  à¤\9bà¥\88न',
+'morenotlisted' => 'यà¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤ªà¥\82रà¥\8dण à¤¹à¥\88न à¥¤',
 'mypage' => 'पृष्ठ',
 'mytalk' => 'वार्ता',
 'anontalk' => 'यस IP को वारेमा वार्तालाप गर्नुहोस्',
@@ -242,6 +256,7 @@ $messages = array(
 'create-this-page' => 'यो पृष्ठ बनाउने',
 'delete' => 'मेट्ने',
 'deletethispage' => 'यो पृष्ठ हटाउनुहोस्',
+'undeletethispage' => 'मेटेको पृष्ठ फिर्तागर्ने',
 'undelete_short' => '{{PLURAL:$1|एउटा  मेटिएको सम्पादन|$1 मेटिएका सम्पादनहरु}} फर्काउने',
 'viewdeleted_short' => '{{PLURAL:$1|मेटिएको सम्पादन |$1 मेटिएका सम्पादनहरू}}',
 'protect' => 'सुरक्षित राख्नुहोस्',
@@ -288,7 +303,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}}को बारेमा',
 'aboutpage' => 'Project:बारेमा',
-'copyright' => 'लà¥\87à¤\96à¤\95ा à¤¸à¤¾à¤®à¤¾à¤\97à¥\8dरà¥\80 $1 à¤\85नà¥\81सार à¤\89पलबà¥\8dध à¤\9b।',
+'copyright' => 'सामाà¤\97à¥\8dरà¥\80 $1 à¤\85नà¥\81सार à¤\89पलबà¥\8dध à¤\9b, à¤\96à¥\81लाà¤\87à¤\8fà¤\95à¥\8b à¤\85वसà¥\8dथा à¤¬à¤¾à¤¹à¥\87à¤\95à¤\95à¥\8b à¤¹à¤\95मा ।',
 'copyrightpage' => '{{ns:project}}:प्रतिलिपी अधिकारहरु',
 'currentevents' => 'हालैका घटनाहरु',
 'currentevents-url' => 'Project:हालैका घटनाहरु',
index 1a21de4..5e17a4d 100644 (file)
@@ -41,6 +41,7 @@
  * @author Saruman
  * @author Servien
  * @author Siebrand
+ * @author Sjoerddebruin
  * @author Slomox
  * @author Southparkfan
  * @author TBloemink
@@ -398,7 +399,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Het aantal gebruikers weergeven dat deze pagina volgt',
 'tog-oldsig' => 'Bestaande ondertekening:',
 'tog-fancysig' => 'Als wikitekst behandelen (zonder automatische koppeling)',
-'tog-uselivepreview' => '"live voorvertoning" gebruiken (experimenteel)',
+'tog-uselivepreview' => '"Live voorvertoning" gebruiken (experimenteel)',
 'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
 'tog-watchlisthideown' => 'Eigen bewerkingen op mijn volglijst verbergen',
 'tog-watchlisthidebots' => 'Botbewerkingen op mijn volglijst verbergen',
@@ -700,6 +701,10 @@ Een lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|{{in
 # General errors
 'error' => 'Fout',
 'databaseerror' => 'Databasefout',
+'databaseerror-text' => 'Er is een databasefout opgetreden.
+Dit kan duiden op een fout in de software.',
+'databaseerror-textcl' => 'Er is een databasefout opgetreden.',
+'databaseerror-query' => 'Zoekopdracht: $1',
 'databaseerror-function' => 'Functie: $1',
 'databaseerror-error' => 'Fout: $1',
 'laggedslavemode' => "'''Waarschuwing:''' in deze pagina zijn recente wijzigingen mogelijk nog niet verwerkt.",
@@ -828,6 +833,9 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
 'userlogin-resetpassword-link' => 'Uw wachtwoord opnieuw instellen',
 'helplogin-url' => 'Help:Aanmelden',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulp bij aanmelden]]',
+'userlogin-loggedin' => 'U bent al aangemeld als {{GENDER:$1|$1}}.
+Gebruik het onderstaande formulier om aan te melden als een andere gebruiker.',
+'userlogin-createanother' => 'Nog een gebruiker aanmaken',
 'createacct-join' => 'Geef uw gegevens hieronder op.',
 'createacct-another-join' => 'Geef hieronder de informatie voor de nieuwe gebruiker op.',
 'createacct-emailrequired' => 'E-mailadres',
@@ -1799,8 +1807,8 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'action-block' => 'deze gebruiker een bewerkingsblokkade op te leggen',
 'action-protect' => 'het beveiligingsniveau van deze pagina aan te passen',
 'action-rollback' => 'bewerkingen van de laatste gebruiker die een pagina heeft bewerkt snel terugdraaien',
-'action-import' => "pagina's importeren van een andere wiki",
-'action-importupload' => 'deze pagina importeren uit een bestandsupload',
+'action-import' => "pagina's te importeren van een andere wiki",
+'action-importupload' => "pagina's te importeren uit een bestandsupload",
 'action-patrol' => 'bewerkingen van anderen als gecontroleerd te markeren',
 'action-autopatrol' => 'eigen bewerkingen als gecontroleerd te laten markeren',
 'action-unwatchedpages' => "de lijst met pagina's die niet op een volglijst staan te bekijken",
@@ -2622,9 +2630,11 @@ Zie het $2 voor een overzicht van recente verwijderingen.',
 'deleteotherreason' => 'Andere reden:',
 'deletereasonotherlist' => 'Andere reden',
 'deletereason-dropdown' => '*Veel voorkomende verwijderredenen
-** Op aanvraag van auteur
+** Spam
+** Vandalisme
 ** Schending van auteursrechten
-** Vandalisme',
+** Op aanvraag van auteur
+** Kapotte doorverwijzing',
 'delete-edit-reasonlist' => 'Redenen voor verwijderen bewerken',
 'delete-toobig' => "Deze pagina heeft een lange bewerkingsgeschiedenis, meer dan $1 {{PLURAL:$1|versie|versies}}.
 Het verwijderen van dit soort pagina's is met rechten beperkt om het per ongeluk verstoren van de werking van {{SITENAME}} te voorkomen.",
@@ -2791,7 +2801,7 @@ $1',
 'contributions' => '{{GENDER:$1|Gebruikersbijdragen}}',
 'contributions-title' => 'Bijdragen van $1',
 'mycontris' => 'Bijdragen',
-'contribsub2' => 'Voor $1 ($2)',
+'contribsub2' => 'Voor {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Geen wijzigingen gevonden die aan de gestelde criteria voldoen.',
 'uctop' => '(laatste wijziging)',
 'month' => 'Van maand (en eerder):',
@@ -3278,6 +3288,7 @@ U kunt wel de broncode bekijken.',
 'tooltip-undo' => 'Met "ongedaan maken" draait u deze bewerking terug en komt in het bewerkingsvenster. U kunt in de bewerkingssamenvatting een reden opgeven.',
 'tooltip-preferences-save' => 'Voorkeuren opslaan',
 'tooltip-summary' => 'Voer een korte samenvatting in',
+'tooltip-iwiki' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/** CSS die hier wordt geplaatst heeft invloed op alle skins */',
@@ -4182,7 +4193,10 @@ Samen met dit programma hoort u een [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van
 'tags-tag' => 'Labelnaam',
 'tags-display-header' => 'Weergave in wijzigingslijsten',
 'tags-description-header' => 'Volledige beschrijving van betekenis',
+'tags-active-header' => 'Actief?',
 'tags-hitcount-header' => 'Gelabelde bewerkingen',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nee',
 'tags-edit' => 'bewerken',
 'tags-hitcount' => '$1 {{PLURAL:$1|wijziging|wijzigingen}}',
 
index e9dd325..74eddc5 100644 (file)
@@ -941,7 +941,7 @@ Mellombels passord: $2',
 'preview' => 'Førehandsvising',
 'showpreview' => 'Førehandsvis',
 'showlivepreview' => 'Levande førehandsvising',
-'showdiff' => 'Vis skilnader',
+'showdiff' => 'Sjå skilnader',
 'anoneditwarning' => "'''Åtvaring:''' Du er ikkje innlogga.
 IP-adressa di vert lagra i endringshistorikken til sida.",
 'anonpreviewwarning' => "''Du er ikkje innlogga. Lagrar du vil IP-adressa di verta ført opp i endringshistorikken til denne sida.''",
@@ -3889,7 +3889,10 @@ Du skal ha motteke [{{SERVER}}{{SCRIPTPATH}}/COPYING ein kopi av GNU General Pub
 'tags-tag' => 'Merkenamn',
 'tags-display-header' => 'Utsjånad på endringslister',
 'tags-description-header' => 'Tyding',
+'tags-active-header' => 'Verksamt?',
 'tags-hitcount-header' => 'Merkte endringar',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nei',
 'tags-edit' => 'endra',
 'tags-hitcount' => '{{PLURAL:$1|éi endring|$1 endringar}}',
 
index 48eac61..cb687eb 100644 (file)
@@ -672,6 +672,8 @@ $2',
 ନିଜର [[Special:Preferences|{{SITENAME}} ପସନ୍ଦସବୁକୁ]] ବଦଳାଇବାକୁ ଭୁଲିବେ ନାହିଁ ।',
 'yourname' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
 'userlogin-yourname' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ',
+'userlogin-yourname-ph' => 'ଆପଣଙ୍କ ଇଉଜର ନାମ ଟାଇପ କରନ୍ତୁ',
+'createacct-another-username-ph' => 'ଆପଣଙ୍କ ଇଉଜର ନାମ ଟାଇପ କରନ୍ତୁ',
 'yourpassword' => 'ପାସୱାର୍ଡ଼',
 'userlogin-yourpassword' => 'ପାସୱାର୍ଡ଼',
 'userlogin-yourpassword-ph' => 'ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ ନିବେଶ କରନ୍ତୁ',
@@ -680,6 +682,8 @@ $2',
 'createacct-yourpasswordagain' => 'ପାସୱର୍ଡ଼ ନିଶ୍ଚିତ କରିବେ',
 'createacct-yourpasswordagain-ph' => 'ପୁଣି ପାସୱର୍ଡ଼ ନିବେଶ କରନ୍ତୁ',
 'remembermypassword' => 'ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
+'userlogin-remembermypassword' => 'ମୋତେ ଲଗ-ଇନ କରି ରଖିଥାନ୍ତୁ',
+'userlogin-signwithsecure' => 'ନିରାପଦ କନେକସନ ବ୍ୟବ‌ହାର କରନ୍ତୁ',
 'yourdomainname' => 'ଆପଣଙ୍କ ଡୋମେନ:',
 'password-change-forbidden' => 'ଆପଣ ଏହି ଉଇକିରେ ପାସୱାର୍ଡ ବଦଳାଇ ପାରିବେ ନାହିଁ ।',
 'externaldberror' => 'ବୋଧ ହୁଏ ଚିହ୍ନଟ ଡାଟାବେସ ଭୁଲଟିଏ ହୋଇଥିଲା ବା ଆପଣଙ୍କୁ ନିଜର ବାହାର ଖାତା ଅପଡେଟ କରିବା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ ।',
@@ -692,20 +696,30 @@ $2',
 'userlogout' => 'ଲଗ ଆଉଟ',
 'notloggedin' => 'ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି',
 'userlogin-noaccount' => 'ଖାତାଟିଏ ନାହିଁ?',
+'userlogin-joinproject' => '{{SITENAME}}ରେ ଯୋଗଦିଅନ୍ତୁ',
 'nologin' => 'ଖାତାଟିଏ ନାହିଁ? $1।',
 'nologinlink' => 'ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
 'createaccount' => 'ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
 'gotaccount' => 'ଆଗରୁ ଖାତାଟିଏ ଅଛି କି? $1.',
 'gotaccountlink' => 'ଲଗ ଇନ (Log in)',
 'userlogin-resetlink' => 'ଲଗଇନ ତଥ୍ୟ ସବୁ ଭୁଲିଗେଲେକି?',
+'userlogin-resetpassword-link' => 'ପାସୱାର୍ଡ଼ ରିସେଟ କରନ୍ତୁ',
+'helplogin-url' => 'Help:Logging_in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ଲଗ-ଇନ କରିବାରେ ସ‌ହ‌ଯୋଗ]]',
 'createacct-emailrequired' => 'ଇମେଲ ଠିକଣା',
 'createacct-emailoptional' => 'ଇମେଲ ଠିକଣା (ଇଚ୍ଛାଧୀନ)',
 'createacct-email-ph' => 'ଆପଣଙ୍କ ଇମେଲ ଠିକଣା ନିବେଶ କରନ୍ତୁ',
-'createaccountmail' => 'ଗୋଟିଏ ସାମୟିକ ଜାହିତାହି ପାସୱାର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ ଏବଂ ଏହାକୁ ତଳେ ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାକୁ ପଠେଇ ଦିଅନ୍ତୁ',
+'createacct-another-email-ph' => 'ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ',
+'createaccountmail' => 'ଏକ ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରନ୍ତୁ ଏବଂ ଏହାକୁ ତଳେ ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାକୁ ପଠେଇ ଦିଅନ୍ତୁ',
 'createacct-realname' => 'ପ୍ରକୃତ ନାମ (ଇଚ୍ଛାଧୀନ)',
 'createaccountreason' => 'କାରଣ:',
 'createacct-reason' => 'କାରଣ',
 'createacct-reason-ph' => 'ଆପଣ ଅନ୍ୟଏକ ଖାତା କାହିଁକି ତିଆରି କରୁଛନ୍ତି',
+'createacct-imgcaptcha-ph' => 'ଉପରେ ଲେଖାଥିବା ଲେଖାଟି ଲେଖନ୍ତୁ',
+'createacct-submit' => 'ନିଜର ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
+'createacct-another-submit' => 'ଆଉ ଏକ ଖାତା ଖୋଲନ୍ତୁ',
+'createacct-benefit-heading' => '{{SITENAME}} ଆପଣଙ୍କ ଭଳି ଲୋକମାନଙ୍କ ଦ୍ୱାରା ଗଢ଼ା ।',
+'createacct-benefit-body1' => '{{PLURAL:$1|ସମ୍ପାଦନା|ସମ୍ପାଦନାମାନ}}',
 'badretype' => 'ଆପଣ ଦେଇଥିବା ପାସବାର୍ଡ଼ଟି ମେଳଖାଉନାହିଁ ।',
 'userexists' => 'ଆପଣ ଦେଇଥିବା ଇଉଜର ନାମ ଆଗରୁ ଅଛି ।
 ଦୟାକରି ଅଲଗା ନାମଟିଏ ବାଛନ୍ତୁ ।',
@@ -1459,7 +1473,9 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'prefs-signature' => 'ସନ୍ତକ',
 'prefs-dateformat' => 'ତାରିଖ ସଜାଣି',
 'prefs-timeoffset' => 'ସମୟ ଆରମ୍ଭ',
-'prefs-advancedediting' => 'ସାଧାରଣ',
+'prefs-advancedediting' => 'ସାଧାରଣ ବିକଳ୍ପ',
+'prefs-editor' => 'ସମ୍ପାଦକ',
+'prefs-preview' => 'ଦେଖଣା',
 'prefs-advancedrc' => 'ଉନ୍ନତ ବିକଳ୍ପସମୂହ',
 'prefs-advancedrendering' => 'ଉନ୍ନତ ବିକଳ୍ପସମୂହ',
 'prefs-advancedsearchoptions' => 'ଉନ୍ନତ ବିକଳ୍ପସମୂହ',
@@ -1467,7 +1483,9 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'prefs-displayrc' => 'ଦେଖଣା ବିକଳ୍ପ',
 'prefs-displaysearchoptions' => 'ଦେଖଣା ବିକଳ୍ପ',
 'prefs-displaywatchlist' => 'ଦେଖଣା ବିକଳ୍ପ',
+'prefs-tokenwatchlist' => 'ଟୋକନ୍‌',
 'prefs-diffs' => 'ତଫାତସବୁ',
+'prefs-help-prefershttps' => 'ଏହି ପସନ୍ଦ ଆପଣଙ୍କ ଲଗ୍ଇନ୍ କରିବାପରେ କାର୍ଯ୍ୟକ୍ଷମ ହେବ ।',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'ଇ-ମେଲ ଠିକଣା ବୈଧ ଭଳି ଲାଗୁଅଛି',
@@ -2396,8 +2414,8 @@ wiki: $PAGEEDITOR_WIKI
 
 # Rollback
 'rollback' => 'ପୁରାପୁରି ପଛକୁ ଫେରିବା ବଦଳ',
-'rollback_short' => 'ପà­\81ରାପà­\81ରି ପଛକୁ ଫେରିଯିବେ',
-'rollbacklink' => 'ପà­\81ରାପà­\81ରି ପଛକୁ ଫେରିଯିବେ',
+'rollback_short' => 'ପà­\82ରାପà­\82ରି ପଛକୁ ଫେରିଯିବେ',
+'rollbacklink' => 'ପà­\82ରାପà­\82ରି ପଛକୁ ଫେରିଯିବେ',
 'rollbacklinkcount' => '{{PLURAL:$1|edit|edits}} $1 ପଛକୁ ଫେରାଇବେ',
 'rollbacklinkcount-morethan' => '{{PLURAL:$1|edit|edits}} $1ରୁ ଅଧିକ ପଛକୁ ଫେରାଇବେ',
 'rollbackfailed' => 'ପୁରାପୁରି ପଛକୁ ଫେରିବା ବିଫଳ ହେଲା',
@@ -3885,7 +3903,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 
 # Database error messages
 'dberr-header' => 'ଏହି ଉଇକିରେ କିଛି ଅସୁବିଧା ଅଛି ।',
-'dberr-problems' => 'à¬\95à­\8dଷମାà¬\95ରିବà­\87 !  à¬\8fହି à¬¸à¬¾à¬\87à¬\9fରà­\87 à¬\9fିà¬\95à­\87 à¬¯à¬¾à¬¨à­\8dତà­\8dରିà¬\95',
+'dberr-problems' => 'à¬\95à­\8dଷମାà¬\95ରିବà­\87 !  à¬\8fହି à¬¸à¬¾à¬\87à¬\9fରà­\87 à¬\9fିà¬\95à­\87 à¬¬à­\88ଷà­\9fିà¬\95 à¬¤à­\8dରà­\81à¬\9fି à¬¦à­\87à¬\96ାଦà­\87à¬\87à¬\9bି à¥¤',
 'dberr-again' => 'କିଛି ମିନିଟ ଅପେକ୍ଷା କରିବା ସହ ଆଉ ଥରେ ଲୋଡ କରନ୍ତୁ ।',
 'dberr-info' => '(ଡାଟାବେସ ସର୍ଭର ସହ ଯୋଗାଯୋଗ କରିପାରିଲୁ ନାହିଁ: $1)',
 'dberr-usegoogle' => 'ଏହି ସମୟ ଭିତରେ ଆପଣ ଗୁଗଲରେ ଖୋଜି ପାରିବେ ।',
index 5def103..839037b 100644 (file)
@@ -907,13 +907,13 @@ Być może właśnie zmienił{{GENDER:|eś|aś|eś(‐aś)}} swoje hasło lub po
 $2
 
 {{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.
-Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inni poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chce go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystał ze swojego starego hasła.',
+Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chcesz go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystać ze swojego starego hasła.',
 'passwordreset-emailtext-user' => 'Użytkownik $1 poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}
 
 $2
 
 {{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.
-Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inni poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chce go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystał ze swojego starego hasła.',
+Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chcesz go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystać ze swojego starego hasła.',
 'passwordreset-emailelement' => 'Nazwa użytkownika – $1
 Tymczasowe hasło – $2',
 'passwordreset-emailsent' => 'E‐mail pozwalający na zresetowanie hasła został wysłany.',
@@ -2518,10 +2518,12 @@ Zobacz na stronie $2 rejestr ostatnio wykonanych usunięć.',
 'deletecomment' => 'Powód',
 'deleteotherreason' => 'Inny lub dodatkowy powód:',
 'deletereasonotherlist' => 'Inny powód',
-'deletereason-dropdown' => '* Najczęstsze powody usunięcia
+'deletereason-dropdown' => '* Najczęstsze przyczyny usunięcia
+** Spam
+** Wandalizm
+** Naruszenia praw autorskich
 ** Prośba autora
-** Naruszenie praw autorskich
-** Wandalizm',
+** Zerwane przekierowanie',
 'delete-edit-reasonlist' => 'Edytuj listę przyczyn usunięcia',
 'delete-toobig' => 'Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />
 Usuwanie jej zostało ograniczone ze względu na możliwość zakłócenia pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
@@ -2685,7 +2687,7 @@ $1',
 'contributions' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}}',
 'contributions-title' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}} $1',
 'mycontris' => 'Edycje',
-'contribsub2' => 'Dla użytkownika $1 ($2)',
+'contribsub2' => 'Dla {{GENDER:$3|użytkownika|użytkowniczki}}$1 ($2)',
 'nocontribs' => 'Brak zmian odpowiadających tym kryteriom.',
 'uctop' => '(ostatnia)',
 'month' => 'Do miesiąca (włącznie)',
@@ -4101,7 +4103,10 @@ Powinieneś otrzymać [{{SERVER}}{{SCRIPTPATH}}/COPYING kopię licencji GNU Gene
 'tags-tag' => 'Nazwa znacznika',
 'tags-display-header' => 'Wystąpienia na listach zmian',
 'tags-description-header' => 'Pełny opis znaczenia',
+'tags-active-header' => 'Aktywny?',
 'tags-hitcount-header' => 'Oznaczone zmiany',
+'tags-active-yes' => 'Tak',
+'tags-active-no' => 'Nie',
 'tags-edit' => 'edytuj',
 'tags-hitcount' => '$1 {{PLURAL:$1|zmiana|zmiany|zmian}}',
 
index 8e0032a..1d3f755 100644 (file)
@@ -49,12 +49,12 @@ $messages = array(
 'tog-hidepatrolled' => "Stërmé le modìfiche dzorvejà ant j'ùltime modìfiche",
 'tog-newpageshidepatrolled' => 'Stërmé le pàgine dzorvejà da la lista dle pàgine neuve',
 'tog-extendwatchlist' => "Slarghé la lista ëd ròba che as ten sot-euj an manera che a la smon-a tute le modìfiche, nen mach j'ùltime",
-'tog-usenewrc' => "Argropré le modìfiche për pàgina ant j'ùltime modìfiche e ant la lista dla ròba ch'as ten sot-euj (a-i và JavaScript)",
+'tog-usenewrc' => "Argropré le modìfiche për pàgina ant j'ùltime modìfiche e ant la lista dla ròba ch'as ten sot-euj",
 'tog-numberheadings' => 'Tìtoj ëd paràgraf<br />che as nùmero daspërlor',
-'tog-showtoolbar' => "Smon-e la bara dj'utiss ëd modìfica (a-i va Javascript)",
-'tog-editondblclick' => "Dobia sgnacà për modifiché l'artìcol (a-i va JavaScript)",
+'tog-showtoolbar' => "Smon-e la bara dj'utiss ëd modìfica",
+'tog-editondblclick' => 'Dobia sgnacà për modifiché la pàgina',
 'tog-editsection' => "Abilité le modìfiche ëd session con j'anliure [modifiché]",
-'tog-editsectiononrightclick' => 'Abilité la modìfica dle session ën sgnacand-je ansima al tìtol col tast drit dël rat (a-i va Javascript)',
+'tog-editsectiononrightclick' => 'Abilité la modìfica dle session ën sgnacand-je ansima ai tìtoj col tast drit dël rat',
 'tog-showtoc' => "Smon-e la tàula dij contnù (për le pàgine che l'han pì che 3 session)",
 'tog-rememberpassword' => "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di}})",
 'tog-watchcreations' => "Gionté le pàgine che i creo mi e j'archivi che i cario mi a la lista ëd lòn che im ten-o sot-euj",
@@ -72,7 +72,7 @@ $messages = array(
 'tog-shownumberswatching' => "Smon-e ël nùmer d'utent che as ten-o la pàgina sot-euj",
 'tog-oldsig' => 'Firma esistenta:',
 'tog-fancysig' => "Traté la firma com dël test wiki (sensa n'anliura automàtica)",
-'tog-uselivepreview' => "Dovré la fonsion ''Preuva dal viv'' (a-i va JavaScript) (sperimental)",
+'tog-uselivepreview' => "Dovré la fonsion ''Preuva dal viv'' (sperimental)",
 'tog-forceeditsummary' => "Ciamé conferma se ël resumé dla modìfica a l'é veujd",
 'tog-watchlisthideown' => 'Stërmé mie modìfiche ant la ròba che im ten-o sot-euj',
 'tog-watchlisthidebots' => 'Stërmé le modìfiche fàite daj trigomiro ant la lista dle ròbe che im ten-o sot-euj',
@@ -86,6 +86,7 @@ $messages = array(
 'tog-noconvertlink' => "Disativé la conversion dij tìtoj ant j'anliure",
 'tog-norollbackdiff' => "Fé nen vëdde le diferense apress d'avèj ripristinà",
 'tog-useeditwarning' => 'Aviseme quand che i chito na pàgina ëd modìfiche con dle modìfiche nen salvà',
+'tog-prefershttps' => "Dovré sempe na conession sigura pr'ësté andrinta al sistema",
 
 'underline-always' => 'Sempe',
 'underline-never' => 'Mai',
@@ -149,6 +150,18 @@ $messages = array(
 'oct' => 'otó',
 'nov' => 'nov',
 'dec' => 'dzè',
+'january-date' => '$1 gené',
+'february-date' => '$1 fërvé',
+'march-date' => '$1 mars',
+'april-date' => '$1 avril',
+'may-date' => '$1 maj',
+'june-date' => '$1 giugn',
+'july-date' => '$1 luj',
+'august-date' => '$1 ost',
+'september-date' => '$1 stèmber',
+'october-date' => '$1 otóber',
+'november-date' => '$1 novèmber',
+'december-date' => '$1 dzèmber',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorìa|Categorìe}}',
@@ -174,7 +187,7 @@ $messages = array(
 'newwindow' => '(as deurb ant na fnestra neuva)',
 'cancel' => 'Anulé',
 'moredotdotdot' => 'Ëd pì...',
-'morenotlisted' => "A-i na j'é ëdcò d'àutri nen ant la lista...",
+'morenotlisted' => "Costa lista a l'é nen completa.",
 'mypage' => 'Pàgina',
 'mytalk' => 'Ciaciarade',
 'anontalk' => "Ciaciarade për st'adrëssa IP-sì",
@@ -230,6 +243,7 @@ $messages = array(
 'create-this-page' => 'Creé sta pàgina',
 'delete' => 'Scancelé',
 'deletethispage' => 'Scancelé sa pàgina',
+'undeletethispage' => 'Arcuperé sta pàgina',
 'undelete_short' => 'Arcuperé {{PLURAL:$1|na modìfica|$1 modìfiche}}',
 'viewdeleted_short' => 'Vardé {{PLURAL:$1|na modìfica scancelà|$1 modìfiche scancelà}}',
 'protect' => 'Protege',
@@ -276,7 +290,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' => 'A propòsit ëd {{SITENAME}}',
 'aboutpage' => 'Project:A propòsit',
-'copyright' => 'Ël contnù a resta disponìbil sota a na licensa $1.',
+'copyright' => "Ël contnù a resta disponìbil sota $1 gavà ch'a sia marcà an n'àutra manera.",
 'copyrightpage' => "{{ns:project}}:Drit d'autor",
 'currentevents' => 'Neuve',
 'currentevents-url' => 'Project:Neuve',
@@ -359,6 +373,11 @@ Na lista dle pàgine speciaj bon-e a peul esse trovà ambelessì [[Special:Speci
 # General errors
 'error' => 'Eror',
 'databaseerror' => 'Eror ant la base ëd dat',
+'databaseerror-text' => "A l'é rivaje n'eror d'arcesta ëd base ëd dàit. Sòn a podrìa ven-e da 'n givo ant ël programa.",
+'databaseerror-textcl' => "A l'é rivaje n'eror d'arcesta ëd base ëd dàit.",
+'databaseerror-query' => 'Arcesta: $1',
+'databaseerror-function' => 'Fonsion: $1',
+'databaseerror-error' => 'Eror: $1',
 'laggedslavemode' => "'''Avis:''' la pàgina a podrìa ëdcò nen mostré le modìfiche pi recente.",
 'readonly' => 'Acess a la base ëd dat sërà për chèich temp.',
 'enterlockreason' => 'Che a buta na rason për ël blocagi, con andrinta data e ora ëd quand che a stima che a sarà gavà.',
@@ -392,6 +411,7 @@ Peul desse ch'a l'é già stàit ëscancelà da cheidun d'àutr.",
 'cannotdelete-title' => 'As peul pa scancelesse la pàgina «$1»',
 'delete-hook-aborted' => "Scancelassion anulà da n'estension.
 A l'ha smonù gnun-e spiegassion.",
+'no-null-revision' => 'Impossìbil creé na neuva revision veuida për la pàgina « $1 »',
 'badtitle' => 'Tìtol nen giust',
 'badtitletext' => "Ël tìtol ëd la pàgina che a l'ha ciamà a l'era nen giust, veuid, o un tìtol nen lijà ëd fasson giusta antra le lenghe o antra le wiki. A podrìa conten-e un o pi caràter ch'a peulo nen esse dovrà ant ij tìtoj.",
 'perfcached' => "Ij dat sì-dapress a sòn ëstàit memorisà an local e a peulo esse nen agiornà. Al pi {{PLURAL:$1|n'arzultà a l'é disponìbil|$1 arzultà a son disponìbij}} ant la memòria local.",
@@ -439,7 +459,6 @@ L'aministrator ch'a l'ha blocalo a l'ha lassà sta spiegassion: «$3».",
 # Login and logout pages
 'logouttext' => "'''A l'é surtì da 'nt ël sistema.'''
 
-A peul tiré anans a dovré {{SITENAME}} coma utent anònim, ò pura a peul <span class='plainlinks'>[$1 rintré torna ant ël sistema]</span> con l'istess stranòm che a dovrava prima, ò con un diferent.
 Ch'a nòta che chèiche pàgine a peulo continué a esse visualisà com s'a fussa ancor ant ël sistema, fin ch'a scancela nen la memòria local ëd sò navigador.",
 'welcomeuser' => 'Bin ëvnù, $1!',
 'welcomecreation-msg' => "Sò cont a l'é stàit creà.
@@ -480,6 +499,9 @@ Che a dësmentia pa ëd cambié ij [[Special:Preferences|sò gust për {{SITENAM
 'userlogin-resetpassword-link' => 'Riamposté la ciav',
 'helplogin-url' => 'Help:Conession',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Agiut con la conession]]',
+'userlogin-loggedin' => "A l'é già rintrà an ël sistema tanme {{GENDER:$1|$1}}.
+Ch'a deuvra ël formolari sì-sota për rintré coma n'àutr n'utent.",
+'userlogin-createanother' => "Creé n'àutr cont",
 'createacct-join' => "Ch'a anserissa soe anformassion sì-sota.",
 'createacct-another-join' => "Anserì j'anformassion dël cont neuv sì-sota.",
 'createacct-emailrequired' => 'Adrëssa ëd pòsta eletrònica',
@@ -692,102 +714,103 @@ Se a sgnaca torna «{{int:savearticle}}», soa modìfica a sarà salvà sensa gn
 'subject-preview' => "Preuva dl'oget/intestassion:",
 'blockedtitle' => "L'utent a l'é blocà.",
 'blockedtext' => "'''Sò stranòm ò pura adrëssa IP a l'é stàit blocà.'''
-\"
-Ël blocagi a l'é stàit fàit da \$1.
-Coma rason a l'ha butà ''\$2''.
 
-* Blocà a parte dal: \$8
-* Fin al: \$6
-* As veul blochesse: \$7
+Ël blocagi a l'é stàit fàit da $1.
+Coma rason a l'ha butà ''$2''.
 
-A peul butesse an contat con \$1 ò pura n'àotr [[{{MediaWiki:Grouppage-sysop}}|aministrator]] për discute ëd sò blocagi.
+* Blocà a parte dal: $8
+* Fin al: $6
+* As veul blochesse: $7
+
+A peul butesse an contat con $1 ò pura n'àotr [[{{MediaWiki:Grouppage-sysop}}|aministrator]] për discute ëd sò blocagi.
 Ch'a ten-a present ch'a podrà dovré la fonsion «mandeje un messagi ëd pòsta eletrònica a l'utent» mach s'a l'ha specificà n'adrëssa ëd vàlida ant [[Special:Preferences|sò gust]] e se sta fonsion a l'é nen ëstàita blocà 'cò chila.
-Soa adrëssa IP corenta a l'é \$3, e l'identificativ dël blocagi a l'é #\$5.
+Soa adrëssa IP corenta a l'é $3, e l'identificativ dël blocagi a l'é #$5.
 Për piasì, ch'a-j buta tut e doj ant soe comunicassion ant sta question-sì.",
-'autoblockedtext' => "Soa adrëssa IP a l'è stàita blocà n'automàtich ën essend ch'a l'era dovrà da n'àutr utent, che a l'é stàit blocà da \$1.
-La rason butà për ël blocagi a l'é
+'autoblockedtext' => "Soa adrëssa IP a l'è stàita blocà n'automàtich ën essend ch'a l'era dovrà da n'àutr utent, che a l'é stàit blocà da $1.
+La rason ësmonùa a l'é
 
-:''\$2''
+:''$2''
 
-* Ël blocagi a part dël: \$8
-* A va a la fin dël: \$6
-* Antërval ëd blocagi: \$7
+* Ël blocagi a part dai: $8
+* A va a la fin ai: $6
+* As veul blochesse: $7
 
-A peul contaté \$1 ò pura n'àotr dj'[[{{MediaWiki:Grouppage-sysop}}|aministrator]] për discute d'ës blocagi.
+A peul contaté $1 ò pura n'àotr dj'[[{{MediaWiki:Grouppage-sysop}}|aministrator]] për discute d'ës blocagi.
 
-Ch'a varda mach ch'a peul nen dovré l'opsion ëd \"mandeje un messagi a l'utent\" se a l'ha nen n'adrëssa ëd pòsta eletrònica registrà e verificà ant [[Special:Preferences|sò gust]] e se chiel a l'é stàit blocà ëdcò dal dovrela.
+Ch'a varda mach ch'a peul nen dovré l'opsion ëd «mandeje un mëssagi a l'utent» se a l'ha nen n'adrëssa ëd pòsta eletrònica vàlida registrà ant [[Special:Preferences|sò gust]] o se chiel a l'é stàit blocà ëdcò dal dovrela.
 
-Soa adrëssa IP corenta a l'é \$3, e sò nùmer ëd blocagi a l'é \$5.
-Për piasì, ch'a buta sempe tùit ij detaj an tute le comunicassion andova ch'as parla ëd sò blocagi.",
-'blockednoreason' => "a l'han pa butà gnun-a rason",
-'whitelistedittext' => 'A venta $1 për podèj fé dle modìfiche.',
-'confirmedittext' => 'A dev confermé soa adrëssa ëd pòsta eletrònica, anans che modifiché dle pàgine. Për piasì, che a convàlida soa adrëssa ën dovrand la pàgina [[Special:Preferences|mè gust]].',
+Soa adrëssa IP corenta a l'é $3, e sò nùmer ëd blocagi a l'é $5.
+Për piasì, ch'a buta sempe tùit ij detaj an tute j'arceste ch'a farà.",
+'blockednoreason' => 'gnun-a rason butà',
+'whitelistedittext' => 'A dev $1 për podèj fé dle modìfiche a le pàgine.',
+'confirmedittext' => 'A dev confermé soa adrëssa ëd pòsta eletrònica, anans che modifiché dle pàgine. Për piasì, che a convàlida soa adrëssa ën dovrand la pàgina dij [[Special:Preferences|sò gust]].',
 'nosuchsectiontitle' => 'As peul pa trovesse la session',
 'nosuchsectiontext' => "A l'ha provasse a modifiché na session ch'a-i é pa.
-A peul essa stàita tramudà o scancelà an mente ch'a vëdìa la pàgina.",
-'loginreqtitle' => 'a venta rintré ant ël sistema',
+A peul essa stàita tramudà o scancelà antramentre ch'a vëdìa la pàgina.",
+'loginreqtitle' => 'A venta rintré ant ël sistema',
 'loginreqlink' => 'rintré ant ël sistema',
-'loginreqpagetext' => "Che a pòrta passiensa, ma a dev $1 për podèj vëdde dj'àutre pàgine.",
-'accmailtitle' => 'Ciav spedìa.',
-'accmailtext' => "Na ciav generà a cas për [[User talk:$1|$1]] a l'é stàita mandà a $2.
-
-La ciav për cost neuv cont a peul esse cambià an duvertand la pàgina ''[[Special:ChangePassword|cambia ciav]]''",
+'loginreqpagetext' => "A dev $1 për podèj vëdde j'àutre pàgine.",
+'accmailtitle' => 'Ciav spedìa',
+'accmailtext' => "Na ciav generà a l'ancàpit për [[User talk:$1|$1]] a l'é stàita mandà a $2.
+A peul esse modificà an sla pàgina ''[[Special:ChangePassword|modìfica dla ciav]]'' apress esse rintrà ant ël sistema.",
 'newarticle' => '(Neuv)',
-'newarticletext' => "It ses andàit daré a un colegament a na pàgina che a esist ancó pa.
-Për creé la pàgina, ancamin-a a scrive ant lë spassi sì-sota (varda la [[{{MediaWiki:Helppage}}|pàgina d'agiut]] për savèjne ëd pì).
-S'it ses sì për eror, sgnaca ël boton '''andaré''' ëd tò navigador.",
-'anontalkpagetext' => "----''Costa a l'é la pàgina ëd ciaciarade për n'utent anònim che a l'é ancó pa dorbusse un cont, ò pura che a lo deuvra nen. Alora i l'oma da dovré ël nùmer d'adrëssa IP për deje n'identificassion a chiel/chila. S'it ses n'utent anònim e it l'has l'impression d'arsèive dij coment sensa sust, për piasì [[Special:UserLogin/signup|crea un cont]] o [[Special:UserLogin|Intra]] për evité dë fé confusion con dj'àutri utent anònim.''",
+'newarticletext' => "A l'é andaje dapress a na liura a na pàgina che a esist ancor nen.
+Për creé la pàgina, ch'a ancamin-a a scrive ant lë spassi sì-sota (vëdde la [[{{MediaWiki:Helppage}}|pàgina d'agiut]] për savèjne ëd pì).
+S'a l'é rivà sì për eror, ch'a sgnaca ël boton '''andaré''' ëd sò navigador.",
+'anontalkpagetext' => "----''Costa a l'é la pàgina ëd ciaciarade për n'utent anònim che a l'é ancó pa dorbusse un cont, ò pura che a lo deuvra nen. Alora i l'oma da dovré ël nùmer d'adrëssa IP për deje n'identificassion a chiel o chila.
+N'adrëssa IP përparèj a peul esse partagià da vàire utent.
+Se chiel a l'é n'utent anònim e a l'ha l'impression d'arsèive dij coment sensa sust, për piasì [[Special:UserLogin/signup|ch'a crea un cont]] o [[Special:UserLogin|ch'a rintra ant ël sistema]] për evité dë fé confusion con d'àutri utent anònim.''",
 'noarticletext' => 'Al moment costa pàgina a l\'é veuida.
-It peule [[Special:Search/{{PAGENAME}}|sërché costa vos]] andrinta a d\'àutre pàgine, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],
-o purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} modìfiché la pàgina adess]</span>.',
+A peul [[Special:Search/{{PAGENAME}}|sërché cost tìtol]] andrinta a d\'àutre pàgine, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],
+o purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} modìfiché sta pàgina]</span>.',
 'noarticletext-nopermission' => "Al moment a-i é gnun test ansima a costa pàgina.
 A peul [[Special:Search/{{PAGENAME}}|sërché ës tìtol ëd pàgina]] an d'àutre pàgine,
-o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché j'argistrassion colegà]</span>, ma a l'ha pa ël përmess ëd creé costa pàgina.",
-'missing-revision' => "La revision #\$1 dla pàgina ciamà \"{{PAGENAME}}\" a esist pa.
+o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant j'argistr colegà]</span>, ma a l'ha pa ël përmess ëd creé costa pàgina.",
+'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);
-* '''Internet Explorer:''' Che a ten-a sgnacà ''Ctrl'' antramentre che a sgnaca col rat ansima a ''Agiorné'', ò pura che a sgnaca tut ansema ''Ctrl-F5'';
-* '''Konqueror:''': A basta mach sgnaché ël boton ''Agiorné'', ò pura sgnaché ''F5'';
-*'''Opera''' J'utent a peulo avèj da manca ëd dësvujdé 'd continuo soa memorisassion andrinta a ''Utiss → Gust''.",
-'usercssyoucanpreview' => "'''Drita:''' che a deuvra ël boton \"{{int:showpreview}}\" për controlé l'efet ëd sò còdes CSS dnans ëd salvelo.",
-'userjsyoucanpreview' => "'''Drita:''' che a deuvra ël boton «{{int:showpreview}}» për controlé l'efet ëd sò còdes JS dnans ëd salvelo.",
-'usercsspreview' => "'''Che a varda che lòn che a s-ciàira a l'é nomach na preuva ëd sò CSS.'''
+* '''Firefox / Safari:''' Che a ten-a sgnacà ''Majùscole'' antramentre che a sgnaca col rat ansima a ''Agiorné'', ò pura che a sgnaca ''Ctrl-F5'' o ''Cmd-R'' (''⌘-R'' ansima ai Mac)
+* '''Google Chrome:''' Che a sgnaca ''Ctrl-Majùscole-R'' (''⌘-Majùscole-R'' ansima ai Mac)
+* '''Internet Explorer:''' Che a ten-a sgnacà ''Ctrl'' antramentre che a sgnaca col rat ansima a ''Agiorné'', ò pura che a sgnaca tut ansema ''Ctrl-F5''
+*'''Opera''' Ch'a dësveuida soa memorisassion andrinta a ''Utiss → Gust''",
+'usercssyoucanpreview' => "'''Drita:''' che a deuvra ël boton «{{int:showpreview}}» për controlé l'efet ëd sò neuv còdes CSS dnans ëd salvelo.",
+'userjsyoucanpreview' => "'''Drita:''' che a deuvra ël boton «{{int:showpreview}}» për controlé l'efet ëd sò neuv còdes JavaScript dnans ëd salvelo.",
+'usercsspreview' => "'''Che a varda che lòn che a s-ciàira a l'é nomach na preuva ëd sò feuj CSS.'''
 '''A l'é ancó nen stàit salvà!'''",
-'userjspreview' => "'''Che as visa che a l'é mach antramentr che as fa na preuva ëd sò Javascript, che a l'é ancó pa stàit salvà!'''",
-'sitecsspreview' => "'''Che a varda che a l'é mach an mente ch'a preuva sto CSS.'''
-'''A l'é ancó pa stàit salvà!'''",
-'sitejspreview' => "'''Che a varda che a l'é mach an mente ch'a preuva sto còdes JavaScript.'''
-'''A l'é ancó pa stàit salvà!'''",
-'userinvalidcssjstitle' => "'''Avis:''' A-i é pa gnun-a pel \"\$1\". Che as visa che le pàgine .css e .js che un as fa daspërchiel a deuvro tute minùscole për tìtol, pr'esempi {{ns:user}}:Scaramacaj/vector.css nopà che {{ns:user}}:Scaramacaj/Vector.css.",
+'userjspreview' => "'''Che as visa che a l'é mach antramentre che as fa na preuva ëd sò còdes Javascript e che a l'é ancó pa stàit salvà!'''",
+'sitecsspreview' => "'''Che a varda che a l'é mach an camin ch'a preuva cost CSS.'''
+'''A l'é pa ancora stàit salvà!'''",
+'sitejspreview' => "'''Che a varda che a l'é mach an camin ch'a preuva cost còdes JavaScript.'''
+'''A l'é pa ancora stàit salvà!'''",
+'userinvalidcssjstitle' => "'''Atension:''' A-i é gnun-a pel «$1». Che as visa che le pàgine .css e .js che un as fa daspërchiel a deuvro tute minùscole për tìtol, pr'esempi {{ns:user}}:Scaramacaj/vector.css nopà che {{ns:user}}:Scaramacaj/Vector.css.",
 'updated' => '(Agiornà)',
-'note' => "'''NÃ\92TA:'''",
-'previewnote' => "'''Che a ten-a present che costa-sì a l'é mach na preuva.'''
-Ij sò cambi a son anco' pa stàit salvà!",
+'note' => "'''Nòta:'''",
+'previewnote' => "'''Che a ten-a da ment che costa-sì a l'é mach na preuva.'''
+Soe modìfiche a son pa ancora stàite salvà!",
 'continue-editing' => 'Andé a la zòna ëd modìfica',
-'previewconflict' => "Costa preuva a-j mostra ël test dl'artìcol ambelessì dzora. Se a sërn dë salvelo, a l'é parèj che a lo s-ciairëran ëdcò tuti j'àutri Utent.",
-'session_fail_preview' => "'''Darmagi! I l'oma pa podù processé soa modìfica per via che a son përdusse për la stra ij dat ëd session.
-Për piasì che a preuva n'àutra vira. Se a dovèissa mai torna riveje sossì, che a preuva a seurte dal sistema e peuj torna a rintré.'''",
+'previewconflict' => "Costa preuva a mostra ël test dl'artìcol ambelessì-dzora. Se a sern dë salvelo, a l'é parèj che a lo s-ciairëran ëdcò tuti j'àutri Utent.",
+'session_fail_preview' => "'''Darmagi! I l'oma pa podù processé soa modìfica per via che a son përdusse për la stra ij dat ëd session.'''
+Për piasì che a preuva n'àutra vira. Se a dovèissa torna nen marcé, che a preuva a [[Special:UserLogout|seurte dal sistema]] e peuj torna a rintré.",
 'session_fail_preview_html' => "'''Darmagi! I l'oma nen podù processé soa modìfica ën essend che a son përdusse për la stra ij dat ëd session.'''
 
 ''Për via che {{SITENAME}} a lassa mostré còdes HTML nen filtrà, la preuva a l'é stërmà coma precaussion contra a dij possìbij atach fàit an Javascript.''
 
-'''Se sòn a l'era na modìfica normal, për piasì che a preuva a fela n'àutra vira. Se a dovèissa mai torna deje dle gran-e, che a preuva a [[Special:UserLogout|seurte da 'nt ël sistema]] e peuj torna a rintré.'''",
+'''Se costa a l'era na modìfica normal, për piasì che a preuva a fela n'àutra vira. Se a dovèissa mai torna deje dle gran-e, che a preuva a [[Special:UserLogout|seurte da 'nt ël sistema]] e peuj torna a rintré.'''",
 'token_suffix_mismatch' => "'''Soa modìfica a l'é nen stàita acetà përché sò navigator a l'hai fàit ciadel con ij pont e le vìrgole
-ant ël quàder ëd modìfica. La rason che a l'é nen stàit acetà a l'é për evité ch'a-i fasa darmagi al
-test ch'a-i é già. Sossì dle vire a riva quand un a deuvra un programa proxy ëd coj un pòch dla Bajòna.'''",
-'edit_form_incomplete' => "'''Quàich part dël formolari ëd modìfica a l'é pa rivà al sërvent; contròla doe vire che toe modìfiche a-i sio anco' e preuva torna.'''",
+ant ël quàder ëd modìfica.'''
+La rason che a l'é nen stàit acetà a l'é për evité ch'a-j fasa darmagi al
+test ch'a-i é già. Sossì dle vire a riva quand un a deuvra un servent anònim an sl'Aragnà ëd coj un pòch dla Bajòna.",
+'edit_form_incomplete' => "'''Chèiche part dël formolari ëd modìfica a son pa rivà al servent; ch'a contròla për da bin che soe modìfiche a-i sio ancora e ch'a preuva torna.'''",
 'editing' => 'Modìfica ëd $1',
 'creating' => 'Creé $1',
-'editingsection' => 'I soma dapress a modifiché $1 (session)',
-'editingcomment' => 'I soma dapress a modifiché $1 (neuva session)',
-'editconflict' => "Conflit d'edission: $1",
+'editingsection' => 'Modìfica ëd $1 (session)',
+'editingcomment' => 'Modìfica ëd $1 (neuva session)',
+'editconflict' => 'Conflit ëd modìfica: $1',
 'explainconflict' => "Cheidun d'àutr a l'ha salvà soa version dl'artìcol antramentré che chiel (chila) as prontava la soa.
 Ël quàder ëd modìfica dë dzora a mostra ël test ëd l'artìcol coma a resta adess (visadì, lòn che a-i é ant sla Ragnà). Soe modìfiche a stan ant ël quàder dë sota.
 Ën volend a peul gionté soe modìfiche ant ël quàder dë dzora.
@@ -808,7 +831,7 @@ Ant l'istess temp, ën mandand dël material un as pija la responsabilità dë d
 'longpageerror' => "'''EROR: Ël test che a l'ha mandà a l'é longh {{PLURAL:$1|un kilobyte|$1 kilobyte}} , che a resta pì che ël
 lìmit màssim ëd {{PLURAL:$2|un kilobyte|$2 kilobyte}}. Parèj as peul pa salvesse.",
 'readonlywarning' => "'''Avis: La base dat a l'é stàita blocà për manutension, e donca a podrà pa salvesse soe modìfiche tut sùbit.'''
-A peul esse che a-j ven-a còmod copiesse via sò test e butesslo da na part për salvelo peuj.
+A peul esse che a-j ven-a còmod copiesse via sò test e ancoless-lo an n'archivi ëd test e goernelo për pi tard.
 
 L'aministrator che a l'ha fàit ël blocagi a l'ha dàit costa spiegassion: $1",
 'protectedpagewarning' => "'''Avis: costa pàgina-sì a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo feje dle modìfiche.'''
@@ -889,6 +912,7 @@ Costi paràmeter a son stàit lassà fòra.",
 'undo-failure' => "Sta modìfica a l'é nen podusse scancelé për via che a-i son dle contradission antra version antrames.",
 'undo-norev' => "La modìfica a peul nen esse anulà përchè a esist pa o a l'é stàita anulà.",
 'undo-summary' => 'Gavà la revision $1 fàita da [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciaciarade]])',
+'undo-summary-username-hidden' => "Anulé la revision $1 ëd n'utent ëstërmà",
 
 # Account creation failure
 'cantcreateaccounttitle' => "As peul pa registresse d'utent",
@@ -1067,6 +1091,7 @@ Ch'a varda mach che a-i ven-a nen fòra un rabel ant la continuità stòrica.",
 'compareselectedversions' => 'Paragon-a le version selessionà',
 'showhideselectedversions' => 'Smon-e/stërmé le version selessionà',
 'editundo' => "buta 'me ch'a l'era",
+'diff-empty' => '(Gnun-a diferensa)',
 'diff-multi' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} ëd {{PLURAL:$2|n'utent|$2 utent}} pa mostrà)",
 'diff-multi-manyusers' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} da pi che $2 {{PLURAL:$2|n'utent|utent}} pa mostrà)",
 'difference-missing-revision' => "{{PLURAL:$2|Na revision|$2 revision}} dë sta diferensa ($1) a {{PLURAL:$2|l'é pa stàita|son pa stàite}} trovà.
@@ -1116,7 +1141,7 @@ Sòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na
 'search-interwiki-default' => 'Arzultà da $1:',
 'search-interwiki-more' => '(ëd pì)',
 'search-relatedarticle' => 'Corelà',
-'mwsuggest-disable' => 'Disabilité ij sugeriment AJAX',
+'mwsuggest-disable' => "Disabilité ij sugeriment d'arserca",
 'searcheverything-enable' => 'Sërché ant tùit jë spassi nominaj',
 'searchrelated' => 'corelà',
 'searchall' => 'tuti',
@@ -1136,6 +1161,7 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
 'powersearch-togglenone' => 'Gnun',
 'search-external' => 'Arserca esterna',
 'searchdisabled' => "L'arserca anterna ëd {{SITENAME}} a l'é nen abilità; për adess a peul prové a dovré un motor d'arserca estern coma Google. (Però che a ten-a da ment che ij contnù ëd {{SITENAME}} listà ant ij motor pùblich a podrìo ëdcò esse nen d'autut agiornà)",
+'search-error' => "A l'é rivaje n'eror durant l'arserca: $1",
 
 # Preferences page
 'preferences' => 'Mè gust',
@@ -1167,7 +1193,7 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
 'prefs-rendering' => 'Sembiansa',
 'saveprefs' => 'Salvé ij sò gust',
 'resetprefs' => 'Buté torna ij "mè gust" coma a-i ero al prinsipi',
-'restoreprefs' => "Buté torna j'ampostassion dë stàndard",
+'restoreprefs' => "Buté torna j'ampostassion dë stàndard (an tute le session)",
 'prefs-editing' => 'Quàder ëd modìfica dël test',
 'rows' => 'Righe:',
 'columns' => 'Colòne:',
@@ -1179,6 +1205,9 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
 'recentchangesdays-max' => '(al pì $1 {{PLURAL:$1|di|di}})',
 'recentchangescount' => 'Nùmer ëd modìfiche da smon-e për stàndard:',
 'prefs-help-recentchangescount' => "Sòn a comprend j'ùltime modìfiche, le stòrie dle pàgine e ij registr.",
+'prefs-help-watchlist-token2' => "Costa a l'é la ciav segreta dël fluss an sl'Aragnà dla lista ëd lòn ch'as ten sot-euj.
+Qualsëssìa përson-a ch'a la conòssa a podrà lese la lista ëd lòn che chiel a ten sot-euj, ch'a-j la mostra donca a gnun.
+[[Special:ResetTokens|Ch'a sgnaca ambelessì s'a l'ha damanca d'ampostela torna]].",
 'savedprefs' => 'Ij sò gust a son ëstàit salvà.',
 'timezonelegend' => 'Fus orari:',
 'localtime' => 'Ora local:',
@@ -1225,11 +1254,12 @@ Sòn a peul pa esse anulà.',
 'badsig' => "Soa firma a l'é nen giusta, che a controla j'istrussion HTML.",
 'badsiglength' => "Sò stranòm a l'é tròp longh.
 A deuv nen esse pì longh che $1 {{PLURAL:$1|caràter|caràter}}.",
-'yourgender' => 'Sess:',
-'gender-unknown' => 'Nen spessificà',
-'gender-male' => 'Òm',
-'gender-female' => 'Fomna',
-'prefs-help-gender' => "Opsional: a l'é dovrà për adaté ël programa al géner.
+'yourgender' => "'Me ch'a preferiss esse descrivù?",
+'gender-unknown' => 'I preferisso nen dilo',
+'gender-male' => 'Chiel a modìfica dle pàgine dla wiki',
+'gender-female' => 'Chila a modìfica dle pàgine dla wiki',
+'prefs-help-gender' => "Definì coste preferense a l'é opsional.
+Ël programa a deuvra sò valor për adressesse a chiel e massionelo a j'àutri an dovrand ël géner gramatical giust.
 Costa anformassion a sarà pùblica.",
 'email' => 'Pòsta eletrònica',
 'prefs-help-realname' => '* Nòm vèir (opsional): se i sërne da butelo ambelessì a sarà dovrà për deve mérit ëd vòstr travaj.',
@@ -1241,7 +1271,9 @@ Costa anformassion a sarà pùblica.",
 'prefs-signature' => 'Firma',
 'prefs-dateformat' => 'Formà dla data',
 'prefs-timeoffset' => "Diferensa d'ora",
-'prefs-advancedediting' => 'Opsion avansà',
+'prefs-advancedediting' => 'Opsion generaj',
+'prefs-editor' => 'Redator',
+'prefs-preview' => 'Preuva',
 'prefs-advancedrc' => 'Opsion avansà',
 'prefs-advancedrendering' => 'Opsion avansà',
 'prefs-advancedsearchoptions' => 'Opsion avansà',
@@ -1249,7 +1281,9 @@ Costa anformassion a sarà pùblica.",
 'prefs-displayrc' => 'Opsion ëd visualisassion',
 'prefs-displaysearchoptions' => 'Opsion ëd visualisassion',
 'prefs-displaywatchlist' => 'Opsion ëd visualisassion',
+'prefs-tokenwatchlist' => 'Geton',
 'prefs-diffs' => 'Diferense',
+'prefs-help-prefershttps' => 'Costa preferensa a ancaminrà a marcé a soa pròssima conession.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'A smija bon',
@@ -1273,10 +1307,12 @@ Costa anformassion a sarà pùblica.",
 'userrights-no-interwiki' => "A l'ha pa ij përmess dont a fa da manca për podèj cambieje ij drit a dj'utent ansima a dj'àutre wiki.",
 'userrights-nodatabase' => "La base ëd dat $1 a-i é pa, ò pura a l'é nen local.",
 'userrights-nologin' => "A l'ha da [[Special:UserLogin|rintré ant ël sistema]] con un cont da aministrator për podej-je dé dij drit a j'utent.",
-'userrights-notallowed' => "Sòò cont a l'ha pa ij përmess për dé o gavé dij drit a j'utent.",
+'userrights-notallowed' => "Chiel a l'ha pa ij përmess për dé o gavé dij drit a j'utent.",
 'userrights-changeable-col' => "Partìe ch'a peul cambié",
 'userrights-unchangeable-col' => "Partìe ch'a peul pa cambié",
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => "Conflit ëd modìfica ëd drit utent! Për piasì, ch'a lesa torna e ch'a confirma soe modìfiche.",
+'userrights-removed-self' => "A l'ha gavà për da bin ij sò drit. Parèj a peul pa pi acede a costa pàgina.",
 
 # Groups
 'group' => 'Partìa:',
@@ -1320,7 +1356,7 @@ Costa anformassion a sarà pùblica.",
 'right-reupload-shared' => "Coaté an local j'archivi ant ël depòsit dij mojen partagià",
 'right-upload_by_url' => "Carié dj'archivi da n'adrëssa an sl'aragnà",
 'right-purge' => 'Polidé la memòria local ëd na pàgina sensa ciamé conferma',
-'right-autoconfirmed' => 'Modifiché le pàgine semi-protegiùe',
+'right-autoconfirmed' => "Nen esse tocà dal lìmit d'assion basà an sl'IP",
 'right-bot' => 'Esse tratà com un process automàtich',
 'right-nominornewtalk' => "Fé nen comparì l'avis ëd mëssagi neuv, an fasend ëd modìfiche cite a le pàgine ëd discussion",
 'right-apihighlimits' => "Dovré ël lìmit pì àut ant j'anterogassion API",
@@ -1341,12 +1377,20 @@ Costa anformassion a sarà pùblica.",
 'right-ipblock-exempt' => "Dëscavalché ij blocagi ëd j'IP, ij blocagi automàtich e ij blocagi ëd partìe d'IP",
 'right-proxyunbannable' => "Dëscavalché ij blòch automatich dij servent d'anonimà",
 'right-unblockself' => 'Dësblochesse da soj',
-'right-protect' => 'Cambié ij livej ëd protession e modifiché le pàgine protegiùe',
-'right-editprotected' => 'Modifiché le pàgine protegiùe (sensa protession a cascada)',
+'right-protect' => 'Cambié ij livej ëd protession e modifiché le pàgine protegiùe an cascada',
+'right-editprotected' => 'Modifiché le pàgine protegiùe con «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Modifiché le pàgine protegiùe con «{{int:protect-level-autoconfirmed}}»',
 'right-editinterface' => "Modifiché l'antërfacia utent",
 'right-editusercssjs' => "Modifiché j'archivi CSS e JavaScript d'àutri utent",
 'right-editusercss' => "Modifiché j'archivi CSS d'àutri utent",
 'right-edituserjs' => "Modifiché j'archivi JavaScript d'àutri utent",
+'right-editmyusercss' => 'Modifiché ij sò archivi CSS utent',
+'right-editmyuserjs' => 'Modifiché ij sò archivi JavaScript utent',
+'right-viewmywatchlist' => "Vëdde la lista ëd lòn ch'as ten sot-euj",
+'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",
@@ -1398,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',
@@ -1408,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",
@@ -1441,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"',
 
@@ -1461,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',
@@ -1708,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",
@@ -1720,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',
@@ -1816,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".',
@@ -1841,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.
@@ -1898,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',
@@ -1913,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',
@@ -2007,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",
@@ -2017,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',
@@ -2091,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}}.",
@@ -2175,9 +2247,11 @@ Che a varda $2 për na lista dle pàgine scancelà ant j'ùltim temp.",
 'deleteotherreason' => 'Rason àutra/adissional:',
 'deletereasonotherlist' => 'Àutra rason',
 'deletereason-dropdown' => "*Rason sòlite ch'a së scancela la ròba
-** A lo ciama l'àutor
+** Rumenta
+** Vandalism
 ** Violassion dij drit d'autor
-** Vandalism",
+** A lo ciama l'àutor
+** Ridiression cioca",
 'delete-edit-reasonlist' => 'Modifiché la rason dlë scancelament',
 'delete-toobig' => "Sta pàgina-sì a l'ha na stòria motobin longa, bele pì che $1 {{PLURAL:$1|revision|revision}}.
 Lë scancelassion ëd pàgine parèj a l'é stàita limità për evité ch'as fasa darmagi për eror a {{SITENAME}}.",
@@ -2199,7 +2273,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
@@ -2338,7 +2412,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:',
@@ -2503,6 +2577,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",
@@ -2534,15 +2609,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.
@@ -2670,6 +2745,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",
@@ -2864,12 +2941,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',
@@ -2972,11 +3050,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:$1second}} 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ì:
 
@@ -3189,7 +3280,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',
 
@@ -3464,15 +3555,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
 
@@ -3612,6 +3701,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.
 
@@ -3626,6 +3716,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.",
@@ -3652,7 +3754,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',
 
@@ -3674,12 +3776,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}}',
 
@@ -3700,6 +3806,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à.",
@@ -3715,23 +3822,26 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'htmlform-submit' => 'Mandé',
 'htmlform-reset' => 'Gavé le modìfiche',
 'htmlform-selectorother-other' => 'Àutr',
+'htmlform-no' => 'Nò',
+'htmlform-yes' => 'É',
+'htmlform-chosen-placeholder' => "Serne n'opsion",
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con arserca an test pien mantnùa',
 'sqlite-no-fts' => '$1 sensa arserca an test pien mantnùa',
 
 # New logging system
-'logentry-delete-delete' => "$1 a l'ha scancelà la pàgina $3",
-'logentry-delete-restore' => "$1 a l'ha ripristinà la pàgina $3",
-'logentry-delete-event' => "$1 a l'ha modificà la visibilità ëd {{PLURAL:$5|n'event dël registr|$5 event dël registr}} dzora $3: $4",
-'logentry-delete-revision' => "$1 a l'ha modificà la visibilità ëd {{PLURAL:$5|na revision|$5 revision}} dzora la pàgina $3: $4",
-'logentry-delete-event-legacy' => "$1 a l'ha modificà la visibilità dj'eveniment dël registr dzora $3",
-'logentry-delete-revision-legacy' => "$1 a l'ha modificà la visibilità dle revision dzora la pàgina $3",
-'logentry-suppress-delete' => "$1 a l'ha eliminà la pàgina $3",
-'logentry-suppress-event' => "$1 a l'ha modificà segretament la visibilità ëd {{PLURAL:$5|n'eveniment dël registr|$5 eveniment dël registr}} dzora $3: $4",
-'logentry-suppress-revision' => "$1 a l'ha modificà segretament la visibilità ëd {{PLURAL:$5|na revision|$5 revision}} dzora la pàgina $3: $4",
-'logentry-suppress-event-legacy' => "$1 l'ha modificà segretament la visibilità dj'evenimentt dël registr dzora $3",
-'logentry-suppress-revision-legacy' => "$1 a l'ha modificà segretament la visibilità dle revision dzora la pàgina $3",
+'logentry-delete-delete' => "$1 a l'ha {{GENDER:$2|scancelà}} la pàgina $3",
+'logentry-delete-restore' => "$1 {{GENDER:$2|a l'ha ripristinà}} la pàgina $3",
+'logentry-delete-event' => "$1 {{GENDER:$2|a l'ha modificà}} la visibilità ëd {{PLURAL:$5|n'event dël registr|$5 event dël registr}} dzora $3: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|a l'ha modificà}} la visibilità ëd {{PLURAL:$5|na revision|$5 revision}} dzora la pàgina $3: $4",
+'logentry-delete-event-legacy' => "$1 {{GENDER:$2|a l'ha modificà}} la visibilità dj'eveniment dël registr dzora $3",
+'logentry-delete-revision-legacy' => "$1 {{GENDER:$2|a l'ha modificà}} la visibilità dle revision dzora la pàgina $3",
+'logentry-suppress-delete' => "$1 {{GENDER:$2|a l'ha eliminà}} la pàgina $3",
+'logentry-suppress-event' => "$1 {{GENDER:$2|a l'ha modificà}} da stërmà la visibilità ëd {{PLURAL:$5|n'eveniment dël registr|$5 eveniment dël registr}} dzora $3: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|a l'ha modificà}} da stërmà la visibilità ëd {{PLURAL:$5|na revision|$5 revision}} dzora la pàgina $3: $4",
+'logentry-suppress-event-legacy' => "$1 {{GENDER:$2|a l'ha modificà}} da stërmà la visibilità dj'eveniment dël registr dzora $3",
+'logentry-suppress-revision-legacy' => "$1 {{GENDER:$2|a l'ha modificà}} da stërmà la visibilità dle revision dzora la pàgina $3",
 'revdelete-content-hid' => 'contnù stërmà',
 'revdelete-summary-hid' => 'resumé dle modìfiche stërmà',
 'revdelete-uname-hid' => 'stranòm stërmà',
@@ -3740,19 +3850,20 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'revdelete-uname-unhid' => 'stranòm dëscoatà',
 'revdelete-restricted' => "restrission aplicà a j'aministrator",
 'revdelete-unrestricted' => "restrission për j'aministrator gavà",
-'logentry-move-move' => "$1 a l'ha tramudà la pàgina $3 a $4",
-'logentry-move-move-noredirect' => "$1 a l'ha tramudà la pàgina $3 a $4 sensa lassé na ridiression",
-'logentry-move-move_redir' => "$1 a l'ha tramudà la pàgina $3 a $4 ansima a na ridiression",
-'logentry-move-move_redir-noredirect' => "$1 a l'ha tramudà la pàgina $3 a $4 ansima a na ridiression sensa lassé na ridiression",
-'logentry-patrol-patrol' => "$1 a l'ha marcà la revision $4 dla pàgina $3 'me controlà",
-'logentry-patrol-patrol-auto' => "$1 a l'ha marcà automaticament la revision $4 dla pàgina $3 'me controlà",
-'logentry-newusers-newusers' => "Ël cont utent $1 a l'é stàit creà",
-'logentry-newusers-create' => "Ël cont utent $1 a l'é stàit creà",
-'logentry-newusers-create2' => "Ël cont utent $3 a l'é stàit creà da $1",
-'logentry-newusers-autocreate' => "Ël cont $1 a l'é stàit creà an automàtich",
-'logentry-rights-rights' => "$1 a l'ha tramudà l'apartenesa a la partìa për $3 da $4 a $5",
-'logentry-rights-rights-legacy' => "$1 a l'ha tramudà l'apartenensa a la partìa për $3",
-'logentry-rights-autopromote' => "$1 a l'é stàit automaticament promovù da $4 a $5",
+'logentry-move-move' => "$1 {{GENDER:$2|a l'ha tramudà}} la pàgina $3 a $4",
+'logentry-move-move-noredirect' => "$1 {{GENDER:$2|a l'ha tramudà}} la pàgina $3 a $4 sensa lassé na ridiression",
+'logentry-move-move_redir' => "$1 {{GENDER:$2|a l'ha tramudà}} la pàgina $3 a $4 ansima a na ridiression",
+'logentry-move-move_redir-noredirect' => "$1 {{GENDER:$2|a l'ha tramudà}} la pàgina $3 a $4 ansima a na ridiression sensa lassé na ridiression",
+'logentry-patrol-patrol' => "$1 {{GENDER:$2|a l'ha marcà}} la revision $4 dla pàgina $3 'me controlà",
+'logentry-patrol-patrol-auto' => "$1 {{GENDER:$2|a l'ha marcà}} an automàtich la revision $4 dla pàgina $3 'me controlà",
+'logentry-newusers-newusers' => "Ël cont utent $1 {{GENDER:$2|a l'é stàit creà}}",
+'logentry-newusers-create' => "Ël cont utent $1 {{GENDER:$2|a l'é stàit creà}}",
+'logentry-newusers-create2' => "Ël cont utent $3 {{GENDER:$2|a l'é stàit creà}} da $1",
+'logentry-newusers-byemail' => "Ël cont utent $3 a l'é {{GENDER:$2|stàit creà}} da $1 e la ciav a l'é stàita mandà për pòsta eletrònica",
+'logentry-newusers-autocreate' => "Ël cont $1 a l'é {{GENDER:$2|stàit creà}} an automàtich",
+'logentry-rights-rights' => "$1 {{GENDER:$2|a l'ha modificà}} l'apartenensa a la partìa për $3 da $4 a $5",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|a l'ha modificà}} l'apartenensa a la partìa për $3",
+'logentry-rights-autopromote' => "$1 a l'é {{GENDER:$2|stàit promovù}} an automàtich da $4 a $5",
 'rightsnone' => '(gnun)',
 
 # Feedback
@@ -3807,6 +3918,7 @@ Dësnò, a peul dovré ël formolari semplificà sì-sota. Sò coment a sarà gi
 'api-error-ok-but-empty' => 'Eror antern: Gnun-a rispòsta dal servent.',
 'api-error-overwrite' => "Dzorascrive ansima a n'archivi esistent a l'é nen përmëttù.",
 'api-error-stashfailed' => "Eror antern: ël servent a l'ha pa podù memorisé l'archivi a temp.",
+'api-error-publishfailed' => "Eror antern: Ël servent a l'ha pa podù publiché l'archivi provisòri.",
 'api-error-timeout' => "Ël servent a l'ha pa rëspondù ant ël temp ëspetà.",
 'api-error-unclassified' => "A l'é capitaje n'eror nen conossù.",
 'api-error-unknown-code' => 'Eror sconossù: «$1».',
@@ -3827,4 +3939,22 @@ Dësnò, a peul dovré ël formolari semplificà sì-sota. Sò coment a sarà gi
 'duration-centuries' => '$1 {{PLURAL:$1|sécol|sécoj}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenari|milenari}}',
 
+# Image rotation
+'rotate-comment' => 'Plancià virà ëd $1 {{PLURAL:$1|gre}} an sens orari',
+
+# Limit report
+'limitreport-title' => "Dàit d'otimisassion ëd l'analisator:",
+'limitreport-cputime' => "Temp CPU d'utilisassion",
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|second}}',
+'limitreport-walltime' => "Temp real d'utilisassion",
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|second}}',
+'limitreport-ppvisitednodes' => 'Cont dij neu ëd prepocessor visità',
+'limitreport-ppgeneratednodes' => 'Cont dij neu ëd preprocessor generà',
+'limitreport-postexpandincludesize' => "Taja d'anclusion dòp espansion",
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => "Taja dl'argoment ëd lë stamp",
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => "Pi granda përfondità d'espansion",
+'limitreport-expensivefunctioncount' => "Cont ëd le fonsion d'anàlisi care",
+
 );
index 583f297..378334f 100644 (file)
@@ -165,7 +165,7 @@ $messages = array(
 'tog-hidepatrolled' => 'په وروستيو بدلونونو کې څارل شوې سمونونه پټول',
 'tog-newpageshidepatrolled' => 'د نوؤ مخونو په لړليک کې کتل شوي مخونه پټول',
 'tog-extendwatchlist' => 'يوازې د وروستني بدلونونو د ښکاره کولو لپاره نه بلکه د ټولو بدلونونو د ښکاره کولو لپاره کتنلړ غځول',
-'tog-usenewrc' => 'په کتنلړ او وروستي بدلونو مخ باندې ډله ايز بدلونونه (جاوا سکرېپټ ته اړتيا ده)',
+'tog-usenewrc' => 'په کتنلړ او وروستي بدلونو مخ باندې ډله ايز بدلونونه',
 'tog-numberheadings' => 'د سرليکونو خپلکاره شمېرايښودنه',
 'tog-showtoolbar' => 'د سمون اوزارپټه ښکاره کول',
 'tog-editondblclick' => 'په دوه کلېک سره د مخونو سمون',
@@ -201,6 +201,7 @@ $messages = array(
 'tog-showhiddencats' => 'پټې وېشنيزې ښکاره کول',
 'tog-norollbackdiff' => 'پرشاتمبولو وروسته توپيرونه نه ښودل',
 'tog-useeditwarning' => 'کله چې يو سمون مخ څخه د بدلونونو د خوندي کولو پرته وځم خبر دې شم',
+'tog-prefershttps' => 'د ننوتلو پر مهال تل يوه خوندي اړيکتيا کارول',
 
 'underline-always' => 'تل',
 'underline-never' => 'هېڅکله',
@@ -403,7 +404,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}} په اړه',
 'aboutpage' => 'Project:په اړه',
-'copyright' => 'دا Ù\85Û\90Ù\86Ú\81پاÙ\86Ú«Ù\87 Ø¯ $1 Ø§Ø¬Ø§Ø²ØªÙ\84Ù\8aÚ© Ù\84Ù\87 Ù\85Ø®Û\90 Ø³ØªØ§Ø³Û\90 Ù\84اسرسÙ\8a ØªÙ\87 Ù¾Ø±ØªÙ\87 Ø¯Ù\87.',
+'copyright' => 'دا Ù\85Û\90Ù\86Ú\81پاÙ\86Ú¯Ù\87 Ø¯ $1 Ù\84Ù\87 Ù\85Ø®Û\90 Ø³ØªØ§Ø³Û\90 Ù\84اسرسÙ\8a ØªÙ\87 Ù¾Ø±ØªÙ\87 Ø¯Ù\87Ø\8c Ø®Ù\88 Ù\87غÙ\87 Ú\85Ù\87 Ú\86Û\90 Ù¾Ù\87 Ø®Ù\84اÙ\81 Ù\8aÛ\90 Ù\88Ù\8aÙ\8aÙ\84 Ø´Ù\88Ù\8a.',
 'copyrightpage' => '{{ns:project}}:رښتې',
 'currentevents' => 'اوسنۍ پېښې',
 'currentevents-url' => 'Project:تازه پېښې',
@@ -970,11 +971,13 @@ $1',
 
 # Diffs
 'history-title' => 'د "$1" د مخليدنې پېښليک',
+'difference-title' => 'د "$1" د بڼو تر مېنځ توپير',
 'difference-multipage' => '(د مخونو تر مېنځ توپير)',
 'lineno' => '$1 کرښه:',
 'compareselectedversions' => 'ټاکلې بڼې سره پرتلل',
 'showhideselectedversions' => 'ټاکلې بڼې ښکاره کول/پټول',
 'editundo' => 'ناکړ',
+'diff-empty' => '(بې توپيره)',
 'diff-multi' => ' د ({{PLURAL:$2| يو کارن|$2 کارنانو}} لخوا {{PLURAL:$1|يوه منځګړې بڼه|$1 منځګړې بڼې}}د  نه ده ښکاره شوې)',
 
 # Search results
@@ -1004,7 +1007,7 @@ $1',
 'searchprofile-articles-tooltip' => 'په $1 کې پلټل',
 'searchprofile-project-tooltip' => 'په $1 کې پلټل',
 'searchprofile-images-tooltip' => 'د دوتنو پلټنه',
-'searchprofile-everything-tooltip' => 'د Ù¼Ù\88Ù\84Û\90 Ù\85Û\90Ù\86Ú\81پاÙ\86Ú«ې پلټنه (د خبرو اترو مخونو سره)',
+'searchprofile-everything-tooltip' => 'د Ù¼Ù\88Ù\84Û\90 Ù\85Û\90Ù\86Ú\81پاÙ\86Ú¯ې پلټنه (د خبرو اترو مخونو سره)',
 'searchprofile-advanced-tooltip' => 'د خپل خوښې په نوم-تشيالونو کې پلټل',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ويی|$2 وييونه}})',
 'search-result-category-size' => '{{PLURAL:$1|1 غړی|$1 غړي}} ({{PLURAL:$2|1 څېرمه وېشنيزه|$2 څېرمه وېشنيزې}}، {{PLURAL:$3|1 دوتنه|$3 دوتنې}})',
@@ -1434,7 +1437,7 @@ $1',
 'duplicatesoffile' => 'دا لاندينۍ {{PLURAL:$1| دوتنه د همدې دوتنې غبرګونې لمېسه ده|$1 دوتنې د همدې دوتنې غبرګونې لمېسې دي}} ([[Special:FileDuplicateSearch/$2|نور تفصيل]]):',
 'sharedupload' => 'دا دوتنه د $1 لخوا نه ده او کېدای شي چې نورې پروژې به يې هم کاروي.',
 'sharedupload-desc-here' => 'دا دوتنه د $1 لخوا خپرېږې او کېدای شي چې دا په نورو پروژو هم کارېدلې وي.
-د Ø¯Ù\88تÙ\86Û\90 Ø¯ Ú©Ø§Ø±Û\90دÙ\86Û\90 Ù\84ا Ù\86Ù\88ر Ù\85اÙ\84Ù\88Ù\85ات Ø¯ [$2 Ø¯Ù\88تÙ\86Û\90 Ø¯ Ú\85رګÙ\86دÙ\86Ù\88 Ù¾Ù\87 Ù\85Ø®] لاندې ښودل شوی.',
+د Ø¯Ù\88تÙ\86Û\90 Ø¯ Ú©Ø§Ø±Û\90دÙ\86Û\90 Ù\84ا Ù\86Ù\88ر Ù\85اÙ\84Ù\88Ù\85ات Ø¯ [$2 Ø¯Ù\88تÙ\86Û\90 Ø¯ Ú\85رگÙ\86دÙ\86Ù\88 Ù¾Ù\87 Ù\85Ø®] Ú©Û\90 لاندې ښودل شوی.',
 'filepage-nofile' => 'په دې نوم کومه دوتنه نشته.',
 'filepage-nofile-link' => 'په دې نوم کومه دوتنه نشته، خو تاسې يې [$1 پورته کولی شی].',
 'uploadnewversion-linktext' => 'د همدغې دوتنې نوې بڼه پورته کول',
@@ -1584,7 +1587,9 @@ $1',
 'speciallogtitlelabel' => 'موخه (سرليک يا کارن):',
 'log' => 'يادښتونه',
 'all-logs-page' => 'ټول عام يادښتونه',
+'logempty' => 'په يادښت کې ورته څه نشته.',
 'log-title-wildcard' => 'هغه سرليکونه پلټل چې په دې متن پيلېږي',
+'showhideselectedlogentries' => 'د ټاکلو يادښتونو ښکارېدنه بدلول',
 
 # Special:AllPages
 'allpages' => 'ټول مخونه',
@@ -1623,7 +1628,7 @@ $1',
 
 # Special:LinkSearch
 'linksearch' => 'د باندنيو تړنو پلټنه',
-'linksearch-pat' => 'د Ù¾Ù\84Ù¼Ù\86Û\90 Ù\85خبÛ\90Ù\84Ú«ه:',
+'linksearch-pat' => 'د Ù¾Ù\84Ù¼Ù\86Û\90 Ù\85خبÛ\90Ù\84Ú¯ه:',
 'linksearch-ns' => 'نوم-تشيال:',
 'linksearch-ok' => 'پلټل',
 'linksearch-line' => '$1 د $2 سره تړل شوی',
@@ -1776,8 +1781,8 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exblank' => 'مخ تش وه',
 'delete-confirm' => '"$1" ړنگول',
 'delete-legend' => 'ړنگول',
-'historywarning' => "Ú¯Ù\88اÚ\9aÙ\86Ù\87:''' ØªØ§Ø³Û\90 Ú\86Û\90 Ø¯ Ú©Ù\88Ù\85 Ù\85Ø® Ø¯ Ú\93Ù\86Ú¯Û\90دÙ\88 ØªÚ©Ù\84 Ù\84رÛ\8cØ\8c Ù\87غÙ\87 Ø¯ Ù\86Ú\98دÛ\90 $1 {{PLURAL:$1|بڼÛ\90|بڼÙ\88}} Ù\8aÙ\88 پېښليک لري:",
-'confirmdeletetext' => 'تاسÛ\90 Ø¯ ØªÙ\84 Ù\84پار Ù\8aÙ\88 Ù\85Ø® Ù\8aا Ø§Ù\86Ú\81Ù\88ر Ø¯ Ù\87غÙ\87 Ù¼Ù\88Ù\84 Ù¾Û\90Ú\9aÙ\84Ù\8aÚ© Ø³Ø±Ù\87 Ø¯ Ø¯ØºÙ\87 ØªÙ\88کبÙ\86سټ Ù\86Ù\87 Ú\93Ù\86Ú«Ù\88Û\8d. Ú©Ù\87 Ú\86Û\90رتÙ\87 ØªØ§Ø³Û\90 Ø¯Ø¯Û\90 Ú©Ú\93Ù\86Û\90 Ù¾Ù\87 Ù¾Ø§Ù\8aÙ\84Ù\87 Ù¾Ù\88Ù\87 Ù\8aاست Ø§Ù\88 Ù\8aا Ø³ØªØ§Ø³Ù\88 Ù\87Ù\85دا Ú©Ú\93Ù\86Ù\87 Ø¯ Ø¯Û\90 Ù¾Ø§Ú¼Û\90 Ø¯ [[{{MediaWiki:Policy-url}}|تګلارې]] سره سمون خوري نو لطفاً د دې تاييد وکړی.',
+'historywarning' => "Ú¯Ù\88اÚ\9aÙ\86Ù\87:''' Ø¯Ø§ Ù\85Ø® Ú\86Û\90 ØªØ§Ø³Û\90 Ù\8aÛ\90 Ø¯ Ú\93Ù\86Ú¯Û\90دÙ\88 ØªÚ©Ù\84 Ù\84رئ Ù\86Ú\98دÛ\90 $1 {{PLURAL:$1|بڼÙ\87|بڼÛ\90}} پېښليک لري:",
+'confirmdeletetext' => 'تاسÛ\90 Ø¯ ØªÙ\84 Ù\84پار Ù\8aÙ\88 Ù\85Ø® Ù\8aا Ø§Ù\86Ú\81Ù\88ر Ø¯ Ù\87غÙ\87 Ù¼Ù\88Ù\84 Ù¾Û\90Ú\9aÙ\84Ù\8aÚ© Ø³Ø±Ù\87 Ø¯ Ø¯ØºÙ\87 ØªÙ\88کبÙ\86سټ Ù\86Ù\87 Ú\93Ù\86Ú¯Ù\88ئ. Ú©Ù\87 Ú\86Û\90رتÙ\87 ØªØ§Ø³Û\90 Ø¯Ø¯Û\90 Ú©Ú\93Ù\86Û\90 Ù¾Ù\87 Ù¾Ø§Ù\8aÙ\84Ù\87 Ù¾Ù\88Ù\87 Ù\8aاست Ø§Ù\88 Ù\8aا Ø³ØªØ§Ø³Û\90 Ù\87Ù\85دا Ú©Ú\93Ù\86Ù\87 Ø¯ Ø¯Û\90 Ù¾Ø§Ú¼Û\90 Ø¯ [[{{MediaWiki:Policy-url}}|تگلارې]] سره سمون خوري نو لطفاً د دې تاييد وکړی.',
 'actioncomplete' => 'بشپړه کړنه',
 'actionfailed' => 'کړنه نابريالۍ شوه',
 'deletedtext' => '"$1" ړنگ شوی.
@@ -1802,6 +1807,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'protectlogpage' => 'د ژغورنې يادښت',
 'protectedarticle' => '"[[$1]]" وژغورل شو',
 'modifiedarticleprotection' => 'د "[[$1]]" لپاره د ژغورنې کچه بدله شوه',
+'movedarticleprotection' => 'د ژغورنې امستنې له "[[$2]]" څخه "[[$1]]" ته ولېږدېدې',
 'protect-title' => 'د "$1" لپاره د ژغورنې کچه بدلول',
 'prot_1movedto2' => '[[$1]]، [[$2]] ته ولېږدېده',
 'protect-legend' => 'د ژغورلو پخلی کول',
@@ -1823,7 +1829,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'protect-expiring' => 'په $1 (UTC) پای ته رسېږي',
 'protect-expiring-local' => 'پای نېټه $1',
 'protect-expiry-indefinite' => 'لامحدوده',
-'protect-cascade' => 'Ù¾Ù\87 Ù\87Ù\85دÛ\90 Ù\85Ø® Ú©Û\90 Ø¯ Ù¼Ù\88Ù\84Ù\88 Ú«Ú\89Ù\88 Ù\85Ø®Ù\88Ù\86Ù\88 Ù\86ه ژغورنه کېږي (ځوړاوبيزه ژغورنه)',
+'protect-cascade' => 'Ù¾Ù\87 Ù\87Ù\85دÛ\90 Ù\85Ø® Ú©Û\90 Ø¯ Ù¼Ù\88Ù\84Ù\88 Ú¯Ú\89Ù\88 Ù\85Ø®Ù\88Ù\86Ù\88 Ú\85Ø®ه ژغورنه کېږي (ځوړاوبيزه ژغورنه)',
 'protect-cantedit' => 'تاسې نه شی کولای چې د دې مخ د ژغورنې په کچه کې بدلون راولی، دا ځکه چې تاسې د دې مخ د سمولو اجازه نه لری.',
 'protect-othertime' => 'بل وخت:',
 'protect-othertime-op' => 'بل وخت',
@@ -1886,8 +1892,8 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'month' => 'له مياشتې د (او پخواني):',
 'year' => 'له کال د (او پخواني):',
 
-'sp-contributions-newbies' => 'د Ù\86Ù\88Ù\88 Ú«ڼونونو ونډې ښکاره کول',
-'sp-contributions-newbies-sub' => 'د Ù\86Ù\88Ù\88 Ú«ڼونونو لپاره',
+'sp-contributions-newbies' => 'د Ù\86Ù\88Ù\88 Ú¯ڼونونو ونډې ښکاره کول',
+'sp-contributions-newbies-sub' => 'د Ù\86Ù\88Ù\88 Ú¯ڼونونو لپاره',
 'sp-contributions-blocklog' => 'د بنديز يادښت',
 'sp-contributions-deleted' => 'ړنګې شوې ونډې',
 'sp-contributions-uploads' => 'پورته کېدنې',
@@ -1945,7 +1951,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'ipbhidename' => 'کارن-نوم له سمون او لړليکونو پټول',
 'ipb-confirm' => 'د بنديز تاييد',
 'badipaddress' => 'ناسمه IP پته',
-'blockipsuccesssub' => 'بÙ\86دÙ\8aز Ù¾Ù\87 Ø¨Ø±Ù\8aاÙ\84Ù\8aتÙ\88ب Ø³Ø±Ù\87 Ù\88Ù\84Ú«ېده',
+'blockipsuccesssub' => 'بÙ\86دÙ\8aز Ù¾Ù\87 Ø¨Ø±Ù\8aاÙ\84Ù\8aتÙ\88ب Ø³Ø±Ù\87 Ù\88Ù\84Ú¯ېده',
 'blockipsuccesstext' => 'په [[Special:Contributions/$1|$1]] بنديز لگېدلی.<br />
 د بنديزونو د څارلو لپاره [[Special:BlockList|بنديز لړليک]] وگورۍ.',
 'ipb-edit-dropdown' => 'د بنديز سببونه سمول',
@@ -1990,6 +1996,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'block-log-flags-anononly' => 'يواځې ورکنومي کارنان',
 'block-log-flags-nocreate' => 'د گڼون جوړول ناچارن شوی',
 'block-log-flags-noemail' => 'ددې برېښليک مخه نيول شوی',
+'block-log-flags-nousertalk' => 'خپل د خبرو اترو مخ نه شي سمولای',
 'block-log-flags-hiddenname' => 'پټ کارن-نوم',
 'ipb_already_blocked' => 'پر "$1" د پخوا نه بنديز دی',
 'ipb-needreblock' => 'پر $1 د پخوا نه بنديز لگېدلی.
@@ -2049,6 +2056,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'movepagebtn' => 'مخ لېږدول',
 'pagemovedsub' => 'لېږدول په برياليتوب سره ترسره شوه',
 'movepage-moved' => '\'\'\'د "$1" په نامه دوتنه، "$2" ته ولېږدېده\'\'\'',
+'movepage-moved-redirect' => 'يو مخ گرځونی جوړ شو.',
 'articleexists' => 'په همدې نوم يوه بله پاڼه د پخوا نه شته او يا خو دا نوم چې تاسې ټاکلی سم نه دی. لطفاً يو بل نوم وټاکۍ.',
 'talkexists' => "'''همدا مخ په برياليتوب سره نوي سرليک ته ولېږدېده، خو د خبرواترو مخ يې و نه لېږدول شو دا ځکه چې نوی سرليک له پخوا نه ځانته د خبرواترو يو مخ لري.
 لطفاً د خبرواترو دا دواړه مخونه په لاسي توگه سره يو ځای کړی.'''",
@@ -2126,7 +2134,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-pt-login' => 'تاسې ته په غونډال کې د ننوتلو سپارښتنه کوو، که څه هم چې دا يو اړين کار نه دی.',
 'tooltip-pt-anonlogin' => 'تاسو ته په غونډال کې د ننوتلو سپارښتنه کوو، که څه هم چې دا يو اړين کار نه دی.',
 'tooltip-pt-logout' => 'وتل',
-'tooltip-ca-talk' => 'د Ù\85Ø® Ø¯ Ù\85Û\90Ù\86Ú\81پاÙ\86Ú«ې په اړه خبرې اترې',
+'tooltip-ca-talk' => 'د Ù\85Ø® Ø¯ Ù\85Û\90Ù\86Ú\81پاÙ\86Ú¯ې په اړه خبرې اترې',
 'tooltip-ca-edit' => 'تاسې همدا مخ سمولای شی. لطفاً د ليکنې د خوندي کولو دمخه، د همدې ليکنې مخليدنه وگورۍ.',
 'tooltip-ca-addsection' => 'يوه نوې برخه پيلول',
 'tooltip-ca-viewsource' => 'دا مخ ژغورل شوی. تاسې کولای شی چې د دې مخ سرجينه وگورۍ.',
@@ -2206,7 +2214,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'pageinfo-display-title' => 'ښکارېدونکی سرليک',
 'pageinfo-length' => 'مخ اوږدوالی (په بايټونو)',
 'pageinfo-article-id' => 'د مخ پېژند',
-'pageinfo-language' => 'د Ù\85Ø® Ø¯ Ù\85Û\90Ù\86Ú\81پاÙ\86Ú«ې ژبه',
+'pageinfo-language' => 'د Ù\85Ø® Ø¯ Ù\85Û\90Ù\86Ú\81پاÙ\86Ú¯ې ژبه',
 'pageinfo-robot-policy' => 'د پلټن ماشين دريځ',
 'pageinfo-robot-index' => 'ليکلړوړ',
 'pageinfo-robot-noindex' => 'ليکلړوړ نه',
@@ -2381,7 +2389,7 @@ $1',
 
 'exif-meteringmode-0' => 'ناجوت',
 'exif-meteringmode-1' => 'منځالی',
-'exif-meteringmode-5' => 'Ù\85خبÛ\90Ù\84Ú«ه',
+'exif-meteringmode-5' => 'Ù\85خبÛ\90Ù\84Ú¯ه',
 'exif-meteringmode-255' => 'نور',
 
 'exif-lightsource-0' => 'ناجوت',
@@ -2693,6 +2701,9 @@ $5
 'tag-filter-submit' => 'چاڼگر',
 'tags-display-header' => 'د بدلون په لړليکونو کې ښکارېدنه',
 'tags-description-header' => 'د مانا بشپړه څرگندونه',
+'tags-active-header' => 'فعال؟',
+'tags-active-yes' => 'هو',
+'tags-active-no' => 'نه',
 'tags-edit' => 'سمول',
 'tags-hitcount' => '$1 {{PLURAL:$1|بدلون|بدلونونه}}',
 
@@ -2731,6 +2742,8 @@ $5
 'revdelete-content-unhid' => 'مېنځپانگه ښکاره شوی',
 'revdelete-uname-unhid' => 'ښکاره کارن-نوم',
 'logentry-move-move' => '$1 د $3 مخ $4 ته {{GENDER:$2|ولېږداوه}}',
+'logentry-move-move-noredirect' => '$1 پرته له دې چې يو مخ گرځونی پرېږدي له $3 څخه $4 ته مخ {{GENDER:$2|ولېږداوه}}',
+'logentry-move-move_redir-noredirect' => '$1 پرته له دې چې يو مخ گرځونی پرېږدي له $3 څخه $4 ته مخ {{GENDER:$2|ولېږداوه}}',
 'logentry-newusers-newusers' => 'د $1 کارن گڼون {{GENDER:$2|جوړ شو}}',
 'logentry-newusers-create' => 'د $1 کارن گڼون {{GENDER:$2|جوړ شو}}',
 'logentry-newusers-autocreate' => 'د $1 گڼون په اتوماتيک ډول {{GENDER:$2|جوړ شو}}',
index 98598f3..f9fe2b2 100644 (file)
@@ -328,10 +328,10 @@ $messages = array(
 'tog-extendwatchlist' => 'Listagem expandida de todas as mudanças às páginas vigiadas, não apenas das mais recentes',
 'tog-usenewrc' => 'Agrupar alterações por página nas mudanças recentes e páginas vigiadas',
 'tog-numberheadings' => 'Auto-numerar cabeçalhos',
-'tog-showtoolbar' => 'Mostrar barra de edição (JavaScript)',
-'tog-editondblclick' => 'Editar páginas quando houver um clique duplo (JavaScript)',
+'tog-showtoolbar' => 'Mostrar barra de edição',
+'tog-editondblclick' => 'Editar páginas quando houver um clique duplo',
 'tog-editsection' => 'Possibilitar a edição de seções com links [editar]',
-'tog-editsectiononrightclick' => 'Possibilitar a edição de seções por clique com o botão direito no título da seção (JavaScript)',
+'tog-editsectiononrightclick' => 'Possibilitar a edição de seções por clique com o botão direito no título da seção',
 'tog-showtoc' => 'Mostrar índice (para páginas com mais de três seções)',
 'tog-rememberpassword' => 'Recordar os meus dados neste browser (no máximo, durante $1 {{PLURAL:$1|dia|dias}})',
 'tog-watchcreations' => 'Adicionar as páginas e ficheiros que eu criar às minhas páginas vigiadas',
@@ -349,7 +349,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar o número de utilizadores a vigiar',
 'tog-oldsig' => 'Assinatura existente:',
 'tog-fancysig' => 'Tratar assinatura como texto wiki (sem link automático)',
-'tog-uselivepreview' => 'Usar a antevisão ao vivo (requer JavaScript; é experimental)',
+'tog-uselivepreview' => 'Usar a antevisão ao vivo (experimental)',
 'tog-forceeditsummary' => 'Avisar-me se deixar o resumo da edição vazio',
 'tog-watchlisthideown' => 'Esconder as minhas edições ao listar mudanças às páginas vigiadas',
 'tog-watchlisthidebots' => 'Esconder edições de robôs ao listar mudanças às páginas vigiadas',
@@ -445,15 +445,15 @@ $messages = array(
 'category_header' => 'Páginas na categoria "$1"',
 'subcategories' => 'Subcategorias',
 'category-media-header' => 'Multimédia na categoria "$1"',
-'category-empty' => "''Esta categoria não contém atualmente nenhuma página ou ficheiro multimídia.''",
+'category-empty' => "''Esta categoria não contém atualmente nenhuma página ou ficheiro multimédia.''",
 'hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}}',
 'hidden-category-category' => 'Categorias ocultas',
 'category-subcat-count' => '{{PLURAL:$2|Esta categoria só contém a seguinte subcategoria.|Esta categoria contém {{PLURAL:$1|a seguinte subcategoria|as seguintes $1 subcategorias}} (de um total de $2).}}',
 'category-subcat-count-limited' => 'Esta categoria tem {{PLURAL:$1|a seguinte subcategoria|as seguintes $1 subcategorias}}.',
 'category-article-count' => '{{PLURAL:$2|Esta categoria só contém a seguinte página.|Esta categoria contém {{PLURAL:$1|a seguinte página|as seguintes $1 páginas}} (de um total de $2).}}',
-'category-article-count-limited' => 'Há, nesta categoria, {{PLURAL:$1|a página a seguir|as $1 páginas a seguir}}.',
-'category-file-count' => '{{PLURAL:$2|Esta categoria só contém o seguinte arquivo.|Esta categoria contém {{PLURAL:$1|o seguinte arquivo|os seguintes $1 arquivos}} (de um total de $2).}}',
-'category-file-count-limited' => 'Nesta categoria há {{PLURAL:$1|um arquivo|$1 arquivos}}.',
+'category-article-count-limited' => 'Nesta categoria há {{PLURAL:$1|uma página|$1 páginas}}.',
+'category-file-count' => '{{PLURAL:$2|Esta categoria só contém o seguinte ficheiro.|Esta categoria contém {{PLURAL:$1|o seguinte ficheiro|os seguintes $1 ficheiros}} (de um total de $2).}}',
+'category-file-count-limited' => 'Nesta categoria há {{PLURAL:$1|um ficheiro|$1 ficheiros}}.',
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páginas indexadas',
 'noindex-category' => 'Páginas não indexadas',
@@ -476,9 +476,9 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta página',
-'qbmyoptions' => 'Minhas páginas',
+'qbmyoptions' => 'As minhas páginas',
 'qbspecialpages' => 'Páginas especiais',
-'faq' => 'FAQ',
+'faq' => 'Perguntas frequentes',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
@@ -488,7 +488,7 @@ $messages = array(
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Alterar proteção',
-'vector-simplesearch-preference' => 'Ativar barra de buscas simplificada (apenas no tema Vector)',
+'vector-simplesearch-preference' => 'Ativar barra de pesquisa simplificada (apenas no tema Vector)',
 'vector-view-create' => 'Criar',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver histórico',
@@ -517,7 +517,7 @@ $messages = array(
 'edit' => 'Editar',
 'create' => 'Criar',
 'editthispage' => 'Editar esta página',
-'create-this-page' => 'Criar/iniciar esta página',
+'create-this-page' => 'Criar esta página',
 'delete' => 'Eliminar',
 'deletethispage' => 'Eliminar esta página',
 'undeletethispage' => 'Restaurar esta página',
@@ -528,12 +528,12 @@ $messages = array(
 'protectthispage' => 'Proteger esta página',
 'unprotect' => 'Alterar proteção',
 'unprotectthispage' => 'Alterar a proteção desta página',
-'newpage' => 'Nova página',
+'newpage' => 'Página nova',
 'talkpage' => 'Discutir esta página',
 'talkpagelinktext' => 'discussão',
 'specialpage' => 'Página especial',
 'personaltools' => 'Ferramentas pessoais',
-'postcomment' => 'Nova seção',
+'postcomment' => 'Seção nova',
 'articlepage' => 'Ver página de conteúdo',
 'talk' => 'Discussão',
 'views' => 'Vistas',
@@ -541,10 +541,10 @@ $messages = array(
 'userpage' => 'Ver página de utilizador',
 'projectpage' => 'Ver página de projeto',
 'imagepage' => 'Ver página de ficheiro',
-'mediawikipage' => 'Ver página de mensagens',
-'templatepage' => 'Ver página de predefinições',
+'mediawikipage' => 'Ver página da mensagem',
+'templatepage' => 'Ver página da predefinição',
 'viewhelppage' => 'Ver página de ajuda',
-'categorypage' => 'Ver página de categorias',
+'categorypage' => 'Ver página da categoria',
 'viewtalkpage' => 'Ver discussão',
 'otherlanguages' => 'Noutras línguas',
 'redirectedfrom' => '(Redireccionado de $1)',
@@ -567,7 +567,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' => 'Sobre a {{SITENAME}}',
 'aboutpage' => 'Project:Sobre',
-'copyright' => 'Conteúdo disponibilizado nos termos da $1.',
+'copyright' => 'Conteúdo disponibilizado nos termos da $1, salvo indicação em contrário.',
 'copyrightpage' => '{{ns:project}}:Direitos_de_autor',
 'currentevents' => 'Notícias',
 'currentevents-url' => 'Project:Notícias',
@@ -596,16 +596,16 @@ Consulte a página da [[Special:Version|versão do sistema]].',
 'youhavenewmessages' => 'Tem $1 ($2).',
 'newmessageslink' => 'mensagens novas',
 'newmessagesdifflink' => 'comparar com a penúltima revisão',
-'youhavenewmessagesfromusers' => 'Você tem $1 de {{PLURAL:$3|outro utilizador|$3 utilizadores}} ($2).',
-'youhavenewmessagesmanyusers' => 'Você tem $1 de muitos utilizadores ($2).',
+'youhavenewmessagesfromusers' => 'Tem $1 de {{PLURAL:$3|outro utilizador|$3 utilizadores}} ($2).',
+'youhavenewmessagesmanyusers' => 'Tem $1 de muitos utilizadores ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|uma mensagem nova|mensagens novas}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|última alteração|últimas alterações}}',
 'youhavenewmessagesmulti' => 'Tem mensagens novas em $1',
 'editsection' => 'editar',
 'editold' => 'editar',
-'viewsourceold' => 'ver código',
+'viewsourceold' => 'ver código-fonte',
 'editlink' => 'editar',
-'viewsourcelink' => 'ver fonte',
+'viewsourcelink' => 'ver código-fonte',
 'editsectionhint' => 'Editar seção: $1',
 'toc' => 'Índice',
 'showtoc' => 'mostrar',
@@ -617,7 +617,7 @@ Consulte a página da [[Special:Version|versão do sistema]].',
 'restorelink' => '{{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}',
 'feedlinks' => "''Feed'':",
 'feed-invalid' => "Tipo de subscrição de ''feed'' inválido.",
-'feed-unavailable' => 'Os "feeds" não se encontram disponíveis',
+'feed-unavailable' => 'Não há "feeds" disponíveis',
 'site-rss-feed' => "''Feed'' RSS $1",
 'site-atom-feed' => "''Feed'' Atom $1",
 'page-rss-feed' => "''Feed'' RSS de \"\$1\"",
@@ -632,7 +632,7 @@ Consulte a página da [[Special:Version|versão do sistema]].',
 'nstab-media' => 'Multimédia',
 'nstab-special' => 'Página especial',
 'nstab-project' => 'Página do projeto',
-'nstab-image' => 'Arquivo',
+'nstab-image' => 'Ficheiro',
 'nstab-mediawiki' => 'Mensagem',
 'nstab-template' => 'Predefinição',
 'nstab-help' => 'Ajuda',
@@ -651,6 +651,10 @@ Encontra uma lista das páginas especiais válidas em [[Special:SpecialPages|{{i
 # General errors
 'error' => 'Erro',
 'databaseerror' => 'Erro na base de dados',
+'databaseerror-text' => 'Ocorreu um erro na consulta à base de dados.
+Isto pode indicar um defeito no programa.',
+'databaseerror-textcl' => 'Ocorreu um erro na consulta à base de dados.',
+'databaseerror-query' => 'Consulta:$1',
 'databaseerror-error' => 'Erro: $1',
 'laggedslavemode' => "'''Aviso:''' A página pode não conter as atualizações mais recentes.",
 'readonly' => 'Base de dados bloqueada (limitada a leituras)',
@@ -752,7 +756,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].'
 'userlogin-remembermypassword' => 'Manter-me autenticado',
 'userlogin-signwithsecure' => 'Use uma ligação segura',
 'yourdomainname' => 'O seu domínio:',
-'password-change-forbidden' => 'Não podes alterar senhas nesta wiki.',
+'password-change-forbidden' => 'Não pode alterar senhas nesta wiki.',
 'externaldberror' => 'Ocorreu um erro externo à base de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.',
 'login' => 'Autenticação',
 'nav-login-createaccount' => 'Entrar / criar conta',
@@ -773,6 +777,9 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].'
 'userlogin-resetpassword-link' => 'Recuperar palavra-chave',
 'helplogin-url' => 'Help:Autenticação',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda a fazer login]]',
+'userlogin-loggedin' => 'Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.
+Use o formulário abaixo para iniciar uma sessão com outro nome.',
+'userlogin-createanother' => 'Criar outra conta',
 'createacct-join' => 'Insira a sua informação abaixo.',
 'createacct-another-join' => 'Digite a informação da nova conta abaixo.',
 'createacct-emailrequired' => 'Endereço de email',
@@ -863,8 +870,8 @@ Aguarde $1 antes de tentar novamente, por favor.',
 'login-abort-generic' => 'A sua autenticação não teve êxito - Cancelada',
 'loginlanguagelabel' => 'Língua: $1',
 'suspicious-userlogout' => 'O seu pedido para sair foi negado porque parece ter sido enviado por um browser danificado ou por um proxy com cache.',
-'createacct-another-realname-tip' => 'O nome real é opcional.
-Se você optar por fornecê-lo, este será utilizado para dar ao usuário a atribuição de seu trabalho.',
+'createacct-another-realname-tip' => 'O fornecimento do nome verdadeiro é opcional.
+Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.',
 
 # Email sending
 'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
@@ -889,7 +896,7 @@ Para prosseguir, será necessário definir uma nova palavra-chave.',
 'resetpass-wrong-oldpass' => 'Palavra-chave temporária ou atual inválida.
 Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova palavra-chave temporária.',
 'resetpass-temp-password' => 'Palavra-chave temporária:',
-'resetpass-abort-generic' => 'Alteração de senha foi cancelada por uma extensão.',
+'resetpass-abort-generic' => 'A alteração da senha foi cancelada por uma extensão.',
 
 # Special:PasswordReset
 'passwordreset' => 'Repor palavra-chave',
@@ -901,7 +908,7 @@ Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova pal
 'passwordreset-username' => 'Nome de utilizador:',
 'passwordreset-domain' => 'Domínio:',
 'passwordreset-capture' => 'Ver o email resultante?',
-'passwordreset-capture-help' => 'Se marcar esta caixa, o e-mail (com a senha temporária) será-lhe mostrado, além de ser enviado para o utilizador.',
+'passwordreset-capture-help' => 'Se marcar esta caixa, poderá ver a mensagem (com a senha temporária) que será enviada ao utilizador.',
 'passwordreset-email' => 'Correio electrónico:',
 'passwordreset-emailtitle' => 'Detalhes da conta na {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:
@@ -930,36 +937,40 @@ Palavra-chave temporária: $2',
 'changeemail-oldemail' => 'Correio electrónico actual:',
 'changeemail-newemail' => 'Correio electrónico novo:',
 'changeemail-none' => '(nenhum)',
-'changeemail-password' => 'A sua senha {{SITENAME}}:',
+'changeemail-password' => 'A sua senha na wiki {{SITENAME}}:',
 'changeemail-submit' => 'Alterar correio electrónico',
 'changeemail-cancel' => 'Cancelar',
 
 # Special:ResetTokens
-'resettokens' => 'Redefinir os tokens',
-'resettokens-text' => 'Você pode redefinir tokens que permitem o acesso a certos dados privados associados à sua conta aqui.
+'resettokens' => 'Redefinir chaves',
+'resettokens-text' => 'Pode redefinir as chaves de acesso a certos dados privados associados à sua conta aqui.
 
-Você deve fazê-lo se acidentalmente compartilhá-los com alguém ou se sua conta estiver comprometida.',
-'resettokens-no-tokens' => 'Não existem tokens para redefinir.',
-'resettokens-legend' => 'Redefinir tokens',
+Deve fazê-lo se as divulgou acidentalmente a alguém ou se a sua conta tiver sido comprometida.',
+'resettokens-no-tokens' => 'Não há chaves para redefinir.',
+'resettokens-legend' => 'Redefinir chaves',
+'resettokens-tokens' => 'Chaves:',
 'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => "Chave para o ''feed'' Atom/RSS de [[Special:Watchlist|mudanças às páginas vigiadas]]",
+'resettokens-done' => 'As chaves foram redefinidas.',
+'resettokens-resetbutton' => 'Redefinir chaves selecionadas',
 
 # Edit page toolbar
 'bold_sample' => 'Texto a negrito',
 'bold_tip' => 'Texto a negrito',
 'italic_sample' => 'Texto em itálico',
 'italic_tip' => 'Texto em itálico',
-'link_sample' => 'Título da ligação',
-'link_tip' => 'Ligação interna',
-'extlink_sample' => 'http://www.example.com título da ligação',
-'extlink_tip' => 'Ligação externo (lembre-se do prefixo http://)',
+'link_sample' => 'Título do link',
+'link_tip' => 'Link interno',
+'extlink_sample' => 'http://www.example.com link externo',
+'extlink_tip' => 'Link externo (lembre-se do prefixo http://)',
 'headline_sample' => 'Texto do cabeçalho',
 'headline_tip' => 'Seção de nível 2',
 'nowiki_sample' => 'Inserir texto não-formatado aqui',
 'nowiki_tip' => 'Ignorar formatação wiki',
 'image_sample' => 'Exemplo.jpg',
-'image_tip' => 'Arquivo incorporado',
+'image_tip' => 'Ficheiro incorporado',
 'media_sample' => 'Exemplo.ogg',
-'media_tip' => 'Ligação para ficheiro',
+'media_tip' => 'Link para ficheiro',
 'sig_tip' => 'A sua assinatura, com hora e data',
 'hr_tip' => 'Linha horizontal (utilize moderadamente)',
 
@@ -968,7 +979,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',
@@ -1029,7 +1040,7 @@ Ela pode ter sido movida ou removida enquanto estava a ver a página.',
 
 Ela pode ser alterada na página [[Special:ChangePassword|de alteração da palavra-chave]] após autenticação.',
 'newarticle' => '(Nova)',
-'newarticletext' => "Seguiu uma ligação para uma página que ainda não existe.
+'newarticletext' => "Seguiu um link para uma página que ainda não existe.
 Para criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [[{{MediaWiki:Helppage}}|página de ajuda]] para mais detalhes).
 Se chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu browser.",
 'anontalkpagetext' => "----''Esta é a página de discussão de um utilizador anónimo que ainda não criou uma conta ou não a utiliza, pelo que temos de utilizar o endereço IP para identificá-lo(a).
@@ -1195,6 +1206,7 @@ Depois grave as alterações, para finalizar e desfazer a edição.',
 'undo-failure' => 'Não foi possível desfazer a edição por conflito com alterações intermédias.',
 'undo-norev' => 'Não foi possível desfazer a edição porque ela não existe ou foi apagada.',
 'undo-summary' => 'Desfeita a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])',
+'undo-summary-username-hidden' => 'Desfazer a revisão  $1  por um usuário oculto',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Não é possível criar uma conta',
@@ -1472,14 +1484,14 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'prefs-watchlist-days-max' => 'Máximo: $1 {{PLURAL:$1|dia|dias}}',
 'prefs-watchlist-edits' => 'Número de edições a mostrar na listagem expandida:',
 'prefs-watchlist-edits-max' => 'Máximo: 1000',
-'prefs-watchlist-token' => 'Senha secreta da lista de {{lc:{{int:watchlist}}}}:',
+'prefs-watchlist-token' => 'Chave secreta da lista de páginas vigiadas:',
 'prefs-misc' => 'Diversos',
 'prefs-resetpass' => 'Alterar palavra-chave',
 'prefs-changeemail' => 'Alterar correio electrónico',
 'prefs-setemail' => 'Definir um endereço de correio electrónico',
 'prefs-email' => 'Opções do correio electrónico',
 'prefs-rendering' => 'Aparência',
-'saveprefs' => 'Salvar',
+'saveprefs' => 'Gravar',
 'resetprefs' => 'Eliminar as alterações que não foram gravadas',
 'restoreprefs' => 'Repor todas as configurações padrão (em todas as secções)',
 'prefs-editing' => 'Edição',
@@ -1493,6 +1505,9 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'recentchangesdays-max' => 'Máximo: $1 {{PLURAL:$1|dia|dias}}',
 'recentchangescount' => 'Número de edições a apresentar por omissão:',
 'prefs-help-recentchangescount' => 'Inclui mudanças recentes, histórico de páginas e registos.',
+'prefs-help-watchlist-token2' => "Esta é a chave secreta para o ''feed'' RSS da sua lista de páginas vigiadas.
+Qualquer pessoa que conheça a chave será capaz de ler a sua lista de páginas vigiadas, por isso não a divulgue.
+[[Special:ResetTokens|Clique aqui para redefini-la]].",
 'savedprefs' => 'As suas preferências foram gravadas.',
 'timezonelegend' => 'Fuso horário:',
 'localtime' => 'Hora local:',
@@ -1516,7 +1531,7 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'prefs-namespaces' => 'Espaços nominais',
 'defaultns' => 'Por omissão, pesquisar nestes espaços nominais:',
 'default' => 'padrão',
-'prefs-files' => 'Arquivos',
+'prefs-files' => 'Ficheiros',
 'prefs-custom-css' => 'CSS personalizada',
 'prefs-custom-js' => 'JS personalizado',
 'prefs-common-css-js' => 'CSS/JS partilhado por todos os temas:',
@@ -1538,14 +1553,16 @@ Esta operação não pode ser desfeita.',
 'badsig' => 'Assinatura inválida; verifique o código HTML utilizado.',
 'badsiglength' => 'A sua assinatura é demasiado longa.
 Não deverá conter mais de $1 {{PLURAL:$1|carácter|caracteres}}.',
-'yourgender' => 'Sexo:',
-'gender-unknown' => 'Não especificado',
-'gender-male' => 'Masculino',
-'gender-female' => 'Feminino',
-'prefs-help-gender' => 'Opcional: usado pelo programa para ajuste das mensagens ao género do utilizador.
+'yourgender' => 'Como prefere ser descrito?',
+'gender-unknown' => 'Prefiro não dizer',
+'gender-male' => 'Ele edita páginas wiki',
+'gender-female' => 'Ela edita páginas wiki',
+'prefs-help-gender' => 'Esta preferência é opcional.
+O software usa o seu valor para o endereçar e para o mencionar a outros usando o género gramatical apropriado.
 Esta informação será pública.',
 'email' => 'Correio electrónico',
-'prefs-help-realname' => 'Opcional: se optar por revelar o seu nome verdadeiro, este será utilizado para atribuir-lhe crédito pelo seu trabalho.',
+'prefs-help-realname' => 'O fornecimento do nome verdadeiro é opcional.
+Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.',
 'prefs-help-email' => 'Opcional: o endereço de correio electrónico é opcional, mas será necessário para reiniciar a palavra-chave caso esqueça a antiga.',
 'prefs-help-email-others' => 'Também pode optar por permitir que outros entrem em contacto consigo por correio electrónico, através de um link nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio electrónico.',
 'prefs-help-email-required' => 'É necessário o endereço de correio electrónico.',
@@ -1555,6 +1572,7 @@ Esta informação será pública.',
 'prefs-dateformat' => 'Formato de data',
 'prefs-timeoffset' => 'Desvio horário',
 'prefs-advancedediting' => 'Opções gerais',
+'prefs-preview' => 'Antevisão',
 'prefs-advancedrc' => 'Opções avançadas',
 'prefs-advancedrendering' => 'Opções avançadas',
 'prefs-advancedsearchoptions' => 'Opções avançadas',
@@ -1562,6 +1580,7 @@ Esta informação será pública.',
 'prefs-displayrc' => 'Opções de visionamento',
 'prefs-displaysearchoptions' => 'Opções de apresentação',
 'prefs-displaywatchlist' => 'Opções de apresentação',
+'prefs-tokenwatchlist' => 'Chave',
 'prefs-diffs' => 'Diferenças',
 
 # User preference: email validation using jQuery
@@ -1778,7 +1797,7 @@ As suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
 'reuploaddesc' => 'Cancelar o envio e voltar ao formulário de carregamento',
 'upload-tryagain' => 'Submeta a descrição do ficheiro modificado',
 'uploadnologin' => 'Não autenticado',
-'uploadnologintext' => 'Tem de estar [[Special:UserLogin|autenticado]] para enviar ficheiros.',
+'uploadnologintext' => 'Tem de $1 para enviar ficheiros.',
 'upload_directory_missing' => 'O diretório de carregamento de ficheiros ($1) não existe e o servidor de internet não conseguiu criá-lo.',
 'upload_directory_read_only' => 'O servidor de internet não possui permissão de escrita no diretório de carregamento de ficheiros ($1).',
 'uploaderror' => 'Erro ao carregar',
@@ -1793,9 +1812,9 @@ Para utilizar um ficheiro numa página, depois de ter feito o upload, insira um
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);
 * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar um link direto para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
-'upload-permitted' => 'Tipos de ficheiros permitidos: $1.',
-'upload-preferred' => 'Tipos de ficheiros preferidos: $1.',
-'upload-prohibited' => 'Tipos de arquivo proibidos: $1.',
+'upload-permitted' => 'Tipos de ficheiro permitidos: $1.',
+'upload-preferred' => 'Tipos de ficheiro preferidos: $1.',
+'upload-prohibited' => 'Tipos de ficheiro proibidos: $1.',
 'uploadlog' => 'registo de carregamento',
 'uploadlogpage' => 'Registo de carregamento',
 'uploadlogpagetext' => 'Segue-se uma lista dos carregamentos mais recentes.
@@ -1817,10 +1836,10 @@ Altere o nome do ficheiro e tente enviá-lo novamente, por favor.',
 'filetype-mime-mismatch' => 'A extensão ".$1" não corresponde ao tipo MIME do ficheiro ($2).',
 'filetype-badmime' => 'Não é permitido carregar ficheiros do tipo MIME "$1".',
 'filetype-bad-ie-mime' => 'Não é possível carregar este ficheiro porque o Internet Explorer o detectaria como "$1", que é um tipo de ficheiro não permitido e potencialmente perigoso.',
-'filetype-unwanted-type' => "'''\".\$1\"''' não é um tipo de arquivo desejado.
+'filetype-unwanted-type' => "'''\".\$1\"''' não é um tipo de ficheiro desejado.
 {{PLURAL:\$3|O tipo preferido é|Os tipos preferidos são}} \$2.",
-'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|não é um tipo de arquivo permitido|não são tipos de arquivo permitidos}}.
-{{PLURAL:$3|O tipo de arquivo permitido é|Os tipos de arquivo permitidos são}} $2.',
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|não é um tipo de ficheiro permitido|não são tipos de ficheiro permitidos}}.
+{{PLURAL:$3|O tipo de ficheiro permitido é|Os tipos de ficheiro permitidos são}} $2.',
 'filetype-missing' => 'O ficheiro não possui uma extensão (como, por exemplo, ".jpg").',
 'empty-file' => 'O ficheiro que enviou estava vazio.',
 'file-too-large' => 'O ficheiro que enviou era demasiado grande.',
@@ -1828,11 +1847,11 @@ Altere o nome do ficheiro e tente enviá-lo novamente, por favor.',
 'filetype-banned' => 'Este tipo de ficheiro é proibido.',
 'verification-error' => 'O ficheiro não passou a verificação de ficheiros.',
 'hookaborted' => 'A modificação que pretendia foi abortada pelo hook de uma extensão.',
-'illegal-filename' => 'O nome do arquivo não é permitido.',
-'overwrite' => 'Não é permitido sobrescrever um arquivo existente.',
+'illegal-filename' => 'O nome do ficheiro não é permitido.',
+'overwrite' => 'Não é permitido sobrescrever um ficheiro existente.',
 'unknown-error' => 'Ocorreu um erro desconhecido.',
-'tmp-create-error' => 'Não foi possível criar o arquivo temporário.',
-'tmp-write-error' => 'Erro na escrita do arquivo temporário.',
+'tmp-create-error' => 'Não foi possível criar o ficheiro temporário.',
+'tmp-write-error' => 'Erro na escrita do ficheiro temporário.',
 'large-file' => 'É recomendável que os ficheiros não sejam maiores que $1;
 este tem $2.',
 'largefileserver' => 'O tamanho deste ficheiro é superior ao permitido pela configuração do servidor.',
@@ -1883,7 +1902,7 @@ Não é permitido o upload de ficheiros Java, porque estes podem contornar as re
 'sourcefilename' => 'Nome do ficheiro de origem:',
 'sourceurl' => 'URL fonte:',
 'destfilename' => 'Nome do ficheiro de destino:',
-'upload-maxfilesize' => 'Tamanho máximo do arquivo: $1',
+'upload-maxfilesize' => 'Tamanho máximo do ficheiro: $1',
 'upload-description' => 'Descrição do ficheiro',
 'upload-options' => 'Opções de carregamento',
 'watchthisupload' => 'Vigiar este ficheiro',
@@ -2033,7 +2052,7 @@ Verifique se o endereço está correto e o site disponível, por favor.',
 # Special:ListFiles
 'listfiles-summary' => 'Esta página especial mostra todos os ficheiros carregados.',
 'listfiles_search_for' => 'Pesquisar por nome de imagem:',
-'imgfile' => 'arquivo',
+'imgfile' => 'ficheiro',
 'listfiles' => 'Ficheiros',
 'listfiles_thumb' => 'Miniatura',
 'listfiles_date' => 'Data',
@@ -2044,7 +2063,7 @@ Verifique se o endereço está correto e o site disponível, por favor.',
 'listfiles_count' => 'Versões',
 
 # File description page
-'file-anchor-link' => 'Arquivo',
+'file-anchor-link' => 'Ficheiro',
 'filehist' => 'Histórico do ficheiro',
 'filehist-help' => 'Clique numa data/hora para ver o ficheiro tal como se encontrava nesse momento.',
 'filehist-deleteall' => 'eliminar todas',
@@ -2098,7 +2117,7 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
 # File deletion
 'filedelete' => 'Eliminar $1',
 'filedelete-legend' => 'Eliminar ficheiro',
-'filedelete-intro' => "Está prestes a eliminar o arquivo '''[[Media:$1|$1]]''' e todo o seu histórico.",
+'filedelete-intro' => "Está prestes a eliminar o ficheiro '''[[Media:$1|$1]]''' e todo o seu histórico.",
 'filedelete-intro-old' => "Está prestes a eliminar a versão de '''[[Media:$1|$1]]''' tal como se encontrava em [$4 $3, $2].",
 'filedelete-comment' => 'Motivo:',
 'filedelete-submit' => 'Eliminar',
@@ -2508,9 +2527,11 @@ Consulte $2 para um registo de eliminações recentes.',
 'deleteotherreason' => 'Outro/motivo adicional:',
 'deletereasonotherlist' => 'Outro motivo',
 'deletereason-dropdown' => '* Motivos de eliminação comuns
-** Pedido do autor
+** Spam
+** Vandalismo
 ** Violação de direitos de autor
-** Vandalismo',
+** Pedido do autor
+** Redirecionamento quebrado',
 'delete-edit-reasonlist' => 'Editar motivos de eliminação',
 'delete-toobig' => 'Esta página tem um histórico longo, com mais de $1 {{PLURAL:$1|edição|edições}}.
 A eliminação de páginas como esta foi restringida na {{SITENAME}}, para evitar problemas acidentais.',
@@ -2531,8 +2552,8 @@ alguém editou ou já reverteu a página.
 
 A última edição foi de [[User:$3|$3]] ([[User talk:$3|discussão]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "O resumo da edição era: \"''\$1''\".",
-'revertpage' => 'Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última versão por [[User:$1|$1]]',
-'revertpage-nouser' => 'Revertidas as edições de um usuário ocultado para a última revisão {{GENDER:$1|pelo|pela|por}} [[User:$1|$1]]',
+'revertpage' => 'Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]',
+'revertpage-nouser' => 'Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}',
 'rollback-success' => 'Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.',
 
 # Edit tokens
@@ -2673,7 +2694,7 @@ $1',
 'contributions' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}}',
 'contributions-title' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1',
 'mycontris' => 'Contribuições',
-'contribsub2' => 'Para $1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Não foram encontradas alterações com este critério.',
 'uctop' => '(atual)',
 'month' => 'Até o mês:',
@@ -3130,10 +3151,10 @@ Utilize o botão "Antever resultado" antes de gravar, por favor.',
 'tooltip-t-permalink' => 'Link permanente para esta versão desta página',
 'tooltip-ca-nstab-main' => 'Ver a página de conteúdo',
 'tooltip-ca-nstab-user' => 'Ver a página de utilizador',
-'tooltip-ca-nstab-media' => 'Ver a página de media',
+'tooltip-ca-nstab-media' => 'Ver a página de multimédia',
 'tooltip-ca-nstab-special' => 'Esta é uma página especial, não pode ser editada.',
 'tooltip-ca-nstab-project' => 'Ver a página de projeto',
-'tooltip-ca-nstab-image' => 'Ver a página do arquivo',
+'tooltip-ca-nstab-image' => 'Ver a página do ficheiro',
 'tooltip-ca-nstab-mediawiki' => 'Ver a mensagem de sistema',
 'tooltip-ca-nstab-template' => 'Ver a predefinição',
 'tooltip-ca-nstab-help' => 'Ver a página de ajuda',
@@ -3886,7 +3907,7 @@ Confirme que deseja realmente recriar esta página, por favor.",
 'autosumm-blank' => 'Limpou toda a página',
 'autosumm-replace' => "Página substituída por '$1'",
 'autoredircomment' => 'Redirecionamento para [[$1]]',
-'autosumm-new' => "Criou nova página com '$1'",
+'autosumm-new' => "Criou página com: '$1'",
 
 # Live preview
 'livepreview-loading' => 'A carregar…',
@@ -3983,11 +4004,11 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'fileduplicatesearch' => 'Ficheiros duplicados',
 'fileduplicatesearch-summary' => "Procure ficheiros duplicados tendo por base o seu resumo criptográfico ''(hash value)''.",
 'fileduplicatesearch-legend' => 'Procurar duplicados',
-'fileduplicatesearch-filename' => 'Nome do arquivo:',
+'fileduplicatesearch-filename' => 'Ficheiro:',
 'fileduplicatesearch-submit' => 'Pesquisar',
 'fileduplicatesearch-info' => '$1 × $2 pixels<br />Tamanho: $3<br />tipo MIME: $4',
-'fileduplicatesearch-result-1' => 'O arquivo "$1" não possui cópias idênticas.',
-'fileduplicatesearch-result-n' => 'O arquivo "$1" possui {{PLURAL:$2|uma cópia idêntica|$2 cópias idênticas}}.',
+'fileduplicatesearch-result-1' => 'O ficheiro "$1" não possui cópias idênticas.',
+'fileduplicatesearch-result-n' => 'O ficheiro "$1" possui {{PLURAL:$2|uma cópia idêntica|$2 cópias idênticas}}.',
 'fileduplicatesearch-noresults' => 'Não foi encontrado nenhum ficheiro com o nome "$1".',
 
 # Special:SpecialPages
@@ -4105,10 +4126,10 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'logentry-newusers-newusers' => 'A conta de utilizador $1 foi {{GENDER:$2|criada}}',
 'logentry-newusers-create' => 'A conta de utilizador $1 foi criada',
 'logentry-newusers-create2' => 'A conta de utilizador $3 foi criada por $1',
-'logentry-newusers-byemail' => 'Conta de utilizador $3 foi {{GENDER:$2|criada}} por $1 e a senha foi enviada por e-mail',
+'logentry-newusers-byemail' => 'A conta de utilizador $3 foi criada por $1 e a senha foi enviada por e-mail',
 'logentry-newusers-autocreate' => 'A conta de utilizador $1 foi criada automaticamente',
 'logentry-rights-rights' => '$1 modificou os privilégios do utilizador $3 de $4 para $5',
-'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|mudou}} as permissões de $3',
+'logentry-rights-rights-legacy' => '$1 alterou os grupos de $3',
 'logentry-rights-autopromote' => '$1 foi automaticamente {{GENDER:$2|promovido|promovida}} de $4 a $5',
 'rightsnone' => '(nenhum)',
 
@@ -4190,7 +4211,7 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 
 # Limit report
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
-'limitreport-postexpandincludesize-value' => '$1/$2 bytes',
-'limitreport-templateargumentsize-value' => '$1/$2 bytes',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 
 );
index 1a72451..c7d1660 100644 (file)
@@ -789,6 +789,8 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
 'userlogin-resetpassword-link' => 'Troque sua senha',
 'helplogin-url' => 'Help:Iniciar sessão',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda para iniciar sessão]]',
+'userlogin-loggedin' => 'Você já está conectado como {{GENDER:$1|$1}}.
+Use o formulário abaixo para iniciar sessão como outro usuário.',
 'createacct-join' => 'Insira suas informações abaixo.',
 'createacct-another-join' => 'Preeencha as informações para a nova conta',
 'createacct-emailrequired' => 'Endereço de e-mail',
@@ -1307,7 +1309,7 @@ Outros administradores no {{SITENAME}} continuarão podendo acessar ao conteúdo
 'revdelete-unsuppress' => 'Remover restrições das edições restauradas',
 'revdelete-log' => 'Motivo:',
 'revdelete-submit' => 'Aplicar {{PLURAL:$1|à revisão selecionada|às revisões selecionadas}}',
-'revdelete-success' => "'''A visibilidade da revisão foi definida com sucesso.'''",
+'revdelete-success' => "'''A visibilidade da revisão foi atualizada.'''",
 'revdelete-failure' => "'''A visibilidade da revisão não foi atualizada:'''
 $1",
 'logdelete-success' => "'''Visibilidade de evento definida com sucesso.'''",
@@ -2539,10 +2541,12 @@ Consulte $2 para um registro de eliminações recentes.',
 'deletecomment' => 'Motivo:',
 'deleteotherreason' => 'Justificativa adicional:',
 'deletereasonotherlist' => 'Outro motivo',
-'deletereason-dropdown' => '* Motivos de eliminação comuns
-** Pedido do autor
+'deletereason-dropdown' => '* Motivos comuns para eliminação
+** Spam
+** Vandalismo
 ** Violação de direitos de autor
-** Vandalismo',
+** A pedido do autor
+** Redirecionamento inválido',
 'delete-edit-reasonlist' => 'Editar motivos de eliminação',
 'delete-toobig' => 'Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.
 A eliminação de tais páginas foi restrita, a fim de se evitarem problemas acidentais em {{SITENAME}}.',
@@ -2703,7 +2707,7 @@ $1',
 'contributions' => 'Contribuições {{GENDER:$1|do usuário|da usuária}}',
 'contributions-title' => 'Contribuições {{GENDER:$1|do usuário|da usuária}} $1',
 'mycontris' => 'Contribuições',
-'contribsub2' => 'Para $1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Não foram encontradas mudanças com este critério.',
 'uctop' => '(atual)',
 'month' => 'Mês (inclusive anteriores):',
@@ -4047,7 +4051,10 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'tags-tag' => 'Nome da etiqueta',
 'tags-display-header' => 'Aparência nas listas de modificações',
 'tags-description-header' => 'Descrição completa do significado',
+'tags-active-header' => 'Ativo?',
 'tags-hitcount-header' => 'Modificações etiquetadas',
+'tags-active-yes' => 'Sim',
+'tags-active-no' => 'Não',
 'tags-edit' => 'editar',
 'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}',
 
@@ -4212,8 +4219,11 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
 'limitreport-ppvisitednodes' => 'Número de nós visitados pelo pré-processador',
 'limitreport-ppgeneratednodes' => 'Número de nós gerados pelo pré-processador',
+'limitreport-postexpandincludesize' => 'Tamanho de inclusão pós-expansão',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Argumento do tamanho da predefinição',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 'limitreport-expansiondepth' => 'Máxima profundidade de expansão',
+'limitreport-expensivefunctioncount' => 'Conta da função expansiva do analizador',
 
 );
index 59a7c3e..74d13ac 100644 (file)
@@ -21,6 +21,7 @@
  * @author Aotake
  * @author Bangin
  * @author Bennylin
+ * @author Benojan
  * @author Beta16
  * @author Bilalokms
  * @author Boivie
  * @author Prometheus.pyrphoros
  * @author Psubhashish
  * @author Purodha
+ * @author Pxos
  * @author Rancher
  * @author Raymond
  * @author Reedy
@@ -586,7 +588,8 @@ See also:
 {{Identical|Create}}',
 'editthispage' => 'This is the "edit" link as used in the Cologne Blue skin, at the bottom of the page.
 
-See {{msg-mw|Create-this-page}} for when the page does not exist.',
+See {{msg-mw|Create-this-page}} for when the page does not exist.
+{{Identical|Edit this page}}',
 'create-this-page' => 'In the Cologne Blue skin this is the text for the link leading to the edit form on pages that have not yet been created, at the bottom of the page. See {{msg-mw|editthispage}} for when the page already exists.
 {{Identical|Createpage}}',
 'delete' => 'Name of the Delete tab shown for admins. Should be in the infinitive mood.
@@ -708,8 +711,10 @@ For explanation of 'lock' see [[w:Lock_(computer_science)|wikipedia]].",
 'aboutpage' => 'Used as the target of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. Therefore the content should be the same with the page name of the site description page. Only the message in the [[mw:Manual:$wgLanguageCode|site language]]  ([[MediaWiki:Aboutpage]]) is used. The link label is {{msg-mw|aboutsite}}.
 
 {{doc-important|Do not translate "Project:" part, for this is the namespace prefix.}}',
-'copyright' => 'Parameters:
-* $1 - license name',
+'copyright' => "Parameters:
+* $1 - license name
+'''See also'''
+* {{msg-mw|Mobile-frontend-copyright}}",
 'copyrightpage' => '{{doc-important|Do not change <nowiki>{{ns:project}}</nowiki>}}
 
 {{Identical|Copyright}}',
@@ -962,9 +967,6 @@ Parameters:
 * $1 - page title',
 'sort-descending' => 'JavaScript message. Used by sortable table script.',
 'sort-ascending' => 'JavaScript message. Used by sortable table script.',
-'tooltip-iwiki' => 'Format of a sidebar interwiki link tooltip. Parameters:
-* $1 - Page name in the target wiki
-* $2 - Target wiki language autonym',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'The name for the tab of the main namespace. Example: [[Example]]
@@ -1353,6 +1355,16 @@ See example: [[Special:UserLogin]]
 
 See also:
 * {{msg-mw|Helplogin-url}}',
+'userlogin-loggedin' => 'Used as warning on [[Special:UserLogin]] when the current user is already logged in.
+
+Followed by the Login form.
+
+See example: [[Special:UserLogin]].
+
+Parameters:
+* $1 - user name (used for display and for gender support)',
+'userlogin-createanother' => 'Used as label for the button on [[Special:UserLogin]] shown when the current user is already logged in.
+{{Identical|Create another account}}',
 'createacct-join' => 'Subheading of vertical-layout create account form encouraging user to join the wiki.
 
 See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
@@ -1393,7 +1405,8 @@ See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?t
 See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
 'createacct-another-submit' => 'Submit button of  [[Special:UserLogin/signup]] ([[Special:CreateAccount]]) when accessed by a registered user.
 
-The original means "create an account in addition to the one you already have"; sometimes, but not always, it means you are going to "Create the account on behalf of somebody else" or "Create account for another".',
+The original means "create an account in addition to the one you already have"; sometimes, but not always, it means you are going to "Create the account on behalf of somebody else" or "Create account for another".
+{{Identical|Create another account}}',
 'createacct-benefit-heading' => 'In vertical-layout create account form, the heading for the section describing the benefits of creating an account. See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
 
 If in your language you need to know the gender of the name for the wiki (which is the subject of the English sentence), please adapt the sentence as much as you need for your translation to fit.',
@@ -2336,7 +2349,7 @@ See [{{canonicalurl:x|feed=atom&action=history}} example].',
 'rev-suppressed-text-unhide' => 'Parameters:
 * $1 - a HTML link to the revision
 {{Related|Rev-deleted-text}}',
-'rev-deleted-text-view' => 'I believe this is an error message which appears if a user tries to view a past revision of a page, where the revision has been hidden from view, although later revisions of the page still exist.',
+'rev-deleted-text-view' => 'This is an error message which appears if a user tries to view a past revision of a page, where the revision has been hidden from view, although later revisions of the page still exist.',
 'rev-suppressed-text-view' => '{{Related|Rev-deleted-text}}',
 'rev-deleted-no-diff' => 'See also:
 * {{msg-mw|Rev-suppressed-no-diff}}',
@@ -2973,7 +2986,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
@@ -3500,7 +3513,8 @@ In [[Special:Log]]',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => '{{Doc-action|read}}',
-'action-edit' => '{{Doc-action|edit}}',
+'action-edit' => '{{Doc-action|edit}}
+{{Identical|Edit this page}}',
 'action-createpage' => '{{Doc-action|createpage}}
 {{Identical|Create page}}',
 'action-createtalk' => '{{Doc-action|createtalk}}',
@@ -5293,14 +5307,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
@@ -7840,6 +7854,9 @@ See also:
 * {{msg-mw|Summary}}
 * {{msg-mw|Accesskey-summary}}
 * {{msg-mw|Tooltip-summary}}',
+'tooltip-iwiki' => 'Format of a sidebar interwiki link tooltip. Parameters:
+* $1 - page name in the target wiki
+* $2 - target wiki language autonym',
 
 # Stylesheets
 'common.css' => '{{optional}}
@@ -8401,7 +8418,7 @@ Parameters:
 {{Related|Day-at}}',
 
 # Bad image list
-'bad_image_list' => 'This message only appears to guide administrators to add links with the right format. This will not appear anywhere else in MediaWiki.',
+'bad_image_list' => '箇条信息只出现在引导管理员用正确个格式加链接。弗会徕Mediawiki别荡处出现。',
 
 /*
 Short names for language variants used for language conversion links.
@@ -8499,7 +8516,7 @@ Varient Option for wikis with variants conversion enabled.',
 'metadata-help' => 'This message is followed by a table with metadata.',
 'metadata-expand' => 'On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on this link, you can see more data and information. For the link to hide back the less important data, see {{msg-mw|Metadata-collapse}}.',
 'metadata-collapse' => 'On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on the link {{msg-mw|Metadata-expand}}, you can see more data and information. This message is for the link to hide back the less important data.',
-'metadata-fields' => '{{doc-important|Do not translate list items, only translate the text! So leave "<code>* make</code>" and the other items exactly as they are.}}
+'metadata-fields' => '{{doc-important|覅翻译列表项,只翻译上头个文本!畀 "<code>* make</code>" 搭别个列表项正确保留。}}
 The sentences are for explanation only and are not shown to the user.',
 'metadata-langitem' => '{{optional}}
 This is used for constructing the list of translations when a metadata property is translated into multiple languages.
@@ -10037,10 +10054,23 @@ Parameters:
 'tags-tag' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
 'tags-display-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
 'tags-description-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
-'tags-active-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
+'tags-active-header' => 'Caption of a column in [[Special:Tags]]. Values are "Yes" or "No" to indicate if a tag that was ever used is current still registered.
+
+See example: [[mw:Special:Tags]].
+
+For more information on tags see [[mw:Manual:Tags|MediaWiki]].
+{{Identical|Active}}',
 'tags-hitcount-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
-'tags-active-yes' => 'Table cell contents if given tag is "active".',
-'tags-active-no' => 'Table cell contents if given tag is not "active".',
+'tags-active-yes' => 'Table cell contents if given tag is "active".
+
+See also:
+* {{msg-mw|Tags-active-no}}
+{{Identical|Yes}}',
+'tags-active-no' => 'Table cell contents if given tag is not "active".
+
+See also:
+* {{msg-mw|Tags-active-yes}}
+{{Identical|No}}',
 'tags-edit' => 'Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.
 {{Identical|Edit}}',
 'tags-hitcount' => 'Shown in the "{{msg-mw|Tags-hitcount-header}}" column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].
index 5ab64fc..81d6ae0 100644 (file)
@@ -761,6 +761,9 @@ Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SI
 'userlogin-resetpassword-link' => 'Resetare parolă',
 'helplogin-url' => 'Help:Autentificare',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajutor la autentificare]]',
+'userlogin-loggedin' => 'Sunteți deja {{GENDER:$1|autentificat|autentificată}} ca {{GENDER:$1|$1}}.
+Utilizați formularul de mai jos pentru a vă autentifica cu alt nume de utilizator.',
+'userlogin-createanother' => 'Creează un alt cont',
 'createacct-join' => 'Introduceți-vă informațiile mai jos.',
 'createacct-another-join' => 'Introduceți, mai jos, informațiile noului cont.',
 'createacct-emailrequired' => 'Adresă de e-mail',
@@ -1607,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',
@@ -1620,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}}”',
@@ -1649,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',
@@ -1657,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',
@@ -1692,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ă',
@@ -2498,10 +2501,12 @@ Accesați $2 pentru o listă cu elementele recent șterse.',
 'deletecomment' => 'Motiv:',
 'deleteotherreason' => 'Motiv diferit/suplimentar:',
 'deletereasonotherlist' => 'Alt motiv',
-'deletereason-dropdown' => '*Motive uzuale
-** La cererea autorului
+'deletereason-dropdown' => '*Motive uzuale de ștergere
+** Spam
+** Vandalism
 ** Violarea drepturilor de autor
-** Vandalism',
+** La cererea autorului
+** Redirecționare nefuncțională',
 'delete-edit-reasonlist' => 'Modifică motivele ștergerii',
 'delete-toobig' => 'Această pagină are un istoric al modificărilor important, cu mai mult de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}.
 Ștergerea unei astfel de pagini a fost restricționată pentru a preveni apariția unor erori în {{SITENAME}}.',
@@ -2662,7 +2667,7 @@ $1',
 'contributions' => 'Contribuții {{GENDER:$1|utilizator}}',
 'contributions-title' => 'Contribuțiile utilizatorului $1',
 'mycontris' => 'Contribuții',
-'contribsub2' => 'Pentru $1 ($2)',
+'contribsub2' => 'Pentru {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Nu a fost găsită nici o modificare care să satisfacă acest criteriu.',
 'uctop' => '(actuală)',
 'month' => 'Din luna (și dinainte):',
@@ -3146,6 +3151,7 @@ Un dosar temporar lipsește.',
 Permite adăugarea unui motiv în descrierea modificărilor',
 'tooltip-preferences-save' => 'Salvează preferințele',
 'tooltip-summary' => 'Descrieți pe scurt modificarea',
+'tooltip-iwiki' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/** CSS plasate aici vor fi aplicate tuturor aparițiilor */',
@@ -3931,7 +3937,7 @@ Puteți folosi în schimb [[Special:EditWatchlist|editorul standard]].',
 'version-credits-summary' => 'Am dori să amintim următoarele persoane pentru contribuțiile aduse proiectului [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki este un software liber pe care îl puteți redistribui și/sau modifica sub termenii Licenței Publice Generale GNU publicată de Free Software Foundation – fie a doua versiune a acesteia, fie, la alegerea dumneavoastră, orice altă versiune ulterioară. 
 
-MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GARANȚIE, nici măcar cea implicită de COMERCIALIZARE sau de ADAPTARE PENTRU UN UN SCOP ANUME. Vedeți Licența Publică Generală GNU pentru mai multe detalii. 
+MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GARANȚIE, nici măcar cea implicită de COMERCIALIZARE sau de ADAPTARE PENTRU UN SCOP ANUME. Vedeți Licența Publică Generală GNU pentru mai multe detalii. 
 
 În cazul în care nu ați primit [{{SERVER}}{{SCRIPTPATH}}/COPYING o copie a  Licenței Publice Generale GNU] împreună cu acest program, scrieți la Free Software Foundation, Inc, 51, Strada Franklin, etajul cinci, Boston, MA 02110-1301, Statele Unite ale Americii sau [//www.gnu.org/licenses/old-licenses/gpl-2.0.html citiți-o online].',
 'version-software' => 'Software instalat',
@@ -4007,7 +4013,10 @@ MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GAR
 'tags-tag' => 'Numele etichetei',
 'tags-display-header' => 'Apariția în listele cu schimbări',
 'tags-description-header' => 'Descrierea completă a sensului',
+'tags-active-header' => 'Activă?',
 'tags-hitcount-header' => 'Modificări etichetate',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Nu',
 'tags-edit' => 'modificare',
 'tags-hitcount' => '$1 {{PLURAL:$1|modificare|modificări}}',
 
index 9d17cb2..afcb7f7 100644 (file)
@@ -897,6 +897,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' => 'Адрес электронной почты',
@@ -1861,7 +1864,7 @@ $1",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|изменение|изменения|изменений}}',
-'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|с последнего посещения}}',
+'enhancedrc-since-last-visit' => '$1 с последнего посещения',
 'enhancedrc-history' => 'история',
 'recentchanges' => 'Свежие правки',
 'recentchanges-legend' => 'Настройки свежих правок',
@@ -2643,9 +2646,11 @@ $UNWATCHURL
 'deleteotherreason' => 'Другая причина/дополнение:',
 'deletereasonotherlist' => 'Другая причина',
 'deletereason-dropdown' => '* Типовые причины удаления
+** спам
 ** вандализм
+** нарушение авторских прав
 ** по запросу автора
-** Ð½Ð°Ñ\80Ñ\83Ñ\88ение Ð°Ð²Ñ\82оÑ\80Ñ\81киÑ\85 Ð¿Ñ\80ав',
+** Ð½ÐµÑ\80абоÑ\82аÑ\8eÑ\89ее Ð¿ÐµÑ\80енапÑ\80авление',
 'delete-edit-reasonlist' => 'Править список причин',
 'delete-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий|версий}}.
 Удаление таких страниц было запрещено во избежание нарушений в работе сайта {{SITENAME}}.',
@@ -2806,7 +2811,7 @@ $1',
 'contributions' => 'Вклад {{GENDER:$1|участника|участницы}}',
 'contributions-title' => 'Вклад {{GENDER:$1|участника|участницы}} $1',
 'mycontris' => 'Вклад',
-'contribsub2' => 'Вклад $1 ($2)',
+'contribsub2' => 'Вклад {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Изменений, соответствующих заданным условиям, найдено не было.',
 'uctop' => '(текущая)',
 'month' => 'С месяца (и ранее):',
@@ -3281,6 +3286,7 @@ $2',
 'tooltip-undo' => 'Убрать внесённую правку и показать предпросмотр, с возможностью указать причину отмены',
 'tooltip-preferences-save' => 'Сохранить настройки',
 'tooltip-summary' => 'Введите краткое описание',
+'tooltip-iwiki' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* Размещённый здесь CSS будет применяться ко всем темам оформления */',
@@ -4256,7 +4262,10 @@ MediaWiki распространяется в надежде, что она бу
 '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|изменение|изменения|изменений}}',
 
index 79d3704..a0e2972 100644 (file)
@@ -14,6 +14,7 @@
  * @author OchAyeTheNoo
  * @author Omnipaedista
  * @author Purodha
+ * @author Shirayuki
  * @author The Evil IP address
  * @author Urhixidur
  * @author Ushanka
index 703abf7..eb8b9e4 100644 (file)
@@ -293,10 +293,10 @@ $messages = array(
 'tog-extendwatchlist' => 'Rozšíriť zoznam sledovaných stránok, aby zobrazoval všetky zmeny, nie len posledné',
 'tog-usenewrc' => 'Zoskupiť v posledných úpravách a na zozname sledovaných stránok podľa stránky (vyžaduje JavaScript)',
 'tog-numberheadings' => 'Automaticky číslovať nadpisy',
-'tog-showtoolbar' => 'Zobraziť panel nástrojov úprav (vyžaduje JavaSkript)',
-'tog-editondblclick' => 'Upravovať stránky po dvojitom kliknutí (vyžaduje JavaScript)',
+'tog-showtoolbar' => 'Zobraziť panel nástrojov úprav',
+'tog-editondblclick' => 'Upravovať stránky po dvojitom kliknutí',
 'tog-editsection' => 'Umožniť upravovanie sekcie prostredníctvom odkazov [upraviť]',
-'tog-editsectiononrightclick' => 'Umožniť upravovanie sekcie pravým kliknutím na nadpisy sekcií (vyžaduje JavaScript)',
+'tog-editsectiononrightclick' => 'Umožniť upravovanie sekcie pravým kliknutím na nadpisy sekcií',
 'tog-showtoc' => 'Zobrazovať tabuľku s obsahom (pre stránky s viac ako 3 nadpismi)',
 'tog-rememberpassword' => 'Zapamätať si prihlásenie na tomto počítači (najviac $1 {{PLURAL:$1|deň|dni|dní}})',
 'tog-watchcreations' => 'Pridávať stránky, ktoré vytvorím a súbory, ktoré nahrám medzi sledované',
@@ -314,7 +314,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Zobraziť počet používateľov sledujúcich stránku',
 'tog-oldsig' => 'Súčasný podpis:',
 'tog-fancysig' => 'Považovať podpisy za wikitext (bez automatických odkazov)',
-'tog-uselivepreview' => 'Používať živý náhľad (JavaScript) (experimentálna funkcia)',
+'tog-uselivepreview' => 'Používať živý náhľad(experimentálna funkcia)',
 'tog-forceeditsummary' => 'Upozoriť ma, keď nevyplním zhrnutie úprav',
 'tog-watchlisthideown' => 'Skryť moje úpravy zo zoznamu sledovaných',
 'tog-watchlisthidebots' => 'Skryť úpravy botov zo zoznamu sledovaných',
@@ -328,6 +328,7 @@ $messages = array(
 'tog-noconvertlink' => 'Vypnúť konverziu názvov odkazov',
 'tog-norollbackdiff' => 'Vynechať rozdiel po vykonaní rollbacku',
 'tog-useeditwarning' => 'Upozorniť ma, keď opúšťam upravovaciu stránku s neuloženými zmenami',
+'tog-prefershttps' => 'Po prihlásení používať vždy zabezpečené pripojenie',
 
 'underline-always' => 'Vždy',
 'underline-never' => 'Nikdy',
@@ -428,7 +429,7 @@ $messages = array(
 'newwindow' => '(otvorí v novom okne)',
 'cancel' => 'Zrušiť',
 'moredotdotdot' => 'Viac...',
-'morenotlisted' => 'Ďalšie neuvedené...',
+'morenotlisted' => 'Tento zoznam nie je úplný.',
 'mypage' => 'Stránka',
 'mytalk' => 'Diskusia',
 'anontalk' => 'Diskusia k tejto IP adrese',
@@ -531,7 +532,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' => 'O {{GRAMMAR:lokál|{{SITENAME}}}}',
 'aboutpage' => 'Project:Úvod',
-'copyright' => 'Obsah je k dispozícii za licenčných podmienok $1.',
+'copyright' => 'Obsah je dostupný pod $1, pokiaľ nie je uvedené inak.',
 'copyrightpage' => '{{ns:project}}:Autorské práva',
 'currentevents' => 'Aktuality',
 'currentevents-url' => 'Project:Aktuality',
@@ -614,6 +615,11 @@ Zoznam platných špeciálnych stránok nájdete na [[Special:SpecialPages|{{int
 # General errors
 'error' => 'Chyba',
 'databaseerror' => 'Chyba v databáze',
+'databaseerror-text' => 'Došlo k chybe pri otázke do databázy.
+Môže to byť spôsobené chybou v softvéri.',
+'databaseerror-query' => 'Otázka: $1',
+'databaseerror-function' => 'Funkcia: $1',
+'databaseerror-error' => 'Chyba: $1',
 'laggedslavemode' => 'Upozornenie: Je možné, že stránka neobsahuje posledné aktualizácie.',
 'readonly' => 'Databáza je zamknutá',
 'enterlockreason' => 'Zadajte dôvod požadovaného zamknutia vrátane odhadu, kedy očakávate odomknutie',
@@ -647,6 +653,7 @@ Možno ju už zmazal nieto iný.',
 'cannotdelete-title' => 'Nemôžete zmazať stránku „$1“',
 'delete-hook-aborted' => 'Zmazanie zrušila prídavná funkcia (prípojný bod syntaktického analyzátora).
 Neudala vysvetlenie.',
+'no-null-revision' => 'Nepodarilo sa vytvoriť novú prázdnu revíziu stránky „$1“',
 'badtitle' => 'Neplatný nadpis',
 'badtitletext' => 'Požadovaný nadpis bol neplatný, nezadaný, alebo nesprávne odkazovaný z inej jazykovej verzie {{GRAMMAR:genitív|{{SITENAME}}}}. Mohol tiež obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v nadpisoch.',
 'perfcached' => 'Nasledujúce údaje pochádzajú z vyrovnávacej pamäte a nemusia byť úplne aktuálne. Vo vyrovnávacej pamäti {{PLURAL:$1|je dostupný|sú dostupné|je dostupných}} najviac {{PLURAL:$1|jeden výsledok|$1 výsledky|$1 výsledkov}}.',
@@ -695,7 +702,6 @@ Správca, ktorý ho zamkol ponúkol toto vysvetlenie: „$3“.',
 # Login and logout pages
 'logouttext' => "'''Práve ste sa odhlásili.'''
 
-Odteraz môžete používať {{GRAMMAR:akuzatív|{{SITENAME}}}} ako anonymný používateľ alebo sa môžete opäť <span class='plainlinks'>[$1 prihlásiť]</span> pod rovnakým alebo odlišným používateľským menom.
 Uvedomte si, že niektoré stránky sa môžu naďalej zobrazovať ako keby ste boli prihlásený, až kým nevymažete vyrovnávaciu pamäť vášho prehliadača.",
 'welcomeuser' => 'Vitajte,  $1 !',
 'welcomecreation-msg' => 'Váš účet bol vytvorený.
@@ -736,13 +742,16 @@ Nezabudnite zmeniť svoje [[Special:Preferences|Predvoľby {{GRAMMAR:genitív|{{
 'userlogin-resetpassword-link' => 'Obnoviť heslo',
 'helplogin-url' => 'Help:Prihlasovanie',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc s prihlásením]]',
+'userlogin-loggedin' => 'Ste už {{GENDER:$1|prihĺasený|prihlásená}} ako $1.
+Pomocou formulára nižšie sa môžete prihlásiť ako iný redaktor.',
+'userlogin-createanother' => 'Vytvoriť ďalší účet',
 'createacct-join' => 'Vyplňte svoje údaje.',
 'createacct-another-join' => 'Vyplňte údaje nového účtu.',
 'createacct-emailrequired' => 'E-mailová adresa',
 'createacct-emailoptional' => 'E-mailová adresa (nepovinné)',
 'createacct-email-ph' => 'Zadajte vašu e-mailovú adresu',
 'createacct-another-email-ph' => 'Zadajte vašu e-mailovú adresu',
-'createaccountmail' => 'Použiť dočasné náhodné heslo a poslať ho na nižšie uvedenú emailovú adresu',
+'createaccountmail' => 'Použiť dočasné náhodné heslo a poslať ho na uvedenú emailovú adresu',
 'createacct-realname' => 'Skutočné meno (nepovinné)',
 'createaccountreason' => 'Dôvod:',
 'createacct-reason' => 'Dôvod',
@@ -810,15 +819,15 @@ Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť
 'cannotchangeemail' => 'Na tejto wiki nie je možné meniť e-mailové adresy používateľského účtu.',
 'emaildisabled' => 'Táto lokalita nedokáže posielať emaily.',
 'accountcreated' => 'Účet vytvorený',
-'accountcreatedtext' => 'Používateľský účet $1 bol vytvorený.',
+'accountcreatedtext' => 'Používateľský účet [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskusia]]) bol vytvorený.',
 'createaccount-title' => 'Vytvorenie účtu na {{GRAMMAR:lokál|{{SITENAME}}}}',
 'createaccount-text' => 'Niekto vytvoril účet pre vašu emailovú adresu na {{GRAMMAR:lokál|{{SITENAME}}}}
 ($4) s názvom „$2“, s heslom „$3“. Mali by ste sa prihlásiť a svoje heslo teraz zmeniť.
 
 Ak bol účet vytvorený omylom, túto správu môžete ignorovať.',
 'usernamehasherror' => 'Používateľské meno nemôže obsahovať znak mriežky.',
-'login-throttled' => 'Nedávno ste uskutočnili príliš mnoho neúspešných pokusov o prihlásenie.
-Prosím, počkajte predtým, než to skúsite znova.',
+'login-throttled' => 'Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie.
+Prosím, počkajte $1 predtým, než to skúsite znova.',
 'login-abort-generic' => 'Vaše prihlásenie nebolo úspešné - zrušené',
 'loginlanguagelabel' => 'Jazyk: $1',
 'suspicious-userlogout' => 'Vaša požiadavka odhlásiť sa bola zamietnutá, pretože to vyzerá, že ju poslal pokazený prehliadač alebo proxy server.',
@@ -1666,9 +1675,11 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
+'enhancedrc-history' => 'história',
 'recentchanges' => 'Posledné úpravy',
 'recentchanges-legend' => 'Možnosti posledných zmien',
 'recentchanges-summary' => 'Pomocou tejto stránky sledujete posledné úpravy wiki.',
+'recentchanges-noresult' => 'V danom období nie sú zmeny spĺňajúce tieto kritériá.',
 'recentchanges-feed-description' => 'Sledovať posledné úpravy tejto wiki týmto kanálom.',
 'recentchanges-label-newpage' => 'Táto úprava vytvorila novú stránku.',
 'recentchanges-label-minor' => 'Toto je drobná úprava',
@@ -1959,8 +1970,7 @@ Aby bolo zabezpečenie optimálne, img_auth.php je vypnutý.',
 'upload_source_file' => ' (súbor na vašom počítači)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Táto špeciálna stránka zobrazuje všetky nahrané súbory.
-Pri filtrovaní podľa používateľa sa zobrazia iba súbory, ktorých najnovšiu verziu nahral dotyčný používateľ.',
+'listfiles-summary' => 'Táto špeciálna stránka zobrazuje všetky nahrané súbory.',
 'listfiles_search_for' => 'Hľadať názov súboru:',
 'imgfile' => 'súbor',
 'listfiles' => 'Zoznam obrázkov',
@@ -1971,6 +1981,10 @@ Pri filtrovaní podľa používateľa sa zobrazia iba súbory, ktorých najnovš
 'listfiles_size' => 'Veľkosť (v bajtoch)',
 'listfiles_description' => 'Popis',
 'listfiles_count' => 'Verzie',
+'listfiles-show-all' => 'Vrátane starších verzií obrázkov',
+'listfiles-latestversion' => 'Aktuálna verzia',
+'listfiles-latestversion-yes' => 'Áno',
+'listfiles-latestversion-no' => 'Nie',
 
 # File description page
 'file-anchor-link' => 'Súbor',
@@ -2063,6 +2077,13 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'randompage' => 'Náhodná stránka',
 'randompage-nopages' => '{{PLURAL:$2|V mennom priestore „$1“ nie sú žiadne stránky.|V nasledovných menných priestoroch nie sú žiadne stránky: $1}}',
 
+# Random page in category
+'randomincategory' => 'Náhodná stránka v kategórii',
+'randomincategory-invalidcategory' => '"$1" nie je platný názov kategórie.',
+'randomincategory-nopages' => 'V [[:Category:$1|kategórii $1]] nie sú žiadne stránky.',
+'randomincategory-selectcategory' => 'Získať náhodnú stránku z kategórie: $1 $2',
+'randomincategory-selectcategory-submit' => 'Ísť na',
+
 # Random redirect
 'randomredirect' => 'Náhodná presmerovacia stránka',
 'randomredirect-nopages' => 'V mennom „$1“ priestore nie sú žiadne presmerovania.',
@@ -3959,6 +3980,8 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'tags-display-header' => 'Vzhľad v zoznamoch úprav',
 'tags-description-header' => 'Úplný popis významu',
 'tags-hitcount-header' => 'Označené úpravy',
+'tags-active-yes' => 'Áno',
+'tags-active-no' => 'Nie',
 'tags-edit' => 'upraviť',
 'tags-hitcount' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
 
@@ -3979,6 +4002,7 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'dberr-problems' => 'Prepáčte! Táto stránka má práve technické problémy.',
 'dberr-again' => 'Skúste niekoľko minút počkať a potom opäť načítať stránku.',
 'dberr-info' => '(Spojenie s databázovým serverom neúspešné: $1)',
+'dberr-info-hidden' => '(Nie je možné kontaktovať databázový server)',
 'dberr-usegoogle' => 'Zatiaľ môžete skúsiť hľadať pomocou Google.',
 'dberr-outofdate' => 'Pamätajte, že ich indexy nemusia byť aktuálne.',
 'dberr-cachederror' => 'Toto je kópia požadovanej stránky z vyrovnávacej pamäte a nemusí byť aktuálna.',
@@ -4010,10 +4034,10 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'logentry-delete-event-legacy' => '$1 {{GENDER:$2|zmenil|zmenila}} viditeľnosť záznamov udalostí k stránke $3',
 'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|zmenil|zmenila}} viditeľnosť revízií na stránke $3',
 'logentry-suppress-delete' => '$1 {{GENDER:$2|utajil|utajila}} stránku $3',
-'logentry-suppress-event' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|záznamu udalostí|$5 záznamov udalostí}} k stránke $3: $4',
+'logentry-suppress-event' => '$1 utajene {{GENDER:$2|zmenil|zmenila}} viditeľnosť {{PLURAL:$5|záznamu udalostí|$5 záznamov udalostí}} k stránke $3: $4',
 'logentry-suppress-revision' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|revízie|$5 revízií}} na stránke $3: $4',
-'logentry-suppress-event-legacy' => '$1 utajene zmenil viditeľnosť záznamov udalostí k stránke $3',
-'logentry-suppress-revision-legacy' => '$1 utajene zmenil viditeľnosť revízií na stránke $3',
+'logentry-suppress-event-legacy' => '$1 utajene {{GENDER:$2|zmenil|zmenila}} viditeľnosť záznamov udalostí k stránke $3',
+'logentry-suppress-revision-legacy' => '$1 utajene {{GENDER:$2|zmenil|zmenila}} viditeľnosť revízií na stránke $3',
 'revdelete-content-hid' => 'obsah skrytý',
 'revdelete-summary-hid' => 'zhrnutie editácie skryté',
 'revdelete-uname-hid' => 'používateľské meno skryté',
@@ -4026,13 +4050,13 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'logentry-move-move-noredirect' => '$1 premiestnil stránku $3 na $4, ale neponechal presmerovanie',
 'logentry-move-move_redir' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania',
 'logentry-move-move_redir-noredirect' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania, ale neponechal presmerovanie',
-'logentry-patrol-patrol' => '$1 označil revíziu $4 stránky $3 ako stráženú',
-'logentry-patrol-patrol-auto' => '$1 automaticky označil revíziu $4 stránky $3 ako stráženú',
-'logentry-newusers-newusers' => 'Bol vytvorený používateľský účet $1',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|označil|označila}} revíziu $4 stránky $3 ako overenú',
+'logentry-patrol-patrol-auto' => '$1 automaticky {{GENDER:$2|označil|označila}} revíziu $4 stránky $3 ako overenú',
+'logentry-newusers-newusers' => 'Bol {{GENDER:$2|vytvorený}} používateľský účet $1',
 'logentry-newusers-create' => 'Bol vytvorený používateľský účet $1',
 'logentry-newusers-create2' => '$1 vytvoril používateľský účet $3',
 'logentry-newusers-byemail' => '$1 vytvoril používateľský účet $3 a heslo bolo poslané emailom',
-'logentry-newusers-autocreate' => 'Používateľský účet $1 bol vytvorený automaticky',
+'logentry-newusers-autocreate' => 'Používateľský účet $1 bol {{GENDER:$2|vytvorený}} automaticky',
 'logentry-rights-rights' => '$1 zmenil členstvo $3 v skupinách z $4 na $5',
 'logentry-rights-rights-legacy' => '$1 zmenil členstvo $3 v skupinách',
 'logentry-rights-autopromote' => '$1 bol automaticky povýšený z $4 na $5',
@@ -4114,4 +4138,11 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 # Image rotation
 'rotate-comment' => 'Obrázok otočený o $1 {{PLURAL:$1|stupeň|stupne|stupňov}} v smere hodinových ručičiek',
 
+# Limit report
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtov}}',
+'limitreport-templateargumentsize' => 'Veľkosť argumentov šablón',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtov}}',
+'limitreport-expansiondepth' => 'Najväčšia hĺbka expanzie',
+'limitreport-expensivefunctioncount' => 'Počet náročných funkcií parseru',
+
 );
index a1722ac..bad752f 100644 (file)
@@ -216,7 +216,7 @@ $messages = array(
 'tog-enotifminoredits' => 'Pošlji e-pošto tudi za manjše spremembe strani in datotek',
 'tog-enotifrevealaddr' => 'V sporočilih z obvestili o spremembah razkrij moj e-poštni naslov',
 'tog-shownumberswatching' => 'Prikaži število uporabnikov, ki spremljajo temo',
-'tog-oldsig' => 'Obstoječi podpis:',
+'tog-oldsig' => 'Trenutni podpis:',
 'tog-fancysig' => 'Obravnavaj podpis kot wikibesedilo (brez samodejne povezave)',
 'tog-uselivepreview' => 'Uporabi hitri predogled (preizkusno)',
 'tog-forceeditsummary' => 'Ob vpisu praznega povzetka urejanja me opozori',
@@ -610,7 +610,7 @@ Administrator, ki ga je zaklenil, je podal naslednje pojasnilo: »$3«.',
 # Login and logout pages
 'logouttext' => "'''Odjavili ste se.'''
 
-Pomnite, da bodo nekatere strani morda še naprej prikazane, kot da ste prijavljeni, dokler ne boste izpraznili predpomnilnika brskalnika.",
+Nekatere strani bodo morda še naprej prikazane, kot da ste prijavljeni, dokler ne boste izpraznili predpomnilnika brskalnika.",
 'welcomeuser' => '$1, dobrodošli!',
 'welcomecreation-msg' => 'Ustvarili ste račun.
 Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rodilnik|{{SITENAME}}}}]].',
@@ -650,6 +650,9 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 'userlogin-resetpassword-link' => 'Ponastavite svoje geslo',
 'helplogin-url' => 'Help:Prijava',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoč pri prijavi]]',
+'userlogin-loggedin' => 'Ste že prijavljeni kot {{GENDER:$1|$1}}.
+Uporabite spodnji obrazec, da se prijavite kot drug uporabnik.',
+'userlogin-createanother' => 'Ustvari drug račun',
 'createacct-join' => 'Spodaj vnesite svoje informacije.',
 'createacct-another-join' => 'Spodaj vnesite informacije o novem računu.',
 'createacct-emailrequired' => 'E-poštni naslov',
@@ -762,7 +765,7 @@ Za zaključitev prijave, morate tukaj nastaviti novo geslo:',
 'newpassword' => 'Novo geslo:',
 'retypenew' => 'Ponovno vpišite geslo:',
 'resetpass_submit' => 'Nastavi geslo in se prijavi',
-'changepassword-success' => 'Vaše geslo smo uspešno spremenili!',
+'changepassword-success' => 'Vaše geslo je bilo uspešno spremenjeno!',
 'resetpass_forbidden' => 'Gesla ne morete spremeniti',
 'resetpass-no-info' => 'Za neposreden dostop do te strani morate biti prijavljeni.',
 'resetpass-submit-loggedin' => 'Spremenite geslo',
@@ -820,7 +823,7 @@ Začasno geslo: $2',
 'changeemail-oldemail' => 'Trenutni e-poštni naslov:',
 'changeemail-newemail' => 'Novi e-poštni naslov:',
 'changeemail-none' => '(noben)',
-'changeemail-password' => 'Vaše geslo na {{GRAMMAR:orodnik|{{SITENAME}}}}:',
+'changeemail-password' => 'Vaše geslo za {{GRAMMAR:tožilnik|{{SITENAME}}}}:',
 'changeemail-submit' => 'Spremeni e-naslov',
 'changeemail-cancel' => 'Prekliči',
 
@@ -890,17 +893,17 @@ Vedite, da lahko ukaz »Pošlji uporabniku e-pismo« uporabite le, če ste v [[S
 Vaš IP-naslov je $3, številka blokade pa #$5.
 Prosimo, vključite ju v vse morebitne poizvedbe.",
 'autoblockedtext' => "Vaš IP-naslov je bil samodejno blokiran, saj je bil uporabljen s strani drugega uporabnika, ki ga je blokiral $1.
-Podan razlog je:
+Razlog za to je bil naslednji:
 
 :''$2''
 
 * Začetek blokade: $8
-* Prenehanje blokade: $6
-* Predvidena blokada: $7
+* Konec blokade: $6
+* Blokirani uporabnik: $7
 
 Kontaktirate lahko $1 ali katerega od drugih [[{{MediaWiki:Grouppage-sysop}}|administratorjev]], da razpravljate o blokadi.
 
-Pomnite, da ne morete uporabljati funkcije »{{:MediaWiki:Emailuser}}«, dokler ne vnesete veljavnega e-poštnega naslova v vaše [[Special:Preferences|uporabniške nastavitve]] in vam njihova uporaba ni bila preprečena.
+Vedite, da lahko funkcijo »{{:MediaWiki:Emailuser/sl}}« uporabljate le, če ste v svoje [[Special:Preferences|uporabniške nastavitve]] vnesli veljaven e-poštni naslov, in vam njena uporaba ni bila preprečena.
 
 Vaš trenutni IP-naslov je $3, ID blokiranja pa #$5. Prosimo, vključite ta ID v vsako zastavljeno vprašanje.",
 'blockednoreason' => 'razlog ni podan',
@@ -952,7 +955,7 @@ Najnovejši vnos v dnevniku blokad je prikazan spodaj:',
 Vedite, da .css in .js strani po meri uporabljajo naslov z malo začetnico, npr. {{ns:user}}:Blabla/vector.css namesto {{ns:user}}:Blabla/Vector.css.",
 'updated' => '(Posodobljeno)',
 'note' => "'''Opomba:'''",
-'previewnote' => "'''Pomnite, da stran le predogledujete.'''
+'previewnote' => "'''Vedite, da stran le predogledujete.'''
 Vaših sprememb še nismo shranili!",
 'continue-editing' => 'Pojdi na urejevalno območje',
 'previewconflict' => 'V prikazanem predogledu je v zgornjem predelu urejanja navedeno besedilo, kakor se bo prikazalo, če ga boste shranili.',
@@ -988,10 +991,10 @@ Za obhod te težave se bodo ne-ASCII-znaki v urejevalnem polju spodaj pojavili k
 'copyrightwarning' => "Vsi prispevki k {{GRAMMAR:dajalnik|{{SITENAME}}}} se obravnavajo kot objave pod pogoji $2 (za podrobnosti glej $1). Če niste pripravljeni na neusmiljeno urejanje in prosto razširjanje vašega gradiva, ga ne prispevajte.<br />
 Poleg tega zagotavljate, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz javno dostopnega ali podobnega prostega vira.
 '''Ne dodajajte avtorsko zaščitenega dela brez dovoljenja!'''",
-'copyrightwarning2' => "Prosimo, upoštevajte, da se vsi prispevki k {{GRAMMAR:dajalnik|{{SITENAME}}}} lahko urejajo, spreminjajo ali odstranijo s strani drugih uporabnikov
-Če niste pripravljeni na neusmiljeno urejanje in prosto razširjanje vašega gradiva, ga ne prispevajte.<br />
-Poleg tega zagotavljate, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz javno dostopnega ali podobnega prostega vira (za podrobnosti glej $1).
-'''Ne dodajajte avtorsko zaščitenega dela brez dovoljenja!'''",
+'copyrightwarning2' => "Vedite, da lahko drugi urejevalci urejajo, spremenijo ali odstranijo kateri koli prispevek k {{GRAMMAR:dajalnik|{{SITENAME}}}}.
+Če niste pripravljeni na neusmiljeno urejanje svojega gradiva, ga ne objavljajte tukaj.<br />
+Poleg tega jamčite, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz vira v javni lasti ali podobnega prostega vira (za podrobnosti glej $1).
+'''Ne objavljajte avtorsko zaščitenega gradiva brez dovoljenja!'''",
 'longpageerror' => "'''Napaka: Predloženo besedilo je dolgo $1 {{PLURAL:$1|kilobajt|kilobajta|kilobajte|kilobajtov}}, s čimer presega največjo dovoljeno dolžino $2 {{PLURAL:$2|kilobajta|kilobajtov|kilobajtov|kilobajtov}}.'''
 Zato ga ni mogoče shraniti.",
 'readonlywarning' => "'''Opozorilo: Zbirka podatkov je zaradi vzdrževanja začasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti. Prosimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.'''
@@ -1017,7 +1020,7 @@ Lahko se vrnete nazaj in urejate že obstoječe strani, ali pa se [[Special:User
 'sectioneditnotsupported-title' => 'Urejanje razdelkov ni podprto',
 'sectioneditnotsupported-text' => 'Urejanje razdelkov ni podprto na tej strani.',
 'permissionserrors' => 'Napaka dovoljenja',
-'permissionserrorstext' => 'Za izvedbo dejanja nimate dovoljenja zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov|naslednjih razlogov|naslednjih razlogov|naslednjih razlogov}}:',
+'permissionserrorstext' => 'Za izvedbo dejanja nimate dovoljenja zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov}}:',
 'permissionserrorstext-withaction' => 'Za $2 zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov}} nimate dovoljenja:',
 'recreate-moveddeleted-warn' => "'''Opozorilo: Pišete stran, ki je bila nekoč že izbrisana.'''
 
@@ -1410,17 +1413,17 @@ Tega ni mogoče razveljaviti.',
 'yourlanguage' => 'Jezik:',
 'yourvariant' => 'Jezikovna različica vsebine:',
 'prefs-help-variant' => 'Vaša prednostna različica ali pravopis, v katerem naj bo prikazana vsebina strani tega wikija.',
-'yournick' => 'Nov podpis:',
+'yournick' => 'Novi podpis:',
 'prefs-help-signature' => 'Komentarje na pogovornih straneh je treba podpisati s »<nowiki>~~~~</nowiki>«, kar bo pretvorjeno v vaš podpis s časovnim žigom.',
 'badsig' => 'Neveljaven surovi podpis; preverite oznake HTML.',
 'badsiglength' => 'Vaš podpis je preobsežen.
 Ne sme biti daljši od $1 {{PLURAL:$1|znaka|znakov}}.',
 'yourgender' => 'Kako vam je ljubše, da vas opišemo?',
-'gender-unknown' => 'Ne želim navesti',
-'gender-male' => 'On ureja wikistrani',
-'gender-female' => 'Ona ureja wikistrani',
+'gender-unknown' => 'ne želim navesti',
+'gender-male' => 'On ureja wikistrani.',
+'gender-female' => 'Ona ureja wikistrani.',
 'prefs-help-gender' => 'Nastavitev ni obvezna.
-Programje uporablja njeno vrednost za naslavljanje vas in omenjanje vas drugim v primernem slovničnem spolu.
+Programje uporablja njeno vrednost za vaše naslavljanje in omenjanje v ustreznem slovničnem spolu.
 Podatek bo javno prikazan.',
 'email' => 'E-pošta',
 'prefs-help-realname' => 'Pravo ime ni obvezno.
@@ -1549,7 +1552,7 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'right-editmyusercss' => 'Uredite svoje uporabniške datoteke CSS',
 'right-editmyuserjs' => 'Uredite svoje uporabniške datoteke JavaScript',
 'right-viewmywatchlist' => 'Ogledovanje svojega spiska nadzorov',
-'right-editmywatchlist' => 'Urejanje svojega spiska nadzorov. Pomnite, da bodo nekatera dejanja dodala strani tudi brez te pravice.',
+'right-editmywatchlist' => 'Urejanje vašega spiska nadzorov. Vedite, da bodo nekatera dejanja dodala strani nanj tudi brez te pravice.',
 'right-viewmyprivateinfo' => 'Ogled svojih zasebnih podatkov (npr. e-poštnega naslova, pravega imena)',
 'right-editmyprivateinfo' => 'Urejanje svojih zasebnih podatkov (npr. e-poštnega naslova, pravega imena)',
 'right-editmyoptions' => 'Urejanje svojih nastavitev',
@@ -1652,7 +1655,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 +1709,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.',
@@ -2321,7 +2324,7 @@ E-poštni naslov, ki ste ga vpisali v [[Special:Preferences|uporabniških nastav
 'watchnologintext' => 'Za urejanje spiska nadzorov morate biti [[Special:UserLogin|prijavljeni]].',
 'addwatch' => 'Dodaj na spisek nadzorov',
 'addedwatchtext' => 'Stran »[[:$1]]« je bila dodana na vaš [[Special:Watchlist|spisek nadzorov]].
-Morebitne spremembe te strani in pripadajoče pogovorne strani bodo navedene tukaj.',
+Tam bodo navedene prihodnje spremembe te strani in pripadajoče pogovorne strani.',
 'removewatch' => 'Odstrani s spiska nadzorov',
 'removedwatchtext' => 'Stran »[[:$1]]« je bila odstranjena z vašega [[Special:Watchlist|spiska nadzorov]].',
 'watch' => 'Opazuj',
@@ -2415,9 +2418,11 @@ Za zapise nedavnih brisanj glej $2.',
 'deleteotherreason' => 'Drugi/dodatni razlogi:',
 'deletereasonotherlist' => 'Drug razlog',
 'deletereason-dropdown' => '* Pogosti razlogi za brisanje
-** zahteva avtorja
+** smetenje
+** vandalizem
 ** kršitev avtorskih pravic
-** vandalizem',
+** zahteva avtorja
+** pretrgana preusmeritev',
 'delete-edit-reasonlist' => 'Uredi razloge za brisanje',
 'delete-toobig' => 'Ta stran ima obsežno zgodovino urejanja, tj. čez $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}.
 Izbris takšnih strani je bil omejen v izogib neželenim motnjam {{GRAMMAR:dative|{{SITENAME}}}}.',
@@ -2583,7 +2588,7 @@ $1',
 'contributions' => '{{GENDER:$1|Uporabnikovi|Uporabničini}} prispevki',
 'contributions-title' => 'Prispevki uporabnika $1',
 'mycontris' => 'Prispevki',
-'contribsub2' => 'Uporabnik: $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ne najdem nobene merilom ustrezajoče spremembe.',
 'uctop' => '(trenutno)',
 'month' => 'Od meseca (in prej):',
@@ -2967,7 +2972,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.',
@@ -3189,7 +3194,7 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
 'svg-long-error' => 'Neveljavna datoteka SVG: $1',
 'show-big-image' => 'Slika v višji ločljivosti',
 'show-big-image-preview' => 'Velikost predogleda: $1.',
-'show-big-image-other' => '{{PLURAL:$2|Druga resolucija|Drugi resoluciji|Druge resolucije}}: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Druga ločljivost|Drugi ločljivosti|Druge ločljivosti}}: $1.',
 'show-big-image-size' => '$1 × $2 točk',
 'file-info-gif-looped' => 'ponavljajoče',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|sličica|sličici|sličice|sličic}}',
@@ -3936,7 +3941,10 @@ Skupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo
 'tags-tag' => 'Ime oznake',
 'tags-display-header' => 'Prikaz na seznamu sprememb',
 'tags-description-header' => 'Polni opis pomena',
+'tags-active-header' => 'Dejavno?',
 'tags-hitcount-header' => 'Etiketirane spremembe',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Ne',
 'tags-edit' => 'uredi',
 'tags-hitcount' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
 
@@ -4012,8 +4020,8 @@ Skupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo
 'logentry-newusers-create2' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun $3',
 'logentry-newusers-byemail' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun $3; geslo je bilo poslano po e-pošti',
 'logentry-newusers-autocreate' => 'Račun $1 je bil samodejno {{GENDER:$2|ustvarjen}}',
-'logentry-rights-rights' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} članstvo skupine $3 z $4 na $5',
-'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} članstvo skupine $3',
+'logentry-rights-rights' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3 z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3',
 'logentry-rights-autopromote' => '$1 je {{GENDER:$2|bil samodejno povišan|bila samodejno povišana|bil(-a) samodejno povišan(-a)}} z $4 na $5',
 'rightsnone' => '(nobeno)',
 
@@ -4102,9 +4110,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 166fe49..0ad5309 100644 (file)
@@ -892,6 +892,7 @@ E-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.',
 'recentchanges' => 'Isbedelada dhow',
 'recentchanges-legend' => 'Dooqyada isbedelada dhow',
 'recentchanges-summary' => 'Dabagal isbedelada dhow ee wikiga ee ku dhacay bogaan.',
+'recentchanges-noresult' => 'Ma jiraan wax is bedel ah xilliga aad soo koobtay ee u dhigma habkaan.',
 'recentchanges-feed-description' => 'Dabagal isbedelada dhow ee wikiga oo ku dhacay feedkaan',
 'recentchanges-label-newpage' => 'Wax bedelkaan wuxuu sameeyay bog cusub',
 'recentchanges-label-minor' => 'Kan waa bedel yar',
index c088025..b36c9c4 100644 (file)
@@ -2676,7 +2676,7 @@ $UNWATCHURL
 'protect-summary-cascade' => 'преносива заштита',
 'protect-expiring' => 'истиче $1 (UTC)',
 'protect-expiring-local' => 'истиче $1',
-'protect-expiry-indefinite' => 'никада',
+'protect-expiry-indefinite' => 'неодÑ\80еÑ\92ено',
 'protect-cascade' => 'Заштити све странице које су укључене у ову (преносива заштита)',
 'protect-cantedit' => 'Не можете мењати степене заштите ове странице јер немате овлашћења за уређивање.',
 'protect-othertime' => 'Друго време:',
@@ -2690,7 +2690,7 @@ $UNWATCHURL
 ** Непродуктивни рат измена
 ** Страница великог промета',
 'protect-edit-reasonlist' => 'Уреди разлоге заштићивања',
-'protect-expiry-options' => '1 сат:1 hour,1 дан:1 day,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,бесконачно:infinite',
+'protect-expiry-options' => '1 сат:1 hour,1 дан:1 day,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,трајно:infinite',
 'restriction-type' => 'Дозвола:',
 'restriction-level' => 'Степен ограничења:',
 'minimum-size' => 'Најмања величина',
@@ -2845,7 +2845,7 @@ $1',
 'ipbenableautoblock' => 'Аутоматски блокирај последњу ИП адресу овог корисника и све даљње адресе с којих покуша да уређује',
 'ipbsubmit' => 'Блокирај овог корисника',
 'ipbother' => 'Друго време:',
-'ipboptions' => '2 сата:2 hours,1 дан:1 day,3 дана:3 days,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,бесконачно:infinite',
+'ipboptions' => '2 сата:2 hours,1 дан:1 day,3 дана:3 days,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,трајно:infinite',
 'ipbotheroption' => 'друго',
 'ipbotherreason' => 'Други/додатни разлог:',
 'ipbhidename' => 'Сакриј корисничко име са измена и спискова',
index c4148a1..f1ea384 100644 (file)
@@ -2530,7 +2530,7 @@ Možete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu
 'protect-summary-cascade' => 'prenosiva zaštita',
 'protect-expiring' => 'ističe $1 (UTC)',
 'protect-expiring-local' => 'ističe $1',
-'protect-expiry-indefinite' => 'nikada',
+'protect-expiry-indefinite' => 'neodređeno',
 'protect-cascade' => 'Zaštiti sve stranice koje su uključene u ovu (prenosiva zaštita)',
 'protect-cantedit' => 'Ne možete menjati stepene zaštite ove stranice jer nemate ovlašćenja za uređivanje.',
 'protect-othertime' => 'Drugo vreme:',
@@ -2544,7 +2544,7 @@ Možete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu
 ** Neproduktivni rat izmena
 ** Stranica velikog prometa',
 'protect-edit-reasonlist' => 'Uredi razloge zaštićivanja',
-'protect-expiry-options' => '1 sat:1 hour,1 dan:1 day,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,beskonačno:infinite',
+'protect-expiry-options' => '1 sat:1 hour,1 dan:1 day,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,trajno:infinite',
 'restriction-type' => 'Dozvola:',
 'restriction-level' => 'Stepen ograničenja:',
 'minimum-size' => 'Najmanja veličina',
@@ -2699,7 +2699,7 @@ Izaberite konkretan razlog ispod (primer: navođenje konkretnih stranica koje su
 'ipbenableautoblock' => 'Automatski blokiraj poslednju IP adresu ovog korisnika i sve daljnje adrese s kojih pokuša da uređuje',
 'ipbsubmit' => 'Blokiraj ovog korisnika',
 'ipbother' => 'Drugo vreme:',
-'ipboptions' => '2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,beskonačno:infinite',
+'ipboptions' => '2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,trajno:infinite',
 'ipbotheroption' => 'drugo',
 'ipbotherreason' => 'Drugi/dodatni razlog:',
 'ipbhidename' => 'Sakrij korisničko ime sa izmena i spiskova',
index 1a0a09a..1ca2f1a 100644 (file)
@@ -784,6 +784,9 @@ Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].
 'userlogin-resetpassword-link' => 'Återställ ditt lösenord',
 'helplogin-url' => 'Help:Logga in',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjälp med inloggning]]',
+'userlogin-loggedin' => 'Du är redan inloggad som {{GENDER:$1|$1}}.
+Använd formuläret nedan för att logga in som en annan användare.',
+'userlogin-createanother' => 'Skapa ett annat konto',
 'createacct-join' => 'Ange din information nedan.',
 'createacct-another-join' => 'Ange information för det nya kontot nedan.',
 'createacct-emailrequired' => 'E-postadress',
@@ -2520,10 +2523,12 @@ Se $2 för noteringar om de senaste raderingarna.',
 'deletecomment' => 'Anledning:',
 'deleteotherreason' => 'Annan/ytterligare anledning:',
 'deletereasonotherlist' => 'Annan anledning',
-'deletereason-dropdown' => '*Vanliga anledningar till radering
-** Författarens begäran
+'deletereason-dropdown' => '* Vanliga anledningar till radering
+** Spam
+** Vandalism
 ** Upphovsrättsbrott
-** Vandalism',
+** Författarens begäran
+** Trasig omdirigering',
 'delete-edit-reasonlist' => 'Redigera anledningar för radering',
 'delete-toobig' => 'Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Borttagning av sådana sidor har begränsats för att förhindra oavsiktliga driftstörningar på {{SITENAME}}.',
 'delete-warning-toobig' => 'Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Att radera sidan kan skapa problem med hanteringen av databasen på {{SITENAME}}; var försiktig.',
@@ -2681,7 +2686,7 @@ $1',
 'contributions' => '{{GENDER:$1|Användarbidrag}}',
 'contributions-title' => 'Bidrag av $1',
 'mycontris' => 'Bidrag',
-'contribsub2' => 'För $1 ($2)',
+'contribsub2' => 'För {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Inga ändringar som motsvarar dessa kriterier hittades.',
 'uctop' => '(senaste)',
 'month' => 'Från månad (och tidigare):',
@@ -3159,6 +3164,7 @@ Vänligen använd förhandsgranskningsknappen innan du sparar.',
 Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
 'tooltip-preferences-save' => 'Spara inställningar',
 'tooltip-summary' => 'Skriv en kort sammanfattning',
+'tooltip-iwiki' => '$1 - $2',
 
 # Stylesheets
 'common.css' => '/* CSS som skrivs här påverkar alla skal */',
@@ -4043,7 +4049,10 @@ Du bör ha fått [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopia av GNU General Publi
 'tags-tag' => 'Märkesnamn',
 'tags-display-header' => 'Utseende på listor över ändringar',
 'tags-description-header' => 'Full beskrivning av betydelse',
+'tags-active-header' => 'Aktiv?',
 'tags-hitcount-header' => 'Märkta ändringar',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nej',
 'tags-edit' => 'redigera',
 'tags-hitcount' => '$1 {{PLURAL:$1|ändring|ändringar}}',
 
index 9365a86..e112f26 100644 (file)
@@ -92,12 +92,12 @@ $messages = array(
 'tog-hidepatrolled' => 'அண்மைய மாற்றங்களில் பலமுறை பார்வையிட்ட தொகுப்புகளை மறைக்கவும்',
 'tog-newpageshidepatrolled' => 'பலமுறை பார்வையிட்ட பக்கங்களைப் புதியபக்கங்களின் பட்டியலில் காட்டவேண்டாம்.',
 'tog-extendwatchlist' => 'அனைத்து பொருத்தமான மாற்றங்களைக் காட்டுமாறு கவனிப்புப் பட்டியலை விரிவாக்கு',
-'tog-usenewrc' => 'அண்மைய மாற்றங்கள் மற்றும் கவனிப்புப் பட்டியல் பக்கத்தில் மாற்றங்களை பக்கத்தை பொறுத்து குழுவாக்கு (ஜாவாஸ்கிரிப்ட் தேவை)',
+'tog-usenewrc' => 'அண்மைய மாற்றங்கள் மற்றும் கவனிப்புப் பட்டியல் பக்கத்தில் மாற்றங்களை பக்கத்தை பொறுத்து குழுவாக்கு',
 'tog-numberheadings' => 'தலைப்புகளுக்கு தானியங்கி இலக்கமிடு',
-'tog-showtoolbar' => 'கருவிப் பட்டையைக் காட்டு (ஜாவாஸ்கிரிப்ட் தேவை)',
-'tog-editondblclick' => 'இரட்டைச் சொடுக்கில் பக்கங்களைத் தொகு (ஜாவாஸ்கிரிப்ட் தேவை)',
+'tog-showtoolbar' => 'கருவிப் பட்டையைக் காட்டு',
+'tog-editondblclick' => 'இரட்டைச் சொடுக்கில் பக்கங்களைத் தொகு',
 'tog-editsection' => '(தொகு) இணைப்புகளின் வழியாக பிரிவுத் தொகுத்தலை செயலாக்கவும்',
-'tog-editsectiononrightclick' => 'பிரிவுத் தலைப்பின் மீது வலச் சொடுக்குவதன் மூலம் பகுதித்  தொகுப்பை செயலாக்கவும் (ஜாவாஸ்கிரிப்ட் தேவை )',
+'tog-editsectiononrightclick' => 'பிரிவுத் தலைப்பின் மீது வலச் சொடுக்குவதன் மூலம் பகுதித்  தொகுப்பை செயலாக்கவும்',
 'tog-showtoc' => 'பொருளடக்க பட்டியலைக் காண்பி (மூன்றுக்கு மேற்பட்ட தலைப்புகளையுடைய கட்டுரைகளுக்கு)',
 'tog-rememberpassword' => 'எனது புகுபதிகை பற்றிய விவரங்களை இவ்வுலாவியில் (மிக அதிகமாக $1 {{PLURAL:$1|நாள்|நாட்கள்}}) வரை நினைவில் வைத்திருக்கவும்.',
 'tog-watchcreations' => 'நான் உருவாக்கும் பக்கங்கள் மற்றும் பதிவேற்றும் கோப்புகளை எனது கவனிப்புப் பட்டியலில் சேர்க்கவும்.',
@@ -115,7 +115,7 @@ $messages = array(
 'tog-shownumberswatching' => 'கவனிக்கும் பயனர்களின் எண்ணிக்கையைக் காட்டவும்',
 'tog-oldsig' => 'நடப்பு கையொப்பம்:',
 'tog-fancysig' => 'வெற்றுக் கையொப்பம் (தானியங்கி இணைப்பின்றி)',
-'tog-uselivepreview' => 'நà¯\87à®°à®\9fி à®®à¯\81னà¯\8dதà¯\8bà®±à¯\8dறதà¯\8dதà¯\88பà¯\8d à®ªà®¯à®©à¯\8dபà®\9fà¯\81தà¯\8dதà¯\81 (à®\9cாவாஸà¯\8dà®\95ிரிபà¯\8dà®\9fà¯\8d à®¤à¯\87வà¯\88) (à®\9aà¯\8bதனà¯\88யிலà¯\81ளà¯\8dளதà¯\81)',
+'tog-uselivepreview' => 'நேரடி முன்தோற்றத்தைப் பயன்படுத்து (சோதனையிலுள்ளது)',
 'tog-forceeditsummary' => 'தொகுப்புச் சுருக்கம் வெற்றாக இருக்கும் போது எனக்கு நினைவூட்டு',
 'tog-watchlisthideown' => 'எனது தொகுப்புக்களைக் கவனிப்புப் பட்டியலிலிருந்து மறை',
 'tog-watchlisthidebots' => 'தானியங்கித் தொகுப்புக்களைக் கவனிப்புப் பட்டியலிலிருந்து மறை',
@@ -128,6 +128,7 @@ $messages = array(
 'tog-showhiddencats' => 'மறைக்கப்பட்ட பகுப்புகளைக் காட்டு',
 'tog-norollbackdiff' => 'முன்பிருந்த நிலைக்குக் கொண்டுவந்தபின் வித்தியாசங்களை விட்டுவிடவும் (காட்டத்தேவையில்லை).',
 'tog-useeditwarning' => 'தொகுத்துக் கொண்டிருக்கும் பக்கத்தை சேமிக்காமல் வெளியேறினால் எனக்கு எச்சரிக்கை செய்',
+'tog-prefershttps' => 'புகுபதிகை செய்யும்போது எப்போதுமே பாதுகாப்பான இணைப்பை பயன்படுத்தவும்',
 
 'underline-always' => 'எப்பொழுதும்',
 'underline-never' => 'எப்போதுமில்லை',
@@ -228,7 +229,7 @@ $messages = array(
 'newwindow' => '(புதிய சாளரத்துள் திறக்கும்)',
 'cancel' => 'சேமிக்காமல் திரும்பு',
 'moredotdotdot' => 'மேலும்...',
-'morenotlisted' => 'à®®à¯\87லதிà®\95மானவà¯\88 à®ªà®\9fà¯\8dà®\9fியலிà®\9fபà¯\8dபà®\9fவிலà¯\8dலà¯\88',
+'morenotlisted' => 'à®\87நà¯\8dத à®ªà®\9fà¯\8dà®\9fியலà¯\8dà®\95லà¯\8d à®®à¯\81à®´à¯\81à®®à¯\88யாà®\95à¯\8dà®\95விலà¯\8dலà¯\88.',
 'mypage' => 'பக்கம்',
 'mytalk' => 'பேச்சு',
 'anontalk' => 'இந்த ஐ.பி. முகவரிக்கான பேச்சு',
@@ -2727,6 +2728,7 @@ $1',
 'tooltip-undo' => '"பின்வாங்கு" என்பது முன்பு செய்த தொகுப்புக்களை இல்லாது செய்கிறது. மேலும் தாங்கள் செய்த தொகுப்பினை முன்தோற்ற நிலைக்கு கொண்டுவந்து காட்டும். அது தங்களுக்குச் சிறுகுறிப்புப் பகுதியில் அதற்கான காரணத்தைக் கூற அனுமதிக்கிறது.',
 'tooltip-preferences-save' => 'விருப்பங்களை சேமி',
 'tooltip-summary' => 'குறுகிய சுருக்கத்தை உள்ளிடவும்.',
+'tooltip-iwiki' => '$1 - $2',
 
 # Metadata
 'notacceptable' => 'உங்களது சேவையாளர் வாசிக்க கூடிய விதத்தில் இந்த விக்கியால தரவுகளை வழங்க முடியாது.',
@@ -3536,6 +3538,8 @@ $5
 'tags-display-header' => 'கவனிப்புப் பட்டியலில் தெரியும் பெயர்',
 'tags-description-header' => 'விரிவான விளக்கம்',
 'tags-hitcount-header' => 'மாற்றங்களின் எண்ணிக்கை',
+'tags-active-yes' => 'ஆம்',
+'tags-active-no' => 'இல்லை',
 'tags-edit' => 'தொகு',
 'tags-hitcount' => '$1 {{PLURAL:$1|மாற்றம்|மாற்றங்கள்}}',
 
index 53f8a71..2f40eb2 100644 (file)
@@ -1450,6 +1450,7 @@ $1",
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|ఒక మార్పు|$1 మార్పులు}}',
+'enhancedrc-history' => 'చరితం',
 'recentchanges' => 'ఇటీవలి మార్పులు',
 'recentchanges-legend' => 'ఇటీవలి మార్పుల ఎంపికలు',
 'recentchanges-summary' => 'వికీలో ఇటీవలే జరిగిన మార్పులను ఈ పేజీలో గమనించవచ్చు.',
index 83bd7d2..c955c06 100644 (file)
@@ -445,7 +445,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}}',
 'aboutpage' => 'Project:เกี่ยวกับ',
-'copyright' => 'เนื้อหาอนุญาตให้เผยแพร่ภายใต้ $1',
+'copyright' => 'เนื้อหาอนุญาตให้เผยแพร่ภายใต้ $1 เว้นแต่ระบุไว้เป็นอย่างอื่น',
 'copyrightpage' => '{{ns:project}}:ลิขสิทธิ์',
 'currentevents' => 'เหตุการณ์ปัจจุบัน',
 'currentevents-url' => 'Project:เหตุการณ์ปัจจุบัน',
@@ -647,6 +647,7 @@ $1',
 'userlogin-resetpassword-link' => 'ตั้งรหัสผ่านใหม่',
 'helplogin-url' => 'Help:การล็อกอิน',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|คำอธิบายเรื่องการล็อกอิน]]',
+'userlogin-createanother' => 'สร้างอีกบัญชี',
 'createacct-join' => 'กรอกสารสนเทศของคุณด้านล่าง',
 'createacct-another-join' => 'กรอกข้อมูลของบัญชีใหม่ด้านล่าง',
 'createacct-emailrequired' => 'ที่อยู่อีเมล',
@@ -1557,8 +1558,8 @@ $1",
 'action-block' => 'บล็อกผู้ใช้รายนี้มิให้แก้ไข',
 'action-protect' => 'เปลี่ยนระดับการล็อกสำหรับหน้านี้',
 'action-rollback' => 'ย้อนการแก้ไขของผู้ใช้ล่าสุดที่แก้ไขหน้าเฉพาะอย่างรวดเร็ว',
-'action-import' => 'à¸\99ำà¹\80à¸\82à¹\89าหà¸\99à¹\89าà¸\99ีà¹\89à¸\88าà¸\81วิà¸\81ิอืà¹\88à¸\99',
-'action-importupload' => 'à¸\99ำà¹\80à¸\82à¹\89าหà¸\99à¹\89าà¸\99ีà¹\89à¸\88าà¸\81à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8c',
+'action-import' => 'นำเข้าหน้าจากวิกิอื่น',
+'action-importupload' => 'นำเข้าหน้าจากการอัปโหลดไฟล์',
 'action-patrol' => 'ทำเครื่องหมายการแก้ไขของผู้ใช้อื่นว่าตรวจสอบแล้ว',
 'action-autopatrol' => 'ทำเครื่องหมายการแก้ไขของคุณว่าตรวจสอบแล้ว',
 'action-unwatchedpages' => 'ดูรายการหน้าที่ไม่มีผู้เฝ้าดู',
index 883d326..8a0f804 100644 (file)
@@ -2550,7 +2550,7 @@ Tingnan ang [[Special:BlockList|talaan ng mga hinadlangan]] upang suriin ang mga
 'anononlyblock' => 'di kilala lamang',
 'noautoblockblock' => 'hindi gumagana ang awtomatikong pagharang',
 'createaccountblock' => 'isinalanta ang paglikha ng kuwenta',
-'emailblock' => 'Hinarang/hinadlangan ang e-liham',
+'emailblock' => 'Hinarang ang e-liham',
 'blocklist-nousertalk' => 'hindi mo mababago ang iyong pansariling pahina ng usapan',
 'ipblocklist-empty' => 'Walang laman ang talaan ng pagharang/paghadlang.',
 'ipblocklist-no-results' => 'Nakaharang ang hiniling na IP address o bansag.',
@@ -2575,7 +2575,7 @@ Tingnan ang [[Special:BlockList|talaan ng pagharang]] para sa lista ng kasalukuy
 'block-log-flags-anononly' => 'mga di-kilalang tagagamit lamang',
 'block-log-flags-nocreate' => 'isinalanta ang paglikha ng kuwenta',
 'block-log-flags-noautoblock' => 'Nakapatay ang awtomatikong pagharang',
-'block-log-flags-noemail' => 'hinadlangan/hinarang ang e-liham',
+'block-log-flags-noemail' => 'hinarang ang e-liham',
 'block-log-flags-nousertalk' => 'hindi mo mababago ang iyong pansariling pahina ng usapan',
 'block-log-flags-angry-autoblock' => 'pinaandar ang pinainam/pinagibayong kusang paghadlang o awtomatikong pagharang',
 'block-log-flags-hiddenname' => 'nakatago ang pangalan ng tagagamit',
@@ -2584,7 +2584,7 @@ Tingnan ang [[Special:BlockList|talaan ng pagharang]] para sa lista ng kasalukuy
 'ipb_expiry_temp' => 'Kinakailangang pamalagian ang mga nakatagong paghadlang ng pangalan ng tagagamit.',
 'ipb_hide_invalid' => 'Hindi maisupil ang kuwentang ito; maaaring may napakaraming pagbabago ito.',
 'ipb_already_blocked' => 'Nakaharang na ang "$1"',
-'ipb-needreblock' => 'Hinarang/hinadlangan na si $1.  Ibig mo bang baguhin ang mga pagtatakda?',
+'ipb-needreblock' => 'Hinarang na si $1.  Nais mo bang baguhin ang mga pagtatakda?',
 'ipb-otherblocks-header' => 'Ibang {{PLURAL:$1|harang|mga harang}}',
 'unblock-hideuser' => 'Hindi mo matatanggal ang paghadlang sa tagagamit na ito, dahil naitago ang kanilang pangalan ng tagagamit.',
 'ipb_cant_unblock' => 'Kamalian: Hindi natagpuan ang ID ng pagharang/paghadlang na $1.  Maaaring natanggal na ang pagkakaharang nito/paghahadlang dito.',
@@ -4008,12 +4008,12 @@ Dapat na nakatanggap ka ng [{{SERVER}}{{SCRIPTPATH}}/COPYING isang sipi ng Pangk
 'rightsnone' => '(wala)',
 
 # Feedback
-'feedback-bugornote' => 'Kung handa ka nang detalyadong maglarawan ng isang suliraning teknikal mangyaring [$1 iulat ang sira].
-O kaya, maaari mong gamitin ang maginhawang pormularyo sa ibaba. Ang iyong pagpuna ay idaragdag sa pahinang "[$3 $2]", kasama ang iyong pangalan na pangtagagamit at kung anong pantingin-tingin ang ginagamit mo.',
+'feedback-bugornote' => 'Kung handa ka nang detalyadong maglarawan ng isang suliraning teknikal mangyaring [$1 iulat ang kamalian].
+O kaya, maaari mo ring gamitin ang pinadaling pormularyo sa ibaba.  Madadagdagan ang komento mo sa pahinang "[$3 $2]", kasama ang iyong pangalan ng tagagamit.',
 'feedback-subject' => 'Paksa:',
 'feedback-message' => 'Mensahe:',
 'feedback-cancel' => 'Huwag ituloy',
-'feedback-submit' => 'Ipasa ang Pakaing-tugon',
+'feedback-submit' => 'Magbigay ng komento',
 'feedback-adding' => 'Idinaragdag ang pakaing-tugon sa pahina...',
 'feedback-error1' => 'Kamalian: Hindi nakikilalang kinalabasan mula sa API',
 'feedback-error2' => 'Kamalian: Nabigo ang pagpatnugot',
index b0ae349..d9accb7 100644 (file)
@@ -359,7 +359,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Son değişikliklerde gözden geçirilen düzenlemeleri gizle',
 'tog-newpageshidepatrolled' => 'Kontrol edilmiş sayfaları yeni sayfalar listesinde gizle',
 'tog-extendwatchlist' => 'İzleme listesini sadece en son değil, tüm değişiklikleri göstermek için genişlet',
-'tog-usenewrc' => 'Son değişiklikler sayfasındaki ve izleme listesindeki değişiklikleri gruplandırma',
+'tog-usenewrc' => 'Son değişiklikler sayfasındaki ve izleme listesindeki değişiklikleri gruplandır',
 'tog-numberheadings' => 'Başlıkları otomatik numaralandır',
 'tog-showtoolbar' => 'Düzenleme yaparken araç çubuğunu göster',
 'tog-editondblclick' => 'Çift tıklayarak sayfaları düzenle',
@@ -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.',
@@ -1673,6 +1673,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'right-editusercssjs' => 'Diğer kullanıcıların CSS ve JS dosyalarında değişiklik yap',
 'right-editusercss' => 'Diğer kullanıcıların CSS dosyalarında değişiklik yap',
 'right-edituserjs' => 'Diğer kullanıcıların JS dosyalarında değişiklik yap',
+'right-editmyoptions' => 'tercihlerini düzenle',
 'right-rollback' => 'Belirli bir sayfayı değiştiren son kullanıcının değişikliklerini hızlıca geri döndür',
 'right-markbotedits' => 'Geri döndürülen değişiklikleri, bot değişiklikleri olarak işaretle',
 'right-noratelimit' => 'Derecelendirme sınırlamalarından etkilenme',
@@ -1734,9 +1735,13 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'action-userrights-interwiki' => 'diğer vikilerde kullanıcıların, kullanıcı haklarını değiştirmeye',
 'action-siteadmin' => 'veritabanını kilitleyip açmaya',
 'action-sendemail' => 'e-posta gönder',
+'action-editmywatchlist' => 'izleme listeni düzenle',
+'action-viewmywatchlist' => 'izleme listeni gör',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|değişiklik|değişiklik}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|son ziyaretten bu yana}}',
+'enhancedrc-history' => 'geçmiş',
 'recentchanges' => 'Son değişiklikler',
 'recentchanges-legend' => 'Son değişiklikler seçenekleri',
 'recentchanges-summary' => 'Yapılan en son değişiklikleri bu sayfadan izleyin.',
@@ -1768,7 +1773,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'rc_categories_any' => 'Herhangi',
 'rc-change-size-new' => '$1 {{PLURAL:$1|bayt|bayt}} değişiklikten sonra',
 'newsectionsummary' => '/* $1 */ yeni başlık',
-'rc-enhanced-expand' => 'Ayrıntıları göster (JavaScript gerekir)',
+'rc-enhanced-expand' => 'Ayrıntıları göster',
 'rc-enhanced-hide' => 'Ayrıntıları gizle',
 'rc-old-title' => 'ilk olarak oluşturulan "$1"',
 
@@ -1788,7 +1793,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'reuploaddesc' => 'Yükleme formuna geri dön.',
 'upload-tryagain' => 'Değiştirilmiş dosya açıklamasını gönder',
 'uploadnologin' => 'Oturum açık değil',
-'uploadnologintext' => 'Dosya yükleyebilmek için [[Special:UserLogin|oturum aç]]manız gerekiyor.',
+'uploadnologintext' => 'Dosya yükleyebilmek için [[$1|oturum aç]]manız gerekiyor.',
 'upload_directory_missing' => 'Yükleme dizini ($1) kayıp ve websunucusu tarafından oluşturulamıyor.',
 'upload_directory_read_only' => 'Dosya yükleme dizinine ($1) web sunucusunun yazma izni yok.',
 'uploaderror' => 'Yükleme hatası',
@@ -2017,6 +2022,9 @@ Kullanıcı tarafından filtrelendiğinde, sadece o kullanıcı dosyanın en son
 'listfiles_size' => 'Boyut (bayt)',
 'listfiles_description' => 'Tanım',
 'listfiles_count' => 'Sürümler',
+'listfiles-latestversion' => 'Geçerli sürüm',
+'listfiles-latestversion-yes' => 'Evet',
+'listfiles-latestversion-no' => 'Hayır',
 
 # File description page
 'file-anchor-link' => 'Dosya',
@@ -2110,6 +2118,7 @@ Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bu
 # Random page in category
 'randomincategory' => 'Kategoriye göre rastgele sayfa',
 'randomincategory-selectcategory' => 'Rastgele sayfa alınacak kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Getir',
 
 # Random redirect
 'randomredirect' => 'Rastgele yönlendirme',
@@ -3942,7 +3951,10 @@ Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansın
 'tags-tag' => 'Etiket adı',
 'tags-display-header' => 'Değişiklik listelerindeki görünüm',
 'tags-description-header' => 'Anlamının tam açıklaması',
+'tags-active-header' => 'Etkin?',
 'tags-hitcount-header' => 'Etiketli değişiklikler',
+'tags-active-yes' => 'Evet',
+'tags-active-no' => 'Hayır',
 'tags-edit' => 'değiştir',
 'tags-hitcount' => '$1 {{PLURAL:$1|değişiklik|değişiklik}}',
 
index c5eb81b..5fd2c79 100644 (file)
@@ -825,6 +825,9 @@ $1',
 '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' => 'Адреса електронної пошти',
@@ -2592,9 +2595,11 @@ $UNWATCHURL
 'deleteotherreason' => 'Інша/додаткова причина:',
 'deletereasonotherlist' => 'Інша причина',
 'deletereason-dropdown' => '* Типові причини вилучення
+** спам
 ** вандалізм
+** порушення авторських прав
 ** за запитом автора
-** Ð¿Ð¾Ñ\80Ñ\83Ñ\88еннÑ\8f Ð°Ð²Ñ\82оÑ\80Ñ\81Ñ\8cкиÑ\85 Ð¿Ñ\80ав',
+** Ð\97ламанÑ\96 Ð¿ÐµÑ\80енапÑ\80авленнÑ\8f',
 'delete-edit-reasonlist' => 'Редагувати причини вилучення',
 'delete-toobig' => 'У цієї сторінки дуже довга історія редагувань, більше $1 {{PLURAL:$1|версії|версій|версій}}.
 Вилучення таких сторінок було заборонене з метою уникнення порушень у роботі сайту {{SITENAME}}.',
@@ -2753,7 +2758,7 @@ $1',
 'contributions' => 'Внесок {{GENDER:$1|користувача|користувачки}}',
 'contributions-title' => 'Внесок користувача $1',
 'mycontris' => 'Внесок',
-'contribsub2' => 'Ð\92неÑ\81ок $1 ($2)',
+'contribsub2' => 'Ð\94лÑ\8f {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Редагувань, що задовольняють заданим умовам не знайдено.',
 'uctop' => '(поточна)',
 'month' => 'До місяця (включно):',
@@ -3225,6 +3230,7 @@ $2',
 'tooltip-undo' => 'Прибрати внесені зміни і показати попередній перегляд. Дозволяє зазначити причину скасування.',
 'tooltip-preferences-save' => 'Зберегти налаштування',
 'tooltip-summary' => 'Введіть короткий опис',
+'tooltip-iwiki' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/** Розміщений тут CSS буде застосовуватися до всіх тем оформлення */',
index 520eed7..f95d7c6 100644 (file)
@@ -780,6 +780,9 @@ Hãy nhớ thay đổi [[Special:Preferences|tùy chọn cá nhân {{SITENAME}}]
 'userlogin-resetpassword-link' => 'Đặt lại mật khẩu của bạn',
 'helplogin-url' => 'Help:Đăng nhập',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Trợ giúp đăng nhập]]',
+'userlogin-loggedin' => 'Bạn đã đăng nhập với tên {{GENDER:$1}}$1.
+Hãy sử dụng biểu mẫu ở dưới để đăng nhập với tài khoản người dùng khác.',
+'userlogin-createanother' => 'Mở thêm tài khoản',
 'createacct-join' => 'Nhập thông tin của bạn bên dưới.',
 'createacct-another-join' => 'Nhập thông tin của tài khoản mới dưới đây.',
 'createacct-emailrequired' => 'Địa chỉ thư điện tử',
@@ -1028,7 +1031,7 @@ Có thể nó đã bị di chuyển hoặc xóa đi trong khi bạn đang xem tr
 'accmailtitle' => 'Đã gửi mật khẩu.',
 'accmailtext' => "Một mật khẩu được tạo ngẫu nhiên cho [[User talk:$1|$1]] đã được gửi đến $2. Có thể đổi mật khẩu tại trang ''[[Special:ChangePassword|đổi mật khẩu]]'' sau khi đã đăng nhập.",
 'newarticle' => '(Mới)',
-'newarticletext' => "Bạn đi đến đây từ một liên kết đến một trang chưa tồn tại. Để tạo trang, hãy bắt đầu gõ vào ô bên dưới (xem [[{{MediaWiki:Helppage}}|trang trợ giúp]] để có thêm thông tin). Nếu bạn đến đây do nhầm lẫn, chỉ cần nhấn vào nút '''Lùi''' (''Back'') trong trình duyệt của bạn.",
+'newarticletext' => '<div style="margin-top: 0px;" class="emptymwmsg mediawiki_newarticletext"></div>',
 'anontalkpagetext' => "----''Đây là trang thảo luận của một người dùng vô danh chưa tạo tài khoản hoặc có tài khoản nhưng không đăng nhập.
 Do đó chúng ta phải dùng một dãy số gọi là địa chỉ IP để xác định anh/chị ta.
 Một địa chỉ IP như vậy có thể có nhiều người cùng dùng chung.
@@ -2671,7 +2674,7 @@ $1',
 'contributions' => '{{GENDER:$1}}Đóng góp của thành viên',
 'contributions-title' => 'Đóng góp của thành viên $1',
 'mycontris' => 'Đóng góp',
-'contribsub2' => 'Của $1 ($2)',
+'contribsub2' => 'Của {{GENDER:$3}}$1 ($2)',
 'nocontribs' => 'Không tìm thấy thay đổi nào khớp với yêu cầu.',
 'uctop' => '(hiện tại)',
 'month' => 'Từ tháng (trở về trước):',
@@ -2727,17 +2730,13 @@ $1',
 'ipbreason' => 'Lý do:',
 'ipbreasonotherlist' => 'Lý do khác',
 'ipbreason-dropdown' => '*Một số lý do cấm thường gặp
-** Phá hoại
 ** Thêm thông tin sai lệch
 ** Xóa nội dung trang
-** Gửi liên kết spam đến trang web bên ngoài
+** Đăng liên kết thư rác đến trang Web bên ngoài
 ** Cho thông tin rác vào trang
 ** Có thái độ dọa dẫm/quấy rối
-** Dùng nhiều tài khoản
-** Tên thành viên không được chấp nhận
-** Tạo nhiều trang mới vi phạm bản quyền, bỏ qua thảo luận và cảnh báo
-** Truyền nhiều hình ảnh thiếu nguồn gốc hoặc bản quyền
-** Con rối của thành viên bị cấm',
+** Lạm dụng nhiều tài khoản
+** Tên thành viên không thể chấp nhận',
 'ipb-hardblock' => 'Ngăn không cho thành viên đã đăng nhập sửa đổi từ địa chỉ IP này',
 'ipbcreateaccount' => 'Cấm mở tài khoản',
 'ipbemailban' => 'Không cho gửi thư điện tử',
@@ -3144,6 +3143,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'tooltip-undo' => '“Lùi lại” sẽ lùi sửa đổi này và mở trang sửa đổi ở chế độ xem trước. Cho phép thêm lý do vào tóm lược.',
 'tooltip-preferences-save' => 'Lưu tùy chọn',
 'tooltip-summary' => 'Hãy nhập câu tóm lược',
+'tooltip-iwiki' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/* Mã CSS đặt ở đây sẽ áp dụng cho mọi hình dạng */',
@@ -4143,7 +4143,10 @@ hoặc [//www.gnu.org/licenses/old-licenses/gpl-2.0.html đọc nó trực tuy
 'tags-tag' => 'Tên thẻ',
 'tags-display-header' => 'Hiển thị trên danh sách thay đổi',
 'tags-description-header' => 'Mô tả ý nghĩa đầy đủ',
+'tags-active-header' => 'Có kích hoạt?',
 'tags-hitcount-header' => 'Các thay đổi được ghi thẻ',
+'tags-active-yes' => 'Kích hoạt',
+'tags-active-no' => 'Vô hiệu',
 'tags-edit' => 'sửa',
 'tags-hitcount' => '$1 {{PLURAL:$1|thay đổi|thay đổi}}',
 
@@ -4235,7 +4238,7 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 'feedback-error1' => 'Hủy bỏ',
 'feedback-error2' => 'Lỗi: Sửa đổi thất bại',
 'feedback-error3' => 'Lỗi: API không có phản ứng',
-'feedback-thanks' => 'Cám ơn! Phản hồi của bạn đã được đăng lên trang “[$2 $1]”.',
+'feedback-thanks' => 'Cm ơn! Phản hồi của bạn đã được đăng lên trang “[$2 $1]”.',
 'feedback-close' => 'Xong',
 'feedback-bugcheck' => 'Tuyệt! Chỉ cần kiểm tra nó chưa được [$1 báo cáo trước đây].',
 'feedback-bugnew' => 'Tôi đã kiểm tra – báo cáo lỗi mới',
index 8cad007..832415e 100644 (file)
@@ -95,8 +95,15 @@ $messages = array(
 'tog-showhiddencats' => 'Fârschdegde ghadegoriin dsajchn',
 
 # Dates
-'sunday' => 'Sundooch',
+'sunday' => 'Sunndooch',
+'monday' => 'Monndooch',
+'tuesday' => 'Dinnsdooch',
+'wednesday' => 'Miidwoch',
+'thursday' => 'Dunnerschdooch',
+'friday' => 'Freidooch',
+'saturday' => 'Samsdooch',
 'sun' => 'Su',
+'thu' => 'Du',
 'january' => 'Januaar',
 'february' => 'Feebruaar',
 'march' => 'Märds',
@@ -144,7 +151,9 @@ $messages = array(
 'category-subcat-count' => 'Di ghadegorii umfasd {{PLURAL:$2|bloos a undâr-ghadegorii|dsam $2 undâr-ghadegoriâ, wofoo {{PLURAL:$1|nôr ôône| $1}}}} undn ôôdsajchd wärn.',
 'category-article-count' => 'Di ghadegorii umfasd {{PLURAL:$2|bloos a sajdn|$2 sajdn, wofoo hiir {{PLURAL:$1|aane undn ôôdsajchd wärd|l$1 ôôdsajchd undn wärn}}}}.',
 'listingcontinuesabbrev' => '(Fôrdsedsung)',
+'noindex-category' => 'Seidn, wou net indexierd sin',
 
+'about' => 'Ieber',
 'newwindow' => '(Wärd in am najn fenschdâ daargschdeld)',
 'cancel' => 'Abbrechn',
 'mytalk' => 'Disghusjoonssajdn',
@@ -173,7 +182,7 @@ $messages = array(
 'vector-view-history' => 'Wärsjoonsfolche',
 'vector-view-view' => 'Leesn',
 'vector-view-viewsource' => 'Gwäl-dhägsd ôôgugn',
-'actions' => 'Aggdsione',
+'actions' => 'Agdsiona',
 'namespaces' => 'Nôômsrajm',
 'variants' => 'Warjandn',
 
@@ -320,6 +329,7 @@ Wen des basiird, dan massdn`s, wemma â dsu alde bearbajdung ôôschaua wil odâ
 
 Wen's des ned is, bisd womeeglich iwa ân feela in dr sofdwäâr gschdolbäd. In dämm Fall melds´däs, bidde mid där URL, am [[Special:ListUsers/sysop|Administrator]].",
 'missingarticle-rev' => '(wärsjoonsnumâr: $1)',
+'badtitle' => 'Ungüldicher Addigl',
 'badtitletext' => "Dii fârlangde sajdn gibd's ned, odâr sii had ân uugildichn sajdnnôôma ghabd, odâr s'wôôr â gschlambdâr fârwajs fonâm andârn wighi häär. Filajchd is aa â buuchschdôôb drin'n, däär in sajdnnôôm gôôr ned schdena däf.",
 'viewsource' => 'Gwäl-dhägsd ôôgugn',
 
@@ -329,11 +339,13 @@ Wen's des ned is, bisd womeeglich iwa ân feela in dr sofdwäâr gschdolbäd. In
 'remembermypassword' => 'Af dem ghombjuudâr schdändich ôôgmäld blajm (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'login' => 'Ôômeldn',
 'nav-login-createaccount' => 'Oomeldn / Ghondoo ooleeng',
+'loginprompt' => 'Zum Omelldn mäin Guggies agdivierd sei.',
 'userlogin' => 'Ôômeldn / Als Bajdräächâr ajschrajm',
 'logout' => 'Abmeldn',
 'userlogout' => 'Abmeldn',
+'nologin' => 'Du hast ka Nutzergonto? $1',
 'nologinlink' => 'Sich als najâr Ôôgmeldâr ôômäldn',
-'gotaccountlink' => 'Ôômeldn',
+'gotaccountlink' => 'Omeldn',
 'mailmypassword' => ' najs passwôrd iwâr iimejl dsuschign lasn',
 'loginlanguagelabel' => 'Sproch: $1',
 
@@ -408,8 +420,8 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'permissionserrorstext-withaction' => 'Du däfsd ned $2, des{{PLURAL:$1||}}dâsweechn:',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''Obachd:''' dii Gräiß vo dii ajbundna Vorlââng is zgrouß, ajniche Vorlââng kenna ned ajbundn wärrn.",
-'post-expand-template-inclusion-category' => 'Sajdn, ba denne vo dii ajbundna Vorlââng dii Gräiß üba da gräißdmöchlichn Gräiß iss',
+'post-expand-template-inclusion-warning' => "'''Wannung''': Däi Gräiss vo eibundne Vuurloong is zu grouss, einiche Vuurloong könna net eibundn werrn.",
+'post-expand-template-inclusion-category' => 'Seidn, in dena wou däi maximale Gräiss vo eibundne Vuurloong ieberschriddn is.',
 
 # History pages
 'viewpagelogs' => 'Logbicher fär dii sajdn dsajchn',
@@ -424,12 +436,14 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 * '''({{int:cur}})''' = undârschiid dsur geechnwärdichn wärsjoon, '''({{int:last}})''' = undârschiid dsur foorichn wärsjoon
 * Uurdsajd/Daadum = wärsjoon dsu dära dsajd, '''{{int:minoreditletter}}''' = glane ändärung.",
 'history-fieldset-title' => 'Suchng in där wärsjoonsfolche',
-'histfirst' => 'Ã\84ldâschde',
-'histlast' => 'Najsde',
+'histfirst' => 'älldsde',
+'histlast' => 'neisde',
 
 # Revision deletion
 'rev-delundel' => 'ôôdsajng/fârbärng',
 'revdel-restore' => 'Ändârn, was oodsajchd wäd',
+'revdel-restore-deleted' => 'glöschde Versiona',
+'revdel-restore-visible' => 'sichdbore Versiona',
 
 # Merge log
 'revertmerge' => 'Dsrig fôr dii fârajnichung',
@@ -450,11 +464,20 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'notextmatches' => 'Närchnds gfundn.',
 'prevn' => '{{PLURAL:$1|foorichâr|fooriche $1}}',
 'nextn' => '{{PLURAL:$1|nägschdâr|nägschde $1}}',
+'prevn-title' => '{{PLURAL:$1|Vuurherichs Ergebnis|Vuurheriche $1 Ergebniss}}',
+'shown-title' => 'Zeich mer $1 {{PLURAL:$1|Ergebnis|Ergebniss}} bro Seidn',
 'viewprevnext' => 'Dsajch ($1 {{int:pipe-separator}} $2) ($3)',
-'searchprofile-articles' => 'Sajdn dii ann Inhald zajng',
-'searchprofile-images' => 'Muldimedjâ',
-'searchprofile-everything' => 'Âlls',
-'searchprofile-advanced' => 'Erwajderd',
+'searchmenu-new' => "'''Derschdell dai Seidn „[[:$1]]“ in diesn Wigi.'''",
+'searchprofile-articles' => 'Inhaldsseidn',
+'searchprofile-project' => 'Hilf- un Brojegdseidn',
+'searchprofile-images' => 'Muldimedia',
+'searchprofile-everything' => 'Alls',
+'searchprofile-advanced' => 'Erweiderd',
+'searchprofile-articles-tooltip' => 'Soung in $1',
+'searchprofile-project-tooltip' => 'Soung in $1',
+'searchprofile-images-tooltip' => 'Nach Daddein soung',
+'searchprofile-everything-tooltip' => 'Gsamdn Inhald durchsoung (aa Disgussionsseidn)',
+'searchprofile-advanced-tooltip' => 'Soung in weidere Namensraim',
 'search-result-size' => '$1 ({{PLURAL:$2|1 wôrd|$2 wärdâr}})',
 'search-result-score' => 'Âjschleechich: $1 %',
 'search-redirect' => '(Wajdalajdung fon „$1“ häa)',
@@ -536,6 +559,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'timezoneregion-pacific' => 'Bhadsiifischâr Oodseaan',
 'allowemail' => 'Iimejl-embfang fon andrâ ôôschdeln',
 'youremail' => 'E-mail:',
+'yourrealname' => 'Bürcherlicher Noma:',
 
 # Groups
 'group-sysop' => 'Adminisdradoorn',
@@ -577,7 +601,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 
 # Recent changes linked
 'recentchangeslinked' => 'Ändärunga af sajdn, af dii fo hiir fârwiisn wäd',
-'recentchangeslinked-toolbox' => 'Ändärunga af sajdn, af dii fo hiir fârwiisn wäd',
+'recentchangeslinked-toolbox' => 'Änderunga an velingde Seidn',
 'recentchangeslinked-title' => 'Ändrunga an sajdn, af dii fo „$1“ aus fârwiisn wärd.',
 'recentchangeslinked-summary' => "Dii sôndârsajdn fiird di ledsdn ändrunga fon sajdn af, dii wo an däär hiir drôôhänga. Alles, was de dâfoo in daj [[Special:Watchlist|beoobachdunglisdn]] aufgnumma hasd, wäd aa no '''fäd''' ôôdsajchd.",
 'recentchangeslinked-page' => 'Sajdn:',
@@ -586,10 +610,13 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 # Upload
 'upload' => 'Nauflôôdn',
 'uploadlogpage' => 'Brodoghol fom dadaj-hoochlôôdn',
+'filedesc' => 'Bschreibung',
 'uploadedimage' => 'had „[[$1]]“ naufglôôdn',
 
+'license' => 'Lizenz',
+
 # File description page
-'file-anchor-link' => 'Dadhaj',
+'file-anchor-link' => 'Daddei',
 'filehist' => 'Wärsjoona bis eds',
 'filehist-help' => 'Glig af ân dsajdbhungd, um dii dôômôôliche fasung ôôdsuschaua',
 'filehist-current' => 'agduäl',
@@ -601,7 +628,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'filehist-filesize' => 'Dadajgräâs',
 'filehist-comment' => 'Sembf dâdsuâ',
 'filehist-missing' => 'Dadaj fääld',
-'imagelinks' => 'Dsajchn, wo dii dadaj als benudsd wärd',
+'imagelinks' => 'Daddeiverwendung',
 'linkstoimage' => 'Dii dadaj wäd fo {{PLURAL:$1|därâ |denâ $1 }} sajdn benudsd:',
 'linkstoimage-more' => "Määr wii {{PLURAL:$1|ane |$1 }} sajdn fârwajsn uf diâ dadaj.
 Dii lisdn undn dsajch dâfâu nôr äärschd môôl {{PLURAL:$1|an|$1}} fârwajs.
@@ -611,10 +638,11 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 'duplicatesoffile' => 'Dii {{PLURAL:$1|folchende dadaj is â dublighaad|folchende $1 dadajâ sn dublighaade}} fon dâr dadaj ([[Special:FileDuplicateSearch/$2|wajdâre ôôndlshajdâ]]):',
 'sharedupload' => 'Dii dadaj ghumd fo $1, un mär däf se fär annäre brojägd aa ´heernemâ.',
 'sharedupload-desc-there' => 'Dii dadaj ghumd fon $1, un mr däf se fir andârâ brojägd aa nemâ. Genauârs schded uf dr [$2 beschrajwungssajdâ fon dr dadaj].',
+'sharedupload-desc-here' => 'Däi Daddei schdamm aus $1 un ko vo andre Brojegde verwendt werrn. Däi Beschreibung vo dera ihr [$2 Daddeibeschreibungsseidn] wärrd undn ozeichd.',
 'uploadnewversion-linktext' => ' naje wärsjoon fo derä dadaj nauflôôdn',
 
 # Random page
-'randompage' => 'Zufälliche Sajdn',
+'randompage' => 'Zoufälliche Seidn',
 
 # Statistics
 'statistics' => 'Schdadisdig',
@@ -647,6 +675,9 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 'allarticles' => 'Ale sajdn',
 'allpagessubmit' => "Loos gäd's.",
 
+# Special:Categories
+'categories' => 'Gadegorien',
+
 # Special:LinkSearch
 'linksearch' => 'Linggs nach ausârhalb',
 
@@ -657,7 +688,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 'emailuser' => 'Dem ôôgmeldn â iimejl schign',
 
 # Watchlist
-'watchlist' => 'Maj beoobachdungs-lisdn',
+'watchlist' => 'Beoobachdungslisdn',
 'mywatchlist' => 'Beoobachdungslisdn',
 'addedwatchtext' => "Di sajdn „[[:$1]]“ schdäd eds mid af dajnâr [[Special:Watchlist|beoobachdungs-lisdn]] .
 
@@ -724,6 +755,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 
 # Undelete
 'undeletelink' => 'ôôgugn/dsrighooln',
+'undeleteviewlink' => 'oschaun',
 
 # Namespace form on various pages
 'namespace' => 'Nôômâraum:',
@@ -735,13 +767,15 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'contributions-title' => 'Bajdrääch fo „$1“',
 'mycontris' => 'Bajdreech',
 'contribsub2' => 'Fär $1 ($2)',
-'uctop' => '(ledsdâr schdand)',
+'uctop' => '(agduell)',
 'month' => 'bis moonad:',
 'year' => 'bis dsum jôôr:',
 
 'sp-contributions-newbies' => 'Bloos bajdrääch fo naj Ôôgmeldâ dsajchn',
 'sp-contributions-blocklog' => 'Schbär-brodoghol',
-'sp-contributions-talk' => 'Disghusjoon',
+'sp-contributions-uploads' => 'Houchglodne Daddein',
+'sp-contributions-logs' => 'Logbäicher',
+'sp-contributions-talk' => 'Disgussion',
 'sp-contributions-search' => 'Bajdreech suchng',
 'sp-contributions-username' => 'IP-adresn odär nôômâ fom Ôôgmeldn:',
 'sp-contributions-submit' => 'Suchng',
@@ -753,7 +787,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'linkshere' => "Dii afgfiirdn sajdn fârwajsn af ''„[[:$1]]“''':",
 'isredirect' => 'Wajdârlajdungssajdn',
 'istemplate' => 'Foorlaachn-ajbindung',
-'isimage' => 'fârwajs af des bild hiir',
+'isimage' => 'Daddeilink',
 'whatlinkshere-prev' => '{{PLURAL:$1|vorhäärichâr|vorhääriche $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|nägschdâr|nägschde $1}}',
 'whatlinkshere-links' => '← fârwajse hiirhäär',
@@ -768,7 +802,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'blockip-title' => 'Bearbajdâr aus-schbärn',
 'blockip-legend' => 'IP-Adresn odr Bearbajdâr aus-schbärn',
 'ipboptions' => '2 schdund:2 hours,1 dooch:1 day,3 dooch:3 days,1 wochng:1 week,2 wochng:2 weeks,1 moonad:1 month,3 moonad:3 months,6 moonad:6 months,1 jôôr:1 year,oone dsajdschrangng:infinite',
-'ipblocklist' => 'Gschbärde IP-adresn un Ôôgmelde',
+'ipblocklist' => 'Gschberrder Nutzer',
 'blocklink' => 'Schbärn',
 'unblocklink' => 'frajgeem',
 'change-blocklink' => 'Schbärn ändârn',
@@ -810,6 +844,10 @@ Schrajb bide den '''naja'' nôômâ fo dâr sajdn undârals '''Dsiil'' nâj un '
 # Export
 'export' => 'Sajdn ägsbhôrdiirn',
 
+# Namespace 8 related
+'allmessagesname' => 'Noma',
+'allmessagesdefault' => 'Schdandaddexd',
+
 # Thumbnails
 'thumbnail-more' => 'Grässär machng',
 
@@ -873,7 +911,7 @@ Bidde gug's mi´m foorschau-gnobf ôô fôrm schbajchan",
 'tooltip-upload' => 'Loos midm nauflaadn',
 'tooltip-rollback' => 'Hiir glign machd mid am môl alâs riggängich, was däär benudsâr dsledschd af där sajdn gmachd had.',
 'tooltip-undo' => 'Hiir glign machd dii aane ändärung riggängich un dsajchd dan ôô, wiis dan ausschaua dääd. Dann koosd aa no â dsamfassung wisoo un warum dâdsuuschrajm.',
-'tooltip-summary' => 'Dibb schnell a glaane Zusammafassung nei.',
+'tooltip-summary' => 'Gib a korze Zammfassung ei.',
 
 # Stylesheets
 'common.css' => '/* CSS hiir beâjflusd ale schelfn */',
@@ -906,7 +944,7 @@ Bloos  dsajln, dii mi´m dsajchn * ôôfanga, wärn berigsichdichd. Un dä ärsc
 'metadata-help' => 'Dii dadaj umfasd annäre ôôgam, dii normaalârwajs fo där digidaal-ghamâraa odär fo am sghänâr häärghumma. Wen dii dadaj indswischn fârändârd wôrn is, meechn dii nimä dsum bild basn.',
 'metadata-expand' => 'Ajdslhajdn dsajchn',
 'metadata-collapse' => 'Ajdslhajdn ausblendn',
-'metadata-fields' => 'Hiir afgfiirde fäldâr fo dâ EXIF-medha-daadn wärn af alle bildbeschrajwungs-sajdn afgfiird, aa wen dii medhadaadn-dabelln ajgfalded is. Annäre sin ärschdâmôôl fârschdegd.
+'metadata-fields' => 'Folgnde Felder vo däi EXIF-Medadaden, däi wou in den MediaWigi-Sysdemdexd ogeem sin, werrn af Bildbeschreibungsseidn miid eiglabbder Medadadndabelln ozeichd. Weidere werrn schdandaddmäßich net ozeichd.
 * make
 * model
 * datetimeoriginal
index d2abf7e..4136315 100644 (file)
@@ -2337,6 +2337,7 @@ Pad luveratiko ninädon yümi lü bevüresodatopäd plödik in blägalised.',
 
 # Info page
 'pageinfo-header-edits' => 'Jenotem redakamas',
+'pageinfo-toolboxlink' => 'Nüns pada',
 'pageinfo-contentpage-yes' => 'Si',
 'pageinfo-protect-cascading-yes' => 'Si',
 
index ec3353a..c9caa3c 100644 (file)
@@ -71,12 +71,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Tago-a in mga gin-patrol o binantayan nga mga pagliwat ha mga dipala naiha nga mga kabag-ohan',
 'tog-newpageshidepatrolled' => 'Tago-a an mga gin-patrol o binantayan nga mga pakli tikang han talaan hin bag-o nga pakli',
 'tog-extendwatchlist' => 'Padako-a an angay timan-an agod makita an tanan nga kabag-ohan, diri la an gibag-ohi',
-'tog-usenewrc' => 'Gamita in mga gin-enhans o gindugngan nga gibag-ohi nga mga kabag-ohan (nakinahanglan hin JavaScript)',
+'tog-usenewrc' => 'Grupo nga mga pagbag-o kada pakli ha kababag-o pala ngan mga barantayon nga talaan',
 'tog-numberheadings' => 'Auto-nga-ihap nga mga pagngaran',
-'tog-showtoolbar' => 'Igpakita an edit toolbar (nakinahanglan hin JavaScript)',
-'tog-editondblclick' => 'Igliwat in mga pakli ha doble nga klik (nakinahanglan hin JavaScript)',
+'tog-showtoolbar' => 'Igpakita an edit toolbar',
+'tog-editondblclick' => 'Igliwat in mga pakli ha doble nga klik',
 'tog-editsection' => 'Tugoti in seksyon nga pagliwat pinaagi hin [igliwat] nga mga sumpay',
-'tog-editsectiononrightclick' => 'Tugoti in pagliwat hin seksyon ha pag klik-ha-tuo dida hin mga ngaran o titulo hin seksyon (nakinahanglan hin JavaScript)',
+'tog-editsectiononrightclick' => 'Tugoti in pagliwat hin seksyon ha pag klik-ha-tuo dida hin mga ngaran o titulo hin seksyon',
 'tog-showtoc' => 'Igpakita in tabla hin sulod (para hin mga pakli nga sobra hin 3 ka titulo o pagngaran)',
 'tog-rememberpassword' => 'Hinumdomi an akon pan-sakob dinhi nga browser (para hin maximum nga $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
 'tog-watchcreations' => 'Igdugang in mga pakli nga akon ginhimo ngan mga paypay nga akon ginkarga ngadto han akon angay timan-an',
@@ -94,7 +94,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Igpakita an ihap han mga nangingita nga mga nagamit',
 'tog-oldsig' => 'Aada nga pirma:',
 'tog-fancysig' => 'Tratuha it pirma komo uska wikitext (nga waray automatiko nga sumpay)',
-'tog-uselivepreview' => 'Gamita an buhi nga pahiuna nga pagawas (nagkikinahanglan hin JavaScript) (eksperimental)',
+'tog-uselivepreview' => 'Gamita an buhi nga pahiuna nga pagawas (eksperimental)',
 'tog-forceeditsummary' => 'Pasabti ako kun waray ko ginsurat ha dalikyat-nga-tigaman han pagliwat (edit summary)',
 'tog-watchlisthideown' => 'Tago-a an akon mga ginliwat tikang han angay timan-an',
 'tog-watchlisthidebots' => 'Tago-a an ginliwat hin bot tikang han angay timan-an',
@@ -107,6 +107,7 @@ $messages = array(
 'tog-showhiddencats' => 'Igpakita an mga tinago nga mga kaarangay',
 'tog-norollbackdiff' => 'Iglat-ang an kaiban kahuman himoa an libot-pabalik',
 'tog-useeditwarning' => 'Pasabti ako kun nabaya ako hin ginliwat ng pakli nga waray katipig an mga pagbag-o',
+'tog-prefershttps' => 'Pirmihi paggamit hin segurado nga koneksyon kun nakalog-in',
 
 'underline-always' => 'Pirme',
 'underline-never' => 'Diri',
@@ -312,7 +313,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' => 'Mahitungod han {{SITENAME}}',
 'aboutpage' => 'Project:Mahitungod han',
-'copyright' => 'In sulod mabiblingan ha ilarom han $1.',
+'copyright' => 'An sulod mabiblingan ha ilarom han $1 antes may-ada pasabot.',
 'copyrightpage' => '{{ns:project}}:Mga kopirayt',
 'currentevents' => 'Mga panhitabo',
 'currentevents-url' => 'Project:Mga panhitabo',
@@ -401,6 +402,9 @@ Listahan o talaan hin puyde nga mga pinaurog nga pakli in mabibilngan ha [[Speci
 
 Ini in indikasyon nga may-ada bug hini nga software.',
 'databaseerror-textcl' => 'Nagkamay-ada hin database query error.',
+'databaseerror-query' => 'Pakiana: $1',
+'databaseerror-function' => 'Function: $1',
+'databaseerror-error' => 'Sayop: $1',
 'laggedslavemode' => 'Pahimatngon: It pakli bangin waray mga kabag-ohan nga bag-o.',
 'readonly' => 'Gintrankahan an database',
 'enterlockreason' => 'Pagbutang hin rason para han pagtrangka, upod hin banabana kon san-o kukuha-on an pagtrangka',
@@ -457,6 +461,8 @@ Para makadugang o makaliwat hin mga paghubad para han tanan nga mga wiki, alayon
 'editinginterface' => "'''Pahimatngon:''' Imo ginliliwat an pakli nga gingagamit paghatag hin interface text para han software.
 An mga pagbag-o hini nga pakli in makakaapekto han user interface han iba nga mga gumaramit hini nga wiki.
 Para makadugang o makabag-o han mga paghubad para han ngatanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an lokalisasyon nga proyekto han MediaWiki.",
+'cascadeprotected' => 'Ini nga pakli in pinapasaliporan hin pagliwat tungod ini in nalalakip ha masunod nga {{PLURAL:$1|pakli, kun diin |mga pakli, kun diin}} pinapasaliporan hit "cascading" nga pagpili nga pinaandar:
+$2',
 'namespaceprotected' => "Diri ka gintutugutan pagliwat han mga pakli ha ngaran-lat'ang nga '''$1'''.",
 'customcssprotected' => 'Diri ka gintutugotan pagliwat hini nga CSS nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
 'customjsprotected' => 'Diri ka gintutugotan pagliwat hini nga JavaScript nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
@@ -523,6 +529,9 @@ Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].'
 'userlogin-resetpassword-link' => 'Ig-reset an imo tigaman-pagsakob',
 'helplogin-url' => 'Help:Pag-log-in',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bulig han pag-log-in]]',
+'userlogin-loggedin' => 'Nakalog-in kana komo hi {{GENDER:$1|$1}}.
+Gamiti an porma ha ubos para makalog-in komo iba nga gumaramit.',
+'userlogin-createanother' => 'Paghimo hin iba nga akawnt',
 'createacct-join' => 'Igbutang an imo impormasyon ha ubos.',
 'createacct-another-join' => 'Igbutang an impormasyon han bag-o nga akwant ha ilarom.',
 'createacct-emailrequired' => 'Email address',
@@ -541,14 +550,21 @@ Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].'
 'createacct-benefit-heading' => '{{SITENAME}} in ginhimo hin tawo nga sugad ha imo.',
 'createacct-benefit-body1' => '{{PLURAL:$1|pagliwat|mga pagliwat}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|ka pakli|ka mga pakli}}',
+'createacct-benefit-body3' => 'bag-o pala nga {{PLURAL:$1|mag-aramot|mga mag-aramot}}',
 'badretype' => 'Diri naangay an mga tigaman-pagsulod nga im ginbutang',
 'userexists' => 'An agnay hiton gumaramit nga im ginbutang in gingamit na.
 Alayon pagpili hin lain nga ngaran.',
 'loginerror' => 'Sayop hin pagsakob',
 'createacct-error' => 'Pakyas an paghimo han akawnt',
 'createaccounterror' => 'Diri makakahimo hin akawnt: $1',
+'nocookiesnew' => 'An akawnt han gumaramit hin nahimo, pero diri ka pa nakalog-in.
+{{SITENAME}} in nagamit hin cookies para makalog-in han mga gumaramit.
+An imo cookies in diri nakaandar.
+Alayon paandara hira, kahuman paglog-in gamit han imo bag-o nga agnay-gumaramit ngan tigaman-pagsakob.',
 'nocookieslogin' => '{{SITENAME}} in nagkikinahanglan hin mga kuki para makapagpalog-in hin mga gumaramit.  An im mga kuki in diri nagana.
 Alayon paganaha hira ngan utro liwat.',
+'nocookiesfornew' => 'An imo akawnt han gumaramit in waray nahimo, kay tungod diri kami nakakakompirma han tinikangan.
+Siguradoha nga an mga cookies in nakaandar, igreload ini nga pakli ngan utroha.',
 'noname' => 'Waray ka nakahatag hin maupay nga agnay-hit-gumaramit.',
 'loginsuccesstitle' => 'Malinamposon an pagsulod',
 'loginsuccess' => "'''Ikaw in nakalog-in ha {{SITENAME}} komo \"\$1\".'''",
@@ -568,6 +584,11 @@ Alayon pagutro pagbutang.',
 'password-login-forbidden' => 'An paggamit hini nga agnay-hit-gumaramit ngan tigaman-pagsulod in diri gintutugotan.',
 'mailmypassword' => 'Ig-e-mail an bag-o nga tigaman-pagsulod',
 'passwordremindertitle' => 'Bag-o nga diri-pirmihan nga tigaman-pagsulod para han {{SITENAME}}',
+'passwordremindertext' => 'May-ada tawo (posible ikaw, tikang ha IP address nga $1) in umaro hin bag-o nga tigaman-pagsakob para han {{SITENAME}} ($4). Uska temporaryo nga tigaman-pagsakob para han gumaramit 
+"$2" in nahimo ngan ginbutang nga "$3". Kun ini an imo panuyuan, kinahanglanon nim maglog-in ngan pumili hin bag-o nga tigaman-pagsakob yana.
+An imo temporaryo nga tigaman-pagsakob in diri madulot kahuman hin {{PLURAL:$5|usa ka adlaw|$5 ka mga adlaw}}.
+
+Kun iba nga tawo an naghimo ini nga paalayon, o kun nakahinumdom ka han imo tigaman-pagsakob, ngan diri mo na karuyag nga igbal-iw ini, pabay-i nala ini nga mensahe ngan padayon paggamit han imo daan nga tigaman-pagsakob.',
 'noemail' => 'Waray e-mail nga adres nga ginrekord para han nágámit "$1".',
 'noemailcreate' => 'Kinahanglan nim maghatag hin may hinungdan nga e-mail address',
 'passwordsent' => 'Uska bag-o nga password in ginpadangat ha e-mail address nga nakarehistro kan "$1".
@@ -575,42 +596,72 @@ Alayon paglog-in utro kahuman mo makarawat ini.',
 'blocked-mailpassword' => 'An imo IP address in ginpugong ha pag-edit, ngan tungod hini in diri gintutugotan paggamit han password recovery function para malikyan an abuso.',
 'eauthentsent' => 'Uska kompirmasyon nga e-mail in ginpadangan ha gin-ngaranan nga e-mail address.
 San-o matagan pa hin iba nga e-mail para ha imo akawnt, kinahanglan mo sundon an mga surundan nga nakasurat ha e-mail, para makompirma nga imo gud ito akawnt.',
+'throttled-mailpassword' => 'Usa nga tigaman-pagnakob reset email in ginpadangat na, ha sakob han urhi nga  {{PLURAL:$1|oras|$1 ka mga oras}}.
+Basi diri ini maabuso, uusa la nga tigaman-panakob in igpapadangat kada {{PLURAL:$1|oras|$1 ka mga oras}}.',
 'mailerror' => 'Sayop han pagpadangat hin surat: $1',
+'acct_creation_throttle_hit' => 'An mga bisita hinin nga wiki nga nagamit hit imo IP address in naghimo hin {{PLURAL:$1|1 nga akawnt|$1 nga mga akawnt}} ha sulod han urhi nga adlaw, kun diin ini an pinakadamo nga gintutugotan para han sulod nga takna.
+
+An resulta, an mga bisita nga nagamit hini nga IP address in diri na makakahimo hin akawnt, ha pagkayana.',
 'emailauthenticated' => 'Ginpamatuod an imo e-mail adres han $2 ha $3.',
+'emailnotauthenticated' => 'An imo email address in diri pa otentikado.
+Waray email nga igpapadangat ha mga masunod nga higamit.',
+'noemailprefs' => 'Igbutang an imo email address ha imo preperensya para umandar ini nga mga higamit.',
 'emailconfirmlink' => 'Igkompirma an imo e-mail address',
+'invalidemailaddress' => 'Diri ginkakarawat an email address kay baga diri asya an format hini.  Alayon pagbutang hin asya nga format nga address o hawani ini.',
+'cannotchangeemail' => 'An akwant email address in diri mababal-iwan hini nga wiki.',
 'emaildisabled' => 'Ini nga sityo in diri nakakapadangat hin mga e-mail.',
 'accountcreated' => 'Nahimo an akawnt',
-'accountcreatedtext' => 'An akwant han gumaramit para kan $1 in ginhimo.',
+'accountcreatedtext' => 'An akwant han gumaramit para kan [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|Hiruhimangraw]]) in nahimo na.',
 'createaccount-title' => 'Paghimo hin akawnt para han {{SITENAME}}',
+'createaccount-text' => 'Mayda tawo nga naghimo hin akawnt nga gingamit an imo email address ha {{SITENAME}} ($4) nga ginngaranan nga "$2", nga may-ada tigaman-panakob nga "$3".
+
+Kinahanglan ka maglog-in ngan igbal-iw an imo tigaman-panakob yana dayon.
+
+Puydi nimo pabay-on ini nga mensahe, kun ini nga paghimo hin akwant in nagsayop la.',
 'usernamehasherror' => 'Agnay-hin-gumaramit in diri puydi magkamay-ada hin mga hash karakter',
+'login-throttled' => 'Damo na an imo login attempts ha pagkayana.
+Alayon paghulat hin $1 san-o ka umutro.',
 'login-abort-generic' => 'An imo paglog-in in diri malinamposon - Naundang',
 'loginlanguagelabel' => 'Pinulongan: $1',
+'suspicious-userlogout' => 'Waray ka tugoti pag-logout tungod nga baga ini ginpadangat hin usa nga broken browser o caching proxy.',
+'createacct-another-realname-tip' => 'Ada la ha imo kun karuyag mo igbutang an imo tinuod nga ngaran.
+Kun pinili mo ito ighatag, gagamiton ini paghatag hin atribusyon ha gumaramit para hit ira buhat.',
 
 # Email sending
 'php-mail-error-unknown' => 'Waray kasabti ha kanan PHP mail() function.',
+'user-mail-no-addy' => 'Nagsend hin email bisan waray email address.',
+'user-mail-no-body' => 'Nagsend hin email bisan waray o diri resonably kahalipot kaduro nga sulod.',
 
 # Change password dialog
 'resetpass' => 'Igliwat an tigaman-pagsulod',
+'resetpass_announce' => 'Nakalog-in ka hit temporaryo nga ginemail nga kodigo.
+Para mahuman paglalog-on, kinahanglan mo magbutang hin bag-o nga tigaman-panakob dinhi:',
 'resetpass_header' => 'Igliwan an akawnt nga tigaman-pagsulod',
 'oldpassword' => 'Daan nga tigaman-pagsulod:',
 'newpassword' => 'Bag-o nga tigaman-pagsulod:',
 'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
 'resetpass_submit' => 'Igbutang an password ngan log in',
-'changepassword-success' => 'Malinamposon nga nasalyuan na an imo tigaman-pagsulod!
-Ikaw in naglalog-in yana...',
+'changepassword-success' => 'Malinamposon an pagbal-iw hit imo tigaman-panakob!',
 'resetpass_forbidden' => 'Diri mababalyoan an mga tigaman-pagsulod',
 'resetpass-no-info' => 'Kinahanglan mo paglog-in para direkta ka makasakob dinhi nga pakli.',
 'resetpass-submit-loggedin' => 'Igbal-iw an tigaman-pagsulod',
 'resetpass-submit-cancel' => 'Pasagdi',
+'resetpass-wrong-oldpass' => 'Diri balido an temporaryo o yana nga tigaman-panakob.
+Imo malinamposon nga ginsalyuan an imo tigaman-panakob o umaro ka na hin bag-o nga temporaryo nga tigman-panakob.',
 'resetpass-temp-password' => 'Temporaryo nga tigaman-pagsakob:',
+'resetpass-abort-generic' => 'Ginpugong an pagbal-iw hin tigaman-panakob hin uska ekstensyon.',
 
 # Special:PasswordReset
 'passwordreset' => 'igreset an tigaman-hit-pagsulod',
+'passwordreset-text-one' => 'Kompletoha ini nga porma paramakareset hin imo tigaman-panakob.',
+'passwordreset-text-many' => '{{PLURAL:$1|Butanga ha usa nga mga surodlan para mareset iton imo tigaman-panakob.}}',
 'passwordreset-legend' => 'igreset an tigaman-hit-pagsulod',
 'passwordreset-disabled' => 'Waray ginpaandar an password reset hini nga wiki.',
+'passwordreset-emaildisabled' => 'Mga mga higamit ha email in waray pinaandar hini nga wiki.',
 'passwordreset-username' => 'Agnay hiton gumaramit:',
 'passwordreset-domain' => 'Dominyo:',
 'passwordreset-capture' => 'Kikitaon mo an resulta nga e-mail?',
+'passwordreset-capture-help' => 'Kun imo igtsek ini nga kahon, an email (lakip an temporaryo nga tigaman-panakob) in igpapakita ha imo labot la han ginpadangat ha gumaramit.',
 'passwordreset-email' => 'E-mail adres:',
 'passwordreset-emailtitle' => 'Mga detalye han akawnt ha {{SITENAME}}',
 'passwordreset-emailelement' => 'Agnay han gumaramit: $1
@@ -632,8 +683,16 @@ Temporaryo nga tigaman han pagsakob: $2',
 'changeemail-cancel' => 'Pasagdi',
 
 # Special:ResetTokens
+'resettokens' => 'Igrest an mga token',
+'resettokens-text' => 'Puydi nimo mareset an mga token para makahatag hin pipira nga pribado nga datos nga may pakahisumpay ha imo akawnt dinhi.
+Kinahanglan mo ini buhaton kun aksidenti nim nasaro hira ha iba nga tawo o an imo akawnt in nakompromiso.',
+'resettokens-no-tokens' => 'Waray token nga marereset.',
+'resettokens-legend' => 'Igreset an mga token',
 'resettokens-tokens' => 'Mga token:',
 'resettokens-token-label' => '$1 (yana nga balor: $2)',
+'resettokens-watchlist-token' => 'Token para han web feed (Atom/RSS) han[[Special:Watchlist|mga pagbag-o ha imo pakli han talaan-barantayon]]',
+'resettokens-done' => 'Narest an mga token.',
+'resettokens-resetbutton' => 'Igreset an pinili nga mga token',
 
 # Edit page toolbar
 'bold_sample' => 'dakmola an agi',
@@ -669,11 +728,38 @@ An imo IP address in maitatala ha kaagi hinin pakli han pagliwat.",
 'missingsummary' => "'''Pahinumdom:''' Waray ka nagbutang hin dalikyat nga sumat han pagliwat.
 Kun pidliton mo an \"{{int:savearticle}}\" utro, an imo ginliwat in matitipig bisan waray hini.",
 'missingcommenttext' => 'Alayon pagbutang hin komento ha ilarom.',
+'missingcommentheader' => "'''Pahinumdom:''' Waray ka humatag hin subject/headline para hini nga komento.  Kun pinduton mo an \"{{int:savearticle}}\" utro, an imo pagliwat in matitipig bisan waray hini.",
 'summary-preview' => 'Pahiuna nga pagawas han dalikyat nga pulong:',
 'subject-preview' => 'Pahiuna nga pagawas hit himangrawon:',
 'blockedtitle' => 'Ginpugngan ini nga gumaramit',
+'blockedtext' => '\'\'\'An imo agnay-gumaramit o IP address in ginpugngan.\'\'\'
+
+An pagpugong in ginhimo ni $1.
+An rason nga ginhatag in \'\'$2\'\'.
+
+* Pagtikang han pagpugong: $8
+* Paghuman han pagpugong: $6
+* Ginpupugngan: $7
+
+Puydi nimo bilngon hi $1 o iba liwat nga [[{{MediaWiki:Grouppage-sysop}}|magdudumara]] para makipaghimangraw hiunong hini nga pagpugong.
+Diri nimo magagamit an "ig-email ini nga gumaramit" nga feature antes may-ada balido nga email address nga nakabutang ha imo  [[Special:Preferences|mga preperensya han akawnt]] ngan waray ka pugngi paggamit hini.
+An imo IP address yana in $3, ngan an imo pagpugong nga ID in #$5.  Alayon la paglakip han ngatanan nga aada ha igbaw nga mga detalye ha bisan ano nga mga pakiana nga karuyag mo buhaton.',
+'autoblockedtext' => 'An imo IP address in automatiko nga ginpugngan mahitungod nga ini in gingamit hin iba nga gumaramit, nga ginpugngan ni $1.
+
+An rason nga ginhatag in \'\'$2\'\'.
+
+* Pagtikang han pagpugong: $8
+* Paghuman han pagpugong: $6
+* Ginpupugngan: $7
+
+Puydi nimo bilngon hi $1 o iba liwat nga [[{{MediaWiki:Grouppage-sysop}}|magdudumara]] para makipaghimangraw hiunong hini nga pagpugong.
+
+Ginpapasabot ka nga diri nimo magagamitan an "ig-email ini nga gumaramit" nga feature antes may-ada nimo balido nga email address nga nakarehistro ha imo  [[Special:Preferences|mga preperensya han gumaramit]] ngan waray ka pugngi hit paggamit hini.
+
+An imo IP address yana in $3, ngan an imo pagpugong nga ID in #$5.  Alayon la paglakip han ngatanan nga aada ha igbaw nga mga detalye ha bisan ano nga mga pakiana nga karuyag mo buhaton.',
 'blockednoreason' => 'waray katadungan nga ginhatag',
 'whitelistedittext' => 'Kinahanglan mo mag-$1 para makaliwat han mga pakli.',
+'confirmedittext' => 'Kinahanglanon mo igkompirma an imo email address san-o ka makaliwat hin mga pakli.  Alayon la pagbutang ngan pagbalidar han imo email address pinaagi han imo  [[Special:Preferences|mga preperensya han gumaramit]].',
 'nosuchsectiontitle' => 'Waray kaagi-i an bahin',
 'nosuchsectiontext' => 'Imo ginliwat an seksyon nga waray dida.
 Ini in puydi binmalhin o napara samtang ikaw in nagkikita han pakli.',
@@ -681,8 +767,14 @@ Ini in puydi binmalhin o napara samtang ikaw in nagkikita han pakli.',
 'loginreqlink' => 'Magpasabot nga masakob',
 'loginreqpagetext' => 'Kinahanglan mo mag-$1 para makakita ha iba nga mga pakli.',
 'accmailtitle' => 'Ginpadara na an tigaman-pagsulod.',
+'accmailtext' => "Uska hinimo nga random nga tigaman-panakob para kan [[User talk:$1|$1]] in ginpadangat ha $2. Puydi ini mabal-iwan ha ''[[Special:ChangePassword|liwani an tigaman-panakob]]'' nga pakli han paglog-in.",
 'newarticle' => '(Bag-o)',
 'newarticletext' => "Ginsunod mo an pakli nga waray pa kahihimo.  Para ighimo an pakli, tikanga pagmakinilya ha kahon nga aada ha ubos (kitaa an [[{{MediaWiki:Helppage}}|nabulig nga pakli]] para han kadugangan nga pananabutan).  Kun sayop an imo pagkanhi, igpidlit an imo kanan panngaykay (''browser'') '''balik''' (''back'') nga piridlitan.",
+'anontalkpagetext' => "----
+''Ini in hiruhimangraw-nga-pakli para han waray magpakilala nga gumaramit, nga waray pa hinmimo hin akawnt.''
+Magamit la kami hin IP address para makilal-an hiya.
+Sugad hini nga IP address, in puydi sinmaro hiton pipira nga mga gumaramit.
+Kun ikaw in waray magpakilala nga gumaramit, ngan pag-abat mo in may mga diri naangay nga komento an ginpapadangat ha imo, alayon nala [[Special:UserLogin/signup|paghimo hin akawnt]] o [[Special:UserLogin|pag-log in]] para malikyan an sumurunod nga mga pagkalipat nga dapat para ha iba nga waray magpakilala nga mga gumaramit.",
 'noarticletext' => 'Waray yana nahasurat hini nga pakli.
 Puyde hi ikaw [[Special:Search/{{PAGENAME}}|magbiling para han ngaran hini nga pakli]] ha iba nga mga pakli,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} binga an mga nanginginlabot nga mga log],
@@ -690,6 +782,10 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} igliwat ini nga pakli]</span>.',
 'noarticletext-nopermission' => 'Waray yana nahasurat hini nga pakli
 Puyde hi ikaw [[Special:Search/{{PAGENAME}}|magbiling han ngaran hini nga pakli]] ha iba nga mga pakli,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mamiling han mga nanginginlabot nga mga talaan]</span>, kundi diri ka gintutugotan hin paghímò hini nga pakli.',
+'missing-revision' => 'Waray na an rebisyon #$1 han pakli nga ginngaranan nga  "{{PAGENAME}}".
+
+Ini in agsob tungod han pagsunod hin daan nga sumpay hin kaagi ha pakli nga ginpara.
+An mga detalye in mabibilngan ha [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
 'userpage-userdoesnotexist' => 'Diri nakarehistro an akawnt han gumaramit nga "$1".
 Alayon pagpamuruotbuot kun karuyag mo maghimo/mag-edit hini nga pakli.',
 'userpage-userdoesnotexist-view' => "An akawnt han gumaramit ni ''$1'' in diri nakarehistro.",
@@ -753,7 +849,8 @@ Ini nga mga argumento in ginlaktawan.",
 
 # "Undo" feature
 'undo-norev' => 'An pagliwat in diri mapapawaray-buhat tungod waray ito dida o napara na.',
-'undo-summary' => 'Igpawaray-buhat an rebisyon nga $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
+'undo-summary' => 'Ginpawara-buhat an rebisyon nga $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|himangrawi]])',
+'undo-summary-username-hidden' => 'Igpawara-an-ginbuhat nga rebisyon $1 han uska tago nga gumaramit',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Diri makakahimo hin akawnt',
@@ -852,13 +949,20 @@ Diri mo ini malalabtan.',
 'lineno' => 'Bagis $1:',
 'compareselectedversions' => 'Igkumpara an mga pinili nga pagbabag-o',
 'editundo' => 'Igpawara an ginbuhat',
+'diff-empty' => '(Waray pagkakaiba)',
 'diff-multi' => '({{PLURAL:$1|Usa nga panbutnga nga pagbag-o|$1 nga panbutnga nga pagbag-o}} ni {{PLURAL:$2|usa nga gumaramit|$2 nga mga gumaramit}} waray ginpakita)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Uska sapit-nahiuna nga rebisyon|$1 nga mga sapit-nanhiuna nga rebisyon}} nga may labaw nga $2 {{PLURAL:$2|gumaramit|mga gumaramit}} in diri ginpapakita)',
 
 # Search results
 'searchresults' => 'Mga nabilingan han pagbiling',
 'searchresults-title' => 'Mga nabilngan han pagbiling para han "$1"',
+'searchresulttext' => 'Para ha kadugangan nga impormasyon bahin han pagbiling hin {{SITENAME}}, kitaa an [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitleinvalid' => "Imo ginpamiling an '''$1'''",
 'toomanymatches' => 'Sobra kadamo nga mga igo an ginbalik, alayon pagbuhat hin iba nga pakiana',
+'titlematches' => 'Parehas an titulo han pakli',
+'notitlematches' => 'Waray titulo nga pakli an parehas',
+'textmatches' => 'Parehas an teksto han pakli',
+'notextmatches' => 'Waray teksto han pakli an parehas',
 'prevn' => 'naha-una nga {{PLURAL:$1|$1}}',
 'nextn' => 'sunod nga {{PLURAL:$1|$1}}',
 'prevn-title' => 'Nahiuna $1 {{PLURAL:$1|resulta|mga resulta}}',
@@ -868,6 +972,7 @@ Diri mo ini malalabtan.',
 'searchmenu-legend' => 'Mga pagpipilian han pamiling',
 'searchmenu-exists' => "'''May-ada pakli nga nakangaran hin \"[[:\$1]]\" hini nga wiki.'''",
 'searchmenu-new' => "'''Himoa an pakli \"[[:\$1]]\" hini nga wiki!'''",
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ig-browse an mga pakli gamit hini nga prefix]]',
 'searchprofile-articles' => 'Mga unod nga pakli',
 'searchprofile-project' => 'Mga Bulig ngan Proyekto nga pakli',
 'searchprofile-images' => 'Multimedia',
@@ -880,6 +985,7 @@ Diri mo ini malalabtan.',
 'searchprofile-advanced-tooltip' => "Pamilnga ha mga nabatasan nga ngaran-lat'ang",
 'search-result-size' => '$1 ({{PLURAL:$2|1 nga pulong|$2 nga mga pulong}})',
 'search-result-category-size' => '{{PLURAL:$1|1 nga api|$1 nga mga api}} ({{PLURAL:$2|1 nga ubos-nga-kaarangay|$2 nga mga ubos-nga-kaarangay}}, {{PLURAL:$3| 1 nga fayl|$3 nga mga fayl}})',
+'search-result-score' => 'Pagkaangay: $1%',
 'search-redirect' => '(redirekta $1)',
 'search-section' => '(bahin $1)',
 'search-suggest' => 'Buot sidngon mo ba: $1',
@@ -887,6 +993,8 @@ Diri mo ini malalabtan.',
 'search-interwiki-default' => '$1 nga resulta:',
 'search-interwiki-more' => '(damo pa)',
 'search-relatedarticle' => 'kasumapy',
+'mwsuggest-disable' => 'Ayaw paandari an mga suhistiyon han pamiling',
+'searcheverything-enable' => "Pamilnga ha ngatanan nga ngaran-lat'ang",
 'searchrelated' => 'kadugtong',
 'searchall' => 'ngatanan',
 'showingresultsheader' => "{{PLURAL:$5|Resulta '''$1''' han '''$3'''|Mga resulta '''$1 - $2''' han '''$3'''}} para ha '''$4'''",
@@ -903,6 +1011,7 @@ Diri mo ini malalabtan.',
 'searchdisabled' => '{{SITENAME}} nga pamiling in ginparong.
 Pamilnga la anay pinaagi ha Google ha pagkayana.
 Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
+'search-error' => 'May-ada sayop nga nahitabo samtang namimiling: $1',
 
 # Preferences page
 'preferences' => 'Mga karuyag',
@@ -913,32 +1022,46 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'prefs-skin' => 'Panit',
 'skin-preview' => 'Pahiuna nga pagawas',
 'datedefault' => 'Waray pinaurog nga karuyag',
+'prefs-beta' => 'Beta nga mga nahihigamitan',
 'prefs-datetime' => 'Pitsa ngan oras',
+'prefs-labs' => 'Mga labs feature',
 'prefs-user-pages' => 'Mga pakli hin gumaramit',
 'prefs-personal' => 'Pangilal-an han nagamit',
 'prefs-rc' => 'Kalalabay la nga mga pagbabag-o',
 'prefs-watchlist' => 'Listahan hit binabantayan',
 'prefs-watchlist-days' => 'Mga adlaw nga makikita ha barantayan:',
 'prefs-watchlist-days-max' => 'Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
+'prefs-watchlist-edits' => 'Gidadamoi nga ihap hin pagliwat it makikit-an ha pinahilawig nga talaan hin barantayon:',
 'prefs-watchlist-edits-max' => 'Pinakadako nga ihap: 1000',
+'prefs-watchlist-token' => 'Token hin talaan hin barantayon:',
+'prefs-misc' => 'Dirudilain',
 'prefs-resetpass' => 'Igliwan an tigaman-pagsulod',
 'prefs-changeemail' => 'Igliwan an e-mail address',
+'prefs-setemail' => 'Igbutang an email address',
 'prefs-email' => 'Mga pagpipilian han e-mail',
 'prefs-rendering' => 'Hitsura',
 'saveprefs' => 'Igtipig',
 'resetprefs' => 'Pabay-i an diri nakatipig nga mga pagbabag-o',
-'restoreprefs' => 'Igbalik ngatanan ngada ha kahimtang nga aada-nga-daan',
+'restoreprefs' => 'Igbalik an ngatanan ngada nga aada-nga-daan nga settings (ha ngatanan nga mga bahin)',
 'prefs-editing' => 'Ginliliwat',
 'rows' => 'Mga rumbay pahigda:',
 'columns' => 'Mga rumbay patindog:',
 'searchresultshead' => 'Bilnga',
 'resultsperpage' => 'Mga igo kada pakli:',
 'stub-threshold-disabled' => 'Waray ginpagana',
+'recentchangesdays' => 'Kadamo hin adlaw nga igpapakita an mga kabag-ohan:',
 'recentchangesdays-max' => 'Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
+'recentchangescount' => 'Ihap han mga pagliwat nga igpapakita nga ginpasingada:',
+'prefs-help-recentchangescount' => 'Ini in naglalakip han mga kabag-ohan nga pagliwat, mga kaagi han pakli, ngan mga talaan.',
+'prefs-help-watchlist-token2' => 'Ini in sekreto nga susi ngadto han web feed an imo talaan han binabantayan.
+Kun hin-o man it maaram hini in puyde bumasa han imo talaan han binabantayan, tungod hini ayaw ini igsaro ha iba.
+[[Special:ResetTokens|Pidlita ini kun kinahanglan mo igreset ini]].',
 'savedprefs' => 'Gintipig an im karuyag.',
 'timezonelegend' => 'Zona hin oras',
 'localtime' => 'Oras nga lokal',
 'timezoneuseserverdefault' => 'Gamita an aada-nga-daan han wiki ($1)',
+'timezoneuseoffset' => 'Iba (igbutang an offset)',
+'timezoneoffset' => 'Offset¹:',
 'servertime' => 'Oras han serbidor:',
 'guesstimezone' => 'Butanga tikang han panngaykay(browser)',
 'timezoneregion-africa' => 'Aprika',
@@ -951,10 +1074,16 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'timezoneregion-europe' => 'Europa',
 'timezoneregion-indian' => 'Kalawdan Indyana',
 'timezoneregion-pacific' => 'Kalawdan Pasipiko',
+'allowemail' => 'Igpaandar an email nga tikang ha iba nga mga gumaramit',
 'prefs-searchoptions' => 'Pamilnga',
 'prefs-namespaces' => "Ngaran-lat'ang",
+'defaultns' => "Kun diri, pamilnga hini nga mga ngaran-lat'ang:",
 'default' => 'aada-nga-daan',
 'prefs-files' => 'Mga paypay',
+'prefs-custom-css' => 'Custom CSS',
+'prefs-custom-js' => 'Custom JavaScript',
+'prefs-common-css-js' => 'Saro nga CSS/JavaScript para han ngatanan nga mga panit:',
+'prefs-reset-intro' => 'Puydi nimo ini gamiton nga pakli para makareset han imo mga preperensya nga ginbutang nga daan han sityo. Diri ini puydi mapawaray-buhat.',
 'prefs-emailconfirm-label' => 'Kompirmasyon han email:',
 'youremail' => 'E-mail:',
 'username' => '{{HENERO:$1|Agnay hit gumaramit}}:',
@@ -966,10 +1095,10 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'yournick' => 'Bag-o nga pirma:',
 'badsiglength' => 'Hilaba hin duro it im pirma.
 Dapat diri malabaw ha $1 {{PLURAL:$1|agi|mga agi}} nga kahilaba.',
-'yourgender' => 'Henero:',
-'gender-unknown' => 'Waray ginpasabot',
-'gender-male' => 'Lalaki',
-'gender-female' => 'Babaye',
+'yourgender' => 'Ano an karuyag mo nga pangilal-an?',
+'gender-unknown' => 'Karuyag ko diri la magyakan',
+'gender-male' => 'Hiya in nag-aayad hin mga wiki nga pakli',
+'gender-female' => 'Hiya in nag-aayad hin mga wiki nga pakli',
 'email' => 'E-mail',
 'prefs-help-realname' => 'Opsyonal an tinuod nga ngaran.
 Kun pilion mo nga ihatag, ini in gagamiton ha paghatag hin atribusyon ha imo mga buhat.',
@@ -982,6 +1111,7 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'prefs-signature' => 'Pirma',
 'prefs-dateformat' => 'Batakan han petsa',
 'prefs-advancedediting' => 'Abansado nga mga pagpipilian',
+'prefs-preview' => 'Pahiuna nga pakita',
 'prefs-advancedrc' => 'Abansado nga mga pagpipilian',
 'prefs-advancedrendering' => 'Abansado nga mga pagpipilian',
 'prefs-advancedsearchoptions' => 'Abansado nga mga pagpipilian',
@@ -989,10 +1119,13 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'prefs-displayrc' => 'Mga pirilion hiunong han ginpapakita',
 'prefs-displaysearchoptions' => 'Mga pirilion hiunong han ginpapakita',
 'prefs-displaywatchlist' => 'Mga pirilion hiunong han ginpapakita',
+'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Mga kaibhan',
+'prefs-help-prefershttps' => 'Ini nga preperensya in madulot ha sunod nimo nga paglog-in.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail address in baga puydi',
+'email-address-validity-invalid' => 'Pagbutang hin balido nga email address',
 
 # User rights
 'userrights' => 'Pagdudumara hin mga katungod han gumaramit',
@@ -1003,6 +1136,7 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'userrights-editusergroup' => 'Igliwat an mga hugpo hin gumaramit',
 'saveusergroups' => 'Igtipig an mga hugpo han gumaramit',
 'userrights-groupsmember' => 'Api han:',
+'userrights-groupsmember-auto' => 'Api nga daan han:',
 'userrights-reason' => 'Katadungan:',
 'userrights-no-interwiki' => '
 Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki.',
@@ -1024,6 +1158,7 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'group-bot-member' => 'bot',
 'group-sysop-member' => 'magdudumara',
 'group-bureaucrat-member' => '{{GENDER:$1|burokrata}}',
+'group-suppress-member' => '{{GENDER:$1|magmarangno}}',
 
 'grouppage-user' => '{{ns:project}}:Mga gumaramit',
 'grouppage-autoconfirmed' => '{{ns:project}}:Mga gumaramit nga naka-awtokompirmado',
@@ -1062,6 +1197,9 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'right-editusercssjs' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS ngan JavaScript',
 'right-editusercss' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS',
 'right-edituserjs' => 'Iliwat an kanan iba mga gumaramit nga paypay han JavaScript',
+'right-viewmywatchlist' => 'Kitaa an imo kalugaringon nga talaan hin barantayon',
+'right-editmywatchlist' => 'Igliwat an imo talaan hin barantayon. Pasabot la nga an pipira ng abuhat in padayon nga madugang hin mga pakli bisan waray hini nga katungod.',
+'right-viewmyprivateinfo' => 'Kitaa an imo kalugaringon nga pribado nga datos (sugad han email address, tinuod nga ngaran)',
 'right-import' => 'Man-aangbit hin mga pakli tikang ha iba nga mga wiki',
 'right-importupload' => 'Man-aangbit hin mga pakli tikang ha uska paypay nga iginkarga-pasaka',
 'right-mergehistory' => 'Igtampo an kaagi han mga pakli',
@@ -1135,7 +1273,7 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'boteditletter' => 'b',
 'rc_categories_any' => 'Bisan ano nga',
 'newsectionsummary' => '/* $1 */ bag-o nga bahin',
-'rc-enhanced-expand' => 'Igpakita an detalye (nagkikinahanglan hin JavaScript)',
+'rc-enhanced-expand' => 'Igpakita an detalye',
 'rc-enhanced-hide' => 'Igtago an mga detalye',
 'rc-old-title' => 'orihinal nga ginhimo komo "$1"',
 
@@ -1218,6 +1356,7 @@ $1',
 
 'upload-proto-error' => 'Sayop nga protocol',
 'upload-file-error' => 'Sayop ha sulod',
+'upload-misc-error' => 'Waray kasasabti nga sayop hin pagkarga-paigbaw',
 'upload-unknown-size' => 'Waray kasabti an kadako',
 'upload-http-error' => 'Mayda nahitabo nga sayop hin HTTP: $1',
 
@@ -1252,6 +1391,7 @@ $1',
 
 # Special:UploadStash
 'uploadstash-errclear' => 'An paghawan han mga paypay in diri malinamposon.',
+'uploadstash-refresh' => 'Igpalab-as utro an talaan hin mga paypay',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Diri gintutugutan makasulod',
@@ -1278,6 +1418,8 @@ $1',
 'listfiles_user' => 'Nagamit',
 'listfiles_size' => 'Kadako',
 'listfiles_count' => 'Mga bersyon',
+'listfiles-latestversion-yes' => 'Oo',
+'listfiles-latestversion-no' => 'Diri',
 
 # File description page
 'file-anchor-link' => 'Paypay',
@@ -1290,6 +1432,7 @@ $1',
 'filehist-datetime' => 'Pitsa/Oras',
 'filehist-thumb' => 'Thumbnail',
 'filehist-thumbtext' => 'Bersyon han thumbnail han $1',
+'filehist-nothumb' => 'Waray thumbnail',
 'filehist-user' => 'Gumaramit',
 'filehist-dimensions' => 'Mga dimensyon',
 'filehist-filesize' => 'Kadako han fayl',
@@ -1298,6 +1441,7 @@ $1',
 'imagelinks' => 'Mga gamit hin paypay',
 'linkstoimage' => 'An nasunod nga {{PLURAL:$1|pakli nasumpay|$1 mga pakli nasumpay}} hini nga paypay:',
 'nolinkstoimage' => 'Waray mga pakli nga nasumpay hini nga fayl.',
+'linkstoimage-redirect' => '$1 (redirecta an paypay) $2',
 'sharedupload' => 'Ini nga fayl tikang han $1 ngan puyde magamit ha iba nga mga proyekto.',
 'sharedupload-desc-there' => 'Ini nga fayl tikang han $1 ngan puyde magamit ha iba nga mga proyekto.
 Alayon pagkita han [$2 nga pakli hin pagpahayag mahitungod hini nga fayl] para hin dugang nga kasayuran.',
@@ -1343,6 +1487,13 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 # Random page
 'randompage' => 'Bisan ano nga pakli',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Pakadto',
+
+# Random redirect
+'randomredirect' => 'Bisan ano la nga redirect',
+'randomredirect-nopages' => 'Waray mga redirecta ha ngaran-lat\'ang nga "$1".',
+
 # Statistics
 'statistics' => 'Mga estadistika',
 'statistics-header-pages' => 'Mga estadistika han pakli',
@@ -1373,6 +1524,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'brokenredirects-delete' => 'paraa',
 
 'withoutinterwiki' => 'Mga pakli nga waray sumpay nga yinaknan',
+'withoutinterwiki-legend' => 'Prefix',
 'withoutinterwiki-submit' => 'Igpakita',
 
 'fewestrevisions' => 'Mga pakli nga may pinakagutiay nga mga rebisyon',
@@ -1380,6 +1532,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|nga byte|nga mga byte}}',
 'ncategories' => '$1 {{PLURAL:$1|nga kaarangay|nga mga kaarangay}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|mga interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|nga sumpay|nga mga sumpay}}',
 'nmembers' => '$1 {{PLURAL:$1|nga api|nga mga api}}',
 'nrevisions' => '$1 {{PLURAL:$1|nga pagliwat|nga mga pagliwat}}',
@@ -1388,7 +1541,11 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'ntransclusions' => 'gingamit ha $1 {{PLURAL:$1|nga pakli|nga mga pakli}}',
 'specialpage-empty' => 'Waray mga resulta para hini nga report.',
 'lonelypages' => 'Mga nahibulag nga mga pakli',
+'lonelypagestext' => 'An masunod nga pakli in diri nakasumpay tikang o nakatranscluderer ngada ha iba nga mga pakli ha {{SITENAME}}.',
 'uncategorizedpages' => 'Mga nagkikinahanglan hin pakli',
+'uncategorizedcategories' => 'Waray kaarangay nga mga kaarangay',
+'uncategorizedimages' => 'Waray kaarangay nga mga paypay',
+'uncategorizedtemplates' => 'Waray kaarangay nga mga batakan',
 'unusedcategories' => 'Waray kagamit nga mga kaarangay',
 'unusedimages' => 'Waray kagamit nga mga fayl',
 'popularpages' => 'Mga sikat nga pakli',
@@ -1484,6 +1641,11 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'activeusers-noresult' => 'Waray gumaramit nga nahiagian.',
 
 # Special:ListGroupRights
+'listgrouprights' => 'Mga katungod han grupo hin gumaramit',
+'listgrouprights-summary' => 'An masunod nga uska talaan hin mga grupo hin gumaramit sumala hinin nga wiki, ngan an ira nahisusumpay nga paggamit nga katungod.  Bangin may-ada [[{{MediaWiki:Listgrouprights-helppage}}|dugang nga impormasyon]] mahiunong han indibiduwal nga mga katungod.',
+'listgrouprights-key' => 'Leyenda:
+* <span class="listgrouprights-granted">Gintagan hin katungod</span>
+* <span class="listgrouprights-revoked">Waray ginhatag an katungod</span>',
 'listgrouprights-group' => 'Hugpo',
 'listgrouprights-rights' => 'Mga katungod',
 'listgrouprights-helppage' => 'Help:Mga katungod han hugpo',
@@ -1499,6 +1661,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 
 # Email user
 'mailnologin' => 'Waray kakadtoan nga address',
+'mailnologintext' => 'Kinahanglan nimo nga [[Special:UserLogin|nakalog-in]] ngan may-ada balido nga email address ha imo[[Special:Preferences|mga preperensya]] para makapadangat hin email ngadto ha iba nga mga gumaramit.',
 'emailuser' => 'Ig-e-mail ini nga gumaramit',
 'emailuser-title-target' => 'Ig-E-mail ini nga {{HENERO:$1|gumaramit}}',
 'emailuser-title-notarget' => 'Gumaramit han e-mail',
@@ -1635,8 +1798,8 @@ $1',
 'contributions' => 'Mga ámot ni {{GENDER:$1|User}}',
 'contributions-title' => 'Mga amot han gumaramit para ha $1',
 'mycontris' => 'Mga ámot nakon',
-'contribsub2' => 'Para ha $1 $2',
-'uctop' => '(bawbaw)',
+'contribsub2' => 'Para {{HENERO:$3|$1}} ($2)',
+'uctop' => '(yana)',
 'month' => 'Tikang ha bulan (ngan uruunhan):',
 'year' => 'Tikang ha tuig (ngan uruunhan):',
 
@@ -1782,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"',
@@ -1917,6 +2080,7 @@ Makikit-an nimo an ginkuhaaan',
 'tooltip-undo' => '"Igpawara an ginbuhat (undo)" in nagbabalik hinin nga pagliwat ngan nabuklad hin pagliwat nga porma ha pahiuna-nga-paggawas nga kahimtang.  Natugot liwat pagdugang hin katadungan ha dinalikyat nga sumat.',
 'tooltip-preferences-save' => 'Tipiga an mga karuyag',
 'tooltip-summary' => 'Pagbutang hin dalikyat nga sumat',
+'tooltip-iwiki' => '$1 – $2',
 
 # Attribution
 'siteuser' => '{{SITENAME}} gumaramit $1',
index f5233ee..b8c6da0 100644 (file)
@@ -21,55 +21,56 @@ $fallback = 'zh-hans';
 $messages = array(
 # User preference toggles
 'tog-underline' => '鏈接下橫線:',
-'tog-justify' => '對齊段落',
-'tog-hideminor' => '此垡改動裏向小變化囥脱',
-'tog-hidepatrolled' => 'æ­¤å\9e¡è®\8aå\8c\96è£\8få\90\91ç\95\80å·¡æ\9f¥é\81\8eå\80\8bæ\94¹å\8b\95å\9b¥è\84«',
-'tog-newpageshidepatrolled' => '新張頁面表裏畀巡查過個頁面囥脫',
-'tog-extendwatchlist' => '關注表裏顯示全部變化,弗止此垡個',
+'tog-justify' => '段對齊',
+'tog-hideminor' => '此垡變化裏囥脫小編',
+'tog-hidepatrolled' => 'æ­¤å\9e¡è®\8aå\8c\96è£\8få\9b¥è\84«å·¡è\84«ç·¨',
+'tog-newpageshidepatrolled' => '新頁表裏囥脫巡脫頁',
+'tog-extendwatchlist' => '擴大關注表,顯示全部變化,弗單清此垡個',
 'tog-usenewrc' => '使用强化版个近段辰光个改动(JavaScript)',
 'tog-numberheadings' => '標題自動編號',
-'tog-showtoolbar' => '顯示編寫å\82¢ä¼\99æ¬\84',
-'tog-editondblclick' => '捺兩記編寫頁面',
-'tog-editsection' => '好用【编寫】鏈接編寫段落',
-'tog-editsectiononrightclick' => '右捺標題編寫段落',
-'tog-showtoc' => '顯示目錄(針對超過三個標題個頁面)',
-'tog-rememberpassword' => '箇個瀏覽器裏畀我個密碼記牢(記$1{{PLURAL:$1|日|日}})',
-'tog-watchcreations' => '拿我创建个页面添加到我个监控列表里向',
-'tog-watchdefault' => '拿我编辑个页面添加到我个监控列表里向',
-'tog-watchmoves' => '拿我移动个页面添加到我个监控列表里向',
-'tog-watchdeletion' => 'ç\95\80æ\88\91å\88 è\84«å\80\8bé \81é\9d¢搭文件加進我個關注表裏',
-'tog-minordefault' => 'é»\98认ç\95\80å\85¨é\83¨ç·¨å¯«é\83½æ¨\99èµ·å°\8f編寫',
-'tog-previewontop' => '編寫框頭前顯示先望',
-'tog-previewonfirst' => '第一垡編寫顯示先望',
-'tog-nocache' => '禁用页面缓存',
-'tog-enotifwatchlistpages' => '我關注表裏個頁面要弗文件有變化到發郵件搭我講',
-'tog-enotifusertalkpages' => '我個用戶討論頁變化到發郵件搭我講',
-'tog-enotifminoredits' => '頁面搭文件小可變化也發郵件搭我講',
-'tog-enotifrevealaddr' => 'é\80\9aç\9f¥é\83µç®±è¡¨è£\8f顯示æ\88\91å\80\8bé\83µç®±地址',
-'tog-shownumberswatching' => '显示關注箇頁個用戶數',
-'tog-oldsig' => '现在签名个预览:',
-'tog-fancysig' => '拿签名当成wiki文本(弗产生自动链接)',
-'tog-uselivepreview' => '使用实时预览(Javascript)(试验)',
-'tog-forceeditsummary' => '編寫摘要空起搭我講',
-'tog-watchlisthideown' => '畀關注表裏我個編寫囥起',
-'tog-watchlisthidebots' => '畀關注表裏機器人個編寫囥起',
-'tog-watchlisthideminor' => '畀關注表裏個小編寫囥起',
-'tog-watchlisthideliu' => '畀關注表裏登錄用戶個編寫囥起',
-'tog-watchlisthideanons' => '畀關注表裏隱姓埋名個用戶個編寫囥起',
-'tog-watchlisthidepatrolled' => '来拉监控列表里拿已巡查过歇个改动囥脱',
-'tog-ccmeonemails' => 'æ\88\91ç\99¼ç\95\80å\85¶ä»\96ç\94¨æ\88¶å\80\8bé\83µä»¶也發份畀我',
-'tog-diffonly' => '比較兩個版本個弗樣朞弗顯示頁面內容',
-'tog-showhiddencats' => '顯示å\9b¥èµ·å\80\8b分類',
+'tog-showtoolbar' => '顯示編傢伙欄',
+'tog-editondblclick' => '捺兩記編',
+'tog-editsection' => '用【編寫】鏈接編段',
+'tog-editsectiononrightclick' => '用右捺標題編段',
+'tog-showtoc' => '顯示目錄(為超過3個標題個頁)',
+'tog-rememberpassword' => '箇流覽器裏記牢我個登錄狀態(記$1{{PLURAL:$1|日|日}})',
+'tog-watchcreations' => '畀我建个页搭我传个文件加进我个关注表里去',
+'tog-watchdefault' => '畀我编个页搭文件加进我个关注表里去',
+'tog-watchmoves' => '畀我移个页搭文件加进我个监控列表里去',
+'tog-watchdeletion' => 'ç\95\80æ\88\91å\88ªè\84«å\80\8bé \81搭文件加進我個關注表裏',
+'tog-minordefault' => 'é»\98èª\8dè¨\98å\85¨é\83¨ç·¨é\83½æ\98¯ç´°å\80\8b',
+'tog-previewontop' => '編寫框頭前顯示先望',
+'tog-previewonfirst' => '垡編寫顯示先望',
+'tog-nocache' => '弗用流览器页面慢存',
+'tog-enotifwatchlistpages' => '我關注表裏個頁要弗文件變脫到用電子信通知我',
+'tog-enotifusertalkpages' => '我用戶討論頁變脫到用電子信通知我',
+'tog-enotifminoredits' => '頁搭文件細編也用電子信通知我',
+'tog-enotifrevealaddr' => 'é\9b»å­\90ä¿¡é\80\9aç\9f¥å\96®è£\8f顯示æ\88\91å\80\8bé\9b»å­\90ä¿¡地址',
+'tog-shownumberswatching' => '顯示關注人數',
+'tog-oldsig' => '能界签名先望:',
+'tog-fancysig' => '畀簽名當wiki文本(弗自動鏈接)',
+'tog-uselivepreview' => '用当场先望(试验)',
+'tog-forceeditsummary' => '編要空白到提醒我',
+'tog-watchlisthideown' => '關注表裏囥脫我所編',
+'tog-watchlisthidebots' => '關注表裏囥脫機器人所編',
+'tog-watchlisthideminor' => '關注表裏囥脫細編',
+'tog-watchlisthideliu' => '關注表裏囥脫已登用戶所編',
+'tog-watchlisthideanons' => '關注表裏囥脫隱姓埋名用戶所編',
+'tog-watchlisthidepatrolled' => '關注表裏囥脫巡脫編',
+'tog-ccmeonemails' => 'æ\88\91ç\99¼ç\95\80å\90\84許ç\94¨æ\88¶ç®\87é\9b»å­\90ä¿¡也發份畀我',
+'tog-diffonly' => '比較兩版弗樣到弗顯示頁內容',
+'tog-showhiddencats' => '顯示å\9b¥è\84«分類',
 'tog-norollbackdiff' => '执行退回之后弗显示两样',
-'tog-useeditwarning' => '改變頁面朆保存朞提醒我',
+'tog-useeditwarning' => '離開編頁朆保存到提醒我',
+'tog-prefershttps' => '登录后老世用保险连接',
 
 'underline-always' => '老世',
 'underline-never' => '老世弗',
-'underline-default' => '皮膚要弗覽器默認',
+'underline-default' => '皮膚要弗覽器默認',
 
 # Font style option in Special:Preferences
 'editfont-style' => '編寫區字體樣式:',
-'editfont-default' => '覽器默認',
+'editfont-default' => '覽器默認',
 'editfont-monospace' => '樣闊字體',
 'editfont-sansserif' => 'Sans-serif字體',
 'editfont-serif' => 'Serif字體',
@@ -125,190 +126,215 @@ $messages = array(
 'oct' => '10月',
 'nov' => '11月',
 'dec' => '12月',
+'january-date' => '1月 $1',
+'february-date' => '2月 $1',
+'march-date' => '3月 $1',
+'april-date' => '4月 $1',
+'may-date' => '5月 $1',
+'june-date' => '6月 $1',
+'july-date' => '7月 $1',
+'august-date' => '8月 $1',
+'september-date' => '9月 $1',
+'october-date' => '10月 $1',
+'november-date' => '11月 $1',
+'december-date' => '12月 $1',
 
 # Categories related messages
-'pagecategories' => '$1個分類',
-'category_header' => 'â\80\9c$1â\80\9då\88\86é¡\9eè£\8få\90\91å\80\8bé \81é\9d¢',
+'pagecategories' => '$1个分类',
+'category_header' => 'â\80\9c$1â\80\9då\88\86é¡\9eè£\8få\80\8bé \81',
 'subcategories' => '兒分類',
-'category-media-header' => '"$1"分類裏向個媒體',
-'category-empty' => "''ç®\87å\80\8bå\88\86é¡\9eè£\8få\90\91é\82\84å\98¸é \81é\9d¢æ\90­åª\92ä½\93。''",
-'hidden-categories' => '$1å\9b¥èµ·分類',
-'hidden-category-category' => 'å\9b¥èµ·分類',
-'category-subcat-count' => '{{PLURAL:$2|此分类仅有下列一只子分类。|此分类包含下列$1只子分类,共计$2只子分类。}}',
-'category-subcat-count-limited' => '迭只分类包含下底$1只子分类。',
-'category-article-count' => '{{PLURAL:$2|迭只分类只有下底一只页面。|迭只分类包含下底$1只页面,共计$2只页面。}}',
-'category-article-count-limited' => 'è¿­å\8fªå\88\86ç±»å\8c\85å\90«ä¸\8båº\95$1å\8fªé¡µé\9d¢。',
-'category-file-count' => '{{PLURAL:$2|ç®\87å\8fªå\88\86ç±»å\8fªæ\9c\89ä¸\8båº\95ä¸\80å\8fªæ\96\87件ã\80\82|ç®\87å\8fªå\88\86ç±»å\8c\85å\90«ä¸\8båº\95$1å\8fªæ\96\87件ï¼\8cå\85±è®¡$2å\8fªæ\96\87件ã\80\82}}',
-'category-file-count-limited' => 'è¿­å\8fªå\88\86ç±»å\8c\85å\90«ä¸\8båº\95$1å\8fª文件。',
-'listingcontinuesabbrev' => '',
+'category-media-header' => '"$1"分类里个媒体',
+'category-empty' => "''ç®\87å\88\86ç±»é\87\8c页æ\90­åª\92ä½\93è\83½ç\95\8cè¿\98å\91\92æ\9c\89。''",
+'hidden-categories' => '$1å\9b¥è\84«分類',
+'hidden-category-category' => 'å\9b¥è\84«分類',
+'category-subcat-count' => '{{PLURAL:$2|箇分類便只接落去許兒分類。|箇分類有$1個兒分類,攏共$2個兒分類。}}',
+'category-subcat-count-limited' => '箇分類有下向許$1個兒分類。',
+'category-article-count' => '{{PLURAL:$2|箇分類便只下向許頁。|箇分類裏有下底$1許頁,攏共$2張。}}',
+'category-article-count-limited' => 'è\83½ç\95\8cå\80\8bå\88\86é¡\9eè£\8fæ\9c\89ä¸\8båº\95$1é \81。',
+'category-file-count' => '{{PLURAL:$2|ç®\87å\88\86类便å\8fªä¸\8b头个æ\96\87件ã\80\82|ç®\87å\88\86ç±»é\87\8cæ\9c\89ä¸\8b头$1个æ\96\87件ï¼\8cå\85±$2个æ\96\87件ã\80\82}}',
+'category-file-count-limited' => 'è\83½ç\95\8cå\80\8bå\88\86é¡\9eè£\8fæ\9c\89ä¸\8båº\95$1å\80\8b文件。',
+'listingcontinuesabbrev' => '接落。',
 'index-category' => '索引拉许个页面',
-'noindex-category' => '弗曾索引拉许个页面',
+'noindex-category' => '朆索引个页',
+'broken-file-category' => '有无用文件链接个页',
 
-'about' => '关于',
-'article' => 'å\86\85容页é\9d¢',
-'newwindow' => '(垃拉新窗口里向开开来)',
+'about' => '有关',
+'article' => 'å\85§å®¹é \81',
+'newwindow' => '(用新窗口开)',
 'cancel' => '取消',
-'moredotdotdot' => '还有...',
-'morenotlisted' => 'ç®\87张表è¿\98æ\9c\86å®\8cæ\88\90',
+'moredotdotdot' => '還多...',
+'morenotlisted' => 'ç®\87張表é\82\84æ\9c\86å®\8cæ\88\90ã\80\82',
 'mypage' => '我个页面',
 'mytalk' => '我个讨论',
-'anontalk' => '箇只IP个言论',
-'navigation' => '导航',
-'and' => '&#32;搭',
+'anontalk' => '箇IP地址個話',
+'navigation' => 'å°\8e航',
+'and' => '&#32;搭',
 
 # Cologne Blue skin
-'qbfind' => '寻',
-'qbbrowse' => 'æµ\8fè§\88',
-'qbedit' => 'ç¼\96è¾\91',
-'qbpageoptions' => '迭只页面',
-'qbmyoptions' => '我个选项',
-'qbspecialpages' => 'ç\89¹æ®\8a页é\9d¢',
-'faq' => 'FAQs',
+'qbfind' => 'å°\8b',
+'qbbrowse' => 'æµ\81覽',
+'qbedit' => 'ç·¨',
+'qbpageoptions' => '箇頁',
+'qbmyoptions' => '我',
+'qbspecialpages' => 'ç\89¹æ®\8aé \81',
+'faq' => 'FAQ',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-addsection' => '加入话题',
-'vector-action-delete' => 'å\88 é\99¤',
-'vector-action-move' => '移',
-'vector-action-protect' => '保',
-'vector-action-undelete' => 'å\8f\8då\88 é\99¤',
-'vector-action-unprotect' => '反保护',
-'vector-simplesearch-preference' => '打开高级搜索建议(仅适用于Vector皮肤)',
-'vector-view-create' => 'å\88\9b建',
-'vector-view-edit' => '编',
-'vector-view-history' => '望史',
-'vector-view-view' => '读',
-'vector-view-viewsource' => 'æ\9f¥ç\9c\8b源码',
+'vector-action-addsection' => '加話題',
+'vector-action-delete' => 'å\88ª',
+'vector-action-move' => '移',
+'vector-action-protect' => '保',
+'vector-action-undelete' => 'å¼\97å\88ª',
+'vector-action-unprotect' => '换保护状态',
+'vector-simplesearch-preference' => '用简单搜寻条(只Vector皮肤好用)',
+'vector-view-create' => '建',
+'vector-view-edit' => '编',
+'vector-view-history' => '望史',
+'vector-view-view' => '读',
+'vector-view-viewsource' => 'æ\9c\9b源码',
 'actions' => '动作',
 'namespaces' => '名字空间',
 'variants' => '变量',
 
-'errorpagetitle' => 'é\94\99误',
-'returnto' => '转到$1。',
-'tagline' => '来自{{SITENAME}}',
-'help' => '帮å\8a©',
-'search' => '寻',
+'errorpagetitle' => 'é\8c¯èª¤',
+'returnto' => '转到$1。',
+'tagline' => '从{{SITENAME}}来',
+'help' => '幫å¿\99',
+'search' => '寻',
 'searchbutton' => '搜寻',
-'go' => '',
-'searcharticle' => '',
-'history' => '页é\9d¢æ¡£æ¡\88',
+'go' => '',
+'searcharticle' => '',
+'history' => 'é \81å\8f²',
 'history_short' => '历史',
-'updatedmarker' => '上趟访问以来个更新',
+'updatedmarker' => '從上趟訪問起個更新',
 'printableversion' => '打印版',
-'permalink' => '永久链接',
+'permalink' => '老世链接',
 'print' => '打印',
-'edit' => '编辑',
-'create' => '创建',
-'editthispage' => '编辑此页',
-'create-this-page' => '创建箇只页面',
-'delete' => '删除',
-'deletethispage' => '删除此页',
-'undelete_short' => '恢复拨删脱个$1项修订',
-'protect' => '保护',
-'protect_change' => '改动',
-'protectthispage' => '保护此页',
-'unprotect' => '改变保护状态',
-'unprotectthispage' => '改变箇页保护',
-'newpage' => '新页面',
-'talkpage' => '讨论箇只页面',
-'talkpagelinktext' => '讨论',
-'specialpage' => '特殊页',
-'personaltools' => '个人工具',
-'postcomment' => '新段落',
-'articlepage' => '查看内容页面',
-'talk' => '讨论',
-'views' => '查看',
-'toolbox' => '家生',
-'userpage' => '查看用户页面',
-'projectpage' => '查看计划页面',
-'imagepage' => '望文件页',
-'mediawikipage' => '望讯息页',
-'templatepage' => '望模板页',
-'viewhelppage' => '望帮助页',
-'categorypage' => '望分类页',
-'viewtalkpage' => '望讨论页',
-'otherlanguages' => '别样闲话版本',
-'redirectedfrom' => '($1重定向来个)',
-'redirectpagesub' => '重定向页',
-'lastmodifiedat' => '箇只页面最近修订垃拉$1 $2。',
-'viewcount' => '迭只页面已经拨浏览过$1趟。',
-'protectedpage' => '保护拉许个页面',
-'jumpto' => '跳转到:',
+'view' => '望',
+'edit' => '编',
+'create' => '建',
+'editthispage' => '編箇頁',
+'create-this-page' => '建箇頁',
+'delete' => '刪',
+'deletethispage' => '刪箇頁',
+'undeletethispage' => '弗删箇页',
+'undelete_short' => '復原消脫個$1個編寫',
+'viewdeleted_short' => '望̺$1个删脱编写',
+'protect' => '保',
+'protect_change' => '改',
+'protectthispage' => '保箇頁',
+'unprotect' => '變更保態',
+'unprotectthispage' => '變更箇頁保態',
+'newpage' => '新页',
+'talkpage' => '探討箇頁',
+'talkpagelinktext' => '討論',
+'specialpage' => '特別頁',
+'personaltools' => '私人家伙',
+'postcomment' => '新段',
+'articlepage' => '望內容頁',
+'talk' => '探讨',
+'views' => '望',
+'toolbox' => '家伙匣',
+'userpage' => '望用戶頁',
+'projectpage' => '望計劃頁',
+'imagepage' => '望文件頁',
+'mediawikipage' => '望信息頁',
+'templatepage' => '望模板頁',
+'viewhelppage' => '望幫忙頁',
+'categorypage' => '望分類頁',
+'viewtalkpage' => '望探討頁',
+'otherlanguages' => '别样话版',
+'redirectedfrom' => '(从$1转戳到箇里)',
+'redirectpagesub' => '轉戳頁',
+'lastmodifiedat' => '箇页此垡来$1 $2改进。',
+'viewcount' => '箇頁望過$1垡。',
+'protectedpage' => '受保頁',
+'jumpto' => '蹦到:',
 'jumptonavigation' => '导航',
 'jumptosearch' => '搜寻',
-'view-pool-error' => '弗好意思,服务器现在过载,请等歇再访问。
+'view-pool-error' => '對弗住,服務器能界超載。
+望箇頁個人忒多哉。
+相勞爾等瑲起再試試相趒箇頁來。
 
 $1',
+'pool-timeout' => '等锁过时',
+'pool-queuefull' => '池队列满哉',
+'pool-errorunknown' => '弗识个错误',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => '关于{{SITENAME}}',
-'aboutpage' => 'Project:关于',
+'aboutsite' => '有关{{SITENAME}}',
+'aboutpage' => 'Project:有关',
 'copyright' => '内容侪拉$1下底发布。',
 'copyrightpage' => '{{ns:project}}:版权',
-'currentevents' => '近段辰光个事体',
-'currentevents-url' => 'Project:近段辰光个事体',
-'disclaimers' => '免责声明',
-'disclaimerpage' => 'Project:免责声明',
-'edithelp' => '编帮助',
+'currentevents' => '箇阶段个事干',
+'currentevents-url' => 'Project:箇阶段个事干',
+'disclaimers' => '甮追問',
+'disclaimerpage' => 'Project:甮追問',
+'edithelp' => '编帮助',
 'helppage' => 'Help:目录',
 'mainpage' => '封面',
 'mainpage-description' => '封面',
-'policy-url' => 'Project:政策',
-'portal' => '社区门荡',
-'portal-url' => 'Project:社区门荡',
-'privacy' => 'é\9a\90ç§\81æ\94¿ç­\96',
-'privacypage' => 'Project:é\9a\90ç§\81æ\94¿ç­\96',
+'policy-url' => 'Project:策略',
+'portal' => '社区台门',
+'portal-url' => 'Project:社区台门',
+'privacy' => 'é\9a±ç§\81ç­\96ç\95¥',
+'privacypage' => 'Project:é\9a±ç§\81ç­\96ç\95¥',
 
 'badaccess' => '权限',
-'badaccess-group0' => '箇只操作是弗允许个。',
-'badaccess-groups' => '侬刚刚只请求只有{{PLURAL:$2|迭只}}用户组个用户再好使用:$1',
+'badaccess-group0' => '弗準爾做箇操作。',
+'badaccess-groups' => '爾個請求要徠{{PLURAL:$2|箇個}}用戶組裏好用:$1。',
 
-'versionrequired' => '需要$1版本个MediaWiki',
-'versionrequiredtext' => '要$1版本个MediaWiki再好使用此页。参见[[Special:Version|版本页]]。',
+'versionrequired' => '需要$1版MediaWiki',
+'versionrequiredtext' => '用箇页需要$1版个MediaWiki。望[[Special:Version|版本页]]。',
 
-'ok' => '确认',
+'ok' => '',
 'retrievedfrom' => '取自“$1”',
-'youhavenewmessages' => '侬有$1($2)。',
-'newmessageslink' => '新讯息',
-'newmessagesdifflink' => '上趟更改',
-'youhavenewmessagesmulti' => '侬垃拉$1有新讯息',
-'editsection' => '编辑',
-'editold' => '编辑',
-'viewsourceold' => '查看源码',
-'editlink' => '编辑',
-'viewsourcelink' => '查看源码',
-'editsectionhint' => '编辑段落: $1',
+'youhavenewmessages' => '你侬有$1($2)。',
+'newmessageslink' => '新消息',
+'newmessagesdifflink' => '此垡更改',
+'newmessageslinkplural' => '{{PLURAL:$1|新消息}}',
+'newmessagesdifflinkplural' => '此垡̺{{PLURAL:$1|变化}}',
+'youhavenewmessagesmulti' => '爾徠$1裏有新信息',
+'editsection' => '編',
+'editold' => '编',
+'viewsourceold' => '望源碼',
+'editlink' => '编',
+'viewsourcelink' => '望源碼',
+'editsectionhint' => '编段: $1',
 'toc' => '目录',
-'showtoc' => '示',
-'hidetoc' => 'å\9b¥è\84±',
-'thisisdeleted' => 'æ\9f¥ç\9c\8bæ\88\96è\80\85æ\81¢å¤\8d$1?',
-'viewdeleted' => '望望$1看?',
-'restorelink' => '$1å\8fªå\88 è\84±ä¸ª版本',
-'feedlinks' => '订é\98\85:',
-'feed-invalid' => '订é\98\85ç±»å\9e\8bæ\97 效。',
-'feed-unavailable' => '暂时弗支持联合订阅',
-'site-rss-feed' => '$1个RSS订阅',
+'showtoc' => '示',
+'hidetoc' => 'å\9b¥è\84«',
+'thisisdeleted' => 'æ\9c\9bè¦\81å¼\97復å\8e\9f$1?',
+'viewdeleted' => '$1望望相?',
+'restorelink' => '$1å\80\8bå\88ªè\84«å\80\8b版本',
+'feedlinks' => 'è¨\82é\96±:',
+'feed-invalid' => 'è¨\82é\96±é¡\9eå\9e\8bç\84¡效。',
+'feed-unavailable' => '目前弗支持聯訂',
+'site-rss-feed' => '$1個RSS訂閱',
 'site-atom-feed' => '$1个Atom订阅',
-'page-rss-feed' => '“$1”个RSS订阅',
-'page-atom-feed' => '"$1" 个Atom feed',
-'red-link-title' => '$1 (还弗曾撰写)',
+'page-rss-feed' => '“$1”個RSS訂閱',
+'page-atom-feed' => '"$1" 个Atom订阅',
+'red-link-title' => '$1 (呒有箇页)',
+'sort-descending' => '倒排',
+'sort-ascending' => '顺排',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => '文章',
-'nstab-user' => '用户页',
-'nstab-media' => '媒体页面',
-'nstab-special' => '特殊页面',
-'nstab-project' => '项ç\9b®é¡µé\9d¢',
+'nstab-main' => '',
+'nstab-user' => '用户页',
+'nstab-media' => '媒體頁',
+'nstab-special' => '特別页',
+'nstab-project' => 'é \85ç\9b®é \81',
 'nstab-image' => '文件',
-'nstab-mediawiki' => '息',
+'nstab-mediawiki' => '息',
 'nstab-template' => '模板',
-'nstab-help' => '帮å\8a©é¡µé\9d¢',
+'nstab-help' => '幫å¿\99é \81',
 'nstab-category' => '分类',
 
 # Main script and global functions
-'nosuchaction' => '无没箇能介个操作',
-'nosuchactiontext' => 'URL指定个命令无效。侬作兴拿URL输错脱哉,要嚜点击仔错误个链接。箇只错误亦有可能是由{{SITENAME}}所使用软件自家个错误导致个。',
-'nosuchspecialpage' => 'å\91\92没ç®\87å\8fªç\89¹æ®\8a页é\9d¢',
+'nosuchaction' => '嘸能操作',
+'nosuchactiontext' => 'URL指定個命令無效。爾嘸數畀URL打錯哉,要勿点击仔出錯個鏈接。也嘸數{{SITENAME}}用個軟件本身出錯緣故。',
+'nosuchspecialpage' => 'å\98¸è\83½å\80\8bç\89¹å\88¥é \81',
 'nospecialpagetext' => '<strong>侬请求个特殊页面无效。</strong>
 
 参考特殊页面列表[[Special:SpecialPages| {{int:specialpages}}]]。',
@@ -316,23 +342,24 @@ $1',
 # General errors
 'error' => '错误',
 'databaseerror' => '数据库错误',
-'databaseerror-text' => '一個數據庫討信發生
-嘸數說明一個bug徠軟件裏向。',
-'databaseerror-textcl' => '一個數據庫討信賺爻發生。',
+'databaseerror-text' => '數據庫討信出錯
+嘸數說明軟件裏有一個bug。',
+'databaseerror-textcl' => '數據庫討信出錯。',
 'databaseerror-query' => '討信:$1',
-'databaseerror-error' => '賺爻:$1',
+'databaseerror-function' => '功能ː $1',
+'databaseerror-error' => '出錯:$1',
 'laggedslavemode' => '警告: 页面可能弗包含最近个更新。',
-'readonly' => 'æ\95°æ\8d®åº\93é\94\81å®\9a',
+'readonly' => 'æ\95¸æ\93\9a庫é\8e\96ç\89¢',
 'enterlockreason' => '请输入锁定个原因,包括预计解锁个辰光',
 'readonlytext' => '数据库目前禁止输入新内容及更改,
 箇蛮有可能是因为数据库拉许维修,完成仔即可恢复。
 
 管理员有如下解释:$1',
-'missing-article' => '数据库寻弗着预期个页面文字:“$1”$2。
+'missing-article' => '数据库寻弗着想寻个页面文本:名字“$1”$2。
 
-ç®\87ä¸\80è\88¬æ\80§æ\98¯ç\94±äº\8eç\82¹å\87»äº\86é\93¾å\90\91æ\97§æ\9c\89å·®å¼\82æ\88\96å\8e\86å\8f²ä¸ªé\93¾æ\8e¥ï¼\8cè\80\8cå\8e\9fæ\9c\89修订已æ\8b¨å\88 é\99¤å¯¼è\87´ä¸ªã\80\82
+箇一般是由于点击了链向旧有差异或历史个链接,而原有修订已拨删除导致个。
 
-如果情况弗是箇能介,侬作兴寻着仔软件个一只内部错误。请拿URL地址记录下来,并向[[Special:ListUsers/sysop|管理员]]报告。',
+如果弗是箇种情况,你侬作兴寻着软件里一个错误。畀URL地址记落来,搭[[Special:ListUsers/sysop|管理员]]报告。',
 'missingarticle-rev' => '(修订#:$1)',
 'missingarticle-diff' => '(两样:$1、$2)',
 'readonly_lag' => '从数据库服务器垃拉从主服务器上更新,数据库已经拨自动锁定',
@@ -351,26 +378,41 @@ $1',
 'badarticleerror' => '呒处垃拉箇只页面进行箇只操作。',
 'cannotdelete' => '无处删除页面或图像 "$1"。
 渠作兴已经拨别人家删除脱哉。',
-'badtitle' => '该只标题弗来三',
+'cannotdelete-title' => '"$1"箇页删弗爻',
+'no-null-revision' => '"$1"页呒处建新个修改',
+'badtitle' => '坏标题',
 'badtitletext' => '所请求页面个标题是无效个、弗存在,跨语言或跨wiki链接个标题错误。渠作兴包含一只或多只弗好用拉标题里向字符。',
-'perfcached' => 'ä¸\8båº\95æ\98¯ç¼\93å­\98æ\95°æ\8d®ï¼\8cç®\87å\92¾ä½\9cå\85´å¼\97æ\98¯é¡¶æ\96°ä¸ª. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcached' => 'ä¸\8bå\90\91æ\98¯ç¼\93å­\98æ\95°æ\8d®ï¼\8cå\91\92æ\95°å¼\97æ\98¯æ\9c\80æ\96°ä¸ªã\80\82 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
 'perfcachedts' => '下头是缓存数据,压末一趟更新辰光是$1。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
 'querypage-no-updates' => '当前禁止对此页面进行更新。箇搭个数据弗好立即刷新。',
 'wrong_wfQuery_params' => '错误个参数拨传递到 wfQuery()<br />
 函数:$1<br />
 查询:$2',
-'viewsource' => '源码',
+'viewsource' => 'æ\9c\9bæº\90ç \81',
 'actionthrottled' => '动作已压制',
 'actionthrottledtext' => '基于反垃圾链接个考量,限制垃拉短时间内多趟重复箇只操作。请过脱几分钟再试试看。',
-'protectedpagetext' => '箇只页面已经锁定,以防编辑。',
+'protectedpagetext' => '箇页锁牢定,防编搭各许操作。',
 'viewsourcetext' => '侬可以查看搭仔复制箇只页面个源码:',
-'protectedinterface' => '箇只页面提供软件个界面文本。为著防止滥用咾已经锁定。',
-'editinginterface' => "'''警告:''' 侬垃许编辑个页面是用于提供软件个界面文本。改变此页会得影响其他用户个界面外观。假使要翻译,请考虑使用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hans translatewiki.net],一个用得来为MediaWiki软件本地化个计划。",
+'viewyourtext' => "你侬好望也好畀'''你侬编个'''复制到箇页:",
+'protectedinterface' => '箇页为箇维基个软件提供界面文本,锁牢定防乱用。
+加改全部维基个译文,用[//translatewiki.net/ translatewiki.net],MediaWiki软件个本地化计划。',
+'editinginterface' => "'''警告:''' 侬来里编写个页面是畀软件用个界面文本。箇页变化会影响各许人个界面样子。假使要畀全部维基翻译,用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hans translatewiki.net],MediaWiki软件个本地化计划。",
 'cascadeprotected' => '箇只页面拨保护拉许,因为箇只页面拨下底已经标注“联锁保护”个{{PLURAL:$1|一只|多只}}被保护页面包含:
 $2',
 'namespaceprotected' => "侬无没编辑'''$1'''名字空间里向页面个权限。",
+'customcssprotected' => '箇CSS页你呒处编,箇页有各许用户个私人设置。',
+'customjsprotected' => '箇JavaScript页你呒处编,箇页有各许用户个私人设置。',
+'mycustomcssprotected' => '箇CSS页你呒处编。',
+'mycustomjsprotected' => '箇JavaScript页你呒处编。',
+'myprivateinfoprotected' => '你个私人信息你呒处编。',
+'mypreferencesprotected' => '你个私人偏好你呒处编。',
 'ns-specialprotected' => '特殊页编辑是弗来三个。',
 'titleprotected' => "箇只标题已经拨[[User:$1|$1]]保护以防止创建。理由是''$2''。",
+'filereadonlyerror' => '"$1"文件呒处改,文件存勒 "$2" 是只读模式。管理员考虑畀渠锁牢个理由是:"$3"。',
+'invalidtitle-knownnamespace' => '非法个题目头,有名字空间$2搭文字$3',
+'invalidtitle-unknownnamespace' => '非法个题目头,有弗识个数字$1搭文字$2',
+'exception-nologin' => '朆登录',
+'exception-nologin-text' => '箇页要勿箇操作需要你登录到箇wiki裏来。',
 
 # Virus scanner
 'virus-badscanner' => "设置问题:未知个反病毒扫描器:''$1''",
@@ -378,39 +420,75 @@ $2',
 'virus-unknownscanner' => '未知个反病毒扫描器:',
 
 # Login and logout pages
-'logouttext' => "侬已经登出哉。'''
+'logouttext' => "'''你侬登出哉。'''
 
-侬可以继续匿名使用{{SITENAME}} ,也可以再次以相同或者两样个用户名<span class='plainlinks'>[$1 登录]</span>。
-注意,有眼页面作兴还是会搭侬登出前头一样显示,一脚到侬清除浏览器缓存。",
+部份页面呒数还会显示你侬还登勒里,到你侬畀浏览器慢存清爻止。",
+'welcomeuser' => '走来赞,$1!',
+'welcomecreation-msg' => '你个账号建起来哉。
+覅忘记哉走去改你个[[Special:Preferences|{{SITENAME}}个私人偏好]]。',
 'yourname' => '用户名:',
+'userlogin-yourname-ph' => '打进你侬个用户名',
+'createacct-another-username-ph' => '打进用户名',
 'yourpassword' => '密码:',
 'userlogin-yourpassword-ph' => '密码打进去',
 'createacct-yourpassword-ph' => '密码打进去',
-'yourpasswordagain' => '再拍一遍密码:',
-'remembermypassword' => '垃拉箇部电脑上记牢我个密码(可维持$1{{PLURAL:$1|日|日}})',
+'yourpasswordagain' => '密码再打一遍:',
+'createacct-yourpasswordagain-ph' => '密码打一遍添',
+'remembermypassword' => '徕箇浏览器里畀我登进去个记牢(记$1{{PLURAL:$1|日|日}})',
+'userlogin-remembermypassword' => '长期徕线里',
+'userlogin-signwithsecure' => '用保险链接',
 'yourdomainname' => '侬个域名:',
+'password-change-forbidden' => '箇wiki裏呒处改你侬个密码。',
 'externaldberror' => '迭个作兴是由于验证数据库错误或者侬拨禁止更新侬个外部账号。',
-'login' => '登',
-'nav-login-createaccount' => '登å½\95 / å¼\80æ\88·',
-'loginprompt' => 'å®\9aè§\84è¦\81å\90¯ç\94¨ä»\94ç¼\93å­\98ï¼\88cookiesï¼\89å\80·å\86\8d好ç\99»å½\95å\88°{{SITENAME}}。',
-'userlogin' => '登录 / 新开户头',
+'login' => '登进去',
+'nav-login-createaccount' => '登è¿\9bå\8e» / å»ºè´¦å\8f·',
+'loginprompt' => 'å¿\85é¡»ç\94¨ç¼\93å­\98ï¼\88cookiesï¼\89好ç\99»è¿\9b{{SITENAME}}。',
+'userlogin' => '登进去 / 建账号',
 'userloginnocreate' => '登录',
 'logout' => '登出',
 'userlogout' => '登出',
 'notloggedin' => '弗曾登录',
-'nologin' => "侬还呒没账户?'''$1'''。",
-'nologinlink' => '新开户头',
-'createaccount' => '新开户头',
+'userlogin-noaccount' => '账号还呒?',
+'userlogin-joinproject' => '加进{{SITENAME}}',
+'nologin' => "你侬还呒有账号?'''$1'''。",
+'nologinlink' => '建新账号',
+'createaccount' => '建账号',
 'gotaccount' => "已经有仔帐号哉? '''$1'''。",
 'gotaccountlink' => '登录',
-'createaccountmail' => '通过 e-mail',
+'userlogin-resetlink' => '忘记登录细节?',
+'userlogin-resetpassword-link' => '转设密码',
+'helplogin-url' => '帮助ː登进',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登进帮忙]]',
+'userlogin-loggedin' => '你侬用{{GENDER:$1|$1}}登进来哉。用下向个表以别样身份登进。',
+'userlogin-createanother' => '建别样账号',
+'createacct-join' => '下向打进你侬个信息。',
+'createacct-another-join' => '下向打进新账号个信息。',
+'createacct-emailrequired' => '电子信地址',
+'createacct-emailoptional' => '电子信地址(填弗填由你)',
+'createacct-email-ph' => '畀你侬个电子信地址打进去',
+'createacct-another-email-ph' => '电子信地址打进去',
+'createaccountmail' => '用临时随便密码发到指定个电子信地址',
+'createacct-realname' => '真名字(随意)',
 'createaccountreason' => '理由:',
+'createacct-reason' => '理由:',
+'createacct-reason-ph' => '为何物建别样账号',
+'createacct-captcha' => '保险检查',
+'createacct-imgcaptcha-ph' => '畀上向望着个字打箇里',
+'createacct-submit' => '建你侬个账号',
+'createacct-another-submit' => '建别样账号',
+'createacct-benefit-heading' => '{{SITENAME}} 是搭你侬样个人建起个。',
+'createacct-benefit-body1' => '{{PLURAL:$1|编写}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|页}}',
+'createacct-benefit-body3' => '此垡 {{PLURAL:$1|出力个人}}',
 'badretype' => '倷输入个密码搭倪个档案弗配。',
 'userexists' => '用戶名有人用哉。相勞爾揀別樣名字。',
 'loginerror' => '登录错误',
+'createacct-error' => '建账号出错',
 'createaccounterror' => '无法建立账户:$1',
 'nocookiesnew' => '侬个账户创建成功!Cookies像煞拨侬关拉许,请开开来再登录。',
 'nocookieslogin' => '本站利用Cookies进行用户登录,侬个Cookies像煞关拉许,请开开来再登录。',
+'nocookiesfornew' => '用户账号朆建起,我里确认弗了渠个原因。
+你要准定cookies是开勒里个,刷新箇页试试凑相。',
 'noname' => '用户名无效。',
 'loginsuccesstitle' => '登录成功',
 'loginsuccess' => "'''侬现在以 \"\$1\" 个身份登录到{{SITENAME}}。 '''",
@@ -422,7 +500,8 @@ $2',
 'wrongpasswordempty' => '密码为空,请重试。',
 'passwordtooshort' => '密码起码要$1个字符。',
 'password-name-match' => '密码弗好搭户名一样。',
-'mailmypassword' => '拿新密码寄拨我',
+'password-login-forbidden' => '用箇名字搭密码是弗准个。',
+'mailmypassword' => '新密码用电子信寄畀我',
 'passwordremindertitle' => '{{SITENAME}} 个临时新密码',
 'passwordremindertext' => '有人(作兴是侬,来自IP地址$1)已经请求{{SITENAME}}个新密码($4)。
 用户“$2”个一只新临时密码现在已经设置好为“$3”。
@@ -437,7 +516,7 @@ $2',
 请收着仔再登录。',
 'blocked-mailpassword' => '侬个IP地址处于查封状态,弗允许编辑,为仔安全起见,密码恢复功能已经禁用。',
 'eauthentsent' => '一封确认信已经发送到指定个e-mail地址。垃拉发送其它邮件到箇只账户之前,侬必须首先按照箇封信里向个指示确认箇只电子邮箱真实有效。',
-'throttled-mailpassword' => '密码提醒已经垃拉最近$1个钟头里向发送过歇。为仔安全起见,垃拉$1个钟头里向只好发送一个密码提醒。',
+'throttled-mailpassword' => '密码转设电子信徕最近$1个钟头里发畀你侬哉。保险点,密码转设电子信$1个钟头只一垡好发。',
 'mailerror' => '发送邮件错误:$1',
 'acct_creation_throttle_hit' => '弗好意思,使用箇只IP个访客已经创建仔$1只账号,迭个是箇段辰光里向所允许个最大值。箇咾使用箇只IP个地址个访客暂时弗好再创建账户。',
 'emailauthenticated' => '侬个电子邮箱地址已经垃拉$2 $3确认有效。',
@@ -445,15 +524,18 @@ $2',
 'noemailprefs' => '指定一只电子邮箱地址以使用箇眼功能。',
 'emailconfirmlink' => '确认邮箱地址',
 'invalidemailaddress' => '邮箱地址格式弗对,请输入正确个邮箱地址或清空输入框。',
+'cannotchangeemail' => '箇wiki里账号电子信地址呒处改。',
+'emaildisabled' => '箇网站电子信呒处发。',
 'accountcreated' => '户头开好哉',
-'accountcreatedtext' => '$1 个户头已经建立哉。',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]])个账号建好哉。',
 'createaccount-title' => '垃拉{{SITENAME}}里向创建新账户',
 'createaccount-text' => '有人垃拉{{SITENAME}}里向利用侬个邮箱创建仔一只叫 "$2" 个新帐户($4),密码是 "$3" 。侬应该立即登录并更改密码。
 
 如果箇个账户创建错误个说话,侬可以忽略此信息。',
 'usernamehasherror' => '用户名里向弗好包含hash字符',
-'login-throttled' => '登录尝试忒多哉。
-请等脱歇再试。',
+'login-throttled' => '你侬试登忒多次哉。
+等 $1 再试试凑相。',
+'login-abort-generic' => '登录弗成功 - 流产',
 'loginlanguagelabel' => '语言:$1',
 'suspicious-userlogout' => '侬登出个要求已经拨回头脱,因为渠可能是由已损坏个浏览器或者缓存代理传送个。',
 
@@ -486,27 +568,28 @@ $2',
 'link_sample' => '链接标题',
 'link_tip' => '内部链接',
 'extlink_sample' => 'http://www.example.com 链接标题',
-'extlink_tip' => 'å¤\96é\83¨é\93¾æ\8e¥ï¼\88å¼\97è¦\81å¿\98è®°è\84±å\89\8d头å\8a http://)',
+'extlink_tip' => 'å¤\96é\83¨é\93¾æ\8e¥ï¼\88å\89\8d头记ç\89¢å\8a  http://)',
 'headline_sample' => '标题文本',
 'headline_tip' => '2级标题文字',
-'nowiki_sample' => 'å\9e\83æ\8b\89ç®\87æ\90­插入非格式文本',
-'nowiki_tip' => '忽ç\95¥wiki格式',
+'nowiki_sample' => 'å¾\95ç®\87é\87\8c插入非格式文本',
+'nowiki_tip' => 'å¼\97管wiki格式',
 'image_tip' => '嵌入文件',
 'media_tip' => '文件链接',
-'sig_tip' => '签名搭辰光戳',
-'hr_tip' => '水平线 (小心使用)',
+'sig_tip' => '签名搭辰光戳',
+'hr_tip' => '水平线 (小心用)',
 
 # Edit pages
 'summary' => '摘要:',
 'subject' => '主题 / 标题:',
-'minoredit' => 'ç®\87æ\98¯å\8fªç»\86微个æ\94¹å\8a¨',
-'watchthis' => '监控箇只页面',
+'minoredit' => 'ç®\87æ\98¯å°\8få\8f\98å\8c\96',
+'watchthis' => '关注箇页',
 'savearticle' => '保存页面',
-'preview' => '预览',
-'showpreview' => '显示预览',
+'preview' => '望望相',
+'showpreview' => '显示望望相',
 'showlivepreview' => '实时预览',
-'showdiff' => '显示改动',
-'anoneditwarning' => "'''警告:''' 侬弗曾登录。侬个IP地址会得记录拉页面个编辑历史里向。",
+'showdiff' => '显示变化',
+'anoneditwarning' => "'''警告:''' 你侬朆登进来。
+你侬个IP地址会记进箇页个编史里。",
 'anonpreviewwarning' => "''侬弗曾登录。侬个IP位址会得记录拉此页个编辑历史里向。''",
 'missingsummary' => "'''提示:''' 侬弗曾提供编辑摘要。假使侬再次单击保存,侬个编辑将弗带编辑摘要保存。",
 'missingcommenttext' => '请垃下头输入备注。',
@@ -557,9 +640,11 @@ $2',
 要创建该页面呢,就勒下底个框框里向开始写([[{{MediaWiki:Helppage}}|帮助页面]]浪有更加多个信息)。
 要是倷是弗用心到该搭个说话,只要点击倷浏览器个'''返回'''揿钮。",
 'anontalkpagetext' => "---- ''箇是一个还弗曾建立账户个匿名用户个讨论页, 箇咾我伲只好用IP地址来搭渠联络。该IP地址可能由几名用户共享。如果侬是一名匿名用户并认为箇只页面高头个评语搭侬弗搭界,请 [[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]来避免垃拉将来搭其他匿名用户混淆。''",
-'noarticletext' => '箇只页面目前呒没内容。侬可以垃拉其他页面高头[[Special:Search/{{PAGENAME}}|搜索此页标题]]、<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑此页]。</span>',
-'noarticletext-nopermission' => '箇只页面目前呒没内容,侬可以垃拉其它页[[Special:Search/{{PAGENAME}}|搜索此页标题]],
-或<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索有关日志]</span>。',
+'noarticletext' => '箇页目前呒有文本。
+你侬好来别个页[[Special:Search/{{PAGENAME}}|搜寻箇页标题]]、<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜寻相关日志]要勿[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编箇页]。</span>',
+'noarticletext-nopermission' => '箇页目前还呒有文本。
+你侬好徕别个页[[Special:Search/{{PAGENAME}}|搜寻箇页标题]],
+要勿<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜寻相关日志]</span>,暂时弗允许你侬建箇页。',
 'userpage-userdoesnotexist' => '用户账户“<nowiki>$1</nowiki>”弗曾创建。请垃拉创建/编辑迭个页面前头先检查一记。',
 'userpage-userdoesnotexist-view' => '用户账户“$1”弗曾创建。',
 'blocked-notice-logextract' => '箇位用户箇歇畀封锁垃许。
@@ -578,7 +663,7 @@ $2',
 'userinvalidcssjstitle' => "'''警告:''' 弗存在皮肤\"\$1\"。注意自定义个 .css 搭 .js 页要使用小写标题,譬如,{{ns:user}}:Foo/vector.css 弗同于 {{ns:user}}:Foo/Vector.css。",
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
-'previewnote' => "'''该个è¿\98å\8fªæ\98¯é¢\84è§\88ï¼\9bæ\94¹å\8a¨è¿\98æ\9c\86ä¿\9då­\98!'''",
+'previewnote' => "'''è®°ç\89¢ï¼\81ç®\87è¿\98æ\98¯â\80\9cæ\9c\9bæ\9c\9bç\9b¸â\80\9dï¼\9b你侬个修æ\94¹è¿\98æ\9c\86ä¿\9då­\98èµ·!'''",
 'previewconflict' => '箇个预览显示了上头文字编辑区里向个内容。渠会得垃拉侬保存之后出现。',
 'session_fail_preview' => "'''弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|登出]]之后重新登录。",
 'session_fail_preview_html' => "'''弗好意思!我伲弗好处理侬垃拉进程数据落失辰光个编辑。'''
@@ -588,8 +673,8 @@ $2',
 '''如果这是一次合法的编辑,请重新进行尝试。'''如果还不行,请 [[Special:UserLogout|退出]]并重新登录。",
 'token_suffix_mismatch' => "'''由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。'''
 箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
-'editing' => '正在编辑$1',
-'editingsection' => '正在编辑$1(段落)',
+'editing' => '徕里编$1',
+'editingsection' => '徕里编写$1(段)',
 'editingcomment' => '垃许编辑 $1 (新段落)',
 'editconflict' => '编辑冲突: $1',
 'explainconflict' => '有人垃拉侬开始编辑之后更改仔页面。
@@ -602,10 +687,10 @@ $2',
 'nonunicodebrowser' => "'''警告:侬个浏览器弗兼容Unicode编码。'''箇搭有一只工作区将使侬可以安全编辑页面:非ASCII字符将以十六进制编码方式出现垃拉编辑框里向。",
 'editingold' => "''' 注意:倷勒里改动一只已经过期个页面修改。 如果倷保存俚个说话,勒拉该个修改之后个亨白浪当个修改侪会呒拨个。'''",
 'yourdiff' => '两样',
-'copyrightwarning' => "请注æ\84\8f侬对{{SITENAME}}个æ\89\80æ\9c\89è´¡ç\8c®ä¾ªå¿\85é¡»å\9e\83æ\8b\89$2ä¸\8b头å\8f\91å¸\83ï¼\8c请æ\9f¥ç\9c\8bå\9e\83æ\8b\89$1个细节。
\81\87使侬å¼\97å¸\8cæ\9c\9b侬个æ\96\87å­\97æ\8b¨ä»»æ\84\8fä¿®æ\94¹æ\90­å\86\8då\8f\91å¸\83ï¼\8c请å¼\97è¦\81æ\8f\90交。<br />
¾¬å\90\8cæ\97¶ä¹\9fè¦\81å\90\91æ\88\91ä¼²ä¿\9dè¯\81侬æ\89\80æ\8f\90交个å\86\85容æ\98¯ä¾¬è\87ªå®¶æ\89\80ä½\9cï¼\8cæ\88\96å¾\97è\87ªä¸\80个å¼\97å\8f\97ç\89\88æ\9d\83ä¿\9dæ\8a¤æ\88\96ç\9b¸ä¼¼è\87ªç\94±ä¸ªæ\9d¥æº\90
-'''弗要垃拉弗曾获得授权个情况下头发表!'''<br />",
+'copyrightwarning' => "请注æ\84\8f你侬对{{SITENAME}}个ä¸\80å\88\87è´¡ç\8c®å\85¨å¿\85é¡»å¾\95$2ä¸\8b头å\8f\91å¸\83ï¼\8cæ\9f¥$1æ\9c\9b细节。
\81\87使你侬å¼\97æ\83³è\87ªå·±ä¸ªæ\96\87å­\97é\81­å\88°é\9a\8fæ\84\8fä¿®æ\94¹æ\90­è½¬å\8f\91ï¼\8cè¦\85æ\8f\90交ä¸\8aæ\9d¥。<br />
½ ä¾¬ä¹\9fè¦\81å\90\91æ\88\91é\87\8cä¿\9dè¯\81ï¼\8cç®\87æ\98¯ä½ ä¾¬è\87ªå®¶å\86\99个ï¼\8cè¦\81å\8b¿ä»\8eå¼\97å\8f\97ç\89\88æ\9d\83ä¿\9dæ\8a¤ä¸ªè¦\81å\8b¿å·®å¼\97å¤\9a个è\87ªç\94±èµ\84æº\90æ\9d¥
+'''覅徕朆获得授权个情况下发表!'''<br />",
 'copyrightwarning2' => "请注意侬对{{SITENAME}}个所有贡献
 侪可能畀别个贡献者编辑,修改或删除。
 假使侬弗希望侬个文字畀任意修改搭仔再发布,请弗要提交。<br />
@@ -622,25 +707,25 @@ $2',
 'cascadeprotectedwarning' => '警告:本页已经畀保护,只有拥有管理员权限个用户再好修改,因为本页已畀下底眼连锁保护个{{PLURAL:$1|一只|多只}}页面所包含:',
 'titleprotectedwarning' => "'''警告:本页面已畀锁定,需要[[Special:ListGroupRights|指定权限]]方可创建。'''
 最近个日志垃拉下底提供以便参考:",
-'templatesused' => '{{PLURAL:$1|只模板}}垃拉本页使用:',
+'templatesused' => '箇页有{{PLURAL:$1|个模板}}:',
 'templatesusedpreview' => '{{PLURAL:$1|只模板}}垃拉箇趟预览里向拨使用:',
 'templatesusedsection' => '垃拉箇只段落里向使用个{{PLURAL:$1|模板|模板}}有:',
 'template-protected' => '(保护)',
-'template-semiprotected' => '(半保护垃许)',
-'hiddencategories' => '箇只页面是属于$1个隐藏分类个成员:',
+'template-semiprotected' => '(半保护)',
+'hiddencategories' => '箇页属$1个隐藏分类个成员:',
 'nocreatetext' => '{{SITENAME}}限制了创建新页面功能。侬可以返回并编辑已有个页面,或者[[Special:UserLogin|登录或创建新账户]]。',
 'nocreate-loggedin' => '侬呒没权限创建新页面。',
 'sectioneditnotsupported-title' => '段落编辑弗支持',
 'sectioneditnotsupported-text' => '此页面弗支持编辑段落。',
 'permissionserrors' => '权限错误',
 'permissionserrorstext' => '为仔下头个{{PLURAL:$1|原因|原因}}咾侬无权进行箇只操作:',
-'permissionserrorstext-withaction' => '为ä»\94ä¸\8b头个{{PLURAL:$1|å\8e\9få\9b |å\8e\9få\9b }}å\92¾ä¾¬æ\97 æ\9d\83进行$2操作:',
-'recreate-moveddeleted-warn' => "'''è­¦å\91\8a: ä¾¬ç\8e°å\9c¨é\87\8dæ\96°å\88\9b建ä¸\80å\8fªä¹\8bå\89\8dæ\9b¾ç»\8få\88 é\99¤è¿\87æ­\87个页é\9d¢ã\80\82'''
+'permissionserrorstext-withaction' => 'ä¸\8b头个{{PLURAL:$1|å\8e\9få\9b |å\8e\9få\9b }}ä¹\8bæ\95\85ï¼\8c你侬å\91\92å¤\84进行$2操作:',
+'recreate-moveddeleted-warn' => "'''è­¦å\91\8a: ä½ ä¾¬è¦\81转建ä¸\80个ä¹\8bå\89\8då\88 è\84±è¿\87个页é\9d¢ã\80\82'''
 
¾¬åº\94该è¦\81è\80\83è\99\91è\80\83è\99\91继续ç¼\96è¾\91ç®\87å\8fªé¡µé\9d¢是否合适。
-为方便起见,箇只页面个删除记录提供垃拉下底:",
-'moveddeleted-notice' => '箇只页面已经删除
-箇只页面个删除搭移动日志提供垃拉下头以便参考。',
½ ä¾¬åº\94该è¦\81è\80\83è\99\91è\80\83è\99\91继续ç¼\96ç®\87页是否合适。
+方便考虑,箇页个删记录提供到下头:",
+'moveddeleted-notice' => '箇页删脱哉
+箇页个删搭移个日志徕下头提供以便参考。',
 'log-fulllog' => '查看完整日志',
 'edit-hook-aborted' => '编辑畀钩子取消。
 渠弗曾畀出解释。',
@@ -656,9 +741,9 @@ $2',
 
 必须小于$2趟调用,现在有$1趟调用。',
 'expensive-parserfunction-category' => '页面包含忒多耗费资源个函数调用',
-'post-expand-template-inclusion-warning' => '警告:包含模板大小过大
-一些模板将弗会畀包含垃许。',
-'post-expand-template-inclusion-category' => '模板包含上限已经超过个页面',
+'post-expand-template-inclusion-warning' => "'''警告:'''模板用忒多
+一星模板弗'''用'''。",
+'post-expand-template-inclusion-category' => '模板用过量个页',
 'post-expand-template-argument-warning' => '警告:箇只页面至少包含一只模参数,渠个扩展大小过大。
 箇眼参数已经畀忽略。',
 'post-expand-template-argument-category' => '包含忽略模板参数个页面',
@@ -680,13 +765,13 @@ $2',
 $3封禁个原因是''$2''",
 
 # History pages
-'viewpagelogs' => 'æ\9f¥ç\9c\8b该页é\9d¢日志',
+'viewpagelogs' => 'æ\9c\9bç®\87页日志',
 'nohistory' => '该只页面呒拨编辑历史。',
 'currentrev' => '最新修订版本',
 'currentrev-asof' => '于$1个最新修订版',
 'revisionasof' => '垃拉$1所作出个修订版',
 'revision-info' => '垃拉$1由$2所作修订版本',
-'previousrevision' => '←旧版',
+'previousrevision' => '←旧版',
 'nextrevision' => '新点个版本→',
 'currentrevisionlink' => '最新修订',
 'cur' => '当前',
@@ -695,8 +780,8 @@ $3封禁个原因是''$2''",
 'page_first' => '最前',
 'page_last' => '压末',
 'histlegend' => '选择比较版本:标记要比较个两只版本,回车或者揿页面底里个揿钮。<br /> 图例:(当前) = 搭当前版本有啥两样, (上个) = 搭上个版本有啥两样,小 = 小改动。',
-'history-fieldset-title' => '浏览史',
-'history-show-deleted' => '仅限已经删除个',
+'history-fieldset-title' => '浏览史',
+'history-show-deleted' => '只准删脱个',
 'histfirst' => '最老',
 'histlast' => '最新',
 'historysize' => '($1字节)',
@@ -780,7 +865,7 @@ $1",
 'logdelete-success' => "'''事件个可见性已经成功设置。'''",
 'logdelete-failure' => "'''事件个可见性无法设置:'''
 $1",
-'revdel-restore' => 'æ\9b´æ\94¹可见性',
+'revdel-restore' => 'æ\94¹å\8f\98可见性',
 'revdel-restore-deleted' => '已删除个修订版本',
 'revdel-restore-visible' => '可见个修订版本',
 'pagehist' => '页面历史',
@@ -835,16 +920,16 @@ $1",
 'mergelogpagetext' => '下底是只最近发生个页面历史合并个记录列表。',
 
 # Diffs
-'history-title' => 'â\80\9c$1â\80\9d个修订å\8e\86å\8f²',
-'lineno' => '第$1:',
+'history-title' => '“$1”个修订史',
+'lineno' => '第$1:',
 'compareselectedversions' => '比较选中个版本',
 'showhideselectedversions' => '显示/囥脱选定修订版本',
 'editundo' => '撤销',
-'diff-multi' => '($1个中途个修订版本无没显示。)',
+'diff-multi' => '($2个用户个$1个中央版本朆显示。)',
 
 # Search results
-'searchresults' => '搜结果',
-'searchresults-title' => '对“$1”个搜索结果',
+'searchresults' => '搜结果',
+'searchresults-title' => '搜寻“$1”个结果',
 'searchresulttext' => '更加全面个关于拉{{SITENAME}}里向搜索个信息,请倷看[[{{MediaWiki:Helppage}}:搜索|搜索{{SITENAME}}]]。',
 'searchsubtitle' => '搜索\'\'\'[[:$1]]\'\'\'([[Special:Prefixindex/$1|所有以 "$1" 打头个页面]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|所有链接到“$1”个页面]])',
 'searchsubtitleinvalid' => "倷搜寻 '''$1'''",
@@ -855,30 +940,30 @@ $1",
 'notextmatches' => '呒没匹配个页面文本',
 'prevn' => '上个 $1',
 'nextn' => '下个 {{PLURAL:$1|$1}}',
-'prevn-title' => '前$1结果',
-'nextn-title' => '后$1结果',
-'shown-title' => '每页显示$1项结果',
+'prevn-title' => '前$1结果',
+'nextn-title' => '后$1结果',
+'shown-title' => '一页显示$1个结果',
 'viewprevnext' => '查看($1 {{int:pipe-separator}} $2)($3)',
 'searchmenu-legend' => '搜索选项',
-'searchmenu-exists' => "'''垃拉箇只wiki高头已经有只页面叫“[[:$1]]”哉'''",
-'searchmenu-new' => "'''å\9e\83æ\8b\89该wikié\87\8cå\90\91æ\96°å»ºé¡µé\9d¢â\80\9c[[:$1]]â\80\9d!'''",
+'searchmenu-exists' => "'''箇wiki里有一页名字“[[:$1]]”哉'''",
+'searchmenu-new' => "'''å¾\95ç®\87wikié\87\8c建â\80\9c[[:$1]]â\80\9d页!'''",
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|浏览带箇只前缀个页面]]',
-'searchprofile-articles' => '内容页',
-'searchprofile-project' => '帮助搭仔项目页面',
+'searchprofile-articles' => '内容页',
+'searchprofile-project' => '帮助搭项目页',
 'searchprofile-images' => '多媒体',
 'searchprofile-everything' => '全部',
 'searchprofile-advanced' => '高级',
-'searchprofile-articles-tooltip' => 'å\9e\83æ\8b\89$1é\87\8cå\90\91æ\90\9cç´¢',
-'searchprofile-project-tooltip' => 'å\9e\83æ\8b\89$1é\87\8cå\90\91æ\90\9cç´¢',
-'searchprofile-images-tooltip' => '搜文件',
-'searchprofile-everything-tooltip' => '搜索全部(包括讨论页面)',
+'searchprofile-articles-tooltip' => 'å¾\95$1é\87\8cæ\90\9c寻',
+'searchprofile-project-tooltip' => 'å¾\95$1é\87\8cæ\90\9c寻',
+'searchprofile-images-tooltip' => '搜文件',
+'searchprofile-everything-tooltip' => '搜寻全部内容(包括讨论页)',
 'searchprofile-advanced-tooltip' => '垃拉自定义名字空间里向搜索',
 'search-result-size' => '$1($2字)',
-'search-result-category-size' => '$1ä½\8dæ\88\90å\91\98ï¼\88$2个å­\90分类,$3个文件)',
+'search-result-category-size' => '$1个æ\88\90å\91\98ï¼\88$2个å\84¿分类,$3个文件)',
 'search-result-score' => '相关度:$1%',
-'search-redirect' => '(重定向 $1)',
+'search-redirect' => '(转戳到 $1)',
 'search-section' => '(段落 $1)',
-'search-suggest' => '侬é\98¿æ\98¯è¦\81寻:$1',
+'search-suggest' => '你侬æ\98¯寻:$1',
 'search-interwiki-caption' => '姊妹项目',
 'search-interwiki-default' => '$1项结果:',
 'search-interwiki-more' => '(更多)',
@@ -886,12 +971,12 @@ $1",
 'mwsuggest-disable' => '禁用AJAX建议',
 'searcheverything-enable' => '垃拉所有名字空间里向搜索',
 'searchrelated' => '相关',
-'searchall' => '所有',
+'searchall' => '全部',
 'showingresults' => '下头显示从第<b>$2</b>条开始个<b>$1</b>条结果:',
 'showingresultsnum' => '下头显示从第<b>$2</b>条开始个<b>$3</b>条结果:',
-'showingresultsheader' => "对'''$4'''个{{PLURAL:$5|第'''$1'''至第'''$3'''项结果|第'''$1-$2'''项,共'''$3'''结果}}",
+'showingresultsheader' => "对'''$4'''个{{PLURAL:$5|第'''$1'''至第'''$3'''项结果|第'''$1-$2'''项,共'''$3'''结果}}",
 'nonefound' => "'''注意''':只默认搜索部分名字空间个页面。尝试垃拉侬个搜索语句前头添加“all:”前缀,箇能介好搜索全部页面(包括讨论页、模板咾啥),或者亦可使用所需名字空间作为前缀。",
-'search-nonefound' => '寻弗着搭查询匹配个记录',
+'search-nonefound' => '查询呒有结果。',
 'powersearch' => '高级搜索',
 'powersearch-legend' => '高级搜索',
 'powersearch-ns' => '垃拉箇眼名字空间里向搜索:',
@@ -905,7 +990,7 @@ $1",
 
 # Preferences page
 'preferences' => '偏好',
-'mypreferences' => '个人设置',
+'mypreferences' => '偏好设定',
 'prefs-edits' => '编辑数量:',
 'prefsnologin' => '朆登录',
 'prefsnologintext' => '侬必须先<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 登录]</span>再好设置个人参数。',
@@ -928,7 +1013,7 @@ $1",
 'prefs-rendering' => '外观',
 'saveprefs' => '保存',
 'resetprefs' => '清除弗曾保存个更改',
-'restoreprefs' => '恢复所有默认设置',
+'restoreprefs' => '复原全部默认设定',
 'prefs-editing' => '编辑',
 'rows' => '行:',
 'columns' => '列:',
@@ -955,21 +1040,24 @@ $1",
 'timezoneregion-atlantic' => '大西洋',
 'timezoneregion-australia' => '澳洲',
 'allowemail' => '接受别个用户个电子邮件',
-'prefs-searchoptions' => '搜索选项',
+'prefs-searchoptions' => '搜',
 'prefs-namespaces' => '名字空间',
 'default' => '默认',
 'prefs-files' => '文件',
-'youremail' => '电子邮件:',
+'youremail' => '电子信箱:',
 'username' => '用户名:',
 'uid' => '用户号:',
-'yourrealname' => 'ç\9c\9få®\9eå§\93å\90\8d:',
+'yourrealname' => 'ç\9c\9få\90\8då­\97:',
 'yourlanguage' => '语言:',
 'yournick' => '绰号:',
 'badsig' => '无效原始签名;检查 HTML 标签。',
 'gender-unknown' => '我弗想講',
+'gender-male' => '佢写Wiki',
+'gender-female' => '"姖"写Wiki',
 'email' => '电子邮件',
-'prefs-help-email' => '电子邮件是备选个,垃拉侬忘记密码个情况下头可以用得来重置密码。
-侬也可以让别人家通过侬个用户页或者讨论页来联系侬。',
+'prefs-help-email' => '电子信由你侬填弗填,转设密码用得着。',
+'prefs-help-email-others' => '你侬也好来你侬个用户|讨论页里添加自己个电子信连接畀别人联系你用。
+别人联系你是弗晓得你侬个电子信地址个。',
 'prefs-help-email-required' => '需要电子邮件地址。',
 
 # User rights
@@ -1013,7 +1101,7 @@ $1",
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => '讀箇頁',
-'action-edit' => '编辑箇只页面',
+'action-edit' => '编箇页',
 'action-createpage' => '做新頁',
 'action-createtalk' => '做討論頁',
 'action-minoredit' => '標小編寫',
@@ -1040,19 +1128,19 @@ $1",
 # Recent changes
 'nchanges' => '$1趟更改',
 'enhancedrc-history' => '歷史',
-'recentchanges' => '近段辰光个改动',
-'recentchanges-legend' => '近段辰光个改动选项',
+'recentchanges' => '箇阶段个变化',
+'recentchanges-legend' => '箇阶段个变化选项',
 'recentchanges-summary' => '登该个页面浪跟踪最近对维基百科个改动。',
 'recentchanges-feed-description' => '跟踪此订阅垃拉 wiki 高头个最近更改。',
-'recentchanges-label-newpage' => '此垡編寫開新頁',
-'recentchanges-label-minor' => 'ç®\87æ\98¯å°\8f編寫',
+'recentchanges-label-newpage' => '建新页来编',
+'recentchanges-label-minor' => 'ç®\87æ\98¯å°\8fç¼\96å\86\99',
 'rcnote' => "下底是垃拉$4 $5,最近'''$2'''日天里向个'''$1'''趟最近更改记录:",
 'rclistfrom' => '显示 $1 以来个新改动',
-'rcshowhideminor' => '$1小改动',
+'rcshowhideminor' => '$1小编写',
 'rcshowhidebots' => '$1机器人',
 'rcshowhideliu' => '$1登录个用户',
 'rcshowhideanons' => '$1匿名用户',
-'rcshowhidemine' => '$1我个改动',
+'rcshowhidemine' => '$1我个修改',
 'rclinks' => '显示来拉上个 $2 日里向个最近 $1 趟改动<br />$3',
 'diff' => '两样',
 'hist' => '历史',
@@ -1062,21 +1150,21 @@ $1",
 'newpageletter' => '新',
 'boteditletter' => '机',
 'newsectionsummary' => '/* $1 */ 新段落',
-'rc-enhanced-expand' => '展示零碎',
-'rc-enhanced-hide' => '细节囥脱',
+'rc-enhanced-expand' => '显示细节',
+'rc-enhanced-hide' => '细节囥脱',
 
 # Recent changes linked
-'recentchangeslinked' => '搭界个改动',
+'recentchangeslinked' => '相关变化',
 'recentchangeslinked-feed' => '搭界个改动',
-'recentchangeslinked-toolbox' => '搭界个改动',
+'recentchangeslinked-toolbox' => '相关变化',
 'recentchangeslinked-title' => '搭“$1”有关个改动',
-'recentchangeslinked-summary' => "è¿­å\8fªé¡µé\9d¢å\88\97示个æ\98¯å¯¹é\93¾å\88°æ\9f\90å\8fªæ\8c\87å®\9a页é\9d¢ä¸ªé¡µé\9d¢è¿\91段辰å\85\89个修订ï¼\88æ\88\96è\80\85æ\98¯å¯¹æ\8c\87å®\9aå\88\86类个æ\88\90å\91\98ï¼\89ã\80\82
\9e\83æ\8b\89[[Special:Watchlist|侬个ç\9b\91æ\8e§å\88\97表]]é\87\8cå\90\91个页é\9d¢ä¼\9aå¾\97以'''粗体'''显示。",
+'recentchangeslinked-summary' => "ç®\87页å\88\97å\87ºä¸ªæ\98¯å¯¹é\93¾å\88°æ\9f\90å\8fªæ\8c\87å®\9a页é\9d¢ä¸ªé¡µé\9d¢è¿\91段辰å\85\89个修订ï¼\88æ\88\96è\80\85æ\98¯å¯¹æ\8c\87å®\9aå\88\86类个æ\88\90å\91\98ï¼\89ã\80\82
¾\95[[Special:Watchlist|你侬个å\85³æ³¨è¡¨]]é\87\8c个页ç\94¨'''粗体'''显示。",
 'recentchangeslinked-page' => '页面名称:',
 'recentchangeslinked-to' => '显示链接到指定页面个页面个改动',
 
 # Upload
-'upload' => '上载文物',
+'upload' => '上传文件',
 'uploadbtn' => '上载文件',
 'reuploaddesc' => '弗傳,轉到傳表單',
 'uploadnologin' => '朆登录',
@@ -1089,7 +1177,7 @@ $1",
 '''<nowiki>[[{{ns:file}}:文件.png|替代文本]]</nowiki>''' 或者用
 '''<nowiki>[[{{ns:media}}:文件.ogg]]</nowiki>''' 直接链到文件。",
 'uploadlog' => '文件上载日志',
-'uploadlogpage' => '文件上日志',
+'uploadlogpage' => '文件上日志',
 'uploadlogpagetext' => '下底是最近上载文件列表。',
 'filename' => '文件名',
 'filedesc' => '小结',
@@ -1115,7 +1203,7 @@ $1",
 'windows-nonascii-filename' => '箇wiki弗支持文件名用特別個字符。',
 'uploadwarning' => '上载警告',
 'savefile' => '保存文件',
-'uploadedimage' => '上 "[[$1]]"',
+'uploadedimage' => '上 "[[$1]]"',
 'sourcefilename' => '源文件:',
 'destfilename' => '目标文件名:',
 'watchthisupload' => '關注箇文件',
@@ -1158,9 +1246,9 @@ $1",
 'listfiles-latestversion-no' => '弗是',
 
 # File description page
-'file-anchor-link' => '文',
+'file-anchor-link' => '文',
 'filehist' => '文件历史',
-'filehist-help' => 'ç\82¹å\87»æ\97¥è\84\9aï¼\8fè¾°å\85\89æ\9f¥ç\9c\8bå½\93æ\97¶å\87ºç\8e°è¿\87æ­\87个æ\96\87件ã\80\82',
+'filehist-help' => 'æ\8f¿ä¸\80个æ\97¥è\84\9aï¼\8fè¾°å\85\89æ\9d¥æ\9c\9bå½\93æ\97¶å\87ºç\8e°è¿\87个æ\96\87件ã\80\82',
 'filehist-deleteall' => '全删',
 'filehist-deleteone' => '删',
 'filehist-revert' => '恢复',
@@ -1172,11 +1260,13 @@ $1",
 'filehist-dimensions' => '维度',
 'filehist-filesize' => '文件大細',
 'filehist-comment' => '备注',
-'imagelinks' => '文件链接',
-'linkstoimage' => '下头$1只页面链接到本文件:',
-'nolinkstoimage' => 'å\91\92æ\8b¨é¡µé\9d¢é\93¾æ\8e¥å\88°è¯¥å\8fª文件。',
+'imagelinks' => '文件用法',
+'linkstoimage' => '下头$1个页面链到箇文件:',
+'nolinkstoimage' => 'å\91\92æ\9c\89页é\93¾å\88°ç®\87文件。',
 'linkstoimage-redirect' => '$1(文件轉戳到)$2',
 'sharedupload' => '箇只文件来源于$1,渠作兴垃拉其它项目当中拨应用。',
+'sharedupload-desc-here' => '箇文件$1里个,作兴会来别个项目里用。
+渠个描述页里所描述个显示如下。',
 'uploadnewversion-linktext' => '上载该文件个新版',
 
 # File reversion
@@ -1228,24 +1318,24 @@ $1",
 # Miscellaneous special pages
 'nbytes' => '$1字节',
 'nmembers' => '$1只成员',
-'unusedimages' => '弗勒浪使用个文件',
+'unusedimages' => '朆用着个文件',
 'popularpages' => '热门页面',
 'mostlinked' => '链进去顶多个页面',
 'mostlinkedcategories' => '链进去顶多个分类',
 'mostcategories' => '分类顶多个页面',
 'mostimages' => '链进去顶多个图片',
 'mostrevisions' => '修订过顶顶多趟数个页面',
-'prefixindex' => '所有带前缀个页面',
+'prefixindex' => '全部带前缀个页面',
 'shortpages' => '短页面',
 'longpages' => '长页面',
 'protectedpages' => '已保护页面',
 'protectedtitles' => '已保护个标题',
 'listusers' => '用户列表',
 'listusers-creationsort' => '照建個日子排',
-'newpages' => '新页',
+'newpages' => '新页',
 'newpages-username' => '用户名:',
 'ancientpages' => '顶顶老个页面',
-'move' => '捅荡',
+'move' => '移到',
 'movethispage' => '捅该只页面',
 'pager-newer-n' => '新$1次',
 'pager-older-n' => '旧$1次',
@@ -1253,7 +1343,7 @@ $1",
 # Book sources
 'booksources' => '书源',
 'booksources-search-legend' => '搜索网络书源',
-'booksources-go' => '转到',
+'booksources-go' => '',
 
 # Special:Log
 'specialloguserlabel' => '用戶:',
@@ -1267,7 +1357,7 @@ $1",
 'prevpage' => '上一页($1)',
 'allpagesfrom' => '显示个页面开始于:',
 'allpagesto' => '显示从此地结束个页面:',
-'allarticles' => '所有页面',
+'allarticles' => '全部页面',
 'allinnamespace' => '所有页面 ($1 名字空间)',
 'allnotinnamespace' => '全部页面 (弗勒 $1 名字空间里向)',
 'allpagesprev' => '前头',
@@ -1283,6 +1373,7 @@ $1",
 'linksearch' => '外部链接',
 'linksearch-ns' => '名字空間:',
 'linksearch-ok' => '搜尋',
+'linksearch-line' => '从$2链到$1',
 
 # Special:ListUsers
 'listusers-submit' => '显示',
@@ -1295,7 +1386,7 @@ $1",
 'listgrouprights-members' => '(成员列表)',
 
 # Email user
-'emailuser' => '发E-mail拨该个用户',
+'emailuser' => '发电子信畀箇个用户',
 'emailuser-title-notarget' => '郵箱用戶',
 'emailpage' => '郵箱用戶',
 'emailfrom' => '從',
@@ -1309,21 +1400,21 @@ $1",
 
 # Watchlist
 'watchlist' => '關注表',
-'mywatchlist' => '我個關注表',
+'mywatchlist' => '我个关注表',
 'nowatchlist' => '倷个监控列表是空个。',
 'watchnologin' => '朆登录',
 'addedwatchtext' => '“[[:$1]]”箇頁加進爾個[[Special:Watchlist|關注表]]去哉。
 轉日箇頁搭渠討論頁個變化會排箇耷。',
 'removewatch' => '從關注表移爻',
 'removedwatchtext' => '页面[[:$1]]已经从[[Special:Watchlist|侬个监控页面]]里向拿脱。',
-'watch' => '监控',
+'watch' => '关注',
 'watchthispage' => '监控该只页面',
-'unwatch' => '弗要监控',
+'unwatch' => '弗关注',
 'unwatchthispage' => '停止监控',
 'notanarticle' => '弗是內容頁',
-'watchlist-details' => 'å¼\97å\8c\85æ\8b¬è®¨è®ºé¡µï¼\8cæ\9c\89 $1 é¡µå\9e\83æ\8b\89侬ç\9b\91æ\8e§å\88\97表é«\98头。',
+'watchlist-details' => 'å¼\97å\8c\85æ\8b¬è®¨è®ºé¡µï¼\8cæ\9c\89 $1 é¡µå¾\95你侬å\85³æ³¨è¡¨é\87\8cå\90\91。',
 'watchlistcontains' => '倷个监控列表包括{{PLURAL:$1|1|$1}}只页面。',
-'wlshowlast' => '显示上 $1 个钟头 $2 日 $3',
+'wlshowlast' => '显示上 $1 个钟头 $2 日 $3',
 'watchlist-options' => '监控列表选项',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -1389,7 +1480,7 @@ $1",
 
 # Undelete
 'undeletepage' => '查看搭仔恢复删脱个页面',
-'viewdeletedpage' => '望望删脱个页面',
+'viewdeletedpage' => '望望删脱个页面',
 'undeletelink' => '查看/恢复',
 'undeleteviewlink' => '望',
 'undeletereset' => '轉設',
@@ -1406,30 +1497,30 @@ $1",
 'contributions-title' => '$1个贡献',
 'mycontris' => '我个贡献',
 'contribsub2' => '$1个贡献($2)',
-'uctop' => '(顶浪)',
-'month' => '从箇个号头 (或再早):',
-'year' => '从箇年 (或再早):',
+'uctop' => '(此垡)',
+'month' => '从箇月起 (要勿还要早):',
+'year' => '从箇年起 (要勿还要早):',
 
-'sp-contributions-newbies' => '显示新用户个贡献',
+'sp-contributions-newbies' => '显示新用户个贡献',
 'sp-contributions-blocklog' => '查封记录',
 'sp-contributions-talk' => '討論',
-'sp-contributions-search' => '搜贡献记录',
-'sp-contributions-username' => 'IP地址用户名:',
-'sp-contributions-submit' => '寻',
+'sp-contributions-search' => '搜贡献记录',
+'sp-contributions-username' => 'IP地址要勿用户名:',
+'sp-contributions-submit' => '寻',
 
 # What links here
-'whatlinkshere' => '链进来点啥',
+'whatlinkshere' => '有啥链到箇里',
 'whatlinkshere-title' => '链接到“$1”个页面',
 'whatlinkshere-page' => '页面:',
-'linkshere' => '下头眼页面链接到[[:$1]]:',
-'nolinkshere' => "å\91\92æ\8b¨é¡µé\9d¢é\93¾æ\8e¥到 '''[[:$1]]'''。",
-'isredirect' => '重定向页面',
+'linkshere' => '下头个页链到[[:$1]]:',
+'nolinkshere' => "å\91\92æ\9c\89页é\93¾到 '''[[:$1]]'''。",
+'isredirect' => '转戳页',
 'istemplate' => '包含',
 'isimage' => '文件鏈接',
 'whatlinkshere-prev' => '前$1个',
 'whatlinkshere-next' => '后$1个',
-'whatlinkshere-links' => '←链',
-'whatlinkshere-hideredirs' => '$1重定向',
+'whatlinkshere-links' => '←链',
+'whatlinkshere-hideredirs' => '$1转戳',
 'whatlinkshere-hidetrans' => '$1包含',
 'whatlinkshere-hidelinks' => '$1链接',
 'whatlinkshere-filters' => '过滤器',
@@ -1441,19 +1532,19 @@ $1",
 'ipbreasonotherlist' => '其它原因',
 'ipbsubmit' => '封杀该个用户',
 'ipbother' => '其它时间:',
-'ipboptions' => '2个钟头:2 hours,1日天:1 day,3日天:3 days,1个礼拜:1 week,2个礼拜:2 weeks,1个号头:1 month,3个号头:3 months,6个号头:6 months,1年:1 year,永久:infinite',
+'ipboptions' => '2个钟头:2 hours,1日:1 day,3日:3 days,1个礼拜:1 week,2个礼拜:2 weeks,1个月日:1 month,3个月日:3 months,6个月日:6 months,1年:1 year,老世:infinite',
 'badipaddress' => '无效 IP 地址',
-'ipblocklist' => '封哉個用戶',
+'ipblocklist' => '封脱个用户',
 'infiniteblock' => '永远',
 'blocklink' => '封禁',
 'unblocklink' => '解封',
-'change-blocklink' => 'æ\9b´æ\94¹封禁',
+'change-blocklink' => 'æ\94¹å\8f\98封禁',
 'contribslink' => '贡献',
 'blocklogpage' => '封禁日志',
-'blocklogentry' => 'â\80\9c[[$1]]â\80\9dæ\8b¨æ\9f¥å°\81æ\8b\89许ï¼\8cç»\88止辰å\85\89为$2 $3',
+'blocklogentry' => 'â\80\9c[[$1]]â\80\9dæ\9f¥å°\81å¾\95é\87\8cï¼\8c$2 $3å\88°æ\9c\9f',
 'blocklogtext' => '箇是用戶封搭解封操作個記錄。自動封個IP地址弗排。到[[Special:BlockList|IP 封表]]裏望目前生效個封表。',
 'unblocklogentry' => '$1已经拨解封',
-'block-log-flags-nocreate' => 'å¼\80æ\88·å·²ç»\8fæ\8b¨ç¦\81ç\94¨',
+'block-log-flags-nocreate' => '建账å\8f·ç¦\81ç\94¨å\93\89',
 'proxyblocksuccess' => '好哉。',
 
 # Developer tools
@@ -1494,7 +1585,7 @@ $1",
 但是由于新标题下已经有对话页存在,所以对话页无法移动。请手工合并两只页面。',
 'movedto' => '移动到',
 'movetalk' => '移动相关讨论页',
-'movelogpage' => '捅荡记录',
+'movelogpage' => '移个记录',
 'movelogpagetext' => '下底是拨拉捅荡个页面列表。',
 'movereason' => '理由:',
 'revertmove' => '恢复',
@@ -1502,7 +1593,7 @@ $1",
 'delete_and_move_confirm' => '对哉,删脱该只页面',
 
 # Export
-'export' => '导出页面',
+'export' => '页导出',
 
 # Namespace 8 related
 'allmessages' => '系统讯息',
@@ -1517,63 +1608,65 @@ $1",
 'filemissing' => '文件寻弗着哉',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => '侬个用户页',
-'tooltip-pt-mytalk' => '侬个讨论页',
-'tooltip-pt-preferences' => '我个所欢喜',
+'tooltip-pt-userpage' => '你侬个ç\94¨æ\88·é¡µ',
+'tooltip-pt-mytalk' => '你侬个讨论页',
+'tooltip-pt-preferences' => '我欢喜个',
 'tooltip-pt-watchlist' => '监控修改页面列表',
-'tooltip-pt-mycontris' => '侬个贡献列表',
-'tooltip-pt-login' => '鼓励大家登录ï¼\8cä¸\8dè¿\87å\80\92ä¹\9få¼\97æ\98¯æ\9d¿å®\9aè¦\81个ã\80\82',
+'tooltip-pt-mycontris' => '你侬个贡ç\8c®å\88\97表',
+'tooltip-pt-login' => '鼓励大家登录è¿\9bæ\9d¥ï¼\8cä¸\8dè¿\87ä¹\9få¼\97æ\98¯æ\9d¿å®\9aè¦\81æ±\82',
 'tooltip-pt-anonlogin' => '鼓励登录,必过倒也弗是必须个。',
 'tooltip-pt-logout' => '登出',
 'tooltip-ca-talk' => '讨论内容页',
-'tooltip-ca-edit' => '箇只页面侬可以编辑。请垃拉保存前头先预览。',
-'tooltip-ca-addsection' => '开始一只新段落',
-'tooltip-ca-viewsource' => '该只页面拨保护勒浪,必过倷可以查看源码。',
-'tooltip-ca-history' => '该只页面老早个版本。',
-'tooltip-ca-protect' => '保护该只页面',
-'tooltip-ca-delete' => '删脱该只页面',
-'tooltip-ca-move' => '移动该只页面',
-'tooltip-ca-watch' => '拿箇只页面加到侬个监控列表里向',
-'tooltip-ca-unwatch' => '拿箇只页面从监视列表里删脱',
+'tooltip-ca-edit' => '箇页你侬好编。保存之前望望相起。',
+'tooltip-ca-addsection' => '开始新段',
+'tooltip-ca-viewsource' => '箇页受保,你侬好望源代码',
+'tooltip-ca-history' => '箇页以早个版本',
+'tooltip-ca-protect' => '保护箇页',
+'tooltip-ca-delete' => '删脱箇页',
+'tooltip-ca-move' => '移箇页',
+'tooltip-ca-watch' => '畀箇页加进你侬个关注表里',
+'tooltip-ca-unwatch' => '畀箇页从关注表里删脱',
 'tooltip-search' => '搜寻{{SITENAME}}',
 'tooltip-search-go' => '转到页本确切名称,如果存在',
-'tooltip-search-fulltext' => '寻包含箇星文本个页面',
+'tooltip-search-fulltext' => '寻包含箇星文本个页面',
 'tooltip-p-logo' => '封面',
-'tooltip-n-mainpage' => '进入封面',
-'tooltip-n-mainpage-description' => '翻到簿面',
-'tooltip-n-portal' => '关于本计划,好做眼啥,应该哪能做法子',
+'tooltip-n-mainpage' => '翻到封面',
+'tooltip-n-mainpage-description' => '翻到面',
+'tooltip-n-portal' => '有关箇计划,啥好做,应该哪能做',
 'tooltip-n-currentevents' => '查寻当前事件个背景信息',
-'tooltip-n-recentchanges' => '列出近段辰光个改动',
-'tooltip-n-randompage' => '随机打开只页面',
+'tooltip-n-recentchanges' => '列出wiki里箇阶段个变化',
+'tooltip-n-randompage' => '打开随机页面',
 'tooltip-n-help' => '寻求帮助',
-'tooltip-t-whatlinkshere' => '列出所有与此页相链个页面',
-'tooltip-t-recentchangeslinked' => '所有从本页链接出去个页面个最近改动',
+'tooltip-t-whatlinkshere' => '列出全部搭箇页链个页',
+'tooltip-t-recentchangeslinked' => '箇页链出去个全部页箇阶段变化',
 'tooltip-feed-rss' => '订阅本页',
 'tooltip-feed-atom' => '此页个Atom 订阅',
 'tooltip-t-contributions' => '查看箇位用户个贡献',
-'tooltip-t-emailuser' => '发封信拨该个用户',
+'tooltip-t-emailuser' => '发电子信畀箇个用户',
 'tooltip-t-upload' => '上传文件',
-'tooltip-t-specialpages' => '所有特殊页面列表',
-'tooltip-t-print' => '箇只页面个打印版',
-'tooltip-t-permalink' => '迭只页面修订版个永久链接',
-'tooltip-ca-nstab-main' => 'æ\9f¥ç\9c\8b内容页',
+'tooltip-t-specialpages' => '全部特殊页列表',
+'tooltip-t-print' => '箇个打印版',
+'tooltip-t-permalink' => '箇页当前修订版个老世链接',
+'tooltip-ca-nstab-main' => 'æ\9c\9b内容页',
 'tooltip-ca-nstab-user' => '查看用户页',
 'tooltip-ca-nstab-media' => '查看媒体页',
-'tooltip-ca-nstab-special' => '该个是只特殊页面,倷弗好编辑俚',
-'tooltip-ca-nstab-project' => 'æ\9f¥ç\9c\8b项目页',
-'tooltip-ca-nstab-image' => 'æ\9f¥ç\9c\8bå\9b¾ç\89\87页',
+'tooltip-ca-nstab-special' => '箇是特殊页,你侬呒处编',
+'tooltip-ca-nstab-project' => 'æ\9c\9b项目页',
+'tooltip-ca-nstab-image' => 'æ\9c\9bæ\96\87件页',
 'tooltip-ca-nstab-mediawiki' => '查看系统讯息',
-'tooltip-ca-nstab-template' => 'æ\9f¥ç\9c\8b模板',
+'tooltip-ca-nstab-template' => 'æ\9c\9b模板',
 'tooltip-ca-nstab-help' => '查看帮忙页面',
-'tooltip-ca-nstab-category' => 'æ\9f¥ç\9c\8bå\88\86类页é\9d¢',
-'tooltip-minoredit' => 'æ\8b¿è¯¥è¶\9fç¼\96è¾\91æ \87è®°æ\88\90å°\8fæ\94¹å\8a¨',
-'tooltip-save' => '保存倷个改变',
-'tooltip-preview' => '预览倷个改变,请倷勒拉保存前头用用俚!',
-'tooltip-diff' => '显示倷对文章所作个改变',
+'tooltip-ca-nstab-category' => 'æ\9c\9bå\88\86类页',
+'tooltip-minoredit' => 'æ \87ä½\9cå°\8fç¼\96å\86\99',
+'tooltip-save' => '保存你侬个修改',
+'tooltip-preview' => '望望相你侬个修改,保存之前用!',
+'tooltip-diff' => '显示你侬对文本个修改',
 'tooltip-compareselectedversions' => '查看本页面两只选定个修订版个差异。',
-'tooltip-watch' => '拿搿只页面加到倷监控列表里向去',
+'tooltip-watch' => '畀箇页加到你侬个关注表里',
 'tooltip-rollback' => '揿一记“回转”就回退到上一位贡献者个编辑状态',
 'tooltip-undo' => '“撤销”可以恢复该编辑并且垃拉预览模式下头打开编辑表单。渠允许垃拉摘要里向说明原因。',
+'tooltip-summary' => '打进短摘要',
+'tooltip-iwiki' => '̩$1 - $2',
 
 # Attribution
 'anonymous' => '{{SITENAME}}浪个匿名用户',
@@ -1582,7 +1675,7 @@ $1",
 'deletedrevision' => '拨删脱个旧修订 $1',
 
 # Browsing diffs
-'previousdiff' => '←上一版',
+'previousdiff' => '←版',
 'nextdiff' => '新版→',
 
 # Media information
@@ -1662,6 +1755,28 @@ Variants for Chinese language
 'confirmemail_success' => '倷个电子邮箱地址已经通过确认哉。乃么倷好登录,享受倪维基百科哉。',
 'confirmemail_loggedin' => '倷个电子邮件地址已经拨确认哉。',
 'confirmemail_subject' => '{{SITENAME}}电子邮件地址确认',
+'confirmemail_body' => '用IP地址$1嗰人(呒数是你侬),徕translatewiki.net里一个账号“$2”建起,用你侬个电子信箱地址。
+
+确认记箇账号是弗是你侬嘅,激活translatewiki.net里嗰电子信功能。用浏览器打开下向嗰链接:
+
+$3
+
+假使你侬*朆*注册过箇账号,揿下向嗰链接取消电子信确认:
+
+$5
+
+确认码会到$4过期。',
+'confirmemail_body_changed' => '用IP地址$1嗰人,(呒数是你侬)徕{{SITENAME}}里一个账号“$2”建起,用你侬个电子信箱地址。
+
+确认记箇账号是弗是你侬嘅,激活{{SITENAME}}里嗰电子信功能。用浏览器打开下向嗰链接:
+
+$3
+
+假使你侬*朆*注册过箇账号,揿下向嗰链接取消电子信确认:
+
+$5
+
+确认码会到$4过期。',
 
 # Scary transclusion
 'scarytranscludetoolong' => '[对呒起,URL太长了]',
@@ -1697,15 +1812,19 @@ Variants for Chinese language
 'watchlistedit-normal-title' => '编辑监视列表',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'æ\9f¥ç\9c\8bæ\90­ç\95\8c个修改',
-'watchlisttools-edit' => 'æ\9f¥ç\9c\8b并ç¼\96è¾\91ç\9b\91æ\8e§å\88\97表',
-'watchlisttools-raw' => '编辑原始监视列表',
+'watchlisttools-view' => 'æ\9c\9bç\9b¸å\85³修改',
+'watchlisttools-edit' => 'æ\9c\9bæ\90­ç¼\96å\85³æ³¨表',
+'watchlisttools-raw' => '编写原始关注表',
 
 # Special:Version
 'version' => '版本',
 
 # Special:SpecialPages
-'specialpages' => '特殊页面',
+'specialpages' => '特殊页',
+
+# Special:Tags
+'tags-active-yes' => '好',
+'tags-active-no' => '弗',
 
 # Database error messages
 'dberr-info-hidden' => '(數據庫服務器連弗上)',
index 448785e..0a90da4 100644 (file)
@@ -658,6 +658,7 @@ $2',
 'userlogin-resetpassword-link' => 'צוריקשטעלן אײַער פאַסווארט',
 'helplogin-url' => 'Help:אריינלאגירן',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|הילף מיט אריינלאגירן]]',
+'userlogin-createanother' => 'שאפֿן נאך א קאנטע',
 'createacct-join' => 'גיט ארײַן אײַער אינפֿארמאציע אונטן.',
 'createacct-another-join' => 'ארײַנגעבן דער נײַער קאנטעס אינפארמאציע אונטן.',
 'createacct-emailrequired' => 'בליצפּאָסט אַדרעס',
@@ -1375,6 +1376,9 @@ $1",
 'recentchangesdays-max' => 'מאַקסימום $1 {{PLURAL:$1|טאָג|טעג}}',
 'recentchangescount' => 'די צאָל רעדאַקטירונגען צו ווײַזן גרונטלעך:',
 'prefs-help-recentchangescount' => 'כולל לעצטע ענדערונגען, בלאַט היסטאָריעס, און לאָגביכער.',
+'prefs-help-watchlist-token2' => 'דאס איז דער געהיימער שליסל צום וועבפֿיד פון אײַער אויפֿפאסונג ליסטע.
+יעדער וואס ווייסט אים וועט קענען לייענען אײַער אויפֿפאסונג ליסטע; טוט אים נישט טיילן.
+[[Special:ResetTokens|קליקט דא ווען איר דארפט אים צוריקשטעלן]].',
 'savedprefs' => 'אייערע פרעפערענצן איז אפגעהיטן געווארן.',
 'timezonelegend' => 'צײַט זאנע:',
 'localtime' => 'לאקאלע צייט:',
@@ -2352,10 +2356,12 @@ $UNWATCHURL
 'deleteotherreason' => 'אנדער/נאך אן אורזאך:',
 'deletereasonotherlist' => 'אנדער אורזאך',
 'deletereason-dropdown' => '* געוויינטלעכע אויסמעקן אורזאכן
+** ספאַם
 ** פֿארלאנג פֿון שרייבער
 ** קאפירעכט ברעכונג
 ** וואנדאליזם
-** נישט יידיש',
+** נישט יידיש
+** צעבראכענע ווייטערפירונג',
 'delete-edit-reasonlist' => 'רעדאַקטירן די אויסמעקן סיבות',
 'delete-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אזעלכע בלעטער איז באַגרענעצט געווארן בכדי צו פֿאַרמײַדן א צופֿעליגע פֿאַרשטערונג פֿון  {{SITENAME}}.',
 'delete-warning-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אים קען פֿאַרשטערן דאַטנבאַזע אפעראַציעס פֿון {{SITENAME}}; זײַט פֿארזיכטיג איידער איר מעקט אויס.',
@@ -2507,7 +2513,7 @@ $1',
 'contributions' => '{{GENDER:$1|באניצער}} בײַשטײַערונגען',
 'contributions-title' => 'בײַשטײַערונגען פֿון באַניצער $1',
 'mycontris' => 'בײַשטײַערונגען',
-'contribsub2' => '×\95×\95×¢×\92×\9f $1 ($2)',
+'contribsub2' => 'פֿ×\90ַר {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'נישט געטראפן קיין ענדערונגען צוזאמעגעפאסט מיט די קריטעריעס.',
 'uctop' => '(לויפֿיק)',
 'month' => 'ביז חודש:',
index 01de748..6682da4 100644 (file)
@@ -361,56 +361,56 @@ $bookstoreList = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => '链接下划线:',
-'tog-justify' => '段落对齐',
-'tog-hideminor' => '在最近更改中隐藏小编辑',
-'tog-hidepatrolled' => '在最近更改中隐藏已巡查编辑',
-'tog-newpageshidepatrolled' => '在新页面列表中隐藏已巡查页面',
+'tog-justify' => '对齐段落',
+'tog-hideminor' => '隐藏最近更改中的小编辑',
+'tog-hidepatrolled' => '隐藏最近更改中的已巡查编辑',
+'tog-newpageshidepatrolled' => '隐藏新页面列表中的已巡查页面',
 'tog-extendwatchlist' => '扩大监视列表以显示所有更改而不仅是最近更改',
-'tog-usenewrc' => 'æ ¹æ\8d®é¡µé\9d¢å\88\86ç»\84æ\9c\80è¿\91æ\9b´æ\94¹å\92\8cç\9b\91è§\86å\88\97表',
-'tog-numberheadings' => '标题自动编号',
+'tog-usenewrc' => 'æ\8c\89页é\9d¢ç»\84å\90\88æ\9c\80è¿\91æ\9b´æ\94¹å\92\8cç\9b\91è§\86å\88\97表中ç\9a\84æ\9b´æ\94¹',
+'tog-numberheadings' => '自动编号标题',
 'tog-showtoolbar' => '显示编辑工具条',
-'tog-editondblclick' => '双击编辑页面',
+'tog-editondblclick' => '双击编辑页面',
 'tog-editsection' => '启用[编辑]链接编辑段落',
 'tog-editsectiononrightclick' => '启用右击段落标题编辑段落',
 'tog-showtoc' => '显示目录(对于有多于3个标题的页面)',
-'tog-rememberpassword' => '在该浏览器保存我的登录状态(最长$1日)',
-'tog-watchcreations' => '添加我创建的页面和上传的文件至我的监视列表',
+'tog-rememberpassword' => '在该浏览器记住我的登录状态(最长$1天)',
+'tog-watchcreations' => '添加我创建的页面和上传的文件至我的监视列表',
 'tog-watchdefault' => '添加我编辑的页面和文件至我的监视列表',
-'tog-watchmoves' => '将我移动的页面和文件添加到我的监视列表',
+'tog-watchmoves' => '添加我移动的页面和文件至我的监视列表',
 'tog-watchdeletion' => '添加我删除的页面和文件至我的监视列表',
-'tog-minordefault' => '默认标记编辑为小编辑',
+'tog-minordefault' => '默认标记所有编辑为小编辑',
 'tog-previewontop' => '在编辑框上方显示预览',
 'tog-previewonfirst' => '首次编辑时显示预览',
 'tog-nocache' => '停用浏览器页面缓存',
 'tog-enotifwatchlistpages' => '当我的监视列表中的页面或文件更改时发送电子邮件通知我',
-'tog-enotifusertalkpages' => '当我的讨论页更改时发送电子邮件通知我',
-'tog-enotifminoredits' => '当页面和文件有小编辑时发送电子邮件通知我',
+'tog-enotifusertalkpages' => '当我的用户讨论页面更改时发送电子邮件通知我',
+'tog-enotifminoredits' => '当我的监视列表中的页面和文件有小编辑时也发送电子邮件通知我',
 'tog-enotifrevealaddr' => '在通知电子邮件中显示我的电子邮件地址',
 'tog-shownumberswatching' => '显示监视用户数',
 'tog-oldsig' => '当前签名:',
-'tog-fancysig' => '将签名视为维基代码(不自动生成链接)',
-'tog-uselivepreview' => '使用实时预览(实验功能)',
+'tog-fancysig' => '将签名视为维基文本(不自动生成链接)',
+'tog-uselivepreview' => '使用实时预览(实验)',
 'tog-forceeditsummary' => '未输入编辑摘要时提醒我',
-'tog-watchlisthideown' => '在监视列表中隐藏我的编辑',
-'tog-watchlisthidebots' => '在监视列表中隐藏机器人的编辑',
-'tog-watchlisthideminor' => '在监视列表中隐藏小编辑',
-'tog-watchlisthideliu' => '在监视列表中隐藏登录用户',
-'tog-watchlisthideanons' => '在监视列表中隐藏匿名用户',
-'tog-watchlisthidepatrolled' => '在监视列表中隐藏已巡查的编辑',
-'tog-ccmeonemails' => '把我给其他用户发送的电子邮件的副本发送给我',
-'tog-diffonly' => '不在版本差异下面显示页面内容',
+'tog-watchlisthideown' => '隐藏监视列表中的我的编辑',
+'tog-watchlisthidebots' => '隐藏监视列表中的机器人编辑',
+'tog-watchlisthideminor' => '隐藏监视列表中的小编辑',
+'tog-watchlisthideliu' => '隐藏监视列表中的登录用户的编辑',
+'tog-watchlisthideanons' => '隐藏监视列表中的匿名用户的编辑',
+'tog-watchlisthidepatrolled' => '隐藏监视列表中的已巡查编辑',
+'tog-ccmeonemails' => '给我发送我发送给其他用户的电子邮件的副本',
+'tog-diffonly' => '不在差异下面显示页面内容',
 'tog-showhiddencats' => '显示隐藏分类',
 'tog-noconvertlink' => '停用链接文字转换',
 'tog-norollbackdiff' => '执行回退后不显示差异',
-'tog-useeditwarning' => 'å¦\82å\9c¨æ\9b´æ\94¹æ\9cªä¿\9då­\98æ\97¶ç¦»å¼\80页é\9d¢ï¼\8cå\88\99å\8f\91å\87ºè­¦å\91\8a',
+'tog-useeditwarning' => 'å½\93æ\88\91离å¼\80æ\9c\89æ\9cªä¿\9då­\98æ\9b´æ\94¹ç\9a\84ç¼\96è¾\91页é\9d¢æ\97¶æ\8f\90é\86\92æ\88\91',
 'tog-prefershttps' => '登录时始终使用安全连接',
 
-'underline-always' => '总是使用',
-'underline-never' => '从不使用',
+'underline-always' => '始终',
+'underline-never' => '从不',
 'underline-default' => '皮肤或浏览器默认设置',
 
 # Font style option in Special:Preferences
-'editfont-style' => '编辑区中的字体样式:',
+'editfont-style' => '编辑区字体样式:',
 'editfont-default' => '浏览器默认',
 'editfont-monospace' => '等宽字体',
 'editfont-sansserif' => '无衬线字体',
@@ -485,27 +485,27 @@ $messages = array(
 'category_header' => '分类“$1”中的页面',
 'subcategories' => '子分类',
 'category-media-header' => '分类“$1”中的媒体文件',
-'category-empty' => "''本分类尚未包含任何页面或媒体文件。''",
+'category-empty' => "''本分类目前未包含页面或媒体文件。''",
 'hidden-categories' => '$1个隐藏分类',
 'hidden-category-category' => '隐藏分类',
-'category-subcat-count' => '{{PLURAL:$2|æ\9c¬å\88\86ç±»å\8fªæ\9c\89ä¸\8bå\88\97ä¸\80个å­\90å\88\86ç±»ã\80\82\9c¬å\88\86ç±»å\8c\85å\90«ä¸\8bå\88\97$1个å­\90å\88\86ç±»ï¼\8cå\85±$2个子分类。}}',
-'category-subcat-count-limited' => '本分类包含下列{{PLURAL:$1|subcategory|$1个子分类}}。',
-'category-article-count' => '{{PLURAL:$2|本分类只有下列一个页面。|本分类包含下列$1个页面,共有$2个页面。}}',
-'category-article-count-limited' => '本分类包含下列$1个页面。',
-'category-file-count' => '{{PLURAL:$2|æ\9c¬å\88\86ç±»å\8fªå\8c\85å\90«ä»¥ä¸\8bæ\96\87件ã\80\82|以ä¸\8b{{PLURAL:$1|æ\96\87件|$1个æ\96\87件}}å\9c¨æ\9c¬å\88\86类中,共$2个文件。}}',
-'category-file-count-limited' => '本分类包含下列$1个文件。',
+'category-subcat-count' => '{{PLURAL:$2|æ\9c¬å\88\86ç±»å\8fªæ\9c\89以ä¸\8bå­\90å\88\86ç±»ã\80\82\9c¬å\88\86ç±»æ\9c\89以ä¸\8b$1个å­\90å\88\86ç±»ï¼\8cå\85±æ\9c\89$2个子分类。}}',
+'category-subcat-count-limited' => '本分类有以下{{PLURAL:$1|子分类|$1个子分类}}。',
+'category-article-count' => '{{PLURAL:$2|本分类只包含以下页面。|以下{{PLURAL:$1|页面|$1个页面}}属于本分类,共$2个页面。}}',
+'category-article-count-limited' => '以下{{PLURAL:$1|页面|$1个页面}}属于当前分类。',
+'category-file-count' => '{{PLURAL:$2|æ\9c¬å\88\86ç±»å\8fªå\8c\85å\90«ä»¥ä¸\8bæ\96\87件ã\80\82|以ä¸\8b{{PLURAL:$1|æ\96\87件|$1个æ\96\87件}}å±\9eäº\8eæ\9c¬å\88\86ç±»,共$2个文件。}}',
+'category-file-count-limited' => '以下{{PLURAL:$1|文件|$1个文件}}属于当前分类。',
 'listingcontinuesabbrev' => '续',
-'index-category' => 'å\85\81许索å¼\95ç\9a\84页面',
-'noindex-category' => '禁止索引的页面',
-'broken-file-category' => '包含损坏的文件链接的页面',
+'index-category' => 'å\8f¯ç´¢å¼\95页面',
+'noindex-category' => '不可索引页面',
+'broken-file-category' => '有受损文件链接的页面',
 'categoryviewer-pagedlinks' => '($1)($2)',
 
 'about' => '关于',
 'article' => '内容页面',
 'newwindow' => '(在新窗口中打开)',
 'cancel' => '取消',
-'moredotdotdot' => '更多',
-'morenotlisted' => 'æ­¤å\88\97表æ\9cªå®\8cæ\88\90。',
+'moredotdotdot' => '更多...',
+'morenotlisted' => 'æ\9c¬å\88\97表ä¸\8då®\8cæ\95´。',
 'mypage' => '页面',
 'mytalk' => '讨论',
 'anontalk' => '该IP地址的讨论',
@@ -516,7 +516,7 @@ $messages = array(
 'qbfind' => '查找',
 'qbbrowse' => '浏览',
 'qbedit' => '编辑',
-'qbpageoptions' => '此页',
+'qbpageoptions' => '该页面',
 'qbmyoptions' => '我的页面',
 'qbspecialpages' => '特殊页面',
 'faq' => '常见问题',
@@ -529,7 +529,7 @@ $messages = array(
 'vector-action-protect' => '保护',
 'vector-action-undelete' => '恢复',
 'vector-action-unprotect' => '更改保护',
-'vector-simplesearch-preference' => '启用简化搜索栏(仅Vector皮肤)',
+'vector-simplesearch-preference' => '启用简化搜索栏(仅Vector皮肤)',
 'vector-view-create' => '创建',
 'vector-view-edit' => '编辑',
 'vector-view-history' => '查看历史',
@@ -537,20 +537,20 @@ $messages = array(
 'vector-view-viewsource' => '查看源代码',
 'actions' => '操作',
 'namespaces' => '名字空间',
-'variants' => '变',
+'variants' => '变',
 
 'navigation-heading' => '导航菜单',
 'errorpagetitle' => '出错',
-'returnto' => '返回$1。',
+'returnto' => '返回$1。',
 'tagline' => '来自{{SITENAME}}',
 'help' => '帮助',
 'search' => '搜索',
 'searchbutton' => '搜索',
-'go' => '进入',
-'searcharticle' => '提交',
+'go' => '前往',
+'searcharticle' => '前往',
 'history' => '页面历史',
 'history_short' => '历史',
-'updatedmarker' => 'æ\88\91ä¸\8a次访é\97®ä¹\8bå\90\8eç\9a\84æ\9b´æ\96°',
+'updatedmarker' => 'æ\9b´æ\96°äº\8eæ\88\91ä¸\8a次访é\97®å\90\8e',
 'printableversion' => '打印版本',
 'permalink' => '永久链接',
 'print' => '打印',
@@ -561,14 +561,14 @@ $messages = array(
 'create-this-page' => '创建本页',
 'delete' => '删除',
 'deletethispage' => '删除本页',
-'undeletethispage' => 'æ\92¤æ¶\88å\88 é\99¤æ­¤页',
-'undelete_short' => '恢复$1个被删除的编辑',
+'undeletethispage' => 'æ\81¢å¤\8dæ\9c¬页',
+'undelete_short' => '恢复$1个编辑',
 'viewdeleted_short' => '查看$1个被删除的编辑',
 'protect' => '保护',
 'protect_change' => '更改',
 'protectthispage' => '保护本页',
 'unprotect' => '更改保护',
-'unprotectthispage' => '更改本页面保护设置',
+'unprotectthispage' => '更改本页的保护',
 'newpage' => '新页面',
 'talkpage' => '讨论本页',
 'talkpagelinktext' => '讨论',
@@ -582,7 +582,7 @@ $messages = array(
 'userpage' => '查看用户页面',
 'projectpage' => '查看项目页面',
 'imagepage' => '查看文件页面',
-'mediawikipage' => '查看息页面',
+'mediawikipage' => '查看息页面',
 'templatepage' => '查看模板页面',
 'viewhelppage' => '查看帮助页面',
 'categorypage' => '查看分类页面',
@@ -591,24 +591,22 @@ $messages = array(
 'redirectedfrom' => '(重定向自$1)',
 'redirectpagesub' => '重定向页面',
 'lastmodifiedat' => '本页面最后修改于$1 $2。',
-'viewcount' => '此页é\9d¢å·²è¢«æµ\8fè§\88过$1次。',
+'viewcount' => 'æ\9c¬é¡µé\9d¢å·²ç»\8f被访é\97®过$1次。',
 'protectedpage' => '受保护页面',
 'jumpto' => '跳转至:',
 'jumptonavigation' => '导航',
 'jumptosearch' => '搜索',
-'view-pool-error' => '抱歉,服务器目前正超负荷运转。
-过多用户正尝试查看本页面。
-请稍等片刻后再次尝试访问本页面。
+'view-pool-error' => '对不起,服务器当前正超负荷运转。过多用户正尝试查看本页面。请在再次尝试访问本页面前稍等片刻。
 
 $1',
-'pool-timeout' => '等待锁超时',
+'pool-timeout' => '等待锁超时',
 'pool-queuefull' => '请求队列已满',
 'pool-errorunknown' => '未知错误',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '关于{{SITENAME}}',
 'aboutpage' => 'Project:关于',
-'copyright' => '本站文字内容依$1授权,特殊条款亦可能适用。',
+'copyright' => '除非另有声明,本网站内容采用$1授权。',
 'copyrightpage' => '{{ns:project}}:著作权',
 'currentevents' => '新闻动态',
 'currentevents-url' => 'Project:新闻动态',
@@ -618,22 +616,22 @@ $1',
 'helppage' => 'Help:目录',
 'mainpage' => '首页',
 'mainpage-description' => '首页',
-'policy-url' => 'Project:方针与指引',
+'policy-url' => 'Project:方针',
 'portal' => '社区专页',
 'portal-url' => 'Project:社区专页',
 'privacy' => '隐私权政策',
 'privacypage' => 'Project:隐私权政策',
 
 'badaccess' => '权限错误',
-'badaccess-group0' => '你被禁止执行你请求的操作。',
-'badaccess-groups' => '您刚才请求的操作只有{{PLURAL:$2|这个用户组|以下用户组}}中的用户才能使用: $1',
+'badaccess-group0' => '你被禁止执行你刚才请求的操作。',
+'badaccess-groups' => '你刚才请求的操作只对属于{{PLURAL:$2|该用户组|这些用户组}}的用户开放:$1',
 
-'versionrequired' => '需要版本为$1的MediaWiki',
-'versionrequiredtext' => '需要版本为$1的MediaWiki才能使用本页。
-请见[[Special:Version|版本页面]]。',
+'versionrequired' => '需要$1版本的MediaWiki',
+'versionrequiredtext' => '使用本页需要$1版本的MediaWiki。请见[[Special:Version|版本页面]]。',
 
 'ok' => '确定',
-'retrievedfrom' => '来自“$1”',
+'backlinksubtitle' => '←$1',
+'retrievedfrom' => '取自“$1”',
 'youhavenewmessages' => '你有$1($2)。',
 'newmessageslink' => '新信息',
 'newmessagesdifflink' => '最后更改',
@@ -656,13 +654,13 @@ $1',
 'thisisdeleted' => '查看或恢复$1?',
 'viewdeleted' => '查看$1?',
 'restorelink' => '$1个被删除的编辑',
-'feedlinks' => '订阅:',
-'feed-invalid' => '无效的订阅类型。',
-'feed-unavailable' => '不提供联合订阅源',
-'site-rss-feed' => '$1的RSS订阅',
-'site-atom-feed' => '$1的Atom订阅',
-'page-rss-feed' => '“$1”的RSS订阅',
-'page-atom-feed' => '“$1”的Atom订阅',
+'feedlinks' => 'Feed:',
+'feed-invalid' => '无效的订阅feed类型。',
+'feed-unavailable' => '不提供联合feed',
+'site-rss-feed' => '$1的RSS feed',
+'site-atom-feed' => '$1的Atom feed',
+'page-rss-feed' => '“$1”的RSS feed',
+'page-atom-feed' => '“$1”的Atom feed',
 'red-link-title' => '$1(页面不存在)',
 'sort-descending' => '降序',
 'sort-ascending' => '升序',
@@ -670,7 +668,7 @@ $1',
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => '页面',
 'nstab-user' => '用户页面',
-'nstab-media' => '媒体页面',
+'nstab-media' => '媒体文件页面',
 'nstab-special' => '特殊页面',
 'nstab-project' => '项目页面',
 'nstab-image' => '文件',
@@ -680,29 +678,27 @@ $1',
 'nstab-category' => '分类',
 
 # Main script and global functions
-'nosuchaction' => '这个命令不存在',
-'nosuchactiontext' => 'URL指定的命令无效。你可能误输入了URL地址,或者点击了错误的链接。这一错误亦有可能是由{{SITENAME}}所使用软件自身的错误导致的。',
-'nosuchspecialpage' => 'æ­¤ç\89¹æ®\8a页é\9d¢ä¸\8då­\98å\9c¨',
-'nospecialpagetext' => '<strong>您请求的特殊页面无效。</strong>
+'nosuchaction' => '无该命令',
+'nosuchactiontext' => 'URL指定的操作无效。你可能输入了错误的URL地址,或是点击了错误的链接。这也可能表明{{SITENAME}}使用的软件的存在漏洞(bug)。',
+'nosuchspecialpage' => 'æ\97 è¯¥ç\89¹æ®\8a页é\9d¢',
+'nospecialpagetext' => '<strong>你请求了一个无效的特殊页面。</strong>
 
-[[Special:SpecialPages|{{int:specialpages}}]]中列出了所有有效的特殊页面。',
+有效的特殊页面的列表可以在[[Special:SpecialPages|{{int:specialpages}}]]找到。',
 
 # General errors
-'error' => '错误',
+'error' => '出错',
 'databaseerror' => '数据库错误',
-'databaseerror-text' => '出现了一个数据库查询错误。
-这可能表明软件中存在bug。',
-'databaseerror-textcl' => '数据库查询错误。',
+'databaseerror-text' => '数据库查询出错。这可能表明软件中存在漏洞(bug)。',
+'databaseerror-textcl' => '数据库查询出错。',
 'databaseerror-query' => '查询:$1',
-'databaseerror-function' => 'å\8a\9fè\83½:$1',
-'databaseerror-error' => '错误:$1',
-'laggedslavemode' => "'''警告''':页面可能未包含最近的更新。",
+'databaseerror-function' => 'å\87½æ\95°:$1',
+'databaseerror-error' => '出错:$1',
+'laggedslavemode' => "'''警告:'''页面可能没有包含最近的更新。",
 'readonly' => '数据库被锁定',
-'enterlockreason' => '请输入锁定的原因,包括预计重新开放的时间',
-'readonlytext' => '数据库目前禁止输入新内容及更改,
-这很可能是由于数据库正在维修,完成后即可恢复。
+'enterlockreason' => '请输入锁定的原因(包括预计解锁的时间)',
+'readonlytext' => '数据库当前被锁定,不能添加新条目或进行其他修改,锁定可能是因为例行的数据库维护,完成后即可恢复正常。
 
-管理员有如下解释:$1',
+锁定数据库的管理员提供的解释:$1',
 'missing-article' => '数据库找不到预期的页面文字:“$1”$2。
 
 这通常是由于点击了链向旧有差异或历史的链接,而原有修订已被删除导致的。
@@ -787,11 +783,11 @@ $2',
 'yourpassword' => '密码:',
 'userlogin-yourpassword' => '密码',
 'userlogin-yourpassword-ph' => '请输入你的密码',
-'createacct-yourpassword-ph' => '请输入密码',
-'yourpasswordagain' => '再次输入密码:',
-'createacct-yourpasswordagain' => '确认密码',
+'createacct-yourpassword-ph' => '请输入一个密码',
+'yourpasswordagain' => '再次输入密码:',
+'createacct-yourpasswordagain' => '确认密码',
 'createacct-yourpasswordagain-ph' => '请再次输入密码',
-'remembermypassword' => '在该浏览器保存我的登录状态(最长$1日)',
+'remembermypassword' => '在该浏览器记住我的登录状态(最长$1天)',
 'userlogin-remembermypassword' => '记住我的登录状态',
 'userlogin-signwithsecure' => '使用安全连接',
 'yourdomainname' => '您的域名:',
@@ -816,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' => '电子邮件地址',
@@ -1042,7 +1041,7 @@ $2
 'loginreqlink' => '登录',
 'loginreqpagetext' => '您必须$1才能查看其它页面。',
 'accmailtitle' => '密码已寄出',
-'accmailtext' => "为[[User talk:$1|$1]]随机生成的密码已送至$2。登后可以在''[[Special:ChangePassword|更改密码]]''页面中修改。",
+'accmailtext' => "为[[User talk:$1|$1]]随机生成的密码已送至$2。登后可以在''[[Special:ChangePassword|更改密码]]''页面中修改。",
 'newarticle' => '(新页面)',
 'newarticletext' => '您进入了一个尚未创建的页面。
 要创建该页面,请在下面的编辑框中输入内容(详情参见[[{{MediaWiki:Helppage}}|帮助页]])。
@@ -1138,7 +1137,7 @@ $2
 它可能刚刚被删除。',
 'edit-conflict' => '编辑冲突。',
 'edit-no-change' => '因为没有文字更改,你的编辑已被忽略。',
-'postedit-confirmation' => '的编辑已保存。',
+'postedit-confirmation' => '的编辑已保存。',
 'edit-already-exists' => '不可以建立一个新页面。
 它已经存在。',
 'defaultmessagetext' => '默认消息文本',
@@ -1713,8 +1712,8 @@ $1",
 'recentchanges-label-bot' => '该编辑由机器人进行',
 'recentchanges-label-unpatrolled' => '该编辑尚未巡查',
 'rcnote' => "下面是过去'''$2'''天的最后'''$1'''个更改,截至$4 $5。",
-'rcnotefrom' => "下面是自'''$2'''起的更改(最多显示'''$1'''个)。",
-'rclistfrom' => '显示自$1起的新更改',
+'rcnotefrom' => "下面是'''$2'''之后的更改(最多显示'''$1'''个)。",
+'rclistfrom' => '显示$1之后的新更改',
 'rcshowhideminor' => '$1小编辑',
 'rcshowhidebots' => '$1机器人的编辑',
 'rcshowhideliu' => '$1登录用户的编辑',
@@ -2186,8 +2185,8 @@ $1',
 'protectedtitlesempty' => '在这些参数之下并无标题正在保护。',
 'listusers' => '用户列表',
 'listusers-editsonly' => '只显示有编辑的用户',
-'listusers-creationsort' => 'æ\8c\89建ç«\8b日期排序',
-'listusers-desc' => '降序排序',
+'listusers-creationsort' => 'æ\8c\89å\88\9b建日期排序',
+'listusers-desc' => '降序排序',
 'usereditcount' => '$1次编辑',
 'usercreated' => '{{GENDER:$3|创建}}于$1 $2',
 'newpages' => '新页面',
@@ -2273,7 +2272,7 @@ $1',
 'linksearch-error' => '通配符仅可在主机名称的开头使用。',
 
 # Special:ListUsers
-'listusersfrom' => '给定显示用户条件:',
+'listusersfrom' => '显示用户开始于:',
 'listusers-submit' => '显示',
 'listusers-noresult' => '找不到用户。',
 'listusers-blocked' => '(已封禁)',
@@ -2443,9 +2442,11 @@ $UNWATCHURL
 'deleteotherreason' => '其他/附加原因:',
 'deletereasonotherlist' => '其他原因',
 'deletereason-dropdown' => '*常见删除原因
-** 作者申请
+** 广告
+** 破坏行为
 ** 侵犯著作权
-** 破坏行为',
+** 作者申请
+** 损坏的重定向',
 'delete-edit-reasonlist' => '编辑删除原因',
 'delete-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。',
 'delete-warning-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。',
@@ -2597,7 +2598,7 @@ $1',
 'contributions' => '{{GENDER:$1|用户}}贡献',
 'contributions-title' => '$1的用户贡献',
 'mycontris' => '贡献',
-'contribsub2' => '$1的贡献($2)',
+'contribsub2' => '{{GENDER:$3|$1}}的贡献($2)',
 'nocontribs' => '没有找到符合特征的更改。',
 'uctop' => '(当前)',
 'month' => '截止月份:',
@@ -3063,6 +3064,7 @@ $2',
 'tooltip-undo' => '“撤销”可以恢复该编辑并在预览模式下打开编辑表单。它允许在摘要中加入原因。',
 'tooltip-preferences-save' => '保存系统设置',
 'tooltip-summary' => '请输入简短的摘要',
+'tooltip-iwiki' => '$1——$2',
 
 # Stylesheets
 'common.css' => '/* 此处的 CSS 将应用于所有的皮肤 */',
@@ -3967,7 +3969,10 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 '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个更改',
 
index ae384e9..3bc7673 100644 (file)
@@ -33,6 +33,7 @@
  * @author Liangent
  * @author Liflon
  * @author Littletung
+ * @author Liuxinyu970226
  * @author Mark85296341
  * @author Oapbtommy
  * @author Openerror
@@ -287,22 +288,22 @@ $messages = array(
 'tog-previewontop' => '在編輯框上方顯示預覽',
 'tog-previewonfirst' => '第一次編輯時顯示預覽',
 'tog-nocache' => '停用瀏覽器的頁面快取',
-'tog-enotifwatchlistpages' => '當我監視列表中的頁面或檔案有更動時發電子郵件給我',
-'tog-enotifusertalkpages' => '我的對話頁有更動時發電子郵件給我',
+'tog-enotifwatchlistpages' => '當我監視列表中的頁面或檔案有變更時,發送電子郵件通知我',
+'tog-enotifusertalkpages' => '我的對話頁有變更時,發送電子郵件通知我',
 'tog-enotifminoredits' => '頁面和檔案的小修改也發電子郵件給我',
-'tog-enotifrevealaddr' => '在通知電子郵件中顯示我的電子郵件位址',
+'tog-enotifrevealaddr' => '在通知件中顯示我的電子郵件位址',
 'tog-shownumberswatching' => '顯示正在監視的使用者數目',
 'tog-oldsig' => '原有簽名:',
-'tog-fancysig' => '將簽名視為維基文字(不會自動產生連結)',
+'tog-fancysig' => '將簽名視為圍記文字(Wikitext)(不會自動產生連結)',
 'tog-uselivepreview' => '使用即時預覽(實驗性)',
 'tog-forceeditsummary' => '未輸入編輯摘要時提醒我',
 'tog-watchlisthideown' => '監視列表中隱藏我的編輯',
 'tog-watchlisthidebots' => '監視列表中隱藏機器人的編輯',
 'tog-watchlisthideminor' => '監視列表中隱藏小修改',
-'tog-watchlisthideliu' => '監視列表中隱藏登入用戶的編輯',
-'tog-watchlisthideanons' => '監視列表中隱藏匿名用戶的編輯',
+'tog-watchlisthideliu' => '監視列表中隱藏已登入使用者的編輯',
+'tog-watchlisthideanons' => '監視列表中隱藏匿名使用者的編輯',
 'tog-watchlisthidepatrolled' => '監視清單中隱藏已巡查的編輯',
-'tog-ccmeonemails' => '當我寄電子郵件給其他用戶時,也寄一份副本到我的信箱',
+'tog-ccmeonemails' => '當我寄電子郵件給其他使用者時,也寄一份副本到我的信箱',
 'tog-diffonly' => '比對版本差異時下面不顯示頁面內容',
 'tog-showhiddencats' => '顯示隱藏分類',
 'tog-noconvertlink' => '不轉換連結標題',
@@ -531,18 +532,18 @@ $1',
 'badaccess-groups' => '您請求的操作只有{{PLURAL:$2|這個|這些}}用戶群組的用戶能使用:$1',
 
 'versionrequired' => '需要 MediaWiki $1 版',
-'versionrequiredtext' => '需要版本$1的 MediaWiki 才能使用此頁
-見[[Special:Version|版本頁]]。',
+'versionrequiredtext' => '需要版本 $1 的 MediaWiki 才能使用此頁面
+詳情請見[[Special:Version|版本頁]]。',
 
 'ok' => '確定',
 'retrievedfrom' => '取自「$1」',
 'youhavenewmessages' => '您有$1($2)。',
 'newmessageslink' => '新訊息',
-'newmessagesdifflink' => '最後更改',
-'youhavenewmessagesfromusers' => '你有來自{{PLURAL:$3|另一位用戶|$3位用戶}}的$1($2)。',
-'youhavenewmessagesmanyusers' => '你有來自多位用戶的$1( $2 )。',
+'newmessagesdifflink' => '最新變更',
+'youhavenewmessagesfromusers' => '你有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的$1($2)。',
+'youhavenewmessagesmanyusers' => '你有來自多位使用者的$1( $2 )。',
 'newmessageslinkplural' => '{{PLURAL:$1|一項新訊息|新訊息}}',
-'newmessagesdifflinkplural' => '最新{{PLURAL:$1|更改}}',
+'newmessagesdifflinkplural' => '最新{{PLURAL:$1|變更}}',
 'youhavenewmessagesmulti' => '您在 $1 有新訊息',
 'editsection' => '編輯',
 'editold' => '編輯',
@@ -645,7 +646,7 @@ $1',
 函數:$1<br />
 查詢:$2',
 'viewsource' => '檢視原始碼',
-'viewsource-title' => 'æ\9f¥ç\9c\8b$1ç\9a\84æº\90代碼',
+'viewsource-title' => '檢è¦\96 $1 ç\9a\84å\8e\9få§\8b碼',
 'actionthrottled' => '動作已壓制',
 'actionthrottledtext' => '基於反垃圾的考量,您現在於這段短時間之中限制去作這一個動作,而您已經超過這個上限。
 請在數分鐘後再嘗試。',
@@ -685,15 +686,15 @@ $2',
 
 請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器緩存。',
 'welcomeuser' => '歡迎,$1!',
-'welcomecreation-msg' => '您的賬號已經建立。
-ä¸\8dè¦\81å¿\98è¨\98設置[[Special:Preferences|{{SITENAME}}ç\9a\84å\80\8b人å\8f\83æ\95¸]]。',
-'yourname' => '用戶名:',
-'userlogin-yourname' => '用戶名',
-'userlogin-yourname-ph' => '輸入你的用戶名',
-'createacct-another-username-ph' => '輸入帳名稱',
+'welcomecreation-msg' => '您的帳號已建立。
+ä¸\8dè¦\81å¿\98è¨\98è®\8aæ\9b´æ\82¨ç\9a\84[[Special:Preferences| {{SITENAME}} ç\9a\84å\81\8f好設å®\9a]]。',
+'yourname' => '使用者名稱:',
+'userlogin-yourname' => '使用者名稱:',
+'userlogin-yourname-ph' => '輸入您的使用者名稱',
+'createacct-another-username-ph' => '輸入帳名稱',
 'yourpassword' => '您的密碼:',
 'userlogin-yourpassword' => '密碼',
-'userlogin-yourpassword-ph' => '輸入密碼',
+'userlogin-yourpassword-ph' => '輸入您的密碼',
 'createacct-yourpassword-ph' => '輸入密碼',
 'yourpasswordagain' => '再次輸入密碼:',
 'createacct-yourpasswordagain' => '確認密碼',
@@ -702,8 +703,8 @@ $2',
 'userlogin-remembermypassword' => '保持我的登入狀態',
 'userlogin-signwithsecure' => '使用安全連線',
 'yourdomainname' => '您的網域:',
-'password-change-forbidden' => '您不可更改此wiki上的密碼。',
-'externaldberror' => '這可能是由於驗證資料庫錯誤或您被禁止更新您的外部賬號。',
+'password-change-forbidden' => '您不可變更此圍記(Wiki)上的密碼。',
+'externaldberror' => '這可能是由於驗證資料庫錯誤,或是您被禁止更新您的外部帳號。',
 'login' => '登入',
 'nav-login-createaccount' => '登入/建立新帳號',
 'loginprompt' => '您必須允許瀏覽器紀錄 Cookie 才能成功登入 {{SITENAME}}。',
@@ -712,48 +713,51 @@ $2',
 'logout' => '登出',
 'userlogout' => '登出',
 'notloggedin' => '未登入',
-'userlogin-noaccount' => '沒有帳嗎?',
+'userlogin-noaccount' => '沒有帳嗎?',
 'userlogin-joinproject' => '參與 {{SITENAME}}',
 'nologin' => '您還沒有帳號嗎?$1。',
-'nologinlink' => '建立帳',
-'createaccount' => '建立帳',
+'nologinlink' => '建立帳',
+'createaccount' => '建立帳',
 'gotaccount' => '已經擁有帳號?$1。',
 'gotaccountlink' => '登入',
-'userlogin-resetlink' => '忘記了你的登錄信息?',
+'userlogin-resetlink' => '忘記了您的登入細節?',
 'userlogin-resetpassword-link' => '重設密碼',
 'helplogin-url' => 'Help:登入',
-'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入説明]]',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入幫助]]',
+'userlogin-loggedin' => '您已作為{{GENDER:$1|$1}}登錄。
+利用以下表單以作為另一賬戶登錄。',
+'userlogin-createanother' => '建立另一賬戶',
 'createacct-join' => '輸入您的基本資料:',
-'createacct-another-join' => '在下面輸入新帳戶的資訊。',
+'createacct-another-join' => '在下方輸入新帳號的資訊。',
 'createacct-emailrequired' => '電子郵件',
 'createacct-emailoptional' => '電子郵件(可選)',
-'createacct-email-ph' => '設置電郵地址',
-'createacct-another-email-ph' => '輸入電郵地址',
+'createacct-email-ph' => '設定信件位址',
+'createacct-another-email-ph' => '輸入信件位址',
 'createaccountmail' => '使用一個臨時的隨機密碼,並將它發送到指定的電子郵件地址',
 'createacct-realname' => '真實姓名(可選)',
 'createaccountreason' => '理由:',
 'createacct-reason' => '原因',
-'createacct-reason-ph' => '您為甚麼要創建另一個帳號',
+'createacct-reason-ph' => '您為什麼要建立另一個帳號',
 'createacct-captcha' => '安全驗證',
-'createacct-imgcaptcha-ph' => '輸入您在上面看到的字符',
-'createacct-submit' => '建立帳',
+'createacct-imgcaptcha-ph' => '輸入您在上方看到的文字',
+'createacct-submit' => '建立帳',
 'createacct-another-submit' => '建立另一個使用者帳號',
 'createacct-benefit-heading' => '{{SITENAME}}是由像您一樣的人建立。',
 'createacct-benefit-body1' => '{{PLURAL:$1|次編輯}}',
-'createacct-benefit-body2' => '{{PLURAL:$1|頁面}}',
-'createacct-benefit-body3' => '位最近{{PLURAL:$1|貢獻者}}',
-'badretype' => 'æ\82¨æ\89\80輸å\85¥ç\9a\84å¯\86碼並ä¸\8dç\9b¸å\90\8c。',
-'userexists' => '!您所輸入的用戶名稱已經存在,請另選一個名稱。',
+'createacct-benefit-body2' => '{{PLURAL:$1|頁面}}',
+'createacct-benefit-body3' => '位近期{{PLURAL:$1|貢獻者}}',
+'badretype' => 'æ\82¨æ\89\80輸å\85¥ç\9a\84å¯\86碼並ä¸\8d符å\90\88。',
+'userexists' => '您所輸入的使用者名稱已存在,請另選一個名稱。',
 'loginerror' => '登入錯誤',
-'createacct-error' => '帳戶創建錯誤',
+'createacct-error' => '帳號建立錯誤',
 'createaccounterror' => '無法建立帳號:$1',
 'nocookiesnew' => '已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。',
-'nocookieslogin' => '本站利用 Cookies 進行用戶登入,偵測到您已關閉 Cookies,請開啟它並重新登入。',
-'nocookiesfornew' => '這位用戶的賬戶未建立,我們不能確認它的來源。
-請肯定您已經開啟 cookies,重新載入後再試。',
-'noname' => '{{GENDER:|你|妳|你}}沒有輸入一個有效的用戶名。',
+'nocookieslogin' => '本站利用 Cookies 進行使用者登入,偵測到您已關閉 Cookies,請開啟它並重新登入。',
+'nocookiesfornew' => '這個使用者的帳號未建立,我們不能確認它的來源。
+請確認您已開啟 Cookie,重新載入後再試。',
+'noname' => '{{GENDER:|你|妳|你}}沒有輸入一個有效的使用者名稱。',
 'loginsuccesstitle' => '登入成功',
-'loginsuccess' => '{{GENDER:|你|妳|你}}正在以"$1"的身份在{{SITENAME}}登入。',
+'loginsuccess' => '{{GENDER:|你|妳|你}}正在以「$1」的身份在 {{SITENAME}} 登入。',
 'nosuchuser' => '找不到用戶 "$1"。
 用戶名稱是有大小寫區分的。
 檢查您的拼寫,或者用下面的表格[[Special:UserLogin/signup|建立一個新賬號]]。',
@@ -785,14 +789,14 @@ $2',
 'mailerror' => '發送郵件錯誤: $1',
 'acct_creation_throttle_hit' => '在這個wiki上的訪客利用您的IP地址在昨天創建了$1個賬戶,是在這段時間中的上限。
 結果利用這個IP地址的訪客在這段時間中不能創建更多的賬戶。',
-'emailauthenticated' => '您的電子郵件地址已經於$2 $3確認有效。',
+'emailauthenticated' => '您的電子郵件位址已於 $2 $3 確認有效。',
 'emailnotauthenticated' => '您的郵箱位址<strong>還沒被認証</strong>。以下功能將不會發送任何郵件。',
 'noemailprefs' => '在您的參數設置中指定一個電子郵件地址以使用此功能。',
-'emailconfirmlink' => '確èª\8dæ\82¨ç\9a\84é\83µç®±å\9c°址',
+'emailconfirmlink' => '確èª\8dæ\82¨ç\9a\84é\9b»å­\90é\83µä»¶ä½\8d址',
 'invalidemailaddress' => '郵箱地址格式不正確,請輸入正確的郵箱位址或清空該輸入框。',
-'cannotchangeemail' => 'æ\9c¬wikiä¸\8då\85\81許å°\8d賬æ\88¶ç\9a\84é\9b»é\83µå\9c°å\9d\80é\80²è¡\8cæ\9b´æ\94¹。',
+'cannotchangeemail' => 'æ­¤å\9c\8dè¨\98ï¼\88Wikiï¼\89ä¸\8då\85\81許å°\8d帳è\99\9fç\9a\84é\9b»å­\90é\83µä»¶ä½\8då\9d\80é\80²è¡\8cè®\8aæ\9b´。',
 'emaildisabled' => '此網站不能發送電子郵件。',
-'accountcreated' => '已建立賬戶',
+'accountcreated' => '已建立帳號',
 'accountcreatedtext' => '[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|討論]])的賬戶已經被建立。',
 'createaccount-title' => '在{{SITENAME}}中建立新賬戶',
 'createaccount-text' => '有人在{{SITENAME}}中利用您的電郵創建了一個名為 "$2" 的新賬戶($4),密碼是 "$3" 。您應該立即登入並更改密碼。
@@ -813,22 +817,22 @@ $2',
 'user-mail-no-body' => '試圖發送空的或主體不合理短的電子郵件。',
 
 # Change password dialog
-'resetpass' => '更改密碼',
+'resetpass' => '變更密碼',
 'resetpass_announce' => '您是透過一個臨時的發送到郵件中的代碼登入的。要完成登入,您必須在這裡設定一個新密碼:',
 'resetpass_text' => '<!-- 在此處加入文字 -->',
-'resetpass_header' => '更改賬戶密碼',
-'oldpassword' => '舊密碼:',
-'newpassword' => '新密碼:',
-'retypenew' => '確認密碼:',
+'resetpass_header' => '變更帳號密碼',
+'oldpassword' => '舊密碼',
+'newpassword' => '新密碼',
+'retypenew' => '確認密碼',
 'resetpass_submit' => '設定密碼並登入',
-'changepassword-success' => '您的密碼已經被成功更改!',
-'resetpass_forbidden' => '無法更改密碼',
+'changepassword-success' => '您的密碼已成功變更!',
+'resetpass_forbidden' => '無法變更密碼',
 'resetpass-no-info' => '您必須登入後直接進入這個頁面。',
-'resetpass-submit-loggedin' => '更改密碼',
+'resetpass-submit-loggedin' => '變更密碼',
 'resetpass-submit-cancel' => '取消',
 'resetpass-wrong-oldpass' => '無效的臨時或現有的密碼。
 您可能已成功地更改了您的密碼,或者已經請求一個新的臨時密碼。',
-'resetpass-temp-password' => '臨時密碼:',
+'resetpass-temp-password' => '臨時密碼',
 'resetpass-abort-generic' => '擴充元件已中止了更改密碼操作。',
 
 # Special:PasswordReset
@@ -836,14 +840,14 @@ $2',
 'passwordreset-text-one' => '完成此表格以重新設定您的密碼。',
 'passwordreset-text-many' => '{{PLURAL:$1|輸入其中一項以重新設定您的密碼。}}',
 'passwordreset-legend' => '重設密碼',
-'passwordreset-disabled' => '此維基上已禁止了重設密碼。',
-'passwordreset-emaildisabled' => '電子郵件功能在此 wiki 上已禁用。',
-'passwordreset-username' => '用戶名:',
+'passwordreset-disabled' => '此圍記(Wiki)已禁用重設密碼。',
+'passwordreset-emaildisabled' => '此圍記(Wiki)已禁用電子郵件功能。',
+'passwordreset-username' => '使用者名稱:',
 'passwordreset-domain' => '域名:',
-'passwordreset-capture' => 'æ\9f¥ç\9c\8bç\94\9fæ\88\90的電子郵件嗎?',
+'passwordreset-capture' => '檢è¦\96ç\94¢ç\94\9f的電子郵件嗎?',
 'passwordreset-capture-help' => '如果您選中此框,電子郵件(包括臨時密碼)將顯示,並發送給用戶。',
-'passwordreset-email' => '電郵地址:',
-'passwordreset-emailtitle' => '在{{SITENAME}}上的詳細息',
+'passwordreset-email' => '電子郵件位址:',
+'passwordreset-emailtitle' => '在{{SITENAME}}上的詳細息',
 'passwordreset-emailtext-ip' => '有人(可能是你,來自$1這個IP)要求重置{{SITENAME}}($4)的密碼。該用戶{{PLURAL:$3|是}}與以下電郵地址有關:
 
 $2
@@ -859,22 +863,22 @@ $2
 {{PLURAL:$3|這個臨時密碼|這些臨時密碼}}會在{{PLURAL:$5|一天|$5天}}到期。
 你應該現在登入並選擇一個新的密碼。如果不是你作出這個請求,又或你已經記
 起你原來的密碼,你可以忽略本信息並使用你原來的密碼。',
-'passwordreset-emailelement' => '用戶名:$1
+'passwordreset-emailelement' => '使用者名稱:$1
 臨時密碼:$2',
-'passwordreset-emailsent' => '已發送重置密碼電郵。',
-'passwordreset-emailsent-capture' => '重置密碼電子郵件已發送,並在下面顯示。',
-'passwordreset-emailerror-capture' => 'ç\94\9fæ\88\90ç\9a\84é\87\8dç½®å¯\86碼é\9b»å­\90é\83µä»¶å¦\82ä¸\8bæ\89\80示ï¼\8cä½\86ç\99¼é\80\81給{{GENDER:$2|ç\94¨æ\88}}失敗:$1',
+'passwordreset-emailsent' => '已發送重設密碼的電子郵件。',
+'passwordreset-emailsent-capture' => '已發送重設密碼的電子郵件,並在下面顯示。',
+'passwordreset-emailerror-capture' => 'ç\94¢ç\94\9fç\9a\84é\87\8d設å¯\86碼ç\9a\84é\9b»å­\90é\83µä»¶å¦\82ä¸\8bæ\89\80示ï¼\8cä½\86ç\99¼é\80\81給{{GENDER:$2|使ç\94¨è\80\85}}失敗:$1',
 
 # Special:ChangeEmail
-'changeemail' => '更改電郵地址',
-'changeemail-header' => '更改帳號電郵地址',
-'changeemail-text' => '填寫表格以修改您的電郵地址。您需要輸入您的密碼以確認此更改。',
-'changeemail-no-info' => '您必須登方可直接訪問此頁面。',
-'changeemail-oldemail' => 'ç\95¶å\89\8dé\9b»é\83µå\9c°址:',
-'changeemail-newemail' => '新電郵地址:',
+'changeemail' => '變更電子郵件位址',
+'changeemail-header' => '變更帳號的電子郵件位址',
+'changeemail-text' => '填寫表格以修改您的信件位址。您需要輸入密碼以確認此次變更。',
+'changeemail-no-info' => '您必須登方可直接訪問此頁面。',
+'changeemail-oldemail' => 'ç\9b®å\89\8dç\9a\84é\9b»å­\90é\83µä»¶ä½\8d址:',
+'changeemail-newemail' => '新的電子郵件位址:',
 'changeemail-none' => '(無)',
 'changeemail-password' => '您的{{SITENAME}}密碼:',
-'changeemail-submit' => '更改電郵',
+'changeemail-submit' => '變更電子郵件',
 'changeemail-cancel' => '取消',
 
 # Special:ResetTokens
@@ -997,9 +1001,9 @@ $2
 'userinvalidcssjstitle' => "'''警告:''' 不存在面板「$1」。
 注意自訂的 .css 和 .js 頁要使用小寫標題,例如,{{ns:user}}:Foo/vector.css 不同於 {{ns:user}}:Foo/Vector.css。",
 'updated' => '(已更新)',
-'note' => "'''注意:'''",
+'note' => "'''注意'''",
 'previewnote' => "'''請記住這只是預覽。'''
-您的更改尚未儲存!",
+您的變更尚未儲存!",
 'continue-editing' => '往編輯框',
 'previewconflict' => '這個預覽顯示了上面文字編輯區中的內容。它將在{{GENDER:|你|妳|你}}選擇保存後出現。',
 'session_fail_preview' => "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''
@@ -1014,7 +1018,7 @@ $2
 這種情況通常出現於使用含有很多臭蟲、以網絡為主的匿名代理服務的時候。",
 'edit_form_incomplete' => '編輯表單的某些部分沒有到達伺服器 ;請檢查您的編輯內容是否完整並再試一次。',
 'editing' => '編輯「$1」',
-'creating' => 'å\89µå»º$1',
+'creating' => '建ç«\8bã\80\8c$1ã\80\8d',
 'editingsection' => '編輯「$1」(段落)',
 'editingcomment' => '編輯「$1」(新段落)',
 'editconflict' => '編輯衝突:$1',
@@ -1024,7 +1028,7 @@ $2
 {{GENDER:|你|妳|你}}應當將{{GENDER:|你|妳|你}}所做的修改加入現有的內容中。
 '''只有'''在上面文字框中的內容會在{{GENDER:|你|妳|你}}點擊「{{int:savearticle}}」後被保存。",
 'yourtext' => '您的文字',
-'storedversion' => '已存修訂版本',
+'storedversion' => '已存修訂版本',
 'nonunicodebrowser' => "'''警告: 您的瀏覽器不兼容Unicode編碼。'''這裡有一個工作區將使您能安全地編輯頁面: 非ASCII字元將以十六進製編碼模式出現在編輯框中。",
 'editingold' => "'''警告:{{GENDER:|你|妳|你}}正在編輯的是本頁的舊版本。'''
 如果{{GENDER:|你|妳|你}}保存它的話,在本版本之後的任何修改都會遺失。",
@@ -1088,7 +1092,7 @@ $2
 'editwarning-warning' => '離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「編輯」部份裡關閉此警告。',
 
 # Content models
-'content-model-wikitext' => 'wiki語法',
+'content-model-wikitext' => '圍記文字(Wikitext)',
 'content-model-text' => '純文字',
 'content-model-javascript' => 'JavaScript',
 'content-model-css' => 'CSS',
@@ -1328,7 +1332,7 @@ $1",
 'search-section' => '(段落 $1)',
 'search-suggest' => '{{GENDER:|你|妳|你}}是不是要找:$1',
 'search-interwiki-caption' => '姊妹計劃',
-'search-interwiki-default' => '$1項結果:',
+'search-interwiki-default' => '$1 項結果:',
 'search-interwiki-more' => '(更多)',
 'search-relatedarticle' => '相關',
 'mwsuggest-disable' => '停用搜尋建議',
@@ -1348,7 +1352,7 @@ $1",
 'powersearch-togglelabel' => '核取:',
 'powersearch-toggleall' => '所有',
 'powersearch-togglenone' => '無',
-'search-external' => '外部搜',
+'search-external' => '外部搜',
 'searchdisabled' => '{{SITENAME}}由於性能方面的原因,全文搜索已被暫時停用。您可以暫時透過Google搜索。請留意他們的索引可能會過時。',
 'search-error' => '搜尋時發生錯誤:$1',
 
@@ -1358,31 +1362,31 @@ $1",
 'prefs-edits' => '編輯次數:',
 'prefsnologin' => '還未登入',
 'prefsnologintext' => '您必須先<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 登入]</span>才能設置個人參數。',
-'changepassword' => '更改密碼',
+'changepassword' => '變更密碼',
 'prefs-skin' => '外觀',
 'skin-preview' => '預覽',
 'datedefault' => '預設值',
-'prefs-beta' => 'Beta 特性',
+'prefs-beta' => 'Beta 功能',
 'prefs-datetime' => '日期和時間',
 'prefs-labs' => '實驗中的功能',
-'prefs-user-pages' => '用戶頁面',
-'prefs-personal' => '用戶資料',
-'prefs-rc' => '最近更改',
+'prefs-user-pages' => '使用者頁面',
+'prefs-personal' => '使用者概況表',
+'prefs-rc' => '近期變更',
 'prefs-watchlist' => '監視列表',
 'prefs-watchlist-days' => '監視列表中顯示的天數:',
 'prefs-watchlist-days-max' => '最多$1{{PLURAL:$1|天}}',
-'prefs-watchlist-edits' => 'æ\93´å±\95ç\9b£è¦\96å\88\97表中顯示æ\9b´æ\94¹æ¬¡æ\95¸上限:',
+'prefs-watchlist-edits' => 'æ\93´å\85\85ç\9b£è¦\96å\88\97表中顯示è®\8aæ\9b´æ¬¡æ\95¸ç\9a\84上限:',
 'prefs-watchlist-edits-max' => '最大數量:1000',
 'prefs-watchlist-token' => '監視列表密鑰:',
 'prefs-misc' => '雜項',
-'prefs-resetpass' => '更改密碼',
-'prefs-changeemail' => '更改電郵',
-'prefs-setemail' => '設置電郵地址',
-'prefs-email' => '電選項',
+'prefs-resetpass' => '變更密碼',
+'prefs-changeemail' => '變更電子郵件',
+'prefs-setemail' => '設定電子郵件位址',
+'prefs-email' => '電子郵件選項',
 'prefs-rendering' => '外觀',
 'saveprefs' => '儲存',
-'resetprefs' => '清除未保存的更改',
-'restoreprefs' => '恢復所有預設設定(所有部分)',
+'resetprefs' => '清除未儲存的變更',
+'restoreprefs' => '還原所有預設設定(所有部分)',
 'prefs-editing' => '編輯',
 'rows' => '行:',
 'columns' => '列:',
@@ -1390,13 +1394,13 @@ $1",
 'resultsperpage' => '每頁顯示連結數:',
 'stub-threshold' => '<a href="#" class="stub">短頁面連結</a>格式門檻值 (位元組):',
 'stub-threshold-disabled' => '已停用',
-'recentchangesdays' => '最近更改中的顯示日數:',
+'recentchangesdays' => '近期變更的顯示日數:',
 'recentchangesdays-max' => '最多$1{{PLURAL:$1|天}}',
 'recentchangescount' => '預設顯示的編輯數:',
 'prefs-help-recentchangescount' => '這個包括最近更改、頁面歷史以及日誌。',
 'prefs-help-watchlist-token2' => '這是一個秘密的密鑰,用於訂源您的監視列表。
 知道它的人將能夠讀取您的監視列表,所以您不應該分享它。[[Special:ResetTokens|如有需要重設此密鑰,請點擊這裡]]。',
-'savedprefs' => 'æ\82¨ç\9a\84å\80\8b人å\81\8f好設å®\9aå·²ç¶\93儲存。',
+'savedprefs' => 'æ\82¨ç\9a\84å\81\8f好設å®\9aå·²儲存。',
 'timezonelegend' => '時區:',
 'localtime' => '當地時間:',
 'timezoneuseserverdefault' => '使用預設($1)',
@@ -1414,7 +1418,7 @@ $1",
 'timezoneregion-europe' => '歐洲',
 'timezoneregion-indian' => '印度洋',
 'timezoneregion-pacific' => '太平洋',
-'allowemail' => '接受來自其他用戶的郵件',
+'allowemail' => '接受來自其他使用者的信件',
 'prefs-searchoptions' => '搜尋',
 'prefs-namespaces' => '頁面名稱空間',
 'defaultns' => '否則在這些名字空間搜尋:',
@@ -1426,8 +1430,8 @@ $1",
 'prefs-reset-intro' => '您可以利用這個頁面去重設您的參數設置到網站預設值。這個動作無法復原。',
 'prefs-emailconfirm-label' => '電子郵件確認:',
 'youremail' => '電子郵件:',
-'username' => '{{GENDER:$1|用戶名}}:',
-'uid' => '{{GENDER:$1|用戶ID}}:',
+'username' => '{{GENDER:$1|使用者名稱}}:',
+'uid' => '{{GENDER:$1|使用者 ID}}:',
 'prefs-memberingroups' => '{{PLURAL:$1|群組}}{{GENDER:$2|成員}}:',
 'prefs-registration' => '註冊時間:',
 'yourrealname' => '真實姓名:',
@@ -1472,17 +1476,17 @@ $1",
 'prefs-help-prefershttps' => '此選項將於您下次登入時生效。',
 
 # User preference: email validation using jQuery
-'email-address-validity-valid' => '電子郵件址有效',
-'email-address-validity-invalid' => '請提供一個有效的電子郵件址',
+'email-address-validity-valid' => '電子郵件址有效',
+'email-address-validity-invalid' => '請提供一個有效的電子郵件址',
 
 # User rights
-'userrights' => '用戶權限管理',
-'userrights-lookup-user' => '管理用戶群組',
-'userrights-user-editname' => '輸入用戶名:',
+'userrights' => '使用者權限管理',
+'userrights-lookup-user' => '管理使用者群組',
+'userrights-user-editname' => '輸入使用者名稱:',
 'editusergroup' => '編輯用戶群組',
-'editinguser' => "更改用戶'''[[User:$1|$1]]''' 的用戶權限 $2",
-'userrights-editusergroup' => '編輯用戶群組',
-'saveusergroups' => '保存用戶群組',
+'editinguser' => "變更使用者 '''[[User:$1|$1]]''' 的使用者權限 $2",
+'userrights-editusergroup' => '編輯使用者群組',
+'saveusergroups' => '儲存使用者群組',
 'userrights-groupsmember' => '屬於:',
 'userrights-groupsmember-auto' => '固有屬於:',
 'userrights-groups-help' => '您可以改動這位用戶所屬的群組:
@@ -1493,7 +1497,7 @@ $1",
 'userrights-no-interwiki' => '您並沒有權限去編輯在其它wiki上的用戶權限。',
 'userrights-nodatabase' => '資料庫$1不存在或並非為本地的。',
 'userrights-nologin' => '您必須要以操作員賬戶[[Special:UserLogin|登入]]之後才可以指定用戶權限。',
-'userrights-notallowed' => '你無權添加或刪除用戶權限。',
+'userrights-notallowed' => '你無權加入或刪除使用者權限。',
 'userrights-changeable-col' => '您可以更改的群組',
 'userrights-unchangeable-col' => '您不可以更改的群組',
 'userrights-conflict' => '使用者權限更改發生衝突!請檢視並確認你的更改。',
@@ -1501,23 +1505,23 @@ $1",
 
 # Groups
 'group' => '群組:',
-'group-user' => '用戶',
-'group-autoconfirmed' => '自動確認用戶',
+'group-user' => '使用者',
+'group-autoconfirmed' => '自動確認使用者',
 'group-bot' => '機器人',
 'group-sysop' => '管理員',
 'group-bureaucrat' => '行政員',
 'group-suppress' => '監督',
 'group-all' => '(全部)',
 
-'group-user-member' => '{{GENDER:$1|用戶}}',
-'group-autoconfirmed-member' => '自動確認用戶',
+'group-user-member' => '{{GENDER:$1|使用者}}',
+'group-autoconfirmed-member' => '自動確認使用者',
 'group-bot-member' => '機器人',
 'group-sysop-member' => '{{GENDER:$1|管理員}}',
 'group-bureaucrat-member' => '行政員',
 'group-suppress-member' => '監督員',
 
-'grouppage-user' => '{{ns:project}}:用戶',
-'grouppage-autoconfirmed' => '{{ns:project}}:自動確認用戶',
+'grouppage-user' => '{{ns:project}}:使用者',
+'grouppage-autoconfirmed' => '{{ns:project}}:自動確認使用者',
 'grouppage-bot' => '{{ns:project}}:機器人',
 'grouppage-sysop' => '{{ns:project}}:管理員',
 'grouppage-bureaucrat' => '{{ns:project}}:行政員',
@@ -1528,11 +1532,11 @@ $1",
 'right-edit' => '編輯頁面',
 'right-createpage' => '建立頁面(不含討論頁面)',
 'right-createtalk' => '建立討論頁面',
-'right-createaccount' => 'å\89µå»ºæ\96°ç\94¨æ\88¶è³¬æ\88',
-'right-minoredit' => '標示小編輯',
+'right-createaccount' => '建ç«\8bæ\96°ç\9a\84使ç\94¨è\80\85帳è\99\9f',
+'right-minoredit' => '標示小編輯',
 'right-move' => '移動頁面',
-'right-move-subpages' => '移å\8b\95é \81é\9d¢è·\9få®\83ç\9a\84子頁面',
-'right-move-rootuserpages' => '移動根用戶頁面',
+'right-move-subpages' => '移å\8b\95é \81é\9d¢è\88\87å\85子頁面',
+'right-move-rootuserpages' => '移動根使用者頁面',
 'right-movefile' => '移動檔案',
 'right-suppressredirect' => '當移動頁面時不建立來源頁面之重定向',
 'right-upload' => '上傳檔案',
@@ -1571,7 +1575,7 @@ $1",
 'right-edituserjs' => '編輯其他用戶的JavaScript檔案',
 'right-editmyusercss' => '編輯你自己的用戶CSS檔',
 'right-editmyuserjs' => '編輯你自己的用戶JavaScript檔',
-'right-viewmywatchlist' => 'æ\9f¥ç\9c\8b您的監視列表',
+'right-viewmywatchlist' => '檢è¦\96您的監視列表',
 'right-editmywatchlist' => '編輯您的監視列表。請注意即使沒有這種權利,某些操作仍將添加頁面。',
 'right-viewmyprivateinfo' => '檢視自己的私隱資料(如電郵地址及真實姓名)',
 'right-editmyprivateinfo' => '編輯自己的私隱資料(如電郵地址及真實姓名)',
@@ -1594,11 +1598,11 @@ $1",
 'right-passwordreset' => '查看重置密碼郵件',
 
 # Special:Log/newusers
-'newuserlogpage' => '新進用戶名冊',
+'newuserlogpage' => '使用者建立日誌',
 'newuserlogpagetext' => '這是一個最近被創建用戶的新日誌',
 
 # User rights log
-'rightslog' => '用戶權限日誌',
+'rightslog' => '使用者權限日誌',
 'rightslogtext' => '以下記錄了用戶權限的更改記錄。',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1647,17 +1651,17 @@ $1",
 'enhancedrc-since-last-visit' => '自上次訪問已有$1',
 'enhancedrc-history' => '歷史',
 'recentchanges' => '最近變更',
-'recentchanges-legend' => '最近更改選項',
-'recentchanges-summary' => 'è·\9f蹤此維å\9fºä¸\8aç\9a\84æ\9c\80è¿\91æ\9b´æ\94¹。',
+'recentchanges-legend' => '近期變更選項',
+'recentchanges-summary' => '追蹤該å\9c\8dè¨\98ï¼\88Wikiï¼\89ç\9a\84è¿\91æ\9c\9fè®\8aæ\9b´。',
 'recentchanges-noresult' => '在所選擇的時間裡沒有任何更改與所給條件吻合。',
-'recentchanges-feed-description' => '訂閱此維基上的最近更改。',
+'recentchanges-feed-description' => '訂閱該圍記(Wiki)的近期變更。',
 'recentchanges-label-newpage' => '這次編輯建立了一個新頁面',
 'recentchanges-label-minor' => '這是一個小編輯',
 'recentchanges-label-bot' => '這次編輯是由機器人進行',
 'recentchanges-label-unpatrolled' => '這次編輯尚未巡查過',
 'rcnote' => "以下是在$4 $5,最近 '''$2''' 天內的 '''$1''' 次最近更改記錄。",
 'rcnotefrom' => "下面是自'''$2'''(最多顯示'''$1'''):",
-'rclistfrom' => '顯示自$1以來的新更改',
+'rclistfrom' => '顯示自 $1 以來的新變更',
 'rcshowhideminor' => '$1小編輯',
 'rcshowhidebots' => '$1機器人的編輯',
 'rcshowhideliu' => '$1已登入用戶的編輯',
@@ -1672,7 +1676,7 @@ $1",
 'minoreditletter' => '小',
 'newpageletter' => '新',
 'boteditletter' => '機',
-'number_of_watching_users_pageview' => '[$1位用戶在監視]',
+'number_of_watching_users_pageview' => '[$1 位使用者在監視]',
 'rc_categories' => '分類界限(以"|"分割)',
 'rc_categories_any' => '任意',
 'rc-change-size-new' => '更改後$1字節',
@@ -1682,10 +1686,10 @@ $1",
 'rc-old-title' => '最初建立為「$1」',
 
 # Recent changes linked
-'recentchangeslinked' => '相關更改',
-'recentchangeslinked-feed' => '相關更改',
+'recentchangeslinked' => '相關變更',
+'recentchangeslinked-feed' => '相關變更',
 'recentchangeslinked-toolbox' => '相關變更',
-'recentchangeslinked-title' => '與「$1」有關的更改',
+'recentchangeslinked-title' => '與「$1」有關的變更',
 'recentchangeslinked-summary' => "這一個特殊頁面列示''由''所給出的一個頁面之連結到頁面的最近更改(或者是對於指定分類的成員)。
 在[[Special:Watchlist|您的監視列表]]中的頁面會以'''粗體'''顯示。",
 'recentchangeslinked-page' => '頁面名稱:',
@@ -1700,7 +1704,7 @@ $1",
 'uploadnologintext' => '您必須先$1才能上載檔案。',
 'upload_directory_missing' => '上傳目錄($1)遺失,不能由網頁伺服器建立。',
 'upload_directory_read_only' => '上傳目錄($1)不存在或無寫權限。',
-'uploaderror' => '上錯誤',
+'uploaderror' => '上錯誤',
 'upload-recreate-warning' => "'''警告:一個相同名字的檔案曾經被刪除或者移動至別處。'''
 
 這個頁面的刪除和移動日誌在這裏提供以便參考:",
@@ -1714,14 +1718,14 @@ $1",
 'upload-permitted' => '准許的檔案類型:$1。',
 'upload-preferred' => '建議的檔案類型:$1。',
 'upload-prohibited' => '禁止的檔案類型:$1。',
-'uploadlog' => '上載紀錄',
-'uploadlogpage' => '上載紀錄',
+'uploadlog' => '上傳日誌',
+'uploadlogpage' => '上傳日誌',
 'uploadlogpagetext' => '以下是最近上載的檔案的一覽表。
 檢視[[Special:NewFiles|新檔案畫廊]]去看更富圖片的總覽。',
-'filename' => '檔案名',
-'filedesc' => 'æª\94æ¡\88æ\8f\8fè¿°',
-'fileuploadsummary' => 'æª\94æ¡\88æ\8f\8fè¿°:',
-'filereuploadsummary' => '檔案更改說明:',
+'filename' => '檔案名',
+'filedesc' => 'æª\94æ¡\88æ\91\98è¦\81',
+'fileuploadsummary' => 'æª\94æ¡\88æ\91\98è¦\81:',
+'filereuploadsummary' => '檔案變更:',
 'filestatus' => '版權狀態:',
 'filesource' => '來源:',
 'uploadedfiles' => '已上載檔案',
@@ -1773,7 +1777,7 @@ $1",
 'file-deleted-duplicate' => '一個相同名稱的檔案 ([[:$1]]) 在先前刪除過。您應該在重新上傳之前檢查一下該檔案之刪除紀錄。',
 'uploadwarning' => '上載警告',
 'uploadwarning-text' => '請修改以下的檔案描述並重試。',
-'savefile' => '存檔案',
+'savefile' => '存檔案',
 'uploadedimage' => '已上載「[[$1]]」',
 'overwroteimage' => '已經上傳「[[$1]]」的新版本',
 'uploaddisabled' => '上傳己停用。',
@@ -1926,12 +1930,12 @@ $1',
 'listfiles_thumb' => '縮圖',
 'listfiles_date' => '日期',
 'listfiles_name' => '名稱',
-'listfiles_user' => '用戶',
+'listfiles_user' => '使用者',
 'listfiles_size' => '大小',
 'listfiles_description' => '描述',
 'listfiles_count' => '版本',
 'listfiles-show-all' => '包括圖片的舊版本',
-'listfiles-latestversion' => 'ç\95前版本',
+'listfiles-latestversion' => 'ç\9b®前版本',
 'listfiles-latestversion-yes' => '是',
 'listfiles-latestversion-no' => '否',
 
@@ -1947,7 +1951,7 @@ $1',
 'filehist-thumb' => '縮圖',
 'filehist-thumbtext' => '於$1的縮圖版本',
 'filehist-nothumb' => '沒有縮圖',
-'filehist-user' => '用戶',
+'filehist-user' => '使用者',
 'filehist-dimensions' => '維度',
 'filehist-filesize' => '檔案大小',
 'filehist-comment' => '註解',
@@ -2046,19 +2050,19 @@ $1',
 'statistics-header-pages' => '頁面統計',
 'statistics-header-edits' => '編輯統計',
 'statistics-header-views' => '檢視統計',
-'statistics-header-users' => '用戶統計',
+'statistics-header-users' => '使用者統計',
 'statistics-header-hooks' => '其它統計',
 'statistics-articles' => '內容頁面',
 'statistics-pages' => '頁面',
-'statistics-pages-desc' => '在wiki上的所有頁面,包括對話頁面、重新定向等',
+'statistics-pages-desc' => '在圍記(Wiki)上的所有頁面,包括討論頁、重新導向等。',
 'statistics-files' => '已經上傳的檔案',
 'statistics-edits' => '自從{{SITENAME}}設定的頁面編輯數',
 'statistics-edits-average' => '每一頁面的平均編輯數',
 'statistics-views-total' => '檢視總數',
 'statistics-views-total-desc' => '不存在頁面和特殊頁面的查看數未計入',
 'statistics-views-peredit' => '每次編輯檢視數',
-'statistics-users' => '已註冊[[Special:ListUsers|用戶]]',
-'statistics-users-active' => '活躍用戶',
+'statistics-users' => '已註冊[[Special:ListUsers|使用者]]',
+'statistics-users-active' => '活躍使用者',
 'statistics-users-active-desc' => '在前$1天中操作過的用戶',
 'statistics-mostpopular' => '被查閱次數最多的頁面',
 
@@ -2070,15 +2074,15 @@ $1',
 'pageswithprop-prophidden-long' => '長文本屬性值已被隱藏($1)',
 'pageswithprop-prophidden-binary' => '已隱藏二進位屬性值($1)',
 
-'doubleredirects' => '雙重重定向',
+'doubleredirects' => '雙重的重新導向',
 'doubleredirectstext' => '這一頁列出所有重定向頁面重定向到另一個重定向頁的頁面。每一行都包含到第一和第二個重定向頁面的連結,以及第二個重定向頁面的目標,通常顯示的都會是"真正"的目標頁面,也就是第一個重定向頁面應該指向的頁面。
 <del>已劃去</del>的為已經解決之項目。',
 'double-redirect-fixed-move' => '[[$1]]已經完成移動,它現在重新定向到[[$2]]。',
 'double-redirect-fixed-maintenance' => '修復從[[$1]]到[[$2]]的雙重重定向。',
-'double-redirect-fixer' => 'é\87\8dæ\96°å®\9a向修正器',
+'double-redirect-fixer' => 'é\87\8dæ\96°å°\8e向修正器',
 
-'brokenredirects' => '受損重定向',
-'brokenredirectstext' => '以下的重定向頁指向的是不存在的頁面:',
+'brokenredirects' => '中斷的重新導向',
+'brokenredirectstext' => '以下的重新導向頁面連結到不存在的頁面:',
 'brokenredirects-edit' => '編輯',
 'brokenredirects-delete' => '刪除',
 
@@ -2090,7 +2094,7 @@ $1',
 'fewestrevisions' => '最少修訂的頁面',
 
 # Miscellaneous special pages
-'nbytes' => '$1位元組',
+'nbytes' => '$1 個位元組',
 'ncategories' => '$1 個分類',
 'ninterwikis' => '$1 個跨維基',
 'nlinks' => '$1個連結',
@@ -2142,10 +2146,10 @@ $1',
 'listusers-editsonly' => '只顯示有編輯的用戶',
 'listusers-creationsort' => '按建立日期排序',
 'listusers-desc' => '使用降冪排序',
-'usereditcount' => '$1 次編輯',
+'usereditcount' => '$1 次{{PLURAL:$1|編輯}}',
 'usercreated' => '$1 $2{{GENDER:$3|創建}}',
 'newpages' => '最新頁面',
-'newpages-username' => '用戶名:',
+'newpages-username' => '使用者名稱:',
 'ancientpages' => '最舊頁面',
 'move' => '移動',
 'movethispage' => '移動本頁',
@@ -2253,7 +2257,7 @@ $1',
 'listgrouprights-members' => '(成員清單)',
 'listgrouprights-addgroup' => '加入的{{PLURAL:$2|一個|多個}}群組: $1',
 'listgrouprights-removegroup' => '移除的{{PLURAL:$2|一個|多個}}群組: $1',
-'listgrouprights-addgroup-all' => '入所有群組',
+'listgrouprights-addgroup-all' => 'å\8a å\85¥æ\89\80æ\9c\89群çµ\84',
 'listgrouprights-removegroup-all' => '移除所有群組',
 'listgrouprights-addgroup-self' => '在自己的賬戶中加入的{{PLURAL:$2|一個|多個}}群組: $1',
 'listgrouprights-removegroup-self' => '在自己的賬戶中移除的{{PLURAL:$2|一個|多個}}群組: $1',
@@ -2410,21 +2414,21 @@ $UNWATCHURL
 'delete-warning-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。',
 
 # Rollback
-'rollback' => '恢復編輯',
-'rollback_short' => '恢復',
+'rollback' => '回退編輯',
+'rollback_short' => '回退',
 'rollbacklink' => '復原',
-'rollbacklinkcount' => '恢復 $1 次編輯',
-'rollbacklinkcount-morethan' => '恢復多過 $1 次編輯',
-'rollbackfailed' => '無法恢復',
-'cantrollback' => '無法恢復編輯;最後的貢獻者是本æ\96\87ç\9a\84å\94¯ä¸\80ä½\9cè\80\85ã\80\82',
+'rollbacklinkcount' => '回退 $1 次編輯',
+'rollbacklinkcount-morethan' => '回退多過 $1 次{{PLURAL:$1|編輯}}',
+'rollbackfailed' => '無法回退',
+'cantrollback' => '無法恢復編輯;最後的貢獻者是本ç¯\87ç\9a\84å\94¯ä¸\80ä½\9cè\80\85ã\80\82',
 'alreadyrolled' => '無法回退由[[User:$2|$2]]([[User talk:$2|討論]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]在[[:$1]]上的編輯;其他人已經編輯或者回退了該頁。
 
 該頁最後的編輯者是[[User:$3|$3]]([[User talk:$3|討論]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。',
 'editcomment' => "編輯摘要: \"''\$1''\"。",
 'revertpage' => '已恢復由[[Special:Contributions/$2|$2]]([[User talk:$2|對話]])的編輯至[[User:$1|$1]]的最後一個修訂版本',
-'revertpage-nouser' => '已由隱藏的使用者還原編輯至上個 {{GENDER:$1|[[使用者:$1|$1]]}} 修訂的版本',
-'rollback-success' => '已恢復$1的編輯;
-更改回$2的最後修訂版本。',
+'revertpage-nouser' => '已由隱藏的使用者恢復編輯到上個{{GENDER:$1|[[User:$1|$1]]}}的修訂版本',
+'rollback-success' => '已恢復 $1 的編輯;
+更變更回 $2 的最後修訂版本。',
 
 # Edit tokens
 'sessionfailure-title' => '登入資訊失敗',
@@ -2436,12 +2440,12 @@ $UNWATCHURL
 'protectlogpage' => '保護日誌',
 'protectlogtext' => '下面是頁面保護修改列表。
 請參考[[Special:ProtectedPages|保護頁面清單]]以檢視目前進行的頁面保護。',
-'protectedarticle' => '已保護"[[$1]]"',
-'modifiedarticleprotection' => '已經更改「[[$1]]」的保護等級',
-'unprotectedarticle' => '已解除"[[$1]]"保護',
+'protectedarticle' => '已保護「[[$1]]」',
+'modifiedarticleprotection' => '已變更「[[$1]]」的保護等級',
+'unprotectedarticle' => '已解除「[[$1]]」的保護',
 'movedarticleprotection' => '已將「[[$2]]」的保護設定移動至「[[$1]]」',
-'protect-title' => '更改「$1」的保護等級',
-'protect-title-notallowed' => 'æ\9f¥ç\9c\8b「$1」的保護等級',
+'protect-title' => '變更「$1」的保護等級',
+'protect-title-notallowed' => '檢è¦\96「$1」的保護等級',
 'prot_1movedto2' => '[[$1]]移動到[[$2]]',
 'protect-badnamespace-title' => '不可被保護的名字空間',
 'protect-badnamespace-text' => '這個名字空間內的頁面無法被保護。',
@@ -2503,12 +2507,12 @@ $UNWATCHURL
 
 # Undelete
 'undelete' => '恢復被刪頁面',
-'undeletepage' => '瀏覽及恢復被刪頁面',
+'undeletepage' => '檢視與還原已刪除的頁面',
 'undeletepagetitle' => "'''以下包含[[:$1]]的已刪除之修訂版本'''。",
-'viewdeletedpage' => '檢視刪除的頁面',
+'viewdeletedpage' => '檢視刪除的頁面',
 'undeletepagetext' => '以下的$1個頁面已經被刪除,但依然在檔案中並可以被恢復。
 檔案庫可能被定時清理。',
-'undelete-fieldset-title' => '恢復修訂',
+'undelete-fieldset-title' => '還原修訂',
 'undeleteextrahelp' => "恢復整個頁面時,請清除所有複選框後按 '''''{{int:undeletebtn}}''''' 。
 恢復特定版本時,請選擇相應版本前的複選框後按'''''{{int:undeletebtn}}''''' 。
 按 '''''{{int:undeletereset}}''''' 將清除評論內容及所有複選框。",
@@ -2520,7 +2524,7 @@ $UNWATCHURL
 'undelete-revision' => '$1由$3(在$4 $5)所編寫的已刪除修訂版本:',
 'undeleterevision-missing' => '此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被恢復。',
 'undelete-nodiff' => '找不到先前的修訂版本。',
-'undeletebtn' => '恢復',
+'undeletebtn' => '還原',
 'undeletelink' => '檢視/還原',
 'undeleteviewlink' => '檢視',
 'undeletereset' => '重設',
@@ -2559,9 +2563,9 @@ $1',
 
 # Contributions
 'contributions' => '{{GENDER:$1|用戶}}貢獻',
-'contributions-title' => '$1的用戶貢獻',
+'contributions-title' => '$1 的使用者貢獻',
 'mycontris' => '我的貢獻',
-'contribsub2' => '$1的貢獻 ($2)',
+'contribsub2' => '{{GENDER:$3|$1}} 的貢獻 ($2)',
 'nocontribs' => '沒有找到符合特徵的更改。',
 'uctop' => '(最新修改)',
 'month' => '從該月份 (或更早):',
@@ -2592,7 +2596,7 @@ $1',
 'linkshere' => '以下頁面連結到[[:$1]]:',
 'nolinkshere' => '沒有頁面連結到[[:$1]]。',
 'nolinkshere-ns' => '在所選的名字空間內沒有頁面連結到[[:$1]]。',
-'isredirect' => '重向頁面',
+'isredirect' => '重新導向頁面',
 'istemplate' => '包含',
 'isimage' => '檔案連結',
 'whatlinkshere-prev' => '前$1個',
@@ -2606,11 +2610,11 @@ $1',
 
 # Block/unblock
 'autoblockid' => '自動查封 #$1',
-'block' => '封禁用戶',
-'unblock' => '解封用戶',
-'blockip' => '封禁用戶',
-'blockip-title' => '封禁用戶',
-'blockip-legend' => '查封用戶',
+'block' => '封禁使用者',
+'unblock' => '解封使用者',
+'blockip' => '封禁使用者',
+'blockip-title' => '封禁使用者',
+'blockip-legend' => '封禁使用者',
 'blockiptext' => '用下面的表單來禁止來自某一特定IP地址的修改許可權。
 只有在為防止破壞,及符合[[{{MediaWiki:Policy-url}}|守則]]的情況下才可採取此行動。
 請在下面輸入一個具體的理由(例如引述一個被破壞的頁面)。',
@@ -2677,7 +2681,7 @@ $1',
 'expiringblock' => '$1 $2 到期',
 'anononlyblock' => '僅限匿名用戶',
 'noautoblockblock' => '禁用自動查封',
-'createaccountblock' => 'ç¦\81æ­¢å\89µå»ºè³¬æ\88',
+'createaccountblock' => 'ç¦\81止建ç«\8b帳è\99\9f',
 'emailblock' => '禁止電子郵件',
 'blocklist-nousertalk' => '禁止編輯自己的用戶討論頁',
 'ipblocklist-empty' => '查封列表為空。',
@@ -3933,6 +3937,7 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'tags-tag' => '標籤名稱',
 'tags-display-header' => '在更改清單中的出現方式',
 'tags-description-header' => '解釋完整描述',
+'tags-active-header' => '存檔?',
 'tags-hitcount-header' => '已加上標籤的更改',
 'tags-edit' => '編輯',
 'tags-hitcount' => '$1次更改',
@@ -4098,9 +4103,9 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 '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' => '昂貴分析器函數計數',
 
diff --git a/maintenance/archives/patch-archive-ar_id.sql b/maintenance/archives/patch-archive-ar_id.sql
new file mode 100644 (file)
index 0000000..ddd1d7b
--- /dev/null
@@ -0,0 +1,8 @@
+--
+-- patch-archive-ar_id.sql
+--
+-- Bug 39675. Add archive.ar_id.
+
+ALTER TABLE /*$wgDBprefix*/archive
+    ADD COLUMN ar_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
+    ADD PRIMARY KEY (ar_id);
diff --git a/maintenance/archives/patch-externallinks-el_id.sql b/maintenance/archives/patch-externallinks-el_id.sql
new file mode 100644 (file)
index 0000000..d4b51b5
--- /dev/null
@@ -0,0 +1,8 @@
+--
+-- patch-extenallinks-el_id.sql
+--
+-- Bug 15441. Add externallinks.el_id.
+
+ALTER TABLE /*$wgDBprefix*/externallinks
+    ADD COLUMN el_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
+    ADD PRIMARY KEY (el_id);
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 410a55c..cbd1be6 100644 (file)
@@ -41,6 +41,8 @@ class TableCleanup extends Maintenance {
        public $batchSize = 100;
        public $reportInterval = 100;
 
+       protected $processed, $updated, $count, $startTime, $table;
+
        public function __construct() {
                parent::__construct();
                $this->addOption( 'dry-run', 'Perform a dry run' );
@@ -66,6 +68,9 @@ class TableCleanup extends Maintenance {
                $this->table = $table;
        }
 
+       /**
+        * @param int $updated
+        */
        protected function progress( $updated ) {
                $this->updated += $updated;
                $this->processed++;
@@ -96,12 +101,16 @@ class TableCleanup extends Maintenance {
                flush();
        }
 
+       /**
+        * @param array $params
+        * @throws MWException
+        */
        public function runTable( $params ) {
                $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 ) );
                }
 
@@ -111,7 +120,6 @@ class TableCleanup extends Maintenance {
                $this->init( $count, $table );
                $this->output( "Processing $table...\n" );
 
-
                $index = (array)$params['index'];
                $indexConds = array();
                $options = array(
@@ -156,6 +164,10 @@ class TableCleanup extends Maintenance {
                $this->output( "Finished $table... $this->updated of $this->processed rows updated\n" );
        }
 
+       /**
+        * @param array $matches
+        * @return string
+        */
        protected function hexChar( $matches ) {
                return sprintf( "\\x%02x", ord( $matches[1] ) );
        }
index 895254f..5b5ef18 100644 (file)
@@ -42,6 +42,9 @@ class TitleCleanup extends TableCleanup {
                $this->mDescription = "Script to clean up broken, unparseable titles";
        }
 
+       /**
+        * @param object $row
+        */
        protected function processRow( $row ) {
                global $wgContLang;
                $display = Title::makeName( $row->page_namespace, $row->page_title );
@@ -51,33 +54,43 @@ class TitleCleanup extends TableCleanup {
                if ( !is_null( $title )
                        && $title->canExist()
                        && $title->getNamespace() == $row->page_namespace
-                       && $title->getDBkey() === $row->page_title )
-               {
-                       return $this->progress( 0 );  // all is fine
+                       && $title->getDBkey() === $row->page_title
+               ) {
+                       $this->progress( 0 ); // all is fine
+
+                       return;
                }
 
                if ( $row->page_namespace == NS_FILE && $this->fileExists( $row->page_title ) ) {
                        $this->output( "file $row->page_title needs cleanup, please run cleanupImages.php.\n" );
-                       return $this->progress( 0 );
+                       $this->progress( 0 );
                } elseif ( is_null( $title ) ) {
                        $this->output( "page $row->page_id ($display) is illegal.\n" );
                        $this->moveIllegalPage( $row );
-                       return $this->progress( 1 );
+                       $this->progress( 1 );
                } else {
                        $this->output( "page $row->page_id ($display) doesn't match self.\n" );
                        $this->moveInconsistentPage( $row, $title );
-                       return $this->progress( 1 );
+                       $this->progress( 1 );
                }
        }
 
+       /**
+        * @param string $name
+        * @return bool
+        */
        protected function fileExists( $name ) {
                // XXX: Doesn't actually check for file existence, just presence of image record.
                // 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;
        }
 
+       /**
+        * @param object $row
+        */
        protected function moveIllegalPage( $row ) {
                $legal = 'A-Za-z0-9_/\\\\-';
                $legalized = preg_replace_callback( "!([^$legal])!",
@@ -104,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 ),
@@ -115,6 +130,10 @@ class TitleCleanup extends TableCleanup {
                }
        }
 
+       /**
+        * @param object $row
+        * @param Title $title
+        */
        protected function moveInconsistentPage( $row, $title ) {
                if ( $title->exists() || $title->getInterwiki() || !$title->canExist() ) {
                        if ( $title->getInterwiki() || !$title->canExist() ) {
@@ -145,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 13301ed..21ef4ff 100644 (file)
@@ -48,6 +48,7 @@ class CopyFileBackend extends Maintenance {
                $this->addOption( 'prestat', 'Stat the destination files first (try to use listings)' );
                $this->addOption( 'skiphash', 'Skip SHA-1 sync checks for files' );
                $this->addOption( 'missingonly', 'Only copy files missing from destination listing' );
+               $this->addOption( 'syncviadelete', 'Delete destination files missing from source listing' );
                $this->addOption( 'utf8only', 'Skip source files that do not have valid UTF-8 names' );
                $this->setBatchSize( 50 );
        }
@@ -64,7 +65,6 @@ class CopyFileBackend extends Maintenance {
                        $this->error( "Cannot check for UTF-8, mbstring extension missing.", 1 ); // die
                }
 
-               $count = 0;
                foreach ( $containers as $container ) {
                        if ( $subDir != '' ) {
                                $backendRel = "$container/$subDir";
@@ -74,40 +74,23 @@ class CopyFileBackend extends Maintenance {
                                $this->output( "Doing container '$container'...\n" );
                        }
 
-                       $srcPathsRel = $src->getFileList( array(
-                               'dir' => $src->getRootStoragePath() . "/$backendRel",
-                               'adviseStat' => !$this->hasOption( 'missingonly' ) // avoid HEADs
-                       ) );
-                       if ( $srcPathsRel === null ) {
-                               $this->error( "Could not list files in $container.", 1 ); // die
-                       }
-
                        if ( $this->hasOption( 'missingonly' ) ) {
-                               $dstPathsRel = $dst->getFileList( array(
-                                       'dir' => $dst->getRootStoragePath() . "/$backendRel" ) );
-                               if ( $dstPathsRel === null ) {
+                               $this->output( "\tBuilding list of missing files..." );
+                               $srcPathsRel = $this->getListingDiffRel( $src, $dst, $backendRel );
+                               $this->output( count( $srcPathsRel ) . " file(s) need to be copied.\n" );
+                       } else {
+                               $srcPathsRel = $src->getFileList( array(
+                                       'dir' => $src->getRootStoragePath() . "/$backendRel",
+                                       'adviseStat' => true // avoid HEADs
+                               ) );
+                               if ( $srcPathsRel === null ) {
                                        $this->error( "Could not list files in $container.", 1 ); // die
                                }
-                               // Get the list of destination files
-                               $relFilesDstSha1 = array();
-                               foreach ( $dstPathsRel as $dstPathRel ) {
-                                       $relFilesDstSha1[sha1( $dstPathRel )] = 1;
-                               }
-                               unset( $dstPathsRel ); // free
-                               // Get the list of missing files
-                               $missingPathsRel = array();
-                               foreach ( $srcPathsRel as $srcPathRel ) {
-                                       if ( !isset( $relFilesDstSha1[sha1( $srcPathRel )] ) ) {
-                                               $missingPathsRel[] = $srcPathRel;
-                                       }
-                               }
-                               unset( $srcPathsRel ); // free
-                               // Only copy the missing files over in the next loop
-                               $srcPathsRel = $missingPathsRel;
-                               $this->output( count( $srcPathsRel ) . " file(s) need to be copied.\n" );
-                       } elseif ( $this->getOption( 'prestat' ) ) {
+                       }
+
+                       if ( $this->getOption( 'prestat' ) && !$this->hasOption( 'missingonly' ) ) {
                                // Build the stat cache for the destination files
-                               $this->output( "Building destination stat cache..." );
+                               $this->output( "\tBuilding destination stat cache..." );
                                $dstPathsRel = $dst->getFileList( array(
                                        'dir' => $dst->getRootStoragePath() . "/$backendRel",
                                        'adviseStat' => true // avoid HEADs
@@ -123,12 +106,14 @@ class CopyFileBackend extends Maintenance {
                                $this->output( "done [" . count( $this->statCache ) . " file(s)]\n" );
                        }
 
+                       $this->output( "\tCopying file(s)...\n" );
+                       $count = 0;
                        $batchPaths = array();
                        foreach ( $srcPathsRel as $srcPathRel ) {
                                // Check up on the rate file periodically to adjust the concurrency
                                if ( $rateFile && ( !$count || ( $count % 500 ) == 0 ) ) {
                                        $this->mBatchSize = max( 1, (int)file_get_contents( $rateFile ) );
-                                       $this->output( "Batch size is now {$this->mBatchSize}.\n" );
+                                       $this->output( "\tBatch size is now {$this->mBatchSize}.\n" );
                                }
                                $batchPaths[$srcPathRel] = 1; // remove duplicates
                                if ( count( $batchPaths ) >= $this->mBatchSize ) {
@@ -141,6 +126,36 @@ class CopyFileBackend extends Maintenance {
                                $this->copyFileBatch( array_keys( $batchPaths ), $backendRel, $src, $dst );
                                $batchPaths = array(); // done
                        }
+                       $this->output( "\tCopied $count file(s).\n" );
+
+                       if ( $this->hasOption( 'syncviadelete' ) ) {
+                               $this->output( "\tBuilding list of excess destination files..." );
+                               $delPathsRel = $this->getListingDiffRel( $dst, $src, $backendRel );
+                               $this->output( count( $delPathsRel ) . " file(s) need to be deleted.\n" );
+
+                               $this->output( "\tDeleting file(s)...\n" );
+                               $count = 0;
+                               $batchPaths = array();
+                               foreach ( $delPathsRel as $delPathRel ) {
+                                       // Check up on the rate file periodically to adjust the concurrency
+                                       if ( $rateFile && ( !$count || ( $count % 500 ) == 0 ) ) {
+                                               $this->mBatchSize = max( 1, (int)file_get_contents( $rateFile ) );
+                                               $this->output( "\tBatch size is now {$this->mBatchSize}.\n" );
+                                       }
+                                       $batchPaths[$delPathRel] = 1; // remove duplicates
+                                       if ( count( $batchPaths ) >= $this->mBatchSize ) {
+                                               $this->delFileBatch( array_keys( $batchPaths ), $backendRel, $dst );
+                                               $batchPaths = array(); // done
+                                       }
+                                       ++$count;
+                               }
+                               if ( count( $batchPaths ) ) { // left-overs
+                                       $this->delFileBatch( array_keys( $batchPaths ), $backendRel, $dst );
+                                       $batchPaths = array(); // done
+                               }
+
+                               $this->output( "\tDeleted $count file(s).\n" );
+                       }
 
                        if ( $subDir != '' ) {
                                $this->output( "Finished container '$container', directory '$subDir'.\n" );
@@ -149,9 +164,51 @@ class CopyFileBackend extends Maintenance {
                        }
                }
 
-               $this->output( "Done [$count file(s)].\n" );
+               $this->output( "Done.\n" );
        }
 
+       /**
+        * @param FileBackend $src
+        * @param FileBackend $dst
+        * @param string $backendRel
+        * @return array (rel paths in $src minus those in $dst)
+        */
+       protected function getListingDiffRel( FileBackend $src, FileBackend $dst, $backendRel ) {
+               $srcPathsRel = $src->getFileList( array(
+                       'dir' => $src->getRootStoragePath() . "/$backendRel" ) );
+               if ( $srcPathsRel === null ) {
+                       $this->error( "Could not list files in source container.", 1 ); // die
+               }
+               $dstPathsRel = $dst->getFileList( array(
+                       'dir' => $dst->getRootStoragePath() . "/$backendRel" ) );
+               if ( $dstPathsRel === null ) {
+                       $this->error( "Could not list files in destination container.", 1 ); // die
+               }
+               // Get the list of destination files
+               $relFilesDstSha1 = array();
+               foreach ( $dstPathsRel as $dstPathRel ) {
+                       $relFilesDstSha1[sha1( $dstPathRel )] = 1;
+               }
+               unset( $dstPathsRel ); // free
+               // Get the list of missing files
+               $missingPathsRel = array();
+               foreach ( $srcPathsRel as $srcPathRel ) {
+                       if ( !isset( $relFilesDstSha1[sha1( $srcPathRel )] ) ) {
+                               $missingPathsRel[] = $srcPathRel;
+                       }
+               }
+               unset( $srcPathsRel ); // free
+
+               return $missingPathsRel;
+       }
+
+       /**
+        * @param array $srcPathsRel
+        * @param string $backendRel
+        * @param FileBackend $src
+        * @param FileBackend $dst
+        * @return void
+        */
        protected function copyFileBatch(
                array $srcPathsRel, $backendRel, FileBackend $src, FileBackend $dst
        ) {
@@ -169,8 +226,8 @@ class CopyFileBackend extends Maintenance {
                        $t_start = microtime( true );
                        $fsFiles = $src->getLocalReferenceMulti( array( 'srcs' => $srcPaths, 'latest' => 1 ) );
                        $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
-                       $this->output( "\nDownloaded these file(s) [{$ellapsed_ms}ms]:\n" .
-                               implode( "\n", $srcPaths ) . "\n\n" );
+                       $this->output( "\n\tDownloaded these file(s) [{$ellapsed_ms}ms]:\n\t" .
+                               implode( "\n\t", $srcPaths ) . "\n\n" );
                }
 
                // Determine what files need to be copied over...
@@ -183,7 +240,7 @@ class CopyFileBackend extends Maintenance {
                        } elseif ( !$this->hasOption( 'missingonly' )
                                && $this->filesAreSame( $src, $dst, $srcPath, $dstPath ) )
                        {
-                               $this->output( "Already have $srcPathRel.\n" );
+                               $this->output( "\tAlready have $srcPathRel.\n" );
                                continue; // assume already copied...
                        }
                        $fsFile = array_key_exists( $srcPath, $fsFiles )
@@ -228,11 +285,55 @@ class CopyFileBackend extends Maintenance {
                        $this->error( print_r( $status->getErrorsArray(), true ) );
                        $this->error( "$wikiId: Could not copy file batch.", 1 ); // die
                } elseif ( count( $copiedRel ) ) {
-                       $this->output( "\nCopied these file(s) [{$ellapsed_ms}ms]:\n" .
-                               implode( "\n", $copiedRel ) . "\n\n" );
+                       $this->output( "\n\tCopied these file(s) [{$ellapsed_ms}ms]:\n\t" .
+                               implode( "\n\t", $copiedRel ) . "\n\n" );
+               }
+       }
+
+       /**
+        * @param array $dstPathsRel
+        * @param string $backendRel
+        * @param FileBackend $dst
+        * @return void
+        */
+       protected function delFileBatch(
+               array $dstPathsRel, $backendRel, FileBackend $dst
+       ) {
+               $ops = array();
+               $deletedRel = array(); // for output message
+               $wikiId = $dst->getWikiId();
+
+               // Determine what files need to be copied over...
+               foreach ( $dstPathsRel as $dstPathRel ) {
+                       $dstPath = $dst->getRootStoragePath() . "/$backendRel/$dstPathRel";
+                       $ops[] = array( 'op' => 'delete', 'src' => $dstPath );
+                       $deletedRel[] = $dstPathRel;
+               }
+
+               // Delete the batch of source files...
+               $t_start = microtime( true );
+               $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+               if ( !$status->isOK() ) {
+                       sleep( 10 ); // wait and retry copy again
+                       $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+               }
+               $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
+               if ( !$status->isOK() ) {
+                       $this->error( print_r( $status->getErrorsArray(), true ) );
+                       $this->error( "$wikiId: Could not delete file batch.", 1 ); // die
+               } elseif ( count( $deletedRel ) ) {
+                       $this->output( "\n\tDeleted these file(s) [{$ellapsed_ms}ms]:\n\t" .
+                               implode( "\n\t", $deletedRel ) . "\n\n" );
                }
        }
 
+       /**
+        * @param FileBackend $src
+        * @param FileBackend $dst
+        * @param string $sPath
+        * @param string $dPath
+        * @return bool
+        */
        protected function filesAreSame( FileBackend $src, FileBackend $dst, $sPath, $dPath ) {
                $skipHash = $this->hasOption( 'skiphash' );
                $srcStat = $src->getFileStat( array( 'src' => $sPath ) );
index 03e6904..aa25ee6 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Creates an account and grant it administrator rights.
+ * Creates an account and grants it rights.
  *
  * 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
 require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Maintenance script to create an account and grant it administrator rights.
+ * Maintenance script to create an account and grant it rights.
  *
  * @ingroup Maintenance
  */
 class CreateAndPromote extends Maintenance {
 
-       static $permitRoles = array( 'sysop', 'bureaucrat' );
+       static $permitRoles = array( 'sysop', 'bureaucrat', 'bot' );
 
        public function __construct() {
                parent::__construct();
index cbbcf0f..54fd4e2 100644 (file)
@@ -230,14 +230,14 @@ if ( $count > 0 ) {
                } else {
                        $props = FSFile::getPropsFromPath( $file );
                        $flags = 0;
-                       $options = array();
+                       $publishOptions = array();
                        $handler = MediaHandler::getHandler( $props['mime'] );
                        if ( $handler ) {
-                               $options['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+                               $publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] );
                        } else {
-                               $options['headers'] = array();
+                               $publishOptions['headers'] = array();
                        }
-                       $archive = $image->publish( $file, $flags, $options );
+                       $archive = $image->publish( $file, $flags, $publishOptions );
                        if ( !$archive->isGood() ) {
                                echo "failed. (" .
                                        $archive->getWikiText() .
@@ -248,7 +248,7 @@ if ( $count > 0 ) {
                }
 
                $commentText = SpecialUpload::getInitialPageText( $commentText, $license );
-               if ( !$summary ) {
+               if ( !isset( $options['summary'] ) ) {
                        $summary = $commentText;
                }
 
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 ac9d8cb..381ddae 100644 (file)
@@ -52,7 +52,7 @@ Options:
        * mode:  Output format, can be either:
                * text:   Text output on the console (default)
                * wiki:   Wiki format, with * at beginning of each line
-               * php:    Output text as PHP syntax in a array $dupeMessages
+               * php:    Output text as PHP syntax in an array named \$dupeMessages
                * raw:    Raw output for duplicates
 TEXT;
 }
index d47138d..8676d74 100644 (file)
@@ -485,6 +485,7 @@ $wgOptionalMessages = array(
        'limitreport-ppgeneratednodes-value',
        'limitreport-expansiondepth-value',
        'limitreport-expensivefunctioncount-value',
+       'tooltip-iwiki',
 );
 
 /** Exif messages, which may be set as optional in several checks, but are generally mandatory */
index 01976f4..ca3a4f5 100644 (file)
@@ -485,6 +485,8 @@ $wgMessageStructure = array(
                'userlogin-resetpassword-link',
                'helplogin-url',
                'userlogin-helplink',
+               'userlogin-loggedin',
+               'userlogin-createanother',
                'createacct-join',
                'createacct-another-join',
                'createacct-emailrequired',
index 75b7ef0..e918337 100644 (file)
@@ -36,10 +36,14 @@ $mmfl = false;
  * @ingroup Maintenance
  */
 class MergeMessageFileList extends Maintenance {
+       /**
+        * @var bool
+        */
+       protected $hasError;
 
        function __construct() {
                parent::__construct();
-               $this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', true, true );
+               $this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', false, true );
                $this->addOption( 'extensions-dir', 'Path where extensions can be found.', false, true );
                $this->addOption( 'output', 'Send output to this file (omit for stdout)', false, true );
                $this->mDescription = 'Merge $wgExtensionMessagesFiles from various extensions to produce a ' .
@@ -47,26 +51,25 @@ class MergeMessageFileList extends Maintenance {
        }
 
        public function execute() {
-               global $mmfl;
+               global $mmfl, $wgExtensionEntryPointListFiles;
 
-               # Add setup files contained in file passed to --list-file
-               $lines = file( $this->getOption( 'list-file' ) );
-               if ( $lines === false ) {
-                       $this->error( 'Unable to open list file.' );
+               if ( !count( $wgExtensionEntryPointListFiles )
+                       && !$this->hasOption( 'list-file' )
+                       && !$this->hasOption( 'extensions-dir' )
+               ) {
+                       $this->error( "Either --list-file or --extensions-dir must be provided if " .
+                               "\$wgExtensionEntryPointListFiles is not set", 1 );
                }
+
                $mmfl = array( 'setupFiles' => array() );
 
-               # Strip comments, discard empty lines, and trim leading and trailing
-               # whitespace. Comments start with '#' and extend to the end of the line.
-               foreach ( $lines as $line ) {
-                       $line = trim( preg_replace( '/#.*/', '', $line ) );
-                       if ( $line !== '' ) {
-                               $mmfl['setupFiles'][] = $line;
-                       }
+               # Add setup files contained in file passed to --list-file
+               if ( $this->hasOption( 'list-file' ) ) {
+                       $extensionPaths = $this->readFile( $this->getOption( 'list-file' ) );
+                       $mmfl['setupFiles'] = array_merge( $mmfl['setupFiles'], $extensionPaths );
                }
 
                # Now find out files in a directory
-               $hasError = false;
                if ( $this->hasOption( 'extensions-dir' ) ) {
                        $extdir = $this->getOption( 'extensions-dir' );
                        $entries = scandir( $extdir );
@@ -78,13 +81,19 @@ class MergeMessageFileList extends Maintenance {
                                if ( file_exists( $extfile ) ) {
                                        $mmfl['setupFiles'][] = $extfile;
                                } else {
-                                       $hasError = true;
+                                       $this->hasError = true;
                                        $this->error( "Extension {$extname} in {$extdir} lacks expected {$extname}.php" );
                                }
                        }
                }
 
-               if ( $hasError ) {
+               # Add setup files defined via configuration
+               foreach ( $wgExtensionEntryPointListFiles as $points ) {
+                       $extensionPaths = $this->readFile( $points );
+                       $mmfl['setupFiles'] = array_merge( $mmfl['setupFiles'], $extensionPaths );
+               }
+
+               if ( $this->hasError ) {
                        $this->error( "Some files are missing (see above). Giving up.", 1 );
                }
 
@@ -95,6 +104,38 @@ class MergeMessageFileList extends Maintenance {
                        $mmfl['quiet'] = true;
                }
        }
+
+       /**
+        * @param string $fileName
+        * @return array List of absolute extension paths
+        */
+       private function readFile( $fileName ) {
+               global $IP;
+
+               $files = array();
+               $fileLines = file( $fileName );
+               if ( $fileLines === false ) {
+                       $this->hasError = true;
+                       $this->error( "Unable to open list file $fileName." );
+                       return $files;
+               }
+               # Strip comments, discard empty lines, and trim leading and trailing
+               # whitespace. Comments start with '#' and extend to the end of the line.
+               foreach ( $fileLines as $extension ) {
+                       $extension = trim( preg_replace( '/#.*/', '', $extension ) );
+                       if ( $extension !== '' ) {
+                               # Paths may use the string $IP to be substituted by the actual value
+                               $extension = str_replace( '$IP', $IP, $extension );
+                               if ( file_exists( $extension ) ) {
+                                       $files[] = $extension;
+                               } else {
+                                       $this->hasError = true;
+                                       $this->error( "Extension {$extension} doesn't exist" );
+                               }
+                       }
+               }
+               return $files;
+       }
 }
 
 require_once RUN_MAINTENANCE_IF_MAIN;
@@ -103,11 +144,11 @@ foreach ( $mmfl['setupFiles'] as $fileName ) {
        if ( strval( $fileName ) === '' ) {
                continue;
        }
-       $fileName = str_replace( '$IP', $IP, $fileName );
        if ( empty( $mmfl['quiet'] ) ) {
                fwrite( STDERR, "Loading data from $fileName\n" );
        }
-       if ( !( include_once $fileName ) ) {
+       // Include the extension to update $wgExtensionMessagesFiles
+       if ( !( include_once( $fileName ) ) ) {
                fwrite( STDERR, "Unable to read $fileName\n" );
                exit( 1 );
        }
@@ -126,10 +167,7 @@ $dirs = array(
 );
 
 foreach ( $dirs as $dir ) {
-       $s = preg_replace(
-               "/'" . preg_quote( $dir, '/' ) . "([^']*)'/",
-               '"$IP\1"',
-               $s );
+       $s = preg_replace( "/'" . preg_quote( $dir, '/' ) . "([^']*)'/", '"$IP\1"', $s );
 }
 
 if ( isset( $mmfl['output'] ) ) {
index c474f00..7356c38 100644 (file)
@@ -159,6 +159,7 @@ CREATE TABLE /*$wgDBprefix*/text (
 -- Cannot reasonably create views on this table, due to the presence of TEXT
 -- columns.
 CREATE TABLE /*$wgDBprefix*/archive (
+   ar_id NOT NULL PRIMARY KEY clustered IDENTITY,
    ar_namespace SMALLINT NOT NULL DEFAULT 0,
    ar_title NVARCHAR(255) NOT NULL DEFAULT '',
    ar_text NVARCHAR(MAX) NOT NULL,
@@ -298,6 +299,7 @@ CREATE INDEX /*$wgDBprefix*/lc_lang_key ON /*$wgDBprefix*/l10n_cache (lc_lang, l
 -- Track links to external URLs
 -- IE >= 4 supports no more than 2083 characters in a URL
 CREATE TABLE /*$wgDBprefix*/externallinks (
+   el_id INT NOT NULL PRIMARY KEY clustered IDENTITY,
    el_from INT NOT NULL DEFAULT '0',
    el_to VARCHAR(2083) NOT NULL,
    el_index VARCHAR(896) NOT NULL,
diff --git a/maintenance/oracle/archives/patch-archive-ar_id.sql b/maintenance/oracle/archives/patch-archive-ar_id.sql
new file mode 100644 (file)
index 0000000..a43f760
--- /dev/null
@@ -0,0 +1,6 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.archive ADD (
+ar_id NUMBER NOT NULL,
+);
+ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id);
diff --git a/maintenance/oracle/archives/patch-externallinks-el_id.sql b/maintenance/oracle/archives/patch-externallinks-el_id.sql
new file mode 100644 (file)
index 0000000..a8c443f
--- /dev/null
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.externallinks ADD el_id NUMBER NOT NULL;
+ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id);
\ No newline at end of file
index 57b6e7e..acfabc3 100644 (file)
@@ -129,7 +129,9 @@ CREATE TABLE &mw_prefix.pagecontent ( -- replaces reserved word 'text'
 );
 ALTER TABLE &mw_prefix.pagecontent ADD CONSTRAINT &mw_prefix.pagecontent_pk PRIMARY KEY (old_id);
 
+CREATE SEQUENCE archive_ar_id_seq;
 CREATE TABLE &mw_prefix.archive (
+  ar_id          NUMBER NOT NULL,
   ar_namespace   NUMBER    DEFAULT 0 NOT NULL,
   ar_title       VARCHAR2(255)         NOT NULL,
   ar_text        CLOB,
@@ -149,6 +151,7 @@ CREATE TABLE &mw_prefix.archive (
   ar_content_model VARCHAR2(32),
   ar_content_format VARCHAR2(64)
 );
+ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id);
 ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
 CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp);
 CREATE INDEX &mw_prefix.archive_i02 ON &mw_prefix.archive (ar_user_text,ar_timestamp);
@@ -208,11 +211,14 @@ ALTER TABLE &mw_prefix.category ADD CONSTRAINT &mw_prefix.category_pk PRIMARY KE
 CREATE UNIQUE INDEX &mw_prefix.category_u01 ON &mw_prefix.category (cat_title);
 CREATE INDEX &mw_prefix.category_i01 ON &mw_prefix.category (cat_pages);
 
+CREATE SEQUENCE externallinks_el_id_seq;
 CREATE TABLE &mw_prefix.externallinks (
+  el_id     NUMBER  NOT NULL,
   el_from   NUMBER  NOT NULL,
   el_to     VARCHAR2(2048) NOT NULL,
   el_index  VARCHAR2(2048) NOT NULL
 );
+ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id);
 ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
 CREATE INDEX &mw_prefix.externallinks_i01 ON &mw_prefix.externallinks (el_from, el_to);
 CREATE INDEX &mw_prefix.externallinks_i02 ON &mw_prefix.externallinks (el_to, el_from);
index 1c4dce4..5a2710a 100644 (file)
@@ -1,6 +1,7 @@
 CREATE TABLE profiling (
   pf_count   INTEGER         NOT NULL DEFAULT 0,
-  pf_time    NUMERIC(18,10)  NOT NULL DEFAULT 0,
+  pf_time    FLOAT           NOT NULL DEFAULT 0,
+  pf_memory  FLOAT           NOT NULL DEFAULT 0,
   pf_name    TEXT            NOT NULL,
   pf_server  TEXT            NULL
 );
index 4d44705..bc2428e 100644 (file)
@@ -18,6 +18,8 @@ DROP SEQUENCE IF EXISTS recentchanges_rc_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS logging_log_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS job_job_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS category_cat_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS archive_ar_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS externallinks_el_id_seq CASCADE;
 DROP FUNCTION IF EXISTS page_deleted() CASCADE;
 DROP FUNCTION IF EXISTS ts2_page_title() CASCADE;
 DROP FUNCTION IF EXISTS ts2_page_text() CASCADE;
@@ -156,7 +158,9 @@ ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_prop
 CREATE INDEX page_props_propname ON page_props (pp_propname);
 CREATE UNIQUE INDEX pp_propname_page ON page_props (pp_propname,pp_page);
 
+CREATE SEQUENCE archive_ar_id_seq;
 CREATE TABLE archive (
+  ar_id             INTEGER      NOT NULL  PRIMARY KEY DEFAULT nextval('archive_ar_id_seq'),
   ar_namespace      SMALLINT     NOT NULL,
   ar_title          TEXT         NOT NULL,
   ar_text           TEXT, -- technically should be bytea, but not used anymore
@@ -224,7 +228,9 @@ CREATE TABLE categorylinks (
 CREATE UNIQUE INDEX cl_from ON categorylinks (cl_from, cl_to);
 CREATE INDEX cl_sortkey     ON categorylinks (cl_to, cl_sortkey, cl_from);
 
+CREATE SEQUENCE externallinks_id_seq;
 CREATE TABLE externallinks (
+  el_id     INTEGER  NOT NULL  PRIMARY KEY DEFAULT nextval('externallinks_id_seq'),
   el_from   INTEGER  NOT NULL  REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
   el_to     TEXT     NOT NULL,
   el_index  TEXT     NOT NULL
@@ -585,8 +591,8 @@ $mw$;
 -- This table is not used unless profiling is turned on
 CREATE TABLE profiling (
   pf_count   INTEGER         NOT NULL DEFAULT 0,
-  pf_time    NUMERIC(18,10)  NOT NULL DEFAULT 0,
-  pf_memory  NUMERIC(18,10)  NOT NULL DEFAULT 0,
+  pf_time    FLOAT           NOT NULL DEFAULT 0,
+  pf_memory  FLOAT           NOT NULL DEFAULT 0,
   pf_name    TEXT            NOT NULL,
   pf_server  TEXT            NULL
 );
diff --git a/maintenance/purgeChangedFiles.php b/maintenance/purgeChangedFiles.php
new file mode 100644 (file)
index 0000000..9f83ee7
--- /dev/null
@@ -0,0 +1,255 @@
+<?php
+/**
+ * Scan the logging table and purge affected files within a timeframe.
+ *
+ * @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
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that scans the deletion log and purges affected files
+ * within a timeframe.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeChangedFiles extends Maintenance {
+       /**
+        * Mapping from type option to log type and actions.
+        * @var array
+        */
+       private static $typeMappings = array(
+               'created' => array(
+                       'upload' => array( 'upload' ),
+                       'import' => array( 'upload', 'interwiki' ),
+               ),
+               'deleted' => array(
+                       'delete' => array( 'delete', 'revision' ),
+                       'suppress' => array( 'delete', 'revision' ),
+               ),
+               'modified' => array(
+                       'upload' => array( 'overwrite', 'revert' ),
+                       'move' => array( 'move', 'move_redir' ),
+               ),
+       );
+
+       /**
+        * @var string
+        */
+       private $startTimestamp;
+
+       /**
+        * @var string
+        */
+       private $endTimestamp;
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Scan the logging table and purge files and thumbnails.";
+               $this->addOption( 'starttime', 'Starting timestamp', true, true );
+               $this->addOption( 'endtime', 'Ending timestamp', true, true );
+               $this->addOption( 'type', 'Comma-separated list of types of changes to send purges for (' .
+                       implode( ',', array_keys( self::$typeMappings ) ) . ',all)', false, true );
+               $this->addOption( 'htcp-dest', 'HTCP announcement destination (IP:port)', false, true );
+               $this->addOption( 'dry-run', 'Do not send purge requests' );
+               $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
+       }
+
+       public function execute() {
+               global $wgHTCPRouting;
+
+               if ( $this->hasOption( 'htcp-dest' ) ) {
+                       $parts = explode( ':', $this->getOption( 'htcp-dest' ) );
+                       if ( count( $parts ) < 2 ) {
+                               // Add default htcp port
+                               $parts[] = '4827';
+                       }
+
+                       // Route all HTCP messages to provided host:port
+                       $wgHTCPRouting = array(
+                               '' => array( 'host' => $parts[0], 'port' => $parts[1] ),
+                       );
+                       $this->verbose( "HTCP broadcasts to {$parts[0]}:{$parts[1]}\n" );
+               }
+
+               // Find out which actions we should be concerned with
+               $typeOpt = $this->getOption( 'type', 'all' );
+               $validTypes = array_keys( self::$typeMappings );
+               if ( $typeOpt === 'all' ) {
+                       // Convert 'all' to all registered types
+                       $typeOpt = implode( ',', $validTypes );
+               }
+               $typeList = explode( ',', $typeOpt );
+               foreach ( $typeList as $type ) {
+                       if ( !in_array( $type, $validTypes ) ) {
+                               $this->error( "\nERROR: Unknown type: {$type}\n" );
+                               $this->maybeHelp( true );
+                       }
+               }
+
+               // Validate the timestamps
+               $dbr = $this->getDB( DB_SLAVE );
+               $this->startTimestamp = $dbr->timestamp( $this->getOption( 'starttime' ) );
+               $this->endTimestamp = $dbr->timestamp( $this->getOption( 'endtime' ) );
+
+               if ( $this->startTimestamp > $this->endTimestamp ) {
+                       $this->error( "\nERROR: starttime after endtime\n" );
+                       $this->maybeHelp( true );
+               }
+
+               // Turn on verbose when dry-run is enabled
+               if ( $this->hasOption( 'dry-run' ) ) {
+                       $this->mOptions['verbose'] = 1;
+               }
+
+               $this->verbose( 'Purging files that were: ' . implode( ', ', $typeList ) . "\n");
+               foreach ( $typeList as $type ) {
+                       $this->verbose( "Checking for {$type} files...\n" );
+                       $this->purgeFromLogType( $type );
+                       if ( !$this->hasOption( 'dry-run' ) ) {
+                               $this->verbose( "...{$type} files purged.\n\n" );
+                       }
+               }
+       }
+
+       /**
+        * Purge cache and thumbnails for changes of the given type.
+        *
+        * @param string $type Type of change to find
+        */
+       protected function purgeFromLogType( $type ) {
+               $repo = RepoGroup::singleton()->getLocalRepo();
+               $dbr = $this->getDB( DB_SLAVE );
+
+               foreach ( self::$typeMappings[$type] as $logType => $logActions ) {
+                       $this->verbose( "Scanning for {$logType}/" . implode( ',', $logActions ) . "\n" );
+
+                       $res = $dbr->select(
+                               'logging',
+                               array( 'log_title', 'log_timestamp', 'log_params' ),
+                               array(
+                                       'log_namespace' => NS_FILE,
+                                       'log_type' => $logType,
+                                       'log_action' => $logActions,
+                                       'log_timestamp >= ' . $dbr->addQuotes( $this->startTimestamp ),
+                                       'log_timestamp <= ' . $dbr->addQuotes( $this->endTimestamp ),
+                               ),
+                               __METHOD__
+                       );
+
+                       foreach ( $res as $row ) {
+                               $file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) );
+
+                               if ( $this->hasOption( 'dry-run' ) ) {
+                                       $this->verbose( "{$type}[{$row->log_timestamp}]: {$row->log_title}\n" );
+                                       continue;
+                               }
+
+                               // Purge current version and any versions in oldimage table
+                               $file->purgeCache();
+                               $file->purgeHistory();
+
+                               if ( $logType === 'delete' ) {
+                                       // If there is an orphaned storage file... delete it
+                                       if ( !$file->exists() && $repo->fileExists( $file->getPath() ) ) {
+                                               $dpath = $this->getDeletedPath( $repo, $file );
+                                               if ( $repo->fileExists( $dpath ) ) {
+                                                       // Sanity check to avoid data loss
+                                                       $repo->getBackend()->delete( array( 'src' => $file->getPath() ) );
+                                                       $this->verbose( "Deleted orphan file: {$file->getPath()}.\n" );
+
+                                               } else {
+                                                       $this->error( "File was not deleted: {$file->getPath()}.\n" );
+                                               }
+                                       }
+
+                                       // Purge items from fileachive table (rows are likely here)
+                                       $this->purgeFromArchiveTable( $repo, $file );
+
+                               } else if ( $logType === 'move' ) {
+                                       // Purge the target file as well
+
+                                       $params = unserialize( $row->log_params );
+                                       if ( isset( $params['4::target'] ) ) {
+                                               $target = $params['4::target'];
+                                               $targetFile = $repo->newFile( Title::makeTitle( NS_FILE, $target ) );
+                                               $targetFile->purgeCache();
+                                               $targetFile->purgeHistory();
+                                               $this->verbose( "Purged file {$target}; move target @{$row->log_timestamp}.\n" );
+                                       }
+                               }
+
+                               $this->verbose( "Purged file {$row->log_title}; {$type} @{$row->log_timestamp}.\n" );
+                       }
+               }
+       }
+
+       protected function purgeFromArchiveTable( LocalRepo $repo, LocalFile $file ) {
+               $dbr = $repo->getSlaveDB();
+               $res = $dbr->select(
+                       'filearchive',
+                       array( 'fa_archive_name' ),
+                       array( 'fa_name' => $file->getName() ),
+                       __METHOD__
+               );
+
+               foreach ( $res as $row ) {
+                       if ( $row->fa_archive_name === null ) {
+                               // Was not an old version (current version names checked already)
+                               continue;
+                       }
+                       $ofile = $repo->newFromArchiveName( $file->getTitle(), $row->fa_archive_name );
+                       // If there is an orphaned storage file still there...delete it
+                       if ( !$file->exists() && $repo->fileExists( $ofile->getPath() ) ) {
+                               $dpath = $this->getDeletedPath( $repo, $ofile );
+                               if ( $repo->fileExists( $dpath ) ) {
+                                       // Sanity check to avoid data loss
+                                       $repo->getBackend()->delete( array( 'src' => $ofile->getPath() ) );
+                                       $this->output( "Deleted orphan file: {$ofile->getPath()}.\n" );
+
+                               } else {
+                                       $this->error( "File was not deleted: {$ofile->getPath()}.\n" );
+                               }
+                       }
+                       $file->purgeOldThumbnails( $row->fa_archive_name );
+               }
+       }
+
+       protected function getDeletedPath( LocalRepo $repo, LocalFile $file ) {
+               $hash = $repo->getFileSha1( $file->getPath() );
+               $key = "{$hash}.{$file->getExtension()}";
+               return $repo->getDeletedHashPath( $key ) . $key;
+       }
+
+       /**
+        * Send an output message iff the 'verbose' option has been provided.
+        *
+        * @param string $msg Message to output
+        */
+       protected function verbose( $msg ) {
+               if ( $this->hasOption( 'verbose' ) ) {
+                       $this->output( $msg );
+               }
+       }
+
+}
+
+$maintClass = "PurgeChangedFiles";
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeChangedPages.php b/maintenance/purgeChangedPages.php
new file mode 100644 (file)
index 0000000..071ac09
--- /dev/null
@@ -0,0 +1,191 @@
+<?php
+/**
+ * Send purge requests for pages edited in date range to squid/varnish.
+ *
+ * @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
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that sends purge requests for pages edited in a date
+ * range to squid/varnish.
+ *
+ * Can be used to recover from an HTCP message partition or other major cache
+ * layer interruption.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeChangedPages extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Send purge requests for edits in date range to squid/varnish';
+               $this->addOption( 'starttime', 'Starting timestamp', true, true );
+               $this->addOption( 'endtime', 'Ending timestamp', true, true );
+               $this->addOption( 'htcp-dest', 'HTCP announcement destination (IP:port)', false, true );
+               $this->addOption( 'sleep-per-batch', 'Milliseconds to sleep between batches', false, true );
+               $this->addOption( 'dry-run', 'Do not send purge requests' );
+               $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
+               $this->setBatchSize( 100 );
+       }
+
+       public function execute() {
+               global $wgHTCPRouting;
+
+               if ( $this->hasOption( 'htcp-dest' ) ) {
+                       $parts = explode( ':', $this->getOption( 'htcp-dest' ) );
+                       if ( count( $parts ) < 2 ) {
+                               // Add default htcp port
+                               $parts[] = '4827';
+                       }
+
+                       // Route all HTCP messages to provided host:port
+                       $wgHTCPRouting = array(
+                               '' => array( 'host' => $parts[0], 'port' => $parts[1] ),
+                       );
+                       if ( $this->hasOption( 'verbose' ) ) {
+                               $this->output( "HTCP broadcasts to {$parts[0]}:{$parts[1]}\n" );
+                       }
+               }
+
+               $dbr = $this->getDB( DB_SLAVE );
+               $minTime = $dbr->timestamp( $this->getOption( 'starttime' ) );
+               $maxTime = $dbr->timestamp( $this->getOption( 'endtime' ) );
+
+               if ( $maxTime < $minTime ) {
+                       $this->error( "\nERROR: starttime after endtime\n" );
+                       $this->maybeHelp( true );
+               }
+
+               $stuckCount = 0; // loop breaker
+               while ( true ) {
+                       // Adjust bach size if we are stuck in a second that had many changes
+                       $bSize = $this->mBatchSize + ( $stuckCount * $this->mBatchSize );
+
+                       $res = $dbr->select(
+                               array( 'page', 'revision' ),
+                               array(
+                                       'rev_timestamp',
+                                       'page_namespace',
+                                       'page_title',
+                               ),
+                               array(
+                                       "rev_timestamp > " . $dbr->addQuotes( $minTime ),
+                                       "rev_timestamp <= " . $dbr->addQuotes( $maxTime ),
+                                       // Only get rows where the revision is the latest for the page.
+                                       // Other revisions would be duplicate and we don't need to purge if
+                                       // there has been an edit after the interesting time window.
+                                       "page_latest = rev_id",
+                               ),
+                               __METHOD__,
+                               array( 'ORDER BY' => 'rev_timestamp', 'LIMIT' => $bSize ),
+                               array(
+                                       'page' => array( 'INNER JOIN', 'rev_page=page_id' ),
+                               )
+                       );
+
+                       if ( !$res->numRows() ) {
+                               // nothing more found so we are done
+                               break;
+                       }
+
+                       // Kludge to not get stuck in loops for batches with the same timestamp
+                       list( $rows, $lastTime ) = $this->pageableSortedRows( $res, 'rev_timestamp', $bSize );
+                       if ( !count( $rows ) ) {
+                               ++$stuckCount;
+                               continue;
+                       }
+                       // Reset suck counter
+                       $stuckCount = 0;
+
+                       $this->output( "Processing changes from {$minTime} to {$lastTime}.\n" );
+
+                       // Advance past the last row next time
+                       $minTime = $lastTime;
+
+                       // Create list of URLs from page_namespace + page_title
+                       $urls = array();
+                       foreach ( $rows as $row ) {
+                               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                               $urls[] = $title->getInternalURL();
+                       }
+
+                       if ( $this->hasOption( 'dry-run' ) || $this->hasOption( 'verbose' ) ) {
+                               $this->output( implode( "\n", $urls ) . "\n" );
+                               if ( $this->hasOption( 'dry-run' ) ) {
+                                       continue;
+                               }
+                       }
+
+                       // Send batch of purge requests out to squids
+                       $squid = new SquidUpdate( $urls, count( $urls ) );
+                       $squid->doUpdate();
+
+                       if ( $this->hasOption( 'sleep-per-batch' ) ) {
+                               // sleep-per-batch is milliseconds, usleep wants micro seconds.
+                               usleep( 1000 * (int)$this->getOption( 'sleep-per-batch' ) );
+                       }
+               }
+
+               $this->output( "Done!\n" );
+       }
+
+       /**
+        * Remove all the rows in a result set with the highest value for column
+        * $column unless the number of rows is less $limit. This returns the new
+        * array of rows and the highest value of column $column for the rows left.
+        * The ordering of rows is maintained.
+        *
+        * This is useful for paging on mostly-unique values that may sometimes
+        * have large clumps of identical values. It should be safe to do the next
+        * query on items with a value higher than the highest of the rows returned here.
+        * If this returns an empty array for a non-empty query result, then all the rows
+        * had the same column value and the query should be repeated with a higher LIMIT.
+        *
+        * @TODO: move this elsewhere
+        *
+        * @param ResultWrapper $res Query result sorted by $column (ascending)
+        * @param string $column
+        * @return array (array of rows, string column value)
+        */
+       protected function pageableSortedRows( ResultWrapper $res, $column, $limit ) {
+               $rows = iterator_to_array( $res, false );
+               $count = count( $rows );
+               if ( !$count ) {
+                       return array( array(), null ); // nothing to do
+               } elseif ( $count < $limit ) {
+                       return array( $rows, $rows[$count - 1]->$column ); // no more rows left
+               }
+               $lastValue = $rows[$count - 1]->$column; // should be the highest
+               for ( $i = $count - 1; $i >= 0; --$i ) {
+                       if ( $rows[$i]->$column === $lastValue ) {
+                               unset( $rows[$i] );
+                       } else {
+                               break;
+                       }
+               }
+               $lastValueLeft = count( $rows ) ? $rows[count( $rows ) - 1]->$column : null;
+               return array( $rows, $lastValueLeft );
+       }
+}
+
+$maintClass = "PurgeChangedPages";
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeDeletedFiles.php b/maintenance/purgeDeletedFiles.php
deleted file mode 100644 (file)
index 9f2af33..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-/**
- * Scan the deletion log and purges affected files within a timeframe.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once __DIR__ . '/Maintenance.php';
-
-/**
- * Maintenance script that scans the deletion log and purges affected files
- * within a timeframe.
- *
- * @ingroup Maintenance
- */
-class PurgeDeletedFiles extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Scan the logging table and purge files that where deleted.";
-               $this->addOption( 'starttime', 'Starting timestamp', false, true );
-               $this->addOption( 'endtime', 'Ending timestamp', false, true );
-       }
-
-       public function execute() {
-               $this->output( "Purging cache and thumbnails for deleted files...\n" );
-               $this->purgeFromLogType( 'delete' );
-               $this->output( "...deleted files purged.\n\n" );
-
-               $this->output( "Purging cache and thumbnails for suppressed files...\n" );
-               $this->purgeFromLogType( 'suppress' );
-               $this->output( "...suppressed files purged.\n" );
-       }
-
-       protected function purgeFromLogType( $logType ) {
-               $repo = RepoGroup::singleton()->getLocalRepo();
-               $db = $repo->getSlaveDB();
-
-               $conds = array(
-                       'log_namespace' => NS_FILE,
-                       'log_type' => $logType,
-                       'log_action' => array( 'delete', 'revision' )
-               );
-               $start = $this->getOption( 'starttime' );
-               if ( $start ) {
-                       $conds[] = 'log_timestamp >= ' . $db->addQuotes( $db->timestamp( $start ) );
-               }
-               $end = $this->getOption( 'endtime' );
-               if ( $end ) {
-                       $conds[] = 'log_timestamp <= ' . $db->addQuotes( $db->timestamp( $end ) );
-               }
-
-               $res = $db->select( 'logging', array( 'log_title', 'log_timestamp' ), $conds, __METHOD__ );
-               foreach ( $res as $row ) {
-                       $file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) );
-                       // If there is an orphaned storage file still there...delete it
-                       if ( !$file->exists() && $repo->fileExists( $file->getPath() ) ) {
-                               $dpath = $this->getDeletedPath( $repo, $file );
-                               if ( $repo->fileExists( $dpath ) ) { // sanity check to avoid data loss
-                                       $repo->getBackend()->delete( array( 'src' => $file->getPath() ) );
-                                       $this->output( "Deleted orphan file: {$file->getPath()}.\n" );
-                               } else {
-                                       $this->error( "File was not deleted: {$file->getPath()}.\n" );
-                               }
-                       }
-                       // Purge current version and any versions in oldimage table
-                       $file->purgeCache();
-                       $file->purgeHistory();
-                       // Purge items from fileachive table (rows are likely here)
-                       $this->purgeFromArchiveTable( $repo, $file );
-
-                       $this->output( "Purged file {$row->log_title}; deleted on {$row->log_timestamp}.\n" );
-               }
-       }
-
-       protected function purgeFromArchiveTable( LocalRepo $repo, LocalFile $file ) {
-               $db = $repo->getSlaveDB();
-               $res = $db->select( 'filearchive',
-                       array( 'fa_archive_name' ),
-                       array( 'fa_name' => $file->getName() ),
-                       __METHOD__
-               );
-               foreach ( $res as $row ) {
-                       if ( $row->fa_archive_name === null ) {
-                               continue; // was not an old version (current version names checked already)
-                       }
-                       $ofile = $repo->newFromArchiveName( $file->getTitle(), $row->fa_archive_name );
-                       // If there is an orphaned storage file still there...delete it
-                       if ( !$file->exists() && $repo->fileExists( $ofile->getPath() ) ) {
-                               $dpath = $this->getDeletedPath( $repo, $ofile );
-                               if ( $repo->fileExists( $dpath ) ) { // sanity check to avoid data loss
-                                       $repo->getBackend()->delete( array( 'src' => $ofile->getPath() ) );
-                                       $this->output( "Deleted orphan file: {$ofile->getPath()}.\n" );
-                               } else {
-                                       $this->error( "File was not deleted: {$ofile->getPath()}.\n" );
-                               }
-                       }
-                       $file->purgeOldThumbnails( $row->fa_archive_name );
-               }
-       }
-
-       protected function getDeletedPath( LocalRepo $repo, LocalFile $file ) {
-               $hash = $repo->getFileSha1( $file->getPath() );
-               $key = "{$hash}.{$file->getExtension()}";
-               return $repo->getDeletedHashPath( $key ) . $key;
-       }
-}
-
-$maintClass = "PurgeDeletedFiles";
-require_once RUN_MAINTENANCE_IF_MAIN;
index e054a36..afd7c74 100644 (file)
@@ -59,7 +59,7 @@ class ShowJobs extends Maintenance {
                                $pending = $queue->getSize();
                                $claimed = $queue->getAcquiredCount();
                                $abandoned = $queue->getAbandonedCount();
-                               $active = ( $claimed - $abandoned );
+                               $active = max( 0, $claimed - $abandoned );
                                if ( ( $pending + $claimed ) > 0 ) {
                                        $this->output(
                                                "{$type}: $pending queued; " .
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 73b008c..1a59be5 100644 (file)
@@ -28,6 +28,8 @@ DROP TABLE IF EXISTS /*_*/interwiki_tmp;
 DROP TABLE IF EXISTS /*_*/page_restrictions_tmp;
 DROP TABLE IF EXISTS /*_*/protected_titles_tmp;
 DROP TABLE IF EXISTS /*_*/page_props_tmp;
+DROP TABLE IF EXISTS /*_*/archive_tmp;
+DROP TABLE IF EXISTS /*_*/externallinks_tmp;
 
 --------------------------------------------------------------------------------
 -- Create new tables
@@ -268,6 +270,47 @@ CREATE TABLE /*_*/page_props_tmp (
 );
 CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props_tmp (pp_page,pp_propname);
 
+--
+-- Holding area for deleted articles, which may be viewed
+-- or restored by admins through the Special:Undelete interface.
+-- The fields generally correspond to the page, revision, and text
+-- fields, with several caveats.
+-- Cannot reasonably create views on this table, due to the presence of TEXT
+-- columns.
+CREATE TABLE /*$wgDBprefix*/archive_tmp (
+   ar_id NOT NULL PRIMARY KEY clustered IDENTITY,
+   ar_namespace SMALLINT NOT NULL DEFAULT 0,
+   ar_title NVARCHAR(255) NOT NULL DEFAULT '',
+   ar_text NVARCHAR(MAX) NOT NULL,
+   ar_comment NVARCHAR(255) NOT NULL,
+   ar_user INT NULL REFERENCES /*$wgDBprefix*/[user](user_id) ON DELETE SET NULL,
+   ar_user_text NVARCHAR(255) NOT NULL,
+   ar_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+   ar_minor_edit BIT NOT NULL DEFAULT 0,
+   ar_flags NVARCHAR(255) NOT NULL,
+   ar_rev_id INT,
+   ar_text_id INT,
+   ar_deleted BIT NOT NULL DEFAULT 0,
+   ar_len INT DEFAULT NULL,
+   ar_page_id INT NULL,
+   ar_parent_id INT NULL
+);
+CREATE INDEX /*$wgDBprefix*/ar_name_title_timestamp ON /*$wgDBprefix*/archive_tmp(ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*$wgDBprefix*/ar_usertext_timestamp ON /*$wgDBprefix*/archive_tmp(ar_user_text,ar_timestamp);
+CREATE INDEX /*$wgDBprefix*/ar_user_text    ON /*$wgDBprefix*/archive_tmp(ar_user_text);
+
+--
+-- Track links to external URLs
+-- IE >= 4 supports no more than 2083 characters in a URL
+CREATE TABLE /*$wgDBprefix*/externallinks_tmp (
+   el_id INT NOT NULL PRIMARY KEY clustered IDENTITY,
+   el_from INT NOT NULL DEFAULT '0',
+   el_to VARCHAR(2083) NOT NULL,
+   el_index VARCHAR(896) NOT NULL,
+);
+-- Maximum key length ON SQL Server is 900 bytes
+CREATE INDEX /*$wgDBprefix*/externallinks_index   ON /*$wgDBprefix*/externallinks_tmp(el_index);
+
 --------------------------------------------------------------------------------
 -- Populate the new tables using INSERT SELECT
 --------------------------------------------------------------------------------
@@ -290,6 +333,8 @@ INSERT OR IGNORE INTO /*_*/interwiki_tmp SELECT * FROM /*_*/interwiki;
 INSERT OR IGNORE INTO /*_*/page_restrictions_tmp SELECT * FROM /*_*/page_restrictions;
 INSERT OR IGNORE INTO /*_*/protected_titles_tmp SELECT * FROM /*_*/protected_titles;
 INSERT OR IGNORE INTO /*_*/page_props_tmp SELECT * FROM /*_*/page_props;
+INSERT OR IGNORE INTO /*_*/archive_tmp SELECT * FROM /*_*/archive;
+INSERT OR IGNORE INTO /*_*/externallinks_tmp SELECT * FROM /*_*/externallinks;
 
 --------------------------------------------------------------------------------
 -- Do the table renames
@@ -331,6 +376,10 @@ DROP TABLE /*_*/protected_titles;
 ALTER TABLE /*_*/protected_titles_tmp RENAME TO /*_*/protected_titles;
 DROP TABLE /*_*/page_props;
 ALTER TABLE /*_*/page_props_tmp RENAME TO /*_*/page_props;
+DROP TABLE /*_*/archive;
+ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
+DROP TABLE /*_*/externalllinks;
+ALTER TABLE /*_*/externallinks_tmp RENAME TO /*_*/externallinks;
 
 --------------------------------------------------------------------------------
 -- Drop and create tables with unique indexes but no valuable data
diff --git a/maintenance/sqlite/archives/patch-archive-ar_id.sql b/maintenance/sqlite/archives/patch-archive-ar_id.sql
new file mode 100644 (file)
index 0000000..00a9b07
--- /dev/null
@@ -0,0 +1,39 @@
+DROP TABLE IF EXISTS /*_*/archive_tmp;
+
+CREATE TABLE /*$wgDBprefix*/archive_tmp (
+  ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  ar_namespace int NOT NULL default 0,
+  ar_title varchar(255) binary NOT NULL default '',
+  ar_text mediumblob NOT NULL,
+  ar_comment tinyblob NOT NULL,
+  ar_user int unsigned NOT NULL default 0,
+  ar_user_text varchar(255) binary NOT NULL,
+  ar_timestamp binary(14) NOT NULL default '',
+  ar_minor_edit tinyint NOT NULL default 0,
+  ar_flags tinyblob NOT NULL,
+  ar_rev_id int unsigned,
+  ar_text_id int unsigned,
+  ar_deleted tinyint unsigned NOT NULL default 0,
+  ar_len int unsigned,
+  ar_page_id int unsigned,
+  ar_parent_id int unsigned default NULL,
+  ar_sha1 varbinary(32) NOT NULL default '',
+  ar_content_model varbinary(32) DEFAULT NULL,
+  ar_content_format varbinary(64) DEFAULT NULL
+);
+
+INSERT OR IGNORE INTO /*_*/archive_tmp (
+    ar_namespace, ar_title, ar_title, ar_text, ar_comment, ar_user, ar_user_text, ar_timestamp,
+    ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted, ar_len, ar_page_id, ar_parent_id )
+    SELECT
+    ar_namespace, ar_title, ar_title, ar_text, ar_comment, ar_user, ar_user_text, ar_timestamp,
+    ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted, ar_len, ar_page_id, ar_parent_id
+    FROM /*_*/archive;
+
+DROP TABLE /*_*/archive;
+
+ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
+
+CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
+CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
diff --git a/maintenance/sqlite/archives/patch-externallinks-el_id.sql b/maintenance/sqlite/archives/patch-externallinks-el_id.sql
new file mode 100644 (file)
index 0000000..0aad407
--- /dev/null
@@ -0,0 +1,19 @@
+DROP TABLE IF EXISTS /*_*/externallinks_tmp;
+
+CREATE TABLE /*$wgDBprefix*/externallinks_tmp (
+   el_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+   el_from int unsigned NOT NULL default 0,
+   el_to blob NOT NULL,
+   el_index blob NOT NULL
+);
+
+INSERT OR IGNORE INTO /*_*/externallinks_tmp (el_from, el_to, el_index) SELECT
+    el_from, el_to, el_index FROM /*_*/externallinks;
+
+DROP TABLE /*_*/externallinks;
+
+ALTER TABLE /*_*/externallinks_tmp RENAME TO /*_*/externallinks;
+
+CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
+CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
+CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
\ No newline at end of file
index d37ca47..de92ef5 100644 (file)
@@ -380,6 +380,8 @@ CREATE TABLE /*_*/text (
 -- fields, with several caveats.
 --
 CREATE TABLE /*_*/archive (
+  -- Primary key
+  ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
   ar_namespace int NOT NULL default 0,
   ar_title varchar(255) binary NOT NULL default '',
 
@@ -445,7 +447,6 @@ CREATE TABLE /*_*/archive (
 
   -- content format, see CONTENT_FORMAT_XXX constants
   ar_content_format varbinary(64) DEFAULT NULL
-
 ) /*$wgDBTableOptions*/;
 
 CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
@@ -602,6 +603,9 @@ CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
 -- Track links to external URLs
 --
 CREATE TABLE /*_*/externallinks (
+  -- Primary key
+  el_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
   -- page_id of the referring page
   el_from int unsigned NOT NULL default 0,
 
@@ -1076,7 +1080,7 @@ CREATE TABLE /*_*/recentchanges (
   -- Visibility of recent changes items, bitfield
   rc_deleted tinyint unsigned NOT NULL default 0,
 
-  -- Value corresonding to log_id, specific log entries
+  -- Value corresponding to log_id, specific log entries
   rc_logid int unsigned NOT NULL default 0,
   -- Store log type info here, or null
   rc_log_type varbinary(255) NULL default NULL,
index 880726b..c033647 100644 (file)
@@ -92,9 +92,18 @@ return array(
                        'common/commonElements.css' => array( 'media' => 'screen' ),
                        'common/commonContent.css' => array( 'media' => 'screen' ),
                        'common/commonInterface.css' => array( 'media' => 'screen' ),
-                       'vector/screen.less' => array( 'media' => 'screen' ),
-                       'vector/externalLinks.less' => array( 'media' => 'screen' ),
-                       'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
+                       'vector/styles.less',
+               ),
+               'remoteBasePath' => $GLOBALS['wgStylePath'],
+               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+       ),
+       'skins.vector.beta' => array(
+               // Keep in sync with skins.vector
+               'styles' => array(
+                       'common/commonElements.css' => array( 'media' => 'screen' ),
+                       'common/commonContent.css' => array( 'media' => 'screen' ),
+                       'common/commonInterface.css' => array( 'media' => 'screen' ),
+                       'vector/styles-beta.less' => array( 'media' => 'screen' ),
                ),
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
@@ -110,9 +119,6 @@ return array(
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
        'skins.vector.collapsibleNav' => array(
-               'styles' => array(
-                       'vector/collapsibleNav.less',
-               ),
                'scripts' => array(
                        'vector/collapsibleNav.js',
                ),
@@ -160,6 +166,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 +653,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 4a77528..a9e06db 100644 (file)
@@ -33,7 +33,7 @@
 .mw-spinner-inline {
        display: inline-block;
        vertical-align: middle;
-       
+
        /* IE < 8 */
        zoom: 1;
        *display: inline;
index 2b97b87..c5cd61e 100644 (file)
@@ -7,7 +7,7 @@
         * @param {jQuery.Event} e
         */
        function doLivePreview( e ) {
-               var $wikiPreview, copySelectors, removeSelectors, $copyElements, $spinner,
+               var $wikiPreview, $editform, copySelectors, $copyElements, $spinner,
                        targetUrl, postData, $previewDataHolder;
 
                e.preventDefault();
@@ -16,6 +16,7 @@
                $( mw ).trigger( 'LivePreviewPrepare' );
 
                $wikiPreview = $( '#wikiPreview' );
+               $editform = $( '#editform' );
 
                // Show #wikiPreview if it's hidden to be able to scroll to it
                // (if it is hidden, it's also empty, so nothing changes in the rendering)
                $copyElements = $( copySelectors.join( ',' ) );
 
                // Not shown during normal preview, to be removed if present
-               removeSelectors = [
-                       '.mw-newarticletext'
-               ];
-
-               $( removeSelectors.join( ',' ) ).remove();
+               $( '.mw-newarticletext' ).remove();
 
                $spinner = $.createSpinner( {
                        size: 'large',
                });
                $wikiPreview.before( $spinner );
                $spinner.css( {
-                       position: 'absolute',
                        marginTop: $spinner.height()
                } );
-               // Make sure preview area is at least as tall as 2x the height of the spinner.
-               // 1x because if its smaller, it will spin behind the edit toolbar.
-               // (this happens on the first preview when editPreview is still empty)
-               // 2x because the spinner has 1x margin top breathing room.
-               $wikiPreview.css( 'minHeight', $spinner.height() * 2 );
 
                // Can't use fadeTo because it calls show(), and we might want to keep some elements hidden
                // (e.g. empty #catlinks)
-               $copyElements.animate( {
-                       opacity: 0.4
-               }, 'fast' );
+               $copyElements.animate( { opacity: 0.4 }, 'fast' );
 
                $previewDataHolder = $( '<div>' );
-               targetUrl = $( '#editform' ).attr( 'action' );
+               targetUrl = $editform.attr( 'action' );
 
                // Gather all the data from the form
-               postData = $( '#editform' ).formToArray();
+               postData = $editform.formToArray();
                postData.push( {
                        name: e.target.name,
                        value: ''
@@ -83,6 +72,7 @@
                // although that requires figuring out how to convert that raw data into proper HTML.
                $previewDataHolder.load( targetUrl + ' ' + copySelectors.join( ',' ), postData, function () {
                        var i, $from;
+
                        // Copy the contents of the specified elements from the loaded page to the real page.
                        // Also copy their class attributes.
                        for ( i = 0; i < copySelectors.length; i++ ) {
 
                if ( !document.getElementById( 'wikiDiff' ) && document.getElementById( 'wikiPreview' ) ) {
                        $( '#wikiPreview' ).after(
-                               $( '<div>' ).attr( 'id', 'wikiDiff')
+                               $( '<div>' ).attr( 'id', 'wikiDiff' )
                        );
                }
 
+               // This should be moved down to '#editform', but is kept on the body for now
+               // because the LiquidThreads extension is re-using this module with only half
+               // the EditPage (doesn't include #editform presumably, bug 55463).
                $( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
        } );
 
index 8e67ea9..6e4df9f 100644 (file)
@@ -1,6 +1,23 @@
 ( function ( mw, $ ) {
        'use strict';
 
+       /**
+        * @event postEdit
+        * @member mw.hook
+        * @param {Object} [data] Optional data
+        * @param {string|jQuery|Array} [data.message] Message that listeners
+        *  should use when displaying notifications. String for plain text,
+        *  use array or jQuery object to pass actual nodes.
+        * @param {string|mw.user} [data.user=mw.user] User that made the edit.
+        */
+
+       /**
+        * After the listener for #postEdit removes the notification.
+        *
+        * @event postEdit_afterRemoval
+        * @member mw.hook
+        */
+
        var config = mw.config.get( [ 'wgAction', 'wgCookiePrefix', 'wgCurRevisionId' ] ),
                // This should match EditPage::POST_EDIT_COOKIE_KEY_PREFIX:
                cookieKey = config.wgCookiePrefix + 'PostEditRevision' + config.wgCurRevisionId,
                $.cookie( cookieKey, null, { path: '/' } );
                mw.config.set( 'wgPostEdit', true );
 
-               /**
-                * @event postEdit
-                * @member mw.hook
-                * @param {Object} [data]
-                * @param {string|jQuery|Array} [data.message] Message that listeners
-                *  should use when displaying notifications. String for plain text,
-                *  use array or jQuery object to pass actual nodes.
-                * @param {string|mw.user} [data.user=mw.user] User that made the edit.
-                */
                mw.hook( 'postEdit' ).fire();
        }
 
index 381e172..cc83a4b 100644 (file)
@@ -3,9 +3,6 @@
  */
 ( function ( mw, $ ) {
 
-       // Cache token so we don't have to keep fetching new ones for every single request.
-       var cachedToken = null;
-
        $.extend( mw.Api.prototype, {
 
                /**
                 * @return {jQuery.Promise} See #post
                 */
                postWithEditToken: function ( params, ok, err ) {
-                       var useTokenToPost, getTokenIfBad,
-                               api = this;
-                       if ( cachedToken === null ) {
-                               // We don't have a valid cached token, so get a fresh one and try posting.
-                               // We do not trap any 'badtoken' or 'notoken' errors, because we don't want
-                               // an infinite loop. If this fresh token is bad, something else is very wrong.
-                               useTokenToPost = function ( token ) {
-                                       params.token = token;
-                                       api.post( params, { ok: ok, err: err } );
-                               };
-                               return api.getEditToken( useTokenToPost, err );
-                       } else {
-                               // We do have a token, but it might be expired. So if it is 'bad' then
-                               // start over with a new token.
-                               params.token = cachedToken;
-                               getTokenIfBad = function ( code, result ) {
-                                       if ( code === 'badtoken' ) {
-                                               // force a new token, clear any old one
-                                               cachedToken = null;
-                                               api.postWithEditToken( params, ok, err );
-                                       } else {
-                                               err( code, result );
-                                       }
-                               };
-                               return api.post( params, { ok: ok, err: getTokenIfBad } );
-                       }
+                       return this.postWithToken( 'edit', params ).done( ok ).fail( err );
                },
 
                /**
                 * @return {string} return.done.token Received token.
                 */
                getEditToken: function ( ok, err ) {
-                       var d = $.Deferred(),
-                               apiPromise;
-
-                       // Backwards compatibility (< MW 1.20)
-                       d.done( ok ).fail( err );
-
-                       apiPromise = this.get( {
-                                       action: 'tokens',
-                                       type: 'edit'
-                               }, {
-                                       // Due to the API assuming we're logged out if we pass the callback-parameter,
-                                       // we have to disable jQuery's callback system, and instead parse JSON string,
-                                       // by setting 'jsonp' to false.
-                                       // TODO: This concern seems genuine but no other module has it. Is it still
-                                       // needed and/or should we pass this by default?
-                                       jsonp: false
-                               } )
-                               .done( function ( data ) {
-                                       var token;
-                                       // If token type is not available for this user,
-                                       // key 'edittoken' is missing or can contain Boolean false
-                                       if ( data.tokens && data.tokens.edittoken ) {
-                                               token = data.tokens.edittoken;
-                                               cachedToken = token;
-                                               d.resolve( token );
-                                       } else {
-                                               d.reject( 'token-missing', data );
-                                       }
-                               } )
-                               .fail( d.reject );
-
-                       return d.promise( { abort: apiPromise.abort } );
+                       return this.getToken( 'edit' ).done( ok ).fail( err );
                },
 
                /**
                                text: message
                        }, ok, err );
                }
-
-        } );
+       } );
 
        /**
         * @class mw.Api
index 142c454..f9a14b0 100644 (file)
@@ -20,7 +20,8 @@
 
                                dataType: 'json'
                        }
-               };
+               },
+               tokenCache = {};
 
        /**
         * Constructor to create an object to interact with the API of a particular MediaWiki server.
                        return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
                                mw.log( 'mw.Api error: ', code, details );
                        } );
-               }
+               },
+
+               /**
+                * Post to API with specified type of token. If we have no token, get one and try to post.
+                * If we have a cached token try using that, and if it fails, blank out the
+                * cached token and start over. For example to change an user option you could do:
+                *
+                *     new mw.Api().postWithToken( 'options', {
+                *         action: 'options',
+                *         optionname: 'gender',
+                *         optionvalue: 'female'
+                *     } );
+                *
+                * @param {string} tokenType The name of the token, like options or edit.
+                * @param {Object} params API parameters
+                * @return {jQuery.Promise} See #post
+                */
+               postWithToken: function ( tokenType, params ) {
+                       var api = this, hasOwn = tokenCache.hasOwnProperty;
+                       if ( hasOwn.call( tokenCache, tokenType ) && tokenCache[tokenType] !== undefined ) {
+                               params.token = tokenCache[tokenType];
+                               return api.post( params ).then(
+                                       null,
+                                       function ( code ) {
+                                               if ( code === 'badtoken' ) {
+                                                       // force a new token, clear any old one
+                                                       tokenCache[tokenType] = params.token = undefined;
+                                                       return api.post( params );
+                                               }
+                                       }
+                               );
+                       } else {
+                               return api.getToken( tokenType ).then( function ( token ) {
+                                       tokenCache[tokenType] = params.token = token;
+                                       return api.post( params );
+                               } );
+                       }
+               },
 
+               /**
+                * Api helper to grab any token.
+                *
+                * @param {string} type Token type.
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.token Received token.
+                */
+               getToken: function ( type ) {
+                       var apiPromise,
+                               d = $.Deferred();
+
+                       apiPromise = this.get( {
+                                       action: 'tokens',
+                                       type: type
+                               }, {
+                                       // Due to the API assuming we're logged out if we pass the callback-parameter,
+                                       // we have to disable jQuery's callback system, and instead parse JSON string,
+                                       // by setting 'jsonp' to false.
+                                       // TODO: This concern seems genuine but no other module has it. Is it still
+                                       // needed and/or should we pass this by default?
+                               } )
+                               .done( function ( data ) {
+                                       // If token type is not available for this user,
+                                       // key '...token' is missing or can contain Boolean false
+                                       if ( data.tokens && data.tokens[type + 'token'] ) {
+                                               d.resolve( data.tokens[type + 'token'] );
+                                       } else {
+                                               d.reject( 'token-missing', data );
+                                       }
+                               } )
+                               .fail( d.reject );
+
+                       return d.promise( { abort: apiPromise.abort } );
+               }
        };
 
        /**
index cca5af4..19a715b 100644 (file)
@@ -38,9 +38,9 @@
        list-style-image: url(@url);
 }
 
-.transition( ... ) {
-       -moz-transition: @arguments;
-       -webkit-transition: @arguments;
-       -o-transition: @arguments;
-       transition: @arguments;
+.transition(@string) {
+       -webkit-transition: @string;
+       -moz-transition: @string;
+       -o-transition: @string;
+       transition: @string;
 }
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 ) {
index 312f811..24c8d77 100644 (file)
 #mw-createaccount-cta {
        width: 20em;
        height: 10em;
-       text-align: center;
        /* @embed */
        background: url(images/glyph-people-large.png) no-repeat 50%;
        margin: 0 auto;
 }
 
-#mw-createaccount-cta h3 {
+#mw-createaccount-cta h3,
+#mw-createaccount-another h3 {
        font-size: 0.9em;
        font-weight: normal;
        text-align: center;
+}
+
+#mw-createaccount-cta h3 {
        padding-top: 4em;
 }
 
index 2d948ea..9ffe11c 100644 (file)
@@ -22,9 +22,7 @@ section.mw-form-header {
 }
 
 /*
- * Besides errorbox there could be warningbox, successbox, msgbox, though
- * spage has never seen these in practice.
- * Vector has styles coloring warningbox cream and successbox green.
+ * Styles for information boxes.
  */
 .mw-ui-vform .errorbox,
 .mw-ui-vform .warningbox,
@@ -35,11 +33,26 @@ section.mw-form-header {
        font-size: 0.9em;
        margin: 0 0 1em 0;
        padding: 0.5em;
+       border: 1px solid;
+       word-wrap: break-word;
+}
+
+.mw-ui-vform .errorbox {
        color: #cc0000;
-       border: 1px solid #fac5c5;
+       border-color: #fac5c5;
        background-color: #fae3e3;
-       text-shadow: 0 1px #fae3e3;
-       word-wrap: break-word;
+}
+
+.mw-ui-vform .warningbox {
+       color: #705000;
+       border-color: #fde29b;
+       background-color: #fdf1d1;
+}
+
+.mw-ui-vform .successbox {
+       color: #009000;
+       border-color: #b7fdb5;
+       background-color: #e1fddf;
 }
 
 /*
index 89ca25a..b072616 100644 (file)
@@ -1,3 +1,4 @@
+@charset "UTF-8";
 /**
  * Provide Agora appearance for mw-ui-* classes when using a skin other than
  * Vector.
@@ -140,14 +141,14 @@ a.mw-ui-button {
   box-sizing: border-box;
   width: 290px;
 }
-/* line 19, sourcefiles/scss/components/default/_forms.scss */
+/* line 20, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div {
   display: block;
   margin: 0 0 15px 0;
   padding: 0;
   width: 100%;
 }
-/* line 27, sourcefiles/scss/components/default/_forms.scss */
+/* line 28, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input,
 .mw-ui-vform > div .mw-ui-button {
   display: block;
@@ -157,21 +158,24 @@ a.mw-ui-button {
   margin: 0;
   width: 100%;
 }
-/* line 36, sourcefiles/scss/components/default/_forms.scss */
+/* line 37, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]) {
-  outline: 0;
   border-style: solid;
   border-width: 1px;
   border-color: #c9c9c9;
   color: #252525;
   padding: 0.35em 0 0.35em 0.5em;
 }
-/* line 12, sourcefiles/scss/mixins/_forms.scss */
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
 .mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus {
   box-shadow: #4091ed 0px 0px 5px;
   border-color: #4091ed;
 }
-/* line 38, sourcefiles/scss/components/default/_forms.scss */
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus:not([type=checkbox]):not([type=radio]) {
+  outline: 0;
+}
+/* line 41, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div label {
   display: block;
   -webkit-box-sizing: border-box;
@@ -183,11 +187,11 @@ a.mw-ui-button {
   margin: 0 0 0.2em 0;
   padding: 0;
 }
-/* line 34, sourcefiles/scss/mixins/_forms.scss */
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
 .mw-ui-vform > div label * {
   font-weight: normal;
 }
-/* line 49, sourcefiles/scss/components/default/_forms.scss */
+/* line 52, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input[type="checkbox"],
 .mw-ui-vform > div input[type="radio"] {
   display: inline;
@@ -196,33 +200,58 @@ a.mw-ui-button {
   box-sizing: content-box;
   width: auto;
 }
+/* line 63, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform .error {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 0.9em;
+  margin: 0 0 1em 0;
+  padding: 0.5em;
+  color: #cc0000;
+  border: 1px solid #fac5c5;
+  background-color: #fae3e3;
+  text-shadow: 0 1px #fae3e3;
+  word-wrap: break-word;
+}
 
-/* line 65, sourcefiles/scss/components/default/_forms.scss */
+/* line 86, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform-div {
+  display: block;
+  margin: 0 0 15px 0;
+  padding: 0;
+  width: 100%;
+}
+
+/* line 96, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-input {
-  outline: 0;
   border-style: solid;
   border-width: 1px;
   border-color: #c9c9c9;
   color: #252525;
   padding: 0.35em 0 0.35em 0.5em;
 }
-/* line 12, sourcefiles/scss/mixins/_forms.scss */
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
 .mw-ui-input:focus {
   box-shadow: #4091ed 0px 0px 5px;
   border-color: #4091ed;
 }
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus:not([type=checkbox]):not([type=radio]) {
+  outline: 0;
+}
 
-/* line 72, sourcefiles/scss/components/default/_forms.scss */
+/* line 103, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-label {
   font-size: 0.9em;
   color: #4a4a4a;
 }
-/* line 34, sourcefiles/scss/mixins/_forms.scss */
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
 .mw-ui-label * {
   font-weight: normal;
 }
 
-/* line 81, sourcefiles/scss/components/default/_forms.scss */
+/* line 112, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-checkbox-label, .mw-ui-radio-label {
   margin-bottom: 0.5em;
   cursor: pointer;
@@ -230,7 +259,7 @@ a.mw-ui-button {
   line-height: normal;
   font-weight: normal;
 }
-/* line 50, sourcefiles/scss/mixins/_forms.scss */
+/* line 54, sourcefiles/scss/mixins/_forms.scss */
 .mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
   width: auto;
   height: auto;
index d55ddc5..fd9e091 100644 (file)
@@ -1,3 +1,4 @@
+@charset "UTF-8";
 /**
  * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
  * Compass builds these Agora styles from source Sass files in
@@ -268,14 +269,14 @@ a.mw-ui-button {
   box-sizing: border-box;
   width: 290px;
 }
-/* line 19, sourcefiles/scss/components/default/_forms.scss */
+/* line 20, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div {
   display: block;
   margin: 0 0 15px 0;
   padding: 0;
   width: 100%;
 }
-/* line 27, sourcefiles/scss/components/default/_forms.scss */
+/* line 28, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input,
 .mw-ui-vform > div .mw-ui-button {
   display: block;
@@ -285,21 +286,24 @@ a.mw-ui-button {
   margin: 0;
   width: 100%;
 }
-/* line 36, sourcefiles/scss/components/default/_forms.scss */
+/* line 37, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]) {
-  outline: 0;
   border-style: solid;
   border-width: 1px;
   border-color: #c9c9c9;
   color: #252525;
   padding: 0.35em 0 0.35em 0.5em;
 }
-/* line 12, sourcefiles/scss/mixins/_forms.scss */
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
 .mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus {
   box-shadow: #4091ed 0px 0px 5px;
   border-color: #4091ed;
 }
-/* line 38, sourcefiles/scss/components/default/_forms.scss */
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus:not([type=checkbox]):not([type=radio]) {
+  outline: 0;
+}
+/* line 41, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div label {
   display: block;
   -webkit-box-sizing: border-box;
@@ -311,11 +315,11 @@ a.mw-ui-button {
   margin: 0 0 0.2em 0;
   padding: 0;
 }
-/* line 34, sourcefiles/scss/mixins/_forms.scss */
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
 .mw-ui-vform > div label * {
   font-weight: normal;
 }
-/* line 49, sourcefiles/scss/components/default/_forms.scss */
+/* line 52, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input[type="checkbox"],
 .mw-ui-vform > div input[type="radio"] {
   display: inline;
@@ -324,33 +328,58 @@ a.mw-ui-button {
   box-sizing: content-box;
   width: auto;
 }
+/* line 63, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform .error {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 0.9em;
+  margin: 0 0 1em 0;
+  padding: 0.5em;
+  color: #cc0000;
+  border: 1px solid #fac5c5;
+  background-color: #fae3e3;
+  text-shadow: 0 1px #fae3e3;
+  word-wrap: break-word;
+}
 
-/* line 65, sourcefiles/scss/components/default/_forms.scss */
+/* line 86, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform-div {
+  display: block;
+  margin: 0 0 15px 0;
+  padding: 0;
+  width: 100%;
+}
+
+/* line 96, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-input {
-  outline: 0;
   border-style: solid;
   border-width: 1px;
   border-color: #c9c9c9;
   color: #252525;
   padding: 0.35em 0 0.35em 0.5em;
 }
-/* line 12, sourcefiles/scss/mixins/_forms.scss */
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
 .mw-ui-input:focus {
   box-shadow: #4091ed 0px 0px 5px;
   border-color: #4091ed;
 }
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus:not([type=checkbox]):not([type=radio]) {
+  outline: 0;
+}
 
-/* line 72, sourcefiles/scss/components/default/_forms.scss */
+/* line 103, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-label {
   font-size: 0.9em;
   color: #4a4a4a;
 }
-/* line 34, sourcefiles/scss/mixins/_forms.scss */
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
 .mw-ui-label * {
   font-weight: normal;
 }
 
-/* line 81, sourcefiles/scss/components/default/_forms.scss */
+/* line 112, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-checkbox-label, .mw-ui-radio-label {
   margin-bottom: 0.5em;
   cursor: pointer;
@@ -358,7 +387,7 @@ a.mw-ui-button {
   line-height: normal;
   font-weight: normal;
 }
-/* line 50, sourcefiles/scss/mixins/_forms.scss */
+/* line 54, sourcefiles/scss/mixins/_forms.scss */
 .mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
   width: auto;
   height: auto;
index dfcd36f..a9cec39 100644 (file)
@@ -16,6 +16,7 @@ $defaultFormWidth: $captchaContainerWidth;
 
     width: $defaultFormWidth;
 
+    // Immediate divs in a vform are block and spaced-out.
     & > div {
         display: block;
         margin: 0 0 15px 0;
@@ -55,12 +56,40 @@ $defaultFormWidth: $captchaContainerWidth;
         }
 
     }
+
+    // HTMLForm uses error, SpecialUserlogin (login and create account) uses
+    // errorbox.
+    // TODO move errorbox from mediawiki.special.vforms.css into here.
+    .error {
+        -webkit-box-sizing: border-box;
+        -moz-box-sizing: border-box;
+        box-sizing: border-box;
+        font-size: 0.9em;
+        margin: 0 0 1em 0;
+        padding: 0.5em;
+        color: #cc0000;
+        border: 1px solid #fac5c5;
+        background-color: #fae3e3;
+        text-shadow: 0 1px #fae3e3;
+        word-wrap: break-word;
+    }
 }
 
 // --------------------------------------------------------------------------
 // Elements
 // --------------------------------------------------------------------------
 
+// Apply this to individual elements to style them.
+// You generally don't need to use this class on divs within an Agora
+// form container such as mw-ui-vform
+// XXX DRY: This repeats earlier styling, use an @include agora-div-styling ?
+.mw-ui-vform-div {
+       display: block;
+       margin: 0 0 15px 0;
+       padding: 0;
+       width: 100%;
+}
+
 // Apply mw-ui-input to individual input fields to style them.
 // You generally don't need to use this class if <input> is within an Agora
 // form container such as mw-ui-vform
index 5db857a..0f3f6ad 100644 (file)
@@ -1,62 +1,66 @@
 // Font is not included.
 // For Vector, that should be layered on top with vector-type
 @mixin agora-field-styling() {
-    @include reset-focus;  // Removes OS field focus
-
-    border: {
-        style: solid;
-        width: 1px;
-        color: $agoraGray;
-    };
-
-    &:focus {
-        // @include box-shadow generates unneeded prefixes
-        // https://github.com/chriseppstein/compass/issues/1054 , so specify
-        // directly.
-        box-shadow: $agoraBlueShadow 0px 0px 5px;
-
-        border: {
-            color: $agoraBlueShadow;
-        };
-    }
-
-    color: $agoraTextColor;
-    padding: 0.35em 0 0.35em 0.5em;
+
+       border: {
+               style: solid;
+               width: 1px;
+               color: $agoraGray;
+       };
+
+       &:focus {
+               // Styling focus of native checkboxes etc on Mac is almost impossible.
+               &:not([type=checkbox]):not([type=radio]) {
+                       @include reset-focus;  // Removes OS field focus
+               };
+
+               // @include box-shadow generates unneeded prefixes
+               // https://github.com/chriseppstein/compass/issues/1054 , so specify
+               // directly.
+               box-shadow: $agoraBlueShadow 0px 0px 5px;
+
+               border: {
+                       color: $agoraBlueShadow;
+               };
+       }
+
+       color: $agoraTextColor;
+       padding: 0.35em 0 0.35em 0.5em;
 }
 
 @mixin agora-label-styling() {
-    font: {
-        //weight: bold;
-        size: 0.9em;
-    };
-    color: darken($agoraGray, 50%);
-
-    & * {
-        font-weight: normal;
-    }
+       font: {
+               //weight: bold;
+               size: 0.9em;
+       };
+       color: darken($agoraGray, 50%);
+
+       & * {
+               font-weight: normal;
+       }
 }
 
 @mixin agora-inline-label-styling() {
-    margin-bottom: 0.5em;
-    cursor: pointer;
-    vertical-align: bottom;
-    line-height: normal;
-
-    font: {
-        weight: normal;
-    };
-
-    & > input[type="checkbox"],
-    & > input[type="radio"] {
-        width: auto;
-        height: auto;
-        margin: 0 0.1em 0em 0;
-        padding: 0;
-        border: {
-            style: solid;
-            width: 1px;
-            color: $agoraGray;
-        }
-        cursor: pointer;
-    }
+       margin-bottom: 0.5em;
+       cursor: pointer;
+       vertical-align: bottom;
+       line-height: normal;
+
+       font: {
+               weight: normal;
+       };
+
+       & > input[type="checkbox"],
+       & > input[type="radio"] {
+               width: auto;
+               height: auto;
+               margin: 0 0.1em 0em 0;
+               padding: 0;
+               border: {
+                       style: solid;
+                       width: 1px;
+                       color: $agoraGray;
+               }
+               cursor: pointer;
+       }
 }
index 98277fc..b236019 100644 (file)
@@ -9,9 +9,8 @@
         * @class mw.Title
         *
         * Parse titles into an object struture. Note that when using the constructor
-        * directly, passing invalid titles will result in an exception. Use
-        * #newFromText to use the logic directly and get null for invalid titles
-        * which is easier to work with.
+        * directly, passing invalid titles will result in an exception. Use #newFromText to use the
+        * logic directly and get null for invalid titles which is easier to work with.
         *
         * @constructor
         * @param {string} title Title of the page. If no second argument given,
                return t;
        };
 
+       /**
+        * Get the file title from an image element
+        *
+        *     var title = mw.Title.newFromImg( $( 'img:first' ) );
+        *
+        * @static
+        * @param {HTMLElement|jQuery} img The image to use as a base
+        * @return {mw.Title|null} The file title or null if unsuccessful
+        */
+       Title.newFromImg = function ( img ) {
+               var matches, i, regex, src, decodedSrc,
+
+                       // thumb.php-generated thumbnails
+                       thumbPhpRegex = /thumb\.php/,
+
+                       regexes = [
+                               // Thumbnails
+                               /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[0-9]+px-\1[^\s\/]*$/,
+
+                               // Thumbnails in non-hashed upload directories
+                               /\/([^\s\/]+)\/[0-9]+px-\1[^\s\/]*$/,
+
+                               // Full size images
+                               /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)$/,
+
+                               // Full-size images in non-hashed upload directories
+                               /\/([^\s\/]+)$/
+                       ],
+
+                       recount = regexes.length;
+
+               src = img.jquery ? img[0].src : img.src;
+
+               matches = src.match( thumbPhpRegex );
+
+               if ( matches ) {
+                       return mw.Title.newFromText( 'File:' + mw.util.getParamValue( 'f', src ) );
+               }
+
+               decodedSrc = decodeURIComponent( src );
+
+               for ( i = 0; i < recount; i++ ) {
+                       regex = regexes[i];
+                       matches = decodedSrc.match( regex );
+
+                       if ( matches && matches[1] ) {
+                               return mw.Title.newFromText( 'File:' + matches[1] );
+                       }
+               }
+
+               return null;
+       };
+
        /**
         * Whether this title exists on the wiki.
         *
diff --git a/resources/mediawiki/mediawiki.inspect.js b/resources/mediawiki/mediawiki.inspect.js
new file mode 100644 (file)
index 0000000..5cecc16
--- /dev/null
@@ -0,0 +1,107 @@
+/*!
+ * 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' ) );
+                                               } );
+                                       }
+                               }
+                       } );
+               }
+       };
+
+       if ( mw.config.get( 'debug' ) ) {
+               inspect.getModuleSize = function () { return null; };
+               mw.log( 'mw.inspect: Module sizes are not available in debug mode.' );
+       }
+
+       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 6fa8b3c..b6a27d2 100644 (file)
@@ -39,7 +39,9 @@ function isCompatible( ua ) {
                // Any NetFront based browser
                ua.match( /NetFront/ ) ||
                // Opera Mini, all versions
-               ua.match( /Opera Mini/ )
+               ua.match( /Opera Mini/ ) ||
+               // Nokia's Ovi Browser
+               ua.match( /S40OviBrowser/ )
        );
 }
 
index c07a593..288b5fd 100644 (file)
@@ -66,7 +66,10 @@ class SkinVector extends SkinTemplate {
         */
        function setupSkinUserCss( OutputPage $out ) {
                parent::setupSkinUserCss( $out );
-               $out->addModuleStyles( 'skins.vector' );
+
+               $styles = array( 'skins.vector' );
+               wfRunHooks( 'SkinVectorStyleModules', array( &$this, &$styles ) );
+               $out->addModuleStyles( $styles );
        }
 
        /**
diff --git a/skins/vector/beta/screen.less b/skins/vector/beta/screen.less
new file mode 100644 (file)
index 0000000..6d56cd5
--- /dev/null
@@ -0,0 +1,75 @@
+/* Content */
+#content {
+       line-height: 1.5em;
+       .mw-editsection {
+               font-family: @content-font-family;
+       }
+
+       h1,
+       #firstHeading {
+               font-family: @content-heading-font-family;
+               font-size: 1.833em;
+               line-height: 22pt;
+               padding: 0;
+               margin-bottom: 4pt;
+       }
+
+       h2 {
+               font-size: 1.5em;
+               line-height: 22pt;
+       }
+
+       h2,
+       h3,
+       h4,
+       h5,
+       h6 {
+               font-family: @content-heading-font-family;
+               padding: 0;
+               margin-bottom: 4pt;
+               margin-top: 14pt;
+       }
+
+       h3 {
+               font-size: 1.17em;
+               line-height: 22pt;
+       }
+
+       h3,
+       h4 {
+               font-weight: bold;
+       }
+
+       h4,
+       h5,
+       h6 {
+               font-size: 100%; /* (reset) */
+       }
+
+       h6 {
+               font-style: italic;
+       }
+
+       p {
+               margin-bottom: 8pt;
+       }
+
+       // FIXME: this is hacky
+       #toc h2 {
+               font-size: 100%;
+       }
+}
+
+/* Personal menu */
+#p-personal a {
+       color: #555;
+}
+
+/* Main menu */
+div#mw-panel div.portal {
+       margin-left: 1.25em;
+       h3 {
+               margin: 0;
+               line-height: 1;
+       }
+}
diff --git a/skins/vector/beta/variables.less b/skins/vector/beta/variables.less
new file mode 100644 (file)
index 0000000..3462795
--- /dev/null
@@ -0,0 +1,37 @@
+@html-font-size: 90%;
+
+@body-font-size: inherit;
+@body-font-color: inherit;
+
+// Page content
+@content-font-family: "Helvetica Neue", "Helvetica", "Nimbus Sans L", "Arial", "Liberation Sans", sans-serif;
+@content-font-size: 0.9em;
+@content-line-height: inherit;
+@content-padding: 1em;
+@content-heading-font-size: 1.6em;
+@content-heading-font-family: Georgia, "DejaVu Serif", serif;
+
+// Common menu
+@menu-link-color: #555;
+
+// Main menu
+@menu-main-font-size: 0.82em;
+@menu-main-heading-font-size: 100%;
+@menu-main-heading-padding: 5px 0;
+
+@menu-main-body-font-size: inherit;
+@menu-main-body-link-color: inherit;
+@menu-main-body-link-visited-color: inherit;
+@menu-main-body-margin: 0;
+@menu-main-body-padding: 0 0 10px;
+@menu-main-logo-left: 1.6em;
+
+// Personal menu
+@menu-personal-font-size: 0.75em;
+
+// Collapsible nav
+@collapsible-nav-heading-color: #555;
+@collapsible-nav-heading-collapsed-color: inherit;
+
+@collapsible-nav-heading-padding: 4px 0 3px 1.5em;
+@collapsible-nav-body-margin: 0 0 0 1.25em;
index 25ebec7..e6f5c9a 100644 (file)
                margin: -11px 9px 10px 11px;
 
                h3 {
-                       color: #4D4D4D;
+                       font-size: @menu-main-heading-font-size;
+                       color: @collapsible-nav-heading-color;
                        font-weight: normal;
                        background-position: left center;
                        background-repeat: no-repeat;
                        .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
-                       padding: 4px 0 3px 1.5em;
+                       padding: @collapsible-nav-heading-padding;
                        margin-bottom: 0;
 
                        &:hover {
                        }
 
                        a {
-                               color: #4D4D4D;
+                               color: @collapsible-nav-heading-color;
                                text-decoration: none;
                        }
                }
 
                .body {
+                       margin: @collapsible-nav-body-margin;
                        background-image: none !important;
                        padding-top: 0;
                        display: none;
@@ -70,7 +72,7 @@
                /* Collapsed */
                &.collapsed {
                        h3 {
-                               color: #0645AD;
+                               color: @collapsible-nav-heading-collapsed-color;
                                background-position: left center;
                                background-repeat: no-repeat;
                                .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
@@ -81,7 +83,7 @@
                                }
 
                                a {
-                                       color: #0645AD;
+                                       color: @collapsible-nav-heading-collapsed-color;
                                }
                        }
                }
diff --git a/skins/vector/screen-hd.css b/skins/vector/screen-hd.css
deleted file mode 100644 (file)
index 7dbb1ba..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Vector screen styles for high definition displays */
-
-div#content {
-       margin-left: 11em;
-       padding: 1.25em 1.5em 1.5em 1.5em;
-}
-#p-logo {
-       left: 0.5em;
-}
-div#footer {
-       margin-left: 11em;
-       padding: 1.25em;
-}
-#mw-panel {
-       padding-left: 0.5em;
-}
-#p-search {
-       margin-right: 1em;
-}
-#left-navigation {
-       margin-left: 11em;
-}
-#p-personal {
-       right: 1em;
-}
-#mw-head-base {
-       margin-left: 11em;
-}
diff --git a/skins/vector/screen-hd.less b/skins/vector/screen-hd.less
new file mode 100644 (file)
index 0000000..5a1fc05
--- /dev/null
@@ -0,0 +1,28 @@
+/* Vector screen styles for high definition displays */
+
+div#content {
+       margin-left: 11em;
+       padding: 1.25em 1.5em 1.5em 1.5em;
+}
+#p-logo {
+       left: @menu-main-logo-left;
+}
+div#footer {
+       margin-left: 11em;
+       padding: 1.25em;
+}
+#mw-panel {
+       padding-left: 0.5em;
+}
+#p-search {
+       margin-right: 1em;
+}
+#left-navigation {
+       margin-left: 11em;
+}
+#p-personal {
+       right: 1em;
+}
+#mw-head-base {
+       margin-left: 11em;
+}
index e00bcef..f5cf5e5 100644 (file)
@@ -1,40 +1,43 @@
 /*
  * Any rules which should not be flipped automatically in right-to-left situations should be
- * prepended with @noflip in a comment block. Images that should be embedded as base64 data-URLs
- * should be prepended with @embed in a comment block.
+ * prepended with @noflip in a comment block.
  *
- * This style-sheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
  * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
  * a rule that makes things work in IE6, and then following it with a rule that begins with
  * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
  * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
  * "IGNORED BY IE6" comments.
  */
-@import "mediawiki.mixins.less";
+@import "mediawiki.mixins";
 
 /* Framework */
+html {
+       font-size: @html-font-size;
+}
 html,
 body {
        height: 100%;
        margin: 0;
        padding: 0;
-       font-family: sans-serif;
-       font-size: 1em;
+       font-family: @content-font-family;
 }
 body {
        background-color: #f6f6f6;
+       font-size: @body-font-size;
 }
 /* Content */
 div#content {
+       line-height: @content-line-height;
        margin-left: 10em;
-       padding: 1em;
+       padding: @content-padding;
        /* Border on top, left, and bottom side */
        border: 1px solid #a7d7f9;
        border-right-width: 0;
        /* Merge the border with tabs' one (in their background image) */
        margin-top: -1px;
        background-color: white;
-       color: black;
+       color: @body-font-color;
        direction: ltr;
 }
 /* Hide, but keep accessible for screen-readers */
@@ -86,16 +89,13 @@ div.emptyPortlet {
        margin: 0;
        padding-left: 10em; /* Keep from overlapping logo */
 }
-/* @noflip */
 #p-personal li {
        line-height: 1.125em;
+       /* @noflip */
        float: left;
-}
-/* This one flips! */
-#p-personal li {
        margin-left: 0.75em;
        margin-top: 0.5em;
-       font-size: 0.75em;
+       font-size: @menu-personal-font-size;
        white-space: nowrap;
 }
 /* Navigation Containers */
@@ -122,8 +122,8 @@ div.vectorMenu h3 span {
        display: none;
 }
 /* Namespaces and Views */
-/* @noflip */
 div.vectorTabs {
+       /* @noflip */
        float: left;
        height: 2.5em;
 }
@@ -133,23 +133,19 @@ div.vectorTabs {
        background-repeat: no-repeat;
        padding-left: 1px;
 }
-/* @noflip */
 div.vectorTabs ul {
+       /* @noflip */
        float: left;
-}
-div.vectorTabs ul {
        height: 100%;
        list-style-type: none;
        list-style-image: none;
        margin: 0;
        padding: 0;
 }
-/* @noflip */
-div.vectorTabs ul li {
-       float: left;
-}
 /* OVERRIDDEN BY COMPLIANT BROWSERS */
 div.vectorTabs ul li {
+       /* @noflip */
+       float: left;
        line-height: 1.125em;
        display: inline-block;
        height: 100%;
@@ -174,7 +170,7 @@ div.vectorTabs li a {
        height: 1.9em;
        padding-left: 0.5em;
        padding-right: 0.5em;
-       color: #0645ad;
+       color: @menu-link-color;
        cursor: pointer;
        font-size: 0.8em;
 }
@@ -192,8 +188,8 @@ div.vectorTabs span a  {
        padding-top: 1.25em;
 }
 /* IGNORED BY IE6 */
-/* @noflip */
 div.vectorTabs span > a {
+       /* @noflip */
        float: left;
        display: block;
 }
@@ -213,13 +209,15 @@ div.vectorTabs li.new a:visited{
        color: #a55858;
 }
 /* Variants and Actions */
-/* @noflip */
 div.vectorMenu {
+       /* @noflip */
        direction: ltr;
+       /* @noflip */
        float: left;
        /* SVG support using a transparent gradient to guarantee cross-browser
         * compatibility (browsers able to understand gradient syntax support also SVG) */
        .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
+       /* @noflip */
        background-position: 100% 60%;
        background-repeat: no-repeat;
        cursor: pointer;
@@ -230,19 +228,16 @@ div.vectorMenuFocus {
        .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
        background-position: 100% 60%;
 }
-/* @noflip */
 body.rtl div.vectorMenu {
+       /* @noflip */
        direction: rtl;
 }
 /* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
 div#mw-head div.vectorMenu h3 {
+       /* @noflip */
        float: left;
        .background-image('images/tab-break.png');
        background-repeat: no-repeat;
-}
-/* This will be flipped - unlike the one above it */
-div#mw-head div.vectorMenu h3 {
        background-position: bottom left;
        margin-left: -1px;
 }
@@ -261,7 +256,6 @@ div.vectorMenu#p-variants #mw-vector-current-variant {
        border: none;
 }
 /* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
 div.vectorMenu h3 a {
        display: inline-block;
        width: 24px;
@@ -269,9 +263,6 @@ div.vectorMenu h3 a {
        text-decoration: none;
        .background-image('images/tab-break.png');
        background-repeat: no-repeat;
-}
-/* This will be flipped - unlike the one above it */
-div.vectorMenu h3 a {
        background-position: bottom right;
 }
 /* IGNORED BY IE6 */
@@ -285,20 +276,20 @@ div.vectorMenu div.menu {
        text-align: left;
 }
 /* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
 body.rtl div.vectorMenu div.menu {
+       /* @noflip */
        margin-left: 24px;
 }
 /* IGNORED BY IE6 */
-/* @noflip */
 body.rtl div.vectorMenu > div.menu {
+       /* @noflip */
        margin-left: auto;
 }
 /* IGNORED BY IE6 */
 /* Also fixes old versions of FireFox */
-/* @noflip */
 body.rtl div.vectorMenu > div.menu,
 x:-moz-any-link {
+       /* @noflip */
        margin-left: 23px;
 }
 /* Enable forcing showing of the menu for accessibility */
@@ -340,7 +331,7 @@ div.vectorMenu li a {
        display: inline-block;
        padding: 0.5em;
        white-space: nowrap;
-       color: #0645ad;
+       color: @menu-link-color;
        cursor: pointer;
        font-size: 0.8em;
 }
@@ -357,8 +348,8 @@ div.vectorMenu li.selected a:visited {
 #p-search h3 {
        display: none;
 }
-/* @noflip */
 #p-search {
+       /* @noflip */
        float: left;
 }
 #p-search {
@@ -448,6 +439,7 @@ div#simpleSearch button#searchButton > img {
 }
 /* Panel */
 div#mw-panel {
+       font-size: @menu-main-font-size;
        position: absolute;
        top: 160px;
        padding-top: 1em;
@@ -461,17 +453,15 @@ div#mw-panel div.portal {
 div#mw-panel div.portal h3 {
        font-weight: normal;
        color: #444;
-       padding: 0.25em;
-       padding-top: 0;
-       padding-left: 1.75em;
+       padding: @menu-main-heading-padding;
        cursor: default;
        border: none;
-       font-size: 0.75em;
+       font-size: @menu-main-heading-font-size;
 }
 div#mw-panel div.portal div.body {
-       margin: 0;
        padding-top: 0.5em;
-       margin-left: 1.25em;
+       margin: @menu-main-body-margin;
+
        .background-image('images/portal-break.png');
        background-repeat: no-repeat;
        background-position: top left;
@@ -479,7 +469,7 @@ div#mw-panel div.portal div.body {
 div#mw-panel div.portal div.body ul {
        list-style-type: none;
        list-style-image: none;
-       padding: 0;
+       padding: @menu-main-body-padding;
        margin: 0;
 }
 div#mw-panel div.portal div.body ul li {
@@ -487,15 +477,16 @@ div#mw-panel div.portal div.body ul li {
        padding: 0;
        padding-bottom: 0.5em;
        margin: 0;
-       font-size: 0.75em;
+       font-size: @menu-main-body-font-size;
        word-wrap: break-word;
 }
 div#mw-panel div.portal div.body ul li a {
-       color: #0645ad;
-}
-div#mw-panel div.portal div.body ul li a:visited {
-       color: #0b0080;
+       color: @menu-main-body-link-color;
+       &:visited {
+               color: @menu-main-body-link-visited-color;
+       }
 }
+
 /* Footer */
 div#footer {
        margin-left: 10em;
@@ -520,8 +511,9 @@ div#footer ul li {
 div#footer #footer-icons {
        float: right;
 }
-/* @noflip */
+
 body.ltr div#footer #footer-places {
+       /* @noflip */
        float: left;
 }
 div#footer #footer-info li {
@@ -596,7 +588,7 @@ div#footer #footer-places li {
        #preftoc a:active {
                display: inline-block;
                position: relative;
-               color: #0645ad;
+               color: @menu-link-color;
                padding: 0.5em;
                text-decoration: none;
                background-image: none;
@@ -653,16 +645,6 @@ div#footer #footer-places li {
        margin-right: 0.25em;
 }
 
-/**
- * The following code is slightly modified from monobook
- */
-div#content {
-       line-height: 1.5em;
-}
-#bodyContent {
-       font-size: 0.8em;
-}
-
 ul {
        list-style-type: disc;
        .list-style-image('images/bullet-icon.png');
@@ -679,7 +661,7 @@ pre, .mw-code {
 #firstHeading {
        padding-top: 0;
        margin-top: 0;
-       font-size: 1.6em;
+       font-size: @content-heading-font-size;
 }
 
 /* Icon for Usernames */
@@ -705,9 +687,8 @@ pre, .mw-code {
 #bodyContent {
        position: relative;
        width: 100%;
-}
-div#bodyContent {
        line-height: 1.5em;
+       font-size: @content-font-size;
 }
 
 /* mediawiki.notification */
@@ -783,21 +764,26 @@ body.vector-animateLayout {
        div#content,
        div#footer,
        #left-navigation {
-               .transition( margin-left 250ms, padding 250ms );
+               .transition(margin-left 250ms, padding 250ms;);
        }
+
        #p-logo {
-               .transition( 'left 250ms' );
+               .transition(left 250ms);
        }
+
        #mw-panel {
-               .transition( padding-right 250ms );
+               .transition(padding-right 250ms);
        }
+
        #p-search {
-               .transition( margin-right 250ms );
+               .transition(margin-right 250ms);
        }
+
        #p-personal {
-               .transition( right 250ms );
+               .transition(right 250ms);
        }
+
        #mw-head-base {
-               .transition( margin-left 250ms );
+               .transition(margin-left 250ms);
        }
 }
diff --git a/skins/vector/styles-beta.less b/skins/vector/styles-beta.less
new file mode 100644 (file)
index 0000000..62e3d55
--- /dev/null
@@ -0,0 +1,9 @@
+@import "variables.less";
+@import "beta/variables.less";
+@import "screen.less";
+@import "beta/screen.less";
+@import "externalLinks.less";
+@import "collapsibleNav.less";
+@media screen and (min-width: 982px) {
+       @import "screen-hd.less";
+}
diff --git a/skins/vector/styles.less b/skins/vector/styles.less
new file mode 100644 (file)
index 0000000..a5db63c
--- /dev/null
@@ -0,0 +1,8 @@
+@import "variables.less";
+@import "screen.less";
+@import "externalLinks.less";
+@import "collapsibleNav.less";
+
+@media screen and (min-width: 982px) {
+       @import "screen-hd.less";
+}
diff --git a/skins/vector/variables.less b/skins/vector/variables.less
new file mode 100644 (file)
index 0000000..fac7f82
--- /dev/null
@@ -0,0 +1,37 @@
+@html-font-size: 1em;
+
+@body-font-size: 1em;
+@body-font-color: #252525;
+
+// Page content
+@content-font-family: sans-serif;
+@content-font-size: 0.8em;
+@content-line-height: 1.5em;
+@content-padding: 1.5em 1.5em 1.5em 1.75em;
+@content-heading-font-size: 1.6em;
+@content-heading-font-family: sans-serif;
+
+// Common menu
+@menu-link-color: #0645ad;
+
+// Main menu
+@menu-main-font-size: inherit;
+@menu-main-heading-font-size: 0.75em;
+@menu-main-heading-padding: 0 1.75em 0.25em 0.25em;
+
+@menu-main-body-font-size: 0.75em;
+@menu-main-body-link-color: #0645ad;
+@menu-main-body-link-visited-color: #0b0080;
+@menu-main-body-margin: 0 0 0 1.25em;
+@menu-main-body-padding: 0;
+@menu-main-logo-left: 0.5em;
+
+// Personal menu
+@menu-personal-font-size: 0.75em;
+
+// Collapsible nav
+@collapsible-nav-heading-color: #4D4D4D;
+@collapsible-nav-heading-collapsed-color: #0645AD;
+
+@collapsible-nav-heading-padding: 4px 0 3px 1.5em;
+@collapsible-nav-body-margin: 0 0 0 1.25em;
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 4e6d3ea..5ade250 100644 (file)
@@ -60,18 +60,30 @@ class LinksUpdateTest extends MediaWikiTestCase {
                $po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
                $po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
 
-               $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
+               $update = $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
                        array( NS_MAIN, 'Foo' ),
                ) );
+               $this->assertArrayEquals( array(
+                       Title::makeTitle( NS_MAIN, 'Foo' ),  // newFromText doesn't yield the same internal state....
+               ), $update->getAddedLinks() );
 
                $po = new ParserOutput();
                $po->setTitleText( $t->getPrefixedText() );
 
                $po->addLink( Title::newFromText( "Bar" ) );
+               $po->addLink( Title::newFromText( "Talk:Bar" ) );
 
-               $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
+               $update = $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
                        array( NS_MAIN, 'Bar' ),
+                       array( NS_TALK, 'Bar' ),
                ) );
+               $this->assertArrayEquals( array(
+                       Title::makeTitle( NS_MAIN, 'Bar' ),
+                       Title::makeTitle( NS_TALK, 'Bar' ),
+               ), $update->getAddedLinks() );
+               $this->assertArrayEquals( array(
+                       Title::makeTitle( NS_MAIN, 'Foo' ),
+               ), $update->getRemovedLinks() );
        }
 
        public function testUpdate_externallinks() {
@@ -158,5 +170,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
                $update->commitTransaction();
 
                $this->assertSelect( $table, $fields, $condition, $expectedRows );
+               return $update;
        }
 }
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 e680af6..c19b54e 100644 (file)
@@ -193,8 +193,38 @@ class ApiEditPageTest extends ApiTestCase {
                $this->assertEquals( $expected, $text );
        }
 
+       /**
+        * Test editing of sections
+        */
        function testEditSection() {
-               $this->markTestIncomplete( "not yet implemented" );
+               $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' );
+               }
        }
 
        /**
@@ -236,10 +266,6 @@ class ApiEditPageTest extends ApiTestCase {
                $this->assertEquals( $text, "== header ==\n\ntest\n\n== header ==\n\ntest" );
        }
 
-       function testUndo() {
-               $this->markTestIncomplete( "not yet implemented" );
-       }
-
        function testEditConflict() {
                static $count = 0;
                $count++;
index 78bb151..8253989 100644 (file)
@@ -145,23 +145,4 @@ class ApiWatchTest extends ApiTestCase {
                        }
                }
        }
-
-       /**
-        */
-       function testWatchDelete() {
-               $tokens = $this->getTokens();
-
-               $data = $this->doApiRequest( array(
-                       'action' => 'delete',
-                       'token' => $tokens['deletetoken'],
-                       'title' => 'Help:UTPage' ) );
-               $this->assertArrayHasKey( 'delete', $data[0] );
-               $this->assertArrayHasKey( 'title', $data[0]['delete'] );
-
-               $this->doApiRequest( array(
-                       'action' => 'query',
-                       'list' => 'watchlist' ) );
-
-               $this->markTestIncomplete( 'This test needs to verify the deleted article was added to the users watchlist' );
-       }
 }
index ee3db3e..2ac2942 100644 (file)
@@ -46,6 +46,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * test usernames
         *
         * @dataProvider provideUserGenders
+        * @covers GenderCache::getGenderOf
         */
        function testUserName( $username, $expectedGender ) {
                $genderCache = GenderCache::singleton();
@@ -57,6 +58,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * genderCache should work with user objects, too
         *
         * @dataProvider provideUserGenders
+        * @covers GenderCache::getGenderOf
         */
        function testUserObjects( $username, $expectedGender ) {
                $genderCache = GenderCache::singleton();
@@ -82,6 +84,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * against the never existing username
         *
         * @dataProvider provideStripSubpages
+        * @covers GenderCache::getGenderOf
         */
        function testStripSubpages( $pageWithSubpage, $expectedGender ) {
                $genderCache = GenderCache::singleton();
index c550150..3559f15 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group Database
  * @group Cache
+ * @covers MessageCache
  */
 class MessageCacheTest extends MediaWikiLangTestCase {
 
index c345513..aedf594 100644 (file)
@@ -70,6 +70,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetDefaultModelFor
+        * @covers ContentHandler::getDefaultModelFor
         */
        public function testGetDefaultModelFor( $title, $expectedModelId ) {
                $title = Title::newFromText( $title );
@@ -78,6 +79,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetDefaultModelFor
+        * @covers ContentHandler::getForTitle
         */
        public function testGetForTitle( $title, $expectedContentModel ) {
                $title = Title::newFromText( $title );
@@ -97,6 +99,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetLocalizedName
+        * @covers ContentHandler::getLocalizedName
         */
        public function testGetLocalizedName( $id, $expected ) {
                $name = ContentHandler::getLocalizedName( $id );
@@ -131,6 +134,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetPageLanguage
+        * @covers ContentHandler::getPageLanguage
         */
        public function testGetPageLanguage( $title, $expected ) {
                if ( is_string( $title ) ) {
@@ -155,6 +159,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetContentText_Null
+        * @covers ContentHandler::getContentText
         */
        public function testGetContentText_Null( $contentHandlerTextFallback ) {
                $this->setMwGlobals( 'wgContentHandlerTextFallback', $contentHandlerTextFallback );
@@ -175,6 +180,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetContentText_TextContent
+        * @covers ContentHandler::getContentText
         */
        public function testGetContentText_TextContent( $contentHandlerTextFallback ) {
                $this->setMwGlobals( 'wgContentHandlerTextFallback', $contentHandlerTextFallback );
@@ -188,6 +194,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
        /**
         * ContentHandler::getContentText should have thrown an exception for non-text Content object
         * @expectedException MWException
+        * @covers ContentHandler::getContentText
         */
        public function testGetContentText_NonTextContent_fail() {
                $this->setMwGlobals( 'wgContentHandlerTextFallback', 'fail' );
@@ -197,6 +204,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
                ContentHandler::getContentText( $content );
        }
 
+       /**
+        * @covers ContentHandler::getContentText
+        */
        public function testGetContentText_NonTextContent_serialize() {
                $this->setMwGlobals( 'wgContentHandlerTextFallback', 'serialize' );
 
@@ -206,6 +216,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( $content->serialize(), $text );
        }
 
+       /**
+        * @covers ContentHandler::getContentText
+        */
        public function testGetContentText_NonTextContent_ignore() {
                $this->setMwGlobals( 'wgContentHandlerTextFallback', 'ignore' );
 
@@ -241,6 +254,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataMakeContent
+        * @covers ContentHandler::makeContent
         */
        public function testMakeContent( $data, $title, $modelId, $format, $expectedModelId, $expectedNativeData, $shouldFail ) {
                $title = Title::newFromText( $title );
@@ -270,6 +284,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
        */
 
+       /**
+        * @covers ContentHandler::runLegacyHooks
+        */
        public function testRunLegacyHooks() {
                Hooks::register( 'testRunLegacyHooks', __CLASS__ . '::dummyHookHandler' );
 
index 1c45820..bd6d41f 100644 (file)
@@ -50,12 +50,18 @@ class CssContentTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers CssContent::getModel
+        */
        public function testGetModel() {
                $content = $this->newContent( 'hello world.' );
 
                $this->assertEquals( CONTENT_MODEL_CSS, $content->getModel() );
        }
 
+       /**
+        * @covers CssContent::getContentHandler
+        */
        public function testGetContentHandler() {
                $content = $this->newContent( 'hello world.' );
 
@@ -73,6 +79,7 @@ class CssContentTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataEquals
+        * @covers CssContent::equals
         */
        public function testEquals( Content $a, Content $b = null, $equal = false ) {
                $this->assertEquals( $equal, $a->equals( $b ) );
index 5c1ff8f..c8616ff 100644 (file)
@@ -89,6 +89,9 @@ class JavaScriptContentTest extends TextContentTest {
                );
        }
 
+       /**
+        * @covers JavaScriptContent::addSectionHeader
+        */
        public function testAddSectionHeader() {
                $content = $this->newContent( 'hello world' );
                $c = $content->addSectionHeader( 'test' );
@@ -233,6 +236,9 @@ class JavaScriptContentTest extends TextContentTest {
                );
        }
 
+       /**
+        * @covers JavaScriptContent::matchMagicWord
+        */
        public function testMatchMagicWord() {
                $mw = MagicWord::get( "staticredirect" );
 
@@ -240,6 +246,9 @@ class JavaScriptContentTest extends TextContentTest {
                $this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word, since it's not wikitext" );
        }
 
+       /**
+        * @covers JavaScriptContent::updateRedirect
+        */
        public function testUpdateRedirect() {
                $target = Title::newFromText( "testUpdateRedirect_target" );
 
@@ -249,12 +258,18 @@ class JavaScriptContentTest extends TextContentTest {
                $this->assertTrue( $content->equals( $newContent ), "content should be unchanged since it's not wikitext" );
        }
 
+       /**
+        * @covers JavaScriptContent::getModel
+        */
        public function testGetModel() {
                $content = $this->newContent( "hello world." );
 
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getModel() );
        }
 
+       /**
+        * @covers JavaScriptContent::getContentHandler
+        */
        public function testGetContentHandler() {
                $content = $this->newContent( "hello world." );
 
index c7138b7..a1f099f 100644 (file)
@@ -51,6 +51,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetParserOutput
+        * @covers TextContent::getParserOutput
         */
        public function testGetParserOutput( $title, $model, $text, $expectedHtml, $expectedFields = null ) {
                $title = Title::newFromText( $title );
@@ -96,6 +97,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataPreSaveTransform
+        * @covers TextContent::preSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
                global $wgContLang;
@@ -119,6 +121,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataPreloadTransform
+        * @covers TextContent::preloadTransform
         */
        public function testPreloadTransform( $text, $expected ) {
                global $wgContLang;
@@ -140,6 +143,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetRedirectTarget
+        * @covers TextContent::getRedirectTarget
         */
        public function testGetRedirectTarget( $text, $expected ) {
                $content = $this->newContent( $text );
@@ -154,6 +158,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetRedirectTarget
+        * @covers TextContent::isRedirect
         */
        public function testIsRedirect( $text, $expected ) {
                $content = $this->newContent( $text );
@@ -209,6 +214,7 @@ class TextContentTest extends MediaWikiLangTestCase {
        /**
         * @dataProvider dataIsCountable
         * @group Database
+        * @covers TextContent::isCountable
         */
        public function testIsCountable( $text, $hasLinks, $mode, $expected ) {
                $this->setMwGlobals( 'wgArticleCountMethod', $mode );
@@ -240,6 +246,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetTextForSummary
+        * @covers TextContent::getTextForSummary
         */
        public function testGetTextForSummary( $text, $maxlength, $expected ) {
                $content = $this->newContent( $text );
@@ -247,12 +254,18 @@ class TextContentTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $content->getTextForSummary( $maxlength ) );
        }
 
+       /**
+        * @covers TextContent::getTextForSearchIndex
+        */
        public function testGetTextForSearchIndex() {
                $content = $this->newContent( 'hello world.' );
 
                $this->assertEquals( 'hello world.', $content->getTextForSearchIndex() );
        }
 
+       /**
+        * @covers TextContent::copy
+        */
        public function testCopy() {
                $content = $this->newContent( 'hello world.' );
                $copy = $content->copy();
@@ -261,30 +274,45 @@ class TextContentTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'hello world.', $copy->getNativeData() );
        }
 
+       /**
+        * @covers TextContent::getSize
+        */
        public function testGetSize() {
                $content = $this->newContent( 'hello world.' );
 
                $this->assertEquals( 12, $content->getSize() );
        }
 
+       /**
+        * @covers TextContent::getNativeData
+        */
        public function testGetNativeData() {
                $content = $this->newContent( 'hello world.' );
 
                $this->assertEquals( 'hello world.', $content->getNativeData() );
        }
 
+       /**
+        * @covers TextContent::getWikitextForTransclusion
+        */
        public function testGetWikitextForTransclusion() {
                $content = $this->newContent( 'hello world.' );
 
                $this->assertEquals( 'hello world.', $content->getWikitextForTransclusion() );
        }
 
+       /**
+        * @covers TextContent::getModel
+        */
        public function testGetModel() {
                $content = $this->newContent( "hello world." );
 
                $this->assertEquals( CONTENT_MODEL_TEXT, $content->getModel() );
        }
 
+       /**
+        * @covers TextContent::getContentHandler
+        */
        public function testGetContentHandler() {
                $content = $this->newContent( "hello world." );
 
@@ -302,6 +330,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataIsEmpty
+        * @covers TextContent::isEmpty
         */
        public function testIsEmpty( $text, $empty ) {
                $content = $this->newContent( $text );
@@ -321,6 +350,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataEquals
+        * @covers TextContent::equals
         */
        public function testEquals( Content $a, Content $b = null, $equal = false ) {
                $this->assertEquals( $equal, $a->equals( $b ) );
@@ -342,6 +372,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetDeletionUpdates
+        * @covers TextContent::getDeletionUpdates
         */
        public function testDeletionUpdates( $title, $model, $text, $expectedStuff ) {
                $ns = $this->getDefaultWikitextNS();
@@ -410,6 +441,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideConvert
+        * @covers TextContent::convert
         */
        public function testConvert( $text, $model, $lossy, $expectedNative ) {
                $content = $this->newContent( $text );
index d213251..75a7278 100644 (file)
@@ -16,6 +16,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $this->handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
        }
 
+       /**
+        * @covers WikitextContentHandler::serializeContent
+        */
        public function testSerializeContent() {
                $content = new WikitextContent( 'hello world' );
 
@@ -30,6 +33,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                }
        }
 
+       /**
+        * @covers WikitextContentHandler::unserializeContent
+        */
        public function testUnserializeContent() {
                $content = $this->handler->unserializeContent( 'hello world' );
                $this->assertEquals( 'hello world', $content->getNativeData() );
@@ -45,6 +51,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                }
        }
 
+       /**
+        * @covers WikitextContentHandler::makeEmptyContent
+        */
        public function testMakeEmptyContent() {
                $content = $this->handler->makeEmptyContent();
 
@@ -64,6 +73,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
         * @dataProvider provideMakeRedirectContent
         * @param Title|string $title Title object or string for Title::newFromText()
         * @param string $expected Serialized form of the content object built
+        * @covers WikitextContentHandler::makeRedirectContent
         */
        public function testMakeRedirectContent( $title, $expected ) {
                global $wgContLang;
@@ -92,6 +102,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataIsSupportedFormat
+        * @covers WikitextContentHandler::isSupportedFormat
         */
        public function testIsSupportedFormat( $format, $supported ) {
                $this->assertEquals( $supported, $this->handler->isSupportedFormat( $format ) );
@@ -131,6 +142,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataMerge3
+        * @covers WikitextContentHandler::merge3
         */
        public function testMerge3( $old, $mine, $yours, $expected ) {
                $this->checkHasDiff3();
@@ -188,6 +200,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetAutosummary
+        * @covers WikitextContentHandler::getAutosummary
         */
        public function testGetAutosummary( $old, $new, $flags, $expected ) {
                $oldContent = is_null( $old ) ? null : new WikitextContent( $old );
index 37b01fd..9f20073 100644 (file)
@@ -64,6 +64,7 @@ more stuff
        /**
         * @dataProvider dataGetSecondaryDataUpdates
         * @group Database
+        * @covers WikitextContent::getSecondaryDataUpdates
         */
        public function testGetSecondaryDataUpdates( $title, $model, $text, $expectedStuff ) {
                $ns = $this->getDefaultWikitextNS();
@@ -116,6 +117,7 @@ just a test"
 
        /**
         * @dataProvider dataGetSection
+        * @covers WikitextContent::getSection
         */
        public function testGetSection( $text, $sectionId, $expectedText ) {
                $content = $this->newContent( $text );
@@ -167,6 +169,7 @@ just a test"
 
        /**
         * @dataProvider dataReplaceSection
+        * @covers WikitextContent::replaceSection
         */
        public function testReplaceSection( $text, $section, $with, $sectionTitle, $expected ) {
                $content = $this->newContent( $text );
@@ -175,6 +178,9 @@ just a test"
                $this->assertEquals( $expected, is_null( $c ) ? null : $c->getNativeData() );
        }
 
+       /**
+        * @covers WikitextContent::addSectionHeader
+        */
        public function testAddSectionHeader() {
                $content = $this->newContent( 'hello world' );
                $content = $content->addSectionHeader( 'test' );
@@ -319,6 +325,9 @@ just a test"
                );
        }
 
+       /**
+        * @covers WikitextContent::matchMagicWord
+        */
        public function testMatchMagicWord() {
                $mw = MagicWord::get( "staticredirect" );
 
@@ -329,6 +338,9 @@ just a test"
                $this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word" );
        }
 
+       /**
+        * @covers WikitextContent::updateRedirect
+        */
        public function testUpdateRedirect() {
                $target = Title::newFromText( "testUpdateRedirect_target" );
 
@@ -348,12 +360,18 @@ just a test"
                $this->assertEquals( $target->getFullText(), $newContent->getRedirectTarget()->getFullText() );
        }
 
+       /**
+        * @covers WikitextContent::getModel
+        */
        public function testGetModel() {
                $content = $this->newContent( "hello world." );
 
                $this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getModel() );
        }
 
+       /**
+        * @covers WikitextContent::getContentHandler
+        */
        public function testGetContentHandler() {
                $content = $this->newContent( "hello world." );
 
diff --git a/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php b/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
new file mode 100644 (file)
index 0000000..7d7a2bd
--- /dev/null
@@ -0,0 +1,126 @@
+<?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
+        * @covers DatabaseMysqlBase::addIdentifierQuotes
+        */
+       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 46ccfe0..726d63a 100644 (file)
@@ -6,6 +6,9 @@
  */
 class DatabaseSQLTest extends MediaWikiTestCase {
 
+       /**
+        * @var DatabaseTestHelper
+        */
        private $database;
 
        protected function setUp() {
@@ -22,6 +25,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideSelect
+        * @covers DatabaseBase::select
         */
        function testSelect( $sql, $sqlText ) {
                $this->database->select(
@@ -123,6 +127,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideUpdate
+        * @covers DatabaseBase::update
         */
        function testUpdate( $sql, $sqlText ) {
                $this->database->update(
@@ -174,6 +179,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideDelete
+        * @covers DatabaseBase::delete
         */
        function testDelete( $sql, $sqlText ) {
                $this->database->delete(
@@ -206,6 +212,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideUpsert
+        * @covers DatabaseBase::upsert
         */
        function testUpsert( $sql, $sqlText ) {
                $this->database->upsert(
@@ -241,6 +248,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideDeleteJoin
+        * @covers DatabaseBase::deleteJoin
         */
        function testDeleteJoin( $sql, $sqlText ) {
                $this->database->deleteJoin(
@@ -287,6 +295,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideInsert
+        * @covers DatabaseBase::insert
         */
        function testInsert( $sql, $sqlText ) {
                $this->database->insert(
@@ -339,6 +348,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideInsertSelect
+        * @covers DatabaseBase::insertSelect
         */
        function testInsertSelect( $sql, $sqlText ) {
                $this->database->insertSelect(
@@ -401,6 +411,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideReplace
+        * @covers DatabaseBase::replace
         */
        function testReplace( $sql, $sqlText ) {
                $this->database->replace(
@@ -515,6 +526,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideNativeReplace
+        * @covers DatabaseBase::nativeReplace
         */
        function testNativeReplace( $sql, $sqlText ) {
                $this->database->nativeReplace(
@@ -541,6 +553,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideConditional
+        * @covers DatabaseBase::conditional
         */
        function testConditional( $sql, $sqlText ) {
                $this->assertEquals( trim( $this->database->conditional(
@@ -581,6 +594,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideBuildConcat
+        * @covers DatabaseBase::buildConcat
         */
        function testBuildConcat( $stringList, $sqlText ) {
                $this->assertEquals( trim( $this->database->buildConcat(
@@ -603,6 +617,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideBuildLike
+        * @covers DatabaseBase::buildLike
         */
        function testBuildLike( $array, $sqlText ) {
                $this->assertEquals( trim( $this->database->buildLike(
@@ -633,6 +648,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideUnionQueries
+        * @covers DatabaseBase::unionQueries
         */
        function testUnionQueries( $sql, $sqlText ) {
                $this->assertEquals( trim( $this->database->unionQueries(
@@ -667,24 +683,36 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers DatabaseBase::commit
+        */
        function testTransactionCommit() {
                $this->database->begin( __METHOD__ );
                $this->database->commit( __METHOD__ );
                $this->assertLastSql( 'BEGIN; COMMIT' );
        }
 
+       /**
+        * @covers DatabaseBase::rollback
+        */
        function testTransactionRollback() {
                $this->database->begin( __METHOD__ );
                $this->database->rollback( __METHOD__ );
                $this->assertLastSql( 'BEGIN; ROLLBACK' );
        }
 
+       /**
+        * @covers DatabaseBase::dropTable
+        */
        function testDropTable() {
                $this->database->setExistingTables( array( 'table' ) );
                $this->database->dropTable( 'table', __METHOD__ );
                $this->assertLastSql( 'DROP TABLE table' );
        }
 
+       /**
+        * @covers DatabaseBase::dropTable
+        */
        function testDropNonExistingTable() {
                $this->assertFalse(
                        $this->database->dropTable( 'non_existing', __METHOD__ )
index 91ab33a..f151fb2 100644 (file)
@@ -27,6 +27,10 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
  * @group medium
  */
 class DatabaseSqliteTest extends MediaWikiTestCase {
+
+       /**
+        * @var MockDatabaseSqlite
+        */
        var $db;
 
        protected function setUp() {
@@ -83,6 +87,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideAddQuotes()
+        * @covers DatabaseSqlite::addQuotes
         */
        public function testAddQuotes( $value, $expected ) {
                // check quoting
@@ -105,6 +110,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                }
        }
 
+       /**
+        * @covers DatabaseSqlite::replaceVars
+        */
        public function testReplaceVars() {
                $this->assertEquals( 'foo', $this->replaceVars( 'foo' ), "Don't break anything accidentally" );
 
@@ -143,6 +151,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers DatabaseSqlite::tableName
+        */
        public function testTableName() {
                // @todo Moar!
                $db = new DatabaseSqliteStandalone( ':memory:' );
@@ -153,6 +164,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $this->assertEquals( 'foobar', $db->tableName( 'bar' ) );
        }
 
+       /**
+        * @covers DatabaseSqlite::duplicateTableStructure
+        */
        public function testDuplicateTableStructure() {
                $db = new DatabaseSqliteStandalone( ':memory:' );
                $db->query( 'CREATE TABLE foo(foo, barfoo)' );
@@ -174,6 +188,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers DatabaseSqlite::duplicateTableStructure
+        */
        public function testDuplicateTableStructureVirtual() {
                $db = new DatabaseSqliteStandalone( ':memory:' );
                if ( $db->getFulltextSearchModule() != 'FTS3' ) {
@@ -194,6 +211,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers DatabaseSqlite::deleteJoin
+        */
        public function testDeleteJoin() {
                $db = new DatabaseSqliteStandalone( ':memory:' );
                $db->query( 'CREATE TABLE a (a_1)', __METHOD__ );
@@ -306,12 +326,18 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                }
        }
 
+       /**
+        * @covers DatabaseSqlite::insertId
+        */
        public function testInsertIdType() {
                $db = new DatabaseSqliteStandalone( ':memory:' );
-               $this->assertInstanceOf( 'ResultWrapper',
-                       $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ ), "Database creationg" );
-               $this->assertTrue( $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ ),
-                       "Insertion worked" );
+
+               $databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
+               $this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Database creation" );
+
+               $insertion = $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ );
+               $this->assertTrue( $insertion, "Insertion worked" );
+
                $this->assertInternalType( 'integer', $db->insertId(), "Actual typecheck" );
                $this->assertTrue( $db->close(), "closing database" );
        }
index a3ef55a..5e8e7a4 100644 (file)
@@ -5,7 +5,11 @@
  * @group DatabaseBase
  */
 class DatabaseTest extends MediaWikiTestCase {
-       var $db, $functionTest = false;
+       /**
+        * @var DatabaseBase
+        */
+       var $db;
+       var $functionTest = false;
 
        protected function setUp() {
                parent::setUp();
@@ -19,7 +23,9 @@ class DatabaseTest extends MediaWikiTestCase {
                        $this->functionTest = false;
                }
        }
-
+       /**
+        * @covers DatabaseBase::dropTable
+        */
        function testAddQuotesNull() {
                $check = "NULL";
                if ( $this->db->getType() === 'sqlite' || $this->db->getType() === 'oracle' ) {
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 {
index e6bbe1e..ba15fba 100644 (file)
                assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
        } );
 
+       QUnit.test( 'newFromImg', 28, function ( assert ) {
+               var title, i, thisCase, prefix,
+                       cases = [
+                               {
+                                       url: '/wiki/images/thumb/9/91/Anticlockwise_heliotrope%27s.jpg/99px-Anticlockwise_heliotrope%27s.jpg',
+                                       typeOfUrl: 'Normal hashed directory thumbnail',
+                                       nameText: 'Anticlockwise heliotrope\'s',
+                                       prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+                               },
+
+                               {
+                                       url: '//upload.wikimedia.org/wikipedia/commons/thumb/8/80/Wikipedia-logo-v2.svg/150px-Wikipedia-logo-v2.svg.png',
+                                       typeOfUrl: 'Commons thumbnail',
+                                       nameText: 'Wikipedia-logo-v2',
+                                       prefixedText: 'File:Wikipedia-logo-v2.svg'
+                               },
+
+                               {
+                                       url: '/wiki/images/9/91/Anticlockwise_heliotrope%27s.jpg',
+                                       typeOfUrl: 'Full image',
+                                       nameText: 'Anticlockwise heliotrope\'s',
+                                       prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+                               },
+
+                               {
+                                       url: 'http://localhost/thumb.php?f=Stuffless_Figaro%27s.jpg&width=180',
+                                       typeOfUrl: 'thumb.php-based thumbnail',
+                                       nameText: 'Stuffless Figaro\'s',
+                                       prefixedText: 'File:Stuffless Figaro\'s.jpg'
+                               },
+
+                               {
+                                       url: '/wikipedia/commons/thumb/Wikipedia-logo-v2.svg/150px-Wikipedia-logo-v2.svg.png',
+                                       typeOfUrl: 'Commons unhashed thumbnail',
+                                       nameText: 'Wikipedia-logo-v2',
+                                       prefixedText: 'File:Wikipedia-logo-v2.svg'
+                               },
+
+                               {
+                                       url: '/wiki/images/Anticlockwise_heliotrope%27s.jpg',
+                                       typeOfUrl: 'Unhashed local file',
+                                       nameText: 'Anticlockwise heliotrope\'s',
+                                       prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+                               },
+
+                               {
+                                       url: '',
+                                       typeOfUrl: 'Empty string'
+                               },
+
+                               {
+                                       url: 'foo',
+                                       typeOfUrl: 'String with only alphabet characters'
+                               },
+
+                               {
+                                       url: 'foobar.foobar',
+                                       typeOfUrl: 'Not a file path'
+                               },
+
+                               {
+                                       url: '/a/a0/blah blah blah',
+                                       typeOfUrl: 'Space characters'
+                               }
+                       ];
+
+               for ( i = 0; i < cases.length; i++ ) {
+                       thisCase = cases[i];
+                       title = mw.Title.newFromImg( { src: thisCase.url } );
+
+                       if ( thisCase.nameText !== undefined ) {
+                               prefix = '[' + thisCase.typeOfUrl + ' URL' + '] ';
+
+                               assert.notStrictEqual( title, null, prefix + 'Parses successfully' );
+                               assert.equal( title.getNameText(), thisCase.nameText, prefix + 'Filename matches original' );
+                               assert.equal( title.getPrefixedText(), thisCase.prefixedText, prefix + 'File page title matches original' );
+                               assert.equal( title.getNamespaceId(), 6, prefix + 'Namespace ID matches File namespace' );
+                       } else {
+                               assert.strictEqual( title, null, thisCase.typeOfUrl + ', should not produce an mw.Title object' );
+                       }
+               }
+       } );
+
 }( mediaWiki, jQuery ) );
index 57825c5..76f32f7 100644 (file)
                        'Opera/9.80 (J2ME/MIDP; Opera Mini/3.1.10423/22.387; U; en) Presto/2.5.25 Version/10.54',
                        'Opera/9.50 (J2ME/MIDP; Opera Mini/4.0.10031/298; U; en)',
                        'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24093/26.1305; U; en) Presto/2.8.119 Version/10.54',
-                       'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10'
+                       'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10',
+                       // Ovi Browser
+                       'Mozilla/5.0 (Series40; NokiaX3-02/05.60; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.2.0.0.6',
+                       'Mozilla/5.0 (Series40; Nokia305/05.92; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.7.0.0.11'
                ],
                // No explicit support for or against these browsers, they're
                // given a shot at Grade A at their own risk.
index ef2af24..913adc1 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -304,6 +304,12 @@ function wfStreamThumb( array $params ) {
                return;
        }
 
+       $user = RequestContext::getMain()->getUser();
+       if ( $user->pingLimiter( 'renderfile' ) ) {
+               wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
+               return;
+       }
+
        // Thumbnail isn't already there, so create the new thumbnail...
        try {
                $thumb = $img->transform( $params, File::RENDER_NOW );
@@ -425,7 +431,7 @@ function wfExtractThumbParams( $file, $params ) {
        if ( $handler && $fileNamePos !== false ) {
                $paramString = substr( $thumbname, 0, $fileNamePos - 1 );
                $extraParams = $handler->parseParamString( $paramString );
-               if ( $handler !== false ) {
+               if ( $extraParams !== false ) {
                        return $params + $extraParams;
                }
        }