Merge "Change wording of 'wlshowtime' for ease of localisation"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 7 Dec 2015 12:45:26 +0000 (12:45 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 7 Dec 2015 12:45:26 +0000 (12:45 +0000)
105 files changed:
autoload.php
docs/extension.schema.json
includes/DefaultSettings.php
includes/ForkController.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/MediaWiki.php
includes/Preferences.php
includes/PrefixSearch.php
includes/Title.php
includes/api/ApiStashEdit.php
includes/api/i18n/diq.json
includes/api/i18n/ksh.json
includes/api/i18n/lki.json [new file with mode: 0644]
includes/api/i18n/pl.json
includes/api/i18n/sv.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/clientpool/RedisConnectionPool.php
includes/deferred/DeferrableUpdate.php [new file with mode: 0644]
includes/deferred/DeferredUpdates.php
includes/deferred/HTMLCacheUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/MergeableUpdate.php [new file with mode: 0644]
includes/deferred/SquidUpdate.php
includes/filerepo/FileRepo.php
includes/filerepo/file/LocalFile.php
includes/installer/i18n/ca.json
includes/installer/i18n/lki.json [new file with mode: 0644]
includes/installer/i18n/mr.json
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/jobqueue/utils/BacklinkJobUtils.php
includes/libs/StatusValue.php
includes/libs/objectcache/WANObjectCache.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/password/PasswordPolicyChecks.php
includes/revisiondelete/RevDelFileList.php
includes/search/SearchExactMatchRescorer.php [new file with mode: 0644]
includes/specials/SpecialActiveusers.php
includes/specials/SpecialContributions.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialWatchlist.php
includes/utils/UIDGenerator.php
languages/i18n/ar.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fr.json
languages/i18n/frc.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/ksh.json
languages/i18n/lij.json
languages/i18n/lt.json
languages/i18n/mk.json
languages/i18n/mr.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sd.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sv.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/zh-hans.json
languages/messages/MessagesEn.php
maintenance/cleanupTable.inc
maintenance/createCommonPasswordCdb.php [new file with mode: 0644]
resources/Resources.php
resources/src/mediawiki.special/mediawiki.special.watchlist.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js
resources/src/mediawiki/page/image-pagination.js
serialized/commonpasswords.cdb [new file with mode: 0644]
tests/phpunit/includes/api/query/ApiQueryTest.php
tests/phpunit/includes/deferred/DeferredUpdatesTest.php
tests/phpunit/includes/deferred/SquidUpdateTest.php [new file with mode: 0644]
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/suites/UploadFromUrlTestSuite.php

index 3e5c1b5..2170898 100644 (file)
@@ -164,8 +164,8 @@ $wgAutoloadLocalClasses = array(
        'BenchIfSwitch' => __DIR__ . '/maintenance/benchmarks/bench_if_switch.php',
        'BenchStrtrStrReplace' => __DIR__ . '/maintenance/benchmarks/bench_strtr_str_replace.php',
        'BenchUtf8TitleCheck' => __DIR__ . '/maintenance/benchmarks/bench_utf8_title_check.php',
-       'BenchWikimediaBaseConvert' => __DIR__ . '/maintenance/benchmarks/bench_Wikimedia_base_convert.php',
        'BenchWfIsWindows' => __DIR__ . '/maintenance/benchmarks/bench_wfIsWindows.php',
+       'BenchWikimediaBaseConvert' => __DIR__ . '/maintenance/benchmarks/bench_Wikimedia_base_convert.php',
        'BenchmarkDeleteTruncate' => __DIR__ . '/maintenance/benchmarks/bench_delete_truncate.php',
        'BenchmarkHooks' => __DIR__ . '/maintenance/benchmarks/benchmarkHooks.php',
        'BenchmarkParse' => __DIR__ . '/maintenance/benchmarks/benchmarkParse.php',
@@ -307,7 +307,7 @@ $wgAutoloadLocalClasses = array(
        'DateFormats' => __DIR__ . '/maintenance/language/date-formats.php',
        'DateFormatter' => __DIR__ . '/includes/parser/DateFormatter.php',
        'DeadendPagesPage' => __DIR__ . '/includes/specials/SpecialDeadendpages.php',
-       'DeferrableUpdate' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
+       'DeferrableUpdate' => __DIR__ . '/includes/deferred/DeferrableUpdate.php',
        'DeferredStringifier' => __DIR__ . '/includes/libs/DeferredStringifier.php',
        'DeferredUpdates' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
        'DeleteAction' => __DIR__ . '/includes/actions/DeleteAction.php',
@@ -722,7 +722,6 @@ $wgAutoloadLocalClasses = array(
        'MWDocGen' => __DIR__ . '/maintenance/mwdocgen.php',
        'MWException' => __DIR__ . '/includes/exception/MWException.php',
        'MWExceptionHandler' => __DIR__ . '/includes/exception/MWExceptionHandler.php',
-       'MWHookException' => __DIR__ . '/includes/Hooks.php',
        'MWHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
        'MWMemcached' => __DIR__ . '/includes/compat/MemcachedClientCompat.php',
        'MWMessagePack' => __DIR__ . '/includes/libs/MWMessagePack.php',
@@ -793,6 +792,7 @@ $wgAutoloadLocalClasses = array(
        'MergeHistoryPager' => __DIR__ . '/includes/specials/SpecialMergeHistory.php',
        'MergeLogFormatter' => __DIR__ . '/includes/logging/MergeLogFormatter.php',
        'MergeMessageFileList' => __DIR__ . '/maintenance/mergeMessageFileList.php',
+       'MergeableUpdate' => __DIR__ . '/includes/deferred/MergeableUpdate.php',
        'Message' => __DIR__ . '/includes/Message.php',
        'MessageBlobStore' => __DIR__ . '/includes/cache/MessageBlobStore.php',
        'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php',
@@ -1089,6 +1089,7 @@ $wgAutoloadLocalClasses = array(
        'SearchDump' => __DIR__ . '/maintenance/dumpIterator.php',
        'SearchEngine' => __DIR__ . '/includes/search/SearchEngine.php',
        'SearchEngineDummy' => __DIR__ . '/includes/search/SearchEngine.php',
+       'SearchExactMatchRescorer' => __DIR__ . '/includes/search/SearchExactMatchRescorer.php',
        'SearchHighlighter' => __DIR__ . '/includes/search/SearchHighlighter.php',
        'SearchMssql' => __DIR__ . '/includes/search/SearchMssql.php',
        'SearchMySQL' => __DIR__ . '/includes/search/SearchMySQL.php',
@@ -1236,7 +1237,6 @@ $wgAutoloadLocalClasses = array(
        'SwiftVirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/SwiftVirtualRESTService.php',
        'SyncFileBackend' => __DIR__ . '/maintenance/syncFileBackend.php',
        'TableCleanup' => __DIR__ . '/maintenance/cleanupTable.inc',
-       'TableCleanupTest' => __DIR__ . '/maintenance/cleanupTable.inc',
        'TableDiffFormatter' => __DIR__ . '/includes/diff/TableDiffFormatter.php',
        'TablePager' => __DIR__ . '/includes/pager/TablePager.php',
        'TagLogFormatter' => __DIR__ . '/includes/logging/TagLogFormatter.php',
index dde4fa1..b635467 100644 (file)
                        },
                        "patternProperties": {
                                "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
-                                       "type": ["object", "array", "string", "integer", "null", "boolean"],
                                        "properties": {
                                                "_merge_strategy": {
                                                        "type": "string",
index edc54f2..e76b627 100644 (file)
@@ -4365,6 +4365,10 @@ $wgCentralIdLookupProvider = 'local';
  *     - PasswordCannotMatchUsername - Password cannot match username to
  *     - PasswordCannotMatchBlacklist - Username/password combination cannot
  *             match a specific, hardcoded blacklist.
+ *     - PasswordCannotBePopular - Blacklist passwords which are known to be
+ *             commonly chosen. Set to integer n to ban the top n passwords.
+ *             If you want to ban all common passwords on file, use the
+ *             PHP_INT_MAX constant.
  * @since 1.26
  */
 $wgPasswordPolicy = array(
@@ -4373,11 +4377,13 @@ $wgPasswordPolicy = array(
                        'MinimalPasswordLength' => 8,
                        'MinimumPasswordLengthToLogin' => 1,
                        'PasswordCannotMatchUsername' => true,
+                       'PasswordCannotBePopular' => 25,
                ),
                'sysop' => array(
                        'MinimalPasswordLength' => 8,
                        'MinimumPasswordLengthToLogin' => 1,
                        'PasswordCannotMatchUsername' => true,
+                       'PasswordCannotBePopular' => 25,
                ),
                'bot' => array(
                        'MinimalPasswordLength' => 8,
@@ -4397,6 +4403,7 @@ $wgPasswordPolicy = array(
                'PasswordCannotMatchUsername' => 'PasswordPolicyChecks::checkPasswordCannotMatchUsername',
                'PasswordCannotMatchBlacklist' => 'PasswordPolicyChecks::checkPasswordCannotMatchBlacklist',
                'MaximalPasswordLength' => 'PasswordPolicyChecks::checkMaximalPasswordLength',
+               'PasswordCannotBePopular' => 'PasswordPolicyChecks::checkPopularPasswordBlacklist'
        ),
 );
 
@@ -4590,6 +4597,7 @@ $wgDefaultUserOptions = array(
        'watchlisthideown' => 0,
        'watchlisthidepatrolled' => 0,
        'watchlisthidecategorization' => 1,
+       'watchlistreloadautomatically' => 0,
        'watchmoves' => 0,
        'watchrollback' => 0,
        'wllimit' => 250,
@@ -7790,6 +7798,19 @@ $wgVirtualRestConfig = array(
  */
 $wgSearchRunSuggestedQuery = true;
 
+/**
+ * Where popular password file is located.
+ *
+ * Default in core contains 50,000 most popular. This config
+ * allows you to change which file, in case you want to generate
+ * a password file with > 50000 entries in it.
+ *
+ * @see maintenance/createCommonPasswordCdb.php
+ * @since 1.27
+ * @var string path to file
+ */
+$wgPopularPasswordFile = __DIR__ . '/../serialized/commonpasswords.cdb';
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index c1765e2..4a021ee 100644 (file)
@@ -153,7 +153,9 @@ class ForkController {
                wfGetLBFactory()->destroyInstance();
                FileBackendGroup::destroySingleton();
                LockManagerGroup::destroySingletons();
+               JobQueueGroup::destroySingletons();
                ObjectCache::clear();
+               RedisConnectionPool::destroySingletons();
                $wgMemc = null;
        }
 
index 43b936b..4a3fceb 100644 (file)
@@ -374,20 +374,22 @@ function wfObjectToArray( $objOrArray, $recursive = true ) {
  * not likely to give duplicate values for any realistic
  * number of articles.
  *
+ * @note This is designed for use in relation to Special:RandomPage
+ *       and the page_random database field.
+ *
  * @return string
  */
 function wfRandom() {
-       # The maximum random value is "only" 2^31-1, so get two random
-       # values to reduce the chance of dupes
+       // The maximum random value is "only" 2^31-1, so get two random
+       // values to reduce the chance of dupes
        $max = mt_getrandmax() + 1;
        $rand = number_format( ( mt_rand() * $max + mt_rand() ) / $max / $max, 12, '.', '' );
-
        return $rand;
 }
 
 /**
- * Get a random string containing a number of pseudo-random hex
- * characters.
+ * Get a random string containing a number of pseudo-random hex characters.
+ *
  * @note This is not secure, if you are trying to generate some sort
  *       of token please use MWCryptRand instead.
  *
index 980d350..cd38a7d 100644 (file)
  * @file
  */
 
-/**
- * @since 1.18
- */
-class MWHookException extends MWException {
-}
-
 /**
  * Hooks class.
  *
@@ -193,34 +187,17 @@ class Hooks {
                        $badhookmsg = null;
                        $hook_args = array_merge( $hook, $args );
 
-                       set_error_handler( 'Hooks::hookErrorHandler' );
-
                        // mark hook as deprecated, if deprecation version is specified
                        if ( $deprecatedVersion !== null ) {
                                wfDeprecated( "$event hook (used in $func)", $deprecatedVersion );
                        }
 
-                       try {
-                               $retval = call_user_func_array( $callback, $hook_args );
-                       } catch ( MWHookException $e ) {
-                               $badhookmsg = $e->getMessage();
-                       } catch ( Exception $e ) {
-                               restore_error_handler();
-                               throw $e;
-                       }
-
-                       restore_error_handler();
+                       $retval = call_user_func_array( $callback, $hook_args );
 
                        // Process the return value.
                        if ( is_string( $retval ) ) {
                                // String returned means error.
                                throw new FatalError( $retval );
-                       } elseif ( $badhookmsg !== null ) {
-                               // Exception was thrown from Hooks::hookErrorHandler.
-                               throw new MWException(
-                                       'Detected bug in an extension! ' .
-                                       "Hook $func has invalid call signature; " . $badhookmsg
-                               );
                        } elseif ( $retval === false ) {
                                // False was returned. Stop processing, but no error.
                                return false;
@@ -229,31 +206,4 @@ class Hooks {
 
                return true;
        }
-
-       /**
-        * Handle PHP errors issued inside a hook. Catch errors that have to do
-        * with a function expecting a reference, missing arguments, or wrong argument
-        * types. Pass all others through to to the default error handler.
-        *
-        * This is useful for throwing errors for major callback invocation errors
-        * (with regard to parameter signature) which PHP just gives warnings for.
-        *
-        * @since 1.18
-        *
-        * @param int $errno Error number (unused)
-        * @param string $errstr Error message
-        * @throws MWHookException If the error has to do with the function signature
-        * @return bool
-        */
-       public static function hookErrorHandler( $errno, $errstr ) {
-               if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false
-                       || strpos( $errstr, 'Missing argument ' ) !== false
-                       || strpos( $errstr, ' expects parameter ' ) !== false
-               ) {
-                       throw new MWHookException( $errstr, $errno );
-               }
-
-               // Delegate unhandled errors to the default handlers
-               return false;
-       }
 }
index 38d9e47..ecfd8f8 100644 (file)
@@ -509,8 +509,10 @@ class MediaWiki {
                $factory = wfGetLBFactory();
                $factory->commitMasterChanges();
                $factory->shutdown();
+               wfDebug( __METHOD__ . ': all transactions committed' );
 
-               wfDebug( __METHOD__ . ' completed; all transactions committed' );
+               DeferredUpdates::doUpdates( 'enqueue', DeferredUpdates::PRESEND );
+               wfDebug( __METHOD__ . ': pre-send deferred updates completed' );
 
                // Set a cookie to tell all CDN edge nodes to "stick" the user to the
                // DC that handles this POST request (e.g. the "master" data center)
index 096f8e3..c7ab9cd 100644 (file)
@@ -1006,6 +1006,11 @@ class Preferences {
                        'section' => 'watchlist/advancedwatchlist',
                        'label-message' => 'tog-watchlisthideliu',
                );
+               $defaultPreferences['watchlistreloadautomatically'] = array(
+                       'type' => 'toggle',
+                       'section' => 'watchlist/advancedwatchlist',
+                       'label-message' => 'tog-watchlistreloadautomatically',
+               );
 
                if ( $config->get( 'RCWatchCategoryMembership' ) ) {
                        $defaultPreferences['watchlisthidecategorization'] = array(
index e328e9f..c6f187d 100644 (file)
@@ -164,112 +164,9 @@ abstract class PrefixSearch {
                return $this->strings( $this->handleResultFromHook( $srchres, $namespaces, $search, $limit ) );
        }
 
-       /**
-        * Default search backend does proper prefix searching, but custom backends
-        * may sort based on other algorythms that may cause the exact title match
-        * to not be in the results or be lower down the list.
-        * @param array $srchres results from the hook
-        * @return array munged results from the hook
-        */
        private function handleResultFromHook( $srchres, $namespaces, $search, $limit ) {
-               // Pick namespace (based on PrefixSearch::defaultSearchBackend)
-               $ns = in_array( NS_MAIN, $namespaces ) ? NS_MAIN : $namespaces[0];
-               $t = Title::newFromText( $search, $ns );
-               if ( !$t || !$t->exists() ) {
-                       // No exact match so just return the search results
-                       return $srchres;
-               }
-               $string = $t->getPrefixedText();
-               $key = array_search( $string, $srchres );
-               if ( $key !== false ) {
-                       // Exact match was in the results so just move it to the front
-                       return $this->pullFront( $key, $srchres );
-               }
-               // Exact match not in the search results so check for some redirect handling cases
-               if ( $t->isRedirect() ) {
-                       $target = $this->getRedirectTarget( $t );
-                       $key = array_search( $target, $srchres );
-                       if ( $key !== false ) {
-                               // Exact match is a redirect to one of the returned matches so pull the
-                               // returned match to the front.  This might look odd but the alternative
-                               // is to put the redirect in front and drop the match.  The name of the
-                               // found match is often more descriptive/better formed than the name of
-                               // the redirect AND by definition they share a prefix.  Hopefully this
-                               // choice is less confusing and more helpful.  But it might not be.  But
-                               // it is the choice we're going with for now.
-                               return $this->pullFront( $key, $srchres );
-                       }
-                       $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres );
-                       if ( isset( $redirectTargetsToRedirect[$target] ) ) {
-                               // The exact match and something in the results list are both redirects
-                               // to the same thing!  In this case we'll pull the returned match to the
-                               // top following the same logic above.  Again, it might not be a perfect
-                               // choice but it'll do.
-                               return $this->pullFront( $redirectTargetsToRedirect[$target], $srchres );
-                       }
-               } else {
-                       $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres );
-                       if ( isset( $redirectTargetsToRedirect[$string] ) ) {
-                               // The exact match is the target of a redirect already in the results list so remove
-                               // the redirect from the results list and push the exact match to the front
-                               array_splice( $srchres, $redirectTargetsToRedirect[$string], 1 );
-                               array_unshift( $srchres, $string );
-                               return $srchres;
-                       }
-               }
-
-               // Exact match is totally unique from the other results so just add it to the front
-               array_unshift( $srchres, $string );
-               // And roll one off the end if the results are too long
-               if ( count( $srchres ) > $limit ) {
-                       array_pop( $srchres );
-               }
-               return $srchres;
-       }
-
-       /**
-        * @param Array(string) $titles as strings
-        * @return Array(string => int) redirect target prefixedText to index of title in titles
-        *   that is a redirect to it.
-        */
-       private function redirectTargetsToRedirect( $titles ) {
-               $result = array();
-               foreach ( $titles as $key => $titleText ) {
-                       $title = Title::newFromText( $titleText );
-                       if ( !$title || !$title->isRedirect() ) {
-                               continue;
-                       }
-                       $target = $this->getRedirectTarget( $title );
-                       if ( !$target ) {
-                               continue;
-                       }
-                       $result[$target] = $key;
-               }
-               return $result;
-       }
-
-       /**
-        * @param int $key key to pull to the front
-        * @return array $array with the item at $key pulled to the front
-        */
-       private function pullFront( $key, $array ) {
-               $cut = array_splice( $array, $key, 1 );
-               array_unshift( $array, $cut[0] );
-               return $array;
-       }
-
-       /**
-        * Get a redirect's destination from a title
-        * @param Title $title A title to redirect. It may not redirect or even exist
-        * @return null|string If title exists and redirects, get the destination's prefixed name
-        */
-       private function getRedirectTarget( $title ) {
-               $page = WikiPage::factory( $title );
-               if ( !$page->exists() ) {
-                       return null;
-               }
-               $redir = $page->getRedirectTarget();
-               return $redir ? $redir->getPrefixedText() : null;
+               $rescorer = new SearchExactMatchRescorer();
+               return $rescorer->rescore( $search, $namespaces, $srchres, $limit );
        }
 
        /**
index 4b39efd..46131c1 100644 (file)
@@ -3591,12 +3591,10 @@ class Title {
         * Purge all applicable Squid URLs
         */
        public function purgeSquid() {
-               global $wgUseSquid;
-               if ( $wgUseSquid ) {
-                       $urls = $this->getSquidURLs();
-                       $u = new SquidUpdate( $urls );
-                       $u->doUpdate();
-               }
+               DeferredUpdates::addUpdate(
+                       new SquidUpdate( $this->getSquidURLs() ),
+                       DeferredUpdates::PRESEND
+               );
        }
 
        /**
index ebddd51..c6d267c 100644 (file)
@@ -19,6 +19,8 @@
  * @author Aaron Schulz
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Prepare an edit in shared cache so that it can be reused on edit
  *
@@ -133,6 +135,7 @@ class ApiStashEdit extends ApiBase {
         */
        public static function parseAndStash( WikiPage $page, Content $content, User $user ) {
                $cache = ObjectCache::getLocalClusterInstance();
+               $logger = LoggerFactory::getInstance( 'StashEdit' );
 
                $format = $content->getDefaultFormat();
                $editInfo = $page->prepareContentForEdit( $content, null, $user, $format, false );
@@ -147,14 +150,14 @@ class ApiStashEdit extends ApiBase {
                        if ( $stashInfo ) {
                                $ok = $cache->set( $key, $stashInfo, $ttl );
                                if ( $ok ) {
-                                       wfDebugLog( 'StashEdit', "Cached parser output for key '$key'." );
+                                       $logger->debug( "Cached parser output for key '$key'." );
                                        return self::ERROR_NONE;
                                } else {
-                                       wfDebugLog( 'StashEdit', "Failed to cache parser output for key '$key'." );
+                                       $logger->error( "Failed to cache parser output for key '$key'." );
                                        return self::ERROR_CACHE;
                                }
                        } else {
-                               wfDebugLog( 'StashEdit', "Uncacheable parser output for key '$key'." );
+                               $logger->info( "Uncacheable parser output for key '$key'." );
                                return self::ERROR_UNCACHEABLE;
                        }
                }
@@ -186,6 +189,7 @@ class ApiStashEdit extends ApiBase {
                ParserOptions $pstOpts, ParserOptions $pOpts, $timestamp
        ) {
                $cache = ObjectCache::getLocalClusterInstance();
+               $logger = LoggerFactory::getInstance( 'StashEdit' );
 
                // getIsPreview() controls parser function behavior that references things
                // like user/revision that don't exists yet. The user/text should already
@@ -207,22 +211,22 @@ class ApiStashEdit extends ApiBase {
                $canonicalPOpts->setIsPreview( true ); // force match
                $canonicalPOpts->setTimestamp( $pOpts->getTimestamp() ); // force match
                if ( !$pOpts->matches( $canonicalPOpts ) ) {
-                       wfDebugLog( 'StashEdit', "Uncacheable preview output for key '$key' (options)." );
+                       $logger->info( "Uncacheable preview output for key '$key' (options)." );
                        return false;
                }
 
                // Build a value to cache with a proper TTL
                list( $stashInfo, $ttl ) = self::buildStashValue( $pstContent, $pOut, $timestamp );
                if ( !$stashInfo ) {
-                       wfDebugLog( 'StashEdit', "Uncacheable parser output for key '$key' (rev/TTL)." );
+                       $logger->info( "Uncacheable parser output for key '$key' (rev/TTL)." );
                        return false;
                }
 
                $ok = $cache->set( $key, $stashInfo, $ttl );
                if ( !$ok ) {
-                       wfDebugLog( 'StashEdit', "Failed to cache preview parser output for key '$key'." );
+                       $logger->error( "Failed to cache preview parser output for key '$key'." );
                } else {
-                       wfDebugLog( 'StashEdit', "Cached preview output for key '$key'." );
+                       $logger->debug( "Cached preview output for key '$key'." );
                }
 
                return $ok;
@@ -247,6 +251,7 @@ class ApiStashEdit extends ApiBase {
         */
        public static function checkCache( Title $title, Content $content, User $user ) {
                $cache = ObjectCache::getLocalClusterInstance();
+               $logger = LoggerFactory::getInstance( 'StashEdit' );
 
                $key = self::getStashKey( $title, $content, $user );
                $editInfo = $cache->get( $key );
@@ -260,18 +265,18 @@ class ApiStashEdit extends ApiBase {
                        }
                        $sec = microtime( true ) - $start;
                        if ( $sec > .01 ) {
-                               wfDebugLog( 'StashEdit', "Waited $sec seconds on '$key'." );
+                               $logger->warning( "Waited $sec seconds on '$key'." );
                        }
                }
 
                if ( !is_object( $editInfo ) || !$editInfo->output ) {
-                       wfDebugLog( 'StashEdit', "No cache value for key '$key'." );
+                       $logger->debug( "No cache value for key '$key'." );
                        return false;
                }
 
                $time = wfTimestamp( TS_UNIX, $editInfo->output->getTimestamp() );
                if ( ( time() - $time ) <= 3 ) {
-                       wfDebugLog( 'StashEdit', "Timestamp-based cache hit for key '$key'." );
+                       $logger->debug( "Timestamp-based cache hit for key '$key'." );
                        return $editInfo; // assume nothing changed
                }
 
@@ -299,7 +304,7 @@ class ApiStashEdit extends ApiBase {
                        }
 
                        if ( $changed || $res->numRows() != $templateUses ) {
-                               wfDebugLog( 'StashEdit', "Stale cache for key '$key'; template changed." );
+                               $logger->info( "Stale cache for key '$key'; template changed." );
                                return false;
                        }
                }
@@ -322,12 +327,12 @@ class ApiStashEdit extends ApiBase {
                        }
 
                        if ( $changed || $res->numRows() != count( $files ) ) {
-                               wfDebugLog( 'StashEdit', "Stale cache for key '$key'; file changed." );
+                               $logger->info( "Stale cache for key '$key'; file changed." );
                                return false;
                        }
                }
 
-               wfDebugLog( 'StashEdit', "Cache hit for key '$key'." );
+               $logger->debug( "Cache hit for key '$key'." );
 
                return $editInfo;
        }
index 99a0f42..c737355 100644 (file)
@@ -1,32 +1,33 @@
 {
        "@metadata": {
                "authors": [
-                       "Gorizon"
+                       "Gorizon",
+                       "Mirzali"
                ]
        },
        "apihelp-createaccount-param-name": "Nameyê karberi.",
        "apihelp-delete-description": "Pele bestere.",
        "apihelp-disabled-description": "Eno modul aktiv niyo.",
-       "apihelp-edit-description": "Vırazı u pela bıvurne",
+       "apihelp-edit-description": "Vıraze û pelan bıvurne.",
        "apihelp-edit-param-text": "Zerreki pele",
        "apihelp-edit-param-minor": "Vurnayışo qıckek.",
        "apihelp-edit-param-notminor": "Vurnayışo qıckek niyo.",
-       "apihelp-edit-param-bot": "Ney vurnayışa boti nışan ke",
+       "apihelp-edit-param-bot": "Nê vurnayışi zey boti nişan ke.",
        "apihelp-edit-example-edit": "Şeker bıvurne",
-       "apihelp-emailuser-description": "E-postaya karberi",
-       "apihelp-emailuser-param-target": "Karbero ke cırê eposta do bırışiyo",
-       "apihelp-emailuser-param-subject": "Sernamey mewzu",
-       "apihelp-emailuser-param-text": "Metna eposta",
-       "apihelp-emailuser-param-ccme": "Ju kopyay ena posta bırış mırê.",
-       "apihelp-expandtemplates-param-title": "Sernemay peler",
-       "apihelp-expandtemplates-param-text": "Wikimetini açarnê",
-       "apihelp-feedrecentchanges-param-hideminor": "Vurnayışanê qıckan bınımne",
+       "apihelp-emailuser-description": "Yew karberi rê e-poste bırışe.",
+       "apihelp-emailuser-param-target": "Karbero ke cı rê e-poste do bırışiyo.",
+       "apihelp-emailuser-param-subject": "Sernameyê mewzuyi.",
+       "apihelp-emailuser-param-text": "Metınê e-posteyi.",
+       "apihelp-emailuser-param-ccme": "Yew kopyaya nê posteyi mı rê bırışe.",
+       "apihelp-expandtemplates-param-title": "Sernameyê pele.",
+       "apihelp-expandtemplates-param-text": "Wikimetıni açarnê.",
+       "apihelp-feedrecentchanges-param-hideminor": "Vurnayışanê qıckekan bınımne.",
        "apihelp-feedrecentchanges-param-hidebots": "Vurnayışanê botan bınımne.",
-       "apihelp-feedrecentchanges-param-hideanons": "VurnayıÅ\9fané karberan de anoniman bınımne",
-       "apihelp-feedrecentchanges-param-hideliu": "Vurnayışanê karberan de qeydınan bınımne.",
+       "apihelp-feedrecentchanges-param-hideanons": "VurnayıÅ\9fanê karberanê anoniman bınımne.",
+       "apihelp-feedrecentchanges-param-hideliu": "Vurnayışanê karberanê qeydınan bınımne.",
        "apihelp-login-param-name": "Nameyê karberi.",
        "apihelp-login-param-password": "Parola.",
        "apihelp-login-param-domain": "Domain (optional).",
        "apihelp-login-example-login": "Dekew.",
-       "apihelp-move-description": "Peler bere."
+       "apihelp-move-description": "Yew pele bere."
 }
index c3197f8..c6b08c1 100644 (file)
        "apihelp-parse-paramvalue-prop-sections": "Jitt de Affschnedde em jepahßde Wikkitäx uß.",
        "apihelp-parse-paramvalue-prop-revid": "Deiht de Kännong vun de Väsjohn vun dä jepahßde Sigg derbei.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Deiht de Övverschreff vum jepahßde Wikkitäx derbei.",
+       "apihelp-parse-paramvalue-prop-headitems": "Jitt de Saacher för enn der <code>&lt;head&gt;</code> vun dä Sigg ze donn.",
        "apihelp-parse-paramvalue-prop-modules": "Jitt dem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Delivery system in MediaWiki for the optimized run-time loading and managing of modules\">ResourceLoader</i> sing Moduhle uß, di en dä Sigg jebruch wähde. Äntwehder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">jsconfigvars</kbd>“ udder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">encodedjsconfigvars</kbd>“ moß mer met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">modules</kbd>“ zesamme aanforrdere.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Livvert de Varrejahble vun dä Ennschtällonge vum JavaSkrep, di äxtra för heh di Sigg enjeschtallt sin.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Jitt de Engewikkilengks em jepahßde Wikkitäx uß.",
        "apihelp-xml-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Fommahd ußjävve.",
        "apihelp-xml-param-includexmlnamespace": "Wann aanjejovve, deihd en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Appachtemand derbei.",
        "apihelp-xmlfm-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Fommahd schöhn jemaht met <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> ußjävve.",
-       "apihelp-yaml-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"YAML Ain't Markup Language\">YAML</i>-Fommahd ußjävve.",
-       "apihelp-yamlfm-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"YAML Ain't Markup Language\">YAML</i>-Fommahd schöhn met <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> ußjävve.",
        "api-format-title": "Wat et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> ußjohv.",
        "api-format-prettyprint-header-only-html": "Dat heh es en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>_Daaschtällong un för et Fähersöhke jedaach. Dadd is för Aanwändongsprojramme nit ze bruche.\n\nEn de [[mw:API|complete Dokkemäntazjohn]] un de [[Special:ApiHelp/main|API Hölp_Sigg]] kam_mer doh mih drövver lässe.",
        "api-pageset-param-titles": "En Leß vun Övverschreffte för ze beärbeide.",
diff --git a/includes/api/i18n/lki.json b/includes/api/i18n/lki.json
new file mode 100644 (file)
index 0000000..ea5b62f
--- /dev/null
@@ -0,0 +1,19 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Hosseinblue"
+               ]
+       },
+       "apihelp-main-param-action": "کام عملیات انجؤم بِ.",
+       "apihelp-main-param-format": "فرمت خروجی",
+       "apihelp-block-description": "بستن کاربر.",
+       "apihelp-createaccount-param-name": ":نؤم بهرۀگر-کاربر",
+       "apihelp-delete-description": "حۀذف وۀلگۀ",
+       "apihelp-edit-description": "دؤرس کردن و دۀسکاری وۀلگۀ",
+       "apihelp-edit-param-sectiontitle": "نام سۀر وۀلگ تازۀ",
+       "apihelp-edit-example-edit": "دۀسکاری وۀلگۀ.",
+       "apihelp-login-param-name": "نام کاربری",
+       "apihelp-login-param-password": ".رمز",
+       "apihelp-login-example-login": "نؤم هۀتن.",
+       "apihelp-logout-description": "دۀرچئن و پاک کردن داده متن"
+}
index ca77d1c..949b4e7 100644 (file)
        "apihelp-help-param-helpformat": "Format wyjściowy pomocy.",
        "apihelp-help-param-toc": "Dołącz spis treści do wyjściowego HTML.",
        "apihelp-help-example-main": "Pomoc dla modułu głównego",
+       "apihelp-help-example-submodules": "Pomoc dla <kbd>action=query</kbd> i wszystkich jej podmodułów.",
        "apihelp-help-example-recursive": "Cała pomoc na jednej stronie.",
        "apihelp-help-example-help": "Pomoc dla modułu pomocy",
        "apihelp-help-example-query": "Pomoc dla dwóch podmodułów zapytań.",
index 1366f5e..14e32ba 100644 (file)
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parametrar}}:",
        "api-help-param-deprecated": "Föråldrad.",
        "api-help-param-required": "Denna parameter är obligatorisk.",
-       "api-help-param-list": "{{PLURAL:$1|1=Ett värde|2=Värden (separerade med <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Ett av följande värden|2=Värden (separerade med <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Måste vara tom|Kan vara tom, eller $2}}",
        "api-help-param-limit": "Inte mer än $1 tillåts.",
        "api-help-param-limit2": "Inte mer än $1 ($2 för robotar) tillåts."
index 615ea26..9c492d3 100644 (file)
        "apihelp-edit-param-undo": "撤销此次修订。覆盖$1text、$1prependtext和$1appendtext。",
        "apihelp-edit-param-undoafter": "撤销从$1undo至此的所有修订。如果不设置就撤销一次修订。",
        "apihelp-edit-param-redirect": "自动解决重定向。",
-       "apihelp-edit-param-contentformat": "用于输入文本的内容串行化格式。",
+       "apihelp-edit-param-contentformat": "用于输入文本的内容序列化格式。",
        "apihelp-edit-param-contentmodel": "新内容的内容模型。",
        "apihelp-edit-param-token": "令牌应总是发送为最后参数,或至少在$1text参数之后。",
        "apihelp-edit-example-edit": "编辑一个页面。",
        "apihelp-expandtemplates-param-revid": "修订版本ID,用于<nowiki>{{REVISIONID}}</nowiki>和类似变体。",
        "apihelp-expandtemplates-param-prop": "要获取的那条信息。\n\n注意如果没有选定值,结果将包含wiki文本,但将以弃用的格式显示。",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "扩充的wiki文本。",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "任何在输出中提供的,未在wiki文本输出中表现的分类。",
        "apihelp-expandtemplates-paramvalue-prop-properties": "由wiki文本中扩充的魔术字定义的页面属性。",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "无论输出是否常常变动,均不应被在页面中其他任何位置重用。",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "结果缓存应无效化后的最长时间。",
        "apihelp-query+allmessages-description": "返回来自该网站的消息。",
        "apihelp-query+allmessages-param-messages": "要输出的消息。<kbd>*</kbd>(默认)表示所有消息。",
        "apihelp-query+allmessages-param-prop": "要获取的属性。",
+       "apihelp-query+allmessages-param-enableparser": "设置以启用解析器,将处理消息的wiki文本(替代魔术字、处理模板等)。",
        "apihelp-query+allmessages-param-nocontent": "如果设置,不要在输出中包含消息内容。",
        "apihelp-query+allmessages-param-args": "要替代进消息的参数。",
        "apihelp-query+allmessages-param-filter": "只返回名称包含此字符串的消息。",
        "apihelp-query+allpages-param-minsize": "限于至少这么多字节的页面。",
        "apihelp-query+allpages-param-maxsize": "限于至多这么多字节的页面。",
        "apihelp-query+allpages-param-prtype": "仅限于受保护页面。",
+       "apihelp-query+allpages-param-prlevel": "过滤基于保护等级的保护(必须与$1prtype=参数一起使用)。",
        "apihelp-query+allpages-param-prfiltercascade": "过滤基于cascadingness的保护(当$1prtype未设置时忽略)。",
        "apihelp-query+allpages-param-limit": "返回的总计页面数。",
        "apihelp-query+allpages-param-dir": "罗列所采用的方向。",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "添加用于非最新版本的存档版本的文件名。",
        "apihelp-query+filearchive-example-simple": "显示已删除文件列表。",
        "apihelp-query+filerepoinfo-description": "返回有关wiki配置的图片存储库的元信息。",
+       "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:The key of the repository - used in e.g. <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.",
        "apihelp-query+filerepoinfo-example-simple": "获得有关文件存储库的信息。",
        "apihelp-query+fileusage-description": "查找所有使用指定文件的页面。",
        "apihelp-query+fileusage-param-prop": "要获取的属性:",
        "apihelp-query+userinfo-param-prop": "要包含的信息束:",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "如果当前用户有等待中的消息的话,添加标签<samp>messages</samp>。",
-       "apihelp-query+userinfo-paramvalue-prop-groups": "Lists all the groups the current user belongs to.",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "列举当前用户隶属的所有群组。",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Lists all the groups the current user is automatically a member of.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Lists all the rights the current user has.",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lists the groups the current user can add to and remove from.",
        "apihelp-query+userinfo-paramvalue-prop-options": "Lists all preferences the current user has set.",
-       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.",
-       "apihelp-query+userinfo-paramvalue-prop-editcount": "Adds the current user's edit count.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">已弃用。</span>获取令牌以更改当前用户的参数设置。",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "添加当前用户的编辑计数。",
        "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lists all rate limits applying to the current user.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "添加用户的真实姓名。",
        "apihelp-query+userinfo-paramvalue-prop-email": "Adds the user's email address and email authentication date.",
        "apihelp-stashedit-param-sectiontitle": "新段落的标题。",
        "apihelp-stashedit-param-text": "页面内容。",
        "apihelp-stashedit-param-contentmodel": "新内容的内容模型。",
+       "apihelp-stashedit-param-contentformat": "用于输入文本的内容序列化格式。",
        "apihelp-stashedit-param-baserevid": "基础修订的修订ID。",
        "apihelp-tag-description": "从个别修订或日志记录中添加或移除更改标签。",
        "apihelp-tag-param-rcid": "要添加或移除标签的一个或更多的最近更改ID。",
        "apihelp-undelete-param-reason": "恢复的原因。",
        "apihelp-undelete-param-timestamps": "要回复的修订的时间戳。如果<var>$1timestamps</var>和<var>$1fileids</var>都为空,所有将被恢复。",
        "apihelp-undelete-param-fileids": "要恢复的文件修订ID。如果<var>$1timestamps</var>和<var>$1fileids</var>都为空,所有将被恢复。",
+       "apihelp-undelete-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-undelete-example-page": "恢复页面<kbd>Main Page</kbd>。",
        "apihelp-undelete-example-revisions": "恢复<kbd>Main Page</kbd>的两个修订。",
        "apihelp-upload-description": "上传一个文件,或获取正在等待中的上传的状态。\n\n可以使用的几种方法:\n* 直接上传文件内容,使用<var>$1file</var>参数。\n* 成批上传文件,使用<var>$1filesize</var>、<var>$1chunk</var>和<var>$1offset</var>参数。\n* 有MediaWiki服务器从URL检索一个文件,使用<var>$1url</var>参数。\n* 完成一次由于警告而失败的早前上传,使用<var>$1filekey</var>参数。\n需要注意,当发送<var>$1file</var>时,HTTP POST必须做为一次文件上传(也就是使用<code>multipart/form-data</code>)完成。",
        "apihelp-upload-param-offset": "块的偏移量(字节)。",
        "apihelp-upload-param-chunk": "大块内容。",
        "apihelp-upload-param-leavemessage": "如果asyncdownload被使用,当完成时,在用户讨论页留下一条消息。",
+       "apihelp-upload-param-statuskey": "检索此文件密钥的上传状态(通过URL上传)。",
+       "apihelp-upload-param-checkstatus": "只检索指定文件密钥的上传状态。",
        "apihelp-upload-example-url": "从URL上传。",
        "apihelp-upload-example-filekey": "完成一次由于警告而失败的上传。",
        "apihelp-userrights-description": "更改一位用户的组成员。",
index fbcdcab..bc4d4a9 100644 (file)
@@ -6,7 +6,8 @@
                        "LNDDYL",
                        "EagerLin",
                        "Zhxy 519",
-                       "Macofe"
+                       "Macofe",
+                       "Jasonzhuocn"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文件]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵件清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug與請求]\n</div>\n<strong>狀態資訊:</strong>本頁所展示的所有功能都應正常工作,但是 API 仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n<strong>錯誤請求:</strong>當 API 收到錯誤請求時, HTTP header 將會返回一個包含「MediaWiki-API-Error」的值,隨後 header 的值與錯誤碼將會送回並設定為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。",
        "apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。",
        "apihelp-query+contributors-param-limit": "要回傳的貢獻人員數量。",
        "apihelp-query+duplicatefiles-param-limit": "要回傳的重複檔案數量。",
+       "apihelp-query+embeddedin-param-filterredir": "如何過濾重定向。",
        "apihelp-query+embeddedin-param-limit": "要回傳的頁面總數。",
        "apihelp-query+extlinks-description": "回傳所有指定頁面的外部 URL (非 interwiki)。",
        "apihelp-query+extlinks-param-limit": "要回傳的連結數量。",
index 64db0d6..1b9f9b3 100644 (file)
@@ -166,6 +166,14 @@ class RedisConnectionPool implements LoggerAwareInterface {
                return self::$instances[$id];
        }
 
+       /**
+        * Destroy all singleton() instances
+        * @since 1.27
+        */
+       public static function destroySingletons() {
+               self::$instances = array();
+       }
+
        /**
         * Get a connection to a redis server. Based on code in RedisBagOStuff.php.
         *
diff --git a/includes/deferred/DeferrableUpdate.php b/includes/deferred/DeferrableUpdate.php
new file mode 100644 (file)
index 0000000..5f4d821
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * Interface that deferrable updates should implement. Basically required so we
+ * can validate input on DeferredUpdates::addUpdate()
+ *
+ * @since 1.19
+ */
+interface DeferrableUpdate {
+       /**
+        * Perform the actual work
+        */
+       function doUpdate();
+}
index 8eec202..fb6ef13 100644 (file)
  * @file
  */
 
-/**
- * Interface that deferrable updates should implement. Basically required so we
- * can validate input on DeferredUpdates::addUpdate()
- *
- * @since 1.19
- */
-interface DeferrableUpdate {
-       /**
-        * Perform the actual work
-        */
-       function doUpdate();
-}
-
 /**
  * Class for managing the deferred updates
  *
- * Deferred updates can be run at the end of the request,
- * after the HTTP response has been sent. In CLI mode, updates
- * are only deferred until there is no local master DB transaction.
- * When updates are deferred, they go into a simple FIFO queue.
+ * In web request mode, deferred updates can be run at the end of the request, either before or
+ * after the HTTP response has been sent. In either case, they run after the DB commit step. If
+ * an update runs after the response is sent, it will not block clients. If sent before, it will
+ * run synchronously. If such an update works via queueing, it will be more likely to complete by
+ * the time the client makes their next request after this one.
+ *
+ * In CLI mode, updates are only deferred until the current wiki has no DB write transaction
+ * active within this request.
+ *
+ * When updates are deferred, they use a FIFO queue (one for pre-send and one for post-send).
  *
  * @since 1.19
  */
 class DeferredUpdates {
-       /** @var DeferrableUpdate[] Updates to be deferred until the end of the request */
-       private static $updates = array();
-       /** @var bool Defer updates fully even in CLI mode */
-       private static $forceDeferral = false;
+       /** @var DeferrableUpdate[] Updates to be deferred until before request end */
+       private static $preSendUpdates = array();
+       /** @var DeferrableUpdate[] Updates to be deferred until after request end */
+       private static $postSendUpdates = array();
+
+       const ALL = 0; // all updates
+       const PRESEND = 1; // for updates that should run before flushing output buffer
+       const POSTSEND = 2; // for updates that should run after flushing output buffer
 
        /**
         * Add an update to the deferred list
+        *
         * @param DeferrableUpdate $update Some object that implements doUpdate()
+        * @param integer $type DeferredUpdates constant (PRESEND or POSTSEND) (since 1.27)
+        */
+       public static function addUpdate( DeferrableUpdate $update, $type = self::POSTSEND ) {
+               if ( $type === self::PRESEND ) {
+                       self::push( self::$preSendUpdates, $update );
+               } else {
+                       self::push( self::$postSendUpdates, $update );
+               }
+       }
+
+       /**
+        * Add a callable update.  In a lot of cases, we just need a callback/closure,
+        * defining a new DeferrableUpdate object is not necessary
+        *
+        * @see MWCallableUpdate::__construct()
+        *
+        * @param callable $callable
+        * @param integer $type DeferredUpdates constant (PRESEND or POSTSEND) (since 1.27)
+        */
+       public static function addCallableUpdate( $callable, $type = self::POSTSEND ) {
+               self::addUpdate( new MWCallableUpdate( $callable ), $type );
+       }
+
+       /**
+        * Do any deferred updates and clear the list
+        *
+        * @param string $mode Use "enqueue" to use the job queue when possible [Default: "run"]
+        * @param integer $type DeferredUpdates constant (PRESEND, POSTSEND, or ALL) (since 1.27)
         */
-       public static function addUpdate( DeferrableUpdate $update ) {
+       public static function doUpdates( $mode = 'run', $type = self::ALL ) {
+               if ( $type === self::ALL || $type == self::PRESEND ) {
+                       self::execute( self::$preSendUpdates, $mode );
+               }
+
+               if ( $type === self::ALL || $type == self::POSTSEND ) {
+                       self::execute( self::$postSendUpdates, $mode );
+               }
+       }
+
+       private static function push( array &$queue, DeferrableUpdate $update ) {
                global $wgCommandLineMode;
 
-               array_push( self::$updates, $update );
-               if ( self::$forceDeferral ) {
-                       return;
+               if ( $update instanceof MergeableUpdate ) {
+                       $class = get_class( $update ); // fully-qualified class
+                       if ( isset( $queue[$class] ) ) {
+                               /** @var $existingUpdate MergeableUpdate */
+                               $existingUpdate = $queue[$class];
+                               $existingUpdate->merge( $update );
+                       } else {
+                               $queue[$class] = $update;
+                       }
+               } else {
+                       $queue[] = $update;
                }
 
                // CLI scripts may forget to periodically flush these updates,
-               // so try to handle that rather than OOMing and losing them.
-               // Try to run the updates as soon as there is no local transaction.
+               // so try to handle that rather than OOMing and losing them entirely.
+               // Try to run the updates as soon as there is no current wiki transaction.
                static $waitingOnTrx = false; // de-duplicate callback
                if ( $wgCommandLineMode && !$waitingOnTrx ) {
                        $lb = wfGetLB();
@@ -81,34 +125,12 @@ class DeferredUpdates {
                }
        }
 
-       /**
-        * Add a callable update.  In a lot of cases, we just need a callback/closure,
-        * defining a new DeferrableUpdate object is not necessary
-        * @see MWCallableUpdate::__construct()
-        * @param callable $callable
-        */
-       public static function addCallableUpdate( $callable ) {
-               self::addUpdate( new MWCallableUpdate( $callable ) );
-       }
-
-       /**
-        * Do any deferred updates and clear the list
-        *
-        * @param string $mode Use "enqueue" to use the job queue when possible [Default: run]
-        *   prevent lock contention
-        * @param string $oldMode Unused
-        */
-       public static function doUpdates( $mode = 'run', $oldMode = '' ) {
-               // B/C for ( $commit, $mode ) args
-               $mode = $oldMode ?: $mode;
-               if ( $mode === 'commit' ) {
-                       $mode = 'run';
-               }
-
-               $updates = self::$updates;
+       public static function execute( array &$queue, $mode ) {
+               $updates = $queue; // snapshot of queue
 
+               // Keep doing rounds of updates until none get enqueued
                while ( count( $updates ) ) {
-                       self::clearPendingUpdates();
+                       $queue = array(); // clear the queue
                        /** @var DataUpdate[] $dataUpdates */
                        $dataUpdates = array();
                        /** @var DeferrableUpdate[] $otherUpdates */
@@ -140,7 +162,7 @@ class DeferredUpdates {
                                }
                        }
 
-                       $updates = self::$updates;
+                       $updates = $queue; // new snapshot of queue (check for new entries)
                }
        }
 
@@ -149,15 +171,7 @@ class DeferredUpdates {
         * want or need to call this. Unit tests need it though.
         */
        public static function clearPendingUpdates() {
-               self::$updates = array();
-       }
-
-       /**
-        * @note This method is intended for testing purposes
-        * @param bool $value Whether to *always* defer updates, even in CLI mode
-        * @since 1.27
-        */
-       public static function forceDeferral( $value ) {
-               self::$forceDeferral = $value;
+               self::$preSendUpdates = array();
+               self::$postSendUpdates = array();
        }
 }
index a480aec..db3790f 100644 (file)
@@ -43,24 +43,8 @@ class HTMLCacheUpdate implements DeferrableUpdate {
        }
 
        public function doUpdate() {
-               $job = new HTMLCacheUpdateJob(
-                       $this->mTitle,
-                       array(
-                               'table' => $this->mTable,
-                               'recursive' => true
-                       ) + Job::newRootJobParams( // "overall" refresh links job info
-                               "htmlCacheUpdate:{$this->mTable}:{$this->mTitle->getPrefixedText()}"
-                       )
-               );
+               $job = HTMLCacheUpdateJob::newForBacklinks( $this->mTitle, $this->mTable );
 
-               $count = $this->mTitle->getBacklinkCache()->getNumLinks( $this->mTable, 100 );
-               if ( $count >= 100 ) { // many backlinks
-                       JobQueueGroup::singleton()->lazyPush( $job );
-               } else { // few backlinks ($count might be off even if 0)
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->onTransactionIdle( function () use ( $job ) {
-                               $job->run(); // just do the purge query now
-                       } );
-               }
+               JobQueueGroup::singleton()->lazyPush( $job );
        }
 }
index f9d7e9c..755a7cd 100644 (file)
@@ -61,9 +61,6 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
        /** @var bool Whether to queue jobs for recursive updates */
        public $mRecursive;
 
-       /** @var bool Whether this job was triggered by a recursive update job */
-       private $mTriggeredRecursive;
-
        /** @var Revision Revision for which this update has been triggered */
        private $mRevision;
 
@@ -868,15 +865,6 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                return $this->mImages;
        }
 
-       /**
-        * Set this object as being triggered by a recursive LinksUpdate
-        *
-        * @since 1.27
-        */
-       public function setTriggeredRecursive() {
-               $this->mTriggeredRecursive = true;
-       }
-
        /**
         * Set the revision corresponding to this LinksUpdate
         *
diff --git a/includes/deferred/MergeableUpdate.php b/includes/deferred/MergeableUpdate.php
new file mode 100644 (file)
index 0000000..70760ce
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * Interface that deferrable updates can implement. DeferredUpdates uses this to merge
+ * all pending updates of PHP class into a single update by calling merge().
+ *
+ * @since 1.27
+ */
+interface MergeableUpdate {
+       /**
+        * Merge this update with $update
+        *
+        * @param MergeableUpdate $update Update of the same class type
+        */
+       function merge( MergeableUpdate $update );
+}
index d33e4a5..c223de8 100644 (file)
  * @ingroup Cache
  */
 
+use Wikimedia\Assert\Assert;
+
 /**
  * Handles purging appropriate Squid URLs given a title (or titles)
  * @ingroup Cache
  */
-class SquidUpdate implements DeferrableUpdate {
+class SquidUpdate implements DeferrableUpdate, MergeableUpdate {
        /** @var string[] Collection of URLs to purge */
        protected $urls = array();
 
@@ -33,8 +35,7 @@ class SquidUpdate implements DeferrableUpdate {
         * @param string[] $urlArr Collection of URLs to purge
         */
        public function __construct( array $urlArr ) {
-               // Remove duplicate URLs from list
-               $this->urls = array_unique( $urlArr );
+               $this->urls = $urlArr;
        }
 
        /**
@@ -59,9 +60,7 @@ class SquidUpdate implements DeferrableUpdate {
         * @deprecated 1.27
         */
        public static function newSimplePurge( Title $title ) {
-               $urlArr = $title->getSquidURLs();
-
-               return new SquidUpdate( $urlArr );
+               return new SquidUpdate( $title->getSquidURLs() );
        }
 
        /**
@@ -71,6 +70,13 @@ class SquidUpdate implements DeferrableUpdate {
                self::purge( $this->urls );
        }
 
+       public function merge( MergeableUpdate $update ) {
+               /** @var SquidUpdate $update */
+               Assert::parameterType( __CLASS__, $update, '$update' );
+
+               $this->urls = array_merge( $this->urls, $update->urls );
+       }
+
        /**
         * Purges a list of Squids defined in $wgSquidServers.
         * $urlArr should contain the full URLs to purge as values
@@ -86,6 +92,9 @@ class SquidUpdate implements DeferrableUpdate {
                        return;
                }
 
+               // Remove duplicate URLs from list
+               $urlArr = array_unique( $urlArr );
+
                wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) );
 
                if ( $wgHTCPRouting ) {
@@ -93,8 +102,6 @@ class SquidUpdate implements DeferrableUpdate {
                }
 
                if ( $wgSquidServers ) {
-                       // Remove duplicate URLs
-                       $urlArr = array_unique( $urlArr );
                        // Maximum number of parallel connections per squid
                        $maxSocketsPerSquid = 8;
                        // Number of requests to send per socket
@@ -127,7 +134,7 @@ class SquidUpdate implements DeferrableUpdate {
         * @throws MWException
         * @param string[] $urlArr Collection of URLs to purge
         */
-       protected static function HTCPPurge( array $urlArr ) {
+       private static function HTCPPurge( array $urlArr ) {
                global $wgHTCPRouting, $wgHTCPMulticastTTL;
 
                // HTCP CLR operation
@@ -158,8 +165,6 @@ class SquidUpdate implements DeferrableUpdate {
                                $wgHTCPMulticastTTL );
                }
 
-               // Remove duplicate URLs from collection
-               $urlArr = array_unique( $urlArr );
                // Get sequential trx IDs for packet loss counting
                $ids = UIDGenerator::newSequentialPerNodeIDs(
                        'squidhtcppurge', 32, count( $urlArr ), UIDGenerator::QUICK_VOLATILE
index 647dbec..15007af 100644 (file)
@@ -123,13 +123,13 @@ class FileRepo {
        /** @var bool Whether all zones should be private (e.g. private wiki repo) */
        protected $isPrivate;
 
-       /**
-        * Factory functions for creating new files
-        * Override these in the base class
-        */
+       /** @var array callable Override these in the base class */
        protected $fileFactory = array( 'UnregisteredLocalFile', 'newFromTitle' );
+       /** @var array callable|bool Override these in the base class */
        protected $oldFileFactory = false;
+       /** @var array callable|bool Override these in the base class */
        protected $fileFactoryKey = false;
+       /** @var array callable|bool Override these in the base class */
        protected $oldFileFactoryKey = false;
 
        /**
@@ -1031,8 +1031,10 @@ class FileRepo {
                                $headers = array( 'Content-Disposition' => $triple[2] );
                        } elseif ( is_array( $triple[2] ) && isset( $triple[2]['headers'] ) ) {
                                $headers = $triple[2]['headers'];
+                       } else {
+                               $headers = array();
                        }
-                       // @fixme: $headers might not be defined
+
                        $operations[] = array(
                                'op' => FileBackend::isStoragePath( $src ) ? 'copy' : 'store',
                                'src' => $src,
index c2bbb4e..dcc8741 100644 (file)
@@ -879,7 +879,10 @@ class LocalFile extends File {
                $this->purgeThumbnails( $options );
 
                // Purge squid cache for this file
-               SquidUpdate::purge( array( $this->getURL() ) );
+               DeferredUpdates::addUpdate(
+                       new SquidUpdate( array( $this->getUrl() ) ),
+                       DeferredUpdates::PRESEND
+               );
        }
 
        /**
@@ -887,8 +890,6 @@ class LocalFile extends File {
         * @param string $archiveName Name of the archived file
         */
        function purgeOldThumbnails( $archiveName ) {
-               global $wgUseSquid;
-
                // Get a list of old thumbnails and URLs
                $files = $this->getThumbnails( $archiveName );
 
@@ -899,14 +900,11 @@ class LocalFile extends File {
                $this->purgeThumbList( $dir, $files );
 
                // Purge the squid
-               if ( $wgUseSquid ) {
-                       $urls = array();
-                       foreach ( $files as $file ) {
-                               $urls[] = $this->getArchiveThumbUrl( $archiveName, $file );
-                       }
-                       SquidUpdate::purge( $urls );
+               $urls = array();
+               foreach ( $files as $file ) {
+                       $urls[] = $this->getArchiveThumbUrl( $archiveName, $file );
                }
-
+               DeferredUpdates::addUpdate( new SquidUpdate( $urls ), DeferredUpdates::PRESEND );
        }
 
        /**
@@ -914,18 +912,14 @@ class LocalFile extends File {
         * @param array $options
         */
        public function purgeThumbnails( $options = array() ) {
-               global $wgUseSquid;
-
                // Delete thumbnails
                $files = $this->getThumbnails();
                // Always purge all files from squid regardless of handler filters
                $urls = array();
-               if ( $wgUseSquid ) {
-                       foreach ( $files as $file ) {
-                               $urls[] = $this->getThumbUrl( $file );
-                       }
-                       array_shift( $urls ); // don't purge directory
+               foreach ( $files as $file ) {
+                       $urls[] = $this->getThumbUrl( $file );
                }
+               array_shift( $urls ); // don't purge directory
 
                // Give media handler a chance to filter the file purge list
                if ( !empty( $options['forThumbRefresh'] ) ) {
@@ -942,10 +936,7 @@ class LocalFile extends File {
                $this->purgeThumbList( $dir, $files );
 
                // Purge the squid
-               if ( $wgUseSquid ) {
-                       SquidUpdate::purge( $urls );
-               }
-
+               DeferredUpdates::addUpdate( new SquidUpdate( $urls ), DeferredUpdates::PRESEND );
        }
 
        /**
@@ -1444,7 +1435,10 @@ class LocalFile extends File {
                                # Delete old thumbnails
                                $that->purgeThumbnails();
                                # Remove the old file from the squid cache
-                               SquidUpdate::purge( array( $that->getURL() ) );
+                               DeferredUpdates::addUpdate(
+                                       new SquidUpdate( array( $that->getUrl() ) ),
+                                       DeferredUpdates::PRESEND
+                               );
                        } else {
                                # Update backlink pages pointing to this title if created
                                LinksUpdate::queueRecursiveJobsForTable( $that->getTitle(), 'imagelinks' );
@@ -1631,24 +1625,20 @@ class LocalFile extends File {
                $that = $this;
                $this->getRepo()->getMasterDB()->onTransactionIdle(
                        function () use ( $that, $archiveNames ) {
-                               global $wgUseSquid;
-
                                $that->purgeEverything();
                                foreach ( $archiveNames as $archiveName ) {
                                        $that->purgeOldThumbnails( $archiveName );
                                }
-
-                               if ( $wgUseSquid ) {
-                                       // Purge the squid
-                                       $purgeUrls = array();
-                                       foreach ( $archiveNames as $archiveName ) {
-                                               $purgeUrls[] = $that->getArchiveUrl( $archiveName );
-                                       }
-                                       SquidUpdate::purge( $purgeUrls );
-                               }
                        }
                );
 
+               // Purge the squid
+               $purgeUrls = array();
+               foreach ( $archiveNames as $archiveName ) {
+                       $purgeUrls[] = $this->getArchiveUrl( $archiveName );
+               }
+               DeferredUpdates::addUpdate( new SquidUpdate( $purgeUrls ), DeferredUpdates::PRESEND );
+
                return $status;
        }
 
@@ -1668,7 +1658,6 @@ class LocalFile extends File {
         * @return FileRepoStatus
         */
        function deleteOld( $archiveName, $reason, $suppress = false, $user = null ) {
-               global $wgUseSquid;
                if ( $this->getRepo()->getReadOnlyReason() !== false ) {
                        return $this->readOnlyFatalStatus();
                }
@@ -1685,10 +1674,10 @@ class LocalFile extends File {
                        $this->purgeDescription();
                }
 
-               if ( $wgUseSquid ) {
-                       // Purge the squid
-                       SquidUpdate::purge( array( $this->getArchiveUrl( $archiveName ) ) );
-               }
+               DeferredUpdates::addUpdate(
+                       new SquidUpdate( array( $this->getArchiveUrl( $archiveName ) ) ),
+                       DeferredUpdates::PRESEND
+               );
 
                return $status;
        }
index 369a23b..4cbd0cc 100644 (file)
@@ -9,14 +9,15 @@
                        "Jmarchn",
                        "Alvaro Vidal-Abarca",
                        "ESM",
-                       "Xavier Dengra"
+                       "Xavier Dengra",
+                       "Jaumeortola"
                ]
        },
        "config-desc": "L'instal·lador del MediaWiki",
        "config-title": "Instal·lació del MediaWiki $1",
        "config-information": "Informació",
        "config-localsettings-upgrade": "S'ha detectat un fitxer <code>LocalSettings.php</code>. \nPer tal d'actualitzar la instal·lació, introduïu el valor de <code>$wgUpgradeKey</code> en el quadre a continuació. El trobareu a <code>LocalSettings.php</code>.",
-       "config-localsettings-cli-upgrade": "S'ha detectat un fitxer <code>LocalSettings.php</code>.\nPer tal d'actualitzar la instal·lació, executeu <code>update.php</code>.",
+       "config-localsettings-cli-upgrade": "S'ha detectat un fitxer <code>LocalSettings.php</code>.\nPer actualitzar la instal·lació, executeu <code>update.php</code>.",
        "config-localsettings-key": "Clau d'actualització:",
        "config-localsettings-badkey": "La clau que heu proporcionat no és correcta.",
        "config-upgrade-key-missing": "S'ha detectat una instal·lació ja existent del MediaWiki.\nPer actualitzar-la, poseu la línia següent al final de <code>LocalSettings.php</code>:\n\n$1",
@@ -87,7 +88,7 @@
        "config-db-wiki-account": "Compte d'usuari per al funcionament normal",
        "config-db-wiki-help": "Introduïu el nom d'usuari i la contrasenya que s'utilitzarà per connectar-se a la base de dades durant l'operació normal del wiki.\nSi el compte no existeix, i el compte d'instal·lació té prou privilegis, es crearà aquest compte d'usuari amb els privilegis mínims necessaris per operar el wiki.",
        "config-db-prefix": "Prefix de la base de dades:",
-       "config-db-prefix-help": "Si heu de compartir una base de dades entre diversos wikis, o entre el MediaWiki i una altra aplicació web, podeu afegir un prefix al tots els noms de taula per tal d'evitar conflictes.\nNo utilitzeu espais.\n\nAquest camp acostuma a quedar en blanc.",
+       "config-db-prefix-help": "Si heu de compartir una base de dades entre diversos wikis, o entre el MediaWiki i una altra aplicació web, podeu afegir un prefix al tots els noms de taula per evitar conflictes.\nNo utilitzeu espais.\n\nAquest camp acostuma a quedar en blanc.",
        "config-db-charset": "Joc de caràcters de la base de dades",
        "config-charset-mysql5-binary": "Binari de MySQL 4.1/5.0",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-mssql-old": "Cal utilitzar el Microsoft SQL Server $1 o posterior. Teniu la versió $2.",
        "config-sqlite-name-help": "Trieu un nom per identificar el wiki.\nNo feu servir espais ni guionets.\nAquest nom s’utilitzarà per a denominar el fitxer de les dades de l’SQLite.",
        "config-sqlite-mkdir-error": "S'ha produït un error en crear el directori de dades «$1».\nComproveu la ubicació i torneu-ho a provar.",
-       "config-sqlite-dir-unwritable": "No s'ha pogut escriure al directori «$1».\nCanvieu els seus permisos per tal que el servidor web pugui escriure-hi i torneu-ho a provar.",
+       "config-sqlite-dir-unwritable": "No s'ha pogut escriure al directori «$1».\nCanvieu els permisos perquè el servidor web pugui escriure-hi i torneu-ho a provar.",
        "config-sqlite-connection-error": "$1. \n\nComproveu el directori de dades i el nom de la base de dades a continuació i torneu-ho a provar.",
        "config-sqlite-readonly": "El fitxer <code>$1</code> no es pot escriure.",
        "config-sqlite-cant-create-db": "No s'ha pogut crear el fitxer de base de dades <code>$1</code>.",
        "config-upload-settings": "Imatges i càrregues de fitxers",
        "config-upload-enable": "Habilita la càrrega de fitxers",
        "config-upload-deleted": "Directori pels arxius suprimits:",
-       "config-upload-deleted-help": "Trieu un directori on arxivar els fitxers suprimits.\nIdealment no hauria de ser accessible des del web.",
+       "config-upload-deleted-help": "Trieu un directori per a arxivar els fitxers suprimits.\nIdealment no hauria de ser accessible des del web.",
        "config-logo": "URL del logo:",
        "config-instantcommons": "Habilita Instant Commons",
        "config-cc-error": "El selector de llicència Creative Commons no ha donat cap resultat.\nIntroduïu la llicència manualment.",
diff --git a/includes/installer/i18n/lki.json b/includes/installer/i18n/lki.json
new file mode 100644 (file)
index 0000000..16b8bb2
--- /dev/null
@@ -0,0 +1,50 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Hosseinblue"
+               ]
+       },
+       "config-desc": "نۀصب کۀر ویکی‌مدیا",
+       "config-title": "نۀصب ویکی‌مدیا $1",
+       "config-information": "اطلاعات",
+       "config-localsettings-upgrade": "یک پرونده <code>LocalSettings.php</code> شناسایی شده‌است.\nبرای ارتقاء این نصب لطفاً مقدار <code>$wgUpgradeKey</code> در جعبه زیر وارد کنید.\nشما می‌توانید آن را در <code>LocalSettings.php</code> پیدا کنید.",
+       "config-localsettings-cli-upgrade": "یک پرونده <code>LocalSettings.php</code> شناسایی شده است.\nبرای ارتقاء این نصب، لطفاً <code>update.php</code> را اجرا کنید.",
+       "config-localsettings-key": ":کلید ارتقا",
+       "config-your-language": "زوون هوومۀ",
+       "config-your-language-help": "زوونئ ئۀرا استفاده در طی کار نۀب انتخب کۀن.",
+       "config-wiki-language": "زوون ویکی:",
+       "config-wiki-language-help": "زوونئ انتخاب کۀن  گِ ویکی ویشتر وۀ ئۀؤۀ مۀنیوسِرئ.",
+       "config-back": "→ ئاهۀتن-بازگشت",
+       "config-continue": "ادامه-دؤم گرتن ←",
+       "config-page-language": "زوون",
+       "config-page-welcome": "خؤۀش هۀتین مدیا ویکی!",
+       "config-page-dbconnect": "اتصال به پایگاه داده",
+       "config-page-upgrade": "ارتقای نصب موجود",
+       "config-page-dbsettings": "تنظیمات پایگاه داده",
+       "config-page-name": "نؤم",
+       "config-page-options": "گزینۀل",
+       "config-page-install": "نۀصب",
+       "config-page-complete": "انجؤم دریا-انجؤم هنگت",
+       "config-page-restart": "راه‌اندازی دوواره نصب",
+       "config-page-readme": "بخؤۀن ئۀرانم",
+       "config-page-releasenotes": "یادداشت‌های انتشار",
+       "config-page-copying": "کپی",
+       "config-page-upgradedoc": "ارتقاء",
+       "config-page-existingwiki": "ویکی موجود",
+       "config-help-restart": "آیا می‌خواهید همهٔ اطلاعات ذخیره شده‌ای که وارد کرده‌اید را پاک کنید و دوباره روند نصب را شروع کنید؟",
+       "config-restart": "أرئ، دوواره راه‌اندازی کۀ",
+       "config-db-type": "نوع پایگاه اطلاعات:",
+       "config-db-host": "میزبان پایگاه اطلاعات:",
+       "config-db-host-oracle": "ای ویکیۀ  شناسایی کۀ.",
+       "config-db-name": "نام پایگاه اطلاعات:",
+       "config-site-name-blank": "نام سایتئ وارد کۀن.",
+       "config-ns-generic": "پروژۀ",
+       "config-admin-box": "حساوو مدیر سامانه",
+       "config-admin-name": "نام کاربری هؤمۀ:",
+       "config-admin-password": ":رمز",
+       "config-admin-password-confirm": "رمز دووآرۀ:",
+       "config-admin-email": ":نیشانی رایانامۀ",
+       "config-optional-continue": "پرسشۀلی تریژ بپر إژ مِ",
+       "config-profile-wiki": "واز کردن ویکی",
+       "config-install-step-done": "انجؤم بی"
+}
index 76d8ac1..1157aa8 100644 (file)
@@ -5,40 +5,92 @@
                        "Suyog"
                ]
        },
+       "config-desc": "मिडियाविकि करीता उभारक(ईन्स्टॉलर)",
+       "config-title": "मिडियाविकि $1 उभारणी",
        "config-information": "माहिती",
+       "config-localsettings-upgrade": "<code>LocalSettings.php</code>ही संचिका संसुचित झाली.या उभारणीची दर्जोन्नती करण्यास,खालील पेटीत कृपया <code>$wgUpgradeKey</code> ची किंमत टाका. ती आपणास<code>LocalSettings.php</code>मध्ये सापडेल.",
+       "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code>ही संचिका संसुचित झाली.या उभारणीची दर्जोन्नती करण्यास त्याऐवजी,कृपया<code>update.php</code>चालवा",
        "config-localsettings-key": "दर्जोन्नती कळ:",
        "config-localsettings-badkey": "आपण दिलेली कळ चुकीची आहे.",
+       "config-upgrade-key-missing": "मिडियाविकिचे अस्तित्वात असलेली उभारणी संसुचित झाली आहे.या उभारणीची दर्जोन्नती करण्यास,आपल्या <code>LocalSettings.php</code>च्या खाली असलेल्या ओळीत खालील टाका:\n\n$1",
+       "config-localsettings-incomplete": "अस्तित्वात असलेला <code>LocalSettings.php</code>अपूर्ण दिसत आहे.\n$1 हे चल स्थापिलेले नाही.<code>LocalSettings.php</code> कृपया बदला ज्याने,हे चल स्थापिले जाईल व त्यानंतर \"{{int:Config-continue}}\" टिचका.",
+       "config-localsettings-connection-error": "<code>LocalSettings.php</code> मधील नमूद मांडण्या वापरुन विदागाराशी अनुबंध करतांना एक त्रुटी उद्भवली.\nकृपया या मांडण्या सुधरवुन पुन्हा प्रयत्न करा.\n\n$1",
        "config-session-error": "सत्र सुरू करण्यात त्रुटी:$1",
+       "config-session-expired": "आपला सत्र डाटा कालबाह्य झाला आहे असे दिसते.\n$1 या हयातवेळेशी सत्र रचित असते.\nphp.ini मधिल <code>session.gc_maxlifetime</code> द्वारे आपण त्या वेळेस वाढवु शकता.\nउभारणीची प्रक्रिया पुन्हा सुरू करा.",
+       "config-no-session": "आपला सत्र डाटा हरविला आहे!\nआपली php.ini तपासा व याची खात्री करा कि <code>session.save_path</code> हा योग्य डिरेक्टरीत स्थापिला आहे.",
        "config-your-language": "आपली भाषा:",
        "config-your-language-help": "उभारणी प्रक्रियेत वापरावयाची भाषा निवडा.",
        "config-wiki-language": "विकी भाषा:",
-       "config-wiki-language-help": "तà¥\81मà¤\9aà¥\80 à¤²à¥\87à¤\96न à¤­à¤¾à¤·à¤¾ à¤¨à¤¿à¤µà¤¡à¤¾",
+       "config-wiki-language-help": "à¤\9cà¥\8dयात à¤µà¤¿à¤\95ि à¤ªà¥\8dरबळरितà¥\8dया à¤²à¤¿à¤¹à¥\80ला à¤\9cाà¤\88ल à¤\85शà¥\80 à¤¤à¥\81मà¤\9aà¥\80 à¤²à¥\87à¤\96न à¤­à¤¾à¤·à¤¾ à¤¨à¤¿à¤µà¤¡à¤¾.",
        "config-back": "← परत",
        "config-continue": "चालू ठेवा →",
        "config-page-language": "भाषा",
        "config-page-welcome": "मिडियाविकीवर स्वागत आहे!",
+       "config-page-dbconnect": "डाटाबेसशी अनुबंध करा",
        "config-page-upgrade": "सध्याच्या उभारणीची(इन्स्टॉलेशन) दर्जोन्नती करा",
+       "config-page-dbsettings": "डाटाबेसच्या मांडण्या",
        "config-page-name": "नाव",
        "config-page-options": "पर्याय",
        "config-page-install": "स्थापित करा(इन्स्टॉल)",
        "config-page-complete": "पूर्ण!",
+       "config-page-restart": "उभारणीस पुन्हा सुरू करा",
        "config-page-readme": "हे वाचा",
        "config-page-releasenotes": "विमोचन टिप्पण्या",
-       "config-page-existingwiki": "साध्याचा विकि",
-       "config-restart": "हो, परत चालू करा",
+       "config-page-copying": "नकलवित आहे",
+       "config-page-upgradedoc": "दर्जोन्नती करीत आहे",
+       "config-page-existingwiki": "सध्याचा विकि",
+       "config-help-restart": "आपण टाकून जतन केलेला सर्व डाटा आपणास साफ करावयाचा व उभारणीची प्रक्रिया पुन्हा सुरू करावयाची आहे काय?",
+       "config-restart": "होय, परत चालू करा",
+       "config-welcome": "=== पारिसरीक तपासण्या ===\nमिडियाविकिच्या उभारणीस हा परिसर योग्य आहे काय याच्या मूळ तपासण्या आता केल्या जातील.\nजर आपणास पुढे याची उभारणी करण्याबद्दल साहाय्य लागल्यास, याचा अंतर्भाव करणे लक्षात ठेवा.",
+       "config-copyright": "=== प्रताधिकार व अटी ===\n\n$1\nहा कार्यसंच,हे एक मुक्त संचेतन आहे;आपण त्यास पुनर्वितरीत व/किंवा त्यास फ्री सॉफ्टवेअर फाऊंडेशन द्वारे प्रकाशित, GNU जनरल पब्लिक लायसन्स अंतर्गत बदलु शकता;या परवान्याची आवृत्ती २ किंवा (आपल्या इच्छेनुसार)त्यानंतरची आवृत्ती.\n\nहा कार्यसंचाचे वितरण,पण, <strong>कोणत्याही हमीशिवाय</strong>; याशिवाय <strong>व्यापारीकरणाच्या</strong> कोणत्याही अभिप्रेत आश्वासनाशिवाय किंवा <strong>एखाद्या विशिष्ट कार्यासाठीच्या अर्हतेशिवाय</strong>ही आशा ठेऊन केले आहे कि, तो उपयोगी असेल.\nअधिक माहितीसाठी GNU जनरल पब्लिक लायसन्स बघा.\nआपणास या कार्यसंचासमवेत <doclink href=Copying>GNU जनरल पब्लिक लायसन्सची प्रत मिळाली असेल,</doclink>नसल्यास,फ्री सॉफ्टवेअर फाऊंडेशनला या पत्त्यावर लिहा.Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. किंवा त्यास [http://www.gnu.org/copyleft/gpl.html ऑनलाईन वाचा].",
+       "config-sidebar": "* [//www.mediawiki.org मिडियाविकि गृह]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents सदस्य मार्गदर्शिका]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents प्रशासकाची मार्गदर्शिका]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>विमोचन टिप्पण्या</doclink>\n* <doclink href=Copying>नकलविणे</doclink>\n* <doclink href=UpgradeDoc>दर्जोन्नती करणे</doclink>",
+       "config-env-good": "पारिसरीक तपासणी झाली आहे.\nआपण मिडियाविकि उभारू शकता.",
+       "config-env-bad": "पारिसरीक तपासणी झाली आहे.\nआपण मिडियाविकि उभारू शकत नाही.",
+       "config-env-php": "PHP $1 उभारल्या गेली.",
+       "config-env-hhvm": "HHVM $1 उभारल्या गेली.",
+       "config-unicode-using-intl": "यूनिकोड सामान्यिकरणासाठी [http://pecl.php.net/intl intl PECL विस्तारक] वापरत आहे.",
+       "config-outdated-sqlite": "<strong>इशारा:</strong> आपणापाशी SQLite $1 आहे, जी किमान आवश्यक आवृत्ती $2 पेक्षा, निम्न आहे. SQLite अनुपलब्ध राहील.",
+       "config-register-globals-error": "<strong>त्रुटी: PHP's <code>[http://php.net/register_globals वैश्विकांची नोंद करा]</code> पर्याय सक्षम केला आहे. उभारणी सुरू ठेवण्यास तो अक्षम केल्या जावयास हवा.</strong>ते कसे करावयाचे याच्या साहाय्यासाठी\n[https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] बघा.",
+       "config-magic-quotes-gpc": "<strong>घातक: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] सक्रिय आहे!</strong>\nहा पर्याय, अंदाज येऊ न देता, डाटा इनपुटला भ्रष्ट करते.\nआपण हा पर्यास अक्षम केल्याशिवाय मिडियाविकिची उभारणी किंवा वापर करु शकत नाही.",
+       "config-magic-quotes-runtime": "<strong>घातक: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] सक्रिय आहे!</strong>\nहा पर्याय, अंदाज येऊ न देता, डाटा इनपुटला भ्रष्ट करते.\nआपण हा पर्यास अक्षम केल्याशिवाय मिडियाविकिची उभारणी किंवा वापर करु शकत नाही.",
+       "config-magic-quotes-sybase": "<strong>घातक: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] सक्रिय आहे!</strong>\nहा पर्याय, अंदाज येऊ न देता, डाटा इनपुटला भ्रष्ट करते.\nआपण हा पर्यास अक्षम केल्याशिवाय मिडियाविकिची उभारणी किंवा वापर करु शकत नाही.",
+       "config-memory-raised": "पीएचपीची <code>memory_limit</code> ही $1 आहे, त्यास $2 ला वाढविली.",
+       "config-memory-bad": "पीएचपीची <code>memory_limit</code> ही $1 आहे.\nही बरीच खालच्या स्तरावरची आहे.\nउभारणी अयशस्वी होऊ शकते!",
+       "config-ctype": "<strong>घातक:</strong> पीएचपीचे [http://www.php.net/manual/en/ctype.installation.php Ctype या विस्तारकाशी] साहाय्य करण्यास संकलन करावे लागेल.",
+       "config-iconv": "<strong>घातक:</strong> पीएचपीचे [http://www.php.net/manual/en/iconv.installation.php iconv या विस्तारकाशी]साहाय्य करण्यास संकलन करावे लागेल.",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] उभारली",
+       "config-apc": "[http://www.php.net/apc APC] उभारली आहे",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] उभारली आहे",
+       "config-no-cache": "<strong>इशारा:</strong>  [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] किंवा [http://www.iis.net/download/WinCacheForPhp WinCache] सापडली नाही.\nउद्दीष्टाचे कॅश करणे सक्षम नाही.",
+       "config-diff3-bad": "GNU diff3 सापडली नाही.",
+       "config-git-bad": "गीट आवृत्ती नियमन संचेतन सापडली नाही.",
+       "config-db-type": "डाटाबेसचा प्रकार:",
+       "config-db-host": "डाटाबेसचा यजमान:",
+       "config-db-name": "डाटाबेसचे नाव:",
+       "config-db-name-oracle": "डाटाबेस आकृतीबंध:",
+       "config-db-install-account": "उभारणीसाठी सदस्य खाते",
+       "config-db-username": "डाटाबेसवरील सदस्यनाव:",
+       "config-db-password": "डाटाबेसवरील परवलीचा शब्द:",
+       "config-db-prefix": "डाटाबेस सारणी उपसर्ग:",
+       "config-db-port": "डाटाबेस द्वार:",
        "config-pg-test-error": "विदागाराशी अनुबंधन करता येत नाही <strong>$1</strong>: $2",
        "config-type-mssql": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर",
        "config-header-mssql": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर मांडणावळ",
+       "config-invalid-db-type": "डाटाबेसचा अवैध प्रकार.",
+       "config-connection-error": "$1.\n\nयजमान,सदस्यनाव व परवलीचा शब्द तपासा व पुन्हा प्रयत्न करा.",
        "config-mssql-old": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर $1 किंवा त्यानंतरची आवृत्ती हवी. आपणापाशी $2 आहे.",
+       "config-upgrade-done-no-regenerate": "दर्जोन्नती पूर्ण.\n\nआपण आता [$1 आपला विकिचा वापर करु शकता].",
        "config-mssql-auth": "अधिप्रमाणन प्रकार:",
        "config-mssql-install-auth": "उभारणीच्या(इन्स्टॉलेशन) प्रक्रियेदरम्यान,'अधिप्रमाणन प्रकार'( ऑथेंटीकेशन टाईप) निवडा, ज्याचा वापर डाटाबेसशी अनुबंधनात करण्यात येईल.जर आपण \"{{int:config-mssql-windowsauth}} निवडले तर,ज्याकोणत्याही सदस्याची अधिकारपत्रे(क्रेडेंटियल्स) वेबसर्व्हरवर सुरू असतील,तशीच वापरल्या जातील.",
        "config-mssql-web-auth": "'अधिप्रमाणन प्रकार'( ऑथेंटीकेशन टाईप) निवडा, ज्यास,या विकिचे सामान्य चालनादरम्यान, वेब सर्व्हर हा डाटाबेसशी अनुबंधन करण्यास वापरेल.जर आपण\"{{int:config-mssql-windowsauth}}\" निवडले तर,ज्याकोणत्याही सदस्याची अधिकारपत्रे(क्रेडेंटियल्स) वेबसर्व्हरवर सुरू असतील,तशीच वापरल्या जातील.",
        "config-mssql-sqlauth": "एसक्युएल सर्व्हर अधिप्रमाणन",
        "config-mssql-windowsauth": "विंडोजचे अधिप्रमाणन",
        "config-site-name": "विकिचे नाव:",
+       "config-site-name-help": "हे न्याहाळकाच्या शीर्षक पट्टीत व इतर ठिकाणीही दिसेल .",
        "config-site-name-blank": "संकेतस्थळाचे नाव टाका.",
        "config-project-namespace": "प्रकल्प नामविश्व:",
        "config-ns-generic": "प्रकल्प",
+       "config-ns-site-name": "विकि नावाप्रमाणेच: $1",
        "config-admin-name": "आपले सदस्यनाव:",
        "config-admin-password": "परवलीचा शब्द:",
        "config-admin-password-confirm": "परवलीचा शब्द पुन्हा टाका:",
        "config-install-tables-failed": "<strong>त्रुटी:</strong>खालील त्रुटीमुळे सारणी बनविणे अयशस्वी:$1",
        "config-help": "साहाय्य",
        "mainpagetext": "'''मीडियाविकीचे इन्स्टॉलेशन पूर्ण.'''",
-       "mainpagedocfooter": "विà¤\95à¥\80 à¤¸à¥\89फà¥\8dà¤\9fवà¥\87à¤\85र à¤µà¤¾à¤ªà¤°à¤£à¥\8dयाà¤\95रिता [//meta.wikimedia.org/wiki/Help:Contents à¤¯à¥\82à¤\9cर à¤\97ाà¤\88ड] à¤ªà¤¹à¤¾.\n\n== à¤¸à¥\81रà¥\81वात à¤\95रा ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings à¤°à¤\9aित à¤®à¤¾à¤\82डणà¥\8dयाà¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95ि FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-मिडियाविà¤\95िà¤\9aà¥\80 à¤®à¥\87लिà¤\82à¤\97 à¤¯à¤¾à¤¦à¥\80à¤\9aà¥\87 à¤µà¤¿à¤®à¥\8bà¤\9aनाà¤\9aà¥\80 à¤\89दà¥\8dà¤\98à¥\8bषणाannounce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources à¤\86पलà¥\8dया à¤­à¤¾à¤·à¥\87साठà¥\80 à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95िà¤\9aà¥\87 à¤¸à¥\8dथानिà¤\95िà¤\95रण à¤\95रा]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam à¤\86पलà¥\8dया à¤µà¤¿à¤\95िवर à¤¸à¥\8dपà¥\85मशà¥\80 à¤¦à¥\8bन à¤¹à¤¾à¤¤ à¤\95शे करावे ते शिका]"
+       "mainpagedocfooter": "विà¤\95à¥\80 à¤¸à¥\89फà¥\8dà¤\9fवà¥\87à¤\85र à¤µà¤¾à¤ªà¤°à¤£à¥\8dयाà¤\95रिता [//meta.wikimedia.org/wiki/Help:Contents à¤µà¤¾à¤ªà¤°à¤\95रà¥\8dता à¤®à¤¾à¤°à¥\8dà¤\97दरà¥\8dशिà¤\95ा] à¤ªà¤¹à¤¾.\n\n== à¤¸à¥\81रà¥\81वात à¤\95रा ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings à¤°à¤\9aित à¤®à¤¾à¤\82डणà¥\8dयाà¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95ि FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-मिडियाविà¤\95िà¤\9aà¥\80 à¤®à¥\87लिà¤\82à¤\97 à¤¯à¤¾à¤¦à¥\80à¤\9aà¥\87 à¤µà¤¿à¤®à¥\8bà¤\9aनाà¤\9aà¥\80 à¤\89दà¥\8dà¤\98à¥\8bषणा]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources à¤\86पलà¥\8dया à¤­à¤¾à¤·à¥\87साठà¥\80 à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95िà¤\9aà¥\87 à¤¸à¥\8dथानिà¤\95िà¤\95रण à¤\95रा]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam à¤\86पलà¥\8dया à¤µà¤¿à¤\95िवर à¤¸à¥\8dपà¥\85मशà¥\80 à¤¦à¥\8bन à¤¹à¤¾à¤¤ à¤\95से करावे ते शिका]"
 }
index 6b1a1e3..ae35e30 100644 (file)
@@ -29,7 +29,7 @@
  *   - a) Recursive jobs to purge caches for backlink pages for a given title.
  *        These jobs have (recursive:true,table:<table>) set.
  *   - b) Jobs to purge caches for a set of titles (the job title is ignored).
- *           These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ *        These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
  *
  * @ingroup JobQueue
  */
@@ -40,6 +40,23 @@ class HTMLCacheUpdateJob extends Job {
                $this->removeDuplicates = ( !isset( $params['range'] ) && !isset( $params['pages'] ) );
        }
 
+       /**
+        * @param Title $title Title to purge backlink pages from
+        * @param string $table Backlink table name
+        * @return HTMLCacheUpdateJob
+        */
+       public static function newForBacklinks( Title $title, $table ) {
+               return new self(
+                       $title,
+                       array(
+                               'table' => $table,
+                               'recursive' => true
+                       ) + Job::newRootJobParams( // "overall" refresh links job info
+                               "htmlCacheUpdate:{$table}:{$title->getPrefixedText()}"
+                       )
+               );
+       }
+
        function run() {
                global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery;
 
@@ -77,7 +94,7 @@ class HTMLCacheUpdateJob extends Job {
         * @param array $pages Map of (page ID => (namespace, DB key)) entries
         */
        protected function invalidateTitles( array $pages ) {
-               global $wgUpdateRowsPerQuery, $wgUseFileCache, $wgUseSquid;
+               global $wgUpdateRowsPerQuery, $wgUseFileCache;
 
                // Get all page IDs in this query into an array
                $pageIds = array_keys( $pages );
@@ -123,10 +140,8 @@ class HTMLCacheUpdateJob extends Job {
                ) );
 
                // Update squid
-               if ( $wgUseSquid ) {
-                       $u = SquidUpdate::newFromTitles( $titleArray );
-                       $u->doUpdate();
-               }
+               $u = SquidUpdate::newFromTitles( $titleArray );
+               $u->doUpdate();
 
                // Update file cache
                if ( $wgUseFileCache ) {
index fa3278d..183c1ee 100644 (file)
  * @ingroup JobQueue
  */
 class RefreshLinksJob extends Job {
+       /** @var float Cache parser output when it takes this long to render */
        const PARSE_THRESHOLD_SEC = 1.0;
-
+       /** @var integer Lag safety margin when comparing root job times to last-refresh times */
        const CLOCK_FUDGE = 10;
 
        function __construct( Title $title, array $params ) {
                parent::__construct( 'refreshLinks', $title, $params );
-               // Base backlink update jobs and per-title update jobs can be de-duplicated.
-               // If template A changes twice before any jobs run, a clean queue will have:
-               //              (A base, A base)
-               // The second job is ignored by the queue on insertion.
-               // Suppose, many pages use template A, and that template itself uses template B.
-               // An edit to both will first create two base jobs. A clean FIFO queue will have:
-               //              (A base, B base)
-               // When these jobs run, the queue will have per-title and remnant partition jobs:
-               //              (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
-               // Some these jobs will be the same, and will automatically be ignored by
-               // the queue upon insertion. Some title jobs will run before the duplicate is
-               // inserted, so the work will still be done twice in those cases. More titles
-               // can be de-duplicated as the remnant jobs continue to be broken down. This
-               // works best when $wgUpdateRowsPerJob, and either the pages have few backlinks
-               // and/or the backlink sets for pages A and B are almost identical.
-               $this->removeDuplicates = !isset( $params['range'] )
-                       && ( !isset( $params['pages'] ) || count( $params['pages'] ) == 1 );
+               // Avoid the overhead of de-duplication when it would be pointless
+               $this->removeDuplicates = (
+                       // Master positions won't match
+                       !isset( $params['masterPos'] ) &&
+                       // Ranges rarely will line up
+                       !isset( $params['range'] ) &&
+                       // Multiple pages per job make matches unlikely
+                       !( isset( $params['pages'] ) && count( $params['pages'] ) != 1 )
+               );
        }
 
        /**
@@ -229,30 +222,6 @@ class RefreshLinksJob extends Job {
                        $parserOutput
                );
 
-               foreach ( $updates as $key => $update ) {
-                       // FIXME: move category change RC stuff to a separate update.
-                       // RC entry addition aborts if edits where since made, which is not necessary.
-                       // It's also an SoC violation for links update code to care about RC.
-                       if ( $update instanceof LinksUpdate ) {
-                               if ( !empty( $this->params['triggeredRecursive'] ) ) {
-                                       $update->setTriggeredRecursive();
-                               }
-                               if ( !empty( $this->params['triggeringUser'] ) ) {
-                                       $userInfo = $this->params['triggeringUser'];
-                                       if ( $userInfo['userId'] ) {
-                                               $user = User::newFromId( $userInfo['userId'] );
-                                       } else {
-                                               // Anonymous, use the username
-                                               $user = User::newFromName( $userInfo['userName'], false );
-                                       }
-                                       $update->setTriggeringUser( $user );
-                               }
-                               if ( !empty( $this->params['triggeringRevisionId'] ) ) {
-                                       $update->setRevision( $revision );
-                               }
-                       }
-               }
-
                $latestNow = $page->lockAndGetLatest();
                if ( !$latestNow || $revision->getId() != $latestNow ) {
                        // Do not clobber over newer updates with older ones. If all jobs where FIFO and
@@ -273,8 +242,6 @@ class RefreshLinksJob extends Job {
        public function getDeduplicationInfo() {
                $info = parent::getDeduplicationInfo();
                if ( is_array( $info['params'] ) ) {
-                       // Don't let highly unique "masterPos" values ruin duplicate detection
-                       unset( $info['params']['masterPos'] );
                        // For per-pages jobs, the job title is that of the template that changed
                        // (or similar), so remove that since it ruins duplicate detection
                        if ( isset( $info['pages'] ) ) {
index c8e5df6..1770ac7 100644 (file)
 /**
  * Class with Backlink related Job helper methods
  *
+ * When an asset changes, a base job can be inserted to update all assets that depend on it.
+ * The base job splits into per-title "leaf" jobs and a "remnant" job to handle the remaining
+ * range of backlinks. This recurs until the remnant job's backlink range is small enough that
+ * only leaf jobs are created from it.
+ *
+ * For example, if templates A and B are edited (at the same time) the queue will have:
+ *     (A base, B base)
+ * When these jobs run, the queue will have per-title and remnant partition jobs:
+ *        (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
+ *
+ * This works best when the queue is FIFO, for several reasons:
+ *   - a) Since the remnant jobs are enqueued after the leaf jobs, the slower leaf jobs have to
+ *        get popped prior to the fast remnant jobs. This avoids flooding the queue with leaf jobs
+ *        for every single backlink of widely used assets (which can be millions).
+ *   - b) Other jobs going in the queue still get a chance to run after a widely used asset changes.
+ *        This is due to the large remnant job pushing to the end of the queue with each division.
+ *
+ * The size of the queues used in this manner depend on the number of assets changes and the
+ * number of workers. Also, with FIFO-per-partition queues, the queue size can be somewhat larger,
+ * depending on the number of queue partitions.
+ *
  * @ingroup JobQueue
  * @since 1.23
  */
@@ -71,6 +92,7 @@ class BacklinkJobUtils {
 
                if ( isset( $params['pages'] ) || empty( $params['recursive'] ) ) {
                        $ranges = array(); // sanity; this is a leaf node
+                       $realBSize = 0;
                        wfWarn( __METHOD__ . " called on {$job->getType()} leaf job (explosive recursion)." );
                } elseif ( isset( $params['range'] ) ) {
                        // This is a range job to trigger the insertion of partitioned/title jobs...
@@ -88,8 +110,10 @@ class BacklinkJobUtils {
                // Combine the first range (of size $bSize) backlinks into leaf jobs
                if ( isset( $ranges[0] ) ) {
                        list( $start, $end ) = $ranges[0];
-                       $titles = $title->getBacklinkCache()->getLinks( $params['table'], $start, $end );
-                       foreach ( array_chunk( iterator_to_array( $titles ), $cSize ) as $titleBatch ) {
+                       $iter = $title->getBacklinkCache()->getLinks( $params['table'], $start, $end );
+                       $titles = iterator_to_array( $iter );
+                       /** @var Title[] $titleBatch */
+                       foreach ( array_chunk( $titles, $cSize ) as $titleBatch ) {
                                $pages = array();
                                foreach ( $titleBatch as $tl ) {
                                        $pages[$tl->getArticleId()] = array( $tl->getNamespace(), $tl->getDBKey() );
index 3c2dd40..35de084 100644 (file)
@@ -181,7 +181,7 @@ class StatusValue {
        /**
         * Merge another status object into this one
         *
-        * @param Status $other Other Status object
+        * @param StatusValue $other Other StatusValue object
         * @param bool $overwriteValue Whether to override the "value" member
         */
        public function merge( $other, $overwriteValue = false ) {
index 4005abb..8bdafcf 100644 (file)
@@ -251,6 +251,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
                // Fetch all of the raw values
                $wrappedValues = $this->cache->getMulti( array_merge( $valueKeys, $checkKeysFlat ) );
+               // Time used to compare/init "check" keys (derived after getMulti() to be pessimistic)
                $now = microtime( true );
 
                // Collect timestamps from all "check" keys
@@ -282,7 +283,10 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                                foreach ( $purgeValues as $purge ) {
                                        $safeTimestamp = $purge[self::FLD_TIME] + $purge[self::FLD_HOLDOFF];
                                        if ( $safeTimestamp >= $wrappedValues[$vKey][self::FLD_TIME] ) {
-                                               $curTTL = min( $curTTL, $purge[self::FLD_TIME] - $now );
+                                               // How long ago this value was expired by *this* check key
+                                               $ago = min( $purge[self::FLD_TIME] - $now, self::TINY_NEGATIVE );
+                                               // How long ago this value was expired by *any* known check key
+                                               $curTTL = min( $curTTL, $ago );
                                        }
                                }
                        }
@@ -1087,7 +1091,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * @param int $holdoff In seconds
         * @return string Wrapped purge value
         */
-       protected static function makePurgeValue( $timestamp, $holdoff ) {
+       protected function makePurgeValue( $timestamp, $holdoff ) {
                return self::PURGE_VAL_PREFIX . (float)$timestamp . ':' . (int)$holdoff;
        }
 }
index 5a6511c..4fbb845 100644 (file)
@@ -881,7 +881,8 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
                        $this->mRedirectTarget = Title::makeTitle(
                                $row->rd_namespace, $row->rd_title,
-                               $row->rd_fragment, $row->rd_interwiki );
+                               $row->rd_fragment, $row->rd_interwiki
+                       );
                        return $this->mRedirectTarget;
                }
 
@@ -891,39 +892,54 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * Insert an entry for this page into the redirect table.
+        * Insert an entry for this page into the redirect table if the content is a redirect
+        *
+        * The database update will be deferred via DeferredUpdates
         *
         * Don't call this function directly unless you know what you're doing.
         * @return Title|null Title object or null if not a redirect
         */
        public function insertRedirect() {
-               // recurse through to only get the final target
                $content = $this->getContent();
                $retval = $content ? $content->getUltimateRedirectTarget() : null;
                if ( !$retval ) {
                        return null;
                }
-               $this->insertRedirectEntry( $retval );
+
+               // Update the DB post-send if the page has not cached since now
+               $that = $this;
+               $latest = $this->getLatest();
+               DeferredUpdates::addCallableUpdate( function() use ( $that, $retval, $latest ) {
+                       $that->insertRedirectEntry( $retval, $latest );
+               } );
+
                return $retval;
        }
 
        /**
-        * Insert or update the redirect table entry for this page to indicate
-        * it redirects to $rt .
+        * Insert or update the redirect table entry for this page to indicate it redirects to $rt
         * @param Title $rt Redirect target
+        * @param int|null $oldLatest Prior page_latest for check and set
         */
-       public function insertRedirectEntry( $rt ) {
+       public function insertRedirectEntry( Title $rt, $oldLatest = null ) {
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->replace( 'redirect', array( 'rd_from' ),
-                       array(
-                               'rd_from' => $this->getId(),
-                               'rd_namespace' => $rt->getNamespace(),
-                               'rd_title' => $rt->getDBkey(),
-                               'rd_fragment' => $rt->getFragment(),
-                               'rd_interwiki' => $rt->getInterwiki(),
-                       ),
-                       __METHOD__
-               );
+               $dbw->startAtomic( __METHOD__ );
+
+               if ( !$oldLatest || $oldLatest == $this->lockAndGetLatest() ) {
+                       $dbw->replace( 'redirect',
+                               array( 'rd_from' ),
+                               array(
+                                       'rd_from' => $this->getId(),
+                                       'rd_namespace' => $rt->getNamespace(),
+                                       'rd_title' => $rt->getDBkey(),
+                                       'rd_fragment' => $rt->getFragment(),
+                                       'rd_interwiki' => $rt->getInterwiki(),
+                               ),
+                               __METHOD__
+                       );
+               }
+
+               $dbw->endAtomic( __METHOD__ );
        }
 
        /**
@@ -1027,55 +1043,6 @@ class WikiPage implements Page, IDBAccessObject {
                return new UserArrayFromResult( $res );
        }
 
-       /**
-        * Get the last N authors
-        * @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 ) {
-               // First try the slave
-               // If that doesn't have the latest revision, try the master
-               $continue = 2;
-               $db = wfGetDB( DB_SLAVE );
-
-               do {
-                       $res = $db->select( array( 'page', 'revision' ),
-                               array( 'rev_id', 'rev_user_text' ),
-                               array(
-                                       'page_namespace' => $this->mTitle->getNamespace(),
-                                       'page_title' => $this->mTitle->getDBkey(),
-                                       'rev_page = page_id'
-                               ), __METHOD__,
-                               array(
-                                       'ORDER BY' => 'rev_timestamp DESC',
-                                       'LIMIT' => $num
-                               )
-                       );
-
-                       if ( !$res ) {
-                               return array();
-                       }
-
-                       $row = $db->fetchObject( $res );
-
-                       if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
-                               $db = wfGetDB( DB_MASTER );
-                               $continue--;
-                       } else {
-                               $continue = 0;
-                       }
-               } while ( $continue );
-
-               $authors = array( $row->rev_user_text );
-
-               foreach ( $res as $row ) {
-                       $authors[] = $row->rev_user_text;
-               }
-
-               return $authors;
-       }
-
        /**
         * Should the parser cache be used?
         *
@@ -1160,16 +1127,16 @@ class WikiPage implements Page, IDBAccessObject {
 
                $title = $this->mTitle;
                wfGetDB( DB_MASTER )->onTransactionIdle( function() use ( $title ) {
-                       global $wgUseSquid;
                        // Invalidate the cache in auto-commit mode
                        $title->invalidateCache();
-                       if ( $wgUseSquid ) {
-                               // Send purge now that page_touched update was committed above
-                               $update = new SquidUpdate( $title->getSquidURLs() );
-                               $update->doUpdate();
-                       }
                } );
 
+               // Send purge after above page_touched update was committed
+               DeferredUpdates::addUpdate(
+                       new SquidUpdate( $title->getSquidURLs() ),
+                       DeferredUpdates::PRESEND
+               );
+
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        // @todo move this logic to MessageCache
                        if ( $this->exists() ) {
index 42091a0..d25d11a 100644 (file)
@@ -46,7 +46,7 @@ class CoreParserFunctions {
                        'numberofarticles', 'numberoffiles', 'numberofadmins',
                        'numberingroup', 'numberofedits', 'language',
                        'padleft', 'padright', 'anchorencode', 'defaultsort', 'filepath',
-                       'pagesincategory', 'pagesize', 'protectionlevel',
+                       'pagesincategory', 'pagesize', 'protectionlevel', 'protectionexpiry',
                        'namespacee', 'namespacenumber', 'talkspace', 'talkspacee',
                        'subjectspace', 'subjectspacee', 'pagename', 'pagenamee',
                        'fullpagename', 'fullpagenamee', 'rootpagename', 'rootpagenamee',
@@ -772,8 +772,8 @@ class CoreParserFunctions {
        /**
         * Returns the requested protection level for the current page. This
         * is an expensive parser function and can't be called too many times
-        * per page, unless the protection levels for the given title have
-        * already been retrieved
+        * per page, unless the protection levels/expiries for the given title
+        * have already been retrieved
         *
         * @param Parser $parser
         * @param string $type
@@ -795,6 +795,35 @@ class CoreParserFunctions {
                return '';
        }
 
+       /**
+        * Returns the requested protection expiry for the current page. This
+        * is an expensive parser function and can't be called too many times
+        * per page, unless the protection levels/expiries for the given title
+        * have already been retrieved
+        *
+        * @param Parser $parser
+        * @param string $type
+        * @param string $title
+        *
+        * @return string
+        */
+       public static function protectionexpiry( $parser, $type = '', $title = '' ) {
+               $titleObject = Title::newFromText( $title );
+               if ( !( $titleObject instanceof Title ) ) {
+                       $titleObject = $parser->mTitle;
+               }
+               if ( $titleObject->areRestrictionsLoaded() || $parser->incrementExpensiveFunctionCount() ) {
+                       $expiry = $parser->mTitle->getRestrictionExpiry( strtolower( $type ) );
+                       // getRestrictionExpiry() returns false on invalid type; trying to
+                       // match protectionlevel() function that returns empty string instead
+                       if ( $expiry === false ) {
+                               $expiry = '';
+                       }
+                       return $expiry;
+               }
+               return '';
+       }
+
        /**
         * Gives language names.
         * @param Parser $parser
index eb4a958..b1098f5 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use \Cdb\Reader as CdbReader;
+
 /**
  * Functions to check passwords against a policy requirement
  * @since 1.26
@@ -112,4 +114,50 @@ class PasswordPolicyChecks {
                return $status;
        }
 
+       /**
+        * Ensure that password isn't in top X most popular passwords
+        *
+        * @param $policyVal int Cut off to use. Will automatically shrink to the max
+        *   supported for error messages if set to more than max number of passwords on file,
+        *   so you can use the PHP_INT_MAX constant here safely.
+        * @param $user User
+        * @param $password String
+        * @since 1.27
+        * @return Status
+        */
+       public static function checkPopularPasswordBlacklist( $policyVal, User $user, $password ) {
+               global $wgPopularPasswordFile, $wgSitename;
+               $status = Status::newGood();
+               if ( $policyVal > 0 ) {
+                       $langEn = Language::factory( 'en' );
+                       $passwordKey = $langEn->lc( trim( $password ) );
+
+                       // People often use the name of the current site, which won't be
+                       // in the common password file. Also check '' for people who use
+                       // just whitespace.
+                       $sitename = $langEn->lc( trim( $wgSitename ) );
+                       $hardcodedCommonPasswords = array( '', 'wiki', 'mediawiki', $sitename );
+                       if ( in_array( $passwordKey, $hardcodedCommonPasswords ) ) {
+                               $status->error( 'passwordtoopopular' );
+                               return $status;
+                       }
+
+                       // This could throw an exception, but there's not a good way
+                       // of failing gracefully, if say the file is missing, so just
+                       // let the exception fall through.
+                       // Format of cdb file is mapping password => popularity rank.
+                       // See maintenance/createCommonPasswordCdb.php
+                       $db = CdbReader::open( $wgPopularPasswordFile );
+
+                       $res = $db->get( $passwordKey );
+                       if ( $res && (int)$res <= $policyVal ) {
+                               // Note: If you want to find the true number of common
+                               // passwords stored (for reporting the error), you have to take
+                               // the max of the policyVal and $db->get( '_TOTALENTRIES' ).
+                               $status->error( 'passwordtoopopular' );
+                       }
+               }
+               return $status;
+       }
+
 }
index 2295eaa..e5f32d2 100644 (file)
@@ -108,16 +108,18 @@ class RevDelFileList extends RevDelList {
                $file = wfLocalFile( $this->title );
                $file->purgeCache();
                $file->purgeDescription();
+
+               // Purge full images from cache
                $purgeUrls = array();
                foreach ( $this->ids as $timestamp ) {
                        $archiveName = $timestamp . '!' . $this->title->getDBkey();
                        $file->purgeOldThumbnails( $archiveName );
                        $purgeUrls[] = $file->getArchiveUrl( $archiveName );
                }
-               if ( $this->getConfig()->get( 'UseSquid' ) ) {
-                       // purge full images from cache
-                       SquidUpdate::purge( $purgeUrls );
-               }
+               DeferredUpdates::addUpdate(
+                       new SquidUpdate( $purgeUrls ),
+                       DeferredUpdates::PRESEND
+               );
 
                return Status::newGood();
        }
diff --git a/includes/search/SearchExactMatchRescorer.php b/includes/search/SearchExactMatchRescorer.php
new file mode 100644 (file)
index 0000000..0ff628d
--- /dev/null
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Rescores results from a prefix search/opensearch to make sure the
+ * exact match is the first result.
+ *
+ * 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
+ */
+
+/**
+ * An utility class to rescore search results by looking for an exact match
+ * in the db and add the page found to the first position.
+ *
+ * NOTE: extracted from TitlePrefixSearch
+ * @ingroup Search
+ */
+class SearchExactMatchRescorer {
+       /**
+        * Default search backend does proper prefix searching, but custom backends
+        * may sort based on other algorithms that may cause the exact title match
+        * to not be in the results or be lower down the list.
+        * @param string $search the query
+        * @param int[] $namespaces the namespaces
+        * @param int $limit the max number of results to return
+        * @param string[] $srchres results
+        * @return string[] munged results
+        */
+       public function rescore( $search, $namespaces, $srchres, $limit ) {
+               // Pick namespace (based on PrefixSearch::defaultSearchBackend)
+               $ns = in_array( NS_MAIN, $namespaces ) ? NS_MAIN : $namespaces[0];
+               $t = Title::newFromText( $search, $ns );
+               if ( !$t || !$t->exists() ) {
+                       // No exact match so just return the search results
+                       return $srchres;
+               }
+               $string = $t->getPrefixedText();
+               $key = array_search( $string, $srchres );
+               if ( $key !== false ) {
+                       // Exact match was in the results so just move it to the front
+                       return $this->pullFront( $key, $srchres );
+               }
+               // Exact match not in the search results so check for some redirect handling cases
+               if ( $t->isRedirect() ) {
+                       $target = $this->getRedirectTarget( $t );
+                       $key = array_search( $target, $srchres );
+                       if ( $key !== false ) {
+                               // Exact match is a redirect to one of the returned matches so pull the
+                               // returned match to the front.  This might look odd but the alternative
+                               // is to put the redirect in front and drop the match.  The name of the
+                               // found match is often more descriptive/better formed than the name of
+                               // the redirect AND by definition they share a prefix.  Hopefully this
+                               // choice is less confusing and more helpful.  But it might not be.  But
+                               // it is the choice we're going with for now.
+                               return $this->pullFront( $key, $srchres );
+                       }
+                       $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres );
+                       if ( isset( $redirectTargetsToRedirect[$target] ) ) {
+                               // The exact match and something in the results list are both redirects
+                               // to the same thing!  In this case we'll pull the returned match to the
+                               // top following the same logic above.  Again, it might not be a perfect
+                               // choice but it'll do.
+                               return $this->pullFront( $redirectTargetsToRedirect[$target], $srchres );
+                       }
+               } else {
+                       $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres );
+                       if ( isset( $redirectTargetsToRedirect[$string] ) ) {
+                               // The exact match is the target of a redirect already in the results list so remove
+                               // the redirect from the results list and push the exact match to the front
+                               array_splice( $srchres, $redirectTargetsToRedirect[$string], 1 );
+                               array_unshift( $srchres, $string );
+                               return $srchres;
+                       }
+               }
+
+               // Exact match is totally unique from the other results so just add it to the front
+               array_unshift( $srchres, $string );
+               // And roll one off the end if the results are too long
+               if ( count( $srchres ) > $limit ) {
+                       array_pop( $srchres );
+               }
+               return $srchres;
+       }
+
+       /**
+        * @param string[] $titles as strings
+        * @return array redirect target prefixedText to index of title in titles
+        *   that is a redirect to it.
+        */
+       private function redirectTargetsToRedirect( $titles ) {
+               $result = array();
+               foreach ( $titles as $key => $titleText ) {
+                       $title = Title::newFromText( $titleText );
+                       if ( !$title || !$title->isRedirect() ) {
+                               continue;
+                       }
+                       $target = $this->getRedirectTarget( $title );
+                       if ( !$target ) {
+                               continue;
+                       }
+                       $result[$target] = $key;
+               }
+               return $result;
+       }
+
+       /**
+        * Returns an array where the element of $array at index $key becomes
+        * the first element.
+        * @param int $key key to pull to the front
+        * @return array $array with the item at $key pulled to the front
+        */
+       private function pullFront( $key, $array ) {
+               $cut = array_splice( $array, $key, 1 );
+               array_unshift( $array, $cut[0] );
+               return $array;
+       }
+
+       /**
+        * Get a redirect's destination from a title
+        * @param Title $title A title to redirect. It may not redirect or even exist
+        * @return null|string If title exists and redirects, get the destination's prefixed name
+        */
+       private function getRedirectTarget( $title ) {
+               $page = WikiPage::factory( $title );
+               if ( !$page->exists() ) {
+                       return null;
+               }
+               $redir = $page->getRedirectTarget();
+               return $redir ? $redir->getPrefixedText() : null;
+       }
+}
index 047e941..e51b6c0 100644 (file)
@@ -212,10 +212,20 @@ class ActiveUsersPager extends UsersPager {
                $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n";
                $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
 
-               # Username field
-               $out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
-                       'username', 'offset', 20, $this->requestedUser,
-                       array( 'class' => 'mw-ui-input-inline', 'tabindex' => 1 ) ) . '<br />';
+               # Username field (with autocompletion support)
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
+               $out .= Xml::inputLabel(
+                       $this->msg( 'activeusers-from' )->text(),
+                       'username',
+                       'offset',
+                       20,
+                       $this->requestedUser,
+                       array(
+                               'class' => 'mw-ui-input-inline mw-autocomplete-user',
+                               'tabindex' => 1,
+                               'autofocus' => $this->requestedUser === '',
+                       )
+               ) . '<br />';
 
                $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
                        'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), array( 'tabindex' => 2 ) );
index 5f7c587..b1908c2 100644 (file)
@@ -465,7 +465,8 @@ class SpecialContributions extends IncludableSpecialPage {
                        'month',
                        'topOnly',
                        'newOnly',
-                       'associated'
+                       'associated',
+                       'tagfilter'
                );
 
                foreach ( $this->opts as $name => $value ) {
@@ -481,7 +482,7 @@ class SpecialContributions extends IncludableSpecialPage {
                        $filterSelection = Html::rawElement(
                                'td',
                                array(),
-                               array_shift( $tagFilter ) . implode( '&#160', $tagFilter )
+                               implode( '&#160', $tagFilter )
                        );
                } else {
                        $filterSelection = Html::rawElement( 'td', array( 'colspan' => 2 ), '' );
index 6b0d1ec..3b31530 100644 (file)
@@ -260,6 +260,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * @return string Form asking for user name.
         */
        protected function userForm( $name ) {
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
                $string = Xml::openElement(
                        'form',
                        array( 'method' => 'get', 'action' => wfScript(), 'id' => 'askusername' )
@@ -272,7 +273,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                                'target',
                                'emailusertarget',
                                30,
-                               $name
+                               $name,
+                               array(
+                                       'class' => 'mw-autocomplete-user',  // used by mediawiki.userSuggest
+                                       'autofocus' => true,
+                               )
                        ) .
                        ' ' .
                        Xml::submitButton( $this->msg( 'emailusernamesubmit' )->text() ) .
index 6859310..0119781 100644 (file)
@@ -228,7 +228,7 @@ class SpecialProtectedpages extends SpecialPage {
                }
 
                return '<span class="mw-input-with-label">' .
-                       Xml::label( $this->msg( 'restriction-type' )->text(), $this->IdType ) . '&#160;' .
+                       Xml::label( $this->msg( 'restriction-type' )->text(), $this->IdType ) . ' ' .
                        Xml::tags( 'select',
                                array( 'id' => $this->IdType, 'name' => $this->IdType ),
                                implode( "\n", $options ) ) . "</span>";
index e06bae0..a989aac 100644 (file)
@@ -114,16 +114,18 @@ class SpecialStatistics extends SpecialPage {
         * @return string
         */
        private function getPageStats() {
+               $specialAllPagesTitle = SpecialPage::getTitleFor( 'Allpages' );
                $pageStatsHtml = Xml::openElement( 'tr' ) .
                        Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-header-pages' )
                                ->parse() ) .
                        Xml::closeElement( 'tr' ) .
-                               $this->formatRow( Linker::linkKnown( SpecialPage::getTitleFor( 'Allpages' ),
-                                       $this->msg( 'statistics-articles' )->parse() ),
+                               $this->formatRow( Linker::linkKnown( $specialAllPagesTitle,
+                                       $this->msg( 'statistics-articles' )->parse(), array(), array( 'hideredirects' => 1 ) ),
                                        $this->getLanguage()->formatNum( $this->good ),
                                        array( 'class' => 'mw-statistics-articles' ),
                                        'statistics-articles-desc' ) .
-                               $this->formatRow( $this->msg( 'statistics-pages' )->parse(),
+                               $this->formatRow( Linker::linkKnown( $specialAllPagesTitle,
+                                       $this->msg( 'statistics-pages' )->parse() ),
                                        $this->getLanguage()->formatNum( $this->total ),
                                        array( 'class' => 'mw-statistics-pages' ),
                                        'statistics-pages-desc' );
index 71f387b..97f2380 100644 (file)
@@ -451,6 +451,20 @@ class SpecialTags extends SpecialPage {
                }
        }
 
+       /**
+        * Return an array of subpages that this special page will accept.
+        *
+        * @return string[] subpages
+        */
+       public function getSubpagesForPrefixSearch() {
+               return array(
+                       'delete',
+                       'activate',
+                       'deactivate',
+                       'create',
+               );
+       }
+
        protected function getGroupName() {
                return 'changes';
        }
index 32d4552..b5e614d 100644 (file)
@@ -403,8 +403,15 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         */
        public function doHeader( $opts, $numRows ) {
                $user = $this->getUser();
+               $out = $this->getOutput();
 
-               $this->getOutput()->addSubtitle(
+               // if the user wishes, that the watchlist is reloaded, whenever a filter changes,
+               // add the module for that
+               if ( $user->getBoolOption( 'watchlistreloadautomatically' ) ) {
+                       $out->addModules( array( 'mediawiki.special.watchlist' ) );
+               }
+
+               $out->addSubtitle(
                        $this->msg( 'watchlistfor2', $user->getName() )
                                ->rawParams( SpecialEditWatchlist::buildTools( null ) )
                );
@@ -469,7 +476,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $form .= $this->msg( 'watchlist-hide' ) .
                        $this->msg( 'colon-separator' )->escaped() .
                        implode( ' ', $links );
-               $form .= "\n<hr />\n<p>";
+               $form .= "\n<br />\n";
                $form .= Html::namespaceSelector(
                        array(
                                'selected' => $opts['namespace'],
@@ -495,7 +502,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $opts['associated'],
                        array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
                ) . "</span>\n";
-               $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "</p>\n";
+               $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n";
                foreach ( $hiddenFields as $key => $value ) {
                        $form .= Html::hidden( $key, $value ) . "\n";
                }
@@ -516,13 +523,13 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $userWatchlistOption = (string)$this->getUser()->getOption( 'watchlistdays' );
                // add the user preference, if it isn't available already
-               if ( !in_array( $userWatchlistOption, $days ) ) {
+               if ( !in_array( $userWatchlistOption, $days ) && $userWatchlistOption !== '0' ) {
                        $days[] = $userWatchlistOption;
                }
 
                $selected = (string)$options['days'];
                // add the currently selected value, if it isn't available already
-               if ( !in_array( $selected, $days ) ) {
+               if ( !in_array( $selected, $days ) && $selected !== '0' ) {
                        $days[] = $selected;
                }
 
@@ -540,7 +547,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                // 'all' option
                $name = $this->msg( 'watchlistall2' )->text();
-               $value = 0;
+               $value = '0';
                $select->addOption( $name, $value );
 
                return $select->getHTML() . "\n<br />\n";
index 10e4334..e2de900 100644 (file)
@@ -37,6 +37,7 @@ class UIDGenerator {
 
        protected $lockFile88; // string; local file path
        protected $lockFile128; // string; local file path
+       protected $lockFileUUID; // string; local file path
 
        /** @var array */
        protected $fileHandles = array(); // cache file handles
@@ -79,6 +80,7 @@ class UIDGenerator {
                // This is dealt with by initializing the clock sequence number and counters randomly.
                $this->lockFile88 = wfTempDir() . '/mw-' . __CLASS__ . '-UID-88';
                $this->lockFile128 = wfTempDir() . '/mw-' . __CLASS__ . '-UID-128';
+               $this->lockFileUUID = wfTempDir() . '/mw-' . __CLASS__ . '-UUID-128';
        }
 
        /**
@@ -114,18 +116,25 @@ class UIDGenerator {
                Assert::parameter( $base >= 2, '$base', 'must be >= 2' );
 
                $gen = self::singleton();
-               $time = $gen->getTimestampAndDelay( 'lockFile88', 1, 1024 );
-
-               return Wikimedia\base_convert( $gen->getTimestampedID88( $time ), 2, $base );
+               $info = $gen->getTimeAndDelay( 'lockFile88', 1, 1024, 1024 );
+               $info['offsetCounter'] = $info['offsetCounter'] % 1024;
+               return Wikimedia\base_convert( $gen->getTimestampedID88( $info ), 2, $base );
        }
 
        /**
-        * @param array $info (UIDGenerator::millitime(), counter, clock sequence)
+        * @param array $info The result of UIDGenerator::getTimeAndDelay() or
+        *  a plain (UIDGenerator::millitime(), counter, clock sequence) array.
         * @return string 88 bits
         * @throws RuntimeException
         */
        protected function getTimestampedID88( array $info ) {
-               list( $time, $counter ) = $info;
+               if ( isset( $info['time'] ) ) {
+                       $time = $info['time'];
+                       $counter = $info['offsetCounter'];
+               } else {
+                       $time = $info[0];
+                       $counter = $info[1];
+               }
                // Take the 46 MSBs of "milliseconds since epoch"
                $id_bin = $this->millisecondsSinceEpochBinary( $time );
                // Add a 10 bit counter resulting in 56 bits total
@@ -160,19 +169,29 @@ class UIDGenerator {
                Assert::parameter( $base >= 2, '$base', 'must be >= 2' );
 
                $gen = self::singleton();
-               $time = $gen->getTimestampAndDelay( 'lockFile128', 16384, 1048576 );
+               $info = $gen->getTimeAndDelay( 'lockFile128', 16384, 1048576, 1048576 );
+               $info['offsetCounter'] = $info['offsetCounter'] % 1048576;
 
-               return Wikimedia\base_convert( $gen->getTimestampedID128( $time ), 2, $base );
+               return Wikimedia\base_convert( $gen->getTimestampedID128( $info ), 2, $base );
        }
 
        /**
-        * @param array $info (UIDGenerator::millitime(), counter, clock sequence)
+        * @param array $info The result of UIDGenerator::getTimeAndDelay() or
+        *  a plain (UIDGenerator::millitime(), counter, clock sequence) array.
         * @return string 128 bits
         * @throws RuntimeException
         */
        protected function getTimestampedID128( array $info ) {
-               list( $time, $counter, $clkSeq ) = $info;
-               // Take the 46 MSBs of "milliseconds since epoch"
+               if ( isset( $info['time'] ) ) {
+                       $time = $info['time'];
+                       $counter = $info['offsetCounter'];
+                       $clkSeq = $info['clkSeq'];
+               } else {
+                       $time = $info[0];
+                       $counter = $info[1];
+                       $clkSeq = $info[2];
+               }
+               // Take the 46 bits of "milliseconds since epoch"
                $id_bin = $this->millisecondsSinceEpochBinary( $time );
                // Add a 20 bit counter resulting in 66 bits total
                $id_bin .= str_pad( decbin( $counter ), 20, '0', STR_PAD_LEFT );
@@ -188,6 +207,74 @@ class UIDGenerator {
                return $id_bin;
        }
 
+       /**
+        * Return an RFC4122 compliant v1 UUID
+        *
+        * @return string
+        * @throws RuntimeException
+        * @since 1.27
+        */
+       public static function newUUIDv1() {
+               $gen = self::singleton();
+               // There can be up to 10000 intervals for the same millisecond timestamp.
+               // [0,4999] counter + [0,5000] offset is in [0,9999] for the offset counter.
+               // Add this onto the timestamp to allow making up to 5000 IDs per second.
+               return $gen->getUUIDv1( $gen->getTimeAndDelay( 'lockFileUUID', 16384, 5000, 5001 ) );
+       }
+
+       /**
+        * Return an RFC4122 compliant v1 UUID
+        *
+        * @return string 32 hex characters with no hyphens
+        * @throws RuntimeException
+        * @since 1.27
+        */
+       public static function newRawUUIDv1() {
+               return str_replace( '-', '', self::newUUIDv1() );
+       }
+
+       /**
+        * @param array $info Result of UIDGenerator::getTimeAndDelay()
+        * @return string 128 bits
+        */
+       protected function getUUIDv1( array $info ) {
+               $clkSeq_bin = Wikimedia\base_convert( $info['clkSeq'], 10, 2, 14 );
+               $time_bin = $this->intervalsSinceGregorianBinary( $info['time'], $info['offsetCounter'] );
+               // Take the 32 bits of "time low"
+               $id_bin = substr( $time_bin, 28, 32 );
+               // Add 16 bits of "time mid" resulting in 48 bits total
+               $id_bin .= substr( $time_bin, 12, 16 );
+               // Add 4 bit version resulting in 52 bits total
+               $id_bin .= '0001';
+               // Add 12 bits of "time high" resulting in 64 bits total
+               $id_bin .= substr( $time_bin, 0, 12 );
+               // Add 2 bits of "variant" resulting in 66 bits total
+               $id_bin .= '10';
+               // Add 6 bits of "clock seq high" resulting in 72 bits total
+               $id_bin .= substr( $clkSeq_bin, 0, 6 );
+               // Add 8 bits of "clock seq low" resulting in 80 bits total
+               $id_bin .= substr( $clkSeq_bin, 6, 8 );
+               // Add the 48 bit node ID resulting in 128 bits total
+               $id_bin .= $this->nodeId48;
+               // Convert to a 32 char hex string with dashes
+               if ( strlen( $id_bin ) !== 128 ) {
+                       throw new RuntimeException( "Detected overflow for millisecond timestamp." );
+               }
+               $hex = Wikimedia\base_convert( $id_bin, 2, 16, 32 );
+               return sprintf( '%s-%s-%s-%s-%s',
+                       // "time_low" (32 bits)
+                       substr( $hex, 0, 8 ),
+                       // "time_mid" (16 bits)
+                       substr( $hex, 8, 4 ),
+                       // "time_hi_and_version" (16 bits)
+                       substr( $hex, 12, 4 ),
+                       // "clk_seq_hi_res" (8 bits) and "clk_seq_low" (8 bits)
+                       substr( $hex, 16, 4 ),
+                       // "node" (48 bits)
+                       substr( $hex, 20, 12 )
+               );
+       }
+
        /**
         * Return an RFC4122 compliant v4 UUID
         *
@@ -207,7 +294,7 @@ class UIDGenerator {
                        substr( $hex, 8, 4 ),
                        // "time_hi_and_version" (16 bits)
                        '4' . substr( $hex, 12, 3 ),
-                       // "clk_seq_hi_res (8 bits, variant is binary 10x) and "clk_seq_low" (8 bits)
+                       // "clk_seq_hi_res" (8 bits, variant is binary 10x) and "clk_seq_low" (8 bits)
                        dechex( 0x8 | ( hexdec( $hex[15] ) & 0x3 ) ) . $hex[16] . substr( $hex, 17, 2 ),
                        // "node" (48 bits)
                        substr( $hex, 19, 12 )
@@ -342,17 +429,17 @@ class UIDGenerator {
         * @param string $lockFile Name of a local lock file
         * @param int $clockSeqSize The number of possible clock sequence values
         * @param int $counterSize The number of possible counter values
+        * @param int $offsetSize The number of possible offset values
         * @return array (result of UIDGenerator::millitime(), counter, clock sequence)
         * @throws RuntimeException
         */
-       protected function getTimestampAndDelay( $lockFile, $clockSeqSize, $counterSize ) {
+       protected function getTimeAndDelay( $lockFile, $clockSeqSize, $counterSize, $offsetSize ) {
                // Get the UID lock file handle
-               $path = $this->$lockFile;
-               if ( isset( $this->fileHandles[$path] ) ) {
-                       $handle = $this->fileHandles[$path];
+               if ( isset( $this->fileHandles[$lockFile] ) ) {
+                       $handle = $this->fileHandles[$lockFile];
                } else {
-                       $handle = fopen( $path, 'cb+' );
-                       $this->fileHandles[$path] = $handle ?: null; // cache
+                       $handle = fopen( $this->$lockFile, 'cb+' );
+                       $this->fileHandles[$lockFile] = $handle ?: null; // cache
                }
                // Acquire the UID lock file
                if ( $handle === false ) {
@@ -387,7 +474,7 @@ class UIDGenerator {
                } else { // last UID info not initialized
                        $clkSeq = mt_rand( 0, $clockSeqSize - 1 );
                        $counter = 0;
-                       $offset = mt_rand( 0, $counterSize - 1 );
+                       $offset = mt_rand( 0, $offsetSize - 1 );
                        $time = self::millitime();
                }
                // microtime() and gettimeofday() can drift from time() at least on Windows.
@@ -404,7 +491,7 @@ class UIDGenerator {
                        // Bump the clock sequence number and also randomize the counter offset,
                        // which is useful for UIDs that do not include the clock sequence number.
                        $clkSeq = ( $clkSeq + 1 ) % $clockSeqSize;
-                       $offset = mt_rand( 0, $counterSize - 1 );
+                       $offset = mt_rand( 0, $offsetSize - 1 );
                        trigger_error( "Clock was set back; sequence number incremented." );
                }
                // Update the (clock sequence number, timestamp, counter)
@@ -415,7 +502,13 @@ class UIDGenerator {
                // Release the UID lock file
                flock( $handle, LOCK_UN );
 
-               return array( $time, ( $counter + $offset ) % $counterSize, $clkSeq );
+               return array(
+                       'time'          => $time,
+                       'counter'       => $counter,
+                       'clkSeq'        => $clkSeq,
+                       'offset'        => $offset,
+                       'offsetCounter' => $counter + $offset
+               );
        }
 
        /**
@@ -452,6 +545,36 @@ class UIDGenerator {
                return substr( Wikimedia\base_convert( $ts, 10, 2, 46 ), -46 );
        }
 
+       /**
+        * @param array $time Result of UIDGenerator::millitime()
+        * @param integer $delta Number of intervals to add on to the timestamp
+        * @return string 60 bits of "100ns intervals since 15 October 1582" (rolls over in 3400)
+        * @throws RuntimeException
+        */
+       protected function intervalsSinceGregorianBinary( array $time, $delta = 0 ) {
+               list( $sec, $msec ) = $time;
+               $offset = '122192928000000000';
+               if ( PHP_INT_SIZE >= 8 ) { // 64 bit integers
+                       $ts = ( 1000 * $sec + $msec ) * 10000 + (int)$offset + $delta;
+                       $id_bin = str_pad( decbin( $ts % pow( 2, 60 ) ), 60, '0', STR_PAD_LEFT );
+               } elseif ( extension_loaded( 'gmp' ) ) {
+                       $ts = gmp_add( gmp_mul( (string) $sec, '1000' ), (string) $msec ); // ms
+                       $ts = gmp_add( gmp_mul( $ts, '10000' ), $offset ); // 100ns intervals
+                       $ts = gmp_add( $ts, (string) $delta );
+                       $ts = gmp_mod( $ts, gmp_pow( '2', '60' ) ); // wrap around
+                       $id_bin = str_pad( gmp_strval( $ts, 2 ), 60, '0', STR_PAD_LEFT );
+               } elseif ( extension_loaded( 'bcmath' ) ) {
+                       $ts = bcadd( bcmul( $sec, 1000 ), $msec ); // ms
+                       $ts = bcadd( bcmul( $ts, 10000 ), $offset ); // 100ns intervals
+                       $ts = bcadd( $ts, $delta );
+                       $ts = bcmod( $ts, bcpow( 2, 60 ) ); // wrap around
+                       $id_bin = Wikimedia\base_convert( $ts, 10, 2, 60 );
+               } else {
+                       throw new RuntimeException( 'bcmath or gmp extension required for 32 bit machines.' );
+               }
+               return $id_bin;
+       }
+
        /**
         * @return array (current time in seconds, milliseconds since then)
         */
index 96f80b5..b9e43cd 100644 (file)
        "contributions": "مساهمات {{GENDER:$1|المستخدم|المستخدمة}}",
        "contributions-title": "مساهمات {{GENDER:$1|المستخدم|المستخدمة}} $1",
        "mycontris": "مساهماتي",
+       "anoncontribs": "مساهمات",
        "contribsub2": "ل{{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "حساب المستخدم \"$1\" غير مسجل.",
        "nocontribs": "لم يتم العثور على تغييرات تطابق هذه المحددات.",
index 992633b..55acd0b 100644 (file)
@@ -50,6 +50,7 @@
        "tog-watchlisthidebots": "Хаваць праўкі робатаў у сьпісе назіраньня",
        "tog-watchlisthideminor": "Хаваць дробныя праўкі ў сьпісе назіраньня",
        "tog-watchlisthideliu": "Хаваць праўкі зарэгістраваных удзельнікаў у сьпісе назіраньня",
+       "tog-watchlistreloadautomatically": "Аўтаматычна перазагружаць сьпіс назіраньня пры зьмене фільтру (патрэбны JavaScript)",
        "tog-watchlisthideanons": "Хаваць праўкі ананімаў у сьпісе назіраньня",
        "tog-watchlisthidepatrolled": "Хаваць патруляваныя праўкі ў сьпісе назіраньня",
        "tog-watchlisthidecategorization": "Хаваць катэгарызацыю старонак",
        "wrongpasswordempty": "Быў уведзены пусты пароль. Калі ласка, паспрабуйце яшчэ раз.",
        "passwordtooshort": "Паролі павінны ўтрымліваць ня менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}.",
        "passwordtoolong": "Паролі ня могуць быць даўжэй за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}.",
+       "passwordtoopopular": "Нельга выкарыстоўваць простыя паролі. Калі ласка, абярыце больш складаны пароль.",
        "password-name-match": "Ваш пароль павінен адрозьнівацца ад Вашага імя ўдзельніка.",
        "password-login-forbidden": "Выкарыстаньне гэтага імя ўдзельніка і паролю было забароненае.",
        "mailmypassword": "Скінуць пароль",
index e12ecce..793797c 100644 (file)
        "copyrightpage": "{{ns:project}}:Авторски права",
        "currentevents": "Текущи събития",
        "currentevents-url": "Project:Текущи събития",
-       "disclaimers": "Ð\9fÑ\80едÑ\83пÑ\80еждение",
-       "disclaimerpage": "Project:Ð\9fÑ\80едÑ\83пÑ\80еждение",
+       "disclaimers": "УÑ\81ловиÑ\8f Ð½Ð° Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½е",
+       "disclaimerpage": "Project:УÑ\81ловиÑ\8f Ð½Ð° Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½е",
        "edithelp": "Помощ при редактиране",
        "helppage-top-gethelp": "Помощ",
        "mainpage": "Начална страница",
        "mainpage-description": "Начална страница",
        "policy-url": "Project:Политика",
-       "portal": "Ð\9fоÑ\80Ñ\82ал Ð·а общността",
+       "portal": "Ð\9fоÑ\80Ñ\82ал Ð½а общността",
        "portal-url": "Проект:Портал на общността",
        "privacy": "Защита на личните данни",
        "privacypage": "Проект:Защита на личните данни",
        "recentchangeslinked-summary": "Тук се показват последните промени на страниците, към които се препраща от дадена страница. При избиране на категория, се показват промените по страниците, влизащи в нея. ''Пример:'' Ако изберете страницата '''А''', която съдържа препратки към '''Б''' и '''В''', тогава ще можете да прегледате промените по '''Б''' и '''В'''.\n\nАко пък сложите отметка пред '''Обръщане на релацията''', ще можете да прегледате промените в обратна посока: ще се включат тези страници, които съдържат препратки към посочената страница.\n\nСтраниците от списъка ви за наблюдение се показват в '''получер'''.",
        "recentchangeslinked-page": "Име на страницата:",
        "recentchangeslinked-to": "Обръщане на релацията, така че да се показват промените на страниците, сочещи към избраната страница",
-       "upload": "Ð\9aаÑ\87ване",
+       "upload": "Ð\9aаÑ\87и Ñ\84айл",
        "uploadbtn": "Качване",
        "reuploaddesc": "Връщане към формуляра за качване.",
        "upload-tryagain": "Съхраняване на промененото описание на файла",
        "contributions": "{{GENDER:$1|Потребителски}} приноси",
        "contributions-title": "Потребителски приноси за $1",
        "mycontris": "Приноси",
+       "anoncontribs": "Приноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
        "nocontribs": "Не са намерени промени, отговарящи на критерия.",
        "tooltip-pt-preferences": "Вашите настройки",
        "tooltip-pt-watchlist": "Списък на страници, чиито промени сте избрали да наблюдавате",
        "tooltip-pt-mycontris": "Списък на вашите приноси",
-       "tooltip-pt-login": "Ð\9dаÑ\81Ñ\8aÑ\80Ñ\87аваме Ð²и да влезете, въпреки че не е задължително.",
+       "tooltip-pt-login": "Ð\9dаÑ\81Ñ\8aÑ\80Ñ\87аваме Ð\92и да влезете, въпреки че не е задължително.",
        "tooltip-pt-logout": "Излизане от {{SITENAME}}",
        "tooltip-pt-createaccount": "Насърчаваме Ви да си създадете сметка и да влезете, въпреки че не е задължително.",
        "tooltip-ca-talk": "Беседа относно страницата",
-       "tooltip-ca-edit": "Ð\9cожеÑ\82е Ð´Ð° Ñ\80едакÑ\82иÑ\80аÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а. Ð\98зползвайÑ\82е Ð±Ñ\83Ñ\82она Ð·Ð° Ð¿Ñ\80едваÑ\80иÑ\82елен Ð¿Ñ\80еглед Ð¿Ñ\80еди Ð´Ð° Ñ\81Ñ\8aÑ\85Ñ\80аниÑ\82е.",
+       "tooltip-ca-edit": "РедакÑ\82иÑ\80ане Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а",
        "tooltip-ca-addsection": "Започване на нов раздел",
        "tooltip-ca-viewsource": "Страницата е защитена. Можете да разгледате изходния й код.",
        "tooltip-ca-history": "Предишни версии на страницата",
        "tooltip-search": "Претърсване на {{SITENAME}}",
        "tooltip-search-go": "Отиване на страницата, ако тя съществува с точно това име",
        "tooltip-search-fulltext": "Търсене в страниците за този текст",
-       "tooltip-p-logo": "Ð\9dачалната страница",
+       "tooltip-p-logo": "Ð\9fоÑ\81еÑ\89аване Ð½Ð° Ð½ачалната страница",
        "tooltip-n-mainpage": "Началната страница",
        "tooltip-n-mainpage-description": "Посещаване на началната страница",
        "tooltip-n-portal": "Информация за проекта — какво, къде, как",
-       "tooltip-n-currentevents": "Информация за текущите събития по света",
-       "tooltip-n-recentchanges": "Списък на последните промени в {{SITENAME}}",
+       "tooltip-n-currentevents": "Информация за текущи събития",
+       "tooltip-n-recentchanges": "Списък на последните промени в уикито",
        "tooltip-n-randompage": "Зареждане на случайна страница",
-       "tooltip-n-help": "Ð\9fомоÑ\89наÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а",
+       "tooltip-n-help": "Ð\9cÑ\8fÑ\81Ñ\82о ÐºÑ\8aдеÑ\82о Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð½Ñ\84оÑ\80миÑ\80аÑ\82е",
        "tooltip-t-whatlinkshere": "Списък на всички страници, сочещи насам",
        "tooltip-t-recentchangeslinked": "Последните промени на страници, сочени от тази страница",
        "tooltip-feed-rss": "RSS feed за страницата",
        "tooltip-t-contributions": "Показване на приносите на потребителя",
        "tooltip-t-emailuser": "Изпращане на писмо до потребителя",
        "tooltip-t-info": "Повече за тази страница",
-       "tooltip-t-upload": "Ð\9aаÑ\87ване Ð½Ð° файлове",
+       "tooltip-t-upload": "Ð\9aаÑ\87и файлове",
        "tooltip-t-specialpages": "Списък на всички специални страници",
        "tooltip-t-print": "Версия за печат на страницата",
        "tooltip-t-permalink": "Постоянна препратка към тази версия на страницата",
        "spam_reverting": "Връщане на последната версия, несъдържаща препратки към $1",
        "spam_blanking": "Всички версии, съдържащи препратки към $1, изчистване",
        "spam_deleting": "Всички версии съдържат препратки към $1, изтриване",
-       "simpleantispam-label": "Проверка за спам.\nНеобходимо е да <strong>НЕ</strong> попълвате това поле!",
+       "simpleantispam-label": "Проверка за спам.\n<strong>НЕ</strong> попълвайте това поле!",
        "pageinfo-title": "Информация за \"$1\"",
        "pageinfo-not-current": "За съжаление тази информация не може да бъде предоставена за стари версии.",
        "pageinfo-header-basic": "Основна информация",
index c7bcb0b..11aee12 100644 (file)
        "search-section": "(sekcija $1)",
        "search-category": "(kategorija $1)",
        "search-file-match": "(podudara se sadržaj datoteke)",
-       "search-suggest": "Da li ste mislili: $1",
+       "search-suggest": "Jeste li mislili: $1",
        "search-rewritten": "Prikazujem rezultate za $1. Umjesto toga potraži $2.",
        "search-interwiki-caption": "Srodni projekti",
        "search-interwiki-default": "$1 rezultati:",
index dcb761e..73ab0fa 100644 (file)
        "databaseerror-function": "Funció: $1",
        "databaseerror-error": "Error:$1",
        "laggedslavemode": "Avís: La pàgina podria mancar de modificacions recents.",
-       "readonly": "La base de dades es troba bloquejada",
+       "readonly": "La base de dades es bloquejada",
        "enterlockreason": "Escriviu una raó pel bloqueig, així com una estimació de quan tindrà lloc el desbloqueig",
        "readonlytext": "La base de dades està temporalment bloquejada segurament per tasques de manteniment, després de les quals es tornarà a la normalitat.\n\nL'administrador que l'ha bloquejada ha donat aquesta explicació: $1",
        "missing-article": "La base de dades no ha trobat el text d'una pàgina que hauria d'haver trobat, anomenada «$1» $2.\n\nNormalment això passa perquè s'ha seguit una diferència desactualitzada o un enllaç d'historial a una pàgina que s'ha suprimit.\n\nSi no fos el cas, podríeu haver trobat un error en el programari.\nAviseu-ho llavors a un [[Special:ListUsers/sysop|administrador]], deixant-li clar l'adreça URL causant del problema.",
        "invalidtitle-unknownnamespace": "Títol no vàlid amb espai de noms desconegut de número «$1» i text «$2»",
        "exception-nologin": "No has iniciat sessió",
        "exception-nologin-text": "Cal que inicieu una sessió per accedir a aquesta pàgina o acció.",
-       "exception-nologin-text-manual": "Si us plau, $1 per poder accedir a aquesta pàgina o acció.",
+       "exception-nologin-text-manual": "Si us plau, $1 per poder accedir a aquesta pàgina o acció.",
        "virus-badscanner": "Mala configuració: antivirus desconegut: ''$1''",
        "virus-scanfailed": "escaneig fallit (codi $1)",
        "virus-unknownscanner": "antivirus desconegut:",
        "loginerror": "Error d'inici de sessió",
        "createacct-error": "Error de creació de compte",
        "createaccounterror": "No s'ha pogut crear el compte: $1",
-       "nocookiesnew": "S'ha creat el compte d'usuari, però no esteu enregistrat. El projecte {{SITENAME}} usa galetes per enregistrar els usuaris. Si us plau activeu-les, per a poder enregistrar-vos amb el vostre nom d'usuari i la clau.",
+       "nocookiesnew": "S'ha creat el compte d'usuari, però no s'ha iniciat la sessió.\nEl projecte {{SITENAME}} usa galetes per a iniciar la sessió d'usuari. \nTeniu les galetes desactivades. \nActiveu-les per a poder iniciar la sessió amb el nou nom d'usuari i la nova clau.",
        "nocookieslogin": "El programari {{SITENAME}} utilitza galetes per enregistrar usuaris. Teniu les galetes desactivades. Activeu-les i torneu a provar.",
        "nocookiesfornew": "No s'ha creat el compte d'usuari, ja que no es podia confirmar el seu origen.\nVerifiqueu que teniu habilitades les galetes al vostre navegador, torneu a carregar aquesta pàgina i intenteu-lo de nou.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "wrongpasswordempty": "La contrasenya que s'ha introduït estava en blanc. Torneu-ho a provar.",
        "passwordtooshort": "La contrasenya ha de tenir un mínim {{PLURAL:$1|d'un caràcter|de $1 caràcters}}.",
        "passwordtoolong": "La contrasenya ha de tenir un màxim {{PLURAL:$1|d'un caràcter|de $1 caràcters}}.",
+       "passwordtoopopular": "No poden utilitzar-se contrasenyes d'ús habitual. Trieu-ne una més única.",
        "password-name-match": "La contrasenya ha de ser diferent del vostre nom d'usuari.",
        "password-login-forbidden": "No és permès d'utilitzar aquest nom d'usuari i contrasenya.",
        "mailmypassword": "Restableix la contrasenya",
        "user-mail-no-addy": "S'ha intentat enviar un missatge de correu electrònic sense adreça.",
        "user-mail-no-body": "Vas intentar enviar un correu electrònic amb un cos buit o excessivament curt.",
        "changepassword": "Canvia la contrasenya",
-       "resetpass_announce": "Per tal de completar l'inici de sessió heu de definir una contrasenya nova.",
+       "resetpass_announce": "Per a completar l'inici de sessió heu de definir una contrasenya nova.",
        "resetpass_text": "<!-- Afegiu-hi un text -->",
        "resetpass_header": "Canvia la contrasenya del compte",
        "oldpassword": "Contrasenya antiga",
        "changeemail-no-info": "Heu d'entrar en un compte d'usuari per accedir directament a aquesta pàgina.",
        "changeemail-oldemail": "Adreça electrònica actual:",
        "changeemail-newemail": "Adreça electrònica nova:",
+       "changeemail-newemail-help": "Aquest camp s'ha de deixar en blanc si voleu eliminar la vostra adreça de correu electrònic. Si s'elimina l'adreça electrònica, no podreu restablir la contrasenya si l'oblideu i no rebreu correus electrònics des d'aquest wiki.",
        "changeemail-none": "(cap)",
        "changeemail-password": "La vostra contrasenya a {{SITENAME}}:",
        "changeemail-submit": "Canvia de correu electrònic",
        "permissionserrors": "Error de permisos",
        "permissionserrorstext": "No teniu permisos per a fer-ho, {{PLURAL:$1|pel següent motiu|pels següents motius}}:",
        "permissionserrorstext-withaction": "No teniu permís per a $2, {{PLURAL:$1|pel motiu següent|pels motius següents}}:",
+       "contentmodelediterror": "No podeu modificar aquesta revisió perquè el seu model de contingut és <code>$1</code>, i el model de contingut actual de la pàgina és <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Avís: esteu creant una pàgina que s'ha suprimit prèviament.'''\n\nHauríeu de considerar si és realment necessari continuar editant aquesta pàgina.\nA continuació s'ofereix el registre de supressions i de reanomenaments de la pàgina:",
        "moveddeleted-notice": "S'ha suprimit aquesta pàgina.\nA continuació us mostrem com a referència el registre d'esborraments i reanomenaments de la pàgina.",
        "moveddeleted-notice-recent": "S’ha suprimit aquesta pàgina recentment (en les últimes 24 hores).\nA continuació us mostrem com a referència el registre de supressions i reanomenaments de la pàgina.",
        "content-failed-to-parse": "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
        "invalid-content-data": "Dades de contingut no vàlides",
        "content-not-allowed-here": "No és permès el contingut \"$1\" a la pàgina [[$2]]",
-       "editwarning-warning": "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.\nSi teniu un compte d'usuari, podeu eliminar aquest avís a la secció «{{int:prefs-editing}}» de les vostres preferències.",
+       "editwarning-warning": "Si sortiu d'aquesta pàgina, perdreu tots els canvis que hàgiu fet.\nSi teniu un compte d'usuari, podeu eliminar aquest avís en la secció «{{int:prefs-editing}}» de les vostres preferències.",
        "editpage-notsupportedcontentformat-title": "No s'admet el format del contingut",
        "editpage-notsupportedcontentformat-text": "No s'admet el format del contingut $1 pel model de contingut $2.",
        "content-model-wikitext": "wikitext",
        "rows": "Files",
        "columns": "Columnes",
        "searchresultshead": "Preferències de la cerca",
-       "stub-threshold": "Límit per a formatar l'enllaç com <a href=\"#\" class=\"stub\">esborrany</a> (en octets):",
+       "stub-threshold": "Límit per a formatar com a enllaç a esborrany ($1):",
        "stub-threshold-sample-link": "mostra",
        "stub-threshold-disabled": "Inhabilitat",
        "recentchangesdays": "Dies a mostrar en els canvis recents:",
        "prefs-help-recentchangescount": "Inclou els canvis recents, els historials de pàgines i els registres.",
        "prefs-help-watchlist-token2": "Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.\nQualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.\n[[Special:ResetTokens|Cliqueu aquí si voleu restaurar-la]].",
        "savedprefs": "S’han desat les vostres preferències.",
+       "savedrights": "S'han desat els permisos d'usuari de {{GENDER:$1|$1}}.",
        "timezonelegend": "Fus horari:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Utilitza l'hora per defecte del wiki ($1)",
        "userrights-unchangeable-col": "Grups que no podeu canviar",
        "userrights-irreversible-marker": "$1*",
        "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.",
+       "userrights-removed-self": "Heu suprimit els vostres propis permisos correctament. Per tant, ja no podeu tornar a accedir a aquesta pàgina.",
        "group": "Grup:",
        "group-user": "Usuaris",
        "group-autoconfirmed": "Usuaris autoconfirmats",
        "right-editsemiprotected": "Edita les pàgines protegides com «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "Editar el model de contingut d'una pàgina",
        "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-editusercssjs": "Modificar els fitxers CSS i JavaScript d'altres usuaris",
+       "right-editusercss": "Modificar els fitxers CSS d'altres usuaris",
+       "right-edituserjs": "Modificar els fitxers JavaScript d'altres usuaris",
+       "right-editmyusercss": "Modificar els vostres fitxers d'usuari CSS",
+       "right-editmyuserjs": "Modificar els vostres fitxers d'usuari 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)",
        "filepageexists": "La pàgina de descripció d'aquest fitxer ja ha estat creada (<strong>[[:$1]]</strong>), però de moment no hi ha cap fitxer amb aquest nom. La descripció que heu posat no apareixerà a la pàgina de descripció. Si voleu que hi aparegui haureu d'editar-la manualment.\n[[$1|thumb]]",
        "fileexists-extension": "Ja existeix un fitxer amb un nom semblant: [[$2|thumb]]\n* Nom del fitxer que es puja: <strong>[[:$1]]</strong>\n* Nom del fitxer existent: <strong>[[:$2]]</strong>\nPotser voleu fer servir un nom més fàcil de distingir?",
        "fileexists-thumbnail-yes": "Aquest fitxer sembla ser una imatge en mida reduïda (<em>miniatura</em>). [[$1|thumb]]\nComproveu si us plau el fitxer <strong>[[:$1]]</strong>.\nSi el fitxer és la mateixa imatge a mida original, no cal carregar cap miniatura més.",
-       "file-thumbnail-no": "El nom del fitxer comença per <strong>$1</strong>.\nSembla ser una imatge de mida reduïda ''(miniatura)''.\nSi teniu la imatge en resolució completa, pugeu-la, sinó mireu de canviar-li el nom, si us plau.",
+       "file-thumbnail-no": "El nom del fitxer comença per <strong>$1</strong>.\nSembla una imatge de mida reduïda <em>(miniatura)</em>.\nSi teniu la imatge en alta resolució, pugeu-la. Si no, mireu de canviar-li el nom.",
        "fileexists-forbidden": "Ja hi existeix un fitxer amb aquest nom i no es pot sobreescriure.\nSi us plau, torneu enrere i carregueu aquest fitxer sota un altre nom. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ja hi ha un fitxer amb aquest nom en el fons comú de fitxers.\nSi encara voleu pujar el fitxer, torneu enrere i pugeu-ne una còpia amb un altre nom. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Aquest fitxer és un duplicat {{PLURAL:$1|del fitxer |dels següents fitxers:}}",
        "upload-scripted-pi-callback": "No es poden carregar arxius que continguin instruccions de processament de pàgines d'estil XML",
        "uploaded-script-svg": "S’ha trobat l’element programable «$1» al fitxer SVG carregat.",
        "uploaded-hostile-svg": "S’ha trobat codi CSS no segur a l’element d’estil del fitxer SVG carregat.",
-       "uploaded-event-handler-on-svg": "No es permet establir els atributs de gestió d’events <code>$1=\"$2\"</code> als fitxers SVG.",
+       "uploaded-event-handler-on-svg": "No es permet establir els atributs de gestió d’esdeveniments <code>$1=\"$2\"</code> en fitxers SVG.",
        "uploaded-href-attribute-svg": "No es permeten els atributs d’«href» <code>&lt;$1 $2=\"$3\"&gt;</code> amb objectius no locals (p. ex., http:// i javascript:) als fitxers SVG.",
        "uploaded-href-unsafe-target-svg": "S’ha trobat un element «href» amb un objectiu no segur <code>&lt;$1 $2=\"$3\"&gt;</code> al fitxer SVG carregat.",
        "uploaded-animate-svg": "S'ha trobat l'etiqueta «animate» que pot estar canviant l'href mitjançant l'atribut <code>&lt;$1 $2=\"$3\"&gt;</code> en el fitxer SVG carregat.",
        "backend-fail-batchsize": "El rerefons d'emmagatzemament ha rebut un lot {{PLURAL:$1|d'$1 operació|de $1 operacions}} de fitxer; el límit és $2 {{PLURAL:$2|operació|operacions}}.",
        "backend-fail-usable": "No s'ha pogut llegir ni escriure el fitxer \"$1\" a causa de permisos insuficients o perquè hi manquen directoris/contenidors.",
        "filejournal-fail-dbconnect": "No es pot connectar amb la base de dades per emmagatzemar el backend \"$1\".",
-       "filejournal-fail-dbquery": "No es pot actualitzat la base de dades per a emmagatzemar el backend \"$1\".",
+       "filejournal-fail-dbquery": "No es pot actualitzar la base de dades per a emmagatzemar el backend \"$1\".",
        "lockmanager-notlocked": "No s'ha pogut desbloquejar «$1»; no és bloquejat.",
        "lockmanager-fail-closelock": "No s'ha pogut bloquejar el fitxer per «$1».",
        "lockmanager-fail-deletelock": "No s'ha pogut suprimir el fitxer de bloqueig per «$1».",
        "upload_source_url": " (el fitxer que heu seleccionat des d'un URL vàlid i accessible públicament)",
        "upload_source_file": " (un fitxer triat del vostre ordinador)",
        "listfiles-delete": "elimina",
-       "listfiles-summary": "Aquesta pàgina especial mostra tots els fitxers carregats.\nSi filtreu per usuari només es mostraran els fitxers la versió més recent dels quals hagi estat carregada per aquell.",
+       "listfiles-summary": "Aquesta pàgina especial mostra tots els fitxers carregats.",
        "listfiles_search_for": "Cerca el nom d'un fitxer de medis:",
        "listfiles-userdoesnotexist": "El compte d’usuari «$1» no s’ha registrat.",
        "imgfile": "fitxer",
        "linkstoimage-redirect": "$1 (fitxer redirigit) $2",
        "duplicatesoffile": "{{PLURAL:$1|Aquest fitxer és un duplicat del que apareix a continuació|A continuació s'indiquen els $1 duplicats d'aquest fitxer}} ([[Special:FileDuplicateSearch/$2|vegeu-ne més detalls]]):",
        "sharedupload": "Aquest fitxer prové de $1 i pot ser utilitzat per altres projectes.",
-       "sharedupload-desc-there": "Aquest fitxer prové de $1 i pot ser utilitzat per altres projectes.\nSi us plau vegeu la [$2 pàgina de descripció del fitxer] per a més informació.",
+       "sharedupload-desc-there": "Aquest fitxer prové de $1 i pot ser utilitzat per altres projectes.\nVegeu la [$2 pàgina de descripció del fitxer] per a més informació.",
        "sharedupload-desc-here": "Aquest fitxer prové de $1 i pot ser usat per altres projectes.\nLa descripció de la seva [$2 pàgina de descripció] es mostra a continuació.",
        "sharedupload-desc-edit": "Aquest fitxer és de $1 i potser el fan servir altres projectes.\nPotser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].",
        "sharedupload-desc-create": "Aquest fitxer és de $1 i potser el fan servir altres projectes.\nPotser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].",
        "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ó.\nCada fila conté enllaços a la primera i segona redireccions, així com la destinació de la segona redirecció, que generalment és la pàgina de destinació \"real\" a la qual hauria d'apuntar la primera redirecció.\nLes entrades <del>ratllades</del> s'han resolt.",
+       "doubleredirectstext": "Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.\nCada fila conté enllaços a la primera i la segona redireccions, així com la destinació de la segona redirecció, que generalment és la pàgina de destinació \"real\" a la qual hauria d'apuntar la primera redirecció.\nLes entrades <del>ratllades</del> s'han resolt.",
        "double-redirect-fixed-move": "S'ha reanomenat [[$1]].\nS'ha actualitzat automàticament i ara redirigeix a [[$2]].",
        "double-redirect-fixed-maintenance": "S'ha arreglat automàticament la redirecció doble de [[$1]] a [[$2]] en un treball de manteniment.",
        "double-redirect-fixer": "Supressor de dobles redireccions",
        "deadendpagestext": "Aquestes pàgines no tenen enllaços a altres pàgines del projecte {{SITENAME}}.",
        "protectedpages": "Pàgines protegides",
        "protectedpages-indef": "Només proteccions indefinides",
-       "protectedpages-summary": "Aquesta pàgina llista les pàgines existents que estan protegides actualment. Per consultar la llista de títols protegits per tal que no puguin crear-se'n pàgines, vegeu [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-summary": "Aquesta pàgina llista les pàgines existents que estan protegides actualment. Per a consultar la llista de títols protegits perquè no puguin crear-se'n pàgines, vegeu [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Només proteccions en cascada",
        "protectedpages-noredirect": "Amaga redireccions",
        "protectedpagesempty": "No hi ha cap pàgina protegida per ara",
        "contributions": "Contribucions de {{GENDER:$1|l’usuari|la usuària}}",
        "contributions-title": "Contribucions de l'usuari $1",
        "mycontris": "Contribucions",
+       "anoncontribs": "Contribucions",
        "contribsub2": "Per a {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "El compte d'usuari «$1» no està registrat.",
        "nocontribs": "No s’ha trobat cap canvi que encaixés amb aquests criteris.",
        "blocklog-showsuppresslog": "S'ha blocat i amagat aquest usuari prèviament.\nPer més detalls, a sota es mostra el registre de supressions:",
        "blocklogentry": "ha blocat l'{{GENDER:$1|usuari|usuària}} [[$1]] per un període de: $2 $3",
        "reblock-logentry": "canviades les opcions del blocatge a [[$1]] amb caducitat a $2, $3",
-       "blocklogtext": "Això és una relació de accions de bloqueig i desbloqueig. Les adreces IP bloquejades automàticament no apareixen. Vegeu la [[Special:BlockList|llista de bloqueigs]] per veure una llista dels actuals bloqueigs operatius.",
+       "blocklogtext": "Això és una relació d'accions de bloqueig i desbloqueig. Les adreces IP bloquejades automàticament no apareixen. Vegeu la [[Special:BlockList|llista de bloqueigs]] per a veure una llista dels actuals bloqueigs operatius.",
        "unblocklogentry": "ha desblocat $1",
        "block-log-flags-anononly": "només els usuaris anònims",
        "block-log-flags-nocreate": "s'ha desactivat la creació de comptes",
        "unblock-hideuser": "No podeu desblocar aquest usuari, perquè el seu nom d'usuari està ocult.",
        "ipb_cant_unblock": "Errada: No s'ha trobat el núm. ID de bloqueig $1. És possible que ja s'haguera desblocat.",
        "ipb_blocked_as_range": "Error: L'adreça IP $1 no està blocada directament i per tant no pot ésser desbloquejada. Ara bé, sí que ho està per formar part del rang $2 que sí que pot ser desblocat.",
-       "ip_range_invalid": "Rang dIP no vàlid.",
+       "ip_range_invalid": "Rang d'IP no vàlid.",
        "ip_range_toolarge": "No són permesos els bloquejos de rangs més grans que /$1.",
        "proxyblocker": "Bloqueig de proxy",
        "proxyblockreason": "S'ha blocat la vostra adreça IP perquè és un proxy obert. Contactau el vostre proveïdor d'Internet o servei tècnic i informau-los d'aquest seriós problema de seguretat.",
        "sorbsreason": "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert dins la llista negra de DNS que fa servir el projecte {{SITENAME}}.",
        "sorbs_create_account_reason": "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert a la llista negra de DNS que utilitza el projecte {{SITENAME}}. No podeu crear-vos-hi un compte",
-       "xffblockreason": "Una adreça IP present en la capçalera X-Forwarded-For, ja sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
+       "xffblockreason": "Una adreça IP present en la capçalera X-Forwarded-For, sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
        "cant-see-hidden-user": "L'usuari que esteu intentant blocar ja ha estat blocat i ocultat. Com que no teniu el permís hideuser no podeu veure ni modificar el seu blocatge.",
        "ipbblocked": "No podeu blocar o desblocar altres usuaris, perquè vós {{GENDER:|mateix|mateixa|mateix}} esteu {{GENDER:|blocat|blocada|blocat}}.",
        "ipbnounblockself": "No teniu permís per a treure el vostre bloqueig",
        "lockdb": "Bloca la base de dades",
        "unlockdb": "Desbloca la base de dades",
-       "lockdbtext": "Si es bloca la base de dades impedirà la capacitat a tots els usuaris d'editar pàgines, canviar les preferències, editar la llista de seguiment i altres canvis que calen de modificacions a la base de dades.\nConfirmeu que això és el que voleu fer, i sobretot no us oblideu de desblocar la base de dades quan acabeu el manteniment.",
+       "lockdbtext": "Bloquejar la base de dades inhabilitarà a tots els usuaris per a modificar pàgines, canviar preferències, editar la llista de seguiment i altres accions que requereixen canvis en la base de dades.\nConfirmeu que això és el que voleu fer, i sobretot no us oblideu de desblocar la base de dades quan acabeu el manteniment.",
        "unlockdbtext": "Desblocant la base de dades es restaurarà l'habilitat de tots\nels usuaris d'editar pàgines, canviar les preferències, editar els llistats de seguiment, i\naltres accions que requereixen canvis en la base de dades.\nConfirmeu que això és el que voleu fer.",
        "lockconfirm": "Sí, realment vull blocar la base de dades.",
        "unlockconfirm": "Sí, realment vull desblocar la base de dades.",
        "movepagetext-noredirectfixer": "Amb el formulari següent podeu reanomenar una pàgina movent tot el seu historial al nom nou.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol. \nAssegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nÉs responsabilitat vostra assegurar que els enllaços continuen apuntant cap a on se suposa que han d'anar. \n\nTingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció i no tingui més historial. \nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n \n'''Atenció!''' \nAixò pot ser un canvi dràstic i inesperat per una pàgina popular; \nassegureu-vos que sabeu el que feu abans de continuar.",
        "movepagetalktext": "La pàgina de discussió associada també serà traslladada automàticament '''tret que''':\n* Ja existeixi una pàgina de discussió no buida amb el nou nom, o\n* Desactiveu l'opció de més avall.\n\nEn aquests casos, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
        "moveuserpage-warning": "'''Atenció:''' Esteu a punt de moure una pàgina d'usuari. Tingueu en compte que només la pàgina es desplaçarà i que el compte d'usuari ''no'' canviarà de nom.",
-       "movecategorypage-warning": "<strong>Avís:</strong> Esteu a punt de moure una pàgina de categoria. Tingueu en compte que només es moure la pàgina i qualsevol de les pàgines a l'antiga categoria <em>no</em> es recategoritzarà automàticament en la nova.",
+       "movecategorypage-warning": "<strong>Avís:</strong> Esteu a punt de moure una pàgina de categoria. Tingueu en compte que només es mourà aquesta pàgina, i que les pàgines dins la categoria antiga <em>no</em> es recategoritzaran automàticament en la nova.",
        "movenologintext": "Heu de ser un usuari registrat i estar [[Special:UserLogin|dintre d'una sessió]]\nper reanomenar una pàgina.",
        "movenotallowed": "No teniu permís per a moure pàgines.",
        "movenotallowedfile": "No teniu el permís per a moure fitxers.",
        "cantmove-titleprotected": "No podeu moure una pàgina a aquesta ubicació, perquè s'ha protegit la creació del títol nou",
        "movetalk": "Mou la pàgina de discussió associada",
        "move-subpages": "Desplaça'n també les subpàgines (fins a $1)",
-       "move-talk-subpages": "Desplaça també les subpàgines de la pàgina de discussió (fins un màxim de $1)",
+       "move-talk-subpages": "Desplaça també les subpàgines de la pàgina de discussió (fins un màxim de $1)",
        "movepage-page-exists": "La pàgina $1 ja existeix i no pot sobreescriure's automàticament.",
        "movepage-page-moved": "La pàgina $1 s'ha traslladat a $2.",
        "movepage-page-unmoved": "La pàgina $1 no s'ha pogut moure a $2.",
        "export-addns": "Afegir",
        "export-download": "Ofereix desar com a fitxer",
        "export-templates": "Inclou les plantilles",
-       "export-pagelinks": "Inclou pàgines enllaçades fins una profunditat de:",
+       "export-pagelinks": "Inclou pàgines enllaçades fins una profunditat de:",
        "allmessages": "Tots els missatges del sistema",
        "allmessagesname": "Nom",
        "allmessagesdefault": "Text per defecte",
        "allmessagescurrent": "Text actual",
-       "allmessagestext": "Tot seguit hi ha una llista dels missatges del sistema que es troben a l'espai de noms ''MediaWiki''. La traducció genèrica d'aquests missatges no s'hauria de fer localment sinó a la traducció del programari MediaWiki. Si voleu ajudar-hi visiteu [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] i [//translatewiki.net translatewiki.net].",
+       "allmessagestext": "Tot seguit hi ha una llista dels missatges del sistema que es troben en l'espai de noms ''MediaWiki''. La traducció genèrica d'aquests missatges no s'hauria de fer localment sinó en la traducció del programari MediaWiki. Si voleu ajudar-hi, visiteu [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] i [//translatewiki.net translatewiki.net].",
        "allmessagesnotsupportedDB": "No es pot processar '''{{ns:special}}:Allmessages''' perquè la variable '''$wgUseDatabaseMessages''' està desactivada.",
        "allmessages-filter-legend": "Filtre",
        "allmessages-filter": "Filtra per l'estat de personalització:",
        "thumbnail_error_remote": "Missatge d'error de $1:\n$2",
        "djvu_page_error": "La pàgina DjVu està fora de l'abast",
        "djvu_no_xml": "No s'ha pogut recollir l'XML per al fitxer DjVu",
-       "thumbnail-temp-create": "No s'ha pogut creat el fitxer de miniatura temporal",
+       "thumbnail-temp-create": "No s'ha pogut crear el fitxer de miniatura temporal",
        "thumbnail-dest-create": "No es pot desar la miniatura a la destinació",
        "thumbnail_invalid_params": "Els paràmetres de les miniatures no són vàlids",
        "thumbnail_toobigimagearea": "Fitxer amb dimensions més gran que $1",
        "javascripttest-pagetext-unknownframework": "L'entorn de proves «$1» és desconegut.",
        "javascripttest-pagetext-unknownaction": "Acció desconeguda «$1».",
        "javascripttest-pagetext-frameworks": "Trieu un dels següents entorns de prova: $1",
-       "javascripttest-pagetext-skins": "Trieu un tema on executar-hi els tests:",
+       "javascripttest-pagetext-skins": "Trieu un tema per a executar-hi els tests:",
        "javascripttest-qunit-intro": "Consulteu la [documentació de tests de $1] a mediawiki.org.",
        "tooltip-pt-userpage": "La vostra pàgina d'usuari",
        "tooltip-pt-anonuserpage": "La pàgina d'usuari per la ip que utilitzeu",
        "saturday-at": "Dissabte a les $1",
        "sunday-at": "Diumenge a les $1",
        "yesterday-at": "Ahir a les $1",
-       "bad_image_list": "El format ha de ser el següent:\n\nNomés els elements de llista (les línies que comencin amb un *) es prenen en consideració. El primer enllaç de cada línia ha de ser el d'un fitxer dolent.\nLa resta d'enllaços de la línia són les excepcions, és a dir, les pàgines on s'hi pot encabir el fitxer.",
+       "bad_image_list": "El format ha de ser el següent:\n\nNomés els elements de llista (les línies que comencin amb un *) es prenen en consideració. El primer enllaç de cada línia ha de ser el d'un fitxer dolent.\nLa resta d'enllaços de la línia són les excepcions, és a dir, les pàgines on es pot encabir el fitxer.",
        "variantname-zh-cn": "cn",
        "variantname-zh-tw": "tw",
        "variantname-zh-hk": "hk",
        "exif-lightsource-18": "Llum estàndard B",
        "exif-lightsource-19": "Llum estàndard C",
        "exif-lightsource-24": "Bombeta de tungstè d'estudi ISO",
-       "exif-lightsource-255": "Altre font de llum",
+       "exif-lightsource-255": "Una altra font de llum",
        "exif-flash-fired-0": "No s'ha disparat el flaix",
        "exif-flash-fired-1": "Flaix disparat",
        "exif-flash-return-0": "no hi ha funció de detecció del retorn de la llum estroboscòpica",
        "specialpages-group-developer": "Eines de desenvolupador",
        "blankpage": "Pàgina en blanc",
        "intentionallyblankpage": "Pàgina intencionadament en blanc",
-       "external_image_whitelist": " #Deixeu aquesta línia exactament igual com està<pre>\n#Poseu fragments d'expressions regulars (regexps) (només la part entre els //) a sota\n#Aquests fragments es correspondran amb les URL d'imatges externes\n#Se'n mostraran com a imatges si coincideixen, i sinó es mostraran com a enllaços\n#Les línies que comencen amb un # es tracten com a comentaris\n#S'hi distingeixen majúscules i minúscules\n\n#Poseu tots els fragments regex al damunt d'aquesta línia. Deixeu aquesta línia exactament com està</pre>",
+       "external_image_whitelist": " #Deixeu aquesta línia exactament igual com està.<pre>\n#Poseu fragments d'expressions regulars (regex) (només la part entre els //) a sota.\n#Aquests fragments es correspondran amb els URL d'imatges externes.\n#Es mostraran com a imatges si coincideixen, i si no es mostraran com a enllaços.\n#Les línies que comencen amb un # es tracten com a comentaris.\n#S'hi distingeixen majúscules i minúscules.\n\n#Poseu tots els fragments regex al damunt d'aquesta línia. Deixeu aquesta línia exactament com està.</pre>",
        "tags": "Etiquetes de canvi vàlides",
        "tag-filter": "Filtre d'[[Special:Tags|etiquetes]]:",
        "tag-filter-submit": "Filtra",
        "tags-edit-chosen-placeholder": "Seleccioneu algunes etiquetes",
        "tags-edit-chosen-no-results": "No s’han trobat coincidències d’etiquetes",
        "tags-edit-reason": "Motiu:",
+       "tags-edit-revision-submit": "Aplica els canvis a {{PLURAL:$1|a aquesta revisió|$1 revisions}}",
+       "tags-edit-logentry-submit": "Aplica els canvis a {{PLURAL:$1|aquesta entrada de registre|$1 entrades de registre}}",
        "tags-edit-success": "S’han aplicat els canvis correctament.",
        "tags-edit-failure": "No s’han pogut aplicar els canvis:\n$1",
        "tags-edit-nooldid-title": "Revisió de l'objectiu no vàlida",
        "logentry-newusers-create2": "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1",
        "logentry-newusers-byemail": "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1 i la contrasenya ha estat enviada per correu electrònic",
        "logentry-newusers-autocreate": "El compte d'usuari $1 {{GENDER:$2|ha estat creat}} automàticament",
+       "logentry-protect-protect": "$1 {{GENDER:$2|ha protegit}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ha protegit}} $3 $4 [en cascada]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4 [en cascada]",
        "logentry-rights-rights": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3 de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3",
        "logentry-rights-autopromote": "$1 ha estat {{GENDER:$2|promogut}} automàticament de $4 a $5",
        "duration-years": "$1 {{PLURAL:$1|any|anys}}",
        "duration-decades": "$1 {{PLURAL:$1|dècada|dècades}}",
        "duration-centuries": "$1 {{PLURAL:$1|segle|segles}}",
-       "duration-millennia": "$1 {{PLURAL:$1|mil·leni|mil·lenis}}",
+       "duration-millennia": "$1 {{PLURAL:$1|mil·lenni|mil·lennis}}",
        "rotate-comment": "Imatge girada $1 {{PLURAL:$1|grau|graus}} en el sentit de les agulles del rellotge",
        "limitreport-title": "Perfil de dades de l'analitzador:",
        "limitreport-cputime": "Temps d'ús de CPU",
index 3978408..8d1232e 100644 (file)
@@ -62,6 +62,7 @@
        "tog-watchlisthidebots": "Na seznamu sledovaných stránek skrýt editace botů",
        "tog-watchlisthideminor": "Na seznamu sledovaných stránek skrýt malé editace",
        "tog-watchlisthideliu": "Na seznamu sledovaných stránek skrýt editace přihlášených uživatelů",
+       "tog-watchlistreloadautomatically": "Při změně nastavení automaticky aktualizovat seznam sledovaných stránek (vyžaduje JavaScript)",
        "tog-watchlisthideanons": "Na seznamu sledovaných stránek skrýt editace nepřihlášených uživatelů",
        "tog-watchlisthidepatrolled": "Skrýt patrolované editace ve sledovaných stránkách",
        "tog-watchlisthidecategorization": "Skrýt kategorizaci stránek",
        "wrongpasswordempty": "Bylo zadáno prázdné heslo. Zkuste to znovu.",
        "passwordtooshort": "Heslo musí být dlouhé nejméně $1 {{PLURAL:$1|znak|znaky|znaků}}.",
        "passwordtoolong": "Hesla nemohou být delší než {{PLURAL:$1|1 znak|$1 znaky|$1 znaků}}.",
+       "passwordtoopopular": "Není možné používat běžně vybíraná hesla. Prosím vyberte si jiné, méně časté heslo.",
        "password-name-match": "Vaše heslo nesmí být stejné jako uživatelské jméno.",
        "password-login-forbidden": "Použití tohoto uživatelského jména a hesla bylo zakázáno.",
        "mailmypassword": "Poslat nové heslo",
index f59beea..d0e354c 100644 (file)
        "contributions": "{{GENDER:$1|Brugerbidrag}}",
        "contributions-title": "Brugerbidrag for $1",
        "mycontris": "Bidrag",
+       "anoncontribs": "Bidrag",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Brugerkontoen \"$1\" er ikke registreret.",
        "nocontribs": "Ingen ændringer er fundet som opfylder disse kriterier.",
        "movenosubpage": "Denne side har ingen undersider.",
        "movereason": "Begrundelse:",
        "revertmove": "gendan",
-       "delete_and_move": "Slet og flyt",
        "delete_and_move_text": "==Sletning nødvendig==\n\nArtiklen \"[[:$1]]\" eksisterer allerede. Vil du slette den for at gøre plads til flytningen?",
        "delete_and_move_confirm": "Ja, slet siden",
        "delete_and_move_reason": "Slettet for at gøre plads til flytning fra \"[[$1]]\"",
index 5b8d6d5..99e4706 100644 (file)
        "tog-watchlisthidebots": "Bearbeitungen durch Bots in der Beobachtungsliste ausblenden",
        "tog-watchlisthideminor": "Kleine Bearbeitungen in der Beobachtungsliste ausblenden",
        "tog-watchlisthideliu": "Bearbeitungen angemeldeter Benutzer in der Beobachtungsliste ausblenden",
+       "tog-watchlistreloadautomatically": "Die Beobachtungsliste automatisch neu laden, wenn ein Filter geändert wurde (erfordert JavaScript)",
        "tog-watchlisthideanons": "Bearbeitungen anonymer Benutzer (IP-Adressen) in der Beobachtungsliste ausblenden",
        "tog-watchlisthidepatrolled": "Kontrollierte Änderungen in der Beobachtungsliste ausblenden",
        "tog-watchlisthidecategorization": "Kategorisierungen von Seiten ausblenden",
        "wrongpasswordempty": "Es wurde kein Passwort eingegeben. Bitte versuche es erneut.",
        "passwordtooshort": "Passwörter müssen mindestens {{PLURAL:$1|1 Zeichen|$1 Zeichen}} lang sein.",
        "passwordtoolong": "Passwörter können nicht länger als {{PLURAL:$1|ein|$1}} Zeichen sein.",
+       "passwordtoopopular": "Häufig ausgewählte Passwörter können nicht verwendet werden. Bitte wähle ein einzigartigeres Passwort aus.",
        "password-name-match": "Dein Passwort muss sich von deinem Benutzernamen unterscheiden.",
        "password-login-forbidden": "Die Verwendung dieses Benutzernamens und Passwortes ist nicht erlaubt.",
        "mailmypassword": "Passwort zurücksetzen",
index 1dad3eb..5c8e4a7 100644 (file)
        "history_short": "Tarix",
        "updatedmarker": "cıkewtena mına peyêne ra dıme biyo rocane",
        "printableversion": "Asayışê çapkerdışi",
-       "permalink": "Linko daimi",
+       "permalink": "Gıreyo jûqere",
        "print": "Çap ke",
        "view": "Bıvêne",
        "view-foreign": "$1'i bıvin",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "listredirects": "Listeya Hetenayışan",
        "listduplicatedfiles": "Lista dosyeyanê ke kopyaya cı vêniyena",
-       "unusedtemplates": "Şablonê ke nê xebtênê",
+       "unusedtemplates": "Şablonê ke nêguriyenê",
        "unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
        "unusedtemplateswlh": "linkanê binî",
        "randompage": "Pela raştameyiye",
        "lonelypagestext": "Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.",
        "uncategorizedpages": "Pelê ke kategorize nêbiyê",
        "uncategorizedcategories": "Kategoriyê ke kategorize nêbiyê",
-       "uncategorizedimages": "Dosyayê ke bê kategoriyê",
+       "uncategorizedimages": "Dosyeyê ke bêkategoriyê",
        "uncategorizedtemplates": "Şablonê ke bêkategoriyê",
        "unusedcategories": "Kategoriyê ke nêgureniyê",
-       "unusedimages": "Dosyeyê ke nê xebtênê",
+       "unusedimages": "Dosyeyê ke nêguriyenê",
        "wantedcategories": "Kategoriyê ke waziyayê",
-       "wantedpages": "Peleye ke waştênê",
+       "wantedpages": "Pelê ke waziyayê",
        "wantedpages-badtitle": "sernuşte meqbul niyo: $1",
-       "wantedfiles": "Dosyeyê cıgeyriyayey",
+       "wantedfiles": "Dosyeyê cıgeyriyayeyi",
        "wantedfiletext-cat": "Dosyaya cêrên karvıstedeya lakin çınya. Mewcud dosyayan de xeriba miyan de liste bena. Xırabiya wınisin dana <del>ateber</del>. Zewbi zi, şırê pela da dosyeyê ke çınyaya [[:$1]].",
        "wantedfiletext-nocat": "Dosyeyê cêrêni estê lekin karnêvıstê. Dosyeyê xeribi liste benê. bo babeta dano <del>ateber</del>",
        "wantedtemplates": "Şablonê ke waziyenê",
        "prefixindex-namespace": "Peleyê Veroleyıni ($1 cay nami)",
        "prefixindex-strip": "Listeya réz bıyayışi",
        "shortpages": "Pelê kılmeki",
-       "longpages": "Peleyê dergeki",
+       "longpages": "Pelê dergeki",
        "deadendpages": "Pelê nêgıredayeyi",
        "deadendpagestext": "Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.",
-       "protectedpages": "Pelê pawıtiyey",
+       "protectedpages": "Pelê pawıteyi",
        "protectedpages-indef": "têna pawıteyê bêmuddeti",
        "protectedpages-summary": "Listeya ena peler newke pawıtiya.Sername de  ena lista rê pawıte vıraştışi rê [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] bıvinê.",
        "protectedpages-cascade": "Kilit biyaye ke teyna cascadiye",
        "protectedpages-reason": "Sebeb",
        "protectedpages-unknown-timestamp": "Nêzanaye",
        "protectedpages-unknown-performer": "Karbero nêzanaye",
-       "protectedtitles": "Sernameyê pawıtiyey",
+       "protectedtitles": "Sernameyê pawıteyi",
        "protectedtitlesempty": "pê ney parametreyan sernuşteyê pawite çinê",
        "listusers": "Listeyê Karberan",
        "listusers-editsonly": "Teyna karberan bimucne ke ey nuştê",
        "usercreated": "$2 de $1 {{GENDER:$3|viraziya}}",
        "newpages": "Pelê newey",
        "newpages-username": "Nameyê karberi:",
-       "ancientpages": "Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani",
+       "ancientpages": "Pelê kehenêri",
        "move": "Bere",
        "movethispage": "Ena pele bere",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
index bc4207c..abde187 100644 (file)
@@ -79,6 +79,7 @@
        "tog-watchlisthidebots": "Απόκρυψη των επεξεργασιών των bot από τη λίστα παρακολούθησης",
        "tog-watchlisthideminor": "Απόκρυψη των επεξεργασιών μικρής σημασίας από τη λίστα παρακολούθησης",
        "tog-watchlisthideliu": "Απόκρυψη επεξεργασιών συνδεδεμένων χρηστών από τη λίστα παρακολούθησης",
+       "tog-watchlistreloadautomatically": "Φορτώσετε εκ νέου η λίστα παρακολούθησής αυτόματα κάθε φορά που ένα φίλτρο έχει αλλάξει (Απαιτείται JavaScript)",
        "tog-watchlisthideanons": "Απόκρυψη επεξεργασιών ανωνύμων χρηστών από τη λίστα παρακολούθησης",
        "tog-watchlisthidepatrolled": "Απόκρυψη ελεγμένων επεξεργασιών από τη λίστα παρακολούθησης",
        "tog-watchlisthidecategorization": "Απόκρυψη κατηγοριοποίησης σελίδων",
        "wrongpasswordempty": "Ο κωδικός πρόσβασης που εισάχθηκε ήταν κενός. Παρακαλούμε προσπαθήστε ξανά.",
        "passwordtooshort": "Οι κωδικοί πρέπει να περιέχουν τουλάχιστον {{PLURAL:$1|1 χαρακτήρα|$1 χαρακτήρες}}.",
        "passwordtoolong": "Οι κωδικοί πρόσβασης δεν μπορούν να υπερβαίνουν {{PLURAL:$1|τον 1 χαρακτήρα|τους $1 χαρακτήρες}}.",
+       "passwordtoopopular": "Συνήθως επιλέγονται οι κωδικοί πρόσβασης δεν μπορούν να χρησιμοποιηθούν. Παρακαλώ επιλέξτε μια πιο μοναδικό κωδικό πρόσβασης.",
        "password-name-match": "Ο κωδικός σου θα πρέπει να είναι διαφορετικός από το όνομα χρήστη σου.",
        "password-login-forbidden": "Η χρήση αυτού του ονόματος χρήστη και συνθηματικού έχουν  απαγορευτεί.",
        "mailmypassword": "Επαναφορά κωδικού",
index 440845b..4d66f44 100644 (file)
@@ -35,6 +35,7 @@
        "tog-watchlisthidebots": "Hide bot edits from the watchlist",
        "tog-watchlisthideminor": "Hide minor edits from the watchlist",
        "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
+       "tog-watchlistreloadautomatically": "Reload the watchlist automatically whenever a filter is changed (JavaScript required)",
        "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
        "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
        "tog-watchlisthidecategorization": "Hide categorization of pages",
        "wrongpasswordempty": "Password entered was blank.\nPlease try again.",
        "passwordtooshort": "Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.",
        "passwordtoolong": "Passwords cannot be longer than {{PLURAL:$1|1 character|$1 characters}}.",
+       "passwordtoopopular": "Commonly chosen passwords cannot be used. Please choose a more unique password.",
        "password-name-match": "Your password must be different from your username.",
        "password-login-forbidden": "The use of this username and password has been forbidden.",
        "mailmypassword": "Reset password",
index bc6230a..b99afd1 100644 (file)
@@ -43,7 +43,8 @@
                        "Ochilov",
                        "Macofe",
                        "Matma Rex",
-                       "Xð"
+                       "Xð",
+                       "Robin van der Vliet"
                ]
        },
        "tog-underline": "Substreki ligilojn",
        "contributions": "Kontribuoj de {{GENDER:$1|uzanto|uzantino}}",
        "contributions-title": "Kontribuoj de uzanto $1",
        "mycontris": "Kontribuoj",
+       "anoncontribs": "Kontribuoj",
        "contribsub2": "De {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Uzanto-konto \"$1\" ne estas registrita.",
        "nocontribs": "Trovis neniajn redaktojn laŭ tiu kriterio.",
        "cant-move-to-user-page": "Vi ne rajtas movi paĝon al uzantopaĝo (krom al uzantosubpaĝo).",
        "cant-move-category-page": "Vi ne rajtas movi kategoriajn paĝojn.",
        "cant-move-to-category-page": "Vi ne rajtas movi paĝon al kategoria paĝo.",
-       "newtitle": "Al nova titolo",
+       "newtitle": "Nova titolo:",
        "move-watch": "Atenti ĉi tiun paĝon",
        "movepagebtn": "Alinomi paĝon",
        "pagemovedsub": "Sukcesis alinomigo",
index 8fdedf0..e50a945 100644 (file)
        "morenotlisted": "Esta lista no está completa.",
        "mypage": "Página",
        "mytalk": "Discusión",
-       "anontalk": "Hablar",
+       "anontalk": "Discusión",
        "navigation": "Navegación",
        "and": "&#32;y",
        "qbfind": "Buscar",
        "contributions": "Contribuciones {{GENDER:$1|del usuario|de la usuaria}}",
        "contributions-title": "Contribuciones {{GENDER:$1|del usuario|de la usuaria}} $1",
        "mycontris": "Contribuciones",
-       "anoncontribs": "Contribuir",
+       "anoncontribs": "Contribuciones",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "La cuenta de usuario «$1» no está registrada.",
        "nocontribs": "No se encontraron cambios que cumplieran estos criterios.",
index e7a059d..2530d1e 100644 (file)
@@ -61,6 +61,7 @@
        "tog-watchlisthidebots": "Peida robotid jälgimisloendist",
        "tog-watchlisthideminor": "Peida pisiparandused jälgimisloendist",
        "tog-watchlisthideliu": "Peida sisselogitud kasutajate muudatused jälgimisloendist",
+       "tog-watchlistreloadautomatically": "Laadi jälgimisloend mõne filtri muutmise järel koheselt uuesti (nõutav JavaScript)",
        "tog-watchlisthideanons": "Peida anonüümsete kasutajate muudatused jälgimisloendist",
        "tog-watchlisthidepatrolled": "Peida kontrollitud muudatused jälgimisloendist",
        "tog-watchlisthidecategorization": "Peida lehekülgede kategoriseerimine",
        "morenotlisted": "See loend pole täielik.",
        "mypage": "Minu lehekülg",
        "mytalk": "Arutelu",
-       "anontalk": "Selle IP-aadressi arutelu",
+       "anontalk": "Arutelu",
        "navigation": "Navigeerimine",
        "and": "&#32;ja",
        "qbfind": "Otsi",
        "wrongpasswordempty": "Parool jäi sisestamata. Palun proovi uuesti.",
        "passwordtooshort": "Parool peab koosnema vähemalt {{PLURAL:$1|ühest|$1}} tähemärgist.",
        "passwordtoolong": "Parool ei saa olla pikem kui {{PLURAL:$1|üks märk|$1 märk}}.",
+       "passwordtoopopular": "Liigi levinud parooli ei saa kasutada. Palun vali haruldasem parool.",
        "password-name-match": "Parool peab kasutajanimest erinema.",
        "password-login-forbidden": "Selle kasutajanime ja parooli kasutamine on keelatud.",
        "mailmypassword": "Lähtesta parool",
        "contributions": "{{GENDER:$1|Kasutaja}} kaastöö",
        "contributions-title": "Kasutaja $1 kaastöö",
        "mycontris": "Kaastöö",
+       "anoncontribs": "Kaastöö",
        "contribsub2": "Kasutaja {{GENDER:$3|$1}} ($2) jaoks",
        "contributions-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
        "nocontribs": "Antud kriteeriumitele vastavaid muudatusi ei leitud.",
        "tooltip-pt-preferences": "Sinu eelistused",
        "tooltip-pt-watchlist": "Loend lehekülgedest, mille muudatusi jälgid",
        "tooltip-pt-mycontris": "Sinu kaastööde loend",
+       "tooltip-pt-anoncontribs": "Selle IP-aadressi alt tehtud muudatuste loend",
        "tooltip-pt-login": "See pole küll kohustuslik, aga sul tasub sisse logida.",
        "tooltip-pt-logout": "Logi välja",
        "tooltip-pt-createaccount": "See pole küll kohustuslik, aga sul tasub konto luua ja sisse logida.",
index ced2458..9382e10 100644 (file)
        "tog-watchlisthidebots": "Masquer les modifications faites par des robots dans la liste de suivi",
        "tog-watchlisthideminor": "Masquer les modifications mineures dans la liste de suivi",
        "tog-watchlisthideliu": "Masquer les modifications faites par des utilisateurs inscrits dans la liste de suivi",
+       "tog-watchlistreloadautomatically": "Recharger automatiquement la liste de suivi lorsque les options de filtrage sont modifiées (JavaScript requis)",
        "tog-watchlisthideanons": "Masquer les modifications d'utilisateurs anonymes dans la liste de suivi",
        "tog-watchlisthidepatrolled": "Masquer les modifications surveillées dans la liste de suivi",
        "tog-watchlisthidecategorization": "Masquer la catégorisation des pages",
        "wrongpasswordempty": "Vous n'avez pas entré de mot de passe. Veuillez essayer à nouveau.",
        "passwordtooshort": "Votre mot de passe doit contenir au moins $1 caractère{{PLURAL:$1||s}}.",
        "passwordtoolong": "Les mots de passe ne peuvent pas dépasser {{PLURAL:$1|1 caractère|$1 caractères}}.",
+       "passwordtoopopular": "Les mots de passe trop courants ne peuvent pas être utilisés. Veuillez choisir un mot de passe plus original.",
        "password-name-match": "Votre mot de passe doit être différent de votre nom d'utilisateur.",
        "password-login-forbidden": "L'utilisation de ce nom d'utilisateur et/ou de ce mot de passe a été interdite.",
        "mailmypassword": "Réinitialiser le mot de passe",
index 42b050f..d10116f 100644 (file)
        "unusedimages": "Fichiers orphelins",
        "protectedpages-page": "Page",
        "protectedpages-reason": "Raison",
+       "newpages": "Nouvelles pages",
        "newpages-username": "Nom d'useur:",
        "ancientpages": "Pages les plus anciennement changées",
        "move": "Renommer",
        "tooltip-t-specialpages": "Liste de tout les pages speciales",
        "tooltip-t-print": "Version imprimable de cette page",
        "tooltip-ca-nstab-user": "Voir la page d'useur",
-       "tooltip-ca-nstab-special": "Ceci est une page spéciale, vous ne pouvez pas la changer.",
+       "tooltip-ca-nstab-special": "Ceci est une page spéciale, et elle ne peut pas être changée.",
        "pageinfo-toolboxlink": "Information sur la page",
        "bad_image_list": "Le format est le suivant :\n\nSeules les listes d’énumération (commençant par *) sont prises en compte. Le premier lien d’une ligne doit être celui d’une mauvaise image.\nLes autres liens sur la même ligne sont considérés comme des exceptions, par exemple des pages sur lesquelles l’image peut apparaître.",
        "metadata": "Métadonnées",
index 28200bf..ccb682a 100644 (file)
        "tooltip-pt-mycontris": "Lischt vu Dyyne Byyträg",
        "tooltip-pt-login": "Aamälde",
        "tooltip-pt-logout": "Abmälde",
-       "tooltip-pt-createaccount": "Du chasch gärn e Bentuzerkonto aalege un Di aamälde. Du muesch s aber nit",
+       "tooltip-pt-createaccount": "Du chasch gärn e Benutzerkonto aalege un Di aamälde. Du muesch s aber nit",
        "tooltip-ca-talk": "Diskussion zum Artikelinhalt",
        "tooltip-ca-edit": "Die Syte bearbeite",
        "tooltip-ca-addsection": "Neje Abschnitt aafange",
index 18fe01e..873478a 100644 (file)
@@ -66,6 +66,7 @@
        "tog-watchlisthidebots": "הסתרת עריכות של בוטים ברשימת המעקב",
        "tog-watchlisthideminor": "הסתרת עריכות משניות ברשימת המעקב",
        "tog-watchlisthideliu": "הסתרת עריכות של משתמשים רשומים ברשימת המעקב",
+       "tog-watchlistreloadautomatically": "לרענן את רשימת המעקב אוטומטית בכל פעם שהמסנן משתנה (נדרש JavaScript)",
        "tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
        "tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
        "tog-watchlisthidecategorization": "הסתרת הוספות והסרות של דפים מקטגוריות",
        "wrongpasswordempty": "הסיסמה שהקלדתם ריקה.\nאנא נסו שוב.",
        "passwordtooshort": "סיסמאות חייבות להיות באורך {{PLURAL:$1|תו אחד|$1 תווים}} לפחות.",
        "passwordtoolong": "סיסמאות אינן יכולות להיות ארוכות {{PLURAL:$1|מתו אחד|מ־$1 תווים}}.",
+       "passwordtoopopular": "לא ניתן להשתמש בססמאות נפוצות. נא לבחור ססמה ייחודית יותר.",
        "password-name-match": "סיסמתך חייבת להיות שונה משם המשתמש שלך.",
        "password-login-forbidden": "השימוש בשם המשתמש והסיסמה האלה נאסר.",
        "mailmypassword": "איפוס סיסמה",
index e5edb1c..22bebb6 100644 (file)
        "showingresultsinrange": "Dolje {{PLURAL:$1|je prikazan '''$1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}}, u rasponu od '''$2''' do '''$3'''.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1 - $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Ne postoje rezultati koji se podudaraju s upitom.",
+       "search-nonefound-thiswiki": "Nema rezultata na ovim stranicama koji se podudaraju s upitom.",
        "powersearch-legend": "Napredno pretraživanje",
        "powersearch-ns": "Traži u imenskom prostoru:",
        "powersearch-togglelabel": "Uključi:",
index 8108835..6cb93b5 100644 (file)
        "wlnote": "ქვემოთ {{PLURAL:$1|ნაჩვენებია ბოლო ცვლილება|ნაჩვენებია ბოლო '''$1''' ცვლილება}} უკანასკნელი {{PLURAL:$2|საათის|'''$2''' საათის}} მანძილზე, $3, $4 მდგომარეობით.",
        "wlshowlast": "ბოლო $1 საათის $2 დღის ჩვენება",
        "watchlistall2": "ყველა",
+       "wlshowtime": "აჩვენე უკანასკნელი:",
+       "wlshowhideminor": "მცირე რედაქტირების",
+       "wlshowhidebots": "რობოტების",
+       "wlshowhideliu": "რეგისტრირებული მომხმარებლების",
+       "wlshowhideanons": "ანონიმური მომხმარებლების",
        "wlshowhidemine": "ჩემი რედაქტირება",
        "watchlist-options": "კონტროლის სიის პარამეტრები",
        "watching": "კონტროლებადი...",
        "logentry-contentmodel-change-revert": "დაბრუნება",
        "protectlogpage": "დაცვის ისტორია",
        "protectlogtext": "ქვემოთ წარმოდგენილია გვერდის დაცვის დონის ცვლილებების სია. \nიხილეთ ასევე [[Special:ProtectedPages|დაცული გვერდების სია]] ამ მომენტისთვის.",
-       "protectedarticle": "დაცულია გვერდი: „[[$1]]“",
+       "protectedarticle": "დაცულია გვერდი „[[$1]]“",
        "modifiedarticleprotection": "შეცვლილია დაცვის დონე გვერდისთვის „[[$1]]“",
        "unprotectedarticle": "„[[$1]]“-დან დაცვა მოხსნილია",
        "movedarticleprotection": "დაცვის პარამეტრების გადატანა გვერდიდან „[[$2]]“ გვერდზე „[[$1]]“",
        "movenosubpage": "ამ გვერდს არა აქვს ქვეგვერდები",
        "movereason": "მიზეზი:",
        "revertmove": "გაუქმება",
-       "delete_and_move": "წაშლა და გადატანა",
        "delete_and_move_text": "==საჭიროა წაშლა==\n\nსტატია დასახელებით „[[:$1]]“ უკვე არსებობს. გსურთ მისი წაშლა გადატანისთვის ადგილის დასათმობად?",
        "delete_and_move_confirm": "დიახ, წაშალეთ ეს გვერდი",
        "delete_and_move_reason": "წაშლილია „[[$1]]“-დან გადატანისთვის ადგილის დასათმობად",
index a3291f4..46199ef 100644 (file)
        "morenotlisted": "Бұл тізім толық емес.",
        "mypage": "Жеке бет",
        "mytalk": "Талқылау",
-       "anontalk": "IP талқылауы",
+       "anontalk": "Талқылау",
        "navigation": "Бағыттау",
        "and": "&#32;және",
        "qbfind": "Табу",
        "changeemail-password": "{{SITENAME}} жобасындағы құпия сөзіңіз:",
        "changeemail-submit": "Е-поштаны өзгерту",
        "changeemail-throttled": "Сіз жақында кіруге тым көп әрекет жасадыңыз.\nҚайта байқап көру үшін $1 уақыт күте тұрыңыз.",
+       "changeemail-nochange": "Басқа жаңа email мекенжайын енгізіңіз.",
        "resettokens": "Байрақшаны ысыру",
        "resettokens-text": "Мұнда сіз құпия дерекке қатысты тіркелгіңізге қатынауға рұқсат ететін байрақшаны ысыра аласыз.\n\nЕгер сіздің тіркелгіңіз бұзылған болса, егер сіз абайсызда қандай да біреумен бөліссеңіз, сіз мұны істеуіңіз керек.",
        "resettokens-no-tokens": "Мұнда ысыруға байрақша жоқ.",
        "group-bot": "Боттар",
        "group-sysop": "Әкімшілер",
        "group-bureaucrat": "Бітікшілер",
-       "group-suppress": "ШеÑ\82Ñ\82еÑ\82Ñ\83Ñ\88Ñ\96леÑ\80",
+       "group-suppress": "Ð\91аÑ\81Ñ\82Ñ\8bÑ\80Ñ\83Ñ\88Ñ\8b",
        "group-all": "(барлық)",
        "group-user-member": "{{GENDER:$1|қатысушы}}",
        "group-autoconfirmed-member": "{{GENDER:$1|өздіктіқұпталған қатысушы}}",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|әкімші}}",
        "group-bureaucrat-member": "{{GENDER:$1|бітікші}}",
-       "group-suppress-member": "{{GENDER:$1|шеттетуші}}",
+       "group-suppress-member": "{{GENDER:$1|бастырушы}}",
        "grouppage-user": "{{ns:project}}:Қатысушылар",
        "grouppage-autoconfirmed": "{{ns:project}}:Өздіктіқұпталған қатысушылар",
        "grouppage-bot": "{{ns:project}}:Боттар",
        "grouppage-sysop": "{{ns:project}}:Әкімшілер",
        "grouppage-bureaucrat": "{{ns:project}}:Бітікшілер",
-       "grouppage-suppress": "{{ns:project}}:ШеÑ\82Ñ\82еÑ\82Ñ\83Ñ\88Ñ\96леÑ\80",
+       "grouppage-suppress": "{{ns:project}}:Ð\91аÑ\81Ñ\82Ñ\8bÑ\80Ñ\83",
        "right-read": "Беттерді оқу",
        "right-edit": "Беттерді өңдеу",
        "right-createpage": "Беттерді бастау (талқылау емес беттерді бастау)",
        "recentchangeslinked-page": "Бет атауы:",
        "recentchangeslinked-to": "Керісінше, келтірілген бетке сілтейтін беттердегі өзгерістерді көрсет",
        "recentchanges-page-added-to-category": "[[:$1]] бетіне санат қосты",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] және {{PLURAL:$2|бір бет|$2 бет}} санатқа қосылды",
+       "recentchanges-page-removed-from-category": "[[:$1]] санаттан алынды",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] және {{PLURAL:$2|бір бет|$2 бет}} санаттан алынды",
        "autochange-username": "МедиаУики өздікті өзгерісі",
        "upload": "Файл жүктеу",
        "uploadbtn": "Файлды жүктеу",
        "filerevert-legend": "Файлды қайтару",
        "filerevert-intro": "Сіз  '''[[Media:$1|$1]]''' дегенді [$3, $2 кезіндегі $4 нұсқасына] қайтарудасыз.",
        "filerevert-comment": "Себебі:",
-       "filerevert-defaultcomment": "$2, $1 кезіндегі нұсқасына қайтарылды",
+       "filerevert-defaultcomment": "$2, $1 ($3) кезіндегі нұсқасына қайтарылды",
        "filerevert-submit": "Қайтару",
        "filerevert-success": "'''[[Media:$1|$1]]''' деген [$3, $2 кезіндегі $4 нұсқасына] қайтарылды.",
        "filerevert-badversion": "Келтірілген уақыт белгісімен бұл файлдың алдыңғы жергілікті нұсқасы жоқ.",
        "unusedimages": "Пайдаланылмаған файлдар",
        "wantedcategories": "Басталмаған санаттар",
        "wantedpages": "Басталмаған беттер",
-       "wantedpages-summary": "Оларға тек бағыттап сілтейтін беттерді қоспағанда, өте көп сілтенген жоқ беттер тізімі. Оларға бағыттап жоқ беттерге сілтейтін тізім үшін келесі бетті қараңыз: [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Оларға тек бағыттап сілтейтін беттерді қоспағанда, өте көп сілтенген жоқ беттер тізімі. Оларға бағыттап жоқ беттерге сілтейтін тізім үшін келесі бетті қараңыз: [[{{#special:BrokenRedirects}}|бұзылған бағыттаулар тізімі]].",
        "wantedpages-badtitle": "Нәтиже жиынындағы жарамсыз атау: $1",
        "wantedfiles": "Басталмаған файлдар",
        "wantedfiletext-cat": "Келесі файлдар қолданылған бірақ жоқ. Бар болғанына қарамастан файлдар сыртқы қорларда тізімделген болуы мүмкін. Кез келген осындай жарамсыз боямалар <del>үстінен сызылып</del> белгіленеді. Сонымен қатар, бар емес файлдарды ендіру беттері [[:$1]] бетінде тізімделген.",
        "contributions": "{{GENDER:$1|Қатысушы}} үлестері",
        "contributions-title": "$1 есімді қатысушының үлесі",
        "mycontris": "Үлесім",
+       "anoncontribs": "Үлесім",
        "contribsub2": "{{GENDER:$3|$1}} ($2) үлесі",
        "contributions-userdoesnotexist": "«$1» қатысушы акаунты тіркелмеді.",
        "nocontribs": "Осы іздеу шартына сәйкес өзгерістер табылған жоқ.",
        "tooltip-pt-preferences": "Бапталымдарым",
        "tooltip-pt-watchlist": "Өзгерістерін бақылап тұрған беттер тізімім.",
        "tooltip-pt-mycontris": "Өңдеулеріңіздің тізімі",
+       "tooltip-pt-anoncontribs": "Бұл IP мекенжаймен жасаған өңдемелер тізімі",
        "tooltip-pt-login": "Кіруіңізді ұсынамыз, ол міндетті емес.",
        "tooltip-pt-logout": "Шығу",
        "tooltip-pt-createaccount": "Біз сізге есептік жазба бастауды және кіруді ұсынамыз,ол міндетті емес.",
index d5c037a..ada78c0 100644 (file)
@@ -16,6 +16,7 @@
        "tog-hideminor": "Dun de klein Mini-Änderonge (<strong>M</strong>) en de Leß met de „{{lcfirst:{{int:Recentchanges}}}}“ <strong>nit</strong> aanzeije",
        "tog-hidepatrolled": "Dun de nohjeloorte Änderunge en de „{{int:recentchanges}}“ eez ens <strong>nit</strong> aanzeije",
        "tog-newpageshidepatrolled": "Dun de nohjeloorte Änderunge en de Leß „{{int:newpages}}“ eez ens <strong>nit</strong> aanzeije",
+       "tog-hidecategorization": "Donn de Sigge nit ennohdene",
        "tog-extendwatchlist": "Verjrößer de Oppaßleß för jede Aat vun müjjeliche Ännderonge ze zeije, nit alleijns  de neuste.",
        "tog-usenewrc": "De Änderonge en de „{{int:Recentchanges}}“ un en de Oppaßleß en Jroppe zesammevaße.",
        "tog-numberheadings": "Dun de Üvverschrefte automatisch nummereere",
        "tog-watchlisthidebots": "Dun jedes Mohl dä Bots ehr Änderonge <strong>nit</strong> en minger Oppaßleß zeije",
        "tog-watchlisthideminor": "Donn jehdes Mohl de klein Mini-Ännderonge <strong>nit</strong> en minger Oppaßleß zeije",
        "tog-watchlisthideliu": "Enjeloggte Metmaacher ier Änderonge jehdesmohl <strong>nit</strong> en minger Oppaßleß aanzeije",
+       "tog-watchlistreloadautomatically": "Don de Oppaßleß automattesch neu lahde, wann ene Flter verändert wohd (bruch JavaSkrepp)",
        "tog-watchlisthideanons": "Nahmelohse Metmaacher ier Änderonge jehdesmohl <strong>nit</strong> en minger Oppaßleß aanzeije.",
        "tog-watchlisthidepatrolled": "Donn de nohjelohrte Oppaßleß et eez ens <strong>nit</strong> en minger Oppaßleß aanzeije.",
+       "tog-watchlisthidecategorization": "Donn de Sigge nit ennohdene",
        "tog-ccmeonemails": "Scheck mer en Kopie, wann ich en <i lang=\"en\">e-mail</i> an ene andere Metmaacher scheck",
        "tog-diffonly": "Zeich beim Versione Verjliche nur de Ungerscheide aan (ävver pack nit noch de janze Sigg dodronger)",
        "tog-showhiddencats": "Donn de verschtoche Saachjroppe aanzeije",
        "morenotlisted": "Et jeiht noch wigger&nbsp;…",
        "mypage": "Metmaachersigg",
        "mytalk": "Klaafsigg",
-       "anontalk": "Klaaf för de IP-Adress",
+       "anontalk": "Klaaf för ene nahmelohse Metmaacher",
        "navigation": "Jangk noh de",
        "and": ", un",
        "qbfind": "Fingk",
        "mypreferencesprotected": "Do häs nit dat Rääsch, Ding Enschtällonge ze verändere.",
        "ns-specialprotected": "{{int:nstab-special}}e künne mer nit ändere.",
        "titleprotected": "Di Övverschreff för en Sigg eß fum [[User:$1]] verbodde woode, un der Jrond wohr: ''„$2“''",
-       "filereadonlyerror": "Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeshtand „$2“ bloß för ze Lässe doh es.\n\nDä Wiki_Köbes dovun hät beim Deeschmaache als Jrond aanjejovve: „$3“",
+       "filereadonlyerror": "Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeshtand „$2“ bloß för ze Lässe doh es.\n\nDä Verantwootlesche doför hät beim Deeschmaache als Jrond aanjejovve: „$3“",
        "invalidtitle-knownnamespace": "„$3“ es en onjöltijje Övverschreff för em Appachtemang „$2“",
        "invalidtitle-unknownnamespace": "„$2“ es sn onjöltijje Övverschreff em onbikannte Appachtemang met dä Nommer $1",
        "exception-nologin": "Nit enjelogg",
        "wrongpasswordempty": "Dat Passwood ka'mer nit fottlooße. Jetz muss De et noch ens versöke.",
        "passwordtooshort": "En Paßwööter {{PLURAL:$1|moß|möße|moß}} winnichstens {{PLURAL:$1|ei|$1|kei}} Zeiche, {{PLURAL:$1|Zeffer|Zeffere|Zeffere}}, udder Bochstave dren sin.",
        "passwordtoolong": "Paßwööter künnne nit länge sin wi {{PLURAL:$1|ein|$1|Noll}} Zeische.",
+       "passwordtoopopular": "Esu en jewöhnejje Paßwööter nämme mer nit aan. Söhk Der jädd uß, wat nit jehder_ein alle nahßlangs nemmp.",
        "password-name-match": "Ding Poßwoot moß anders wi Dinge Name als ene Metmaacher sin.",
        "password-login-forbidden": "Dä Zohjang met däm Metmaacher-Name un däm Paßwoot es verbodde.",
        "mailmypassword": "Lohß jonn!",
        "rcshowhidemine": "ming eije Änderonge $1",
        "rcshowhidemine-show": "aanzeije",
        "rcshowhidemine-hide": "verschteihsche",
+       "rcshowhidecategorization": "De Sigge ier Ennohdenong $1",
        "rcshowhidecategorization-show": "Aanzeije!",
        "rcshowhidecategorization-hide": "Verschteische!",
        "rclinks": "Zeisch de läzde {{int:pipe-separator}}$1{{int:pipe-separator}} Änderonge us de läzde {{int:pipe-separator}}$2{{int:pipe-separator}} Däch, un dun {{int:pipe-separator}} $3.",
        "foreign-structured-upload-form-label-not-own-work-local-local": "Do künnts edd och ens met dä [[Special:Upload|Schtandatt-Sigg zom Huhlahde]] versöhke welle.",
        "foreign-structured-upload-form-label-own-work-message-default": "Esch verschtonn, dadd esch en en jemeinsamme Sammlong huh aam lahde ben un dadd sesch dat met dä Bedengonge un de Lezänzbedengonge heh verdräht.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteule huh lahde kanns un derbei de Rähjelle ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Wann dat noh dä Rähjelle doh jeiht, kanns De och probehre, [[Special:Upload|di Dattei {{GRAMMAR:em|{{ucfirst:{{SITENAME}}}}}} huhzelahde]]",
        "backend-fail-stream": "Mer kunnte di Dattei $1 nit övverdraare.",
        "backend-fail-backup": "Mer kunnte kein Sescherongskopih vun dä Dattei $1 maache.",
        "backend-fail-notexists": "En Dattei $1 jidd et nit.",
        "wlnote": "{{PLURAL:$1|Hee es de läzde Änderong uß|Hee sin de läzde <strong>$1</strong> Änderonge uß|Mer han kein Änderonge en}} de läzde {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.",
        "wlshowlast": "Zeisch de läzde $1 Schtunde, $2 Dähsch aan.",
        "watchlistall2": "all",
+       "watchlist-hide": "Verschtisch",
+       "wlshowhideminor": "klein Minni-Änderonge",
+       "wlshowhidebots": "de Bots ehr Änderonge",
+       "wlshowhideliu": "de ennjeloggte Metmaacher ier Änderonge",
+       "wlshowhideanons": "de nahmelohse Metmaacher ier Änderonge",
+       "wlshowhidepatr": "de nohjelohrte Änderonge",
+       "wlshowhidemine": "ming eije Änderonge",
        "watchlist-options": "Eijeschaffte fun de Oppassless",
        "watching": "Drobb oppaßße…",
        "unwatching": "Nimmih drobb oppaßße",
        "contributions": "{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm}} $1 {{GENDER:$1|singe|singe|singe|iere|singe}} Beijdrähsch",
        "contributions-title": "Beijdrähsch fum $1",
        "mycontris": "Beijdrähsch",
+       "anoncontribs": "Beijdrähsch",
        "contribsub2": "För {{GENDER:$3|dä|et|dä Metmaacher|de|dat}} $1: $1 ($2)",
        "contributions-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ ham_mer nit.",
        "nocontribs": "Mer han kein Änderunge jefonge, en de Logböcher, di do paße dähte.",
        "movenosubpage": "Di Sigg hät kei Ongersigge.",
        "movereason": "Aanlass:",
        "revertmove": "Et Ömnänne zerök_nämme",
-       "delete_and_move": "Fottschmieße un Ömnenne",
        "delete_and_move_text": "== Dä! Dubbelte Name ==\nDi Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg ömnenne ze künne?",
        "delete_and_move_confirm": "Jo, dun di Sigg fottschmieße.",
        "delete_and_move_reason": "Fottjeschmeße, öm di Sigg „[[$1]]“ ömbenänne ze künne.",
index 6f0a864..3e44785 100644 (file)
@@ -45,6 +45,7 @@
        "tog-watchlisthidebots": "Ascondi e modiffiche di bot da-a lista che tegno d'oeuggio",
        "tog-watchlisthideminor": "Ascondi e modiffiche menoî da-a lista che tegno d'oeuggio",
        "tog-watchlisthideliu": "Ascondi e modiffiche di utenti intræ da-a lista che tegno d'oeuggio",
+       "tog-watchlistreloadautomatically": "Recarrega aotomaticamente a lista di oservæ quande vegne cangiòu un filtro (ghe veu o JavaScript)",
        "tog-watchlisthideanons": "Ascondi e modiffiche di utenti anonnimi da-a lista che tegno d'oeuggio",
        "tog-watchlisthidepatrolled": "Ascondi e modiffiche za controllæ da-a lista che tegno d'oeuggio",
        "tog-watchlisthidecategorization": "Ascondi a categorizzassion de paggine",
        "morenotlisted": "Questa lista a no l'è completa.",
        "mypage": "Paggina",
        "mytalk": "Discuscioin",
-       "anontalk": "Discuscion pe questo indirisso IP",
+       "anontalk": "Discuscion pe questo addresso IP",
        "navigation": "Navegaçión",
        "and": "&#32;e",
        "qbfind": "Attrêuva",
        "viewhelppage": "Vizualizza a paggina d'agiutto",
        "categorypage": "Veddi a paggina da categoria",
        "viewtalkpage": "Veddi o ciæto",
-       "otherlanguages": "In âtre lengóe",
+       "otherlanguages": "In âtre lengoe",
        "redirectedfrom": "(Rendirissou da $1)",
        "redirectpagesub": "Paggina de rindirissamento",
        "redirectto": "Rendirissa a:",
        "wrongpasswordempty": "No ti g'hæ scrîo nisciûnn-a paròlla d'ordine. Tenta torna.",
        "passwordtooshort": "E password devan aveighe aomanco {{PLURAL:$1|1 carattere|$1 caratteri}}.",
        "passwordtoolong": "A poula segretta a no peu contegnî ciù de {{PLURAL:$1|1 carattere|$1 caratteri}}.",
+       "passwordtoopopular": "No se peu deuviâ de paole segrette troppo ordenaie. Pe piaxei çernitene un-a ciu particolâ.",
        "password-name-match": "A password a dev'ese despægia da-o nomme utente.",
        "password-login-forbidden": "L'utilizzo de sto nomme utente e password o l'è stæto proibio.",
        "mailmypassword": "Reimposta a poula segretta",
        "invalidemailaddress": "L'adresso e-mail indicòu o l'ha un formato non vallido. Inseisci un adresso valido o donque sveua a casella.",
        "cannotchangeemail": "I adressi e-mail no peuan ese modificæ in sce sto wiki.",
        "emaildisabled": "Sto scito o no peu inviâ messaggi de posta eletronnica.",
-       "accountcreated": "Graçie pe esëte registroö!!!",
+       "accountcreated": "Graçie pe êsite registròu!",
        "accountcreatedtext": "L'utensa pe [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]) a l'é stæta creâ.",
        "createaccount-title": "Creaçion de 'n conto pe {{SITENAME}}",
        "createaccount-text": "Quarcun o l'ha creòu un utensa pe quest'adresso e-mail a {{SITENAME}} ($4) a nomme de $2, co-a poula segretta \"$3\".\nTi doviesci intrâ e cangiâ subbito a to poula segretta.\n\nSe quest'utensa a l'è stæta creâ pe sballio, no stanni a dâ a mente a sto messaggio.",
        "passwordreset-capture-help": "Se ti seleçion-i sta casella, l'e-mail (co-a poula segretta temporannia), o saiâ mostròu a ti, oltre ch'a ese inviòu a l'utente.",
        "passwordreset-email": "Addresso e-mail:",
        "passwordreset-emailtitle": "Dettaggi account sciu {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Quarcun (probabilmente ti, con adresso IP $1) o l'ha domandòu l'invio de 'na neuva poula segretta per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associòu|I utenti associæ}} a sto addresso e-mail son:\n\n$2\n\n{{PLURAL:$3|Questa poula segretta temporannia a descazziâ|Queste poule segrette temporannie descazzian}} doppo {{PLURAL:$5|un giorno|$5 giorni}}.\nTi doviesci accede e çerne una neuva poula segretta oua. \n\nSe no t'ê stæto t a fâ a domanda, ò se ti t'ê aregordòu a poula segretta originale e no ti veu ciù cangiala, ti peu ignorâ sto messaggio e continuâ a deuviâ a teu vegia poula segretta.",
+       "passwordreset-emailtext-ip": "Quarcun (probabilmente ti, con adresso IP $1) o l'ha domandòu l'invio de 'na neuva poula segretta per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associòu|I utenti associæ}} a sto addresso e-mail son:\n\n$2\n\n{{PLURAL:$3|Questa poula segretta temporannia a descazziâ|Queste poule segrette temporannie descazzian}} doppo {{PLURAL:$5|un giorno|$5 giorni}}.\nTi doviesci accede e çerne una neuva poula segretta oua. \n\nSe no t'ê stæto ti a fâ a domanda, ò se ti t'hæ aregordòu a poula segretta originale e no ti veu ciù cangiâla, ti peu ignorâ sto messaggio e continuâ a deuviâ a teu vegia poula segretta.",
        "passwordreset-emailelement": "Nomme utente: \n$1\n\nPoula segretta temporannia: \n$2",
        "passwordreset-emailsent": "Se questo o l'è un addresso de posta elettronnica registròu pe-a teu utensa, alloa saiâ inviâ un'e-mail pe reimpostâ a poula segretta.",
        "passwordreset-emailsent-capture": "L'è stæto inviòu un'e-mail de reimpostaçion da poula segretta, o contegnuo o l'è riportòu chì appreuvo.",
        "anontalkpagetext": "----\n''Sta chì a l'è a paggina de discuscion de un utente anonnimo, ch'o no l'ha ancon creou un'utensa o comunque o no a doeuvia oua. Pe identificâlo l'è quindi necessaio doeuviâ o nummero do so adresso IP. I adresci IP poeuan però ese condivixi da ciù utenti. Se t'ê un utente anonimo e ti ritegni che i commenti inte sta pagina no se riferiscian a ti, [[Special:UserLogin/signup|crea una noeuva utensa]] o donque [[Special:UserLogin|intra con quella che ti g'hæ za]] pe evitâ de chì avanti de ese confuzo con di atri utenti anonnimi .''",
        "noarticletext": "Po-u momento a pagina çercâ a l'è vêua. L'è poscibbile [[Special:Search/{{PAGENAME}}|çercâ 'sto tittolo]] inte âtre pagine do scîto opû [{{fullurl:{{FULLPAGENAME}}|action=edit}} cangiâ a pagina òua].",
        "noarticletext-nopermission": "Òua a pàgina çercâ a l'è vêua. L'è poscìbile [[Special:Search/{{PAGENAME}}|çercâ sto tìtolo]] inte di âtre pàgine do scîto o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri corelæ]</span>, ma no ti gh'hæ i outorizzaçioin pe creâ sta paggina.",
+       "missing-revision": "La verscion #$1 da paggina \"{{FULLPAGENAME}}\" a no l'esiste.\n\nQuesto succede solitamente se inta stoia ti sciacchi un vegio ingancio a una paggina scassâ.\n\nI dettaggi peuan ese attrovæ into [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scançellaçioin].",
+       "userpage-userdoesnotexist": "L'utensa \"$1\" a no corisponde a un utente registròu.\nTi veu davei creâ o modificâ sta paggina?",
        "userpage-userdoesnotexist-view": "L'utensa \"$1\" a no l'è registrâ.",
+       "blocked-notice-logextract": "St'utente o l'è attualmente bloccòu.\nL'urtimo elemento into registro di blocchi o l'è riportòu chì appreuvo pe informassion:",
+       "clearyourcache": "<strong>Notta:</strong> doppo avei sarvou, poriæ ese necessaio nettezâ a cache do proppio navegatô pe vedde i cangiamenti. \n*<strong>Firefox / Safari:</strong> tegnî sciacou o tasto de maiuscole <em>Shift</em> e cliccâ <em>Riecarrega</em>, oppû premme <em>Ctrl-F5</em> ò <em>Ctrl-R</em> (<em>⌘-R</em> insce Mac)\n*<strong>Google Chrome:</strong> premme <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> insce un Mac)\n*<strong>Internet Explorer:</strong> tegnî sciacou o tasto <em>Ctrl</em> e cliccâ <em>Aggiorna</em>, oppû premme <em>Ctrl-F5</em>\n*<strong>Opera:</strong> svuâ completamente a cache da-o menu <em>Strumenti → Preferençe</em>",
+       "usercssyoucanpreview": "'''Suggerimento:''' adeuvia o pomello 'Amia l'anteprimma' per provâ o to neuvo CSS primma de sarvâlo.",
+       "userjsyoucanpreview": "'''Suggerimento:''' adeuvia o pomello 'Amia l'anteprimma' per provâ o to neuvo JavaScript primma de sarvâlo.",
+       "usercsspreview": "'''Questa a l'è solo un'anteprimma do proppio CSS personâ. E modiffiche no son ancon stæte sarvæ!'''",
+       "userjspreview": "'''Questa a l'è solo un'anteprimma do proppio  JavaScript personâ. E modiffiche no son ancon stæte sarvæ!'''",
+       "sitecsspreview": "'''Questa a l'è solo un'anteprimma do CSS. E modiffiche no son ancon stæte sarvæ!'''",
+       "sitejspreview": "'''Questa a l'è solo un'anteprimma pe provâ o JavaScript; e modiffiche no son ancon stæte sarvæ!'''",
+       "userinvalidcssjstitle": "<strong>Attension:</strong> no existe arcun tema con nomme \"$1\". E paggine pe-i .css e .js personalizzæ g'han o tittolo minuscolo, presempio {{ns:user}}:Esempio/vector.css e no {{ns:user}}:Esempio/Vector.css.",
+       "updated": "(Aggiornòu)",
+       "note": "'''Notta:'''",
        "previewnote": "'''Questa chì a l'è solo 'n'anteprimma; i cangiamenti no son ancon stæti sarvæ!'''",
+       "continue-editing": "Vanni a l'area de modiffica",
+       "previewconflict": "L'anteprimma a mostra o scrito presente inta casella de modiffica de d'ato coscì comme o l'apaiâ se ti çerni de sarvalo òua.",
+       "session_fail_preview": "'''N'emmo posciuo elaborâ a modiffica a caosa da pèrdia di dæti relativi a-a sescion.'''\nRitenta.\nSe-o problema o persciste, preuva a [[Special:UserLogout|sciortî]] e a intrâ torna.'''",
+       "edit_form_incomplete": "'''De parte do formulaio de modiffica n'han razonto o server; controlla che e modiffiche seggian intatte e ripreuva.'''",
        "editing": "Modiffica de $1",
        "creating": "T'ê apreuvo a creâ $1",
        "editingsection": "Càngio de $1 (seçión)",
+       "editingcomment": "Càngio de $1 (neuva seçion)",
+       "editconflict": "Conflito d'ediçion: $1",
+       "explainconflict": "Un atro utente o l'ha sarvòu una neuva verscion da paggina de mentre che t'êi apreuvo a cangiâla.\nA casella de modiffica de d'ato a conten o scrito da paggina coscì comm'o l'è òua.\nE teu modiffiche son invece mostræ inta casella de modiffica de sotta.\nTi g'hæ da stramuâ e teu modiffiche inta casella de d'ato.\nSciaccando o pomello '{{int:savearticle}}', o saiâ sarvòu '''solo''' o scrito contegnuo inta casella de d'ato.",
        "yourtext": "O teu testo",
+       "storedversion": "La verscion memorizzâ",
+       "nonunicodebrowser": "'''Attençion: o teu navegatô o no l'è compatibbile co-i caratteri Unicode.''' Pe consentî a modiffica de paggine sença problemi, i caratteri non ASCII saian vixualizzæ inta casella de modiffica sotto forma de codiçi esadeximæ.'''",
+       "editingold": "<strong>Attençion: t'ê apreuvo a modificâ una verscion non aggiornâ da paggina.</strong>\nSarvandola coscì, tutti i cangi fæti doppo sta verscion saian sorvescriti.",
        "yourdiff": "Differense",
        "copyrightwarning": "Nota: Tùtte e contribuçioìn a {{SITENAME}} van conscideræ comme rilasciæ drento a-i termini da licensa d'ûso $2 (veddi $1 pe savéine de ciù).\nSe no ti veu che i testi teu pêuan esse modificæ da quarchedùn sensa limitaçioìn, no mandâli a {{SITENAME}}.<br />\nInviando o testo ti diciâri, sott'a teu responsabilitæ, ch'o l'é stæto scrîto da ti personalmente oppure ch'o l'é stæto piggiòu da 'na fonte de pùbrico domìnio òu anàlogamente lìbea.<br />\n'''NO INVI MATERIÂLE COVERTO DA DRÎTI D'AUTÔ SENSA OUTORIZAÇION!'''",
+       "editpage-cannot-use-custom-model": "O modello do contegnuo de sta paggina o no peu ese modificòu.",
+       "longpageerror": "'''Errô: o scrito inviou o l'è longo {{PLURAL:$1|1|$1}} kilobyte, ciu che-o mascimo consentio de ({{PLURAL:$2|1|$2}} kilobyte).'''\nNo se peu sarvâ.",
+       "protectedpagewarning": "'''Attençion: questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificala.'''\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referença:",
+       "semiprotectedpagewarning": "'''Notta:''' Questa paggina a l'è stæta bloccä de moddo che solo i utenti registræ possan modificâla.\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referensa:",
+       "cascadeprotectedwarning": "'''Attençion:''' Questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificala da-o momento ch'a l'é inclusa seleçionando a proteçion \"ricorsciva\" {{PLURAL:$1|inta paggina|inte paggine}}:",
+       "titleprotectedwarning": "'''Attension: Questa paggina a l'è stæta bloccâ de moddo che seggian necessai [[Special:ListGroupRights|di driti speciffichi]] pe creâla.'''\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referensa:",
        "templatesused": "{{PLURAL:$1|Template dêuviòu|Template dêuviæ}} in sta pàgina:",
-       "templatesusedpreview": "Template dêuviæ inte 'st'anteprimma:",
+       "templatesusedpreview": "{{PLURAL:$1|Template deuviou|Template deuviæ}} in te st'anteprimma:",
+       "templatesusedsection": "{{PLURAL:$1|Template deuviòu|Template deuviæ}} in questa seçion:",
        "template-protected": "(protezûo)",
        "template-semiprotected": "(semiprotezûo)",
        "hiddencategories": "Sta pàgina a fa parte de {{PLURAL:$1|1 categoria ascoza|$1 categorie ascoze}}:",
        "nocreatetext": "A poscibilitæ de creâ nêuve paggine insce {{SITENAME}} a l'è stæta limitâ solo a-i ûtenti registræ.\nSe pêu tornâ inderê e modificâ 'na paggina existente, oppûre [[Special:UserLogin|intrâ ò creâ 'n accesso nêuvo]].",
+       "nocreate-loggedin": "No ti g'hæ i permissi pe creâ de paggine neuve.",
+       "sectioneditnotsupported-title": "Modiffica de seçioin non supportâ",
+       "sectioneditnotsupported-text": "A modiffica de seçioin a no l'è supportâ in questa paggina.",
+       "permissionserrors": "No ti g'hæ o permisso",
+       "permissionserrorstext": "No ti g'hæ i permissi pe fâlo, pe  {{PLURAL:$1|questa raxon|queste raxoin}}:",
        "permissionserrorstext-withaction": "No ti g'hæ i permìssi pe $2 pe {{PLURAL:$1|sta raxon|ste raxoìn}}:",
+       "contentmodelediterror": "No ti peu modificâ sta verscion da-o momento che o so modello de contegnuo o l'è <code>$1</code>, mentre o corrente modello de contegnuo da paggina o l'è <code>$2</code>.",
        "recreate-moveddeleted-warn": "Atençión: ti stæ pe ricreâ 'na pàgina zà scancelâ into passòu.'''\n\nConsciddera se l'è o caxo de continoâ  a cangiâ 'sta pàgina.\nPe comoditæ e cancellaçioìn e i stramui son pubricæ chì sotta:",
        "moveddeleted-notice": "Sta pàgina a l'é stæta scancelâ.\nA lista de scancelaçioìn e di stramui son riportæ chi de sotta pe informaçión.",
+       "moveddeleted-notice-recent": "Spiaxenti, sta paggina a l'è stæta scassâ reçentemente (inte urtime 24 oe).\n\nE açioin de cançellaçion e spostamento pe questa paggina son disponibile chì appreuvo pe referença.",
+       "log-fulllog": "Amîa o log completo",
+       "edit-hook-aborted": "A modifica a l'è stæta annullâ da l'hook.\nO no l'ha dæto arcun-a spiegassion.",
+       "edit-gone-missing": "Imposcibbile aggiornâ a paggina.\nPâ ch'a segge stæta scassâ.",
+       "edit-conflict": "Conflito d'ediçion.",
+       "edit-no-change": "A modiffica a l'è stæta ignorâ za che o scrito o no l'è cangiòu.",
+       "postedit-confirmation-created": "A paggina a l'è stæta creâ.",
+       "postedit-confirmation-restored": "A paggina a l'è stæta ripristinâ.",
+       "postedit-confirmation-saved": "A modiffica a l'è stæta sarvâ.",
+       "edit-already-exists": "Imposcibbile creâ una neyva paggina.\nA l'existe zà.",
+       "defaultmessagetext": "Scrito do messaggio predefinio",
+       "content-failed-to-parse": "Imposcibbile analizzâ $2 pe-o modello $1: $3",
+       "invalid-content-data": "Dæti contegnui non vallidi",
+       "content-not-allowed-here": "Contegnuo in \"$1\" non consentio inta paggina [[$2]]",
+       "editwarning-warning": "Lasciâ sta paggina porriæ caosâ a perdia de tutte e modiffiche fæte.\nSe ti t'hê introu, ti peu disattivâ st'aviso inta seçion \"{{int:prefs-editing}}\" de teu preferençe.",
+       "editpage-notsupportedcontentformat-title": "Formato contegnuo non supportou",
+       "editpage-notsupportedcontentformat-text": "O formato do contegnuo $1 o no l'è supportou da-o modello de contegnuo $2.",
+       "content-model-wikitext": "wikitesto",
+       "content-model-text": "testo normale",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Ogetto veuo",
+       "content-json-empty-array": "Array veuo",
+       "duplicate-args-warning": "<strong>Avvertensa:</strong> [[:$1]] o ciamma [[:$2]] con ciù de un valô pe-o parammetro \"$3\".  Solo l'urtimo valô fornio o saiâ deuviou.",
+       "duplicate-args-category": "Paggine che ciamman i template deuviando di parammetri duplicæ",
+       "duplicate-args-category-desc": "A paggina a conten de ciamæ a di template ch'adeuvian di argomenti duplicæ, comme presempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ò <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "'''Attençion:''' Questa paggina a conten troppe ciamæ a-e fonçioin de parser .\n\nA doviæ aveighene meno de $2, a-o momento ghe n'è $1.",
+       "expensive-parserfunction-category": "Paggine con troppe ciamæ a-e fonçioin de parser .",
        "post-expand-template-inclusion-warning": "'''Atento:''' a dimensción di template che t'æ misso a l'é tròppo grande.\nQuarchedun di teu template o no saiâ incluzo.",
        "post-expand-template-inclusion-category": "Pàgine con di template che gh'àn a dimensción ciù âta do limite mascimo",
        "post-expand-template-argument-warning": "'''Atençión:''' sta pàgina a contegne un ò ciù argomenti di template che son tròppo gràndi pe êse espansi. Sti argomenti no saiàn fæti védde.",
        "post-expand-template-argument-category": "Pàgine con di template che ghe mancàn di argoménti",
+       "parser-template-loop-warning": "Rilevou loop do template: [[$1]]",
+       "parser-template-recursion-depth-warning": "Limmite de ricorscion into template superòu($1)",
+       "language-converter-depth-warning": "Limmite de profonditæ do convertitô de lengoa superòu ($1)",
+       "node-count-exceeded-category": "Paggine dovve l'è superòu o nummero di groppi.",
+       "node-count-exceeded-category-desc": "A paggina suppera o nummero mascimo de groppi.",
+       "node-count-exceeded-warning": "Sta paggina a l'ha superòu o nummero di groppi.",
+       "expansion-depth-exceeded-category": "Paggine inte quæ s'è superòu a profonditæ d'espanscion",
+       "expansion-depth-exceeded-category-desc": "A paggina a suppera a profonditæ mascima d'espanscion.",
+       "expansion-depth-exceeded-warning": "Sta paggine a l'ha superòu a profonditæ d'espanscion",
+       "parser-unstrip-loop-warning": "Rilevou ciclo de Unstrip",
+       "parser-unstrip-recursion-limit": "Superæ i limmiti de ricorscion de Unstrip ($1)",
+       "converter-manual-rule-error": "Rilevou errô inta reggola manoâ de converscion da lengoa",
+       "undo-success": "Questa modiffica a peu ese anullâ.\nControlla e differençe mostræ chì de sotta fra e doe verscioin pe ese seguo che-o contegnuo o corisponde a quante dexidiou, e quindi sarvâ e modiffiche pe completâ a proçedûa d'anullamento.",
+       "undo-failure": "Imposcibbile anullâ a modiffica a caosa de un conflito con de modiffiche intermeddie.",
+       "undo-norev": "A modiffica a no peu ese anullâ perché a no l'existe ò donque a l'è stæta scassâ.",
+       "undo-nochange": "Pâ che-a modiffica a sæ zà stæta anullâ.",
+       "undo-summary": "Annullou a modiffica $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discuscion]])",
+       "undo-summary-username-hidden": "Anullou a modiffica $1 de un utente ascoso",
        "cantcreateaccounttitle": "Non se peu registrâ l'utente",
        "cantcreateaccount-text": "A registrassion da questo addresso IP (<b>$1</b>) a l'è stæta bloccâ da [[User:$3|$3]].\n\nA raxon dæta a l'è ''$2''",
+       "cantcreateaccount-range-text": "A registraçion da di addressi IP inte l'intervallo '''$1''', ch'o  l'includde o teu ('''$4'''), a l'è stæta bloccâ da [[User:$3|$3]].\n\nA raxon dæta da $3 a l'è ''$2''",
        "viewpagelogs": "Veddi i log relativi a 'sta paggina.",
+       "nohistory": "A stoia de verscioin de sta paggina a no gh'è.",
        "currentrev": "Verscion attuâle",
        "currentrev-asof": "Ùrtima revixón do $1",
        "revisionasof": "Verscion do $1",
        "history-show-deleted": "Sôlo scancelæ",
        "histfirst": "primma",
        "histlast": "urtima",
+       "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "historyempty": "(vêua)",
        "history-feed-title": "Stöia de revixioin",
+       "history-feed-description": "Stoia da paggina insce sto scito",
        "history-feed-item-nocomment": "$1 o $2",
+       "history-feed-empty": "A paggina domandâ a no l'existe; porriæ ese stæta scassâ da-o scito o rinominâ. Amîa inta [[Special:Search|paggina de riçerca]] se ghe ne foise de neuve.",
+       "history-edit-tags": "Modiffica i etichette de verscioin seleçionæ",
+       "rev-deleted-comment": "(Ogetto da modiffica rimosso)",
+       "rev-deleted-user": "(nomme utente rimosso)",
+       "rev-deleted-event": "(dettaggi do registro rimossi)",
+       "rev-deleted-user-contribs": "[nomme utente ò addresso IP rimosso - modiffica ascosa da-a stoia]",
+       "rev-deleted-text-permission": "Questa verscion da paggina a l'è stæta '''scassâ'''.\nConsurta o [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log de cançellaçioin] pe-i dettaggi.",
+       "rev-suppressed-text-permission": "Questa verscion da paggina a l'è stæta '''sopressa'''.\nConsurta a [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lista de soprescioin] pe-i dettaggi.",
+       "rev-deleted-text-unhide": "Questa verscion da paggina a l'è stæta '''scassâ'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.\nA-i aministratoî l'è ancon consentio de [$1 visualizzâ sta verscion] se necessaio.",
+       "rev-suppressed-text-unhide": "Questa verscion da paggina a l'è stæta '''rimossa'''.\nConsurta a [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} lista de rimoçion] pe-i dettaggi.\nA-i aministratoî l'è ancon consentio de [$1 visualizzâ sta verscion] se necessaio.",
+       "rev-deleted-text-view": "Questa verscion da paggina a l'è stæta '''scassâ'''.\nTi ti peu amiala; consurta a [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} lista de rimoçion] pe-i dettaggi.",
+       "rev-suppressed-text-view": "Questa verscion da paggina a l'è stæta '''sopressa'''.\nTi ti peu amiâla; consurta a [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lista de soprescioin] pe-i dettaggi.",
+       "rev-deleted-no-diff": "No ti peu amiâ sto diff percose un-a de verscioin a l'è stæta '''scassâ'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.",
+       "rev-suppressed-no-diff": "No ti peu fâ sto confronto tra verscioin perché un-a a l'è stæta '''scassâ'''.",
+       "rev-deleted-unhide-diff": "Un-a de verscioin de sto confronto a l'è stæta '''scassâ'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.\nTi ti peu ancon [$1 fâ sto confronto] se necessaio.",
        "rev-delundel": "fanni védde/ascondi",
+       "rev-showdeleted": "mostra",
        "revdelete-radio-set": "Sci",
        "revdel-restore": "càngia a vixibilitæ",
+       "mergehistory-from": "Paggina d'origgine:",
+       "mergehistory-into": "Paggina de destinaçion:",
+       "mergehistory-list": "Stoia a-a quæ se peu applicâ l'union",
+       "mergehistory-merge": "L'è poscibbile unî e verscioin de [[:$1]] indicæ chì appreuvo a-a stoia de [[:$2]]. Deuvia a colonna co-i pomelli de opçion pe unî tutte e verscioin scin a-a dæta e oa indicæ. \nNotta che deuviando i pomelli de navegaçion, sta colonna a saiâ azerâ.",
+       "mergehistory-go": "Mostra e modiffiche che peuan ese unie",
+       "mergehistory-submit": "Unisci e verscioin",
+       "mergehistory-empty": "Nisciun-a verscion da unî.",
+       "mergehistory-done": "{{PLURAL:$3|Una verscion de $1 a l'è stæta unia|$3 vercsioin de $1 son stæte unie}} a-a stoia de [[:$2]].",
+       "mergehistory-fail": "Imposcibbile unî e stoie. Verificâ a paggina e i parammetri temporali.",
+       "mergehistory-fail-toobig": "Imposcibbile eseguî l'union da stoia essendoghe ciu che o limmite de $1 {{PLURAL:$1|verscion|verscioin}} da mesciâ.",
+       "mergehistory-no-source": "A paggina d'origgine $1 a no l'existe.",
+       "mergehistory-no-destination": "A paggina de destinaçion $1 a no l'existe.",
+       "mergehistory-invalid-source": "A paggina d'origgine a deve aveighe un tittolo vallido.",
+       "mergehistory-invalid-destination": "A paggina de destinaçion a deve aveighe un tittolo vallido.",
+       "mergehistory-autocomment": "Union de [[:$1]] in [[:$2]]",
+       "mergehistory-comment": "Union de [[:$1]] in [[:$2]]: $3",
+       "mergehistory-same-destination": "A paggina d'origgine e quella de destinaçion no peuan ese a mæxima",
+       "mergehistory-reason": "Raxon:",
+       "mergelog": "Unioin",
        "revertmerge": "Anùlla union",
+       "mergelogpagetext": "Chì de sotta 'na lista di urtime unioin de 'na stoia co-in atra",
        "history-title": "Stöia de revixoìn de \"$1\"",
        "difference-title": "$1: differense tra e verscioin",
+       "difference-title-multipage": "$1 e $2: differençe tra-e paggine",
+       "difference-multipage": "(Differençe tra-e paggine)",
        "lineno": "Linia $1:",
        "compareselectedversions": "Confronta e verscioîn selessionæ",
+       "showhideselectedversions": "Mostra/ascondi verscioin seleçionæ",
        "editundo": "Anùlla",
+       "diff-empty": "(Nisciun-a diferença)",
        "diff-multi-sameuser": "({{PLURAL:$1|Una verscion intermedia|$1 De verscioin intermedie}} de 'n mæximo utente {{PLURAL:$1|a no l'è mostrâ|no son mostræ}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Una verscion intermedia|$1 De verscioin intermedie}} de {{PLURAL:$2|'n atro utente|$2 utenti}} {{PLURAL:$1|a no l'è mostrâ|no son mostræ}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|Una verscion intermedia|$1 verscioin intermedie}} de ciu che $2 {{PLURAL:$2|utente|utenti}} non {{PLURAL:$1|mostrâ|mostræ}})",
        "searchresults": "Resultati da reçerca",
        "searchresults-title": "Rezoltati da riçerca de \"$1\"",
+       "titlematches": "Corispondençe into tittolo de paggine",
+       "textmatches": "Corispondençe into scrito de paggine",
+       "notextmatches": "Nisciun-a corispondença into scrito de paggine",
        "prevn": "Precedenti {{PLURAL:$1|$1}}",
        "nextn": "Proscima {{PLURAL:$1|$1}}",
+       "prev-page": "paggina precedente",
+       "next-page": "paggina succesciva",
        "prevn-title": "{{PLURAL:$1|rezoltato precedénte|rezoltati precedénti}}",
        "nextn-title": "Pròscimo $1 {{PLURAL:$1|rezoltato|rezoltati}}",
        "shown-title": "Fanni védde {{PLURAL:$1|in rizoltato|$1 rizoltati}} pe pàgina",
        "search-result-category-size": "{{PLURAL:$1|1 utente|$1 utenti}} ({{PLURAL:$2|1 sottocategoria|$2 sottocategorie}}, {{PLURAL:$3|1 file|$3 file}})",
        "search-redirect": "(redirect $1)",
        "search-section": "(seçión $1)",
+       "search-category": "(categoria $1)",
+       "search-file-match": "(corrispondença into contegnuo do file)",
        "search-suggest": "Fòscia ti voéivi: $1",
+       "search-rewritten": "Mostro i risultæ pe $1. Atrimenti, çerca $2.",
+       "search-interwiki-caption": "Progetti fræ",
+       "search-interwiki-default": "Risultæ da $1:",
+       "search-interwiki-more": "(atro)",
+       "search-relatedarticle": "corelæ",
        "searchrelated": "corelæ",
        "searchall": "tùtti",
        "search-showingresults": "{{PLURAL:$4|Risultou <strong>$1</strong> de <strong>$3</strong>|Risultæ <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Mi n'ho atrovòu ninte",
+       "search-nonefound-thiswiki": "Mi n'ho atrovòu ninte",
+       "powersearch-legend": "Riçerca avançâ",
+       "powersearch-ns": "Çerca inti namespace:",
+       "powersearch-togglelabel": "Seleçion-a:",
+       "powersearch-toggleall": "Tutti",
+       "powersearch-togglenone": "Nisciun",
+       "powersearch-remember": "Aregordite a seleçion pe-e proscime riçerche",
+       "search-external": "Riçerca esterna",
+       "search-error": "S'è verificou 'n errô durante a riçerca: $1",
        "preferences": "Preferençe",
        "mypreferences": "Preferençe",
+       "prefs-edits": "Modiffiche effettuæ:",
+       "prefsnologintext2": "Pe modificâ e teu preferençe l'è necessaio effettuâ l'intrata.",
        "skin-preview": "Anteprimma",
+       "datedefault": "Nisciun-a preferença",
+       "prefs-labs": "Fonçionalitæ sperimentale",
+       "prefs-user-pages": "Paggine utente",
+       "prefs-personal": "Profî utente",
+       "prefs-rc": "Ùrtimi cangiamenti",
+       "prefs-watchlist": "Sotta oservaçion",
+       "prefs-editwatchlist": "Modiffica a lista sotta oservaçion",
+       "prefs-editwatchlist-label": "Modiffica e paggine da teu lista sotta oservaçion:",
+       "prefs-editwatchlist-edit": "Amia e rimeuvi tittoli in sciâ teu lista sotta oservaçion",
+       "prefs-editwatchlist-raw": "Modiffica a lista sotta oservaçion in formato testo",
+       "prefs-editwatchlist-clear": "Scassa a teu lista sotta oservaçion",
+       "prefs-watchlist-days": "Nummero de giorni da fâ vedde inta lista sotta oservaçion",
+       "prefs-watchlist-days-max": "Mascimo $1 {{PLURAL:$1|giorno|giorni}}",
+       "prefs-watchlist-edits": "Nummero de cangi da fâ vedde co-e fonçioin avançæ:",
+       "prefs-watchlist-edits-max": "Nummero mascimo: 1000",
+       "prefs-watchlist-token": "Token lista sotta oservaçion:",
+       "prefs-misc": "Varrie",
+       "prefs-resetpass": "Cangia a pòula segretta",
+       "prefs-changeemail": "Cangia ò rimeuvi l'adresso e-mail",
+       "prefs-setemail": "imposta un adresso email",
+       "prefs-email": "Opçioin email",
+       "prefs-rendering": "Aspetto",
        "saveprefs": "Sarva",
+       "restoreprefs": "Ripristina e impostaçioin predefinie (in tutte e seçioin)",
        "prefs-editing": "Cangia",
+       "rows": "Righe:",
+       "columns": "Colonne:",
        "searchresultshead": "Çerca",
-       "timezonelegend": "Oùa",
+       "stub-threshold": "Limmite pe-i collegamenti a-i sboççi ($1):",
+       "stub-threshold-sample-link": "esempio",
+       "stub-threshold-disabled": "disattivou",
+       "recentchangesdays": "Nummero de giorni da mostrâ inti urtime modiffiche:",
+       "recentchangesdays-max": "Mascimo $1 {{PLURAL:$1|giorno|giorni}}",
+       "recentchangescount": "Nummero de modiffiche da mostrâ pe difetto:",
+       "prefs-help-recentchangescount": "Comprende i urtime modiffiche, paggine de stoie e registri.",
+       "savedprefs": "E teu preferençe son stæte sarvæ.",
+       "savedrights": "I driti utente de {{GENDER:$1|$1}} son stæti sarvæ.",
+       "timezonelegend": "Fuso oraio:",
+       "localtime": "Oa locale:",
        "allowemail": "Permitti a posta elettronega da ätri utenti",
        "default": "Predefinïo",
        "prefs-files": "File",
        "contributions": "Contribuçioin {{GENDER:$1|utente}}",
        "contributions-title": "Contribuçioìn de $1",
        "mycontris": "Contribuçioin",
+       "anoncontribs": "Contribuçioin",
        "contribsub2": "Pe $1 ($2)",
        "uctop": "(ûrtima pe-a paggina)",
        "month": "Partindo da-o meize (e precedénti):",
index ee56860..ec11c5d 100644 (file)
        "morenotlisted": "Šis sąrašas nėra išsamus.",
        "mypage": "Puslapis",
        "mytalk": "Aptarimas",
-       "anontalk": "Šio IP aptarimas",
+       "anontalk": "Aptarimas",
        "navigation": "Naršymas",
        "and": "&#32;ir",
        "qbfind": "Paieška",
        "contributions": "{{GENDER:$1|Naudotojo}} indėlis",
        "contributions-title": "{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis",
        "mycontris": "Įnašai",
+       "anoncontribs": "Įnašai",
        "contribsub2": "Dėl {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Naudotojo paskyra „$1“ neužregistruota.",
        "nocontribs": "Jokie keitimai neatitiko šių kriterijų.",
        "tooltip-pt-preferences": "Mano nustatymai",
        "tooltip-pt-watchlist": "Puslapių sąrašas, kuriuos jūs pasirinkote stebėti",
        "tooltip-pt-mycontris": "Jūsų darytų keitimų sąrašas",
+       "tooltip-pt-anoncontribs": "Keitimų sąrašas, padarytų iš šio IP adreso",
        "tooltip-pt-login": "Rekomenduojame prisijungti, nors tai nėra privaloma",
        "tooltip-pt-logout": "Atsijungti",
        "tooltip-pt-createaccount": "Skatiname susikurti paskyrą ir prisijungti, tačiau, tai nėra privaloma",
index c38406a..f376344 100644 (file)
@@ -51,6 +51,7 @@
        "tog-watchlisthidebots": "Скриј ботовски уредувања од набљудуваните",
        "tog-watchlisthideminor": "Скриј ги ситните уредувања во набљудуваните",
        "tog-watchlisthideliu": "Скриј ги уредувањата на најавените корисници во набљудуваните",
+       "tog-watchlistreloadautomatically": "Превчитувај ги набљудувањата автоматски кога ќе се смени филтерот (бара JavaScript)",
        "tog-watchlisthideanons": "Скриј ги уредувањата од анонимни корисници во набљудуваните",
        "tog-watchlisthidepatrolled": "Скриј испатролирани уредувања од мојот список на набљудувања",
        "tog-watchlisthidecategorization": "Сокриј ја категоризацијата на страниците",
        "wrongpasswordempty": "Внесената лозинка е празна. Обидете се повторно.",
        "passwordtooshort": "Лозинката мора да има најмалку {{PLURAL:$1|1 знак|$1 знаци}}.",
        "passwordtoolong": "Лозинката не треба да има повеќе од {{PLURAL:$1|1 знак|$1 знаци}}.",
+       "passwordtoopopular": "Не користете пречесто застапени лозинки. Одберете некоја поинаква од вообичаените.",
        "password-name-match": "Лозинката мора да се разликува од корисничкото име.",
        "password-login-forbidden": "Употребата на ова корисничко име и лозинка е забранета.",
        "mailmypassword": "Нова лозинка",
index c2fdf32..13a7dc9 100644 (file)
@@ -84,6 +84,7 @@
        "tog-watchlisthidebots": "पहाऱ्याच्या सूचीतून सांगकाम्यांचे बदल लपवा",
        "tog-watchlisthideminor": "माझ्या पहाऱ्याच्या सूचीतून छोटे बदल लपवा",
        "tog-watchlisthideliu": "पहाऱ्याच्या सूचीतून प्रवेश केलेल्या सदस्यांची संपादने लपवा",
+       "tog-watchlistreloadautomatically": "एखादी गाळणी बदलल्यावर,निरीक्षणसूचीचे आपोआप पुनर्भारण करा(जावास्क्रिप्ट हवी)",
        "tog-watchlisthideanons": "निरीक्षणसूचीतून अनामिक सदस्यांची संपादने लपवा",
        "tog-watchlisthidepatrolled": "निरीक्षणसूचीतून तपासलेली संपादने लपवा",
        "tog-watchlisthidecategorization": "पानांचे वर्गीकरण लपवा",
        "viewsourceold": "स्रोत पहा",
        "editlink": "संपादन",
        "viewsourcelink": "स्रोत पहा",
-       "editsectionhint": "हà¥\8dया à¤µà¤¿à¤­à¤¾à¤\97ाà¤\9aà¥\87 à¤¸à¤\82पादन à¤\95रा: $1",
+       "editsectionhint": "या विभागाचे संपादन करा: $1",
        "toc": "अनुक्रमणिका",
        "showtoc": "दाखवा",
        "hidetoc": "लपवा",
        "wrongpasswordempty": "परवलीचा शब्द कोरा आहे; पुन्हा प्रयत्न करा.",
        "passwordtooshort": "तुमच्या परवलीच्या शब्दात किमान {{PLURAL:$1|१ अक्षर |$1 अक्षरे}} हवीत.",
        "passwordtoolong": "परवलीचा शब्द हा {{PLURAL:$1|१ वर्ण पेक्षा|$1 वर्णांपेक्षा}} लांबीचा नको.",
+       "passwordtoopopular": "सर्वसामान्यपणे वापरण्यात येणारे परवलीचे शब्द वापरल्या जाऊ शकत नाहीत.कृपया अधिक अनन्य शब्द वापरा.",
        "password-name-match": "आपला परवलीचा शब्द हा आपल्या सदस्यनावापेक्षा वेगळा हवा.",
        "password-login-forbidden": "या सदस्यनामाचा व परवलीच्या शब्दाचा वापर निषिद्ध आहे.",
        "mailmypassword": "नवीन परवलीचा शब्द पुनर्स्थापित(रिसेट) करा",
        "missing-revision": "\"{{FULLPAGENAME}}\" या लेखाचे #$1 हे संस्करण अस्तित्वात नाही.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे असे होते.याबाबत विस्तृत माहिती  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी]येथे बघता येईल.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" सदस्य खात्याची नोंद नाही. कृपया हे पान तुम्ही संपादित किंवा नव्याने तयार करू इच्छिता काय याबद्दल विचार करा.",
        "userpage-userdoesnotexist-view": "सदस्यखाते \"$1\"  हे नोंदलेले नाही.",
-       "blocked-notice-logextract": "हा à¤¸à¤¦à¤¸à¥\8dय à¤¸à¤§à¥\8dया à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87.\nसरà¥\8dवाà¤\82त à¤¨à¤µà¥\80न à¤ªà¥\8dरतिबà¤\82धन à¤¯à¤¾à¤¦à¥\80 à¤\96ाली संदर्भासाठी दिली आहे:",
+       "blocked-notice-logextract": "हा à¤¸à¤¦à¤¸à¥\8dय à¤¸à¤§à¥\8dया à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87.\nà¤\96ालà¥\80, à¤¸à¤°à¥\8dवाà¤\82त à¤¨à¤µà¥\80नतम à¤ªà¥\8dरतिबà¤\82धन à¤¨à¥\8bà¤\82दपà¥\8dरविषà¥\8dà¤\9fी संदर्भासाठी दिली आहे:",
        "clearyourcache": "'''सूचना:''' जतन केल्यावर बदल दिसण्यासाठी तुम्हाला कदाचित न्याहाळकाची सय टाळायला लागेल. असे करण्यासाठी - \n\n*'''फायरफॉक्स / सफारी:''' साठी ''Reload'' हे टिचकतांना ''Shift'' ही कळ दाबून ठेवा, किंवा ''Ctrl-F5'' अथवा ''Ctrl-R'' कळा एकत्रितपणे दाबा (मॅकसाठी ''⌘-R'').\n\n*'''गूगल क्रोम:''' साठी ''Ctrl-Shift-R'' कळा एकत्रितपणे दाबा (मॅकसाठी ''⌘-Shift-R'')\n\n*'''इंटरनेट एक्सप्लोअरर:''' ''Refresh'' करतांना ''Ctrl'' कळ दाबून ठेवा, किंवा त्याऐवजी ''Ctrl-F5'' दाबा.\n\n*'''कॉन्क्वरर:''' '''Reload''' दाबा किंवा ''F5'' दाबा\n\n*'''ऑपेरा:''' ''Tools → Preferences'' मधून सय रिकामी करा",
        "usercssyoucanpreview": "'''टीप:'''तुमचे नवे सीएसएस जतन करण्यापूर्वी 'झलक पहा' कळ वापरा.",
        "userjsyoucanpreview": "'''टीप:''' तुमचा नवा जावास्क्रिप्ट जतन करण्यापूर्वी 'झलक पहा' कळ वापरा.",
        "editingsection": "$1 (विभाग) संपादन",
        "editingcomment": "$1 चे संपादन (प्रतिक्रिया)",
        "editconflict": "संपादन मतभेद: $1",
-       "explainconflict": "तà¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादनाला à¤¸à¥\81रà¥\82वात à¤\95à¥\87लà¥\8dयानà¤\82तर à¤\87तर à¤\95à¥\8bणà¥\80तरà¥\80 à¤¬à¤¦à¤² à¤\95à¥\87ला à¤\86हà¥\87.\nवरà¥\80ल à¤ªà¤¾à¤ à¥\8dयभाà¤\97ामधà¥\8dयà¥\87 à¤¸à¤§à¥\8dया à¤\85सà¥\8dतिवात à¤\85सलà¥\87लà¥\8dया à¤ªà¥\83षà¥\8dठातà¥\80ल à¤ªà¤¾à¤ à¥\8dय à¤\86हà¥\87, à¤¤à¤° à¤¤à¥\81मà¤\9aà¥\87 à¤¬à¤¦à¤² à¤\96ालà¥\80ल à¤ªà¤¾à¤ à¥\8dयभाà¤\97ात à¤¦à¤°à¥\8dशविलà¥\87लà¥\87 à¤\86हà¥\87त.\nतà¥\81मà¥\8dहाला à¤¹à¥\87 à¤¬à¤¦à¤² à¤¸à¤§à¥\8dया à¤\85सà¥\8dतिवात à¤\85सणाऱà¥\8dया à¤ªà¤¾à¤ à¥\8dयासà¥\8bबत à¤\8fà¤\95तà¥\8dरित à¤\95रावà¥\87 à¤²à¤¾à¤\97तà¥\80ल.\n'''à¤\95à¥\87वळ''' à¤µà¤°à¥\80ल à¤ªà¤¾à¤ à¥\8dयभाà¤\97ामधà¥\8dयà¥\87 à¤\85सलà¥\87लà¥\87 à¤ªà¤¾à¤ à¥\8dय à¤¸à¤¾à¤ à¤µà¤¿à¤£à¥\8dयात à¤¯à¥\87à¤\88ल à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 \"{{int:savearticle}}\" à¤¹à¥\80 à¤\95ळ à¤¦à¤¾à¤¬à¤²à¥\80.",
+       "explainconflict": "à¤\86पण à¤¸à¤\82पादनाला à¤¸à¥\81रà¥\82वात à¤\95à¥\87लà¥\8dयानà¤\82तर à¤\87तर à¤\95à¥\8bणà¥\80तरà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤¤ à¤¬à¤¦à¤² à¤\95à¥\87ला à¤\86हà¥\87.\nयातà¥\80ल à¤µà¤°à¤\9aà¥\8dया à¤ªà¤¾à¤ à¥\8dयभाà¤\97ामधà¥\8dयà¥\87 à¤¸à¤§à¥\8dया à¤\85सà¥\8dतिवात à¤\85सलà¥\87लà¥\8dया à¤ªà¥\83षà¥\8dठातà¥\80ल à¤ªà¤¾à¤ à¥\8dय à¤\86हà¥\87. à¤\86पलà¥\87 à¤¬à¤¦à¤² à¤¹à¥\87 à¤\96ालà¤\9aà¥\8dया à¤¬à¤¾à¤\9cà¥\82तà¥\80ल à¤ªà¤¾à¤ à¥\8dयभाà¤\97ात à¤¦à¤°à¥\8dशविलà¥\87लà¥\87 à¤\86हà¥\87त.\nà¤\86पलà¥\8dयाला à¤¹à¥\87 à¤¬à¤¦à¤² à¤¸à¤§à¥\8dया à¤\85सà¥\8dतिवात à¤\85सणाऱà¥\8dया à¤ªà¤¾à¤ à¥\8dयासà¥\8bबत à¤\8fà¤\95तà¥\8dरित à¤\95रावà¥\87 à¤²à¤¾à¤\97तà¥\80ल.\nà¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 \"{{int:savearticle}}\" à¤¹à¥\80 à¤\95ळ à¤¦à¤¾à¤¬à¤²à¥\80 à¤¤à¤°,'''à¤\95à¥\87वळ''' à¤µà¤°à¤\9aà¥\8dया à¤ªà¤¾à¤ à¥\8dयभाà¤\97ामधà¥\8dयà¥\87 à¤\85सलà¥\87लà¥\87 à¤ªà¤¾à¤ à¥\8dयà¤\9a à¤¸à¤¾à¤ à¤µà¤¿à¤£à¥\8dयात à¤¯à¥\87à¤\88ल .",
        "yourtext": "तुमचा मजकूर",
        "storedversion": "साठविलेली आवृत्ती",
        "nonunicodebrowser": "'''सावधान: तुमचा न्याहाळक युनिकोड आधारित नाही. ASCII नसलेली  अक्षरचिन्हे संपादन खिडकीत सोळाअंकी कूटसंकेत (हेक्झाडेसीमल कोड) स्वरूपात दिसण्याची, सुरक्षितपणे संपादन करू देणारी,  पळवाट उपलब्ध आहे.'''",
        "protectedpagewarning": "'''सूचना: हे सुरक्षित पान आहे. फक्त प्रचालक याच्यात बदल करू शकतात.'''",
        "semiprotectedpagewarning": "'''सूचना:''' हे पान सुरक्षित आहे. फक्त नोंदणीकृत सदस्य याच्यात बदल करू शकतात.",
        "cascadeprotectedwarning": "<strong>ताकिद:</strong>हे पान निम्न-लिखीत निपतन-प्रतिबंधीत {{PLURAL:$1|पानात|पानांत}} आंतरभूत असल्यामुळे,केवळ प्रचालक-सुविधाप्राप्त सदस्यांनाच संपादन करता यावे असे ताळे त्यास ठोकलेले आहे :",
-       "titleprotectedwarning": "”’सावधान: फक्त काही सदस्यानांच [[Special:ListGroupRights|विशेष आधिकार]] तयार करता यावे म्हणून ह्या पानास ताळे आहे.'''",
+       "titleprotectedwarning": "”’सावधान: फक्त काही सदस्यानांच [[Special:ListGroupRights|विशेष आधिकार]] तयार करता यावेत म्हणून या पानास ताळे आहे.'''",
        "templatesused": "या पानामध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "templatesusedpreview": "या झलकेमध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "templatesusedsection": "या विभागामध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "rev-deleted-text-view": "या पानाची आवृत्ती '''वगळण्यात आली आहे'''.\nती तुम्ही बघू शकता; अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदी] येथे मिळेल.",
        "rev-suppressed-text-view": "या पानाची आवृत्ती '''दडपली'''.\nआपण ती बघू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
        "rev-deleted-no-diff": "आपण यातील फरक बघू शकत नाही कारण, त्यापैकी एक संस्करण '''वगळले''' आहे.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याचा क्रमलेख] येथे त्याचा तपशील सापडेल.",
-       "rev-suppressed-no-diff": "तà¥\81मà¥\8dहà¥\80 à¤¹à¤¾ à¤«à¤°à¤\95 à¤ªà¤¾à¤¹à¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¯à¤¾ à¤\86वà¥\83तà¥\8dतà¥\8dयाà¤\82मधà¥\80ल à¤\8fà¤\95 à¤¸à¤\82सà¥\8dà¤\95रण â\80\9dâ\80\99वà¤\97ळणà¥\8dयात à¤\86लà¥\87 à¤\86हà¥\87\80\9dâ\80\99",
+       "rev-suppressed-no-diff": "à¤\86पण à¤¹à¤¾ à¤«à¤°à¤\95 à¤ªà¤¾à¤¹à¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¯à¤¾ à¤\86वà¥\83तà¥\8dतà¥\8dयाà¤\82मधà¥\80ल à¤\8fà¤\95 à¤\86वà¥\83तà¥\8dतà¥\80 <strong>वà¤\97ळणà¥\8dयात à¤\86लà¥\80 à¤\86हà¥\87</strong>.",
        "rev-deleted-unhide-diff": "या फरकाच्या आवृत्तींपैकी एक आवृत्ती  '''वगळण्यात आली आहे'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळण्याच्या नोंदी] येथे अधिक तपशिल मिळू शकेल.जर आपणास काम पुढे चालू ठेवायचे असेल तर आपण आत्ता सुद्धा [$1 हा फरक बघु शकता].",
        "rev-suppressed-unhide-diff": "या फरकाच्या आवृत्तींपैकी एक आवृत्ती '''दडपण्यात आली आहे'''. [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} दडपण्याच्या  नोंदी] येथे अधिक तपशिल मिळू शकेल.जर आपणास काम पुढे चालू ठेवायचे असेल तर, आपण आत्ता सुद्धा [$1 हा फरक बघु शकता].",
        "rev-deleted-diff-view": "या फरकाच्या आवृत्तींपैकी एक आवृत्ती '''वगळण्यात आली आहे'''. आपण हा फरक बघु शकता; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळण्याच्या नोंदी] येथे अधिक तपशिल मिळू शकेल.",
        "revdelete-selected-text": "[[:$2]] ची/च्या {{PLURAL:$1|निवडलेली आवृत्ती|निवडलेल्या आवृत्त्या}} :",
        "revdelete-selected-file": "[[:$2]] ची/च्या {{PLURAL:$1|निवडलेली संचिका आवृत्ती|निवडलेल्या संचिका आवृत्त्या}} :",
        "logdelete-selected": "{{PLURAL:$1|निवडलेली नोंदीकृत घटना|निवडलेल्या नोंदीकृत घटना}}:",
-       "revdelete-text-text": "वà¤\97ळलà¥\87लà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\8dया à¤¹à¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤\87तिहासात à¤¦à¤¿à¤¸à¤£à¤¾à¤° à¤¨à¤¾à¤¹à¥\80त, à¤ªà¤£ à¤¤à¥\8dयाà¤\9aà¥\8dया à¤\86शयाà¤\9aा à¤\95ाहà¥\80 à¤­à¤¾à¤\97 à¤¹à¤¾ à¤\9cनतà¥\87च्या पोहोचीबाहेर असेल.",
-       "revdelete-text-file": "वà¤\97ळलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\8dया à¤¹à¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤\87तिहासात à¤\85दà¥\8dयापहà¥\80 à¤¦à¤¿à¤¸à¤¤à¥\80ल, à¤ªà¤£ à¤¤à¥\8dयाà¤\9aà¥\8dया à¤\86शयाà¤\9aा à¤\95ाहà¥\80 à¤­à¤¾à¤\97 à¤¹à¤¾ à¤\9cनतà¥\87च्या पोहोचीबाहेर असेल.",
-       "logdelete-text": "वगळलेल्या नोंदी ह्या पानाच्या इतिहासात अजूनही दिसतील, पण त्याच्या आशयाचा काही भाग हा जनतेच्या पोहोचीबाहेर असेल.",
+       "revdelete-text-text": "वà¤\97ळलà¥\87लà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\8dया à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤\87तिहासात à¤¦à¤¿à¤¸à¤£à¤¾à¤° à¤¨à¤¾à¤¹à¥\80त, à¤ªà¤£ à¤¤à¥\8dयाà¤\9aà¥\8dया à¤\86शयाà¤\9aा à¤\95ाहà¥\80 à¤­à¤¾à¤\97 à¤¹à¤¾ à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dयाच्या पोहोचीबाहेर असेल.",
+       "revdelete-text-file": "वà¤\97ळलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\8dया à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤\87तिहासात à¤\85दà¥\8dयापहà¥\80 à¤¦à¤¿à¤¸à¤¤à¥\80ल, à¤ªà¤£ à¤¤à¥\8dयाà¤\9aà¥\8dया à¤\86शयाà¤\9aा à¤\95ाहà¥\80 à¤­à¤¾à¤\97 à¤¹à¤¾ à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dयाच्या पोहोचीबाहेर असेल.",
+       "logdelete-text": "वगळलेल्या नोंद-घटना या, पानाच्या नोंदीत अजूनही दिसतील, पण त्याच्या आशयाचा काही भाग हा सामान्याच्या पोहोचीबाहेर असेल.",
        "revdelete-text-others": "अतिरिक्त बंधने स्थापिल्या गेली नसतील तर,दुसरे प्रशासक हे अजूनही लपविलेल्या आशयावर पोहोचु शकतील व त्याचे वगळणे पुनर्स्थापन करु शकतील.",
        "revdelete-confirm": "कृपया '''याची खात्री करा''' की तुम्ही जे करीत आहात, त्याचे परिणाम आपण जाणत आहात आणि, ते काम [[{{MediaWiki:Policy-url}}|मीडियाविकीच्या नीती]]नुसार आहे.",
        "revdelete-suppress-text": "लपवण्याचा वापर '''फक्त''' पुढील बाबतीत होतो:\n* उच्च दर्जाची बदनामीकारक माहिती\n* अयोग्य व्यक्तिगत माहिती\n*: ''गृहपत्ते, दूरध्वनी क्रमांक व राष्ट्रीय ओळख क्रमांक वगैरे''",
        "pagehist": "पानाचा इतिहास",
        "deletedhist": "वगळलेला इतिहास",
        "revdelete-hide-current": "$2 या दिनांकाची बाब लपविण्यात त्रुटी, $1: हे सद्य पुनरावर्तन आहे.\nते लपवता येत नाही.",
-       "revdelete-show-no-access": "$2, $1 ची बाब दाखवताना अडचण: ती \"प्रतिबंधित\" खूण असलेली आहे.\nतुम्ही तिच्यापर्यंत पोचू शकत नाही.",
+       "revdelete-show-no-access": "$2'दिनांकाची बाब दाखवितांना त्रुटी, $1:  त्या बाबीवर \"निर्बंधित\" अशी खूण आहे.\nआपणास त्यावर पोहोच नाही.",
        "revdelete-modify-no-access": "$2, $1 ची बाब संपादताना अडचण: ती \"प्रतिबंधित\" खूण असलेली आहे.\nतुम्ही तिच्यापर्यंत पोचू शकत नाही.",
        "revdelete-modify-missing": "बाब क्र. $1 ला संपादताना त्रुटी: ती माहितीकोषात नाही!",
        "revdelete-no-change": "'''सूचना:''' $2, $1 च्या बाबीने अगोदरच दृश्यता रुपरेषा मागितल्या आहेत.",
        "revdelete-edit-reasonlist": "वगळण्याची कारणे संपादित करा",
        "revdelete-offender": "आवर्तन निर्माता:",
        "suppressionlog": "दडपण्याची नोंद",
-       "suppressionlogtext": "à¤\96ालà¥\80ल à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¯à¤¾à¤¦à¥\80 à¤¹à¥\80 à¤µà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤µ à¤ªà¥\8dरतिबà¤\82धनाà¤\9aà¥\80 à¤\86हà¥\87 à¤\9cà¥\8dयाà¤\9aा à¤\86शय à¤¹à¤¾ à¤ªà¥\8dरशासà¤\95ाà¤\82पासà¥\82न à¤²à¤ªà¤µà¤¿à¤£à¥\8dयात à¤\86ला à¤\86हà¥\87.सधà¥\8dया à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\87लà¥\80 à¤¬à¤\82दà¥\80 à¤µ à¤ªà¥\8dरतिबà¤\82धनाà¤\82à¤\9aà¥\80   \nयादी [[Special:BlockList|प्रतिबंधनांची यादी]] बघा.",
+       "suppressionlogtext": "à¤\96ालà¥\80ल à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¯à¤¾à¤¦à¥\80 à¤¹à¥\80 à¤µà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤µ à¤ªà¥\8dरतिबà¤\82धनाà¤\9aà¥\80 à¤\86हà¥\87 à¤\9cà¥\8dयाà¤\9aा à¤\86शय à¤¹à¤¾ à¤ªà¥\8dरशासà¤\95ाà¤\82पासà¥\82न à¤²à¤ªà¤µà¤¿à¤£à¥\8dयात à¤\86ला à¤\86हà¥\87.सधà¥\8dया à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\87लà¥\8dया à¤¬à¤\82दà¥\80 à¤µ à¤ªà¥\8dरतिबà¤\82धनाà¤\82à¤\9aà¥\8dया   \nयादà¥\80साठी [[Special:BlockList|प्रतिबंधनांची यादी]] बघा.",
        "mergehistory": "पान इतिहासांचे एकत्रीकरण करा",
        "mergehistory-header": "हे पान एका स्रोत पानाचा इतिहास एखाद्या नवीन पानात समाविष्ट करू देते.\nहा बदल पानाचे ऐतिहासिक सातत्य राखेल याची दक्षता घ्या.",
        "mergehistory-box": "दोन पानांची आवर्तने संमिलीत करा:",
        "filetype-badmime": "विविधामाप(माईम) \"$1\" प्रकारच्या संचिका चढवण्यास परवानगी नाही.",
        "filetype-bad-ie-mime": "ही संचिका चढवता येत नाही कारण इंटरनेट एक्स्प्लोरर तिला \"$1\" म्हणून ओळखेल. हा संचिकाप्रकार प्रतिबंधित व संभाव्य धोकादायक संचिकाप्रकार आहे.",
        "filetype-unwanted-type": "'''\".$1\"''' हा अवांछित संचिका प्रकार आहे. प्राधान्याने $2 {{PLURAL:$3|या प्रकारच्या |या प्रकारांच्या}} संचिका हव्या आहेत.",
-       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|ही परवानगी नसलेल्या प्रकारची संचिका आहे.|ह्या परवानगी नसलेल्या प्रकारच्या संचिका आहेत.}} $2 {{PLURAL:$3|ही परवानगी असलेल्या प्रकारची संचिका आहे|ह्या परवानगी असलेल्या प्रकारच्या संचिका आहेत}}.",
+       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|ही परवानगी नसलेल्या प्रकारची संचिका आहे|या परवानगी नसलेल्या प्रकारच्या संचिका आहेत.}} $2 {{PLURAL:$3|ही परवानगी असलेल्या प्रकारची संचिका आहे|या परवानगी असलेल्या प्रकारच्या संचिका आहेत}}.",
        "filetype-missing": "या संचिकेला विस्तारक(एक्सटेंशन) दिलेले नाही (उदा. \".jpg\").",
        "empty-file": "तुम्ही प्रस्तुत केलेली संचिका रिकामी होती.",
        "file-too-large": "तुम्ही प्रस्तुत केलेली संचिका आकाराने खूप जास्त होती.",
        "uploaded-hostile-svg": "अपभारीलेल्या SVG संचिकेत,असुरक्षित CSS स्टाईल अवयव आढळले.",
        "uploadscriptednamespace": "या SVG संचिकेत \"$1\" हे अवैध नामविश्व आहे.",
        "uploadinvalidxml": "अपभारीत संचिकेतील XML पार्स करता आले नाही.",
-       "uploadvirus": "हà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87त à¤µà¥\8dहायरस आहे. अधिक माहिती: $1",
+       "uploadvirus": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87त à¤µà¤¿à¤·à¤¾à¤£à¥\82(वà¥\8dहायरस) आहे. अधिक माहिती: $1",
        "uploadjava": "ही फाईल झीप ह्या प्रकारातील आहे ज्यामधे जावा .क्लास फाईल. आहे,जावा फाईलचे अपभारणास परवानगी नाही कारण त्याने सुरक्षा-बंधने टाळल्या जाऊ शकतात.",
        "upload-source": "स्रोत संचिका",
        "sourcefilename": "स्रोत-संचिकानाम:",
        "activeusers-hidesysops": "प्रचालक लपवा",
        "activeusers-noresult": "एकही सदस्य सापडला नाही.",
        "listgrouprights": "सदस्य गट अधिकार",
-       "listgrouprights-summary": "à¤\96ालà¥\80 à¤¯à¤¾ à¤µà¤¿à¤\95िवर à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¸à¤¦à¤¸à¥\8dय à¤\97à¤\9fाà¤\82à¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80 à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤\85धिà¤\95ाराà¤\82सà¤\95à¤\9f à¤¦à¤°à¥\8dशविलà¥\87लà¥\80 à¤\86हà¥\87. à¤ªà¥\8dरतà¥\8dयà¥\87à¤\95ाà¤\9aà¥\8dया à¤\85धिà¤\95ाराà¤\82à¤\9aà¥\80 à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 [[{{MediaWiki:Listgrouprights-helppage}}|à¤\87थà¥\87]] à¤¦à¤¿à¤²à¥\87लà¥\80 à¤\86हे.",
+       "listgrouprights-summary": "या à¤µà¤¿à¤\95िवर à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¸à¤¦à¤¸à¥\8dय à¤\97à¤\9fाà¤\82à¤\9aà¥\80 à¤µà¥\8dयाà¤\96à¥\8dयिà¤\95à¥\83त à¤¯à¤¾à¤¦à¥\80 à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤\85धिà¤\95ाराà¤\82सà¤\95à¤\9f à¤\96ालà¥\80 à¤¦à¤°à¥\8dशविलà¥\87लà¥\80 à¤\86हà¥\87. à¤ªà¥\8dरतà¥\8dयà¥\87à¤\95ाà¤\9aà¥\8dया à¤µà¥\88यà¤\95à¥\8dतिà¤\95 à¤\85धिà¤\95ाराà¤\82à¤\9aà¥\80 [[{{MediaWiki:Listgrouprights-helppage}}|à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80]] à¤¯à¥\87थà¥\87 à¤\85सà¥\81 à¤¶à¤\95ते.",
        "listgrouprights-key": "विवरण:\n* <span class=\"listgrouprights-granted\">प्रदत्त अधिकार</span>\n* <span class=\"listgrouprights-revoked\">रद्द अधिकार</span>",
        "listgrouprights-group": "गट",
        "listgrouprights-rights": "अधिकार",
        "exbeforeblank": "वगळण्यापूर्वीचा मजकूर पुढीलप्रमाणे: '$1'",
        "delete-confirm": "\"$1\" वगळा",
        "delete-legend": "वगळा",
-       "historywarning": "<strong>à¤\88शारा:</strong> à¤¤à¥\81मà¥\8dहà¥\80 वगळत असलेल्या पानाला $1 {{PLURAL:$1|आवर्तनाचा|आवर्तनांचा}} इतिहास आहे:",
-       "confirmdeletetext": "तà¥\81मà¥\8dहà¥\80 à¤\8fà¤\95 à¤²à¥\87à¤\96पान à¤¤à¥\8dयाà¤\9aà¥\8dया à¤¸à¤°à¥\8dव à¤\87तिहासासà¥\8bबत à¤µà¤\97ळणà¥\8dयाà¤\9aà¥\8dया à¤¤à¤¯à¤¾à¤°à¥\80त à¤\86हात.\nà¤\95à¥\83पया, à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रà¥\80त à¤\85सलà¥\87लà¥\80 à¤\95à¥\83तà¥\80 à¤¹à¥\80 à¤®à¥\80डियाविà¤\95à¥\80à¤\9aà¥\8dया [[{{MediaWiki:Policy-url}}|नà¥\80तà¥\80नà¥\81सार]] à¤\86हà¥\87 à¤¹à¥\8dयाà¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रा. à¤¤à¤¸à¥\87à¤\9a, à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रà¥\80त à¤\85सलà¥\87लà¥\8dया à¤\95à¥\83तà¥\80à¤\9aà¥\87 à¤ªà¤°à¤¿à¤£à¤¾à¤®, à¤\95à¥\83तà¥\80 à¤\95रणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤\9cाणà¥\82न à¤\98à¥\8dया.",
+       "historywarning": "<strong>à¤\87शारा:</strong> à¤\86पण वगळत असलेल्या पानाला $1 {{PLURAL:$1|आवर्तनाचा|आवर्तनांचा}} इतिहास आहे:",
+       "confirmdeletetext": "à¤\86पण à¤\8fà¤\95 à¤²à¥\87à¤\96पान à¤¤à¥\8dयाà¤\9aà¥\8dया à¤¸à¤°à¥\8dव à¤\87तिहासासà¥\8bबत à¤µà¤\97ळणà¥\8dयाà¤\9aà¥\8dया à¤¤à¤¯à¤¾à¤°à¥\80त à¤\86हात.\nà¤\95à¥\83पया, à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95ि, à¤\95रà¥\80त à¤\85सलà¥\87लà¥\8dया à¤\95à¥\83तà¥\80à¤\9aà¥\87 à¤ªà¤°à¤¿à¤£à¤¾à¤®, à¤\86पण à¤\95à¥\83तà¥\80 à¤\95रणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤\9cाणà¥\82न à¤\98à¥\87तलà¥\87 à¤\86हà¥\87त à¤µ à¤\86पण à¤¹à¥\87   [[{{MediaWiki:Policy-url}}|मà¥\80डियाविà¤\95à¥\80à¤\9aà¥\8dया à¤¨à¥\80तà¥\80नà¥\81सारà¤\9a]] à¤\95रà¥\80त à¤\86हात.",
        "actioncomplete": "काम पूर्ण",
        "actionfailed": "कृती अयशस्वी झाली",
        "deletedtext": "\"$1\" हा लेख वगळला. अलीकडे वगळलेले लेख पाहण्यासाठी $2 पहा.",
        "sp-contributions-talk": "चर्चा",
        "sp-contributions-userrights": "सदस्य अधिकार व्यवस्थापन",
        "sp-contributions-blocked-notice": "हा सदस्य सध्या प्रतिबंधित आहे.\nसर्वांत नवीन प्रतिबंधन यादी खाली संदर्भासाठी दिली आहे:",
-       "sp-contributions-blocked-notice-anon": "हा à¤\85à¤\82à¤\95पतà¥\8dता à¤¸à¤§à¥\8dया à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87.\nसरà¥\8dवाà¤\82त à¤¨à¤µà¥\80न à¤ªà¥\8dरतिबà¤\82धन à¤¯à¤¾à¤¦à¥\80 à¤\96ाली संदर्भासाठी दिली आहे:",
+       "sp-contributions-blocked-notice-anon": "हा à¤\85à¤\82à¤\95पतà¥\8dता à¤¸à¤§à¥\8dया à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87.\nà¤\96ालà¥\80, à¤¸à¤°à¥\8dवाà¤\82त à¤¨à¤µà¥\80नतम à¤ªà¥\8dरतिबà¤\82धन à¤¨à¥\8bà¤\82दपà¥\8dरविषà¥\8dà¤\9fी संदर्भासाठी दिली आहे:",
        "sp-contributions-search": "योगदान शोधयंत्र",
        "sp-contributions-username": "आंतरजाल अंकपत्ता किंवा सदस्यनाम:",
        "sp-contributions-toponly": "केवळ नवीनतम आवर्तने असलेलीच संपादने दाखवा",
        "tooltip-pt-anontalk": "या अंकपत्त्यापासून झालेल्या संपादनांबद्दल चर्चा",
        "tooltip-pt-preferences": "तुमचा पसंतीक्रम",
        "tooltip-pt-watchlist": "तुम्ही पहारा दिलेल्या पानांची यादी",
-       "tooltip-pt-mycontris": "तà¥\81मà¤\9a्या योगदानांची यादी",
+       "tooltip-pt-mycontris": "à¤\86पल्या योगदानांची यादी",
        "tooltip-pt-anoncontribs": "या अंकपत्त्यावरुन झालेले संपादन",
        "tooltip-pt-login": "आपणांस सनोंद प्रवेशासाठी प्रोत्साहीत करण्यात येत आहे;अर्थातच, ते अनिवार्य नाही.",
        "tooltip-pt-logout": "सनोंद निर्गम",
        "exif-bitspersample": "प्रती घटक बीट्स",
        "exif-compression": "आकुंचन योजना",
        "exif-photometricinterpretation": "चित्रांश विन्यास (पिक्सेल कॉम्पोझीशन)",
-       "exif-orientation": "वळण",
+       "exif-orientation": "à¤\85भिमà¥\81à¤\96न",
        "exif-samplesperpixel": "घटकांची संख्या",
        "exif-planarconfiguration": "विदा रचना",
        "exif-ycbcrsubsampling": "Y चे C शी  उपनमुनातपासणी (सबसॅम्पलींग) गुणोत्तर",
        "exif-ycbcrpositioning": "Y आणि C प्रतिस्थापना (पोझीशनींग)",
-       "exif-xresolution": "समाà¤\82तर रिझोल्यूशन",
+       "exif-xresolution": "à¤\86डवà¥\87 रिझोल्यूशन",
        "exif-yresolution": "उभे रिझोल्यूशन",
        "exif-stripoffsets": "चित्रविदा स्थान",
        "exif-rowsperstrip": "प्रत्येक पट्टीतील ओळींची संख्या",
        "exif-datetime": "संचिका बदल तारीख आणि वेळ",
        "exif-imagedescription": "चित्र शीर्षक",
        "exif-make": "कॅमेरा उत्पादक",
-       "exif-model": "à¤\95à¥\85मà¥\87रा à¤\89पà¤\95रण",
+       "exif-model": "à¤\95à¥\85मà¥\87रा à¤¨à¤®à¥\82ना",
        "exif-software": "वापरलेली संगणन आज्ञावली",
        "exif-artist": "लेखक",
        "exif-copyright": "प्रताधिकार धारक",
        "confirmemail_success": "तुमचा विपत्र (ई-मेल) पत्ता प्रमाणित झाला आहे.तुम्ही आता [[Special:UserLogin|दाखल]] होऊ शकता आणि विकिचा आनंद घेऊ शकता.",
        "confirmemail_loggedin": "तुमचा विपत्र (ई-मेल) पत्ता आता प्रमाणित झाला आहे.",
        "confirmemail_subject": "{{SITENAME}} विपत्र (ई-मेल) पत्ता प्रमाणित",
-       "confirmemail_body": "à¤\95à¥\81णà¥\80तरà¥\80, à¤¬à¤¹à¥\81तà¥\87à¤\95 à¤¤à¥\81मà¥\8dहà¥\80, $1 à¤¯à¤¾ à¤ªà¤¤à¥\8dतà¥\8dयावारà¥\82न, \"$2\" à¤\96ातà¥\87 à¤¹à¤¾ à¤\88मà¥\87ल à¤ªà¤¤à¥\8dता à¤µà¤¾à¤ªà¤°à¥\82न {{SITENAME}} à¤¯à¤¾ à¤¸à¤\82à¤\95à¥\87तसà¥\8dथळावर à¤\89à¤\98डलà¥\87 à¤\86हà¥\87.\n\nहà¥\87 à¤\96ातà¥\87 à¤\96रà¥\8bà¤\96र à¤¤à¥\81मà¤\9aà¥\87 à¤\86हà¥\87 à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86णि {{SITENAME}} à¤µà¤° à¤\88मà¥\87ल à¤ªà¤°à¥\8dयाय à¤\89तà¥\8dतà¥\87à¤\9cित (à¤\89पलबà¥\8dध) à¤\95रणà¥\8dयासाठà¥\80, à¤¹à¤¾ à¤¦à¥\81वा à¤¤à¥\81मà¤\9aà¥\8dया à¤¬à¥\8dराà¤\89à¤\9cर à¤®à¤§à¥\87 à¤\89à¤\98डा:\n\n$3\n\nà¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 à¤¹à¥\87 à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 *नसà¥\87ल* à¤¤à¤° à¤¹à¥\80 à¤®à¤¾à¤\97णà¥\80 à¤°à¤¦à¥\8dद à¤\95रणà¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤¦à¥\81वा à¤\89à¤\98डा:\n\n$5\n\nहा à¤¹à¤®à¥\80 à¤\95लम $4 à¤²à¤¾ à¤¨à¤·à¥\8dà¤\9f होईल.",
+       "confirmemail_body": "à¤\95à¥\81णà¥\80तरà¥\80, à¤¬à¤¹à¥\81तà¥\87à¤\95 à¤\86पणà¤\9a, $1 à¤¯à¤¾ à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयावरà¥\82न, à¤¹à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता(à¤\88मà¥\87ल) à¤µà¤¾à¤ªà¤°à¥\82न,, {{SITENAME}} à¤µà¤° \"$2\" à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 à¤\86हà¥\87.\n\nहà¥\87 à¤\96ातà¥\87 à¤\96रà¥\8bà¤\96र à¤\86पलà¥\87 à¤\86हà¥\87 à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86णि {{SITENAME}} à¤µà¤° à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¥\8dरारà¥\81प à¤¸à¤\95à¥\8dरिय (à¤\89पलबà¥\8dध) à¤\95रणà¥\8dयासाठà¥\80, à¤¹à¤¾ à¤¦à¥\81वा à¤¤à¥\81मà¤\9aà¥\8dया à¤¨à¥\8dयाहाळà¤\95ात(बà¥\8dराà¤\89à¤\9cर) à¤\89à¤\98डा:\n\n$3\n\nà¤\9cर à¤\86पण à¤¹à¥\87 à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 *नसà¥\87ल* à¤¤à¤° à¤¹à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता à¤µà¤\97ळणà¥\8dयासाठà¥\80,à¤\96ालà¥\80ल à¤¦à¥\81वा à¤\85नà¥\81सरा:\n\n$5\n\nनिशà¥\8dà¤\9aितà¥\80à¤\95रण à¤¸à¤\82à¤\95à¥\87त(à¤\95नà¥\8dफरà¥\8dमà¥\87शन à¤\95à¥\8bड) $4 à¤²à¤¾ à¤\95ालबाहà¥\8dय होईल.",
        "confirmemail_body_changed": "\n\n{{SITENAME}} या संकेतस्थळावर कुणीतरी, बहुतेक तुम्ही, $1 या अंकपत्त्यावारून, \"$2\" खात्याकरिताचा  ईमेल   आपल्या या ई-मेल पत्त्यावर बदलला आहे.\n\nहे खाते खरोखर तुमचे आहे याची खात्री करण्यासाठी आणि {{SITENAME}} वर ईमेल पर्याय उत्तेजित (उपलब्ध) करण्यासाठी, हा दुवा तुमच्या ब्राउजर मधे उघडा:\n\n$3\n\nजर तुम्ही हे खाते तुमचे *नसेल* तर ही ई-मेल पत्त्याच्या बदलाची मागणी रद्द करण्यासाठी खालील दुवा उघडा:\n\n$5\n\nहा  निश्चितीकरण संदेश  $4 ला नष्ट होईल.",
-       "confirmemail_body_set": "{{SITENAME}} à¤¯à¤¾ à¤¸à¤\82à¤\95à¥\87तसà¥\8dथळावर à¤\95à¥\81णà¥\80तरà¥\80, à¤¬à¤¹à¥\81तà¥\87à¤\95 à¤¤à¥\81मà¥\8dहà¥\80, $1 à¤¯à¤¾ à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयावरà¥\82न, \"$2\" à¤\96ातà¥\8dयाà¤\95रिताà¤\9aा  à¤\88-मà¥\87ल,  à¤\86पलà¥\8dया à¤¯à¤¾ à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dयानà¥\81सार à¤¦à¤¿à¤²à¤¾ à¤\86हà¥\87.\n\nहà¥\87 à¤\96ातà¥\87 à¤\96रà¥\8bà¤\96र à¤¤à¥\81मà¤\9aà¥\87 à¤\86हà¥\87 à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86णि {{SITENAME}} à¤µà¤° à¤\88-मà¥\87ल à¤ªà¤°à¥\8dयाय à¤\89तà¥\8dतà¥\87à¤\9cित (à¤\89पलबà¥\8dध) à¤\95रणà¥\8dयासाठà¥\80, à¤¹à¤¾ à¤¦à¥\81वा à¤¤à¥\81मà¤\9aà¥\8dया à¤¬à¥\8dराà¤\89à¤\9cर à¤®à¤§à¥\87 à¤\89à¤\98डा:\n\n$3\n\nà¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 à¤¹à¥\87 à¤\96ातà¥\87 à¤¤à¥\81मà¤\9aà¥\87 *नसà¥\87ल* à¤¤à¤° à¤¹à¥\80 à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dयाà¤\9aà¥\8dया à¤¬à¤¦à¤²à¤¾à¤\9aà¥\80 à¤®à¤¾à¤\97णà¥\80 à¤°à¤¦à¥\8dद à¤\95रणà¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤¦à¥\81वा à¤\89à¤\98डा:\n\n$5\n\nहा à¤\96ातà¥\8dरà¥\80à¤\95रण à¤¸à¤\82दà¥\87श  $4 à¤µà¥\87ळà¥\87त à¤¨à¤·à¥\8dà¤\9f होईल.",
+       "confirmemail_body_set": "{{SITENAME}} à¤µà¤° à¤\95à¥\81णà¥\80तरà¥\80, à¤¬à¤¹à¥\81तà¥\87à¤\95 à¤\86पणà¤\9a, $1 à¤¯à¤¾ à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयावरà¥\82न, \"$2\" à¤¯à¤¾  à¤\96ातà¥\8dयाà¤\95रिताà¤\9aा à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता (à¤\88-मà¥\87ल), à¤¯à¤¾ à¤ªà¤¤à¥\8dतà¥\8dयास à¤¸à¥\8dथापिलà¥\87ला à¤\86हà¥\87.\n\nहà¥\87 à¤\96ातà¥\87 à¤\96रà¥\8bà¤\96र à¤\86पलà¥\87à¤\9a à¤\86हà¥\87 à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86णि {{SITENAME}} à¤µà¤° à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता à¤ªà¥\8dरारà¥\81प à¤¸à¤\95à¥\8dरिय(à¤\89पलबà¥\8dध) à¤\95रणà¥\8dयासाठà¥\80, à¤¹à¤¾ à¤¦à¥\81वा à¤\86पलà¥\8dया à¤¨à¥\8dयाहाळà¤\95ात(बà¥\8dराà¤\89à¤\9cर) à¤\89à¤\98डा:\n\n$3\n\nà¤\9cर à¤¹à¥\87 à¤\96ातà¥\87 à¤\86पलà¥\87 *नसà¥\87ल* à¤¤à¤°, à¤¹à¥\80 à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dयाà¤\9aà¥\87 à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤µà¤\97ळणà¥\8dयासाठà¥\80,à¤\96ालà¥\80ल à¤¦à¥\81वà¥\8dयास à¤\85नà¥\81सरा:\n\n$5\n\nहा à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤¸à¤\82à¤\95à¥\87त(à¤\95नà¥\8dफरà¥\8dमà¥\87शन à¤\95à¥\8bड) $4 à¤²à¤¾ à¤\95ालबाहà¥\8dय होईल.",
        "confirmemail_invalidated": "इ-मेल पत्ता तपासणी रद्द करण्यात आलेली आहे",
        "invalidateemail": "इ-मेल तपासणी रद्द करा",
        "scarytranscludedisabled": "[आंतरविकि आंतरन्यास अनुपलब्ध केले आहे]",
        "lag-warn-high": "विदा विदादात्यास लागणाऱ्या अत्युच्च कालावधी मुळे, $1 {{PLURAL:$1|सेकंदापेक्षा|सेकंदांपेक्षा}} नवे बदल या सूचित कदाचित दाखवले नाही जाणार.",
        "watchlistedit-normal-title": "पहाऱ्याची सूचीचे संपादन करा",
        "watchlistedit-normal-legend": "शीर्षकपाने नित्य पहाण्याच्या सूचीतून काढा",
-       "watchlistedit-normal-explain": "तà¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\80ल à¤\85à¤\82तरà¥\8dभà¥\82त à¤¨à¤¾à¤®à¤¾à¤µà¤³à¥\80 à¤\96ालà¥\80 à¤¨à¤¿à¤°à¥\8dदà¥\87शित à¤\95à¥\87लà¥\80 à¤\86हà¥\87. à¤¶à¥\80रà¥\8dषà¤\95 à¤µà¤\97ळणà¥\8dयाà¤\95रिता, à¤¤à¥\8dया à¤ªà¥\81ढà¥\80ल à¤\96िडà¤\95à¥\80 à¤¨à¤¿à¤µà¤¡à¤¾, à¤\86णि à¤¶à¥\80रà¥\8dषà¤\95 à¤µà¤\97ळावर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. à¤¤à¥\81मà¥\8dहà¥\80 [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.",
+       "watchlistedit-normal-explain": "à¤\86पलà¥\8dया à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\80ल à¤¶à¥\80रà¥\8dषà¤\95à¥\87 à¤\96ालà¥\80 à¤¦à¤°à¥\8dशविणà¥\8dयात à¤\86लà¥\87लà¥\80 à¤\86हà¥\87त.à¤\8fà¤\96ादà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤¹à¤\9fविणà¥\8dयाà¤\95रà¥\80ता, à¤¤à¥\8dया à¤ªà¥\81ढà¥\80ल à¤ªà¥\87à¤\9fà¥\80(बà¥\89à¤\95à¥\8dस) à¤¨à¤¿à¤µà¤¡à¤¾(à¤\9aà¥\87à¤\95), à¤\86णि \"{{int:Watchlistedit-normal-submit}}\" à¤µà¤° à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. à¤\86पण [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.",
        "watchlistedit-normal-submit": "शिर्षक वगळा",
        "watchlistedit-normal-done": "तुमच्या नित्य पहाण्या सूचीतून वगळलेली {{PLURAL:$1|1 शीर्षक होते |$1 शीर्षके होती }}:",
        "watchlistedit-raw-title": "कच्ची नित्य पहाण्याची सूची संपादित करा",
        "htmlform-invalid-input": "तुम्ही दिलेल्या माहितीत काहीतरी गडबड आहे",
        "htmlform-select-badoption": "आपण नमूद करत असलेली व्हॅल्यू ग्राह्य पर्याय ठरत नाही",
        "htmlform-int-invalid": "आपण नमूद केलेली व्हॅल्यू पूर्णांक (इंटीजर) नाही.",
-       "htmlform-float-invalid": "तà¥\81मà¥\8dहà¥\80 à¤¦à¤¿à¤²à¥\87लà¥\80 à¤\95िà¤\82मत à¤\86à¤\95डा नाही.",
+       "htmlform-float-invalid": "à¤\86पण à¤¦à¤¿à¤²à¥\87लà¥\80 à¤\95िà¤\82मत à¤¹à¥\80 à¤\8fà¤\95 'सà¤\82à¤\96à¥\8dया नाही.",
        "htmlform-int-toolow": "$1 किंवा मोठा आकडा द्या.",
        "htmlform-int-toohigh": "$1 किंवा त्याहून छोटा आकडा द्या.",
        "htmlform-required": "ही किंमत आवश्यक आहे",
        "api-error-file-too-large": "तुम्ही प्रस्तुत केलेली संचिका आकाराने खूप मोठी होती.",
        "api-error-filename-tooshort": "संचिकेचे नाव खूपच छोटे आहे.",
        "api-error-filetype-banned": "याप्रकारची संचिका प्रतिबंधित आहे.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|हà¥\80 à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¸à¤²à¥\87ला  à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87.|हà¥\8dया à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¸à¤²à¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87त.}} $2 {{PLURAL:$3|हà¥\80 à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤\85सलà¥\87ला à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87|हà¥\8dया परवानगी असलेल्या संचिका-प्रकार आहेत}}.",
+       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|हा à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¸à¤²à¥\87ला  à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87|या à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¸à¤²à¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87त}}. $2 {{PLURAL:$3|हा à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤\85सलà¥\87ला à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87|या परवानगी असलेल्या संचिका-प्रकार आहेत}}.",
        "api-error-filetype-missing": "या संचिकेस विस्तार(एक्सटेंशन) नाही.",
        "api-error-hookaborted": "तुम्ही केलेला बदल extension ने उलटवला आहे",
        "api-error-http": "अंतर्गत त्रुटी: सर्व्हरशी जोडणी होऊ शकली नाही.",
index eaed165..e1ae951 100644 (file)
@@ -47,6 +47,7 @@
        "tog-watchlisthidebots": "Annasconne 'e cagnamiènte d' 'e bot ncopp'a l'elenco 'e cuntrollo",
        "tog-watchlisthideminor": "Annascunne 'e cagnamiente piccerille d' 'a lista 'e cuntrollo mia",
        "tog-watchlisthideliu": "Annascunne 'e cagnamiénte 'e l'utente riggistrate 'a l'elenco 'e cuntrollo",
+       "tog-watchlistreloadautomatically": "Recarreca l'elenco 'e paggene cuntrullate automaticamente quanno nu filtro se fosse cagnato (ce buò 'o JavaScript)",
        "tog-watchlisthideanons": "Annascunne 'e cagnamiente fatte d'anonime 'a l'elenco 'e cuntrollo",
        "tog-watchlisthidepatrolled": "Annascunne 'e modifiche cuntrullate 'a l'elenco 'e cuntrollo",
        "tog-watchlisthidecategorization": "Annascunne 'a categorizzazione d' 'e paggene",
        "wrongpasswordempty": "'A password nzertàta è abbacante.\nPe' piacere pruvate n'ata vota.",
        "passwordtooshort": "'E password hann'avé minimo {{PLURAL:$1|nu carattere|$1 carattere}}.",
        "passwordtoolong": "'E password nun ponno essere cchiù luonghe 'e {{PLURAL:$1|nu carattere|$1 carattere}}.",
+       "passwordtoopopular": "'E parole comune nun se ponno ausà pe' ve fà na password. Sciglite na password cchiù unica.",
        "password-name-match": "'A password adda essere diverza 'a 'o nomme utente.",
        "password-login-forbidden": "L'uso 'e stu nomme utente e password è stato proibito.",
        "mailmypassword": "Riabbìa 'a password",
index 2e62c91..4cf30a0 100644 (file)
        "contributions": "{{GENDER:$1|Brukerbidrag}}",
        "contributions-title": "Brukerbidrag av $1",
        "mycontris": "Bidrag",
+       "anoncontribs": "Bidrag",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Brukerkontoen «$1» er ikke registrert.",
        "nocontribs": "Ingen endringer er funnet som passer disse kriteriene.",
index 7c985ee..047ae78 100644 (file)
@@ -70,7 +70,8 @@
                        "Mbch331",
                        "Esketti",
                        "M!dgard",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Robin van der Vliet"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
index 56ac0e2..fe824fb 100644 (file)
        "tog-watchlisthidebots": "Ukryj edycje botów na liście obserwowanych",
        "tog-watchlisthideminor": "Ukryj drobne zmiany na liście obserwowanych",
        "tog-watchlisthideliu": "Ukryj edycje zalogowanych użytkowników na liście obserwowanych",
+       "tog-watchlistreloadautomatically": "Automatycznie odświeżaj listę obserwowanych, gdy zmieniany jest filtr (wymagany JavaScript)",
        "tog-watchlisthideanons": "Ukryj edycje anonimowych użytkowników na liście obserwowanych",
        "tog-watchlisthidepatrolled": "Ukryj sprawdzone edycje na liście obserwowanych",
        "tog-watchlisthidecategorization": "Ukryj kategoryzację stron",
        "wrongpasswordempty": "Wprowadzone hasło jest puste. Spróbuj ponownie.",
        "passwordtooshort": "Hasło musi mieć co najmniej $1 {{PLURAL:$1|znak|znaki|znaków}}.",
        "passwordtoolong": "Hasło nie może być dłuższe niż  {{PLURAL:$1|1 znak|$1 znaków}}.",
+       "passwordtoopopular": "Często wybierane hasła nie mogą być stosowane. Proszę wybrać hasło bardziej unikalne.",
        "password-name-match": "Hasło musi być inne niż nazwa użytkownika.",
        "password-login-forbidden": "Wykorzystanie tej nazwy użytkownika lub hasła zostało zabronione.",
        "mailmypassword": "Zresetuj hasło",
        "userinvalidcssjstitle": "'''Uwaga:''' Brak skórki o nazwie „$1”.\nStrony użytkownika zawierające CSS i JavaScript powinny zaczynać się małą literą, np. {{ns:user}}:Foo/vector.css, w przeciwieństwie do nieprawidłowego {{ns:user}}:Foo/Vector.css.",
        "updated": "(Zmodyfikowano)",
        "note": "'''Uwaga:'''",
-       "previewnote": "'''To jest tylko podgląd'''\nZmiany nie zostały jeszcze zapisane!",
+       "previewnote": "<strong>To jest tylko podgląd.</strong>\nZmiany nie zostały jeszcze zapisane!",
        "continue-editing": "Przejdź do pola edycji",
        "previewconflict": "Podgląd odnosi się do tekstu z górnego pola edycji. Tak będzie wyglądać strona, jeśli zdecydujesz się ją zapisać.",
        "session_fail_preview": "'''Uwaga! Serwer nie może przetworzyć tej edycji z powodu utraty danych sesji.\nSpróbuj jeszcze raz.\nJeśli to nie pomoże – [[Special:UserLogout|wyloguj się]] i zaloguj ponownie.'''",
        "right-viewmyprivateinfo": "Podgląd swoich prywatnych danych (np. adres e-mail, prawdziwe imię i nazwisko)",
        "right-editmyprivateinfo": "Edycja swoich prywatnych danych (np. adres e-mail, prawdziwe imię i nazwisko)",
        "right-editmyoptions": "Edycja swoich preferencji",
-       "right-rollback": "Szybkie wycofanie zmian wprowadzonych przez użytkownika, który jako ostatni edytował stronę",
+       "right-rollback": "Szybkie wycofywanie zmian wprowadzonych przez użytkownika, który jako ostatni edytował stronę",
        "right-markbotedits": "Oznaczanie rewertu jako edycji bota",
        "right-noratelimit": "Brak ograniczeń przepustowości",
        "right-import": "Importowanie stron z innych wiki",
index 9e53166..08b8168 100644 (file)
        "yourlanguage": "ژبه:",
        "yourvariant": "د ژبگړدود مېنځپانگه:",
        "yournick": "نوی لاسليک:",
+       "prefs-help-signature": "د خبرو اترو مخونو د تبصرو پای بايد د \"<nowiki>~~~~</nowiki>\" په کوډ لاسليک شي، دا کوډ به بيا په خپلکاره توگه ستاسې په لاسليک او وخت ټاپې اړول کېږي.",
        "badsiglength": "ستاسو لاسليک ډېر اوږد دی.\nبايد چې لاسليک مو له $1 {{PLURAL:$1|توري|تورو}} نه لږ وي.",
        "yourgender": "څنگه غواړۍ ځان څرگند کړۍ؟",
        "gender-unknown": "ناڅرگنده",
        "importnopages": "د رالېږدولو لپاره مخونه نشته.",
        "imported-log-entries": "$1 {{PLURAL:$1|يادښتليک راوړل شوی|يادښتليکونه راوړل شوي}}.",
        "importcantopen": "واردونکې دوتنه و نه پرانيستل شوه.",
+       "importbadinterwiki": "ناسمه ويکيخپلمنځي تړنه",
        "import-upload": "د XML اومتوک پورته کول",
        "import-token-mismatch": "د اومتوک غونډېدنه له لاسه وتلې.\nلطفاً بيا يې وآزمايئ.",
        "importlogpage": "د واردولو يادښت",
        "metadata-fields": "د انځور مېټاډاټا ډگرونه چې لړليک يې په همدې پيغام کې په لاندې توگه راغلی د انځور مخ په ښکارېدنه کې به هغه وخت ورگډ شي کله چې د مېټاډاټا لښتيال غځېږي.\nنور څه به په تلواليزه توگه پټ پاتې وي.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "سوروالی",
        "exif-imagelength": "لوړوالی",
+       "exif-photometricinterpretation": "پېکسل ترکيب",
        "exif-orientation": "لورموندنه",
+       "exif-planarconfiguration": "اومتوک ترتيب",
        "exif-xresolution": "څنډيز ژورليد",
        "exif-yresolution": "ولاړيز ژورليد",
        "exif-stripoffsets": "د انځور مالوماتځی",
        "exif-relatedsoundfile": "اړونده غږيزه دوتنه",
        "exif-datetimeoriginal": "د اومتوک د جوړېدنې وخت او نېټه",
        "exif-datetimedigitized": "د گڼياليز کېدنې وخت او نېټه",
+       "exif-exposuretime": "رڼاغورځونې وخت",
        "exif-exposuretime-format": "$1 ثانيه ($2)",
        "exif-fnumber": "F شمېره",
+       "exif-exposureprogram": "رڼاغورځونې پروگرام",
        "exif-spectralsensitivity": "طيفي حساسيت",
        "exif-isospeedratings": "د ISO چټکتيا ارزونه",
        "exif-shutterspeedvalue": "د APEX بندگر چټکتيا",
        "exif-gaincontrol": "د صحنې تنظيم",
        "exif-contrast": "رڼښت",
        "exif-saturation": "رنگ گاټه توب",
+       "exif-gpslatitude": "لوړوالی",
+       "exif-gpslongituderef": "ختيځ يا لوېديځ اوږدالی",
+       "exif-gpslongitude": "اوږدوالی",
        "exif-gpsaltituderef": "د لوړوالي سرچينه",
        "exif-gpsaltitude": "لوړوالی",
+       "exif-gpstimestamp": "GPS وخت (اتومي گړۍ)",
+       "exif-gpssatellites": "د مېچنې لپاره کارېدلې سپوږمکۍ",
+       "exif-gpsstatus": "د اخيستگر دريځ",
        "exif-gpsmeasuremode": "د مېچنې حالت",
        "exif-gpsdop": "د مېچنې دقت",
        "exif-gpsspeedref": "د سرعت يوون",
        "exif-gaincontrol-0": "هېڅ",
        "exif-contrast-0": "نورمال",
        "exif-contrast-1": "پوست",
+       "exif-contrast-2": "کلک",
        "exif-saturation-0": "نورمال",
        "exif-sharpness-0": "نورمال",
        "exif-sharpness-1": "پوست",
+       "exif-sharpness-2": "کلک",
        "exif-subjectdistancerange-0": "ناجوت",
        "exif-subjectdistancerange-1": "ماکرو",
        "exif-subjectdistancerange-2": "نژدې ليدون",
        "autosumm-replace": "دا مخ د '$1' پرځای راوستل",
        "autoredircomment": "[[$1]] ته وروگرځېده",
        "autosumm-new": "د \"$1\" تورو مخ جوړ شو",
+       "autosumm-newblank": "تش مخ جوړ شو",
        "size-bytes": "$1 بايټ",
        "size-kilobytes": "$1 کيلوبايټ",
        "size-megabytes": "$1 مېگابايټ",
        "fileduplicatesearch-result-1": "\"$1\" بله کټ مټ ورته غبرګونې دوتنه نلري.",
        "fileduplicatesearch-noresults": "د \"$1\" په نوم دوتنه و نه موندل شوه.",
        "specialpages": "ځانگړي مخونه",
+       "specialpages-note-top": "څرگندونې",
        "specialpages-note": "* نورماله ځانگړي مخونه.\n* <strong class=\"mw-specialpagerestricted\">محدوده ځانگړي مخونه.</strong>",
        "specialpages-group-maintenance": "د څارنې راپورونه",
        "specialpages-group-other": "نور ځانگړي مخونه",
index ddefe9e..5533386 100644 (file)
        "contributions": "Contribuições {{GENDER:$1|do utilizador|da utilizadora}}",
        "contributions-title": "Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1",
        "mycontris": "Contribuições",
+       "anoncontribs": "Contribuições",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "A conta de utilizador \"$1\" não está registada.",
        "nocontribs": "Não foram encontradas alterações com este critério.",
index dcf26b3..b8e7791 100644 (file)
                        "TTO",
                        "J. 'mach' wust",
                        "Ciencia Al Poder",
-                       "Aursani"
+                       "Aursani",
+                       "Robin van der Vliet"
                ]
        },
        "sidebar": "{{notranslate}}",
        "tog-watchlisthidebots": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide bot edits from watchlist. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-watchlisthideminor": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide minor edits from watchlist. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-watchlisthideliu": "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
+       "tog-watchlistreloadautomatically": "[[Special:Preferences]], tab 'Watchlist'. Offers user to to automatically refresh the watchlist page, when a filter is changed.",
        "tog-watchlisthideanons": "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-watchlisthidepatrolled": "Option in Watchlist tab of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-watchlisthidecategorization": "Option in Watchlist tab of [[Special:Preferences]]. Offers user to hide/show categorization of pages. Appears next to checkboxes with labels such as {{msg-mw|tog-watchlisthideminor}}.",
        "wrongpasswordempty": "Error message displayed when entering a blank password.\n{{Identical|Please try again}}",
        "passwordtooshort": "This message is shown in [[Special:Preferences]] and [[Special:CreateAccount]].\n\nParameters:\n* $1 - the minimum number of characters in the password",
        "passwordtoolong": "This message is shown in [[Special:Preferences]], [[Special:CreateAccount]], and [[Special:Userlogin]].\n\nParameters:\n* $1 - the maximum number of characters in the password",
+       "passwordtoopopular": "Shown if the user chooses a really popular password.",
        "password-name-match": "Used as error message when password validity check failed.",
        "password-login-forbidden": "Error message shown when the user has tried to log in using one of the special username/password combinations used for MediaWiki testing. (See [[mwr:75589]], [[mwr:75605]].)",
        "mailmypassword": "Used as label for Submit button in [[Special:PasswordReset]].\n{{Identical|Reset password}}",
index ec61e6d..70550d1 100644 (file)
        "tog-watchlisthidebots": "Скрывать правки ботов из списка наблюдения",
        "tog-watchlisthideminor": "Скрывать малые правки из списка наблюдения",
        "tog-watchlisthideliu": "Скрывать правки представившихся участников из списка наблюдения",
+       "tog-watchlistreloadautomatically": "Перезагружать список наблюдения автоматически всякий раз, когда изменяется фильтр (требуется JavaScript)",
        "tog-watchlisthideanons": "Скрывать правки анонимных участников из списка наблюдения",
        "tog-watchlisthidepatrolled": "Скрывать отпатрулированные правки из списка наблюдения",
        "tog-watchlisthidecategorization": "Скрывать категоризацию страниц",
        "wrongpasswordempty": "Пожалуйста, введите непустой пароль.",
        "passwordtooshort": "Пароль должен состоять не менее чем из $1 {{PLURAL:$1|символа|символов}}.",
        "passwordtoolong": "Пароль не может превышать {{PLURAL:$1|1 символ|$1 символов|$1 символа}}.",
+       "passwordtoopopular": "Часто выбираемые пароли не могут быть использованы. Пожалуйста, выберите более уникальный пароль.",
        "password-name-match": "Введённый пароль должен отличаться от имени участника.",
        "password-login-forbidden": "Использование этого имени участника и пароля запрещено.",
        "mailmypassword": "Сбросить пароль",
index 17d95e8..a9dbfd3 100644 (file)
        "watchlisttools-edit": "ٽيٽ فهرست ڏسو ۽ سنواريو",
        "watchlisttools-raw": "ڪچي ٽيٽ فهرست سنواريو",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ڳالهہ]])",
-       "version": "ڀيرو",
+       "version": "ورزن",
        "version-extensions": "تنصيب شده توسيعات",
-       "version-skins": "تنصيب شده چَمُون",
+       "version-skins": "تنصيب شده چَمڙيون",
        "version-specialpages": "خاص صفحا",
        "version-variables": "ڦِرڻا",
        "version-other": "ٻيو",
        "version-ext-license": "لائيسنس",
        "version-ext-colheader-name": "توسيع",
        "version-skin-colheader-name": "چَمَ",
-       "version-ext-colheader-version": "ڀيرو",
+       "version-ext-colheader-version": "ورزن",
        "version-ext-colheader-license": "لائيسنس",
        "version-ext-colheader-description": "تشريح",
        "version-ext-colheader-credits": "ليکڪ",
        "version-poweredby-translators": "translatewiki.net جا ترجميڪار",
        "version-software": "تنصيب شده منطقگري",
        "version-software-product": "پراڊڪٽ",
-       "version-software-version": "ڀيرو",
+       "version-software-version": "ورزن",
        "version-libraries-library": "لائبريري",
-       "version-libraries-version": "ڀيرو",
+       "version-libraries-version": "ورزن",
        "version-libraries-license": "لائيسنس",
        "version-libraries-description": "تشريح",
        "version-libraries-authors": "ليکڪ",
        "tags-delete-title": "ٽيگ ڊاهيو",
        "tags-delete-reason": "سبب:",
        "tags-activate-reason": "سبب:",
-       "tags-activate-submit": "فعاليو",
-       "tags-deactivate-title": "Ù½Ù\8aÚ¯ Ú©Ù\8a Ø§Ú»Ù\81عاÙ\84يو.",
+       "tags-activate-submit": "فعال بڻايو",
+       "tags-deactivate-title": "Ù½Ù\8aÚ¯ Ú©Ù\8a ØºÙ\8aر Ù\81عاÙ\84 Ù\86ڻايو.",
        "tags-deactivate-reason": "سبب:",
        "tags-edit-existing-tags-none": "\"ڪو بہ نہ\"",
        "tags-edit-new-tags": "نوان ٽيگس:",
index 14dfb7f..820b5a7 100644 (file)
        "morenotlisted": "Tento zoznam nie je úplný.",
        "mypage": "Stránka",
        "mytalk": "Diskusia",
-       "anontalk": "Diskusia k tejto IP adrese",
+       "anontalk": "Diskusia",
        "navigation": "Navigácia",
        "and": "&#32;a",
        "qbfind": "Hľadať",
        "createacct-reason": "Dôvod",
        "createacct-reason-ph": "Prečo si vytvárate ďalší účet",
        "createacct-submit": "Vytvoriť účet",
-       "createacct-another-submit": "Vytvoriť ďalší účet",
+       "createacct-another-submit": "Vytvoriť účet",
        "createacct-benefit-heading": "{{GRAMMAR:akuzatív|{{SITENAME}}}} tvoria ľudia ako vy.",
        "createacct-benefit-body1": "{{PLURAL:$1|úprava|úpravy|úprav}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stránka|stránky|stránok}}",
        "passwordreset-emailsent": "Email s novým heslom bol odoslaný.",
        "passwordreset-emailsent-capture": "Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie.",
        "passwordreset-emailerror-capture": "Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať {{GENDER:$2|používateľovi}}: $1",
-       "changeemail": "Zmeniť emailovú adresu",
+       "changeemail": "Zmeniť alebo odstrániť e-mailovú adresu",
        "changeemail-header": "Zmena e-mailovej adresy pre účet",
        "changeemail-passwordrequired": "Pre potvrdenie tejto zmeny budete musieť zadať svoje heslo.",
        "changeemail-no-info": "Na prístup k tejto stránke musíte byť prihlásený.",
        "movenosubpage": "Táto stránka nemá podstránky.",
        "movereason": "Dôvod:",
        "revertmove": "obnoviť",
-       "delete_and_move": "Vymazať a presunúť",
        "delete_and_move_text": "==Je potrebné zmazať stránku==\n\nCieľová stránka „[[:$1]]“ už existuje. Chcete ho vymazať a vytvoriť tak priestor pre presun?",
        "delete_and_move_confirm": "Áno, zmaž stránku",
        "delete_and_move_reason": "Vymazané, aby sa umožnil presun z „[[$1]]“",
        "spam_reverting": "Vraciam poslednú verziu, ktorá neobsahuje odkazy na $1",
        "spam_blanking": "Všetky revízie obsahovali odkaz na $1, odstraňujem obsah",
        "spam_deleting": "Všetky revízie obsahovali odkaz na $1, odstraňuje sa",
-       "simpleantispam-label": "Antispamová kontrola.\n'''NEVYPĹŇAJTE''' nasledovné!",
+       "simpleantispam-label": "Antispamová kontrola.\n<strong>Nevypĺňajte</strong> nasledovné!",
        "pageinfo-title": "Informácie o „$1“",
        "pageinfo-not-current": "Ospravedlňujeme sa, túto informáciu nie je možné poskytnúť pre staré revízie.",
        "pageinfo-header-basic": "Základné údaje",
index 9e6c226..f7193ef 100644 (file)
@@ -46,6 +46,7 @@
        "tog-watchlisthidebots": "Na spisku nadzorov skrij urejanja botov",
        "tog-watchlisthideminor": "Na spisku nadzorov skrij manjša urejanja",
        "tog-watchlisthideliu": "Na spisku nadzorov skrij urejanja prijavljenih uporabnikov",
+       "tog-watchlistreloadautomatically": "Samodejno ponovno naloži spisek nadzorov ob spremembi filtra (zahteva JavaScript)",
        "tog-watchlisthideanons": "Na spisku nadzorov skrij urejanja anonimnih uporabnikov",
        "tog-watchlisthidepatrolled": "Na spisku nadzorov skrij pregledana urejanja",
        "tog-watchlisthidecategorization": "Skrij kategorizacijo strani",
        "wrongpasswordempty": "Vpisali ste prazno geslo. Prosimo, poskusite znova.",
        "passwordtooshort": "Geslo mora imeti najmanj $1 {{PLURAL:$1|znak|znaka|znake|znakov|znakov}}.",
        "passwordtoolong": "Gesla ne morejo biti daljša od {{PLURAL:$1|1 znaka|$1 znakov}}.",
+       "passwordtoopopular": "Pogosto izbrana gesla ne morete uporabiti. Prosimo, izberite bolj edinstveno geslo.",
        "password-name-match": "Vaše geslo se mora razlikovati od vašega uporabniškega imena.",
        "password-login-forbidden": "Uporaba tega uporabniškega imena in gesla je prepovedana.",
        "mailmypassword": "Ponastavitev gesla",
index ad56e39..1c1cbb3 100644 (file)
@@ -67,7 +67,8 @@
                        "Macofe",
                        "Aaoo",
                        "Josve05a",
-                       "Pipetricker"
+                       "Pipetricker",
+                       "Dammråtta"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "tog-watchlisthidebots": "Visa inte robotredigeringar i bevakningslistan",
        "tog-watchlisthideminor": "Dölj mindre ändringar i bevakningslistan",
        "tog-watchlisthideliu": "Visa inte redigeringar av inloggade användare i bevakningslistan",
+       "tog-watchlistreloadautomatically": "Uppdatera bevakningslistan automatiskt när ett filter ändras (JavaScript krävs)",
        "tog-watchlisthideanons": "Dölj redigeringar av anonyma användare i bevakningslistan",
        "tog-watchlisthidepatrolled": "Dölj patrullerade redigeringar i bevakningslistan",
        "tog-watchlisthidecategorization": "Dölj kategorisering av sidor",
        "december-gen": "december",
        "jan": "jan",
        "feb": "feb",
-       "mar": "mar",
+       "mar": "mars",
        "apr": "apr",
        "may": "maj",
-       "jun": "jun",
-       "jul": "jul",
+       "jun": "juni",
+       "jul": "juli",
        "aug": "aug",
-       "sep": "sep",
+       "sep": "sept",
        "oct": "okt",
        "nov": "nov",
        "dec": "dec",
        "wrongpasswordempty": "Lösenordet som angavs var blankt. Var god försök igen.",
        "passwordtooshort": "Lösenord måste innehålla minst {{PLURAL:$1|$1 tecken}}.",
        "passwordtoolong": "Lösenord kan inte vara längre än {{PLURAL:$1|1 tecken|$1 tecken}}.",
+       "passwordtoopopular": "Vanliga lösenord kan inte användas. Välj ett mer unikt lösenord.",
        "password-name-match": "Ditt lösenord måste vara olikt ditt användarnamn.",
        "password-login-forbidden": "Användningen av dessa användarnamn och lösenord har förbjudits.",
        "mailmypassword": "Återställ lösenord",
        "tooltip-ca-watch": "Lägg till sidan på din bevakningslista",
        "tooltip-ca-unwatch": "Ta bort denna sida från din bevakningslista",
        "tooltip-search": "Sök på {{SITENAME}}",
-       "tooltip-search-go": "Gå till sidan med detta namn om den finns",
+       "tooltip-search-go": "Gå till sidan med exakt detta namn om den finns",
        "tooltip-search-fulltext": "Sök efter sidor som innehåller denna text",
        "tooltip-p-logo": "Besök huvudsidan",
        "tooltip-n-mainpage": "Besök huvudsidan",
index 5965091..4573a28 100644 (file)
        "morenotlisted": "Bu liste tam değildir.",
        "mypage": "Sayfa",
        "mytalk": "Mesaj",
-       "anontalk": "Bu IP'nin iletileri",
+       "anontalk": "Mesaj",
        "navigation": "Gezinti",
        "and": "&#32;ve",
        "qbfind": "Bul",
        "wrongpasswordempty": "Boş parola girdiniz. Lütfen tekrar deneyiniz.",
        "passwordtooshort": "Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.",
        "passwordtoolong": "Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.",
+       "passwordtoopopular": "Sıklıkla seçilen parolalar kullanılamaz. Lütfen daha özgün bir parola belirleyin.",
        "password-name-match": "Şifreniz kullanıcı adınızdan farklı olmalıdır.",
        "password-login-forbidden": "Bu kullanıcı adı ve şifre kullanımı yasaklanmıştır",
        "mailmypassword": "Parolayı sıfırla",
        "wlshowlast": "Son $1 saati $2 günü göster",
        "watchlistall2": "Hepsini göster",
        "watchlist-hide": "Gizle",
+       "wlshowhideminor": "Küçük değişiklikler",
        "wlshowhidebots": "botlar",
        "wlshowhideliu": "kayıtlı kullanıcılar",
        "wlshowhideanons": "anonim kullanıcılar",
        "contributions": "{{GENDER:$1|Kullanıcı}} katkıları",
        "contributions-title": "$1 için kullanıcı katkıları",
        "mycontris": "Katkılar",
+       "anoncontribs": "Katkılar",
        "contribsub2": "{{GENDER:$3|$1}} ($2) tarafından",
        "contributions-userdoesnotexist": "\"$1\" kullanıcı hesabı kayıtlı değil.",
        "nocontribs": "Bu kriterlere uyan değişiklik bulunamadı",
        "tooltip-pt-preferences": "Tercihleriniz (ayarlarınız)",
        "tooltip-pt-watchlist": "Değişiklikler için izlemeye aldığınız sayfaların listesi",
        "tooltip-pt-mycontris": "Katkılarınızın listesi",
+       "tooltip-pt-anoncontribs": "Bu IP adresinden yapılmış değişiklikler listesi",
        "tooltip-pt-login": "Oturum açmanız tavsiye edilmektedir; ancak bu zorunda değildir",
        "tooltip-pt-logout": "Sistemden çık",
        "tooltip-pt-createaccount": "Bir hesap oluşturup oturum açmanız tavsiye edilmektedir ancak bu zorunlu değildir",
index 8cd5662..118c71a 100644 (file)
        "morenotlisted": "Исемлек тулы түгел.",
        "mypage": "Бит",
        "mytalk": "Бәхәс бите",
-       "anontalk": "Бу IP адресы өчен бәхәс бите",
+       "anontalk": "Бәхәс",
        "navigation": "Навигация",
        "and": "&#32;һәм",
        "qbfind": "Эзләү",
        "sort-descending": "Кимү буенча урнаштыру",
        "sort-ascending": "Арту буенча урнаштыру",
        "nstab-main": "Бит",
-       "nstab-user": "Кулланучы бите",
+       "nstab-user": "Кулланучы",
        "nstab-media": "Мультимедиа",
        "nstab-special": "Махсус бит",
        "nstab-project": "Проект бите",
        "passwordreset-emailsent": "Электрон әрҗәгә искәртү җибәрелгән иде",
        "passwordreset-emailsent-capture": "Җибәрелгән хат-искәртү түбәндә китерелә",
        "passwordreset-emailerror-capture": "Түбәндә язылган хат-искәртү китерелгән, аны җибәрмәүнең сәбәбе:$1",
-       "changeemail": "Электрон әрҗә адресын үзгәртү",
+       "changeemail": "Электрон әрҗә адресын үзгәртү яисә бетерү",
        "changeemail-header": "Электрон әрҗә адресын үзгәртү",
        "changeemail-no-info": "Бу сәхифәгә турыдан-туры мөрәҗәгать итәр өчен, сез системага керергә тиешсез",
        "changeemail-oldemail": "Хәзерге электрон әрҗә адресы:",
        "edit-already-exists": "Яңа бит төзеп булмый.\nУл инде бар.",
        "editwarning-warning": "Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.\nӘгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.",
        "duplicate-args-category": "Калыпны чакыруда кабатлап торган аргументларны кулланган битләр",
-       "expensive-parserfunction-warning": "'''Игътибар:''' бу биттә хәтерне еш кулланучы функцияләр артык күп.\n\nЧикләү: $2 {{PLURAL:$2|1=куллану}}, бу очракта {{PLURAL:$1|$1 тапкыр}} башкарырга рөхсәт ителә.",
+       "expensive-parserfunction-warning": "<strong>Игътибар:</strong>  бу биттә хәтерне еш кулланучы функцияләр артык күп.\n\nБиттә {{PLURAL:$2|$2 эш куллану}} рөхсәт ителгән очракта, монда $1 {{PLURAL:$1|эш башкарыла}}.",
        "expensive-parserfunction-category": "Хәтерне еш кулланучы функцияләр күп булган битләр",
        "post-expand-template-inclusion-warning": "'''Игътибар:''' Кулланылучы үрнәкләр артык зур.\nКайберләре кабызылмаячак.",
        "post-expand-template-inclusion-category": "Рөхсәт ителгән күләмнән артык булган үрнәкле битләр",
        "nolicense": "Юк",
        "license-nopreview": "(Алдан карау мөмкин түгел)",
        "upload_source_file": "(сезнең санакта сайланган файл)",
+       "listfiles-summary": "Әлеге махсус бит Сез йөкләгән бөтен файлларны күрсәтә.",
        "imgfile": "файл",
        "listfiles": "Сүрәтләр исемлеге",
        "listfiles_thumb": "Миниатюра",
        "newimages-legend": "Фильтр",
        "ilsubmit": "Эзләү",
        "hours": "{{PLURAL:$1|$1 cәгать|$1 cәгать}}",
+       "ago": "$1 элек",
        "hours-ago": "$1 cәгать элек",
        "minutes-ago": "$1 минут элек",
        "bad_image_list": "Киләчәк рәвеш кирәк:\n\nИсемлек кисәкләре генә (* символыннан башланучы юллар) саналырлар.\nЮлның беренче сылтамасы куйма өчен тыелган рәсемгә сылтама булырга тиеш.\nШул ук юлның киләчәк сылтамалары чыгармалар, рәсемгә тыелмаган битләре, саналырлар.",
        "api-error-unknownerror": "Билгесез хата: \"$1\".",
        "api-error-uploaddisabled": "Бу викидә файллар йөкләү мөмкинлеге сүндерелгән.",
        "api-error-verification-error": "Бәлки, бу файл бозылгандыр яки дөрес түгел киңәйтелмәгә ия.",
+       "duration-minutes": "$1 {{PLURAL:$1|минут}}",
+       "duration-hours": "$1 {{PLURAL:$1|сәгать}}",
+       "duration-days": "$1 {{PLURAL:$1|көн}}",
        "expandtemplates": "Үрнәкләрне ачу",
        "expand_templates_ok": "OK",
        "special-characters-group-latin": "Латин",
index cf80d0b..63db279 100644 (file)
        "tog-watchlisthidebots": "隐藏监视列表中的机器人编辑",
        "tog-watchlisthideminor": "隐藏监视列表中的小编辑",
        "tog-watchlisthideliu": "隐藏监视列表中的登录用户的编辑",
+       "tog-watchlistreloadautomatically": "当一条过滤器规则被更改时,自动重新加载监视列表(需要JavaScript)",
        "tog-watchlisthideanons": "隐藏监视列表中的匿名用户的编辑",
        "tog-watchlisthidepatrolled": "隐藏监视列表中的已巡查编辑",
        "tog-watchlisthidecategorization": "隐藏对页面的分类",
        "wrongpasswordempty": "密码输入为空。请重试。",
        "passwordtooshort": "您的密码至少需要$1个字符。",
        "passwordtoolong": "密码不能超过{{PLURAL:$1|$1个字符}}。",
+       "passwordtoopopular": "不能使用普遍选择的密码。请选择一个更独一无二的密码。",
        "password-name-match": "您的密码必须和您的用户名不相同。",
        "password-login-forbidden": "这个用户名称及密码的使用是被禁止的。",
        "mailmypassword": "重置密码",
        "autosumm-newblank": "创建空白页面",
        "size-bytes": "$1字节",
        "lag-warn-normal": "过去$1秒内的更改未必会在这个列表中显示。",
-       "lag-warn-high": "由于数据库的过度延迟,过去$1秒的更改未必会在这个列表中显示。",
+       "lag-warn-high": "由于数据库的过度延迟,$1秒内的更改未必会在这个列表中显示。",
        "watchlistedit-normal-title": "编辑监视列表",
        "watchlistedit-normal-legend": "从监视列表移除标题",
        "watchlistedit-normal-explain": "您的监视列表中的标题显示在下方。要移除标题,请勾选它旁边的复选框,然后点击“{{int:Watchlistedit-normal-submit}}”。您也可以[[Special:EditWatchlist/raw|编辑原始列表]]。",
index 4e6f12b..ec20601 100644 (file)
@@ -360,6 +360,7 @@ $magicWords = array(
        'numberingroup'           => array( 1, 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'          => array( 1, '__STATICREDIRECT__' ),
        'protectionlevel'         => array( 1, 'PROTECTIONLEVEL' ),
+       'protectionexpiry'        => array( 1, 'PROTECTIONEXPIRY' ),
        'cascadingsources'        => array( 1, 'CASCADINGSOURCES' ),
        'formatdate'              => array( 0, 'formatdate', 'dateformat' ),
        'url_path'                => array( 0, 'PATH' ),
index 84e3aee..8368c84 100644 (file)
@@ -173,9 +173,3 @@ class TableCleanup extends Maintenance {
        }
 }
 
-class TableCleanupTest extends TableCleanup {
-       function processRow( $row ) {
-               $this->progress( mt_rand( 0, 1 ) );
-       }
-}
-
diff --git a/maintenance/createCommonPasswordCdb.php b/maintenance/createCommonPasswordCdb.php
new file mode 100644 (file)
index 0000000..c678712
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Create serialized/commonpasswords.cdb
+ *
+ * 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 to create common password cdb database.
+ *
+ * Meant to take a file like
+ * https://github.com/danielmiessler/SecLists/blob/master/Passwords/rockyou.txt?raw=true
+ * as input.
+ * @see serialized/commonpasswords.cdb and PasswordPolicyChecks::checkPopularPasswordBlacklist
+ * @since 1.27
+ * @ingroup Maintenance
+ */
+class GenerateCommonPassword extends Maintenance {
+       public function __construct() {
+               global $IP;
+               parent::__construct();
+               $this->mDescription = "Generate CDB file of common passwords";
+               $this->addOption( 'limit', "Max number of passwords to write", false, true, 'l' );
+               $this->addArg( 'inputfile', 'List of passwords (one per line) to use or - for stdin', true );
+               $this->addArg(
+                       'output',
+                       "Location to write CDB file to (Try $IP/serialized/commonpasswords.cdb)",
+                       true
+               );
+       }
+
+       public function execute() {
+               $limit = (int)$this->getOption( 'limit', PHP_INT_MAX );
+               $langEn = Language::factory( 'en' );
+
+               $infile = $this->getArg( 0 );
+               if ( $infile === '-' ) {
+                       $infile = 'php://stdin';
+               }
+               $outfile = $this->getArg( 1 );
+
+               if ( !is_readable( $infile ) && $infile !== 'php://stdin' ) {
+                       $this->error( "Cannot open input file $infile for reading", 1 );
+               }
+
+               $file = fopen( $infile, 'r' );
+               if ( $file === false ) {
+                       $this->error( "Cannot read input file $infile", 1 );
+               }
+
+               try {
+                       $db = \Cdb\Writer::open( $outfile );
+
+                       $alreadyWritten = array();
+                       $skipped = 0;
+                       for ( $i = 0; ( $i - $skipped ) < $limit; $i++ ) {
+                               if ( feof( $file ) ) {
+                                       break;
+                               }
+                               $rawLine = fgets( $file );
+
+                               if ( $rawLine === false ) {
+                                       $this->error( "Error reading input file" );
+                                       break;
+                               }
+                               if ( substr( $rawLine, -1 ) !== "\n" && !feof( $file ) ) {
+                                       // We're assuming that this just won't happen.
+                                       $this->error( "fgets did not return whole line at $i??" );
+                               }
+                               $line = $langEn->lc( trim( $rawLine ) );
+                               if ( $line === '' ) {
+                                       $this->error( "Line number " . ( $i + 1 ) . " is blank?" );
+                                       $skipped++;
+                                       continue;
+                               }
+                               if ( isset( $alreadyWritten[$line] ) ) {
+                                       $this->output( "Password '$line' already written (line " . ( $i + 1 ) .")\n" );
+                                       $skipped++;
+                                       continue;
+                               }
+                               $alreadyWritten[$line] = true;
+                               $db->set( $line, $i + 1 - $skipped );
+                       }
+                       // All caps, so cannot conflict with potential password
+                       $db->set( '_TOTALENTRIES', $i - $skipped );
+                       $db->close();
+
+                       $this->output( "Successfully wrote " . ( $i - $skipped ) .
+                               " (out of $i) passwords to $outfile\n"
+                       );
+               } catch ( \Cdb\Exception $e ) {
+                       $this->error( "Error writing cdb file: " . $e->getMessage(), 2 );
+               }
+
+       }
+}
+
+$maintClass = "GenerateCommonPassword";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 0eb5118..aba5ce8 100644 (file)
@@ -1834,6 +1834,9 @@ return array(
                        'mediawiki.util',
                ),
        ),
+       'mediawiki.special.watchlist' => array(
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.watchlist.js',
+       ),
        'mediawiki.special.javaScriptTest' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.javaScriptTest.js',
                'messages' => array_merge( Skin::getSkinNameMessages(), array(
diff --git a/resources/src/mediawiki.special/mediawiki.special.watchlist.js b/resources/src/mediawiki.special/mediawiki.special.watchlist.js
new file mode 100644 (file)
index 0000000..a35f4d1
--- /dev/null
@@ -0,0 +1,15 @@
+/*!
+ * JavaScript for Special:Watchlist
+ *
+ * This script is only loaded, if the user opt-in a setting in Special:Preferences,
+ * that the watchlist should be automatically reloaded, when a filter option is
+ * changed in the header form.
+ */
+jQuery( function ( $ ) {
+       // add a listener on all form elements in the header form
+       $( '#mw-watchlist-form input, #mw-watchlist-form select' ).on( 'change', function () {
+               // submit the form, when one of the input fields was changed
+               $( '#mw-watchlist-form' ).submit();
+       } );
+
+} );
index 5e79039..0117cea 100644 (file)
         * @return {string}
         */
        ForeignStructuredUpload.prototype.getDescriptions = function () {
-               var i, desc, hasEquals, templateCalls = [];
+               var i, desc, templateCalls = [];
 
                for ( i = 0; i < this.descriptions.length; i++ ) {
                        desc = this.descriptions[ i ];
-                       hasEquals = desc.text.indexOf( '=' ) !== -1;
-                       templateCalls.push( '{{' + desc.language + ( hasEquals ? '|1=' : '|' ) + desc.text + '}}' );
+                       templateCalls.push( '{{' + desc.language + '|1=' + desc.text + '}}' );
                }
 
                return templateCalls.join( '\n' );
index d858b62..77fed2c 100644 (file)
        }
 
        $( function () {
-               if ( mw.config.get( 'wgNamespaceNumber' ) !== 6 ) {
+               if ( mw.config.get( 'wgNamespaceNumber' ) !== mw.config.get( 'wgNamespaceIds' ).file ) {
                        return;
                }
                $multipageimage = $( 'table.multipageimage' );
diff --git a/serialized/commonpasswords.cdb b/serialized/commonpasswords.cdb
new file mode 100644 (file)
index 0000000..7b7b043
Binary files /dev/null and b/serialized/commonpasswords.cdb differ
index 61b992b..eb1ad26 100644 (file)
@@ -61,7 +61,7 @@ class ApiQueryTest extends ApiTestCase {
        public function testTitlesAreRejectedIfInvalid() {
                $title = false;
                while ( !$title || Title::newFromText( $title )->exists() ) {
-                       $title = md5( mt_rand( 0, 10000 ) + rand( 0, 999000 ) );
+                       $title = md5( mt_rand( 0, 100000 ) );
                }
 
                $data = $this->doApiRequest( array(
index df4213a..736f6e8 100644 (file)
@@ -34,6 +34,31 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
                $this->expectOutputString( implode( '', $updates ) );
 
                DeferredUpdates::doUpdates();
+
+               $x = null;
+               $y = null;
+               DeferredUpdates::addCallableUpdate(
+                       function () use ( &$x ) {
+                               $x = 'Sherity';
+                       },
+                       DeferredUpdates::PRESEND
+               );
+               DeferredUpdates::addCallableUpdate(
+                       function () use ( &$y ) {
+                               $y = 'Marychu';
+                       },
+                       DeferredUpdates::POSTSEND
+               );
+
+               $this->assertNull( $x, "Update not run yet" );
+               $this->assertNull( $y, "Update not run yet" );
+
+               DeferredUpdates::doUpdates( 'run', DeferredUpdates::PRESEND );
+               $this->assertEquals( "Sherity", $x, "PRESEND update ran" );
+               $this->assertNull( $y, "POSTSEND update not run yet" );
+
+               DeferredUpdates::doUpdates( 'run', DeferredUpdates::POSTSEND );
+               $this->assertEquals( "Marychu", $y, "POSTSEND update ran" );
        }
 
        public function testDoUpdatesCLI() {
diff --git a/tests/phpunit/includes/deferred/SquidUpdateTest.php b/tests/phpunit/includes/deferred/SquidUpdateTest.php
new file mode 100644 (file)
index 0000000..6ceb42c
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+class SquidUpdatesTest extends MediaWikiTestCase {
+       public function testPurgeMergeWeb() {
+               $this->setMwGlobals( 'wgCommandLineMode', false );
+
+               $urls1 = array();
+               $title = Title::newMainPage();
+               $urls1[] = $title->getCanonicalURL( '?x=1' );
+               $urls1[] = $title->getCanonicalURL( '?x=2' );
+               $urls1[] = $title->getCanonicalURL( '?x=3' );
+               $update1 = new SquidUpdate( $urls1 );
+               DeferredUpdates::addUpdate( $update1 );
+
+               $urls2 = array();
+               $urls2[] = $title->getCanonicalURL( '?x=2' );
+               $urls2[] = $title->getCanonicalURL( '?x=3' );
+               $urls2[] = $title->getCanonicalURL( '?x=4' );
+               $update2 = new SquidUpdate( $urls2 );
+               DeferredUpdates::addUpdate( $update2 );
+
+               $wrapper = TestingAccessWrapper::newFromObject( $update1 );
+               $this->assertEquals( array_merge( $urls1, $urls2 ), $wrapper->urls );
+       }
+}
index 9bef8e0..0763a2e 100644 (file)
@@ -18,7 +18,6 @@ class FileBackendTest extends MediaWikiTestCase {
        protected function setUp() {
                global $wgFileBackends;
                parent::setUp();
-               $uniqueId = time() . '-' . mt_rand();
                $tmpDir = $this->getNewTempDirectory();
                if ( $this->getCliArg( 'use-filebackend' ) ) {
                        if ( self::$backendToUse ) {
@@ -58,7 +57,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        'name' => 'localtesting',
                        'lockManager' => LockManagerGroup::singleton()->get( 'fsLockManager' ),
                        'parallelize' => 'implicit',
-                       'wikiId' => wfWikiId() . $uniqueId,
+                       'wikiId' => wfWikiId() . wfRandomString(),
                        'backends' => array(
                                array(
                                        'name' => 'localmultitesting1',
@@ -80,11 +79,6 @@ class FileBackendTest extends MediaWikiTestCase {
                ) );
        }
 
-       protected function tearDown() {
-               parent::tearDown();
-               DeferredUpdates::forceDeferral( false );
-       }
-
        private static function baseStorePath() {
                return 'mwstore://localtesting';
        }
@@ -2504,7 +2498,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        ) )
                );
 
-               DeferredUpdates::forceDeferral( true );
+               $this->setMwGlobals( 'wgCommandLineMode', false );
 
                $p = 'container/test-cont/file.txt';
                $be->quickCreate( array(
@@ -2522,7 +2516,6 @@ class FileBackendTest extends MediaWikiTestCase {
                );
 
                DeferredUpdates::doUpdates();
-               DeferredUpdates::forceDeferral( false );
 
                $this->assertEquals(
                        'cattitude',
index c839bc4..ee0cf2d 100644 (file)
@@ -11,7 +11,7 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
 
                $filename = 'Foo.png';
 
-               $this->tmpPrefix = wfTempDir() . '/migratefilelayout-test-' . time() . '-' . mt_rand();
+               $this->tmpPrefix = $this->getNewTempDirectory();
 
                $backend = new FSFileBackend( array(
                        'name' => 'local-migratefilerepolayouttest',
index e2c6ac7..efc37d2 100644 (file)
@@ -247,7 +247,8 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $curTTLs = array();
                $this->assertEquals(
                        array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs )
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs ),
+                       'Result array populated'
                );
 
                $this->assertEquals( 2, count( $curTTLs ), "Two current TTLs in array" );
@@ -256,12 +257,6 @@ class WANObjectCacheTest extends MediaWikiTestCase {
 
                $cKey1 = wfRandomString();
                $cKey2 = wfRandomString();
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs ),
-                       'Result array populated'
-               );
 
                $priorTime = microtime( true );
                usleep( 1 );
@@ -308,9 +303,9 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                // Fake initial check key to be set in the past. Otherwise we'd have to sleep for
                // several seconds during the test to assert the behaviour.
                foreach ( array( $checkAll, $check1, $check2 ) as $checkKey ) {
-                       $this->internalCache->set( $cache::TIME_KEY_PREFIX . $checkKey,
-                               $cache::PURGE_VAL_PREFIX . microtime( true ) - $cache::HOLDOFF_TTL, $cache::CHECK_KEY_TTL );
+                       $cache->touchCheckKey( $checkKey, WANObjectCache::HOLDOFF_NONE );
                }
+               usleep( 100 );
 
                $cache->set( 'key1', $value1, 10 );
                $cache->set( 'key2', $value2, 10 );
@@ -327,14 +322,12 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                        $result,
                        'Initial values'
                );
-               $this->assertEquals(
-                       array( 'key1' => 0, 'key2' => 0 ),
-                       $curTTLs,
-                       'Initial ttls'
-               );
+               $this->assertGreaterThanOrEqual( 9.5, $curTTLs['key1'], 'Initial ttls' );
+               $this->assertLessThanOrEqual( 10.5, $curTTLs['key1'], 'Initial ttls' );
+               $this->assertGreaterThanOrEqual( 9.5, $curTTLs['key2'], 'Initial ttls' );
+               $this->assertLessThanOrEqual( 10.5, $curTTLs['key2'], 'Initial ttls' );
 
                $cache->touchCheckKey( $check1 );
-               usleep( 100 );
 
                $curTTLs = array();
                $result = $cache->getMulti( array( 'key1', 'key2', 'key3' ), $curTTLs, array(
@@ -349,10 +342,9 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                        'key1 expired by check1, but value still provided'
                );
                $this->assertLessThan( 0, $curTTLs['key1'], 'key1 TTL expired' );
-               $this->assertEquals( 0, $curTTLs['key2'], 'key2 still valid' );
+               $this->assertGreaterThan( 0, $curTTLs['key2'], 'key2 still valid' );
 
                $cache->touchCheckKey( $checkAll );
-               usleep( 100 );
 
                $curTTLs = array();
                $result = $cache->getMulti( array( 'key1', 'key2', 'key3' ), $curTTLs, array(
@@ -370,6 +362,39 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $this->assertLessThan( 0, $curTTLs['key2'], 'key2 expired by checkAll' );
        }
 
+       /**
+        * @covers WANObjectCache::get()
+        * @covers WANObjectCache::processCheckKeys()
+        */
+       public function testCheckKeyInitHoldoff() {
+               $cache = $this->cache;
+
+               for ( $i = 0; $i < 500; ++$i ) {
+                       $key = wfRandomString();
+                       $checkKey = wfRandomString();
+                       // miss, set, hit
+                       $cache->get( $key, $curTTL, array( $checkKey ) );
+                       $cache->set( $key, 'val', 10 );
+                       $curTTL = null;
+                       $v = $cache->get( $key, $curTTL, array( $checkKey ) );
+
+                       $this->assertEquals( 'val', $v );
+                       $this->assertLessThan( 0, $curTTL, "Step $i: CTL < 0 (miss/set/hit)" );
+               }
+
+               for ( $i = 0; $i < 500; ++$i ) {
+                       $key = wfRandomString();
+                       $checkKey = wfRandomString();
+                       // set, hit
+                       $cache->set( $key, 'val', 10 );
+                       $curTTL = null;
+                       $v = $cache->get( $key, $curTTL, array( $checkKey ) );
+
+                       $this->assertEquals( 'val', $v );
+                       $this->assertLessThan( 0, $curTTL, "Step $i: CTL < 0 (set/hit)" );
+               }
+       }
+
        /**
         * @covers WANObjectCache::delete()
         */
index 89b2c17..7123b94 100644 (file)
@@ -62,16 +62,46 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
                );
        }
 
+       /**
+        * @covers UIDGenerator::newUUIDv1
+        */
+       public function testUUIDv1() {
+               $ids = array();
+               for ( $i = 0; $i < 100; $i++ ) {
+                       $id = UIDGenerator::newUUIDv1();
+                       $this->assertEquals( true,
+                               preg_match( '!^[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$!', $id ),
+                               "UID $id has the right format" );
+                       $ids[] = $id;
+
+                       $id = UIDGenerator::newRawUUIDv1();
+                       $this->assertEquals( true,
+                               preg_match( '!^[0-9a-f]{12}1[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
+                               "UID $id has the right format" );
+
+                       $id = UIDGenerator::newRawUUIDv1( UIDGenerator::QUICK_RAND );
+                       $this->assertEquals( true,
+                               preg_match( '!^[0-9a-f]{12}1[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
+                               "UID $id has the right format" );
+               }
+
+               $this->assertEquals( array_unique( $ids ), $ids, "All generated IDs are unique." );
+       }
+
        /**
         * @covers UIDGenerator::newUUIDv4
         */
        public function testUUIDv4() {
+               $ids = array();
                for ( $i = 0; $i < 100; $i++ ) {
                        $id = UIDGenerator::newUUIDv4();
+                       $ids[] = $id;
                        $this->assertEquals( true,
                                preg_match( '!^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$!', $id ),
                                "UID $id has the right format" );
                }
+
+               $this->assertEquals( array_unique( $ids ), $ids, 'All generated IDs are unique.' );
        }
 
        /**
index e867250..80893da 100644 (file)
@@ -21,6 +21,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                        $wgParserCacheType, $wgNamespaceAliases, $wgNamespaceProtection,
                        $parserMemc;
 
+               $tmpDir = $this->getNewTempDirectory();
                $tmpGlobals = array();
 
                $tmpGlobals['wgScript'] = '/index.php';
@@ -38,10 +39,10 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                                'name' => 'local-backend',
                                'wikiId' => wfWikiId(),
                                'containerPaths' => array(
-                                       'local-public' => wfTempDir() . '/test-repo/public',
-                                       'local-thumb' => wfTempDir() . '/test-repo/thumb',
-                                       'local-temp' => wfTempDir() . '/test-repo/temp',
-                                       'local-deleted' => wfTempDir() . '/test-repo/delete',
+                                       'local-public' => "{$tmpDir}/test-repo/public",
+                                       'local-thumb' => "{$tmpDir}/test-repo/thumb",
+                                       'local-temp' => "{$tmpDir}/test-repo/temp",
+                                       'local-deleted' => "{$tmpDir}/test-repo/delete",
                                )
                        ) ),
                );
@@ -176,17 +177,11 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                                return $dir;
                        }
                } else {
-                       $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
+                       $dir = $this->getNewTempDirectory();
                }
 
                wfDebug( "Creating upload directory $dir\n" );
 
-               if ( file_exists( $dir ) ) {
-                       wfDebug( "Already exists!\n" );
-
-                       return $dir;
-               }
-
                wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
                copy( "$IP/tests/phpunit/data/upload/headbg.jpg", "$dir/3/3a/Foobar.jpg" );