Merge "use slave for row estimate in updateCollation.php"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 11 May 2016 17:06:05 +0000 (17:06 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 11 May 2016 17:06:05 +0000 (17:06 +0000)
136 files changed:
RELEASE-NOTES-1.28
autoload.php
composer.json
docs/hooks.txt
includes/AuthPlugin.php
includes/DefaultSettings.php
includes/DummyLinker.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/OutputPage.php
includes/ProtectionForm.php
includes/Revision.php
includes/ServiceWiring.php
includes/SiteStats.php
includes/WebRequest.php
includes/api/ApiMain.php
includes/api/ApiStashEdit.php
includes/api/i18n/eo.json
includes/api/i18n/it.json
includes/api/i18n/jv.json [new file with mode: 0644]
includes/api/i18n/sv.json
includes/api/i18n/vi.json
includes/api/i18n/zh-hans.json
includes/cache/GenderCache.php
includes/changetags/ChangeTags.php
includes/filerepo/FileRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/File.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/jv.json
includes/installer/i18n/zh-hant.json
includes/interwiki/Interwiki.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/IExpiringStore.php
includes/page/WikiFilePage.php
includes/parser/BlockLevelPass.php [new file with mode: 0644]
includes/parser/Parser.php
includes/poolcounter/PoolCounter.php
includes/poolcounter/PoolCounterWork.php
includes/poolcounter/PoolCounterWorkViaCallback.php
includes/resourceloader/ResourceLoaderModule.php
includes/session/SessionInfo.php
includes/session/SessionManager.php
includes/session/SessionManagerInterface.php
includes/session/SessionProvider.php
includes/skins/Skin.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialLockdb.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUnlockdb.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/pagers/ActiveUsersPager.php
includes/user/User.php
includes/widget/SearchInputWidget.php [changed mode: 0644->0755]
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/cs.json
languages/i18n/cy.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/fa.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/gom-latn.json
languages/i18n/he.json
languages/i18n/inh.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/lb.json
languages/i18n/lt.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nds-nl.json
languages/i18n/nn.json
languages/i18n/olo.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sl.json
languages/i18n/sv.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/war.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesCs.php
maintenance/updateCollation.php
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js [changed mode: 0644->0755]
resources/src/mediawiki/api.js
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/page/WikiCategoryPageTest.php
tests/phpunit/includes/poolcounter/PoolCounterTest.php
tests/phpunit/includes/session/SessionInfoTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/session/SessionProviderTest.php

index c950921..e365486 100644 (file)
@@ -11,6 +11,8 @@ production.
   user's language. If such access is attempted, an exception will be thrown.
 
 === New features in 1.28 ===
+* User::isBot() method for checking if an account is a bot role account.
+* Added a new hook, 'UserIsBot', to aid in determining if a user is a bot.
 
 
 === External library changes in 1.28 ===
index c7f8984..1e656e4 100644 (file)
@@ -180,6 +180,7 @@ $wgAutoloadLocalClasses = [
        'BitmapMetadataHandler' => __DIR__ . '/includes/media/BitmapMetadataHandler.php',
        'Blob' => __DIR__ . '/includes/db/DatabaseUtility.php',
        'Block' => __DIR__ . '/includes/Block.php',
+       'BlockLevelPass' => __DIR__ . '/includes/parser/BlockLevelPass.php',
        'BlockListPager' => __DIR__ . '/includes/specials/pagers/BlockListPager.php',
        'BlockLogFormatter' => __DIR__ . '/includes/logging/BlockLogFormatter.php',
        'BmpHandler' => __DIR__ . '/includes/media/BMP.php',
index 885a66b..ef85ec4 100644 (file)
@@ -25,7 +25,7 @@
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.17.1",
+               "oojs/oojs-ui": "0.17.2",
                "oyejorge/less.php": "1.7.0.10",
                "php": ">=5.5.9",
                "psr/log": "1.0.0",
@@ -46,7 +46,7 @@
        "require-dev": {
                "jakub-onderka/php-parallel-lint": "0.9.2",
                "justinrainbow/json-schema": "~1.3",
-               "mediawiki/mediawiki-codesniffer": "0.6.0",
+               "mediawiki/mediawiki-codesniffer": "0.7.1",
                "monolog/monolog": "~1.18.2",
                "nikic/php-parser": "1.4.1",
                "nmred/kafka-php": "0.1.5",
index a7092ec..2d5f6bc 100644 (file)
@@ -2128,6 +2128,7 @@ $sk: The Skin that called OutputPage::headElement
 since the last visit.
 &$modifiedTimes: array of timestamps.
   The following keys are set: page, user, epoch
+$out: OutputPage object (since 1.28)
 
 'OutputPageMakeCategoryLinks': Links are about to be generated for the page's
 categories. Implementations should return false if they generate the category
@@ -3216,6 +3217,10 @@ $mime: (string) The uploaded file's MIME type, as detected by MediaWiki.
   representing the problem with the file, where the first element is the message
   key and the remaining elements are used as parameters to the message.
 
+'UserIsBot': when determining whether a user is a bot account
+$user: the user
+&$isBot: whether this is user a bot or not (boolean)
+
 'User::mailPasswordInternal': before creation and mailing of a user's new
 temporary password
 &$user: the user who sent the message out
index 6449d37..add5876 100644 (file)
@@ -352,6 +352,9 @@ class AuthPluginUser {
                return false;
        }
 
+       /**
+        * @deprecated since 1.28, use SessionManager::invalidateSessionForUser() instead.
+        */
        public function resetAuthToken() {
                # Override this!
                return true;
index d65e0ad..383f0ad 100644 (file)
@@ -4492,9 +4492,9 @@ $wgPasswordConfig = [
        ],
        'pbkdf2' => [
                'class' => 'Pbkdf2Password',
-               'algo' => 'sha256',
-               'cost' => '10000',
-               'length' => '128',
+               'algo' => 'sha512',
+               'cost' => '30000',
+               'length' => '64',
        ],
 ];
 
@@ -7291,7 +7291,7 @@ $wgActionFilteredLogs = [
        ],
        'newusers' => [
                'create' => [ 'create', 'newusers' ],
-               'create2' => ['create2' ],
+               'create2' => [ 'create2' ],
                'autocreate' => [ 'autocreate' ],
                'byemail' => [ 'byemail' ],
        ],
@@ -7303,7 +7303,7 @@ $wgActionFilteredLogs = [
                'protect' => [ 'protect' ],
                'modify' => [ 'modify' ],
                'unprotect' => [ 'unprotect' ],
-               'move_prot' => ['move_prot'],
+               'move_prot' => [ 'move_prot' ],
        ],
        'rights' => [
                'rights' => [ 'rights' ],
index 45535ce..6545c4a 100644 (file)
@@ -54,9 +54,9 @@ class DummyLinker {
        public function link(
                $target,
                $html = null,
-               $customAttribs = [ ],
-               $query = [ ],
-               $options = [ ]
+               $customAttribs = [],
+               $query = [],
+               $options = []
        ) {
                return Linker::link(
                        $target,
@@ -70,8 +70,8 @@ class DummyLinker {
        public function linkKnown(
                $target,
                $html = null,
-               $customAttribs = [ ],
-               $query = [ ],
+               $customAttribs = [],
+               $query = [],
                $options = [ 'known', 'noclasses' ]
        ) {
                return Linker::linkKnown(
@@ -123,8 +123,8 @@ class DummyLinker {
                Parser $parser,
                Title $title,
                $file,
-               $frameParams = [ ],
-               $handlerParams = [ ],
+               $frameParams = [],
+               $handlerParams = [],
                $time = false,
                $query = "",
                $widthOption = null
@@ -147,7 +147,7 @@ class DummyLinker {
                $label = '',
                $alt,
                $align = 'right',
-               $params = [ ],
+               $params = [],
                $framed = false,
                $manualthumb = ""
        ) {
@@ -166,8 +166,8 @@ class DummyLinker {
        public function makeThumbLink2(
                Title $title,
                $file,
-               $frameParams = [ ],
-               $handlerParams = [ ],
+               $frameParams = [],
+               $handlerParams = [],
                $time = false,
                $query = ""
        ) {
@@ -232,7 +232,7 @@ class DummyLinker {
                $text,
                $escape = true,
                $linktype = '',
-               $attribs = [ ],
+               $attribs = [],
                $title = null
        ) {
                return Linker::makeExternalLink(
@@ -329,7 +329,7 @@ class DummyLinker {
                Title $title,
                $text,
                $wikiId = null,
-               $options = [ ]
+               $options = []
        ) {
                return Linker::makeCommentLink(
                        $title,
@@ -471,7 +471,7 @@ class DummyLinker {
                return Linker::formatSize( $size );
        }
 
-       public function titleAttrib( $name, $options = null, array $msgParams = [ ] ) {
+       public function titleAttrib( $name, $options = null, array $msgParams = [] ) {
                return Linker::titleAttrib(
                        $name,
                        $options,
@@ -491,7 +491,7 @@ class DummyLinker {
                );
        }
 
-       public function revDeleteLink( $query = [ ], $restricted = false, $delete = true ) {
+       public function revDeleteLink( $query = [], $restricted = false, $delete = true ) {
                return Linker::revDeleteLink(
                        $query,
                        $restricted,
@@ -503,7 +503,7 @@ class DummyLinker {
                return Linker::revDeleteLinkDisabled( $delete );
        }
 
-       public function tooltipAndAccesskeyAttribs( $name, array $msgParams = [ ] ) {
+       public function tooltipAndAccesskeyAttribs( $name, array $msgParams = [] ) {
                return Linker::tooltipAndAccesskeyAttribs(
                        $name,
                        $msgParams
index 3dd7420..ff469e4 100644 (file)
@@ -487,6 +487,7 @@ class MediaWiki {
                        $trxProfiler = Profiler::instance()->getTransactionProfiler();
                        if ( $request->wasPosted() && !$action->doesWrites() ) {
                                $trxProfiler->setExpectations( $trxLimits['POST-nonwrite'], __METHOD__ );
+                               $request->markAsSafeRequest();
                        }
 
                        # Let CDN cache things if we can purge them.
index 6c650aa..9e18fd1 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki;
 use Config;
 use ConfigFactory;
 use EventRelayerGroup;
+use GenderCache;
 use GlobalVarConfig;
 use Hooks;
 use LBFactory;
@@ -66,6 +67,8 @@ class MediaWikiServices extends ServiceContainer {
        /**
         * Returns the global default instance of the top level service locator.
         *
+        * @since 1.27
+        *
         * The default instance is initialized using the service instantiator functions
         * defined in ServiceWiring.php.
         *
@@ -91,6 +94,8 @@ class MediaWikiServices extends ServiceContainer {
        /**
         * Replaces the global MediaWikiServices instance.
         *
+        * @since 1.28
+        *
         * @note This is for use in PHPUnit tests only!
         *
         * @throws MWException if called outside of PHPUnit tests.
@@ -115,6 +120,8 @@ class MediaWikiServices extends ServiceContainer {
         * instance. getInstance() will return a different MediaWikiServices object
         * after every call to resetGlobalServiceLocator().
         *
+        * @since 1.28
+        *
         * @warning This should not be used during normal operation. It is intended for use
         * when the configuration has changed significantly since bootstrap time, e.g.
         * during the installation process or during testing.
@@ -194,6 +201,8 @@ class MediaWikiServices extends ServiceContainer {
         * storage layer will result in an error. Use resetGlobalInstance() to restore normal
         * operation.
         *
+        * @since 1.28
+        *
         * @warning This is intended for extreme situations only and should never be used
         * while serving normal web requests. Legitimate use cases for this method include
         * the installation process. Test fixtures may also use this, if the fixture relies
@@ -217,6 +226,8 @@ class MediaWikiServices extends ServiceContainer {
         * returns from after pcntl_fork(). It's also safe, but generally unnecessary,
         * to call this method from the parent process.
         *
+        * @since 1.28
+        *
         * @note This is intended for use in the context of process forking only!
         *
         * @see resetGlobalInstance()
@@ -235,6 +246,8 @@ class MediaWikiServices extends ServiceContainer {
        /**
         * Resets the given service for testing purposes.
         *
+        * @since 1.28
+        *
         * @warning This is generally unsafe! Other services may still retain references
         * to the stale service instance, leading to failures and inconsistencies. Subclasses
         * may use this method to reset specific services under specific instances, but
@@ -264,6 +277,8 @@ class MediaWikiServices extends ServiceContainer {
         * resetting of global services is allowed. In general, services should not be reset
         * individually, since that may introduce inconsistencies.
         *
+        * @since 1.28
+        *
         * This method will throw an exception if:
         *
         * - self::$resetInProgress is false (to allow all services to be reset together
@@ -321,6 +336,7 @@ class MediaWikiServices extends ServiceContainer {
         * when creating the MainConfig service. Application logic should
         * use getMainConfig() to get a Config instances.
         *
+        * @since 1.27
         * @return Config
         */
        public function getBootstrapConfig() {
@@ -328,6 +344,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.27
         * @return ConfigFactory
         */
        public function getConfigFactory() {
@@ -338,6 +355,7 @@ class MediaWikiServices extends ServiceContainer {
         * Returns the Config object that provides configuration for MediaWiki core.
         * This may or may not be the same object that is returned by getBootstrapConfig().
         *
+        * @since 1.27
         * @return Config
         */
        public function getMainConfig() {
@@ -345,6 +363,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.27
         * @return SiteLookup
         */
        public function getSiteLookup() {
@@ -352,6 +371,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.27
         * @return SiteStore
         */
        public function getSiteStore() {
@@ -359,6 +379,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.27
         * @return StatsdDataFactory
         */
        public function getStatsdDataFactory() {
@@ -366,6 +387,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.27
         * @return EventRelayerGroup
         */
        public function getEventRelayerGroup() {
@@ -373,6 +395,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.27
         * @return SearchEngine
         */
        public function newSearchEngine() {
@@ -381,6 +404,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.27
         * @return SearchEngineFactory
         */
        public function getSearchEngineFactory() {
@@ -388,6 +412,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.27
         * @return SearchEngineConfig
         */
        public function getSearchEngineConfig() {
@@ -395,6 +420,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.27
         * @return SkinFactory
         */
        public function getSkinFactory() {
@@ -402,6 +428,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.28
         * @return LBFactory
         */
        public function getDBLoadBalancerFactory() {
@@ -409,6 +436,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.28
         * @return LoadBalancer The main DB load balancer for the local wiki.
         */
        public function getDBLoadBalancer() {
@@ -416,12 +444,21 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /**
+        * @since 1.28
         * @return WatchedItemStore
         */
        public function getWatchedItemStore() {
                return $this->getService( 'WatchedItemStore' );
        }
 
+       /**
+        * @since 1.28
+        * @return GenderCache
+        */
+       public function getGenderCache() {
+               return $this->getService( 'GenderCache' );
+       }
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service getter here, don't forget to add a test
        // case for it in MediaWikiServicesTest::provideGetters() and in
index c724207..67e9a4f 100644 (file)
@@ -780,7 +780,7 @@ class OutputPage extends ContextSource {
                        // bug 44570: the core page itself may not change, but resources might
                        $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $config->get( 'SquidMaxage' ) );
                }
-               Hooks::run( 'OutputPageCheckLastModified', [ &$modifiedTimes ] );
+               Hooks::run( 'OutputPageCheckLastModified', [ &$modifiedTimes, $this ] );
 
                $maxModified = max( $modifiedTimes );
                $this->mLastModified = wfTimestamp( TS_RFC2822, $maxModified );
index 70192b9..451635e 100644 (file)
@@ -70,7 +70,9 @@ class ProtectionForm {
                // Check if the form should be disabled.
                // If it is, the form will be available in read-only to show levels.
                $this->mPermErrors = $this->mTitle->getUserPermissionsErrors(
-                       'protect', $this->mContext->getUser()
+                       'protect',
+                       $this->mContext->getUser(),
+                       $this->mContext->getRequest()->wasPosted() ? 'secure' : 'full' // T92357
                );
                if ( wfReadOnly() ) {
                        $this->mPermErrors[] = [ 'readonlytext', wfReadOnlyReason() ];
index 40daf3d..0e45b25 100644 (file)
@@ -1553,7 +1553,6 @@ class Revision implements IDBAccessObject {
                        }
                        $text = $cache->get( $key );
                        if ( is_string( $text ) ) {
-                               wfDebug( __METHOD__ . ": got id $textId from cache\n" );
                                $processCache->set( $key, $text );
                                return $text;
                        }
index 8e95034..e282bda 100644 (file)
@@ -139,6 +139,10 @@ return [
                return $store;
        },
 
+       'GenderCache' => function( MediaWikiServices $services ) {
+               return new GenderCache();
+       },
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service here, don't forget to add a getter function
        // in the MediaWikiServices class. The convenience getter should just call
index 215378b..6c536dd 100644 (file)
@@ -193,7 +193,7 @@ class SiteStats {
                                        __METHOD__
                                );
                        },
-                       [ 'pcTTL' => 10 ]
+                       [ 'pcTTL' => $cache::TTL_PROC_LONG ]
                );
        }
 
index b159f79..2333c78 100644 (file)
@@ -80,6 +80,9 @@ class WebRequest {
         */
        protected $sessionId = null;
 
+       /** @var bool Whether this HTTP request is "safe" (even if it is an HTTP post) */
+       protected $markedAsSafe = false;
+
        public function __construct() {
                $this->requestTime = isset( $_SERVER['REQUEST_TIME_FLOAT'] )
                        ? $_SERVER['REQUEST_TIME_FLOAT'] : microtime( true );
@@ -318,7 +321,7 @@ class WebRequest {
         *
         * @param string $path The URL path given from the client
         * @param array $bases One or more URLs, optionally with $1 at the end
-        * @param string $key If provided, the matching key in $bases will be
+        * @param string|bool $key If provided, the matching key in $bases will be
         *    passed on as the value of this URL parameter
         * @return array Array of URL variables to interpolate; empty if no match
         */
@@ -1022,7 +1025,7 @@ class WebRequest {
         * @param mixed $data
         */
        public function setSessionData( $key, $data ) {
-               return $this->getSession()->set( $key, $data );
+               $this->getSession()->set( $key, $data );
        }
 
        /**
@@ -1245,4 +1248,50 @@ HTML;
        public function setIP( $ip ) {
                $this->ip = $ip;
        }
+
+       /**
+        * Whether this request should be identified as being "safe"
+        *
+        * This means that the client is not requesting any state changes and that database writes
+        * are not inherently required. Ideally, no visible updates would happen at all. If they
+        * must, then they should not be publically attributed to the end user.
+        *
+        * In more detail:
+        *   - Cache populations and refreshes MAY occur.
+        *   - Private user session updates and private server logging MAY occur.
+        *   - Updates to private viewing activity data MAY occur via DeferredUpdates.
+        *   - Other updates SHOULD NOT occur (e.g. modifying content assets).
+        *
+        * @return bool
+        * @see https://tools.ietf.org/html/rfc7231#section-4.2.1
+        * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
+        * @since 1.28
+        */
+       public function isSafeRequest() {
+               if ( !isset( $_SERVER['REQUEST_METHOD'] ) ) {
+                       return false; // CLI mode
+               }
+
+               if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) {
+                       return $this->markedAsSafe;
+               } elseif ( in_array( $_SERVER['REQUEST_METHOD'], [ 'GET', 'HEAD', 'OPTIONS' ] ) ) {
+                       return true; // HTTP "safe methods"
+               }
+
+               return false; // PUT/DELETE
+       }
+
+       /**
+        * Mark this request is identified as being nullipotent even if it is a POST request
+        *
+        * POST requests are often used due to the need for a client payload, even if the request
+        * is otherwise equivalent to a "safe method" request.
+        *
+        * @see https://tools.ietf.org/html/rfc7231#section-4.2.1
+        * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
+        * @since 1.28
+        */
+       public function markAsSafeRequest() {
+               $this->markedAsSafe = true;
+       }
 }
index 07642c4..685a9ef 100644 (file)
@@ -134,7 +134,9 @@ class ApiMain extends ApiBase {
        private $mModuleMgr, $mResult, $mErrorFormatter, $mContinuationManager;
        private $mAction;
        private $mEnableWrite;
-       private $mInternalMode, $mSquidMaxage, $mModule;
+       private $mInternalMode, $mSquidMaxage;
+       /** @var ApiBase */
+       private $mModule;
 
        private $mCacheMode = 'private';
        private $mCacheControl = [];
@@ -397,13 +399,7 @@ class ApiMain extends ApiBase {
                if ( $this->mInternalMode ) {
                        $this->executeAction();
                } else {
-                       $start = microtime( true );
                        $this->executeActionWithErrorHandling();
-                       if ( $this->isWriteMode() && $this->getRequest()->wasPosted() ) {
-                               $timeMs = 1000 * max( 0, microtime( true ) - $start );
-                               $this->getStats()->timing(
-                                       'api.' . $this->getModuleName() . '.executeTiming', $timeMs );
-                       }
                }
        }
 
@@ -433,8 +429,12 @@ class ApiMain extends ApiBase {
                $isError = false;
                try {
                        $this->executeAction();
-                       $this->logRequest( microtime( true ) - $t );
-
+                       $runTime = microtime( true ) - $t;
+                       $this->logRequest( $runTime );
+                       if ( $this->mModule->isWriteMode() && $this->getRequest()->wasPosted() ) {
+                               $this->getStats()->timing(
+                                       'api.' . $this->getModuleName() . '.executeTiming', 1000 * $runTime );
+                       }
                } catch ( Exception $e ) {
                        $this->handleException( $e );
                        $this->logRequest( microtime( true ) - $t, $e );
@@ -1355,6 +1355,7 @@ class ApiMain extends ApiBase {
                                $trxProfiler->setExpectations( $limits['POST'], __METHOD__ );
                        } else {
                                $trxProfiler->setExpectations( $limits['POST-nonwrite'], __METHOD__ );
+                               $this->getRequest()->markAsSafeRequest();
                        }
                } else {
                        $trxProfiler->setExpectations( $limits['GET'], __METHOD__ );
index f5d57c1..5efefbd 100644 (file)
@@ -40,7 +40,7 @@ class ApiStashEdit extends ApiBase {
        const ERROR_CACHE = 'error_cache';
        const ERROR_UNCACHEABLE = 'uncacheable';
 
-       const PRESUME_FRESH_TTL_SEC = 5;
+       const PRESUME_FRESH_TTL_SEC = 30;
 
        public function execute() {
                $user = $this->getUser();
@@ -219,6 +219,9 @@ class ApiStashEdit extends ApiBase {
                        return false;
                }
 
+               // Set the time the output was generated
+               $pOut->setCacheTime( wfTimestampNow() );
+
                // Build a value to cache with a proper TTL
                list( $stashInfo, $ttl ) = self::buildStashValue( $pstContent, $pOut, $timestamp );
                if ( !$stashInfo ) {
index 45060c2..ff97cc8 100644 (file)
@@ -1,12 +1,28 @@
 {
        "@metadata": {
                "authors": [
-                       "Robin van der Vliet"
+                       "Robin van der Vliet",
+                       "Renardo"
                ]
        },
+       "apihelp-main-param-format": "La formo de la eligaĵo.",
+       "apihelp-block-description": "Forbari uzulon.",
+       "apihelp-block-param-user": "Salutnomo, IP-adreso aŭ IP-adresa intervalo forbarota.",
+       "apihelp-block-param-expiry": "Eksvalidiĝa tempo. Ĝi povas esti relativa (ekz. <kbd>5 months</kbd> aŭ <kbd>2 weeks</kbd> aŭ absoluta (ekz. <kbd>2014-09-18T12:34:56Z</kbd>). Se vi indikas <kbd>infinite</kbd> (senfine), <kbd>indefinite</kbd> (nedifinite) aŭ <kbd>never</kbd> (neniam), la forbaro neniam eksvalidiĝos.",
        "apihelp-createaccount-param-name": "Uzantnomo.",
        "apihelp-delete-description": "Forigi paĝon.",
+       "apihelp-edit-param-minor": "Redakteto.",
        "apihelp-edit-example-edit": "Redakti paĝon.",
+       "apihelp-feedrecentchanges-param-hideminor": "Kaŝi redaktetojn.",
+       "apihelp-feedrecentchanges-param-hidebots": "Kaŝi robotajn ŝanĝojn.",
+       "apihelp-feedrecentchanges-param-hideanons": "Kaŝi redaktojn de anonimuloj.",
+       "apihelp-feedrecentchanges-param-hideliu": "Kaŝi redaktojn de ensalutintaj uzantoj.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Kaŝi reviziitajn ŝanĝojn.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Kaŝi redaktojn de la nun ensalutinta uzulo (= vi).",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Kaŝi ŝanĝojn de kategoria aneco.",
+       "apihelp-feedrecentchanges-example-simple": "Montri ĵusajn ŝanĝojn.",
+       "apihelp-filerevert-description": "Restarigi malnovan version de dosiero.",
+       "apihelp-filerevert-param-comment": "Alŝuta komento.",
        "apihelp-login-param-name": "Uzantnomo.",
        "apihelp-login-param-password": "Pasvorto.",
        "apihelp-login-example-login": "Ensaluti."
index 23a654d..6b0cab6 100644 (file)
        "apihelp-paraminfo-description": "Ottieni informazioni sui moduli API.",
        "apihelp-paraminfo-param-helpformat": "Formato delle stringhe di aiuto.",
        "apihelp-parse-param-summary": "Oggetto da analizzare.",
+       "apihelp-parse-param-redirects": "Se <var>$1page</var> o <var>$1pageid</var> è impostato come reindirizzamento, lo risolve.",
        "apihelp-parse-param-prop": "Quali pezzi di informazioni ottenere:",
        "apihelp-parse-example-text": "Analizza wikitext.",
        "apihelp-parse-example-texttitle": "Analizza wikitext, specificando il titolo della pagina.",
diff --git a/includes/api/i18n/jv.json b/includes/api/i18n/jv.json
new file mode 100644 (file)
index 0000000..af1ca9c
--- /dev/null
@@ -0,0 +1,11 @@
+{
+       "@metadata": {
+               "authors": [
+                       "NoiX180"
+               ]
+       },
+       "apihelp-delete-example-simple": "Busak <kbd>Kaca Pokok</kbd>.",
+       "apihelp-query+backlinks-example-simple": "Tuduhaké pranala menyang <kbd>Kaca utama</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Deleng pratélan bab kaca-kaca sing nggayut <kbd>Kaca utama</kbd>.",
+       "apihelp-query+contributors-example-simple": "Tuduhaké para nyumbang <kbd>Kaca Utama</kbd>."
+}
index 14e32ba..246b05c 100644 (file)
        "apihelp-managetags-example-delete": "Radera <kbd>vandalims</kbd> taggen med andledningen: <kbd>Felstavat</kbd>",
        "apihelp-managetags-example-activate": "Aktivera en tagg med namn <kbd>spam</kbd> med anledningen: <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-deactivate": "Inaktivera en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>No longer required</kbd>",
+       "apihelp-mergehistory-description": "Sammanfoga sidhistoriker.",
+       "apihelp-mergehistory-param-reason": "Orsaken till sammanfogning av historik.",
+       "apihelp-mergehistory-example-merge": "Sammanfoga hela historiken för <kbd>Oldpage</kbd> i <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "Sammanfoga den sidversion av <kbd>Oldpage</kbd> daterad fram till <kbd>2015-12-31T04:37:41Z</kbd> till <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Flytta en sida.",
        "apihelp-move-param-from": "Titeln på sidan du vill flytta. Kan inte användas tillsammans med <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "Sid-ID för sidan att byta namn. Kan inte användas tillsammans med <var>$1from</var>.",
index 6e2ff5a..4a4989f 100644 (file)
@@ -15,6 +15,8 @@
        "apihelp-block-param-reason": "Lý do cấm.",
        "apihelp-block-param-nocreate": "Cấm tạo tài khoản.",
        "apihelp-block-param-reblock": "Nếu người dùng này đã bị cấm, ghi đè lên vụ cấm đã tồn tại.",
+       "apihelp-block-param-watchuser": "Xem người dùng hoặc địa chỉ IP của người dùng và trang thảo luận.",
+       "apihelp-block-example-ip-simple": "Khóa địa chỉ IP <kbd>192.0.2.5</kbd> trong ba ngày với lý do <kbd>khiển trách lần đầu</kbd>.",
        "apihelp-checktoken-param-type": "Kiểu dấu hiệu được kiểm thử.",
        "apihelp-checktoken-param-token": "Dấu hiệu để kiểm thử.",
        "apihelp-checktoken-example-simple": "Kiểm thử dấu hiệu <kbd>csrf</kbd> có hợp lệ hay không.",
@@ -62,6 +64,7 @@
        "apihelp-edit-param-undo": "Hoàn tác sửa đổi này. Ghi đè $1text, $1prependtext và $ 1appendtext.",
        "apihelp-edit-param-undoafter": "Hoàn tác tất cả các sửa đổi từ $1undo cho tới sửa đổi này. Nếu không được thiết lập, chỉ cần lùi lại một sửa đổi.",
        "apihelp-edit-param-redirect": "Tự động giải quyết các chuyển hướng.",
+       "apihelp-edit-param-contentmodel": "Mô hình nội dung của nội dung mới.",
        "apihelp-edit-example-edit": "Sửa đổi trang",
        "apihelp-edit-example-prepend": "Đưa <kbd>_&#95;NOTOC_&#95;</kbd> vào đầu trang",
        "apihelp-edit-example-undo": "Lùi sửa các thay đổi 13579–13585 và tự động tóm lược",
        "apihelp-login-param-token": "Dấu hiệu đăng nhập được lấy trong yêu cầu đầu tiên.",
        "apihelp-login-example-gettoken": "Lấy dấu hiệu đăng nhập",
        "apihelp-login-example-login": "Đăng nhập",
+       "apihelp-logout-description": "Thoát ra và xóa dữ liệu phiên làm việc.",
        "apihelp-logout-example-logout": "Đăng xuất người dùng hiện tại",
        "apihelp-mergehistory-description": "Hợp nhất lịch sử trang.",
        "apihelp-mergehistory-param-reason": "Lý do hợp nhất lịch sử.",
        "apihelp-move-description": "Di chuyển trang.",
+       "apihelp-move-param-to": "Đặt tiêu đề để đổi tên trang.",
        "apihelp-move-param-reason": "Lý do đổi tên.",
+       "apihelp-move-param-movetalk": "Đổi tên trang thảo luận, nếu nó tồn tại.",
        "apihelp-move-param-movesubpages": "Đổi tên trang con, nếu có thể áp dụng.",
        "apihelp-move-param-noredirect": "Không tạo trang đổi hướng.",
        "apihelp-move-param-ignorewarnings": "Bỏ qua tất cả các cảnh báo.",
        "apihelp-opensearch-param-search": "Chuỗi tìm kiếm.",
        "apihelp-opensearch-param-limit": "Đa số kết quả để cho ra.",
        "apihelp-opensearch-param-namespace": "Không gian tên để tìm kiếm.",
+       "apihelp-opensearch-param-suggest": "Không làm gì nếu <var> [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> sai/lỗi.",
        "apihelp-opensearch-param-format": "Định dạng kết quả được cho ra.",
        "apihelp-opensearch-example-te": "Tìm trang bắt đầu với <kbd>Te</kbd>.",
        "apihelp-options-example-reset": "Mặc định lại các tùy chọn",
        "apihelp-paraminfo-description": "Lấy thông tin về các module API.",
        "apihelp-paraminfo-param-helpformat": "Định dạng chuỗi trợ giúp.",
        "apihelp-parse-param-summary": "Lời tóm lược để phân tích.",
+       "apihelp-parse-param-prop": "Những mẩu thông tin nào muốn có:",
        "apihelp-parse-param-section": "Chỉ phân tích nội dung của số phần này.\n\nNếu có <kbd>new</kbd> thì phân tích <var>$1text</var> và <var>$1sectiontitle</var> như thể thêm phần mới vào trang.\n\nPhần <kbd>new</kbd> chỉ được chấp nhận khi định rõ <var>text</var>.",
        "apihelp-parse-param-disablelimitreport": "Bỏ qua thông báo bộ tiền xử lý (“NewPP limit report”) khi cho ra kết quả bộ xử lý.",
        "apihelp-parse-example-page": "Phân tích trang.",
        "apihelp-query-param-prop": "Các thuộc tính để lấy khi truy vấn các trang.",
        "apihelp-query-param-list": "Các danh sách để lấy.",
        "apihelp-query-param-meta": "Siêu dữ liệu để lấy.",
+       "apihelp-query+allcategories-description": "Liệt kê tất cả các thể loại.",
+       "apihelp-query+allcategories-param-from": "Chọn thể loại để bắt đầu đếm.",
+       "apihelp-query+allcategories-param-to": "Chọn thể loại để dừng đếm.",
        "apihelp-query+allcategories-param-dir": "Hướng xếp loại.",
+       "apihelp-query+allcategories-param-limit": "Có bao nhiêu thể loại được trả về.",
+       "apihelp-query+allfileusages-param-limit": "Có bao nhiêu số hạng mục được trả về.",
+       "apihelp-query+allimages-param-limit": "Có bao nhiêu hình ảnh trong tổng số được trả về.",
+       "apihelp-query+alllinks-param-limit": "Có bao nhiêu số hạng mục được trả về.",
+       "apihelp-query+allpages-param-limit": "Có bao nhiêu trang được trả về.",
+       "apihelp-query+allredirects-param-limit": "Có bao nhiêu số hạng mục được trả về.",
+       "apihelp-query+mystashedfiles-param-limit": "Có bao nhiêu tập tin nhận được.",
+       "apihelp-query+alltransclusions-param-limit": "Có bao nhiêu số hạng mục được trả về.",
+       "apihelp-query+allusers-param-limit": "Có bao nhiêu tên người dùng được trả về.",
+       "apihelp-query+backlinks-param-limit": "Tất cả có bao nhiêu trang trả về. Nếu <var>$1redirect</var> được kích hoạt, giới hạn áp dụng cho mỗi cấp độ riêng biệt (có nghĩa là lên đến 2*<var>$1limit</var> kết quả có thể được trả lại).",
+       "apihelp-query+categories-param-limit": "Có bao nhiêu thể loại được trả về.",
+       "apihelp-query+extlinks-param-limit": "Có bao nhiêu liên kết được trả về.",
+       "apihelp-query+exturlusage-param-limit": "Có bao nhiêu trang được trả về.",
+       "apihelp-query+filearchive-param-limit": "Tổng cộng có bao nhiêu hình ảnh được trả về.",
+       "apihelp-query+fileusage-param-limit": "Có bao nhiêu được trả về.",
+       "apihelp-query+images-param-limit": "Có bao nhiêu tập tin được trả về.",
+       "apihelp-query+langbacklinks-param-limit": "Tổng cộng có bao nhiêu trang được trả về.",
+       "apihelp-query+links-param-limit": "Có bao nhiêu liên kết được trả về.",
+       "apihelp-query+linkshere-param-limit": "Có bao nhiêu được trả về.",
+       "apihelp-query+logevents-param-limit": "Tổng cộng có bao nhiêu bài viết sự kiện được trả về.",
+       "apihelp-query+transcludedin-param-limit": "Có bao nhiêu được trả về.",
+       "apihelp-query+watchlist-param-limit": "Cả bao nhiêu kết quả được trả về trên mỗi yêu cầu.",
        "apihelp-rollback-description": "Lùi lại sửa đổi cuối cùng của trang này.\n\nNếu người dùng cuối cùng đã sửa đổi trang này nhiều lần, tất cả chúng sẽ được lùi lại cùng một lúc.",
        "apihelp-format-example-generic": "Cho ra kết quả truy vấn dưới dạng $1.",
        "apihelp-json-description": "Cho ra dữ liệu dưới dạng JSON.",
index 710da4d..71daba7 100644 (file)
        "apihelp-upload-param-sessionkey": "与$1filekey相同,基于向后兼容而维护。",
        "apihelp-upload-param-stash": "如果设置,服务器将临时藏匿文件而不是加入存储库。",
        "apihelp-upload-param-filesize": "全部上传的文件大小。",
-       "apihelp-upload-param-offset": "块的偏移量(字节)。",
+       "apihelp-upload-param-offset": "数据块的偏移量(字节)。",
        "apihelp-upload-param-chunk": "大块内容。",
        "apihelp-upload-param-async": "在可能的情况下,使潜在的大文件操作异步进行。",
        "apihelp-upload-param-checkstatus": "只检索指定文件密钥的上传状态。",
index 19695df..80f04ce 100644 (file)
@@ -21,6 +21,7 @@
  * @author Niklas Laxström
  * @ingroup Cache
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Caches user genders when needed to use correct namespace aliases.
@@ -34,18 +35,11 @@ class GenderCache {
        protected $missLimit = 1000;
 
        /**
+        * @deprecated in 1.28 see MediaWikiServices::getInstance()->getGenderCache()
         * @return GenderCache
         */
        public static function singleton() {
-               static $that = null;
-               if ( $that === null ) {
-                       $that = new self();
-               }
-
-               return $that;
-       }
-
-       protected function __construct() {
+               return MediaWikiServices::getInstance()->getGenderCache();
        }
 
        /**
index 9db1697..2d4d20f 100644 (file)
@@ -1134,7 +1134,7 @@ class ChangeTags {
        public static function listExtensionActivatedTags() {
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'active-tags' ),
-                       300,
+                       WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
 
@@ -1145,8 +1145,8 @@ class ChangeTags {
                        },
                        [
                                'checkKeys' => [ wfMemcKey( 'active-tags' ) ],
-                               'lockTSE' => 300,
-                               'pcTTL' => 30
+                               'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
+                               'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
                );
        }
@@ -1179,7 +1179,7 @@ class ChangeTags {
 
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'valid-tags-db' ),
-                       300,
+                       WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_SLAVE );
 
@@ -1191,8 +1191,8 @@ class ChangeTags {
                        },
                        [
                                'checkKeys' => [ wfMemcKey( 'valid-tags-db' ) ],
-                               'lockTSE' => 300,
-                               'pcTTL' => 30
+                               'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
+                               'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
                );
        }
@@ -1209,7 +1209,7 @@ class ChangeTags {
        public static function listExtensionDefinedTags() {
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'valid-tags-hook' ),
-                       300,
+                       WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
 
@@ -1219,8 +1219,8 @@ class ChangeTags {
                        },
                        [
                                'checkKeys' => [ wfMemcKey( 'valid-tags-hook' ) ],
-                               'lockTSE' => 300,
-                               'pcTTL' => 30
+                               'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
+                               'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
                );
        }
@@ -1264,7 +1264,7 @@ class ChangeTags {
                $fname = __METHOD__;
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'change-tag-statistics' ),
-                       300,
+                       WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_SLAVE, 'vslow' );
 
@@ -1287,8 +1287,8 @@ class ChangeTags {
                        },
                        [
                                'checkKeys' => [ wfMemcKey( 'change-tag-statistics' ) ],
-                               'lockTSE' => 300,
-                               'pcTTL' => 30
+                               'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
+                               'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
                );
        }
index 15821ea..9ad2428 100644 (file)
@@ -815,7 +815,6 @@ class FileRepo {
         * @param string $dstZone Destination zone
         * @param string $dstRel Destination relative path
         * @param int $flags Bitwise combination of the following flags:
-        *   self::DELETE_SOURCE     Delete the source file after upload
         *   self::OVERWRITE         Overwrite an existing destination file instead of failing
         *   self::OVERWRITE_SAME    Overwrite the file if the destination exists and has the
         *                           same contents as the source
@@ -838,7 +837,6 @@ class FileRepo {
         *
         * @param array $triplets (src, dest zone, dest rel) triplets as per store()
         * @param int $flags Bitwise combination of the following flags:
-        *   self::DELETE_SOURCE     Delete the source file after upload
         *   self::OVERWRITE         Overwrite an existing destination file instead of failing
         *   self::OVERWRITE_SAME    Overwrite the file if the destination exists and has the
         *                           same contents as the source
@@ -849,11 +847,14 @@ class FileRepo {
        public function storeBatch( array $triplets, $flags = 0 ) {
                $this->assertWritableRepo(); // fail out if read-only
 
+               if ( $flags & self::DELETE_SOURCE ) {
+                       throw new InvalidArgumentException( "DELETE_SOURCE not supported in " . __METHOD__ );
+               }
+
                $status = $this->newGood();
                $backend = $this->backend; // convenience
 
                $operations = [];
-               $sourceFSFilesToDelete = []; // cleanup for disk source files
                // Validate each triplet and get the store operation...
                foreach ( $triplets as $triplet ) {
                        list( $srcPath, $dstZone, $dstRel ) = $triplet;
@@ -881,12 +882,9 @@ class FileRepo {
 
                        // Get the appropriate file operation
                        if ( FileBackend::isStoragePath( $srcPath ) ) {
-                               $opName = ( $flags & self::DELETE_SOURCE ) ? 'move' : 'copy';
+                               $opName = 'copy';
                        } else {
                                $opName = 'store';
-                               if ( $flags & self::DELETE_SOURCE ) {
-                                       $sourceFSFilesToDelete[] = $srcPath;
-                               }
                        }
                        $operations[] = [
                                'op' => $opName,
@@ -903,12 +901,6 @@ class FileRepo {
                        $opts['nonLocking'] = true;
                }
                $status->merge( $backend->doOperations( $operations, $opts ) );
-               // Cleanup for disk source files...
-               foreach ( $sourceFSFilesToDelete as $file ) {
-                       MediaWiki\suppressWarnings();
-                       unlink( $file ); // FS cleanup
-                       MediaWiki\restoreWarnings();
-               }
 
                return $status;
        }
index 8248699..eaec151 100644 (file)
@@ -227,7 +227,7 @@ class LocalRepo extends FileRepo {
                                        ? Title::makeTitle( $row->rd_namespace, $row->rd_title )->getDBkey()
                                        : ''; // negative cache
                        },
-                       [ 'pcTTL' => 30 ]
+                       [ 'pcTTL' => WANObjectCache::TTL_PROC_LONG ]
                );
 
                // @note: also checks " " for b/c
index c037516..8175b58 100644 (file)
@@ -1065,7 +1065,6 @@ abstract class File implements IDBAccessObject {
                        if ( $this->repo ) {
                                // Defer rendering if a 404 handler is set up...
                                if ( $this->repo->canTransformVia404() && !( $flags & self::RENDER_NOW ) ) {
-                                       wfDebug( __METHOD__ . " transformation deferred.\n" );
                                        // XXX: Pass in the storage path even though we are not rendering anything
                                        // and the path is supposed to be an FS path. This is due to getScalerType()
                                        // getting called on the path and clobbering $thumb->getUrl() if it's false.
index daa429a..2ab0554 100644 (file)
@@ -98,7 +98,7 @@ abstract class WebInstallerPage {
                                wfMessage( "config-$continue" )->text(),
                                [
                                        'name' => "enter-$continue",
-                                       'style' => 'visibility:hidden;overflow:hidden;width:1px;margin:0'
+                                       'style' => 'width:0;border:0;height:0;padding:0'
                                ]
                        ) . "\n";
                }
index d33e03b..ee8ba4b 100644 (file)
@@ -1,9 +1,11 @@
 {
        "@metadata": {
                "authors": [
-                       "Anggoro"
+                       "Anggoro",
+                       "NoiX180"
                ]
        },
+       "config-install-mainpage-failed": "Ora bisa nglebokaké kaca pokok: $1",
        "mainpagetext": "'''Prangkat empuk wiki wis suksès dipasang.'''",
        "mainpagedocfooter": "Mangga maca [//meta.wikimedia.org/wiki/Help:Contents User's Guide] kanggo katrangan luwih langkung prakara panggunan prangkat empuk wiki\n== Miwiti panggunan  ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Daftar pangaturan préférènsi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index 4f57b1f..4f96f4b 100644 (file)
@@ -14,7 +14,8 @@
                        "S8321414",
                        "LNDDYL",
                        "NigelSoft",
-                       "Macofe"
+                       "Macofe",
+                       "Reke"
                ]
        },
        "config-desc": "MediaWiki 安裝程式",
@@ -23,7 +24,7 @@
        "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-localsettings-badkey": "你提供的金鑰不正確。",
+       "config-localsettings-badkey": "你提供的升級金鑰不正確。",
        "config-upgrade-key-missing": "已偵測到先前安裝的 MediaWiki。\n要升級目前安裝的版本,請將下列文字附加到 <code>LocalSettings.php</code> 的檔案最下方:\n\n$1",
        "config-localsettings-incomplete": "目前的 <code>LocalSettings.php</code> 檔案不完整。\n未設定參數 $1。\n請將此參數設定至 <code>LocalSettings.php</code> 中,並點選 \"{{int:Config-continue}}\"。",
        "config-localsettings-connection-error": "使用 <code>LocalSettings.php</code> 中所指定的資料庫設定連線發生錯誤。 請修復相關設定並再試一次。\n\n$1",
index f68651b..5a0dd36 100644 (file)
@@ -171,7 +171,6 @@ class Interwiki {
                global $wgInterwikiScopes, $wgInterwikiFallbackSite;
                static $site;
 
-               wfDebug( __METHOD__ . "( $prefix )\n" );
                $value = false;
                try {
                        // Resolve site name
index 2dd0615..a4b3241 100644 (file)
@@ -407,7 +407,7 @@ class JobQueueGroup {
 
                                        return [ 'v' => $wgConf->getConfig( $wiki, $name ) ];
                                },
-                               [ 'pcTTL' => 30 ]
+                               [ 'pcTTL' => WANObjectCache::TTL_PROC_LONG ]
                        );
 
                        return $value['v'];
index 22afead..fbc1572 100644 (file)
@@ -70,7 +70,7 @@ class RecentChangesUpdateJob extends Job {
        }
 
        protected function purgeExpiredRows() {
-               global $wgRCMaxAge;
+               global $wgRCMaxAge, $wgUpdateRowsPerQuery;
 
                $lockKey = wfWikiID() . ':recentchanges-prune';
 
@@ -81,14 +81,13 @@ class RecentChangesUpdateJob extends Job {
                        return; // already in progress
                }
 
-               $batchSize = 100; // avoid slave lag
                $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
                do {
                        $rcIds = $dbw->selectFieldValues( 'recentchanges',
                                'rc_id',
                                [ 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ],
                                __METHOD__,
-                               [ 'LIMIT' => $batchSize ]
+                               [ 'LIMIT' => $wgUpdateRowsPerQuery ]
                        );
                        if ( $rcIds ) {
                                $dbw->delete( 'recentchanges', [ 'rc_id' => $rcIds ], __METHOD__ );
@@ -96,7 +95,7 @@ class RecentChangesUpdateJob extends Job {
                        // Commit in chunks to avoid slave lag
                        $dbw->commit( __METHOD__, 'flush' );
 
-                       if ( count( $rcIds ) === $batchSize ) {
+                       if ( count( $rcIds ) === $wgUpdateRowsPerQuery ) {
                                // There might be more, so try waiting for slaves
                                try {
                                        wfGetLBFactory()->waitForReplication( [ 'timeout' => 3 ] );
index 8e3c0a5..bf46ce1 100644 (file)
@@ -285,8 +285,12 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        protected function mergeViaCas( $key, $callback, $exptime = 0, $attempts = 10 ) {
                do {
                        $this->clearLastError();
+                       $reportDupes = $this->reportDupes;
+                       $this->reportDupes = false;
                        $casToken = null; // passed by reference
                        $currentValue = $this->getWithToken( $key, $casToken, self::READ_LATEST );
+                       $this->reportDupes = $reportDupes;
+
                        if ( $this->getLastError() ) {
                                return false; // don't spam retries (retry only on races)
                        }
@@ -342,7 +346,11 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
                }
 
                $this->clearLastError();
+               $reportDupes = $this->reportDupes;
+               $this->reportDupes = false;
                $currentValue = $this->get( $key, self::READ_LATEST );
+               $this->reportDupes = $reportDupes;
+
                if ( $this->getLastError() ) {
                        $success = false;
                } else {
index fa465c7..91e7934 100644 (file)
@@ -29,7 +29,6 @@
  * @since 1.27
  */
 interface IExpiringStore {
-
        // Constants for TTL values, in seconds
        const TTL_MINUTE = 60;
        const TTL_HOUR = 3600;
@@ -38,5 +37,9 @@ interface IExpiringStore {
        const TTL_MONTH = 2592000; // 30 * 24 * 3600
        const TTL_YEAR = 31536000; // 365 * 24 * 3600
 
+       // Shorthand process cache TTLs (useful for web requests and CLI mode)
+       const TTL_PROC_SHORT = 3; // reasonably strict cache time that last the life of quick requests
+       const TTL_PROC_LONG = 30; // loose cache time that can survive slow web requests
+
        const TTL_INDEFINITE = 0;
 }
index a6b9915..0dc28bd 100644 (file)
  * @ingroup Media
  */
 class WikiFilePage extends WikiPage {
-       /**
-        * @var File
-        */
+       /** @var File */
        protected $mFile = false;
+       /** @var LocalRepo */
        protected $mRepo = null;
+       /** @var bool */
        protected $mFileLoaded = false;
+       /** @var array */
        protected $mDupes = null;
 
        public function __construct( $title ) {
@@ -170,7 +171,6 @@ class WikiFilePage extends WikiPage {
                if ( $this->mFile->exists() ) {
                        wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
                        DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->mTitle, 'imagelinks' ) );
-                       $this->mFile->upgradeRow();
                        $this->mFile->purgeCache( [ 'forThumbRefresh' => true ] );
                } else {
                        wfDebug( 'ImagePage::doPurge no image for '
diff --git a/includes/parser/BlockLevelPass.php b/includes/parser/BlockLevelPass.php
new file mode 100644 (file)
index 0000000..cbacd34
--- /dev/null
@@ -0,0 +1,535 @@
+<?php
+
+/**
+ * This is the part of the wikitext parser which handles automatic paragraphs
+ * and conversion of start-of-line prefixes to HTML lists.
+ *
+ * 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 Parser
+ */
+class BlockLevelPass {
+       private $DTopen = false;
+       private $inPre = false;
+       private $lastSection = '';
+       private $linestart;
+       private $text;
+
+       # State constants for the definition list colon extraction
+       const COLON_STATE_TEXT = 0;
+       const COLON_STATE_TAG = 1;
+       const COLON_STATE_TAGSTART = 2;
+       const COLON_STATE_CLOSETAG = 3;
+       const COLON_STATE_TAGSLASH = 4;
+       const COLON_STATE_COMMENT = 5;
+       const COLON_STATE_COMMENTDASH = 6;
+       const COLON_STATE_COMMENTDASHDASH = 7;
+
+       /**
+        * Make lists from lines starting with ':', '*', '#', etc.
+        *
+        * @param string $text
+        * @param bool $lineStart Whether or not this is at the start of a line.
+        * @return string The lists rendered as HTML
+        */
+       public static function doBlockLevels( $text, $lineStart ) {
+               $pass = new self( $text, $lineStart );
+               return $pass->execute();
+       }
+
+       /**
+        * Private constructor
+        */
+       private function __construct( $text, $lineStart ) {
+               $this->text = $text;
+               $this->lineStart = $lineStart;
+       }
+
+       /**
+        * If a pre or p is open, return the corresponding close tag and update
+        * the state. If no tag is open, return an empty string.
+        * @return string
+        */
+       private function closeParagraph() {
+               $result = '';
+               if ( $this->lastSection !== '' ) {
+                       $result = '</' . $this->lastSection . ">\n";
+               }
+               $this->inPre = false;
+               $this->lastSection = '';
+               return $result;
+       }
+
+       /**
+        * getCommon() returns the length of the longest common substring
+        * of both arguments, starting at the beginning of both.
+        *
+        * @param string $st1
+        * @param string $st2
+        *
+        * @return int
+        */
+       private function getCommon( $st1, $st2 ) {
+               $shorter = min( strlen( $st1 ), strlen( $st2 ) );
+
+               for ( $i = 0; $i < $shorter; ++$i ) {
+                       if ( $st1[$i] !== $st2[$i] ) {
+                               break;
+                       }
+               }
+               return $i;
+       }
+
+       /**
+        * Open the list item element identified by the prefix character.
+        *
+        * @param string $char
+        *
+        * @return string
+        */
+       private function openList( $char ) {
+               $result = $this->closeParagraph();
+
+               if ( '*' === $char ) {
+                       $result .= "<ul><li>";
+               } elseif ( '#' === $char ) {
+                       $result .= "<ol><li>";
+               } elseif ( ':' === $char ) {
+                       $result .= "<dl><dd>";
+               } elseif ( ';' === $char ) {
+                       $result .= "<dl><dt>";
+                       $this->DTopen = true;
+               } else {
+                       $result = '<!-- ERR 1 -->';
+               }
+
+               return $result;
+       }
+
+       /**
+        * Close the current list item and open the next one.
+        * @param string $char
+        *
+        * @return string
+        */
+       private function nextItem( $char ) {
+               if ( '*' === $char || '#' === $char ) {
+                       return "</li>\n<li>";
+               } elseif ( ':' === $char || ';' === $char ) {
+                       $close = "</dd>\n";
+                       if ( $this->DTopen ) {
+                               $close = "</dt>\n";
+                       }
+                       if ( ';' === $char ) {
+                               $this->DTopen = true;
+                               return $close . '<dt>';
+                       } else {
+                               $this->DTopen = false;
+                               return $close . '<dd>';
+                       }
+               }
+               return '<!-- ERR 2 -->';
+       }
+
+       /**
+        * Close the current list item identified by the prefix character.
+        * @param string $char
+        *
+        * @return string
+        */
+       private function closeList( $char ) {
+               if ( '*' === $char ) {
+                       $text = "</li></ul>";
+               } elseif ( '#' === $char ) {
+                       $text = "</li></ol>";
+               } elseif ( ':' === $char ) {
+                       if ( $this->DTopen ) {
+                               $this->DTopen = false;
+                               $text = "</dt></dl>";
+                       } else {
+                               $text = "</dd></dl>";
+                       }
+               } else {
+                       return '<!-- ERR 3 -->';
+               }
+               return $text;
+       }
+
+       /**
+        * Execute the pass.
+        * @return string
+        */
+       private function execute() {
+               $text = $this->text;
+               # Parsing through the text line by line.  The main thing
+               # happening here is handling of block-level elements p, pre,
+               # and making lists from lines starting with * # : etc.
+               $textLines = StringUtils::explode( "\n", $text );
+
+               $lastPrefix = $output = '';
+               $this->DTopen = $inBlockElem = false;
+               $prefixLength = 0;
+               $pendingPTag = false;
+               $inBlockquote = false;
+
+               foreach ( $textLines as $inputLine ) {
+                       # Fix up $lineStart
+                       if ( !$this->lineStart ) {
+                               $output .= $inputLine;
+                               $this->lineStart = true;
+                               continue;
+                       }
+                       # * = ul
+                       # # = ol
+                       # ; = dt
+                       # : = dd
+
+                       $lastPrefixLength = strlen( $lastPrefix );
+                       $preCloseMatch = preg_match( '/<\\/pre/i', $inputLine );
+                       $preOpenMatch = preg_match( '/<pre/i', $inputLine );
+                       # If not in a <pre> element, scan for and figure out what prefixes are there.
+                       if ( !$this->inPre ) {
+                               # Multiple prefixes may abut each other for nested lists.
+                               $prefixLength = strspn( $inputLine, '*#:;' );
+                               $prefix = substr( $inputLine, 0, $prefixLength );
+
+                               # eh?
+                               # ; and : are both from definition-lists, so they're equivalent
+                               #  for the purposes of determining whether or not we need to open/close
+                               #  elements.
+                               $prefix2 = str_replace( ';', ':', $prefix );
+                               $t = substr( $inputLine, $prefixLength );
+                               $this->inPre = (bool)$preOpenMatch;
+                       } else {
+                               # Don't interpret any other prefixes in preformatted text
+                               $prefixLength = 0;
+                               $prefix = $prefix2 = '';
+                               $t = $inputLine;
+                       }
+
+                       # List generation
+                       if ( $prefixLength && $lastPrefix === $prefix2 ) {
+                               # Same as the last item, so no need to deal with nesting or opening stuff
+                               $output .= $this->nextItem( substr( $prefix, -1 ) );
+                               $pendingPTag = false;
+
+                               if ( substr( $prefix, -1 ) === ';' ) {
+                                       # The one nasty exception: definition lists work like this:
+                                       # ; title : definition text
+                                       # So we check for : in the remainder text to split up the
+                                       # title and definition, without b0rking links.
+                                       $term = $t2 = '';
+                                       if ( $this->findColonNoLinks( $t, $term, $t2 ) !== false ) {
+                                               $t = $t2;
+                                               $output .= $term . $this->nextItem( ':' );
+                                       }
+                               }
+                       } elseif ( $prefixLength || $lastPrefixLength ) {
+                               # We need to open or close prefixes, or both.
+
+                               # Either open or close a level...
+                               $commonPrefixLength = $this->getCommon( $prefix, $lastPrefix );
+                               $pendingPTag = false;
+
+                               # Close all the prefixes which aren't shared.
+                               while ( $commonPrefixLength < $lastPrefixLength ) {
+                                       $output .= $this->closeList( $lastPrefix[$lastPrefixLength - 1] );
+                                       --$lastPrefixLength;
+                               }
+
+                               # Continue the current prefix if appropriate.
+                               if ( $prefixLength <= $commonPrefixLength && $commonPrefixLength > 0 ) {
+                                       $output .= $this->nextItem( $prefix[$commonPrefixLength - 1] );
+                               }
+
+                               # Open prefixes where appropriate.
+                               if ( $lastPrefix && $prefixLength > $commonPrefixLength ) {
+                                       $output .= "\n";
+                               }
+                               while ( $prefixLength > $commonPrefixLength ) {
+                                       $char = substr( $prefix, $commonPrefixLength, 1 );
+                                       $output .= $this->openList( $char );
+
+                                       if ( ';' === $char ) {
+                                               # @todo FIXME: This is dupe of code above
+                                               if ( $this->findColonNoLinks( $t, $term, $t2 ) !== false ) {
+                                                       $t = $t2;
+                                                       $output .= $term . $this->nextItem( ':' );
+                                               }
+                                       }
+                                       ++$commonPrefixLength;
+                               }
+                               if ( !$prefixLength && $lastPrefix ) {
+                                       $output .= "\n";
+                               }
+                               $lastPrefix = $prefix2;
+                       }
+
+                       # If we have no prefixes, go to paragraph mode.
+                       if ( 0 == $prefixLength ) {
+                               # No prefix (not in list)--go to paragraph mode
+                               # @todo consider using a stack for nestable elements like span, table and div
+                               $openMatch = preg_match(
+                                       '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|'
+                                               . '<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS',
+                                       $t
+                               );
+                               $closeMatch = preg_match(
+                                       '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'
+                                               . '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|'
+                                               . Parser::MARKER_PREFIX
+                                               . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS',
+                                       $t
+                               );
+
+                               if ( $openMatch || $closeMatch ) {
+                                       $pendingPTag = false;
+                                       # @todo bug 5718: paragraph closed
+                                       $output .= $this->closeParagraph();
+                                       if ( $preOpenMatch && !$preCloseMatch ) {
+                                               $this->inPre = true;
+                                       }
+                                       $bqOffset = 0;
+                                       while ( preg_match( '/<(\\/?)blockquote[\s>]/i', $t,
+                                               $bqMatch, PREG_OFFSET_CAPTURE, $bqOffset )
+                                       ) {
+                                               $inBlockquote = !$bqMatch[1][0]; // is this a close tag?
+                                               $bqOffset = $bqMatch[0][1] + strlen( $bqMatch[0][0] );
+                                       }
+                                       $inBlockElem = !$closeMatch;
+                               } elseif ( !$inBlockElem && !$this->inPre ) {
+                                       if ( ' ' == substr( $t, 0, 1 )
+                                               && ( $this->lastSection === 'pre' || trim( $t ) != '' )
+                                               && !$inBlockquote
+                                       ) {
+                                               # pre
+                                               if ( $this->lastSection !== 'pre' ) {
+                                                       $pendingPTag = false;
+                                                       $output .= $this->closeParagraph() . '<pre>';
+                                                       $this->lastSection = 'pre';
+                                               }
+                                               $t = substr( $t, 1 );
+                                       } else {
+                                               # paragraph
+                                               if ( trim( $t ) === '' ) {
+                                                       if ( $pendingPTag ) {
+                                                               $output .= $pendingPTag . '<br />';
+                                                               $pendingPTag = false;
+                                                               $this->lastSection = 'p';
+                                                       } else {
+                                                               if ( $this->lastSection !== 'p' ) {
+                                                                       $output .= $this->closeParagraph();
+                                                                       $this->lastSection = '';
+                                                                       $pendingPTag = '<p>';
+                                                               } else {
+                                                                       $pendingPTag = '</p><p>';
+                                                               }
+                                                       }
+                                               } else {
+                                                       if ( $pendingPTag ) {
+                                                               $output .= $pendingPTag;
+                                                               $pendingPTag = false;
+                                                               $this->lastSection = 'p';
+                                                       } elseif ( $this->lastSection !== 'p' ) {
+                                                               $output .= $this->closeParagraph() . '<p>';
+                                                               $this->lastSection = 'p';
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       # somewhere above we forget to get out of pre block (bug 785)
+                       if ( $preCloseMatch && $this->inPre ) {
+                               $this->inPre = false;
+                       }
+                       if ( $pendingPTag === false ) {
+                               $output .= $t;
+                               if ( $prefixLength === 0 ) {
+                                       $output .= "\n";
+                               }
+                       }
+               }
+               while ( $prefixLength ) {
+                       $output .= $this->closeList( $prefix2[$prefixLength - 1] );
+                       --$prefixLength;
+                       if ( !$prefixLength ) {
+                               $output .= "\n";
+                       }
+               }
+               if ( $this->lastSection !== '' ) {
+                       $output .= '</' . $this->lastSection . '>';
+                       $this->lastSection = '';
+               }
+
+               return $output;
+       }
+
+       /**
+        * Split up a string on ':', ignoring any occurrences inside tags
+        * to prevent illegal overlapping.
+        *
+        * @param string $str The string to split
+        * @param string &$before Set to everything before the ':'
+        * @param string &$after Set to everything after the ':'
+        * @throws MWException
+        * @return string The position of the ':', or false if none found
+        */
+       private function findColonNoLinks( $str, &$before, &$after ) {
+               $colonPos = strpos( $str, ':' );
+               if ( $colonPos === false ) {
+                       # Nothing to find!
+                       return false;
+               }
+
+               $ltPos = strpos( $str, '<' );
+               if ( $ltPos === false || $ltPos > $colonPos ) {
+                       # Easy; no tag nesting to worry about
+                       $before = substr( $str, 0, $colonPos );
+                       $after = substr( $str, $colonPos + 1 );
+                       return $colonPos;
+               }
+
+               # Ugly state machine to walk through avoiding tags.
+               $state = self::COLON_STATE_TEXT;
+               $level = 0;
+               $len = strlen( $str );
+               for ( $i = 0; $i < $len; $i++ ) {
+                       $c = $str[$i];
+
+                       switch ( $state ) {
+                       case self::COLON_STATE_TEXT:
+                               switch ( $c ) {
+                               case "<":
+                                       # Could be either a <start> tag or an </end> tag
+                                       $state = self::COLON_STATE_TAGSTART;
+                                       break;
+                               case ":":
+                                       if ( $level === 0 ) {
+                                               # We found it!
+                                               $before = substr( $str, 0, $i );
+                                               $after = substr( $str, $i + 1 );
+                                               return $i;
+                                       }
+                                       # Embedded in a tag; don't break it.
+                                       break;
+                               default:
+                                       # Skip ahead looking for something interesting
+                                       $colonPos = strpos( $str, ':', $i );
+                                       if ( $colonPos === false ) {
+                                               # Nothing else interesting
+                                               return false;
+                                       }
+                                       $ltPos = strpos( $str, '<', $i );
+                                       if ( $level === 0 ) {
+                                               if ( $ltPos === false || $colonPos < $ltPos ) {
+                                                       # We found it!
+                                                       $before = substr( $str, 0, $colonPos );
+                                                       $after = substr( $str, $colonPos + 1 );
+                                                       return $i;
+                                               }
+                                       }
+                                       if ( $ltPos === false ) {
+                                               # Nothing else interesting to find; abort!
+                                               # We're nested, but there's no close tags left. Abort!
+                                               break 2;
+                                       }
+                                       # Skip ahead to next tag start
+                                       $i = $ltPos;
+                                       $state = self::COLON_STATE_TAGSTART;
+                               }
+                               break;
+                       case self::COLON_STATE_TAG:
+                               # In a <tag>
+                               switch ( $c ) {
+                               case ">":
+                                       $level++;
+                                       $state = self::COLON_STATE_TEXT;
+                                       break;
+                               case "/":
+                                       # Slash may be followed by >?
+                                       $state = self::COLON_STATE_TAGSLASH;
+                                       break;
+                               default:
+                                       # ignore
+                               }
+                               break;
+                       case self::COLON_STATE_TAGSTART:
+                               switch ( $c ) {
+                               case "/":
+                                       $state = self::COLON_STATE_CLOSETAG;
+                                       break;
+                               case "!":
+                                       $state = self::COLON_STATE_COMMENT;
+                                       break;
+                               case ">":
+                                       # Illegal early close? This shouldn't happen D:
+                                       $state = self::COLON_STATE_TEXT;
+                                       break;
+                               default:
+                                       $state = self::COLON_STATE_TAG;
+                               }
+                               break;
+                       case self::COLON_STATE_CLOSETAG:
+                               # In a </tag>
+                               if ( $c === ">" ) {
+                                       $level--;
+                                       if ( $level < 0 ) {
+                                               wfDebug( __METHOD__ . ": Invalid input; too many close tags\n" );
+                                               return false;
+                                       }
+                                       $state = self::COLON_STATE_TEXT;
+                               }
+                               break;
+                       case self::COLON_STATE_TAGSLASH:
+                               if ( $c === ">" ) {
+                                       # Yes, a self-closed tag <blah/>
+                                       $state = self::COLON_STATE_TEXT;
+                               } else {
+                                       # Probably we're jumping the gun, and this is an attribute
+                                       $state = self::COLON_STATE_TAG;
+                               }
+                               break;
+                       case self::COLON_STATE_COMMENT:
+                               if ( $c === "-" ) {
+                                       $state = self::COLON_STATE_COMMENTDASH;
+                               }
+                               break;
+                       case self::COLON_STATE_COMMENTDASH:
+                               if ( $c === "-" ) {
+                                       $state = self::COLON_STATE_COMMENTDASHDASH;
+                               } else {
+                                       $state = self::COLON_STATE_COMMENT;
+                               }
+                               break;
+                       case self::COLON_STATE_COMMENTDASHDASH:
+                               if ( $c === ">" ) {
+                                       $state = self::COLON_STATE_TEXT;
+                               } else {
+                                       $state = self::COLON_STATE_COMMENT;
+                               }
+                               break;
+                       default:
+                               throw new MWException( "State machine error in " . __METHOD__ );
+                       }
+               }
+               if ( $level > 0 ) {
+                       wfDebug( __METHOD__ . ": Invalid input; not enough close tags (level $level, state $state)\n" );
+                       return false;
+               }
+               return false;
+       }
+}
index a1d62e5..96674be 100644 (file)
@@ -99,16 +99,6 @@ class Parser {
        # Regular expression for a non-newline space
        const SPACE_NOT_NL = '(?:\t|&nbsp;|&\#0*160;|&\#[Xx]0*[Aa]0;|\p{Zs})';
 
-       # State constants for the definition list colon extraction
-       const COLON_STATE_TEXT = 0;
-       const COLON_STATE_TAG = 1;
-       const COLON_STATE_TAGSTART = 2;
-       const COLON_STATE_CLOSETAG = 3;
-       const COLON_STATE_TAGSLASH = 4;
-       const COLON_STATE_COMMENT = 5;
-       const COLON_STATE_COMMENTDASH = 6;
-       const COLON_STATE_COMMENTDASHDASH = 7;
-
        # Flags for preprocessToDom
        const PTD_FOR_INCLUSION = 1;
 
@@ -176,14 +166,14 @@ class Parser {
         * @var ParserOutput
         */
        public $mOutput;
-       public $mAutonumber, $mDTopen;
+       public $mAutonumber;
 
        /**
         * @var StripState
         */
        public $mStripState;
 
-       public $mIncludeCount, $mArgStack, $mLastSection, $mInPre;
+       public $mIncludeCount;
        /**
         * @var LinkHolderArray
         */
@@ -342,11 +332,7 @@ class Parser {
                $this->mOutput = new ParserOutput;
                $this->mOptions->registerWatcher( [ $this->mOutput, 'recordOption' ] );
                $this->mAutonumber = 0;
-               $this->mLastSection = '';
-               $this->mDTopen = false;
                $this->mIncludeCount = [];
-               $this->mArgStack = false;
-               $this->mInPre = false;
                $this->mLinkHolders = new LinkHolderArray( $this );
                $this->mLinkID = 0;
                $this->mRevisionObject = $this->mRevisionTimestamp =
@@ -2401,127 +2387,6 @@ class Parser {
                return Linker::normalizeSubpageLink( $this->mTitle, $target, $text );
        }
 
-       /**#@+
-        * Used by doBlockLevels()
-        * @private
-        *
-        * @return string
-        */
-       public function closeParagraph() {
-               $result = '';
-               if ( $this->mLastSection != '' ) {
-                       $result = '</' . $this->mLastSection . ">\n";
-               }
-               $this->mInPre = false;
-               $this->mLastSection = '';
-               return $result;
-       }
-
-       /**
-        * getCommon() returns the length of the longest common substring
-        * of both arguments, starting at the beginning of both.
-        * @private
-        *
-        * @param string $st1
-        * @param string $st2
-        *
-        * @return int
-        */
-       public function getCommon( $st1, $st2 ) {
-               $fl = strlen( $st1 );
-               $shorter = strlen( $st2 );
-               if ( $fl < $shorter ) {
-                       $shorter = $fl;
-               }
-
-               for ( $i = 0; $i < $shorter; ++$i ) {
-                       if ( $st1[$i] != $st2[$i] ) {
-                               break;
-                       }
-               }
-               return $i;
-       }
-
-       /**
-        * These next three functions open, continue, and close the list
-        * element appropriate to the prefix character passed into them.
-        * @private
-        *
-        * @param string $char
-        *
-        * @return string
-        */
-       public function openList( $char ) {
-               $result = $this->closeParagraph();
-
-               if ( '*' === $char ) {
-                       $result .= "<ul><li>";
-               } elseif ( '#' === $char ) {
-                       $result .= "<ol><li>";
-               } elseif ( ':' === $char ) {
-                       $result .= "<dl><dd>";
-               } elseif ( ';' === $char ) {
-                       $result .= "<dl><dt>";
-                       $this->mDTopen = true;
-               } else {
-                       $result = '<!-- ERR 1 -->';
-               }
-
-               return $result;
-       }
-
-       /**
-        * TODO: document
-        * @param string $char
-        * @private
-        *
-        * @return string
-        */
-       public function nextItem( $char ) {
-               if ( '*' === $char || '#' === $char ) {
-                       return "</li>\n<li>";
-               } elseif ( ':' === $char || ';' === $char ) {
-                       $close = "</dd>\n";
-                       if ( $this->mDTopen ) {
-                               $close = "</dt>\n";
-                       }
-                       if ( ';' === $char ) {
-                               $this->mDTopen = true;
-                               return $close . '<dt>';
-                       } else {
-                               $this->mDTopen = false;
-                               return $close . '<dd>';
-                       }
-               }
-               return '<!-- ERR 2 -->';
-       }
-
-       /**
-        * @todo Document
-        * @param string $char
-        * @private
-        *
-        * @return string
-        */
-       public function closeList( $char ) {
-               if ( '*' === $char ) {
-                       $text = "</li></ul>";
-               } elseif ( '#' === $char ) {
-                       $text = "</li></ol>";
-               } elseif ( ':' === $char ) {
-                       if ( $this->mDTopen ) {
-                               $this->mDTopen = false;
-                               $text = "</dt></dl>";
-                       } else {
-                               $text = "</dd></dl>";
-                       }
-               } else {
-                       return '<!-- ERR 3 -->';
-               }
-               return $text;
-       }
-       /**#@-*/
-
        /**
         * Make lists from lines starting with ':', '*', '#', etc. (DBL)
         *
@@ -2531,365 +2396,7 @@ class Parser {
         * @return string The lists rendered as HTML
         */
        public function doBlockLevels( $text, $linestart ) {
-
-               # Parsing through the text line by line.  The main thing
-               # happening here is handling of block-level elements p, pre,
-               # and making lists from lines starting with * # : etc.
-               $textLines = StringUtils::explode( "\n", $text );
-
-               $lastPrefix = $output = '';
-               $this->mDTopen = $inBlockElem = false;
-               $prefixLength = 0;
-               $paragraphStack = false;
-               $inBlockquote = false;
-
-               foreach ( $textLines as $oLine ) {
-                       # Fix up $linestart
-                       if ( !$linestart ) {
-                               $output .= $oLine;
-                               $linestart = true;
-                               continue;
-                       }
-                       # * = ul
-                       # # = ol
-                       # ; = dt
-                       # : = dd
-
-                       $lastPrefixLength = strlen( $lastPrefix );
-                       $preCloseMatch = preg_match( '/<\\/pre/i', $oLine );
-                       $preOpenMatch = preg_match( '/<pre/i', $oLine );
-                       # If not in a <pre> element, scan for and figure out what prefixes are there.
-                       if ( !$this->mInPre ) {
-                               # Multiple prefixes may abut each other for nested lists.
-                               $prefixLength = strspn( $oLine, '*#:;' );
-                               $prefix = substr( $oLine, 0, $prefixLength );
-
-                               # eh?
-                               # ; and : are both from definition-lists, so they're equivalent
-                               #  for the purposes of determining whether or not we need to open/close
-                               #  elements.
-                               $prefix2 = str_replace( ';', ':', $prefix );
-                               $t = substr( $oLine, $prefixLength );
-                               $this->mInPre = (bool)$preOpenMatch;
-                       } else {
-                               # Don't interpret any other prefixes in preformatted text
-                               $prefixLength = 0;
-                               $prefix = $prefix2 = '';
-                               $t = $oLine;
-                       }
-
-                       # List generation
-                       if ( $prefixLength && $lastPrefix === $prefix2 ) {
-                               # Same as the last item, so no need to deal with nesting or opening stuff
-                               $output .= $this->nextItem( substr( $prefix, -1 ) );
-                               $paragraphStack = false;
-
-                               if ( substr( $prefix, -1 ) === ';' ) {
-                                       # The one nasty exception: definition lists work like this:
-                                       # ; title : definition text
-                                       # So we check for : in the remainder text to split up the
-                                       # title and definition, without b0rking links.
-                                       $term = $t2 = '';
-                                       if ( $this->findColonNoLinks( $t, $term, $t2 ) !== false ) {
-                                               $t = $t2;
-                                               $output .= $term . $this->nextItem( ':' );
-                                       }
-                               }
-                       } elseif ( $prefixLength || $lastPrefixLength ) {
-                               # We need to open or close prefixes, or both.
-
-                               # Either open or close a level...
-                               $commonPrefixLength = $this->getCommon( $prefix, $lastPrefix );
-                               $paragraphStack = false;
-
-                               # Close all the prefixes which aren't shared.
-                               while ( $commonPrefixLength < $lastPrefixLength ) {
-                                       $output .= $this->closeList( $lastPrefix[$lastPrefixLength - 1] );
-                                       --$lastPrefixLength;
-                               }
-
-                               # Continue the current prefix if appropriate.
-                               if ( $prefixLength <= $commonPrefixLength && $commonPrefixLength > 0 ) {
-                                       $output .= $this->nextItem( $prefix[$commonPrefixLength - 1] );
-                               }
-
-                               # Open prefixes where appropriate.
-                               if ( $lastPrefix && $prefixLength > $commonPrefixLength ) {
-                                       $output .= "\n";
-                               }
-                               while ( $prefixLength > $commonPrefixLength ) {
-                                       $char = substr( $prefix, $commonPrefixLength, 1 );
-                                       $output .= $this->openList( $char );
-
-                                       if ( ';' === $char ) {
-                                               # @todo FIXME: This is dupe of code above
-                                               if ( $this->findColonNoLinks( $t, $term, $t2 ) !== false ) {
-                                                       $t = $t2;
-                                                       $output .= $term . $this->nextItem( ':' );
-                                               }
-                                       }
-                                       ++$commonPrefixLength;
-                               }
-                               if ( !$prefixLength && $lastPrefix ) {
-                                       $output .= "\n";
-                               }
-                               $lastPrefix = $prefix2;
-                       }
-
-                       # If we have no prefixes, go to paragraph mode.
-                       if ( 0 == $prefixLength ) {
-                               # No prefix (not in list)--go to paragraph mode
-                               # XXX: use a stack for nestable elements like span, table and div
-                               $openmatch = preg_match(
-                                       '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|'
-                                               . '<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS',
-                                       $t
-                               );
-                               $closematch = preg_match(
-                                       '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'
-                                               . '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|'
-                                               . self::MARKER_PREFIX
-                                               . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS',
-                                       $t
-                               );
-
-                               if ( $openmatch || $closematch ) {
-                                       $paragraphStack = false;
-                                       # @todo bug 5718: paragraph closed
-                                       $output .= $this->closeParagraph();
-                                       if ( $preOpenMatch && !$preCloseMatch ) {
-                                               $this->mInPre = true;
-                                       }
-                                       $bqOffset = 0;
-                                       while ( preg_match( '/<(\\/?)blockquote[\s>]/i', $t,
-                                               $bqMatch, PREG_OFFSET_CAPTURE, $bqOffset )
-                                       ) {
-                                               $inBlockquote = !$bqMatch[1][0]; // is this a close tag?
-                                               $bqOffset = $bqMatch[0][1] + strlen( $bqMatch[0][0] );
-                                       }
-                                       $inBlockElem = !$closematch;
-                               } elseif ( !$inBlockElem && !$this->mInPre ) {
-                                       if ( ' ' == substr( $t, 0, 1 )
-                                               && ( $this->mLastSection === 'pre' || trim( $t ) != '' )
-                                               && !$inBlockquote
-                                       ) {
-                                               # pre
-                                               if ( $this->mLastSection !== 'pre' ) {
-                                                       $paragraphStack = false;
-                                                       $output .= $this->closeParagraph() . '<pre>';
-                                                       $this->mLastSection = 'pre';
-                                               }
-                                               $t = substr( $t, 1 );
-                                       } else {
-                                               # paragraph
-                                               if ( trim( $t ) === '' ) {
-                                                       if ( $paragraphStack ) {
-                                                               $output .= $paragraphStack . '<br />';
-                                                               $paragraphStack = false;
-                                                               $this->mLastSection = 'p';
-                                                       } else {
-                                                               if ( $this->mLastSection !== 'p' ) {
-                                                                       $output .= $this->closeParagraph();
-                                                                       $this->mLastSection = '';
-                                                                       $paragraphStack = '<p>';
-                                                               } else {
-                                                                       $paragraphStack = '</p><p>';
-                                                               }
-                                                       }
-                                               } else {
-                                                       if ( $paragraphStack ) {
-                                                               $output .= $paragraphStack;
-                                                               $paragraphStack = false;
-                                                               $this->mLastSection = 'p';
-                                                       } elseif ( $this->mLastSection !== 'p' ) {
-                                                               $output .= $this->closeParagraph() . '<p>';
-                                                               $this->mLastSection = 'p';
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-                       # somewhere above we forget to get out of pre block (bug 785)
-                       if ( $preCloseMatch && $this->mInPre ) {
-                               $this->mInPre = false;
-                       }
-                       if ( $paragraphStack === false ) {
-                               $output .= $t;
-                               if ( $prefixLength === 0 ) {
-                                       $output .= "\n";
-                               }
-                       }
-               }
-               while ( $prefixLength ) {
-                       $output .= $this->closeList( $prefix2[$prefixLength - 1] );
-                       --$prefixLength;
-                       if ( !$prefixLength ) {
-                               $output .= "\n";
-                       }
-               }
-               if ( $this->mLastSection != '' ) {
-                       $output .= '</' . $this->mLastSection . '>';
-                       $this->mLastSection = '';
-               }
-
-               return $output;
-       }
-
-       /**
-        * Split up a string on ':', ignoring any occurrences inside tags
-        * to prevent illegal overlapping.
-        *
-        * @param string $str The string to split
-        * @param string &$before Set to everything before the ':'
-        * @param string &$after Set to everything after the ':'
-        * @throws MWException
-        * @return string The position of the ':', or false if none found
-        */
-       public function findColonNoLinks( $str, &$before, &$after ) {
-
-               $pos = strpos( $str, ':' );
-               if ( $pos === false ) {
-                       # Nothing to find!
-                       return false;
-               }
-
-               $lt = strpos( $str, '<' );
-               if ( $lt === false || $lt > $pos ) {
-                       # Easy; no tag nesting to worry about
-                       $before = substr( $str, 0, $pos );
-                       $after = substr( $str, $pos + 1 );
-                       return $pos;
-               }
-
-               # Ugly state machine to walk through avoiding tags.
-               $state = self::COLON_STATE_TEXT;
-               $stack = 0;
-               $len = strlen( $str );
-               for ( $i = 0; $i < $len; $i++ ) {
-                       $c = $str[$i];
-
-                       switch ( $state ) {
-                       # (Using the number is a performance hack for common cases)
-                       case 0: # self::COLON_STATE_TEXT:
-                               switch ( $c ) {
-                               case "<":
-                                       # Could be either a <start> tag or an </end> tag
-                                       $state = self::COLON_STATE_TAGSTART;
-                                       break;
-                               case ":":
-                                       if ( $stack == 0 ) {
-                                               # We found it!
-                                               $before = substr( $str, 0, $i );
-                                               $after = substr( $str, $i + 1 );
-                                               return $i;
-                                       }
-                                       # Embedded in a tag; don't break it.
-                                       break;
-                               default:
-                                       # Skip ahead looking for something interesting
-                                       $colon = strpos( $str, ':', $i );
-                                       if ( $colon === false ) {
-                                               # Nothing else interesting
-                                               return false;
-                                       }
-                                       $lt = strpos( $str, '<', $i );
-                                       if ( $stack === 0 ) {
-                                               if ( $lt === false || $colon < $lt ) {
-                                                       # We found it!
-                                                       $before = substr( $str, 0, $colon );
-                                                       $after = substr( $str, $colon + 1 );
-                                                       return $i;
-                                               }
-                                       }
-                                       if ( $lt === false ) {
-                                               # Nothing else interesting to find; abort!
-                                               # We're nested, but there's no close tags left. Abort!
-                                               break 2;
-                                       }
-                                       # Skip ahead to next tag start
-                                       $i = $lt;
-                                       $state = self::COLON_STATE_TAGSTART;
-                               }
-                               break;
-                       case 1: # self::COLON_STATE_TAG:
-                               # In a <tag>
-                               switch ( $c ) {
-                               case ">":
-                                       $stack++;
-                                       $state = self::COLON_STATE_TEXT;
-                                       break;
-                               case "/":
-                                       # Slash may be followed by >?
-                                       $state = self::COLON_STATE_TAGSLASH;
-                                       break;
-                               default:
-                                       # ignore
-                               }
-                               break;
-                       case 2: # self::COLON_STATE_TAGSTART:
-                               switch ( $c ) {
-                               case "/":
-                                       $state = self::COLON_STATE_CLOSETAG;
-                                       break;
-                               case "!":
-                                       $state = self::COLON_STATE_COMMENT;
-                                       break;
-                               case ">":
-                                       # Illegal early close? This shouldn't happen D:
-                                       $state = self::COLON_STATE_TEXT;
-                                       break;
-                               default:
-                                       $state = self::COLON_STATE_TAG;
-                               }
-                               break;
-                       case 3: # self::COLON_STATE_CLOSETAG:
-                               # In a </tag>
-                               if ( $c === ">" ) {
-                                       $stack--;
-                                       if ( $stack < 0 ) {
-                                               wfDebug( __METHOD__ . ": Invalid input; too many close tags\n" );
-                                               return false;
-                                       }
-                                       $state = self::COLON_STATE_TEXT;
-                               }
-                               break;
-                       case self::COLON_STATE_TAGSLASH:
-                               if ( $c === ">" ) {
-                                       # Yes, a self-closed tag <blah/>
-                                       $state = self::COLON_STATE_TEXT;
-                               } else {
-                                       # Probably we're jumping the gun, and this is an attribute
-                                       $state = self::COLON_STATE_TAG;
-                               }
-                               break;
-                       case 5: # self::COLON_STATE_COMMENT:
-                               if ( $c === "-" ) {
-                                       $state = self::COLON_STATE_COMMENTDASH;
-                               }
-                               break;
-                       case self::COLON_STATE_COMMENTDASH:
-                               if ( $c === "-" ) {
-                                       $state = self::COLON_STATE_COMMENTDASHDASH;
-                               } else {
-                                       $state = self::COLON_STATE_COMMENT;
-                               }
-                               break;
-                       case self::COLON_STATE_COMMENTDASHDASH:
-                               if ( $c === ">" ) {
-                                       $state = self::COLON_STATE_TEXT;
-                               } else {
-                                       $state = self::COLON_STATE_COMMENT;
-                               }
-                               break;
-                       default:
-                               throw new MWException( "State machine error in " . __METHOD__ );
-                       }
-               }
-               if ( $stack > 0 ) {
-                       wfDebug( __METHOD__ . ": Invalid input; not enough close tags (stack $stack, state $state)\n" );
-                       return false;
-               }
-               return false;
+               return BlockLevelPass::doBlockLevels( $text, $linestart );
        }
 
        /**
index acdbd81..bd7072a 100644 (file)
@@ -81,7 +81,7 @@ abstract class PoolCounter {
 
        /**
         * @param array $conf
-        * @param string $type
+        * @param string $type The class of actions to limit concurrency for (task type)
         * @param string $key
         */
        protected function __construct( $conf, $type, $key ) {
@@ -93,8 +93,9 @@ abstract class PoolCounter {
                }
 
                if ( $this->slots ) {
-                       $key = $this->hashKeyIntoSlots( $key, $this->slots );
+                       $key = $this->hashKeyIntoSlots( $type, $key, $this->slots );
                }
+
                $this->key = $key;
                $this->isMightWaitKey = !preg_match( '/^nowait:/', $this->key );
        }
@@ -102,7 +103,7 @@ abstract class PoolCounter {
        /**
         * Create a Pool counter. This should only be called from the PoolWorks.
         *
-        * @param string $type
+        * @param string $type The class of actions to limit concurrency for (task type)
         * @param string $key
         *
         * @return PoolCounter
@@ -192,18 +193,19 @@ abstract class PoolCounter {
        }
 
        /**
-        * Given a key (any string) and the number of lots, returns a slot number (an integer from
-        * the [0..($slots-1)] range). This is used for a global limit on the number of instances of
-        * a given type that can acquire a lock. The hashing is deterministic so that
+        * Given a key (any string) and the number of lots, returns a slot key (a prefix with a suffix
+        * integer from the [0..($slots-1)] range). This is used for a global limit on the number of
+        * instances of a given type that can acquire a lock. The hashing is deterministic so that
         * PoolCounter::$workers is always an upper limit of how many instances with the same key
         * can acquire a lock.
         *
+        * @param string $type The class of actions to limit concurrency for (task type)
         * @param string $key PoolCounter instance key (any string)
         * @param int $slots The number of slots (max allowed value is 65536)
-        * @return int
+        * @return string Slot key with the type and slot number
         */
-       protected function hashKeyIntoSlots( $key, $slots ) {
-               return hexdec( substr( sha1( $key ), 0, 4 ) ) % $slots;
+       protected function hashKeyIntoSlots( $type, $key, $slots ) {
+               return $type . ':' . ( hexdec( substr( sha1( $key ), 0, 4 ) ) % $slots );
        }
 }
 
index e61b65a..a570d78 100644 (file)
@@ -31,7 +31,7 @@ abstract class PoolCounterWork {
        protected $cacheable = false; // does this override getCachedWork() ?
 
        /**
-        * @param string $type The type of PoolCounter to use
+        * @param string $type The class of actions to limit concurrency for (task type)
         * @param string $key Key that identifies the queue this work is placed on
         */
        public function __construct( $type, $key ) {
index 85a7cef..834b8b1 100644 (file)
@@ -44,7 +44,7 @@ class PoolCounterWorkViaCallback extends PoolCounterWork {
         * If a 'doCachedWork' callback is provided, then execute() may wait for any prior
         * process in the pool to finish and reuse its cached result.
         *
-        * @param string $type
+        * @param string $type The class of actions to limit concurrency for
         * @param string $key
         * @param array $callbacks Map of callbacks
         * @throws MWException
index 13f13e6..121a6c9 100644 (file)
@@ -114,16 +114,6 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                return $this->origin;
        }
 
-       /**
-        * Set this module's origin. This is called by ResourceLoader::register()
-        * when registering the module. Other code should not call this.
-        *
-        * @param int $origin Origin
-        */
-       public function setOrigin( $origin ) {
-               $this->origin = $origin;
-       }
-
        /**
         * @param ResourceLoaderContext $context
         * @return bool
index 1b5a834..c235861 100644 (file)
@@ -54,6 +54,7 @@ class SessionInfo {
        private $remembered = false;
        private $forceHTTPS = false;
        private $idIsSafe = false;
+       private $forceUse = false;
 
        /** @var array|null */
        private $providerMetadata = null;
@@ -76,6 +77,10 @@ class SessionInfo {
         *  - idIsSafe: (bool) Set true if the 'id' did not come from the user.
         *    Generally you'll use this from SessionProvider::newEmptySession(),
         *    and not from any other method.
+        *  - forceUse: (bool) Set true if the 'id' is from
+        *    SessionProvider::hashToSessionId() to delete conflicting session
+        *    store data instead of discarding this SessionInfo. Ignored unless
+        *    both 'provider' and 'id' are given.
         *  - copyFrom: (SessionInfo) SessionInfo to copy other data items from.
         */
        public function __construct( $priority, array $data ) {
@@ -97,6 +102,7 @@ class SessionInfo {
                                'forceHTTPS' => $from->forceHTTPS,
                                'metadata' => $from->providerMetadata,
                                'idIsSafe' => $from->idIsSafe,
+                               'forceUse' => $from->forceUse,
                                // @codeCoverageIgnoreStart
                        ];
                        // @codeCoverageIgnoreEnd
@@ -110,6 +116,7 @@ class SessionInfo {
                                'forceHTTPS' => false,
                                'metadata' => null,
                                'idIsSafe' => false,
+                               'forceUse' => false,
                                // @codeCoverageIgnoreStart
                        ];
                        // @codeCoverageIgnoreEnd
@@ -137,9 +144,11 @@ class SessionInfo {
                if ( $data['id'] !== null ) {
                        $this->id = $data['id'];
                        $this->idIsSafe = $data['idIsSafe'];
+                       $this->forceUse = $data['forceUse'] && $this->provider;
                } else {
                        $this->id = $this->provider->getManager()->generateSessionId();
                        $this->idIsSafe = true;
+                       $this->forceUse = false;
                }
                $this->priority = (int)$priority;
                $this->userInfo = $data['userInfo'];
@@ -185,6 +194,20 @@ class SessionInfo {
                return $this->idIsSafe;
        }
 
+       /**
+        * Force use of this SessionInfo if validation fails
+        *
+        * The normal behavior is to discard the SessionInfo if validation against
+        * the data stored in the session store fails. If this returns true,
+        * SessionManager will instead delete the session store data so this
+        * SessionInfo may still be used.
+        *
+        * @return bool
+        */
+       final public function forceUse() {
+               return $this->forceUse;
+       }
+
        /**
         * Return the priority
         * @return int
index a364045..777d3d6 100644 (file)
@@ -301,6 +301,19 @@ final class SessionManager implements SessionManagerInterface {
                return $this->getSessionFromInfo( $infos[0], $request );
        }
 
+       public function invalidateSessionsForUser( User $user ) {
+               global $wgAuth;
+
+               $user->setToken();
+               $user->saveSettings();
+
+               $wgAuth->getUserInstance( $user )->resetAuthToken();
+
+               foreach ( $this->getProviders() as $provider ) {
+                       $provider->invalidateSessionsForUser( $user );
+               }
+       }
+
        public function getVaryHeaders() {
                // @codeCoverageIgnoreStart
                if ( defined( 'MW_NO_SESSION' ) && MW_NO_SESSION !== 'warn' ) {
@@ -704,6 +717,20 @@ final class SessionManager implements SessionManagerInterface {
                $key = wfMemcKey( 'MWSession', $info->getId() );
                $blob = $this->store->get( $key );
 
+               // If we got data from the store and the SessionInfo says to force use,
+               // "fail" means to delete the data from the store and retry. Otherwise,
+               // "fail" is just return false.
+               if ( $info->forceUse() && $blob !== false ) {
+                       $failHandler = function () use ( $key, &$info, $request ) {
+                               $this->store->delete( $key );
+                               return $this->loadSessionInfoFromStore( $info, $request );
+                       };
+               } else {
+                       $failHandler = function () {
+                               return false;
+                       };
+               }
+
                $newParams = [];
 
                if ( $blob !== false ) {
@@ -713,7 +740,7 @@ final class SessionManager implements SessionManagerInterface {
                                        'session' => $info,
                                ] );
                                $this->store->delete( $key );
-                               return false;
+                               return $failHandler();
                        }
 
                        // Sanity check: blob has data and metadata arrays
@@ -724,7 +751,7 @@ final class SessionManager implements SessionManagerInterface {
                                        'session' => $info,
                                ] );
                                $this->store->delete( $key );
-                               return false;
+                               return $failHandler();
                        }
 
                        $data = $blob['data'];
@@ -741,7 +768,7 @@ final class SessionManager implements SessionManagerInterface {
                                        'session' => $info,
                                ] );
                                $this->store->delete( $key );
-                               return false;
+                               return $failHandler();
                        }
 
                        // First, load the provider from metadata, or validate it against the metadata.
@@ -756,7 +783,7 @@ final class SessionManager implements SessionManagerInterface {
                                                ]
                                        );
                                        $this->store->delete( $key );
-                                       return false;
+                                       return $failHandler();
                                }
                        } elseif ( $metadata['provider'] !== (string)$provider ) {
                                $this->logger->warning( 'Session "{session}": Wrong provider ' .
@@ -764,7 +791,7 @@ final class SessionManager implements SessionManagerInterface {
                                        [
                                                'session' => $info,
                                ] );
-                               return false;
+                               return $failHandler();
                        }
 
                        // Load provider metadata from metadata, or validate it against the metadata
@@ -788,7 +815,7 @@ final class SessionManager implements SessionManagerInterface {
                                                                'exception' => $ex,
                                                        ] + $ex->getContext()
                                                );
-                                               return false;
+                                               return $failHandler();
                                        }
                                }
                        }
@@ -810,7 +837,7 @@ final class SessionManager implements SessionManagerInterface {
                                                'session' => $info,
                                                'exception' => $ex,
                                        ] );
-                                       return false;
+                                       return $failHandler();
                                }
                                $newParams['userInfo'] = $userInfo;
                        } else {
@@ -825,7 +852,7 @@ final class SessionManager implements SessionManagerInterface {
                                                                'uid_a' => $metadata['userId'],
                                                                'uid_b' => $userInfo->getId(),
                                                ] );
-                                               return false;
+                                               return $failHandler();
                                        }
 
                                        // If the user was renamed, probably best to fail here.
@@ -839,7 +866,7 @@ final class SessionManager implements SessionManagerInterface {
                                                                'uname_a' => $metadata['userName'],
                                                                'uname_b' => $userInfo->getName(),
                                                ] );
-                                               return false;
+                                               return $failHandler();
                                        }
 
                                } elseif ( $metadata['userName'] !== null ) { // Shouldn't happen, but just in case
@@ -851,7 +878,7 @@ final class SessionManager implements SessionManagerInterface {
                                                                'uname_a' => $metadata['userName'],
                                                                'uname_b' => $userInfo->getName(),
                                                ] );
-                                               return false;
+                                               return $failHandler();
                                        }
                                } elseif ( !$userInfo->isAnon() ) {
                                        // Metadata specifies an anonymous user, but the passed-in
@@ -861,7 +888,7 @@ final class SessionManager implements SessionManagerInterface {
                                                [
                                                        'session' => $info,
                                        ] );
-                                       return false;
+                                       return $failHandler();
                                }
                        }
 
@@ -872,7 +899,7 @@ final class SessionManager implements SessionManagerInterface {
                                $this->logger->warning( 'Session "{session}": User token mismatch', [
                                        'session' => $info,
                                ] );
-                               return false;
+                               return $failHandler();
                        }
                        if ( !$userInfo->isVerified() ) {
                                $newParams['userInfo'] = $userInfo->verified();
@@ -899,7 +926,7 @@ final class SessionManager implements SessionManagerInterface {
                                        [
                                                'session' => $info,
                                ] );
-                               return false;
+                               return $failHandler();
                        }
 
                        // If no user was provided and no metadata, it must be anon.
@@ -912,7 +939,7 @@ final class SessionManager implements SessionManagerInterface {
                                                [
                                                        'session' => $info,
                                        ] );
-                                       return false;
+                                       return $failHandler();
                                }
                        } elseif ( !$info->getUserInfo()->isVerified() ) {
                                $this->logger->warning(
@@ -920,7 +947,7 @@ final class SessionManager implements SessionManagerInterface {
                                        [
                                                'session' => $info,
                                ] );
-                               return false;
+                               return $failHandler();
                        }
 
                        $data = false;
@@ -942,7 +969,7 @@ final class SessionManager implements SessionManagerInterface {
                // Allow the provider to check the loaded SessionInfo
                $providerMetadata = $info->getProviderMetadata();
                if ( !$info->getProvider()->refreshSessionInfo( $info, $request, $providerMetadata ) ) {
-                       return false;
+                       return $failHandler();
                }
                if ( $providerMetadata !== $info->getProviderMetadata() ) {
                        $info = new SessionInfo( $info->getPriority(), [
@@ -962,7 +989,7 @@ final class SessionManager implements SessionManagerInterface {
                        $this->logger->warning( 'Session "{session}": ' . $reason, [
                                'session' => $info,
                        ] );
-                       return false;
+                       return $failHandler();
                }
 
                return true;
@@ -1074,7 +1101,7 @@ final class SessionManager implements SessionManagerInterface {
         */
        public function generateSessionId() {
                do {
-                       $id = wfBaseConvert( \MWCryptRand::generateHex( 40 ), 16, 32, 32 );
+                       $id = \Wikimedia\base_convert( \MWCryptRand::generateHex( 40 ), 16, 32, 32 );
                        $key = wfMemcKey( 'MWSession', $id );
                } while ( isset( $this->allSessionIds[$id] ) || is_array( $this->store->get( $key ) ) );
                return $id;
index b3e28fe..d4e52c7 100644 (file)
@@ -24,6 +24,7 @@
 namespace MediaWiki\Session;
 
 use Psr\Log\LoggerAwareInterface;
+use User;
 use WebRequest;
 
 /**
@@ -72,6 +73,17 @@ interface SessionManagerInterface extends LoggerAwareInterface {
         */
        public function getEmptySession( WebRequest $request = null );
 
+       /**
+        * Invalidate sessions for a user
+        *
+        * After calling this, existing sessions should be invalid. For mutable
+        * session providers, this generally means the user has to log in again;
+        * for immutable providers, it generally means the loss of session data.
+        *
+        * @param User $user
+        */
+       public function invalidateSessionsForUser( User $user );
+
        /**
         * Return the HTTP headers that need varying on.
         *
index 8ee1272..ed113b7 100644 (file)
@@ -27,6 +27,7 @@ use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Config;
 use Language;
+use User;
 use WebRequest;
 
 /**
@@ -358,6 +359,19 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
                }
        }
 
+       /**
+        * Invalidate existing sessions for a user
+        *
+        * If the provider has its own equivalent of CookieSessionProvider's Token
+        * cookie (and doesn't use User::getToken() to implement it), it should
+        * reset whatever token it does use here.
+        *
+        * @protected For use by \MediaWiki\Session\SessionManager only
+        * @param User $user;
+        */
+       public function invalidateSessionsForUser( User $user ) {
+       }
+
        /**
         * Return the HTTP headers that need varying on.
         *
@@ -458,7 +472,9 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         *
         * Generally this will only be used when self::persistsSessionId() is false and
         * the provider has to base the session ID on the verified user's identity
-        * or other static data.
+        * or other static data. The SessionInfo should then typically have the
+        * 'forceUse' flag set to avoid persistent session failure if validation of
+        * the stored data fails.
         *
         * @param string $data
         * @param string|null $key Defaults to $this->config->get( 'SecretKey' )
@@ -484,7 +500,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
                        // @codeCoverageIgnoreEnd
                }
                if ( strlen( $hash ) >= 40 ) {
-                       $hash = wfBaseConvert( $hash, 16, 32, 32 );
+                       $hash = \Wikimedia\base_convert( $hash, 16, 32, 32 );
                }
                return substr( $hash, -32 );
        }
index 97fffda..d70a6b9 100644 (file)
@@ -1589,8 +1589,8 @@ abstract class Skin extends ContextSource {
        public function linkKnown(
                $target,
                $html = null,
-               $customAttribs = [ ],
-               $query = [ ],
+               $customAttribs = [],
+               $query = [],
                $options = [ 'known', 'noclasses' ]
        ) {
                wfDeprecated( __METHOD__, '1.21' );
index 725c4fc..4c869f9 100644 (file)
@@ -86,6 +86,7 @@ class SpecialPageFactory {
                'CreateAccount' => 'SpecialCreateAccount',
 
                // Users and rights
+               'Activeusers' => 'SpecialActiveUsers',
                'Block' => 'SpecialBlock',
                'Unblock' => 'SpecialUnblock',
                'BlockList' => 'SpecialBlockList',
@@ -254,8 +255,6 @@ class SpecialPageFactory {
                                self::$list['ChangeContentModel'] = 'SpecialChangeContentModel';
                        }
 
-                       self::$list['Activeusers'] = 'SpecialActiveUsers';
-
                        // Add extension special pages
                        self::$list = array_merge( self::$list, $wgSpecialPages );
 
@@ -539,6 +538,7 @@ class SpecialPageFactory {
                        $trxProfiler = Profiler::instance()->getTransactionProfiler();
                        if ( $context->getRequest()->wasPosted() && !$page->doesWrites() ) {
                                $trxProfiler->setExpectations( $trxLimits['POST-nonwrite'], __METHOD__ );
+                               $context->getRequest()->markAsSafeRequest();
                        }
                }
 
index d6d4500..c697ca7 100644 (file)
@@ -24,6 +24,8 @@
  */
 
 /**
+ * Implements Special:Activeusers
+ *
  * @ingroup SpecialPage
  */
 class SpecialActiveUsers extends SpecialPage {
@@ -41,16 +43,25 @@ class SpecialActiveUsers extends SpecialPage {
         * @param string $par Parameter passed to the page or null
         */
        public function execute( $par ) {
-               $days = $this->getConfig()->get( 'ActiveUserDays' );
+               $out = $this->getOutput();
 
                $this->setHeaders();
                $this->outputHeader();
 
-               $out = $this->getOutput();
-               $out->wrapWikiMsg( "<div class='mw-activeusers-intro'>\n$1\n</div>",
-                       [ 'activeusers-intro', $this->getLanguage()->formatNum( $days ) ] );
+               $opts = new FormOptions();
+
+               $opts->add( 'username', '' );
+               $opts->add( 'hidebots', false, FormOptions::BOOL );
+               $opts->add( 'hidesysops', false, FormOptions::BOOL );
+
+               $opts->fetchValuesFromRequest( $this->getRequest() );
+
+               if ( $par !== null ) {
+                       $opts->setValue( 'username', $par );
+               }
 
                // Mention the level of cache staleness...
+               $cacheText = '';
                $dbr = wfGetDB( DB_SLAVE, 'recentchanges' );
                $rcMax = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', '', __METHOD__ );
                if ( $rcMax ) {
@@ -66,22 +77,51 @@ class SpecialActiveUsers extends SpecialPage {
                                $secondsOld = time() - wfTimestamp( TS_UNIX, $rcMin );
                        }
                        if ( $secondsOld > 0 ) {
-                               $out->addWikiMsg( 'cachedspecial-viewing-cached-ttl',
-                               $this->getLanguage()->formatDuration( $secondsOld ) );
+                               $cacheTxt = '<br>' . $this->msg( 'cachedspecial-viewing-cached-ttl' )
+                                       ->durationParams( $secondsOld );
                        }
                }
 
-               $up = new ActiveUsersPager( $this->getContext(), null, $par );
+               $pager = new ActiveUsersPager( $this->getContext(), $opts );
+               $usersBody = $pager->getBody();
+
+               $days = $this->getConfig()->get( 'ActiveUserDays' );
+
+               $formDescriptor = [
+                       'username' => [
+                               'type' => 'user',
+                               'name' => 'username',
+                               'label-message' => 'activeusers-from',
+                       ],
+
+                       'hidebots' => [
+                               'type' => 'check',
+                               'name' => 'hidebots',
+                               'label-message' => 'activeusers-hidebots',
+                               'default' => false,
+                       ],
+
+                       'hidesysops' => [
+                               'type' => 'check',
+                               'name' => 'hidesysops',
+                               'label-message' => 'activeusers-hidesysops',
+                               'default' => false,
+                       ],
+               ];
 
-               # getBody() first to check, if empty
-               $usersbody = $up->getBody();
+               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       ->setIntro( $this->msg( 'activeusers-intro' )->numParams( $days ) . $cacheText )
+                       ->setWrapperLegendMsg( 'activeusers' )
+                       ->setSubmitTextMsg( 'activeusers-submit' )
+                       ->setMethod( 'get' )
+                       ->prepareForm()
+                       ->displayForm( false );
 
-               $out->addHTML( $up->getPageHeader() );
-               if ( $usersbody ) {
+               if ( $usersBody ) {
                        $out->addHTML(
-                               $up->getNavigationBar() .
-                               Html::rawElement( 'ul', [], $usersbody ) .
-                               $up->getNavigationBar()
+                               $pager->getNavigationBar() .
+                               Html::rawElement( 'ul', [], $usersBody ) .
+                               $pager->getNavigationBar()
                        );
                } else {
                        $out->addWikiMsg( 'activeusers-noresult' );
index fe90a4f..11faa28 100644 (file)
@@ -32,7 +32,7 @@ class SpecialBookSources extends SpecialPage {
        /**
         * ISBN passed to the page, if any
         */
-       private $isbn = '';
+       protected $isbn = '';
 
        public function __construct() {
                parent::__construct( 'Booksources' );
@@ -44,17 +44,23 @@ class SpecialBookSources extends SpecialPage {
         * @param string $isbn ISBN passed as a subpage parameter
         */
        public function execute( $isbn ) {
+               $out = $this->getOutput();
+
                $this->setHeaders();
                $this->outputHeader();
+
                $this->isbn = self::cleanIsbn( $isbn ?: $this->getRequest()->getText( 'isbn' ) );
-               $this->getOutput()->addHTML( $this->makeForm() );
+
+               $this->buildForm();
+
                if ( $this->isbn !== '' ) {
                        if ( !self::isValidISBN( $this->isbn ) ) {
-                               $this->getOutput()->wrapWikiMsg(
+                               $out->wrapWikiMsg(
                                        "<div class=\"error\">\n$1\n</div>",
                                        'booksources-invalid-isbn'
                                );
                        }
+
                        $this->showList();
                }
        }
@@ -115,36 +121,25 @@ class SpecialBookSources extends SpecialPage {
 
        /**
         * Generate a form to allow users to enter an ISBN
-        *
-        * @return string
         */
-       private function makeForm() {
-               $form = Html::openElement( 'fieldset' ) . "\n";
-               $form .= Html::element(
-                       'legend',
-                       [],
-                       $this->msg( 'booksources-search-legend' )->text()
-               ) . "\n";
-               $form .= Html::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] ) . "\n";
-               $form .= Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) . "\n";
-               $form .= '<p>' . Xml::inputLabel(
-                       $this->msg( 'booksources-isbn' )->text(),
-                       'isbn',
-                       'isbn',
-                       20,
-                       $this->isbn,
-                       [ 'autofocus' => '', 'class' => 'mw-ui-input-inline' ]
-               );
-
-               $form .= '&#160;' . Html::submitButton(
-                       $this->msg( 'booksources-search' )->text(),
-                       [], [ 'mw-ui-progressive' ]
-               ) . "</p>\n";
-
-               $form .= Html::closeElement( 'form' ) . "\n";
-               $form .= Html::closeElement( 'fieldset' ) . "\n";
-
-               return $form;
+       private function buildForm() {
+               $formDescriptor = [
+                       'isbn' => [
+                               'type' => 'text',
+                               'name' => 'isbn',
+                               'label-message' => 'booksources-isbn',
+                               'default' => $this->isbn,
+                               'autofocus' => true,
+                               'required' => true,
+                       ],
+               ];
+
+               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       ->setWrapperLegendMsg( 'booksources-search-legend' )
+                       ->setSubmitTextMsg( 'booksources-search' )
+                       ->setMethod( 'get' )
+                       ->prepareForm()
+                       ->displayForm( false );
        }
 
        /**
@@ -155,11 +150,13 @@ class SpecialBookSources extends SpecialPage {
         * @return bool
         */
        private function showList() {
+               $out = $this->getOutput();
+
                global $wgContLang;
 
                # Hook to allow extensions to insert additional HTML,
                # e.g. for API-interacting plugins and so on
-               Hooks::run( 'BookInformation', [ $this->isbn, $this->getOutput() ] );
+               Hooks::run( 'BookInformation', [ $this->isbn, $out ] );
 
                # Check for a local page such as Project:Book_sources and use that if available
                $page = $this->msg( 'booksources' )->inContentLanguage()->text();
@@ -172,7 +169,7 @@ class SpecialBookSources extends SpecialPage {
                                // XXX: in the future, this could be stored as structured data, defining a list of book sources
 
                                $text = $content->getNativeData();
-                               $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
+                               $out->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
 
                                return true;
                        } else {
@@ -181,13 +178,13 @@ class SpecialBookSources extends SpecialPage {
                }
 
                # Fall back to the defaults given in the language file
-               $this->getOutput()->addWikiMsg( 'booksources-text' );
-               $this->getOutput()->addHTML( '<ul>' );
+               $out->addWikiMsg( 'booksources-text' );
+               $out->addHTML( '<ul>' );
                $items = $wgContLang->getBookstoreList();
                foreach ( $items as $label => $url ) {
-                       $this->getOutput()->addHTML( $this->makeListItem( $label, $url ) );
+                       $out->addHTML( $this->makeListItem( $label, $url ) );
                }
-               $this->getOutput()->addHTML( '</ul>' );
+               $out->addHTML( '</ul>' );
 
                return true;
        }
index a229fa3..2d087ca 100644 (file)
@@ -34,7 +34,7 @@ class SpecialLockdb extends FormSpecialPage {
        }
 
        public function doesWrites() {
-               return true;
+               return false;
        }
 
        public function requiresWrite() {
@@ -47,6 +47,9 @@ class SpecialLockdb extends FormSpecialPage {
                if ( !is_writable( dirname( $this->getConfig()->get( 'ReadOnlyFile' ) ) ) ) {
                        throw new ErrorPageError( 'lockdb', 'lockfilenotwritable' );
                }
+               if ( file_exists( $this->getConfig()->get( 'ReadOnlyFile' ) ) ) {
+                       throw new ErrorPageError( 'lockdb', 'databaselocked' );
+               }
        }
 
        protected function getFormFields() {
@@ -65,9 +68,9 @@ class SpecialLockdb extends FormSpecialPage {
        }
 
        protected function alterForm( HTMLForm $form ) {
-               $form->setWrapperLegend( false );
-               $form->setHeaderText( $this->msg( 'lockdbtext' )->parseAsBlock() );
-               $form->setSubmitTextMsg( 'lockbtn' );
+               $form->setWrapperLegend( false )
+                       ->setHeaderText( $this->msg( 'lockdbtext' )->parseAsBlock() )
+                       ->setSubmitTextMsg( 'lockbtn' );
        }
 
        public function onSubmit( array $data ) {
@@ -105,6 +108,10 @@ class SpecialLockdb extends FormSpecialPage {
                $out->addWikiMsg( 'lockdbsuccesstext' );
        }
 
+       protected function getDisplayFormat() {
+               return 'ooui';
+       }
+
        protected function getGroupName() {
                return 'wiki';
        }
index defca7d..e3be225 100644 (file)
@@ -106,21 +106,26 @@ class MIMEsearchPage extends QueryPage {
        }
 
        /**
-        * Return HTML to put just before the results.
+        * Generate and output the form
         */
        function getPageHeader() {
-               return Xml::openElement(
-                               'form',
-                               [ 'id' => 'specialmimesearch', 'method' => 'get', 'action' => wfScript() ]
-                       ) .
-                       Xml::openElement( 'fieldset' ) .
-                       Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
-                       Xml::element( 'legend', null, $this->msg( 'mimesearch' )->text() ) .
-                       Xml::inputLabel( $this->msg( 'mimetype' )->text(), 'mime', 'mime', 20, $this->mime ) .
-                       ' ' .
-                       Xml::submitButton( $this->msg( 'ilsubmit' )->text() ) .
-                                       Xml::closeElement( 'fieldset' ) .
-                                       Xml::closeElement( 'form' );
+               $formDescriptor = [
+                       'mime' => [
+                               'type' => 'text',
+                               'name' => 'mime',
+                               'label-message' => 'mimetype',
+                               'required' => true,
+                               'default' => $this->mime,
+                       ],
+               ];
+
+               $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       ->setWrapperLegendMsg( 'mimesearch' )
+                       ->setSubmitTextMsg( 'ilsubmit' )
+                       ->setAction( $this->getPageTitle()->getLocalURL() )
+                       ->setMethod( 'get' )
+                       ->prepareForm()
+                       ->displayForm( false );
        }
 
        public function execute( $par ) {
@@ -133,7 +138,7 @@ class MIMEsearchPage extends QueryPage {
                ) {
                        $this->setHeaders();
                        $this->outputHeader();
-                       $this->getOutput()->addHTML( $this->getPageHeader() );
+                       $this->getPageHeader();
                        return;
                }
 
index b916c1f..162ef60 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialMergeHistory extends SpecialPage {
-       /** @var string */
-       protected $mAction;
+       /** @var FormOptions */
+       protected $mOpts;
 
-       /** @var string */
-       protected $mTarget;
+       /** @var Status */
+       protected $mStatus;
 
-       /** @var string */
-       protected $mDest;
-
-       /** @var string */
-       protected $mTimestamp;
-
-       /** @var int */
-       protected $mTargetID;
-
-       /** @var int */
-       protected $mDestID;
-
-       /** @var string */
-       protected $mComment;
-
-       /** @var bool Was posted? */
-       protected $mMerge;
-
-       /** @var bool Was submitted? */
-       protected $mSubmitted;
-
-       /** @var Title */
-       protected $mTargetObj;
-
-       /** @var Title */
-       protected $mDestObj;
+       /** @var Title|null */
+       protected $mTargetObj, $mDestObj;
 
        /** @var int[] */
        public $prevId;
@@ -72,124 +48,107 @@ class SpecialMergeHistory extends SpecialPage {
                return true;
        }
 
-       /**
-        * @return void
-        */
-       private function loadRequestParams() {
-               $request = $this->getRequest();
-               $this->mAction = $request->getVal( 'action' );
-               $this->mTarget = $request->getVal( 'target' );
-               $this->mDest = $request->getVal( 'dest' );
-               $this->mSubmitted = $request->getBool( 'submitted' );
-
-               $this->mTargetID = intval( $request->getVal( 'targetID' ) );
-               $this->mDestID = intval( $request->getVal( 'destID' ) );
-               $this->mTimestamp = $request->getVal( 'mergepoint' );
-               if ( !preg_match( '/[0-9]{14}/', $this->mTimestamp ) ) {
-                       $this->mTimestamp = '';
-               }
-               $this->mComment = $request->getText( 'wpComment' );
-
-               $this->mMerge = $request->wasPosted()
-                       && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
-
-               // target page
-               if ( $this->mSubmitted ) {
-                       $this->mTargetObj = Title::newFromText( $this->mTarget );
-                       $this->mDestObj = Title::newFromText( $this->mDest );
-               } else {
-                       $this->mTargetObj = null;
-                       $this->mDestObj = null;
-               }
-       }
-
        public function execute( $par ) {
                $this->useTransactionalTimeLimit();
 
                $this->checkPermissions();
                $this->checkReadOnly();
 
-               $this->loadRequestParams();
-
                $this->setHeaders();
                $this->outputHeader();
 
-               if ( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
+               $this->addHelpLink( 'Help:Merge history' );
+
+               $opts = new FormOptions();
+
+               $opts->add( 'target', '' );
+               $opts->add( 'dest', '' );
+               $opts->add( 'target', '' );
+               $opts->add( 'mergepoint', '' );
+               $opts->add( 'reason', '' );
+               $opts->add( 'merge', false );
+
+               $opts->fetchValuesFromRequest( $this->getRequest() );
+
+               $target = $opts->getValue( 'target' );
+               $dest = $opts->getValue( 'dest' );
+               $targetObj = Title::newFromText( $target );
+               $destObj = Title::newFromText( $dest );
+               $status = Status::newGood();
+
+               $this->mOpts = $opts;
+               $this->mTargetObj = $targetObj;
+               $this->mDestObj = $destObj;
+
+               if ( $opts->getValue( 'merge' ) && $targetObj &&
+                       $destObj && $opts->getValue( 'mergepoint' ) !== '' ) {
                        $this->merge();
 
                        return;
                }
 
-               if ( !$this->mSubmitted ) {
+               if ( $target === '' && $dest === '' ) {
                        $this->showMergeForm();
 
                        return;
                }
 
-               $errors = [];
-               if ( !$this->mTargetObj instanceof Title ) {
-                       $errors[] = $this->msg( 'mergehistory-invalid-source' )->parseAsBlock();
-               } elseif ( !$this->mTargetObj->exists() ) {
-                       $errors[] = $this->msg( 'mergehistory-no-source',
-                               wfEscapeWikiText( $this->mTargetObj->getPrefixedText() )
-                       )->parseAsBlock();
+               if ( !$targetObj instanceof Title ) {
+                       $status->merge( Status::newFatal( 'mergehistory-invalid-source' ) );
+               } elseif ( !$targetObj->exists() ) {
+                       $status->merge( Status::newFatal( 'mergehistory-no-source',
+                               wfEscapeWikiText( $targetObj->getPrefixedText() )
+                       ) );
                }
 
-               if ( !$this->mDestObj instanceof Title ) {
-                       $errors[] = $this->msg( 'mergehistory-invalid-destination' )->parseAsBlock();
-               } elseif ( !$this->mDestObj->exists() ) {
-                       $errors[] = $this->msg( 'mergehistory-no-destination',
-                               wfEscapeWikiText( $this->mDestObj->getPrefixedText() )
-                       )->parseAsBlock();
+               if ( !$destObj instanceof Title ) {
+                       $status->merge( Status::newFatal( 'mergehistory-invalid-destination' ) );
+               } elseif ( !$destObj->exists() ) {
+                       $status->merge( Status::newFatal( 'mergehistory-no-destination',
+                               wfEscapeWikiText( $destObj->getPrefixedText() )
+                       ) );
                }
 
-               if ( $this->mTargetObj && $this->mDestObj && $this->mTargetObj->equals( $this->mDestObj ) ) {
-                       $errors[] = $this->msg( 'mergehistory-same-destination' )->parseAsBlock();
+               if ( $targetObj && $destObj && $targetObj->equals( $destObj ) ) {
+                       $status->merge( Status::newFatal( 'mergehistory-same-destination' ) );
                }
 
-               if ( count( $errors ) ) {
-                       $this->showMergeForm();
-                       $this->getOutput()->addHTML( implode( "\n", $errors ) );
-               } else {
+               $this->mStatus = $status;
+
+               $this->showMergeForm();
+
+               if ( $status->isOK() ) {
                        $this->showHistory();
                }
        }
 
        function showMergeForm() {
-               $out = $this->getOutput();
-               $out->addWikiMsg( 'mergehistory-header' );
-
-               $out->addHTML(
-                       Xml::openElement( 'form', [
-                               'method' => 'get',
-                               'action' => wfScript() ] ) .
-                               '<fieldset>' .
-                               Xml::element( 'legend', [],
-                                       $this->msg( 'mergehistory-box' )->text() ) .
-                               Html::hidden( 'title', $this->getPageTitle()->getPrefixedDBkey() ) .
-                               Html::hidden( 'submitted', '1' ) .
-                               Html::hidden( 'mergepoint', $this->mTimestamp ) .
-                               Xml::openElement( 'table' ) .
-                               '<tr>
-                               <td>' . Xml::label( $this->msg( 'mergehistory-from' )->text(), 'target' ) . '</td>
-                               <td>' . Xml::input( 'target', 30, $this->mTarget, [ 'id' => 'target' ] ) . '</td>
-                       </tr><tr>
-                               <td>' . Xml::label( $this->msg( 'mergehistory-into' )->text(), 'dest' ) . '</td>
-                               <td>' . Xml::input( 'dest', 30, $this->mDest, [ 'id' => 'dest' ] ) . '</td>
-                       </tr><tr><td>' .
-                               Xml::submitButton( $this->msg( 'mergehistory-go' )->text() ) .
-                               '</td></tr>' .
-                               Xml::closeElement( 'table' ) .
-                               '</fieldset>' .
-                               '</form>'
-               );
-
-               $this->addHelpLink( 'Help:Merge history' );
+               $formDescriptor = [
+                       'target' => [
+                               'type' => 'title',
+                               'name' => 'target',
+                               'label-message' => 'mergehistory-from',
+                               'required' => true,
+                       ],
+
+                       'dest' => [
+                               'type' => 'title',
+                               'name' => 'dest',
+                               'label-message' => 'mergehistory-into',
+                               'required' => true,
+                       ],
+               ];
+
+               $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       ->setIntro( $this->msg( 'mergehistory-header' ) )
+                       ->setWrapperLegendMsg( 'mergehistory-box' )
+                       ->setSubmitTextMsg( 'mergehistory-go' )
+                       ->setMethod( 'post' )
+                       ->prepareForm()
+                       ->displayForm( $this->mStatus );
        }
 
        private function showHistory() {
-               $this->showMergeForm();
-
                # List all stored revisions
                $revisions = new MergeHistoryPager(
                        $this, [], $this->mTargetObj, $this->mDestObj
@@ -197,62 +156,46 @@ class SpecialMergeHistory extends SpecialPage {
                $haveRevisions = $revisions && $revisions->getNumRows() > 0;
 
                $out = $this->getOutput();
-               $titleObj = $this->getPageTitle();
-               $action = $titleObj->getLocalURL( [ 'action' => 'submit' ] );
-               # Start the form here
-               $top = Xml::openElement(
-                       'form',
-                       [
-                               'method' => 'post',
-                               'action' => $action,
-                               'id' => 'merge'
-                       ]
-               );
-               $out->addHTML( $top );
-
-               if ( $haveRevisions ) {
-                       # Format the user-visible controls (comment field, submission button)
-                       # in a nice little table
-                       $table =
-                               Xml::openElement( 'fieldset' ) .
-                                       $this->msg( 'mergehistory-merge', $this->mTargetObj->getPrefixedText(),
-                                               $this->mDestObj->getPrefixedText() )->parse() .
-                                       Xml::openElement( 'table', [ 'id' => 'mw-mergehistory-table' ] ) .
-                                       '<tr>
-                                               <td class="mw-label">' .
-                                       Xml::label( $this->msg( 'mergehistory-reason' )->text(), 'wpComment' ) .
-                                       '</td>
-                                       <td class="mw-input">' .
-                                       Xml::input( 'wpComment', 50, $this->mComment, [ 'id' => 'wpComment' ] ) .
-                                       '</td>
-                                       </tr>
-                                       <tr>
-                                               <td>&#160;</td>
-                                               <td class="mw-submit">' .
-                                       Xml::submitButton(
-                                               $this->msg( 'mergehistory-submit' )->text(),
-                                               [ 'name' => 'merge', 'id' => 'mw-merge-submit' ]
-                                       ) .
-                                       '</td>
-                                       </tr>' .
-                                       Xml::closeElement( 'table' ) .
-                                       Xml::closeElement( 'fieldset' );
-
-                       $out->addHTML( $table );
-               }
-
-               $out->addHTML(
-                       '<h2 id="mw-mergehistory">' .
-                               $this->msg( 'mergehistory-list' )->escaped() . "</h2>\n"
-               );
+               $header = '<h2 id="mw-mergehistory">' .
+                       $this->msg( 'mergehistory-list' )->escaped() . "</h2>\n";
 
                if ( $haveRevisions ) {
-                       $out->addHTML( $revisions->getNavigationBar() );
-                       $out->addHTML( '<ul>' );
-                       $out->addHTML( $revisions->getBody() );
-                       $out->addHTML( '</ul>' );
-                       $out->addHTML( $revisions->getNavigationBar() );
+                       $hiddenFields = [
+                               'merge' => true,
+                               'target' => $this->mOpts->getValue( 'target' ),
+                               'dest' => $this->mOpts->getValue( 'dest' ),
+                       ];
+
+                       $formDescriptor = [
+                               'reason' => [
+                                       'type' => 'text',
+                                       'name' => 'reason',
+                                       'label-message' => 'mergehistory-reason',
+                               ],
+                       ];
+
+                       $mergeText = $this->msg( 'mergehistory-merge',
+                               $this->mTargetObj->getPrefixedText(),
+                               $this->mDestObj->getPrefixedText()
+                       )->parse();
+
+                       $history = $header .
+                               $revisions->getNavigationBar() .
+                               '<ul>' .
+                               $revisions->getBody() .
+                               '</ul>' .
+                               $revisions->getNavigationBar();
+
+                       $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                               ->addHiddenFields( $hiddenFields )
+                               ->setPreText( $mergeText )
+                               ->setFooterText( $history )
+                               ->setSubmitTextMsg( 'mergehistory-submit' )
+                               ->setMethod( 'post' )
+                               ->prepareForm()
+                               ->displayForm( false );
                } else {
+                       $out->addHTML( $header );
                        $out->addWikiMsg( 'mergehistory-empty' );
                }
 
@@ -260,18 +203,6 @@ class SpecialMergeHistory extends SpecialPage {
                $mergeLogPage = new LogPage( 'merge' );
                $out->addHTML( '<h2>' . $mergeLogPage->getName()->escaped() . "</h2>\n" );
                LogEventsList::showLogExtract( $out, 'merge', $this->mTargetObj );
-
-               # When we submit, go by page ID to avoid some nasty but unlikely collisions.
-               # Such would happen if a page was renamed after the form loaded, but before submit
-               $misc = Html::hidden( 'targetID', $this->mTargetObj->getArticleID() );
-               $misc .= Html::hidden( 'destID', $this->mDestObj->getArticleID() );
-               $misc .= Html::hidden( 'target', $this->mTarget );
-               $misc .= Html::hidden( 'dest', $this->mDest );
-               $misc .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() );
-               $misc .= Xml::closeElement( 'form' );
-               $out->addHTML( $misc );
-
-               return true;
        }
 
        function formatRevisionRow( $row ) {
@@ -281,7 +212,7 @@ class SpecialMergeHistory extends SpecialPage {
                $last = $this->msg( 'last' )->escaped();
 
                $ts = wfTimestamp( TS_MW, $row->rev_timestamp );
-               $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mTimestamp === $ts ) );
+               $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mOpts->getValue( 'mergepoint' ) === $ts ) );
 
                $user = $this->getUser();
 
@@ -336,23 +267,24 @@ class SpecialMergeHistory extends SpecialPage {
         * @return bool Success
         */
        function merge() {
+               $opts = $this->mOpts;
+
                # Get the titles directly from the IDs, in case the target page params
                # were spoofed. The queries are done based on the IDs, so it's best to
                # keep it consistent...
-               $targetTitle = Title::newFromID( $this->mTargetID );
-               $destTitle = Title::newFromID( $this->mDestID );
-               if ( is_null( $targetTitle ) || is_null( $destTitle ) ) {
-                       return false; // validate these
-               }
-               if ( $targetTitle->getArticleID() == $destTitle->getArticleID() ) {
+               $targetObj = $this->mTargetObj;
+               $destObj = $this->mDestObj;
+
+               if ( is_null( $targetObj ) || is_null( $destObj ) ||
+                       $targetObj->getArticleID() == $destObj->getArticleID() ) {
                        return false;
                }
 
                // MergeHistory object
-               $mh = new MergeHistory( $targetTitle, $destTitle, $this->mTimestamp );
+               $mh = new MergeHistory( $targetObj, $destObj, $opts->getValue( 'mergepoint' ) );
 
                // Merge!
-               $mergeStatus = $mh->merge( $this->getUser(), $this->mComment );
+               $mergeStatus = $mh->merge( $this->getUser(), $opts->getValue( 'reason' ) );
                if ( !$mergeStatus->isOK() ) {
                        // Failed merge
                        $this->getOutput()->addWikiMsg( $mergeStatus->getMessage() );
@@ -360,7 +292,7 @@ class SpecialMergeHistory extends SpecialPage {
                }
 
                $targetLink = Linker::link(
-                       $targetTitle,
+                       $targetObj,
                        null,
                        [],
                        [ 'redirect' => 'no' ]
@@ -368,7 +300,7 @@ class SpecialMergeHistory extends SpecialPage {
 
                $this->getOutput()->addWikiMsg( $this->msg( 'mergehistory-done' )
                        ->rawParams( $targetLink )
-                       ->params( $destTitle->getPrefixedText() )
+                       ->params( $destObj->getPrefixedText() )
                        ->numParams( $mh->getMergedRevisionCount() )
                );
 
index 15bf39b..d474ba5 100644 (file)
@@ -1238,6 +1238,7 @@ class SpecialSearch extends SpecialPage {
                        'name' => 'search',
                        'autofocus' => trim( $term ) === '',
                        'value' => $term,
+                       'dataLocation' => 'content',
                ] );
 
                $out =
index 9214c23..8cd86ce 100644 (file)
@@ -33,7 +33,7 @@ class SpecialUnlockdb extends FormSpecialPage {
        }
 
        public function doesWrites() {
-               return true;
+               return false;
        }
 
        public function requiresWrite() {
@@ -58,9 +58,9 @@ class SpecialUnlockdb extends FormSpecialPage {
        }
 
        protected function alterForm( HTMLForm $form ) {
-               $form->setWrapperLegend( false );
-               $form->setHeaderText( $this->msg( 'unlockdbtext' )->parseAsBlock() );
-               $form->setSubmitTextMsg( 'unlockbtn' );
+               $form->setWrapperLegend( false )
+                       ->setHeaderText( $this->msg( 'unlockdbtext' )->parseAsBlock() )
+                       ->setSubmitTextMsg( 'unlockbtn' );
        }
 
        public function onSubmit( array $data ) {
@@ -86,6 +86,10 @@ class SpecialUnlockdb extends FormSpecialPage {
                $out->addWikiMsg( 'unlockdbsuccesstext' );
        }
 
+       protected function getDisplayFormat() {
+               return 'ooui';
+       }
+
        protected function getGroupName() {
                return 'wiki';
        }
index a77c79e..45315a7 100644 (file)
@@ -699,7 +699,7 @@ class LoginForm extends SpecialPage {
 
                $u->setEmail( $this->mEmail );
                $u->setRealName( $this->mRealName );
-               $u->setToken();
+               SessionManager::singleton()->invalidateSessionsForUser( $u );
 
                Hooks::run( 'LocalUserCreated', [ $u, $autocreate ] );
                $oldUser = $u;
index baa55f0..b4ea732 100644 (file)
@@ -75,7 +75,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $this->target = Title::newFromText( $opts->getValue( 'target' ) );
                if ( !$this->target ) {
                        if ( !$this->including() ) {
-                               $out->addHTML( $this->whatlinkshereForm() );
+                               $this->buildForm();
                        }
 
                        return;
@@ -200,12 +200,8 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                ) {
                        if ( 0 == $level ) {
                                if ( !$this->including() ) {
-                                       $out->addHTML( $this->whatlinkshereForm() );
+                                       $this->buildForm();
 
-                                       // Show filters only if there are links
-                                       if ( $hidelinks || $hidetrans || $hideredirs || $hideimages ) {
-                                               $out->addHTML( $this->getFilterPanel() );
-                                       }
                                        $errMsg = is_int( $namespace ) ? 'nolinkshere-ns' : 'nolinkshere';
                                        $out->addWikiMsg( $errMsg, $this->target->getPrefixedText() );
                                        $out->setStatusCode( 404 );
@@ -269,8 +265,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
 
                if ( $level == 0 ) {
                        if ( !$this->including() ) {
-                               $out->addHTML( $this->whatlinkshereForm() );
-                               $out->addHTML( $this->getFilterPanel() );
+                               $this->buildForm();
                                $out->addWikiMsg( 'linkshere', $this->target->getPrefixedText() );
 
                                $prevnext = $this->getPrevNext( $prevId, $nextId );
@@ -444,7 +439,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                return $this->msg( 'viewprevnext' )->rawParams( $prev, $next, $nums )->escaped();
        }
 
-       function whatlinkshereForm() {
+       protected function buildForm() {
                // We get nicer value from the title object
                $this->opts->consumeValue( 'target' );
                // Reset these for new requests
@@ -455,88 +450,57 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $nsinvert = $this->opts->consumeValue( 'invert' );
 
                # Build up the form
-               $f = Xml::openElement( 'form', [ 'action' => wfScript() ] );
 
-               # Values that should not be forgotten
-               $f .= Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() );
-               foreach ( $this->opts->getUnconsumedValues() as $name => $value ) {
-                       $f .= Html::hidden( $name, $value );
-               }
-
-               $f .= Xml::fieldset( $this->msg( 'whatlinkshere' )->text() );
-
-               # Target input (.mw-searchInput enables suggestions)
-               $f .= Xml::inputLabel( $this->msg( 'whatlinkshere-page' )->text(), 'target',
-                       'mw-whatlinkshere-target', 40, $target, [ 'class' => 'mw-searchInput' ] );
+               $hiddenFields = [
+                       'title' => $this->getPageTitle()->getPrefixedDBkey(),
+               ];
 
-               $f .= ' ';
+               $formDescriptor = [
+                       'target' => [
+                               'type' => 'title',
+                               'name' => 'target',
+                               'label-message' => 'whatlinkshere-page',
+                               'default' => $this->opts->getValue( 'target' ),
+                       ],
 
-               # Namespace selector
-               $f .= Html::namespaceSelector(
-                       [
-                               'selected' => $namespace,
-                               'all' => '',
-                               'label' => $this->msg( 'namespace' )->text()
-                       ], [
+                       'namespace' => [
+                               'type' => 'namespaceselect',
                                'name' => 'namespace',
-                               'id' => 'namespace',
-                               'class' => 'namespaceselector',
-                       ]
-               );
-
-               $f .= '&#160;' .
-                       Xml::checkLabel(
-                               $this->msg( 'invert' )->text(),
-                               'invert',
-                               'nsinvert',
-                               $nsinvert,
-                               [ 'title' => $this->msg( 'tooltip-whatlinkshere-invert' )->text() ]
-                       );
-
-               $f .= ' ';
-
-               # Submit
-               $f .= Xml::submitButton( $this->msg( 'whatlinkshere-submit' )->text() );
-
-               # Close
-               $f .= Xml::closeElement( 'fieldset' ) . Xml::closeElement( 'form' ) . "\n";
-
-               return $f;
-       }
-
-       /**
-        * Create filter panel
-        *
-        * @return string HTML fieldset and filter panel with the show/hide links
-        */
-       function getFilterPanel() {
-               $show = $this->msg( 'show' )->escaped();
-               $hide = $this->msg( 'hide' )->escaped();
-
-               $changed = $this->opts->getChangedValues();
-               unset( $changed['target'] ); // Already in the request title
+                               'label-message' => 'namespace',
+                               'all' => '',
+                       ],
+
+                       'invert' => [
+                               'type' => 'check',
+                               'name' => 'invert',
+                               'label-message' => 'invert',
+                               'default' => false,
+                       ],
+               ];
 
-               $links = [];
-               $types = [ 'hidetrans', 'hidelinks', 'hideredirs' ];
-               if ( $this->target->getNamespace() == NS_FILE ) {
-                       $types[] = 'hideimages';
+               $filters = [ 'hidetrans', 'hidelinks', 'hideredirs' ];
+               if ( $this->target instanceof Title &&
+                       $this->target->getNamespace() == NS_FILE ) {
+                       $filters[] = 'hideimages';
                }
 
-               // Combined message keys: 'whatlinkshere-hideredirs', 'whatlinkshere-hidetrans',
-               // 'whatlinkshere-hidelinks', 'whatlinkshere-hideimages'
-               // To be sure they will be found by grep
-               foreach ( $types as $type ) {
-                       $chosen = $this->opts->getValue( $type );
-                       $msg = $chosen ? $show : $hide;
-                       $overrides = [ $type => !$chosen ];
-                       $links[] = $this->msg( "whatlinkshere-{$type}" )->rawParams(
-                               $this->makeSelfLink( $msg, array_merge( $changed, $overrides ) ) )->escaped();
+               foreach ( $filters as $filter ) {
+                       $formDescriptor[$filter] = [
+                               'type' => 'check',
+                               'name' => $filter,
+                               'label' => $this->msg( 'whatlinkshere-' . $filter ),
+                               'value' => false,
+                       ];
                }
 
-               return Xml::fieldset(
-                       $this->msg( 'whatlinkshere-filters' )->text(),
-                       $this->getLanguage()->pipeList( $links )
-               );
+               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       ->addHiddenFields( $hiddenFields )
+                       ->setWrapperLegendMsg( 'whatlinkshere' )
+                       ->setSubmitTextMsg( 'whatlinkshere-submit' )
+                       ->setAction( $this->getPageTitle()->getLocalURL() )
+                       ->setMethod( 'get' )
+                       ->prepareForm()
+                       ->displayForm( false );
        }
 
        /**
index 0d3bc9a..73ab0ad 100644 (file)
@@ -52,15 +52,15 @@ class ActiveUsersPager extends UsersPager {
 
        /**
         * @param IContextSource $context
-        * @param null $group Unused
-        * @param string $par Parameter passed to the page
+        * @param FormOptions $opts
         */
-       function __construct( IContextSource $context = null, $group = null, $par = null ) {
+       function __construct( IContextSource $context = null, FormOptions $opts ) {
                parent::__construct( $context );
 
                $this->RCMaxAge = $this->getConfig()->get( 'ActiveUserDays' );
-               $un = $this->getRequest()->getText( 'username', $par );
                $this->requestedUser = '';
+
+               $un = $opts->getValue( 'username' );
                if ( $un != '' ) {
                        $username = Title::makeTitleSafe( NS_USER, $un );
                        if ( !is_null( $username ) ) {
@@ -68,21 +68,10 @@ class ActiveUsersPager extends UsersPager {
                        }
                }
 
-               $this->setupOptions();
-       }
-
-       public function setupOptions() {
-               $this->opts = new FormOptions();
-
-               $this->opts->add( 'hidebots', false, FormOptions::BOOL );
-               $this->opts->add( 'hidesysops', false, FormOptions::BOOL );
-
-               $this->opts->fetchValuesFromRequest( $this->getRequest() );
-
-               if ( $this->opts->getValue( 'hidebots' ) == 1 ) {
+               if ( $opts->getValue( 'hidebots' ) == 1 ) {
                        $this->hideRights[] = 'bot';
                }
-               if ( $this->opts->getValue( 'hidesysops' ) == 1 ) {
+               if ( $opts->getValue( 'hidesysops' ) == 1 ) {
                        $this->hideGroups[] = 'sysop';
                }
        }
@@ -203,52 +192,4 @@ class ActiveUsersPager extends UsersPager {
                return Html::rawElement( 'li', [], "{$item} [{$count}]{$blocked}" );
        }
 
-       function getPageHeader() {
-               $self = $this->getTitle();
-               $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : '';
-
-               # Form tag
-               $out = Xml::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] );
-               $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n";
-               $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
-
-               # Username field (with autocompletion support)
-               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
-               $out .= Xml::inputLabel(
-                               $this->msg( 'activeusers-from' )->text(),
-                               'username',
-                               'offset',
-                               20,
-                               $this->requestedUser,
-                               [
-                                       'class' => 'mw-ui-input-inline mw-autocomplete-user',
-                                       'tabindex' => 1,
-                               ] + (
-                                       // Set autofocus on blank input
-                               $this->requestedUser === '' ? [ 'autofocus' => '' ] : []
-                               )
-                       ) . '<br />';
-
-               $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
-                       'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), [ 'tabindex' => 2 ] );
-
-               $out .= Xml::checkLabel(
-                               $this->msg( 'activeusers-hidesysops' )->text(),
-                               'hidesysops',
-                               'hidesysops',
-                               $this->opts->getValue( 'hidesysops' ),
-                               [ 'tabindex' => 3 ]
-                       ) . '<br />';
-
-               # Submit button and form bottom
-               $out .= Xml::submitButton(
-                               $this->msg( 'activeusers-submit' )->text(),
-                               [ 'tabindex' => 4 ]
-                       ) . "\n";
-               $out .= Xml::closeElement( 'fieldset' );
-               $out .= Xml::closeElement( 'form' );
-
-               return $out;
-       }
-
 }
index 44d2b21..3d7d71c 100644 (file)
@@ -475,7 +475,7 @@ class User implements IDBAccessObject {
         */
        protected static function getInProcessCache() {
                if ( !self::$inProcessCache ) {
-                       self::$inProcessCache = new HashBagOStuff( ['maxKeys' => 10] );
+                       self::$inProcessCache = new HashBagOStuff( [ 'maxKeys' => 10 ] );
                }
                return self::$inProcessCache;
        }
@@ -2489,9 +2489,9 @@ class User implements IDBAccessObject {
                        throw new PasswordError( wfMessage( 'externaldberror' )->text() );
                }
 
-               $this->setToken();
                $this->setOption( 'watchlisttoken', false );
                $this->setPasswordInternal( $str );
+               SessionManager::singleton()->invalidateSessionsForUser( $this );
 
                return true;
        }
@@ -2508,9 +2508,9 @@ class User implements IDBAccessObject {
                global $wgAuth;
 
                if ( $wgAuth->allowSetLocalPassword() ) {
-                       $this->setToken();
                        $this->setOption( 'watchlisttoken', false );
                        $this->setPasswordInternal( $str );
+                       SessionManager::singleton()->invalidateSessionsForUser( $this );
                }
        }
 
@@ -3398,6 +3398,19 @@ class User implements IDBAccessObject {
                return !$this->isLoggedIn();
        }
 
+       /**
+        * @return bool Whether this user is flagged as being a bot role account
+        * @since 1.28
+        */
+       public function isBot() {
+               $isBot = false;
+               if ( !Hooks::run( "UserIsBot", [ $this, &$isBot ] ) ) {
+                       return $isBot;
+               }
+
+               return ( $isBot || in_array( 'bot', $this->getGroups() ) );
+       }
+
        /**
         * Check if user is allowed to access a feature / make an action
         *
old mode 100644 (file)
new mode 100755 (executable)
index 5ff411d..6baaff0
@@ -16,6 +16,7 @@ class SearchInputWidget extends TitleInputWidget {
        protected $performSearchOnClick = true;
        protected $validateTitle = false;
        protected $highlightFirst = false;
+       protected $dataLocation = 'header';
 
        /**
         * @param array $config Configuration options
@@ -24,6 +25,8 @@ class SearchInputWidget extends TitleInputWidget {
         * @param boolean|null $config['performSearchOnClick'] If true, the script will start a search
         *  whenever a user hits a suggestion. If false, the text of the suggestion is inserted into the
         *  text field only (default: true)
+        * @param string $config['dataLocation'] Where the search input field will be
+        *  used (header or content, default: header)
         */
        public function __construct( array $config = [] ) {
                $config = array_merge( [
@@ -31,7 +34,6 @@ class SearchInputWidget extends TitleInputWidget {
                        'maxLength' => null,
                        'type' => 'search',
                        'icon' => 'search',
-                       'dataLocation' => 'content',
                ], $config );
 
                // Parent constructor
index 29de535..ab9421f 100644 (file)
        "watchlistedit-raw-done": "قائمة مراقبتك تم تحديثها.",
        "watchlistedit-raw-added": "تمت إضافة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
        "watchlistedit-raw-removed": "تمت إزالة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
-       "watchlistedit-clear-title": "قائمة مراقبة ممسوحة",
+       "watchlistedit-clear-title": "امسح قائمة المراقبة",
        "watchlistedit-clear-legend": "امسح قائمة المراقبة",
        "watchlistedit-clear-explain": "ستحذف جميع الصفحات من قائمة مراقبتك",
        "watchlistedit-clear-titles": "العناوين:",
index cf47096..10feac9 100644 (file)
@@ -29,6 +29,7 @@
        "tog-watchdefault": "Amestar les páxines y ficheros qu'edite a la mio llista de siguimientu",
        "tog-watchmoves": "Amestar les páxines y ficheros que tresllade a la mio llista de siguimientu",
        "tog-watchdeletion": "Amestar les páxines y ficheros que desanicie a la mio llista de siguimientu",
+       "tog-watchuploads": "Amestar los nuevos ficheros que xuba a la mio llista de siguimientu",
        "tog-watchrollback": "Amestar les páxines onde fici una reversión a la mio llista de siguimientu",
        "tog-minordefault": "Marcar toles ediciones como menores de mou predetermináu",
        "tog-previewontop": "Amosar previsualización enantes del cuadru d'edición",
@@ -53,7 +54,7 @@
        "tog-ccmeonemails": "Mandame copies de los correos qu'unvio a otros usuarios",
        "tog-diffonly": "Nun amosar el conteníu de la páxina embaxo de les diferencies",
        "tog-showhiddencats": "Amosar categoríes anubríes",
-       "tog-norollbackdiff": "Desaniciar les diferencies depués de facer una restauración",
+       "tog-norollbackdiff": "Nun amosar diferencies depués de facer una restauración",
        "tog-useeditwarning": "Avisame cuando salga d'una páxina d'edición con cambios ensin guardar",
        "tog-prefershttps": "Usar siempre una conexón segura en aniciando sesión",
        "underline-always": "Siempre",
        "minoredit": "Esta ye una edición menor",
        "watchthis": "Vixilar esta páxina",
        "savearticle": "Guardar la páxina",
+       "publishpage": "Publicar la páxina",
        "preview": "Vista previa",
        "showpreview": "Amosar previsualización",
        "showdiff": "Amosar cambeos",
        "recentchangeslinked-page": "Nome de la páxina:",
        "recentchangeslinked-to": "Amosar los cambios de les páxines qu'enllacen en cuenta de los de la páxina dada",
        "recentchanges-page-added-to-category": "[[:$1]] amestóse a la categoría",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] y [[Special:WhatLinksHere/$1|{{PLURAL:$2|otra páxina|otres $2 páxines}}]] amestaes a la categoría",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] amestada a la categoría [[Special:WhatLinksHere/$1|esta páxina ta incluyida dientro d'otres páxines]]",
        "recentchanges-page-removed-from-category": "[[:$1]] desanicióse de la categoría",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] y [[Special:WhatLinksHere/$1|{{PLURAL:$2|otra páxina|otres $2 páxines}}]] desaniciaes de la categoría",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] desaniciada de la categoría [[Special:WhatLinksHere/$1|esta páxina ta incluyida dientro d'otres páxines]]",
        "autochange-username": "Cambiu automáticu de MediaWiki",
        "upload": "Xubir ficheru",
        "uploadbtn": "Xubir ficheru",
        "tooltip-ca-nstab-category": "Ver la páxina de categoría",
        "tooltip-minoredit": "Marcar como una edición menor",
        "tooltip-save": "Guardar los cambios",
+       "tooltip-publish": "Publicar los cambeos",
        "tooltip-preview": "Vista previa de los cambios, ¡usa esto enantes de guardar!",
        "tooltip-diff": "Amuesa los cambios que fixisti nel testu.",
        "tooltip-compareselectedversions": "Ver les diferencies ente les dos revisiones seleicionaes d'esta páxina.",
        "confirmemail_body_set": "Dalguién, vusté posiblemente, dende la IP $1, configuró el corréu de\nla cuenta \"$2\" a esta direición de corréu en {{SITENAME}}.\n\nPa confirmar qu'esta cuenta ye suya daveres y activar les funciones\nde corréu en {{SITENAME}}, abra esti enllaz nel navegador:\n\n$3\n\nSi la cuenta *nun* ye de so, siga esti enllaz pa encaboxar\nla confirmación de les señes de corréu electrónicu:\n\n$5\n\nEsti códigu de confirmación caducará el $4.",
        "confirmemail_invalidated": "Confirmación de direición de corréu electrónicu encaboxada",
        "invalidateemail": "Encaboxar confirmación de corréu electrónicu",
+       "notificationemail_subject_changed": "Camudó la dirección de corréu electrónicu rexistrada de {{SITENAME}}",
+       "notificationemail_subject_removed": "Desanicióse la dirección de corréu electrónicu rexistrada de {{SITENAME}}",
        "scarytranscludedisabled": "[La tresclusión interwiki ta desactivada]",
        "scarytranscludefailed": "[Falló la recuperación de la plantía pa $1]",
        "scarytranscludefailed-httpstatus": "[Falló la recuperación de la plantía pa $1: HTTP $2]",
index 0a74b0a..ad623cb 100644 (file)
@@ -18,7 +18,8 @@
                        "Sadiqr",
                        "Mjbmr",
                        "Alp Er Tunqa",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Ilğım"
                ]
        },
        "tog-underline": "باغلانتی‌لارین آلتینی خطله:",
        "tog-hidepatrolled": "سوْن دییشیکلیکلرده نظارتلنمیش دَییشیکلیکلری گیزلت",
        "tog-newpageshidepatrolled": "یوْخلانمیش صفحه‌لری یئنی صفحه‌لر لیستیندن گیزلت",
        "tog-extendwatchlist": "ایزله‌دیک‌لری، یالنیز یئنی‌لر اۆچون یوْخ، بۆتون دییشیک‌لیک‌لری گؤرستمک اۆچون، گنیشلندیر.",
-       "tog-usenewrc": "دَییشیک‌لیک‌لری سوْن دَییشیک‌لیک‌لر صفحه‌سینده ایزله‌دیک‌لر صفحه‌سینده گروپ‌لا (جاوااسکریپت گرک‌دیر)",
+       "tog-usenewrc": "دَییشیک‌لیک‌لری سوْن دَییشیک‌لیک‌لر صفحه‌سینده ایزله‌دیک‌لر صفحه‌سینده قروپ‌لا (جاوااسکریپت گرک‌دیر)",
        "tog-numberheadings": "باشلیق‌لاری اوْتوماتیک نۆمره‌له",
-       "tog-showtoolbar": "دَییشدیرمک آراج-چۇبوغونو گؤرست",
+       "tog-showtoolbar": "دَییشدیرمه آراج-چۇبوغونو گؤستر",
        "tog-editondblclick": "صفحه‌‌لری ایکی کیلیک‌ده دَییشدیر",
        "tog-editsectiononrightclick": "بؤلوم‌لرین دَییشدیرمه‌سینی، باشلیق‌لارین اۆستونده ساغ‌کلیک ائتمک‌‌له ایجازه وئر",
        "tog-watchcreations": "ياراتدیغیم صفحه‌‌لری و يۆکله‌دیگیم فايل‌لاری، ایزله‌دیک‌لریمه آرتیر",
        "tog-watchdefault": "دَییشدیردیگیم صفحه‌‌لری و فايل‌لاری، ایزله‌دیک‌لریمه آرتیر",
        "tog-watchmoves": "داشیدیغیم صفحه‌‌لری و فايللاری ایزله‌دیکلریمه آرتیر",
        "tog-watchdeletion": "سیلدیگیم صفحه‌‌لری و فايللاری ایزله‌دیکلریمه آرتیر",
-       "tog-watchrollback": "قایتاریلمیش صفحه لری ایزلدیکلریمه آرتیر",
-       "tog-minordefault": "دفالت اوْلاراق، بۆتون دَییشدیر‌مه‌لری کیچیک کیمی علامتله",
-       "tog-previewontop": "اؤÙ\86â\80\8cگؤسترÛ\8cØ´Û\8cØ\8c Ù\8aازÙ\85اÙ\82 Ù\82Û\87تÙ\88سÙ\88Ù\86داÙ\86 Ù\82اباÙ\82 Ú¯Ø¤Ø±Ø³Øª",
-       "tog-previewonfirst": "اÛ\8cÙ\84Ú© Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87â\80\8cدÙ\87 Ø§Ø¤Ù\86â\80\8cگؤسترÛ\8cØ´Û\8c Ú¯Ø¤Ø±Ø³Øª",
-       "tog-enotifwatchlistpages": "اÛ\8cزÙ\84Ù\87â\80\8cدÛ\8cÚ©Ù\84رÛ\8cÙ\85â\80\8cدÙ\87 Ø§Ù\88Ù\84اÙ\86 Ø¨Û\8cر ØµÙ\81Ø­Ù\87 Û\8cا Ù\81اÛ\8cÙ\84 Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÛ\8cÙ\84Ù\86â\80\8cدÙ\87Ø\8c Ù\85Ù\86Ù\87 Ø§Û\8cÙ\85یل گؤندر",
-       "tog-enotifusertalkpages": "دانیشیق صحیفه‌‌م دَییشدیریلنده منه ایمیل گؤندر",
-       "tog-enotifminoredits": "صحیفه‌لرده و فایل‌لاردا کیچیک دَییشیکلیکلر اولسا دا منه ایمیل گؤندر",
-       "tog-enotifrevealaddr": "منیم ایمیل آدرسیمی بیلدیریش ایمیل‌لرینده گؤستر",
-       "tog-shownumberswatching": "گؤزله‌ین ایستیفاده‌چیلرین سایینی گؤستر",
+       "tog-watchrollback": "قایتاریلمیش صفحه‌لری ایزله‌دیکلریمه آرتیر",
+       "tog-minordefault": "دیفالت اوْلاراق، بۆتون دَییشدیر‌مه‌لری کیچیک کیمی علامتله",
+       "tog-previewontop": "اؤÙ\86â\80\8cگؤسترÛ\8cØ´Û\8cØ\8c Ù\8aازÙ\85اÙ\82 Ù\82Û\87تÙ\88سÙ\88Ù\86داÙ\86 Ù\82اباÙ\82 Ú¯Ø¤Ø³ØªØ±",
+       "tog-previewonfirst": "اÛ\8cÙ\84Ú© Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87â\80\8cدÙ\87 Ø§Ø¤Ù\86â\80\8cگؤسترÛ\8cØ´Û\8c Ú¯Ø¤Ø³ØªØ±",
+       "tog-enotifwatchlistpages": "اÛ\8cزÙ\84Ù\87â\80\8cدÛ\8cÚ©Ù\84رÛ\8cÙ\85â\80\8cدÙ\87 Ø§Ù\88Ù\92Ù\84اÙ\86 Ø¨Û\8cر ØµÙ\81Ø­Ù\87 Ù\88 Û\8cا Ù\81اÛ\8cÙ\84 Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÛ\8cÙ\84Ù\86دÙ\87Ø\8c Ù\85Ù\86Ù\87 Ø§Û\8cÙ\85ئیل گؤندر",
+       "tog-enotifusertalkpages": "دانیشیق صفحه‌‌م دَییشدیریلنده منه ایمئیل گؤندر",
+       "tog-enotifminoredits": "صفحه‌لرده و فایل‌لاردا کیچیک دَییشیکلیکلر اوْلسا دا منه ایمئیل گؤندر",
+       "tog-enotifrevealaddr": "منیم ایمئیل آدرسیمی بیلدیریش ایمئیل‌لرینده گؤستر",
+       "tog-shownumberswatching": "گؤزله‌ین ایستیفاده‌چیلرین سایی‌سینی گؤستر",
        "tog-oldsig": "ایندی‌کی ایمضا:",
        "tog-fancysig": "ایمضانی ویکی-متن کیمی نظره آل (اوْتوماتیک باغلانتی‌سیز)",
        "tog-uselivepreview": "دیری اؤن‌گؤستریش ایشلت (تِست مرحله‌سینده)",
-       "tog-forceeditsummary": "دَییشیکلیک قیساسی بوْش قالاندا منه بیلیندیر",
+       "tog-forceeditsummary": "دَییشیکلیک قیساسی بوْش قالمیشسا منه بیلیندیر",
        "tog-watchlisthideown": "منیم دَییشیک‌لیک‌لریمی ایزله‌دیک‌لردن گیزلت",
        "tog-watchlisthidebots": "بوْت دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
        "tog-watchlisthideminor": "کیچیک دَییشیک‌لیک‌لری ایزله‌دیک‌لردن گیزلت",
-       "tog-watchlisthideliu": "گیرمیش ایشلدن‌لرین دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
+       "tog-watchlisthideliu": "گیریش ائتمیش ایشلدن‌لرین دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
        "tog-watchlisthideanons": "تانینمامیش ایشلدن‌لرین دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
        "tog-watchlisthidepatrolled": "نظارتلنمیش دَییشیکلیکلری گؤزله‌دیکلردن گیزلت",
-       "tog-ccmeonemails": "باشقا ایشلدن‌لره گؤندردیگیم ایمیل‌لرین کوْپی‌لرینی منه گؤندر",
-       "tog-diffonly": "مقایسه‌لر آلیتندا صفحه‌لرین ایچینده‌کی‌لرینی گؤرستمه",
-       "tog-showhiddencats": "Ú¯Û\8cزÙ\84Û\8c Ø¨Ø¤Ù\84Ù\85Ù\87â\80\8cÙ\84رÛ\8c Ú¯Ø¤Ø±Ø³Øª",
-       "tog-norollbackdiff": "Ù\82اÛ\8cتاراÙ\86داÙ\86 Ø³Ù\88Ù\92Ù\86را Ù\85Ù\82اÛ\8cسÙ\87 Ú¯Ø¤Ø±Ø³Øªمه",
-       "tog-useeditwarning": "دَییشدیرمه صفحه‌سیندن چیخاندا، ذخیره اولونمامیش دَییشدیرمه اوْلسا، منه تذکر وئر",
-       "tog-prefershttps": "هر زامان گیریش ائتمگه امن باغلانتی ایشلت",
+       "tog-ccmeonemails": "باشقا ایشلدن‌لره گؤندردیگیم ایمئیل‌لرین کوْپی‌لرینی منه گؤندر",
+       "tog-diffonly": "مۆقایسه‌لر آلتیندا صفحه‌نین ایچینده‌کیلرینی گؤسترمه",
+       "tog-showhiddencats": "Ú¯Û\8cزÙ\84Û\8c Ø¨Ø¤Ù\84Ù\85Ù\87â\80\8cÙ\84رÛ\8c Ú¯Ø¤Ø³ØªØ±",
+       "tog-norollbackdiff": "Ù\82اÛ\8cتاراÙ\86داÙ\86 Ø³Ù\88Ù\92Ù\86را Ù\81رÙ\82Û\8c Ú¯Ø¤Ø³ØªØ±مه",
+       "tog-useeditwarning": "دَییشدیرمه صفحه‌سیندن چیخاندا، قئید اوْلونمامیش دَییشدیرمه اوْلسا، منه بیلدیر",
+       "tog-prefershttps": "هر زامان گیریش ائتمه‌یه امنیتلی باغلانتی ایشلت",
        "underline-always": "هر زامان",
        "underline-never": "هئچ واخت",
        "underline-default": "وارساییلان قابیق یا براوزِر",
-       "editfont-style": "دَییشدیرمه قۇتوسونون فوْنتی:",
+       "editfont-style": "دَییشدیرمه قۇتوسونون فوْنتو:",
        "editfont-default": "براوزِر وارساییلانی",
        "editfont-monospace": "ثابیت آرالی فوْنت",
        "editfont-sansserif": "بۇجاق‌سیز فوْنت",
        "fri": "آینی‌گون (جۆمعه)",
        "sat": "يئل‌گونو (شنبه)",
        "january": "ژانویه",
-       "february": "فئوریه",
+       "february": "فوریه",
        "march": "مارس",
        "april": "آوریل",
        "may_long": "مئی",
        "june": "ژوئن",
-       "july": "ژولای",
+       "july": "جولای",
        "august": "آقوست",
        "september": "سپتامبر",
        "october": "اوْکتوبر",
        "november": "نوْوامبر",
-       "december": "دئساÙ\85بر",
+       "december": "دسامبر",
        "january-gen": "ژانویه",
-       "february-gen": "فئوریه",
+       "february-gen": "فوریه",
        "march-gen": "مارس",
        "april-gen": "آوریل",
        "may-gen": "مئی",
        "july-gen": "جولای",
        "august-gen": "آقوست",
        "september-gen": "سپتامبر",
-       "october-gen": "اوکتوبر",
-       "november-gen": "نووامبر",
-       "december-gen": "دئساÙ\85بر",
+       "october-gen": "اوْکتوبر",
+       "november-gen": "Ù\86Ù\88Ù\92Ù\88اÙ\85بر",
+       "december-gen": "دسامبر",
        "jan": "ژانویه",
-       "feb": "فئوریه",
+       "feb": "فوریه",
        "mar": "مارس",
        "apr": "آوریل",
        "may": "مئی",
        "jun": "ژوئن",
-       "jul": "ژولای",
+       "jul": "جولای",
        "aug": "آقوست",
        "sep": "سپتامبر",
        "oct": "اوْکتوبر",
        "nov": "نوْوامبر",
-       "dec": "دئساÙ\85بر",
+       "dec": "دسامبر",
        "january-date": "ژانویه‌نین $1-ی",
-       "february-date": "فئوریه‌نین $1-ی",
+       "february-date": "فوریه‌نین $1-ی",
        "march-date": "مارسین $1-ی",
        "april-date": "آوریلین $1-ی",
        "may-date": "مئیین $1-ی",
        "june-date": "ژوئنین $1-ی",
-       "july-date": "ژولایین $1-ی",
+       "july-date": "جولایین $1-ی",
        "august-date": "آقوستون $1-ی",
-       "september-date": "سئپتامبرین $1-ی",
+       "september-date": "سپتامبرین $1-ی",
        "october-date": "اوْکتوبرون $1-ی",
        "november-date": "نوْوامبرین $1-ی",
-       "december-date": "دئساÙ\85برÛ\8cÙ\86 $1-Û\8c",
+       "december-date": "دسامبرین $1-ی",
        "pagecategories": "{{PLURAL:$1|بؤلمه|بؤلمه‌لر}}",
        "category_header": "«$1» بؤلمه‌سینده صفحه‌لر",
        "subcategories": "آلت‌بؤلمه‌لر",
-       "category-media-header": "«$1» بؤلمه‌سین‌ده مئدیا",
-       "category-empty": "<em>بÙ\88 Ø¨Ø¤Ù\84Ù\85Ù\87â\80\8cدÙ\87 Ø§Û\8cÙ\86دÛ\8c Ù\81اÛ\8cÙ\84 Û\8cا Ù\85ئدیا یوْخدور.</em>",
+       "category-media-header": "«$1» بؤلمه‌سینده مدیا",
+       "category-empty": "<em>اÛ\8cÙ\86دÛ\8c Ø¨Û\87 Ø¨Ø¤Ù\84Ù\85Ù\87â\80\8cدÙ\87 Ù\81اÛ\8cÙ\84 Ù\88 Û\8cا Ù\85دیا یوْخدور.</em>",
        "hidden-categories": "{{PLURAL:$1|گیزلی بؤلمه|گیزلی بؤلمه‌لر}}",
        "hidden-category-category": "گیزلی بؤلمه‌لر",
        "category-subcat-count": "{{PLURAL:$2|بۇ بؤلمه‌ده تکجه آشاغیداکی آلت‌بؤلمه واردیر.|بۇ بؤلمه‌ده، جمعی $2-دن، آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.}}",
        "viewhelppage": "یاردیم صحیفه‌سینه باخ",
        "categorypage": "بؤلمه صحیفه‌‌سینه باخ",
        "viewtalkpage": "دانیشیغا باخ",
-       "otherlanguages": "Ø¢Û\8cرÛ\8c دیل‌لرده",
+       "otherlanguages": "باشÙ\82ا دیل‌لرده",
        "redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
        "redirectpagesub": "یوْللاندیرما صفحه‌سی",
        "redirectto": "مسیزپرین دَییشیب:",
        "currentevents": "ایندیکی حادیثه‌لر",
        "currentevents-url": "Project:ایندیکی اولایلار",
        "disclaimers": "یالانلامالار",
-       "disclaimerpage": "Project:گنل یالانلاما",
+       "disclaimerpage": "Project:گئنل یالانلاما",
        "edithelp": "ديَیشتیرمک یاردیمی",
        "helppage-top-gethelp": "کؤمک",
        "mainpage": "آنا صفحه",
        "noemail": "«$1» ایستیفاده‌چی‌یه ایمیل آدرسی قئید اولماییب‌دیر.",
        "noemailcreate": "دوزگون بیر ایمیل آدرسی وئرمه‌لیسینیز",
        "passwordsent": "«$1»-نا قئید اولونان ایمیل آدرسینه، یئنی بیر رمز گؤندریلدی.\nاونا آلان‌دان سونرا یئنی‌دن گیرین.",
-       "blocked-mailpassword": "سیزین آی‌پی آدرسینیز دَییشیک وئرمه‌یه باغلانیب و سوءاستفاده قاباغی آلماق اوچون، رمزی یئنی‌دن اله گتیرمک ایمکانینا ایجازه‌نیز یوخدور.",
+       "blocked-mailpassword": "سیزین آی‌پی آدرسینیزین دییشدیرمه ائده بیلمه‌سی باغلانمیشدیر. سوءایستیفاده قارشی‌سینی آلماق اۆچون، رمزی یئنی‌دن اله گتیرمک ایمکانینا ایجازه‌نیز یوْخدور.",
        "eauthentsent": "سیزین سئچیلمیش ایمیل آدرسینه، دوغرولاماق اوچون بیر ایمیل گؤندریلدی.\nهر یئنی بیر ایمیل گؤندرمک‌دن اؤنجه، بو حسابین دوغرودان سیزین اولدوغونو گؤسترمک اوچون، او ایمیل‌ده‌کی ایشلری گؤرمه‌لیسینیز.",
        "throttled-mailpassword": "سون {{PLURAL:$1|ساعات|$1 ساعات}}‌دا سیزه بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.\nسوءاستفاده قاباغین آلماق اوچون، هر {{PLURAL:$1|ساعات|$1 ساعات}}‌دا یالنیز بیر رمز یئنیله‌مه ایمیلی گؤندریلر.",
        "mailerror": "ایمیل گؤندرمه خطاسی: $1",
        "createaccount-title": "{{SITENAME}} اوچون حساب یارادیلماسی",
        "createaccount-text": "بیر کس، سیزین ایمیل آدرسینیزه {{SITENAME}} ($4) سایتیندا «$2» آدی و «$3» رمزی ایله بیر حساب آچیب‌دیر. سیز گرک گیریش ائدیب و رمزینیزی ایندی دَییشدیره‌سیز.\n\nبو حساب یانلیش دوزلیب‌سه، بو مئساژا محل قویمایابیلرسیز.",
        "login-throttled": "سیزین چوخ گیریش چالیشماغینیز اولوب‌دور.\nلوطفاً یئنی‌دن چالیشماق‌دان اؤنجه بیر آز $1 دؤزون.",
-       "login-abort-generic": "سÛ\8cزÛ\8cÙ\86 Ú¯Û\8cرÛ\8cØ´Û\8cÙ\86Û\8cز Ø¨Ø§Ø´Ø§Ø±Û\8câ\80\8cسÛ\8cز Ø§Ù\88لدو - دایاندیریلدی",
+       "login-abort-generic": "سÛ\8cزÛ\8cÙ\86 Ú¯Û\8cرÛ\8cØ´Û\8cÙ\86Û\8cز Ø¨Ø§Ø¬Ø§Ø±Û\8câ\80\8cسÛ\8cز Ø§Ù\88Ù\92لدو - دایاندیریلدی",
        "login-migrated-generic": "ایستفادچی حسابینیز آختاریلمیش دیر و آدینیز داها بو ویکی ده یوخدور",
        "loginlanguagelabel": "دیل: $1",
        "suspicious-userlogout": "سیزین چیخیش ایستگینیز رد اولوندو. بو، براوزرین یا پروکسی-کَشلمه‌سینین دوزگون ایشله‌مه‌مه‌سین‌دن قایناق‌لانیر.",
        "newpassword": "یئنی رمز",
        "retypenew": "یئنی رمزی یئنی‌دن یازین:",
        "resetpass_submit": "رمز یارادین و گیریش ائدین",
-       "changepassword-success": "رÙ\85زÛ\8cÙ\86Û\8cز Ø¨Ø§Ø´Ø§Ø±Û\8câ\80\8cÙ\84ا Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\84دÛ\8c!",
+       "changepassword-success": "رÙ\85زÛ\8cÙ\86Û\8cز Ø¨Ø§Ø¬Ø§Ø±Û\8cÛ\8cÙ\84ا Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\84دÛ\8c!",
        "changepassword-throttled": "سیزین چوخ گیریش چالیشماغینیز اولوب‌دور.\nلوطفاً یئنی‌دن چالیشماق‌دان اؤنجه $1 دؤزون.",
        "botpasswords-label-create": "یارات",
        "botpasswords-label-cancel": "وازگئچ",
        "resetpass-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
        "resetpass-submit-loggedin": "رمزی دَییشدیر",
        "resetpass-submit-cancel": "وازگئچ",
-       "resetpass-wrong-oldpass": "یانلیش گئچیجی یا ایندیکی رمز.\nاولا بیلر سیز باشاریلیق‌لا رمزینیزی دَییشمیسینیز یوخسا یئنی گئچرلی رمز ایسته‌میسینیز.",
+       "resetpass-wrong-oldpass": "یانلیش گئچیجی و یا ایندیکی رمز.\nسیز باجارییلا رمزینیزی دَییشدیریب یوخسا یئنی گئچرلی رمز ایسته‌میش اوْلدوغونوز مؤحتمل‌دیر.",
        "resetpass-recycled": "لوطفا گیریش رمزینیزی ایندیکی اولمایان بیر ایری گیریش رمزینه دَییشین",
        "resetpass-temp-emailed": "سیز بیر کدلانمیش موقت ایمیل له گیریش ائدیب سیز.\nگیریشینیزه سون وئرمک اوچون یئنی دن بیر گیریش رمزی وئرمه لی سیز:",
        "resetpass-temp-password": "گئچیجی رمز:",
        "passwordreset-emailtext-ip": "بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له)، {{SITENAME}} ($4) سایتینداکی حسابینیز اوچون رمزی یئنیله‌مک ایسته‌ییب‌دیر. آشاغیداکی ایستیفاده‌چی {{PLURAL:$3|حسابی|حسابلاری}} بو ایمیل ایله ایلگی‌لی‌دیرلر:\n\n$2\n\nبو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر گون|$5 گون}}‌ده {{PLURAL:$3|واختی|واختلاری}} قورتاراجاق‌دیر.\nسیز گرک ایندی سایتا گیریب و یئنی بیر رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.",
        "passwordreset-emailtext-user": "{{SITENAME}} سایتیندا، $1 ایستیفاده‌چی، سیزین اوردا ($4) حسابینیزین رمزینی یئنیله‌مک ایستگی وئریب‌دیر. آشاغیداکی {{PLURAL:$3|ایستیفاده‌چی|ایستیفاده‌چیلر}} بو ایمیل ایله ایلگیلیدیرلر:\n\n$2\n\nبو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر|$5گون}} سونرا واختلاری قورتاراجاق‌دیر. \nسیز گرک ایندی گیریب و بیر یئنی رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.",
        "passwordreset-emailelement": "ایشلدن آدی: \n$1\n\nگئچیجی رمز: \n$2",
-       "passwordreset-emailsentemail": "بÛ\8cر Ø±Ù\85ز Û\8cئÙ\86Û\8cÙ\84Ù\87â\80\8cÙ\85Ù\87 Ø§Û\8cÙ\85Û\8cÙ\84Û\8c Ú¯Ø¤Ù\86درÛ\8cÙ\84Û\8cبâ\80\8cدیر.",
+       "passwordreset-emailsentemail": "بÛ\87 Ø§Û\8cÙ\85ئÛ\8cÙ\84 Ø¢Ø¯Ø±Ø³Û\8c Ø­Ø³Ø§Ø¨Û\8cÙ\86Û\8cزا Ø«Ø¨Øª Ø§Ù\88Ù\92Ù\84Ù\88Ù\86Ù\85Ù\88شسا٬ Ø¨Û\8cر Ø±Ù\85ز Û\8cئÙ\86Û\8cÙ\84Ù\87â\80\8cÙ\85Ù\87 Ø§Û\8cÙ\85ئÛ\8cÙ\84Û\8c Ú¯Ø¤Ù\86درÛ\8cÙ\84Ù\87â\80\8cجکدیر.",
        "passwordreset-emailsent-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.",
        "passwordreset-emailerror-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی یارادیلیب‌دیر، اما {{GENDER:$2ایستیفاده‌چی}}‌یه گؤندرمگی باشاریلی اولمادی: $1",
        "changeemail": "ایمیل آدرسینی دَییشدیر یا سیل",
        "previewnote": "'''بونون ساده‌جه بیر سیناق گؤستریشی اولدوغونو نظرده آلین.'''\nسیزین دییشیکلرینیز هله قئید اولونماییب!",
        "continue-editing": "دَییشدیرمه یئرینه گئت",
        "previewconflict": "بو سیناق گؤستریشی‌دیر و یادداشدا ساخلایاجاغینیز تق‌دیرده متنین دییشدیر صحیفه‌سی‌نین یوخاری حیسه‌سینده نتیجه‌نین نئجه اولاجاغینی گؤستریر.",
-       "session_fail_preview": "'''اÙ\88زر Ø§Û\8cستÛ\8cÛ\8cرÛ\8cÚ©! Ø³Û\8cزÛ\8cÙ\86 Ø¯Û\8cÛ\8cشتÛ\8cرÛ\8cÙ\86Û\8cزâ\80\8c Ø³Ø§Ø®Ù\84اÙ\86Û\8cÙ\84Ù\85ادÛ\8c. Ù\84Ø·Ù\81اÙ\8b Ø¨Û\8cر Ø¯Ø§Ù\87ا ØªÚ©Ø±Ø§Ø± Ø§Ø¦Ø¯Û\8cÙ\86. Ù¾Ø±Ù\88بÙ\84ئÙ\85 Ø­Ù\84 Ø§Ù\88Ù\84Ù\88Ù\86Ù\85اسا Ø­Ø³Ø§Ø¨Û\8cÙ\86Û\8cزداÙ\86 [[Special:UserLogout|Ú\86Û\8cØ®Û\8cÙ\86]]  Ù\88 Û\8cئÙ\86Û\8câ\80\8cدÙ\86 Ø¯Ø§Ø®Û\8cÙ\84 Ø§Ù\88لون.'''",
+       "session_fail_preview": "'''عÛ\86ذر Ø§Û\8cستÙ\87â\80\8cÛ\8cÛ\8cرÛ\8cÚ©! Ø³Û\8cزÛ\8cÙ\86 Ø¯Û\8cÛ\8cشدÛ\8cرÙ\85Ù\87â\80\8cÙ\86Û\8cز Û\8cازدÛ\8cرÛ\8cÙ\84Ù\85ادÛ\8c. \nسÛ\8cستÙ\85دÙ\86 Ú\86Û\8cØ®Ù\85Û\8cØ´ Ø§Ù\88Ù\92Ù\84دÙ\88غÙ\88Ù\86Ù\88ز Ù\85ؤحتÙ\85Ù\84â\80\8cدÛ\8cر. Ù\84Û\86Ø·Ù\81اÙ\8b Ø³Û\8cستÙ\85Ù\87 Ú¯Û\8cرÙ\85Û\8cØ´ Ø§Ù\88Ù\92Ù\84دÙ\88غÙ\88Ù\86Ù\88زداÙ\86 Ø¢Ø±Ø®Ø§Û\8cÛ\8cÙ\86 Ø§Ù\88Ù\92Ù\84Ù\88ب Ø¨Û\8cر Ø¯Ø§Ù\87ا ØªÚ©Ø±Ø§Ø± Ø§Ø¦Ø¯Û\8cÙ\86. \nÙ\85Û\86Ø´Ú©Ù\88Ù\84 Ø­Ù\84 Ø§Ù\88Ù\92Ù\84Ù\88Ù\86Ù\85اسا Ø­Ø³Ø§Ø¨Û\8cÙ\86Û\8cزداÙ\86 [[Special:UserLogout|Ú\86Û\8cØ®Û\8cب]] Û\8cئÙ\86Û\8câ\80\8cدÙ\86 Ú¯Û\8cرÛ\8cØ´ Ø§Ø¦Ø¯Û\8cÙ\86Ù¬ Ø¨Ø±Ø§Ù\88زرÛ\8cÙ\86Û\8cزÛ\8cÙ\86 Ø¨Û\87 Ø³Ø§Û\8cتا Ú©Ù\88Ú©Û\8c Ù\88ئرÙ\85Ù\87 Ø§Û\8cجازÙ\87â\80\8cسÛ\8cÙ\86Û\8c Ù\88ئردÛ\8cÚ¯Û\8cÙ\86دÙ\86 Ø¯Ù\87 Ø¢Ø±Ø®Ø§Û\8cÛ\8cÙ\86 Ø§Ù\88Ù\92لون.'''",
        "session_fail_preview_html": "'''اوزر ایستییریک! داخیل وئری‌سی‌نین ایتمه‌سین‌دن گؤره تنظیملمه‌نیزی اعمال کئچیره بیلمیجیی.' '\n\n' چونکی {{SITENAME}} سایتیندا raw هتمل تأثیرین‌دیر،تا جاوااسکریپت هوجوم‌لارینا تدبیر اولا‌راق گیزلنمیش‌دیر.'\n\n' 'گر بو حاق‌لی بیر تنظیملمه گیریش میسئ، لطفاً یئنی‌دن جهد ائدین. اگر هله چالیشمازسا، [[Special:UserLogout|خارج شوید]] یئنی‌دن ایجلاس آچماغی یوخلایین.' '",
        "token_suffix_mismatch": "'' ' ديَیشیکلیگی‌نین گئری چئوریلدی، چونکی آلیجی‌نین تنزیمله‌مه کوتوجوغونداکی دورغو ایشاره‌لرینی پوزدو. \nديَیشیکلیگی‌نین، صحیفه‌‌ متنینده پوزولماغی اؤنله‌مک اوچون گئری چئوریلدی. \nاگر پروبلئملی بیر wئب-باسئد آنونیم پروکسی خیدمتی ایستیفاده بو حادثه‌‌ بضا رئاللاشا بیلر.'' '",
        "edit_form_incomplete": "'''دییشیک‌لیک فورماسی اوچون بعضی سئروئرلره ایشلمه‌دی؛ ائتدیگینیز دییشیک‌لیک‌لر بوزولمامیشتیر، نظردن کئچیریب یئنی‌دن سینایین.'",
        "uploadstash-summary": "بو صحیفه‌‌ يوکلنمیش(و يا يوکلنمکده دیر) آمما هله ویکیده نشر اولونمامیش فايللارا چاتماغی تعمین ائدر. بو فايللار يالنیز يوکله‌يه‌نی طرفیندن گؤروله بیلر.",
        "uploadstash-clear": "مووققتی فايللاری تمیزله",
        "uploadstash-nofiles": "سیزین هئچ آمبار اولموش فایلینیز یوخدور.",
-       "uploadstash-badtoken": "Ú\86اÙ\84Û\8cØ´Ù\85اÙ\86Û\8cÙ\86 Ø­Û\8cاتا Ú©Ø¦Ú\86Û\8cرÛ\8cÙ\84Ù\85Ù\87â\80\8cسÛ\8c Ø¨Ø§Ø´Ø§Ø±Û\8cسÛ\8cز Ø§Ù\88Ù\84دÙ\88Ø\8c Ø§Ø­ØªÛ\8cÙ\85اÙ\84Ù\84ا ØªÙ\86زیمله‌مه قايدالاری زامان آشیمینا معروض قالدی. يئنیدن چالیشین.",
+       "uploadstash-badtoken": "Ú\86اÙ\84Û\8cØ´Ù\85اÙ\86Û\8cÙ\86 Ø­Û\8cاتا Ú©Ø¦Ú\86Û\8cرÛ\8cÙ\84Ù\85Ù\87â\80\8cسÛ\8c Ø¨Ø§Ø´Ø§Ø±Û\8cسÛ\8cز Ø§Ù\88Ù\84دÙ\88Ø\8c Ø§Ø­ØªÛ\8cÙ\85اÙ\84Ù\84ا ØªÙ\86ظیمله‌مه قايدالاری زامان آشیمینا معروض قالدی. يئنیدن چالیشین.",
        "uploadstash-errclear": "فايللارین سیلینمه‌سی باشاریسیز اولدو.",
        "uploadstash-refresh": "فايل سیياهیسینی يئنیله",
        "invalid-chunk-offset": "اعتبارسیز یئربه‌یئر",
        "unblock": "ایستیفاده‌چی‌نین باغلانماسین گؤتور",
        "blockip": " {{GENDER:$1|ایشلدن}}ی باغلا",
        "blockip-legend": "ایستیفادچی نی باغلا",
-       "blockiptext": "آشاغی‌داکی فورمو ایستیفاده ائده‌رک مویین بیر ایپنین و یا قئیدیات‌دان کئچمیش ایستیفاده‌چی‌نین دییشیک‌لیک ائتمه‌سینی مانعه تؤره‌ده بیلرسینیز. بو یالنیز واندالیزمی قارشی‌سینی آلماق اوچون و [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اویغون اولا‌راق ائدیلمه‌لی. آشاغییا موتلق قاداغا ایله علاقه‌دار بیر شرح یازین. (نومونه:-بو-صحیفه‌لرده واندالیزم ائتمیش‌دیر).",
+       "blockiptext": "آشاغی‌داکی فورمو ایستیفاده ائده‌رک مۆعیّن بیر آی‌پی‌نین و یا قئیدیات‌دان کئچمیش ایستیفاده‌چی‌نین دییشیک‌لیک ائتمه‌سینی مانعه تؤره‌ده بیلرسینیز. بۇ یالنیز واندالیزمین قارشی‌سینی آلماق اۆچون و [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اۇیغون اوْلا‌راق ائدیلمه‌لی. آشاغی‌یا مۆطلق قاداغا ایله علاقه‌دار بیر شرح یازین. (اؤرنک:-بۇ-صفحه‌لرده واندالیزم ائتمیشدیر).",
        "ipaddressorusername": "آی-پی عونوانی و یا ایستیفاده‌چی آدی",
        "ipbexpiry": "بیتمه مدتی:",
        "ipbreason": "ندن:",
        "unblock-hideuser": "ایستیفاده‌چی آدی گیزلی اولدوغو اوچون، بی باغلامانی گؤتوره بیلمزسینیز.",
        "ipb_cant_unblock": "ختا: باغلاما آی دی سی $1 تاپیلمادی. باغلامانین گؤتورولمه‌سی مومکون‌دور.",
        "ipb_blocked_as_range": "خطا: $1 ای پی عنوانی بیرباشا مانعه و مانعه تؤرتمه آزالدیلماسینا یول وئریلمیر.\nآنجاق، بو عنوان $2 آرا‌لیغینین پارچاسی اولا‌راق مانعه تؤردیلمیش، دئکابر مانعه تؤرتمه‌سینی قال‌دیرا.",
-       "ip_range_invalid": "یانلیش ای پی",
+       "ip_range_invalid": "گئچرسیز آی‌پی آرالیغی.",
        "ip_range_toolarge": "/ $1 بلوک‌دان داها بؤیوک بازه باغلانمالارینا ایجازه وئریلمیر.",
        "proxyblocker": "پروکسی باغلییان",
        "proxyblockreason": "ای پی آدرئسینیز آچیق بیر پروکسی اولدوغو اوچون مانعه تؤردیلدی.\nخاهیش ائدیریک اینتئرنئت سئویش تعمین ایله یا دا تئکنیکی دستک ایله علاقه قورون و بو جدی تهلوکه‌سیزلیک پروبلئمین‌دن خبردار ائدین.",
        "tooltip-pt-preferences": "{{GENDER:|سیزین}} ترجیحلرینیز",
        "tooltip-pt-watchlist": "دییشمکلرینی ایزله‌دیگینیز صفحه‌لرین سیاهی‌سی",
        "tooltip-pt-mycontris": "{{GENDER:|سیزین}} چالیشمالارینیزین لیستی",
-       "tooltip-pt-login": "گیریش ائتمه‌یینیز توصیه اولونور؛ اما گرکلی دئییل",
+       "tooltip-pt-login": "گیریش ائتمه‌نیز تؤوصیه اوْلونور؛ آنجاق گرکلی دئییلدیر",
        "tooltip-pt-logout": "چیخیش",
-       "tooltip-pt-createaccount": "سیزدن دعوت اولونور ایشلدن حسابی آچیب و گیریش ائده‌سیز؛ آنجاق حساب یاراتماق ایستگه باغلی‌دیر",
+       "tooltip-pt-createaccount": "سیزی ایشلدن حسابی آچیب گیریش ائتمه‌یه چاغیریریق؛ آنجاق حساب یاراتماق ایستگینیزه باغلی‌دیر",
        "tooltip-ca-talk": "ایچینده‌کیلره گؤره دانیشیق",
        "tooltip-ca-edit": "بۇ صفحه‌‌نی دَییشدیر",
        "tooltip-ca-addsection": "یئنی بؤلوم یارات",
        "tooltip-ca-unwatch": "بو صفحه‌نی ایزله‌دیگینیز صفحه‌لردن قالدیرین",
        "tooltip-search": "{{SITENAME}}-دا آختار",
        "tooltip-search-go": "اولورسا بو آددا بیر صفحه‌یه گئت",
-       "tooltip-search-fulltext": "بو یازی اولان صفحه‌لری آختار",
+       "tooltip-search-fulltext": "بو یازینی صفحه‌لرده آختار",
        "tooltip-p-logo": "آنا صفحه‌یه باخ",
        "tooltip-n-mainpage": "آنا صفحه‌‌یه باخین",
        "tooltip-n-mainpage-description": "آنا صفحه‌یه باخ",
-       "tooltip-n-portal": "پروژه‌ یه گؤره، سیز نه ایش گوره بیلرسیز، هاردا نه‌لری تاپا بیلرسیز",
-       "tooltip-n-currentevents": "اÛ\8cÙ\86دÛ\8cÚ©Û\8c Ø§Ù\88Ù\84اÛ\8câ\80\8cÙ\84ارا Ø§Û\8cÙ\84Ú¯Û\8cÙ\84Û\8c Ø¨Û\8cÙ\84Ú¯Û\8câ\80\8cÙ\84ر ØªØ§Ù¾",
-       "tooltip-n-recentchanges": "بÙ\88 Ù\88Û\8cÚ©Û\8câ\80\8cدÙ\87 Ø³Ù\88Ù\86 Ø¯Ù\8eÛ\8cÛ\8cØ´Û\8cÚ©لرین لیستی",
+       "tooltip-n-portal": "پروژه‌‌یه گؤره، سیز نه ایش گؤره بیلرسینیز، هاردا نه‌لری تاپا بیلرسینیز",
+       "tooltip-n-currentevents": "اÛ\8cÙ\86دÛ\8cÚ©Û\8c Ø§Ù\88Ù\92Ù\84اÛ\8cÙ\84ارا Ø§Û\8cÙ\84Ú¯Û\8cÙ\84Û\8c Ø¨Û\8cÙ\84Ú¯Û\8cÙ\84ر ØªØ§Ù¾",
+       "tooltip-n-recentchanges": "بÙ\88 Ù\88Û\8cÚ©Û\8câ\80\8cدÙ\87 Ø³Ù\88Ù\92Ù\86 Ø¯Ù\8eÛ\8cÛ\8cØ´Û\8cÚ©â\80\8cÙ\84Û\8cÚ©â\80\8cلرین لیستی",
        "tooltip-n-randompage": "بیر تصادوفی صفحه گتیر",
        "tooltip-n-help": "آنلاماق یئری",
-       "tooltip-t-whatlinkshere": "بورایا باغلانان بوتون ویکی صفحه‌لرین لیستی",
-       "tooltip-t-recentchangeslinked": "بو صفحه‌دن باغلانان صفحه‌لرین سون دَییشیکلیک‌لری",
+       "tooltip-t-whatlinkshere": "بۇرا باغلانان بۆتون ویکی صفحه‌لرین لیستی",
+       "tooltip-t-recentchangeslinked": "بۇ صفحه اوْنلارا باغلانان صفحه‌لرین سوْن دَییشیکلیک‌لری",
        "tooltip-feed-rss": "بو صحیفه‌‌ اوچون آراس‌اس يايیمی",
        "tooltip-feed-atom": "بو صحیفه‌‌ اوچون آتوم يايیمی",
        "tooltip-t-contributions": "{{GENDER:$1|بۇ ایشلدنین}} وئردیگی دییشیکلر لیستی",
index 1adaea7..1cb4117 100644 (file)
        "parser-unstrip-loop-warning": "Ябылмаған pre табылды",
        "parser-unstrip-recursion-limit": "($1) рекурсия сиге үтеп кителгән",
        "converter-manual-rule-error": "Тел әйлендереү ҡағиҙәһендә хата табылды",
-       "undo-success": "Был үҙгәртеүҙе кире алып була. Зинһар, улар һеҙҙе ҡыҙыҡһындырған үҙгәртеүҙәр булыуынан шикләнмәҫ өсөн версияларҙы сағыштырыуҙы ҡарағыҙ һәм үҙгәртеүҙәрҙе ғәмәлғә керетер өсөн «Битте һаҡларға» төймәһенә баҫығыҙ.",
+       "undo-success": "Был үҙгәртеүҙе кире алып була. Үҙгәртеүҙәр нәҡ һеҙ теләгәнсә булһа, версияларҙы сағыштырып ҡарағыҙ, ғәмәлгә индерер өсөн, «Битте һаҡларға» төймәһенә баҫығыҙ.",
        "undo-failure": "Ара үҙгәртеүҙәр тура килмәү сәбәпле төҙәтеүҙе кире алып булмай.",
        "undo-norev": "Үҙгәртеүҙе кире алып булмай, сөнки юҡ йәки юйылған.",
        "undo-nochange": "Төҙәтеү кире ҡайтарылған.",
        "grant-blockusers": "Иҫәп яҙмаларын блоклау һәм блоклауҙы асыу",
        "grant-createaccount": "Иҫәп яҙмаһын булдырырға",
        "grant-createeditmovepage": "Биттәрҙе булдырыу,мөхәррирләү һәм исемен үҙгәртеү",
-       "grant-delete": "Журналдағы биттәрҙе юйыу, төҙәтеү",
+       "grant-delete": "Журналдағы биттәрҙе, яҙмаларҙы юйыу һәм төҙәтеү",
        "grant-editinterface": "MediaWiki исеме арауығында төҙәтеү һәм ҡулланыусы CSS/JavaScript",
        "grant-editmycssjs": "CSS/JavaScript ҡулланыусы кодын төҙәтеү",
        "grant-editmyoptions": "Һеҙҙең ҡулланыусы көйләүҙәрен мөхәррирләү",
        "metadata-help": "Файл, ғәҙәттә һанлы камералар йәки сканерҙар өҫтәгән мәғлүмәттәргә эйә. Әгәр файл яһалғандан һуң төҙәтелгән булһа, ҡайһы бер параметрҙар ағымдағы рәсем менән тап килмәҫкә мөмкин.",
        "metadata-expand": "Өҫтәмә мәғлүмәттәрҙе күрһәт",
        "metadata-collapse": "Өҫтәмә мәғлүмәттәрҙе йәшер",
-       "metadata-fields": "Был исемлектә һанап кителгән мета мәғлүмәт юлдары рәсем битендә күрһәтеләсәктәр, ҡалғандары иһә төрөлгән буласаҡ.\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",
+       "metadata-fields": "Был исемлектә һанап кителгән метамәғлүмәт юлдары рәсем битендә күрһәтеләсәк, ҡалғандары төрөләсәк.\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-bitspersample": "Төҫтәрҙең тәрәнлеге",
index 86fff0d..58ec3a8 100644 (file)
@@ -58,7 +58,7 @@
        "tog-ccmeonemails": "Адпраўляць мне копіі лістоў, якія я дасылаю іншым удзельнікам",
        "tog-diffonly": "Не паказваць зьмест старонкі пад параўнаньнем зьменаў",
        "tog-showhiddencats": "Паказваць схаваныя катэгорыі",
-       "tog-norollbackdiff": "Не паказваць зьмены пасьля выкарыстаньня функцыі адкату",
+       "tog-norollbackdiff": "Не паказваць зьмены пасьля выкананьня адкату",
        "tog-useeditwarning": "Папярэджваць мяне, калі я буду пакідаць старонку рэдагаваньня зь незахаванымі зьменамі",
        "tog-prefershttps": "Заўсёды карыстацца бясьпечным злучэньнем па ўваходзе ў сыстэму",
        "underline-always": "Заўсёды",
        "userpage-userdoesnotexist": "Рахунак удзельніка «<nowiki>$1</nowiki>» не зарэгістраваны. Калі ласка, удакладніце, ці жадаеце Вы стварыць/рэдагаваць гэтую старонку.",
        "userpage-userdoesnotexist-view": "Рахунак «$1» ня створаны.",
        "blocked-notice-logextract": "Гэты ўдзельнік у дадзены момант заблякаваны.\nАпошні запіс з журналу блякаваньняў пададзены ніжэй для даведкі:",
-       "clearyourcache": "'''Заўвага:''' Каб пабачыць зьмены пасьля захаваньня, Вам можа спатрэбіцца ачысьціць кэш Вашага браўзэра. \n* '''Firefox / Safari:''' Трымайце ''Shift'' і націсьніце ''Reload'', ці націсьніце ''Ctrl-F5'' ці ''Ctrl-R'' (''⌘-R'' на Mac)\n* '''Google Chrome:''' Націсьніце ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)\n* '''Internet Explorer:''' Трымайце ''Ctrl'' і націсьніце ''Refresh'', ці націсьніце ''Ctrl-F5''\n* '''Opera:''' Ачысьціце кэш праз ''Tools → Preferences''",
+       "clearyourcache": "<strong>Заўвага:</strong> каб пабачыць зьмены пасьля захаваньня, Вам можа спатрэбіцца ачысьціць кэш Вашага браўзэра. \n* <strong>Firefox / Safari:</strong> трымайце <em>Shift</em> і націсьніце <em>Reload</em>, ці націсьніце <em>Ctrl-F5</em> ці <em>Ctrl-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Google Chrome:</strong> націсьніце <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer:</strong> трымайце <em>Ctrl</em> і націсьніце <em>Refresh</em>, ці націсьніце <em>Ctrl-F5</em>\n* <strong>Opera:</strong> перайдзіце ў <em>Menu → Settings</em> (<em>Opera → Preferences</em> на Mac), а потым у <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Падказка:''' выкарыстоўвайце кнопку «{{int:showpreview}}», каб паспрабаваць новы код CSS перад тым як яго запісаць.",
        "userjsyoucanpreview": "'''Падказка:''' выкарыстоўвайце кнопку «{{int:showpreview}}», каб паспрабаваць новы код JavaScript перад тым, як яго запісаць.",
        "usercsspreview": "'''Памятайце, што гэта толькі папярэдні прагляд Вашага CSS. Ён яшчэ не запісаны!'''",
        "apisandbox-dynamic-parameters-add-placeholder": "Назва парамэтру",
        "apisandbox-dynamic-error-exists": "Парамэтар з назвай «$1» ужо існуе.",
        "apisandbox-deprecated-parameters": "Састарэлыя парамэтры",
+       "apisandbox-fetch-token": "Аўтазапаўненьне токену",
        "apisandbox-submit-invalid-fields-title": "Некаторыя палі няслушныя",
        "apisandbox-submit-invalid-fields-message": "Калі ласка, выпраўце пазначаныя палі і паспрабуйце яшчэ раз.",
        "apisandbox-results": "Вынікі",
        "apisandbox-results-error": "Адбылася памылка пры загрузцы адказу на API-запыт: $1.",
        "apisandbox-request-url-label": "URL-адрас запыту:",
        "apisandbox-request-time": "Час запыту: {{PLURAL:$1|$1 мс}}",
+       "apisandbox-results-fixtoken": "Выпраўце токен і паўтарыце адпраўку",
        "apisandbox-alert-page": "Палі на гэтай старонцы няслушныя.",
        "apisandbox-alert-field": "Значэньне гэтага поля зьяўляецца няслушным.",
        "booksources": "Крыніцы кніг",
index b443170..eb1e5ae 100644 (file)
        "protect-othertime": "Друг срок:",
        "protect-othertime-op": "друг срок",
        "protect-existing-expiry": "Оставащо време: $2, $3",
+       "protect-existing-expiry-infinity": "Existing expiration time: безсрочно",
        "protect-otherreason": "Друга/допълнителна причина:",
        "protect-otherreason-op": "Друга причина",
        "protect-dropdown": "* Стандартни причини за защита на страници\n** Чест обект на вандализъм\n** Чест обект на спам\n** Редакторска война\n** Страница, изискваща много сървърни ресурси",
        "delete_and_move_text": "== Наложително изтриване ==\n\nЦелевата страница „[[:$1]]“ вече съществува. Искате ли да я изтриете, за да освободите място за преместването?",
        "delete_and_move_confirm": "Да, искам да изтрия тази страница.",
        "delete_and_move_reason": "Изтрита, за да се освободи място за преместване от „[[$1]]“",
-       "selfmove": "Страницата не може да бъде преместена, тъй като целевото име съвпада с първоначалното й заглавие.",
+       "selfmove": "Страницата не може да бъде преместена, тъй като целевото име съвпада с първоначалното ѝ заглавие.",
        "immobile-source-namespace": "Не могат да се местят страници в именно пространство „$1“",
        "immobile-target-namespace": "Не е възможно преместването на страници в именното пространство „$1“",
        "immobile-target-namespace-iw": "Страницата не може да бъде преместена под заглавие, оформено като междууики препратка.",
index 41f4923..00e296a 100644 (file)
@@ -45,6 +45,7 @@
        "tog-watchdefault": "আমার সম্পাদিত পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক",
        "tog-watchmoves": "আমার স্থানান্তরিত পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক",
        "tog-watchdeletion": "আমার অপসারিত পাতা এবং ফাইলগুলো আমার নজর তালিকায় যোগ করা হোক",
+       "tog-watchuploads": "আমার নজরতালিকায় আমার আপলোড করা নতুন ফাইল যোগ কর",
        "tog-watchrollback": "আমার দ্বারা রোলব্যাক করা পাতা আমার নজরতালিকায় যোগ করা হোক",
        "tog-minordefault": "শুরুতেই সব সম্পাদনাকে অনুল্লেখ্য বলে চিহ্নিত করা হোক",
        "tog-previewontop": "সম্পাদনা বাক্সের আগে প্রাকদর্শন দেখানো হোক",
        "minoredit": "এটি একটি অনুল্লেখ্য সম্পাদনা",
        "watchthis": "এই পাতাটি নজরে রাখুন",
        "savearticle": "সংরক্ষণ",
+       "publishpage": "পাতা প্রকাশ করুন",
        "preview": "প্রাকদর্শন",
        "showpreview": "প্রাকদর্শন",
        "showdiff": "পরিবর্তনসমূহ",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" নামের কোন ব্যবহারকারী অ্যাকাউন্ট নিবন্ধিত হয়নি। অনুগ্রহ করে পরীক্ষা করে দেখুন আপনি এই পাতাটি সৃষ্টি/সম্পাদনা করতে চান কি না।",
        "userpage-userdoesnotexist-view": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
        "blocked-notice-logextract": "এই ব্যবহারকারী বর্তমানে ব্লক রয়েছে।\nরেফারেন্সের জন্য সাম্প্রতিক ব্লক লগ ভুক্তি নিচে দেওয়া হল:",
-       "clearyourcache": "<strong>লà¦\95à§\8dষà§\8dয à¦\95রà§\81ন:</strong> à¦¸à¦\82রà¦\95à§\8dষণà§\87র à¦ªà¦°, à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লà§\8b à¦¦à§\87à¦\96তà§\87 à¦\86পনাà¦\95à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cারà§\87র à¦\95à§\8dযাশà§\87 à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রার à¦ªà§\8dরয়à§\8bà¦\9cন à¦¹à¦¤à§\87 à¦ªà¦¾à¦°à§\87।\n* <strong>ফায়ারফà¦\95à§\8dস / à¦¸à¦¾à¦«à¦¾à¦°à¦¿:</strong> <em>Shift</em> à¦§à¦°à§\87 à¦°à¦¾à¦\96া à¦\85বসà§\8dথায়<em>পà§\81নà¦\83লà§\8bড à¦\95রà§\81ন</em>-à¦\8f à¦\95à§\8dলিà¦\95 à¦\95রà§\81ন, à¦\85থবা <em>Ctrl-F5</em> à¦¬à¦¾ <em>Ctrl-R</em> (মà§\8dযাà¦\95-à¦\8f <em>â\8c\98-R</em>) à¦\9aাপà§\81ন\n* <strong>à¦\97à§\81à¦\97ল à¦\95à§\8dরà§\8bম:</strong> <em>Ctrl-Shift-R</em> (মà§\8dযাà¦\95-à¦\8f <em>â\8c\98-Shift-R</em>) à¦\9aাপà§\81ন\n* <strong>à¦\87নà§\8dà¦\9fারনà§\87à¦\9f à¦\8fà¦\95à§\8dসপà§\8dলà§\8bরার:</strong> <em>Ctrl</em> à¦§à¦°à§\87 à¦°à¦¾à¦\96া à¦\85বসà§\8dথায় <em>Refresh</em>-à¦\8f à¦\95à§\8dলিà¦\95 à¦\95রà§\81ন, à¦\85থবা <em>Ctrl-F5</em> à¦\9aাপà§\81ন\n* <strong>à¦\85পà§\87রা:</strong> <em>সরà¦\9eà§\8dà¦\9cাম â\86\92 à¦ªà¦\9bনà§\8dদসমà§\82হ</em>-à¦\8f à¦\97িয়à§\87 à¦\95à§\8dযাশà§\87 à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রà§\87 à¦¨à¦¿à¦¨",
+       "clearyourcache": "<strong>লà¦\95à§\8dষà§\8dয à¦\95রà§\81ন:</strong> à¦¸à¦\82রà¦\95à§\8dষণà§\87র à¦ªà¦°, à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লà§\8b à¦¦à§\87à¦\96তà§\87 à¦\86পনাà¦\95à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cারà§\87র à¦\95à§\8dযাশà§\87 à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রার à¦ªà§\8dরয়à§\8bà¦\9cন à¦¹à¦¤à§\87 à¦ªà¦¾à¦°à§\87।\n* <strong>ফায়ারফà¦\95à§\8dস / à¦¸à¦¾à¦«à¦¾à¦°à¦¿:</strong> <em>Shift</em> à¦§à¦°à§\87 à¦°à¦¾à¦\96া à¦\85বসà§\8dথায়<em>পà§\81নà¦\83লà§\8bড à¦\95রà§\81ন</em>-à¦\8f à¦\95à§\8dলিà¦\95 à¦\95রà§\81ন, à¦\85থবা <em>Ctrl-F5</em> à¦¬à¦¾ <em>Ctrl-R</em> (মà§\8dযাà¦\95-à¦\8f <em>â\8c\98-R</em>) à¦\9aাপà§\81ন\n* <strong>à¦\97à§\81à¦\97ল à¦\95à§\8dরà§\8bম:</strong> <em>Ctrl-Shift-R</em> (মà§\8dযাà¦\95-à¦\8f <em>â\8c\98-Shift-R</em>) à¦\9aাপà§\81ন\n* <strong>à¦\87নà§\8dà¦\9fারনà§\87à¦\9f à¦\8fà¦\95à§\8dসপà§\8dলà§\8bরার:</strong> <em>Ctrl</em> à¦§à¦°à§\87 à¦°à¦¾à¦\96া à¦\85বসà§\8dথায় <em>Refresh</em>-à¦\8f à¦\95à§\8dলিà¦\95 à¦\95রà§\81ন, à¦\85থবা <em>Ctrl-F5</em> à¦\9aাপà§\81ন\n* <strong>à¦\85পà§\87রা:</strong> <em>মà§\87নà§\81 â\86\92 à¦¬à§\8dযবসà§\8dথাপনাসমà§\82হ</em>-à¦\8f à¦¯à¦¾à¦¨ (মà§\8dযাà¦\95à§\87 <em>à¦\85পà§\87রা â\86\92 à¦ªà¦\9bনà§\8dদসমà§\82হ</em>) à¦\8fবà¦\82 à¦\8fরপর <em>à¦\97à§\8bপনà§\80য়তা à¦\93 à¦¸à§\81রà¦\95à§\8dষা â\86\92 à¦¬à§\8dরাà¦\89à¦\9cিà¦\82-à¦\8fর à¦¤à¦¥à§\8dয à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রà§\81ন â\86\92 à¦\95à§\8dযাশà§\87 à¦\95রা à¦\9bবি à¦\93 à¦«à¦¾à¦\87লà¦\97à§\81লি</em>।",
        "usercssyoucanpreview": "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন CSS পরীক্ষা করুন।",
        "userjsyoucanpreview": "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন JavaScript পরীক্ষা করুন।",
        "usercsspreview": "'''মনে রাখবেন আপনি আপনার জন্য বরাদ্ধকৃত সিএসএস প্রাকদর্শন করছেন।\nএটা এখনও সংরক্ষণ করা হয়নি!'''",
        "continue-editing": "সম্পাদনা করুন",
        "previewconflict": "এই প্রাকদর্শনটি সম্পাদনা ক্ষেত্রের উপরের অংশটির টেক্সট সংরক্ষণ করলে যেরকম দেখাবে, তা দেখাচ্ছে।",
        "session_fail_preview": "দুঃখিত! সেশন ডাটা হারিয়ে যাওয়ার কারণে আপনার সম্পাদনাটি সংরক্ষণ করা সম্ভব হয়নি।\n\nআপনি সম্ভবত সংযোগ হারিয়েছন। <strong>দয়া করে যাচাই করুন যে আপনি এখনও প্রবেশরত রয়েছেন এবং আবার চেষ্টা করুন</strong>। যদি এটি এখনও কাজ না করে, তাহলে দয়া করে [[Special:UserLogout|অ্যাকাউন্ট থেকে প্রস্থান করুন]] এবং আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন এবং এবং পরীক্ষা করুন যে আপনার ব্রাউজার এই সাইটে কুকি ব্যবহারের অনুমতি দেয়।",
-       "session_fail_preview_html": "'''দুঃখিত! সেশন উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়া করতে পারিনি।'''\n\n''{{SITENAME}}-এ raw HTML সক্রিয় আছে বলে জাভাস্ক্রিপ্টভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি দেখানো হচ্ছে না।''\n\n'''যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে আবার চেষ্টা করুন। যদি তারপরেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে বেরিয়ে গিয়ে আবার প্রবেশ করে চেষ্টা করুন।'''",
+       "session_fail_preview_html": "দুঃখিত! সেশন উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়া করতে পারিনি।\n\n<em>{{SITENAME}}-এ raw HTML সক্রিয় আছে বলে জাভাস্ক্রিপ্ট ভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি দেখানো হচ্ছে না।</em>\n\n<strong>যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে আবার চেষ্টা করুন।</strong>\nযদি তারপরেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে [[Special:UserLogout|বেরিয়ে গিয়ে]] আবার প্রবেশ করুন, এবং পরীক্ষা করে দেখুন যে আপনার ব্রাউজারে এই সাইট থেকে কুকি অনুমতি দেয়।",
        "token_suffix_mismatch": "'''আপনার সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে, কারণ আপনার ক্লায়েন্ট প্রোগ্রামটি সম্পাদনা টেক্সটের বিরামচিহ্নগুলি গুলিয়ে ফেলেছে। পাতাটির টেক্সটে যাতে ক্ষতি না হয় সেজন্য সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে। আপনি কোন ত্রুটিপূর্ণ ওয়েব-ভিত্তিক বেনামী প্রক্সি সেবা ব্যবহার করলে এরকম হতে পারে।'''",
        "edit_form_incomplete": "'''আপনার সম্পাদনার কিছু অংশ সার্ভারে পৌছায় নি; আপনার সম্পাদনা সম্পূর্ণরুপে আছে কিনা নিশ্চিত হয়ে আবার চেষ্টা করুন'''",
        "editing": "সম্পাদনা করছেন: $1",
        "undo-summary-username-hidden": "একজন লুকানো ব্যবহারকারী $1 সংশোধন পুনরায় ফিরিয়ে এনেছেন",
        "cantcreateaccounttitle": "অ্যাকাউন্ট তৈরি করা যাবে না",
        "cantcreateaccount-text": "[[User:$3|$3]] এই আইপি ঠিকানা('''$1''') থেকে অ্যাকাউন্ট সৃষ্টিতে বাধা দিয়েছেন।\n\n$3-এর দেয়া কারণ হল ''$2''",
-       "cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানা <strong>$1</strong> ব্যাপ্তির মধ্য থেকে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানা (<strong>$4</strong>) রয়েছে। \n\n$3 কর্তৃক <em>$2</em> কারণ দেখানো হয়েছে।",
+       "cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানার ব্যাপ্তি <strong>$1</strong>-এর মধ্যে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানাও (<strong>$4</strong>) রয়েছে। \n\n$3 কর্তৃক <em>$2</em> কারণ দেখানো হয়েছে।",
        "viewpagelogs": "এই পাতার জন্য লগগুলো দেখুন",
        "nohistory": "এই পাতার কোন সম্পাদনার ইতিহাস নেই।",
        "currentrev": "সর্বশেষ সংস্করণ",
        "lockdbsuccesstext": "ডাটাবেজ বন্ধ করা হয়েছে\n<br />আপনার রক্ষণাবেক্ষণ সম্পন্ন হবার পর [[Special:UnlockDB|ডাটাবেজ খুলে দিতে]] ভুলবেন না।",
        "unlockdbsuccesstext": "ডাটাবেজ খুলে দেওয়া হয়েছে।",
        "lockfilenotwritable": "ডাটাবেজ বন্ধ করার ফাইলটি লিখনযোগ্য নয়। ডাটাবেজ বন্ধ করতে বা খুলতে চাইলে ফাইলটিকে ওয়েব সার্ভার কর্তৃক লিখনযোগ্য হতে হবে।",
+       "databaselocked": "ডাটাবেসটি ইতিমধ্যেই তালাবদ্ধ।",
        "databasenotlocked": "ডাটাবেজ বন্ধ নয়।",
        "lockedbyandtime": "({{GENDER:$1|$1}} $2 এর $3 সময়ে)",
        "move-page": "$1 স্থানান্তর",
        "tooltip-ca-nstab-category": "বিষয়শ্রেণী পাতাটি দেখুন",
        "tooltip-minoredit": "এটিকে অনুল্লেখ্য সম্পাদনা হিসেবে চিহ্নিত করা হোক",
        "tooltip-save": "আপনার পরিবর্তনগুলি সংরক্ষিত হোক",
+       "tooltip-publish": "আপনার পরিবর্তন প্রকাশ করুন",
        "tooltip-preview": "অনুগ্রহ করে সংরক্ষণের আগে আপনার পরিবর্তনগুলি প্রাকদর্শন করুন!",
        "tooltip-diff": "আপনি টেক্সটে কী কী পরিবর্তন করেছেন, তা দেখানো হোক।",
        "tooltip-compareselectedversions": "এই পাতার দুইটি নির্বাচিত সংস্করণের মধ্যে তুলনা দেখুন।",
        "watchlistedit-raw-done": "আপনার নজর তালিকা হালনাগাদ করা হয়েছে।",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 শিরোনাম|$1 শিরোনামসমূহ}} যোগ করা হয়েছে:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 শিরোনাম|$1 শিরোনামসমূহ}} মুছে ফেলা হয়েছে:",
-       "watchlistedit-clear-title": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦¸à§\8dà¦\95ার à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87",
+       "watchlistedit-clear-title": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রà§\81ন",
        "watchlistedit-clear-legend": "নজরতালিকা পরিস্কার",
        "watchlistedit-clear-explain": "সকল শিরোনামসমূহ আপনার নজরতালিকা থেকে সরিয়ে নেয়া হয়েছে।",
        "watchlistedit-clear-titles": "শিরোনামসমূহ:",
        "logentry-protect-protect-cascade": "$1 $3 {{GENDER:$2|সুরক্ষিত করেছেন}} $4 [প্রপাতাকার]",
        "logentry-protect-modify": "$1 $3-এর জন্য সুরক্ষা স্তর {{GENDER:$2|পরিবর্তন করেছেন}} $4",
        "logentry-protect-modify-cascade": "$1 $3-এর জন্য সুরক্ষা স্তর {{GENDER:$2|পরিবর্তন করেছেন}} $4 [প্রপাতাকার]",
-       "logentry-rights-rights": "$1 ব্যবহারকারী, $3 এর দলগত সদস্যপদ $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন",
+       "logentry-rights-rights": "$1 ব্যবহারকারী, {{GENDER:$6|$3}}-এর দলগত সদস্যপদ $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন",
        "logentry-rights-rights-legacy": "$1 দলের সদস্যপদ পরিবর্তন করেছেন {{GENDER:$2|changed}} এর জন্য $3",
        "logentry-rights-autopromote": "$1 স্বয়ংক্রিয়ভাবে $4 থেকে $5-এ {{GENDER:$2|উন্নীত}} হয়েছেন",
        "logentry-upload-upload": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
        "randomrootpage": "অজানা মূল পাতা",
        "log-action-filter-block": "বাধাদানের ধরন:",
        "log-action-filter-delete": "অপসারণের ধরন:",
+       "log-action-filter-import": "আমদানির ধরন:",
        "log-action-filter-patrol": "টহলের ধরন:",
        "log-action-filter-protect": "সুরক্ষার ধরন:",
        "log-action-filter-upload": "আপলোডের ধরন:",
        "log-action-filter-protect-protect": "সুরক্ষা",
        "log-action-filter-protect-modify": "সুরক্ষা পরিমার্জন",
        "log-action-filter-protect-unprotect": "অসুরক্ষা",
+       "log-action-filter-rights-autopromote": "স্বয়ংক্রিয় পরিবর্তন",
        "log-action-filter-upload-upload": "নতুন আপলোড",
        "log-action-filter-upload-overwrite": "পুনঃআপলোড"
 }
index 3fbd79e..4a459fa 100644 (file)
@@ -24,6 +24,7 @@
        "tog-hideminor": "Kuzhat ar c'hemmoù nevez dister",
        "tog-hidepatrolled": "Kuzhat ar c'hemmoù evezhiet e-touez ar c'hemmoù diwezhañ",
        "tog-newpageshidepatrolled": "Kuzhat ar pajennoù evezhiet diouzh roll ar pajennoù nevez",
+       "tog-hidecategorization": "Kuzhat rummatadur ar pajennoù",
        "tog-extendwatchlist": "Astenn ar roll evezhiañ a-benn diskouez an holl gemmoù ha neket ar re ziwezhañ hepken.",
        "tog-usenewrc": "Diskouez ar c'hemmoù nevez en ur feson kempennoc'h",
        "tog-numberheadings": "Niverenniñ emgefre an titloù",
        "rows": "Linennoù :",
        "columns": "Bannoù",
        "searchresultshead": "Klask",
-       "stub-threshold": "Bevenn uhelañ evit al <a href=\"#\" class=\"stub\">liammoù war-du an danvez pennadoù</a> (okted) :",
+       "stub-threshold": "Bevenn uhelañ evit al liammoù war-du an danvez pennadoù ($1) :",
        "stub-threshold-disabled": "Diweredekaet",
        "recentchangesdays": "Niver a zevezhioù da ziskouez er c'hemmoù diwezhañ :",
        "recentchangesdays-max": "D'ar muiañ $1 {{PLURAL:$1|deiz|deiz}}",
        "prefs-emailconfirm-label": "Kadarnaat ar postel :",
        "youremail": "Postel :",
        "username": "{{GENDER:$1|Anv implijer|Anv implijerez}}:",
-       "prefs-memberingroups": "{{GENDER:$2|Ezel}} eus {{PLURAL:$1|ar strollad|ar strolladoù}} :",
+       "prefs-memberingroups": "{{GENDER:$2|Ezel}} eus {{PLURAL:$1|ar strollad|ar strolladoù}}:",
        "prefs-registration": "Deiziad enskrivañ :",
        "yourrealname": "Anv gwir*",
        "yourlanguage": "Yezh an etrefas&nbsp;",
        "delete-confirm": "Diverkañ \"$1\"",
        "delete-legend": "Diverkañ",
        "historywarning": "<strong>Diwallit :</strong> Emaoc'h war-nes diverkañ ur bajenn dezhi un istor gant {{PLURAL:$1|adweladenn}} :",
+       "historyaction-submit": "Diskouez",
        "confirmdeletetext": "War-nes diverkañ da viken ur bajenn pe ur skeudenn eus ar bank roadennoù emaoc'h. Diverket e vo ivez an holl stummoù kozh stag outi.\nKadarnait, mar plij, eo mat an dra-se hoc'h eus c'hoant da ober, e komprenit mat an heuliadoù, hag e rit se diouzh ar [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Diverkadenn kaset da benn",
        "actionfailed": "Ober c'hwitet",
index f2164ef..98b5cee 100644 (file)
        "changepassword-success": "Vaše heslo bylo změněno!",
        "changepassword-throttled": "Provedli jste příliš mnoho pokusů o přihlášení.\nČekejte prosím $1 a zkuste to znovu.",
        "botpasswords": "Hesla pro boty",
-       "botpasswords-summary": "<em>Hesla pro boty</em> umožňují přistupovat k uživatelskému účtu prostřednictví API bez použití hlavních přihlašovacích údajů účtu. Uživatelská oprávnění dostupná po přihlášení pomocí hesla pro boty mohou být omezena.\n\nPokud nevíte, k čemu byste to {{GENDER:|chtěl|chtěla|chtěli}} použít, pravděpodobně byste to používat {{GENDER:|neměl|neměla|neměli}}. Nikdo by vás nikdy neměl žádat, abyste si zde vygenerovali heslo a dali mu ho.",
+       "botpasswords-summary": "<em>Hesla pro boty</em> umožňují přistupovat k uživatelskému účtu prostřednictví API bez použití hlavních přihlašovacích údajů účtu. Uživatelská oprávnění dostupná po přihlášení pomocí hesla pro boty mohou být omezena.\n\nPokud nevíte, k čemu byste to {{GENDER:|chtěl|chtěla|chtěli}} použít, pravděpodobně byste to používat {{GENDER:|neměl|neměla|neměli}}. Nikdo by vás nikdy neměl žádat, abyste si zde {{GENDER:|vygeneroval heslo a dal|vygenerovala heslo a dala|vygenerovali heslo a dali}} mu ho.",
        "botpasswords-disabled": "Hesla pro boty jsou zakázána.",
        "botpasswords-no-central-id": "Abyste {{GENDER:|mohl|mohla|mohl(a)}} použít hesla pro boty, musíte být {{GENDER:|přihlášen|přihlášena|přihlášen(a)}} k centrálnímu účtu.",
        "botpasswords-existing": "Stávající hesla pro boty",
        "userpage-userdoesnotexist": "Uživatelský účet „$1“ není zaregistrován.\nZkontrolujte, zda skutečně chcete tuto stránku vytvořit či editovat.",
        "userpage-userdoesnotexist-view": "Uživatelský účet „$1“ není zaregistrován.",
        "blocked-notice-logextract": "{{GENDER:$1|Tento uživatel|Tato uživatelka}} je momentálně {{GENDER:$1|zablokován|zablokována}}.\nZde je pro přehled zobrazen nejnovější záznam z knihy zablokování:",
-       "clearyourcache": "<strong>Poznámka:</strong> Po uložení musíte smazat cache vašeho prohlížeče, jinak změny neuvidíte.\n* <strong>Firefox / Safari:</strong> Při kliknutí na <em>Aktualizovat</em> držte <em>Shift</em> nebo stiskněte <em>Ctrl-F5</em> nebo <em>Ctrl-R</em> (na Macu <em>⌘-R</em>)\n* <strong>Google Chrome:</strong> Stiskněte <em>Ctrl-Shift-R</em> (na Macu <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong> Při kliknutí na <em>Aktualizovat</em> držte <em>Ctrl</em> nebo stiskněte <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Smažte obsah cache v menu <em>Nástroje → Nastavení</em>",
+       "clearyourcache": "<strong>Poznámka:</strong> Po uložení musíte smazat cache vašeho prohlížeče, jinak změny neuvidíte.\n* <strong>Firefox / Safari:</strong> Při kliknutí na <em>Aktualizovat</em> držte <em>Shift</em> nebo stiskněte <em>Ctrl-F5</em> nebo <em>Ctrl-R</em> (na Macu <em>⌘-R</em>)\n* <strong>Google Chrome:</strong> Stiskněte <em>Ctrl-Shift-R</em> (na Macu <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong> Při kliknutí na <em>Aktualizovat</em> držte <em>Ctrl</em> nebo stiskněte <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Jděte do <em>Menu → Nastavení</em> (na Macu <em>Opera → Nastavení</em>) a tam pak <em>Soukromí & bezpečnost → Vymazat údaje o prohlížení → Obrázky a soubory z cache</em>",
        "usercssyoucanpreview": "<strong>Tip:</strong> Použijte tlačítko „{{int:showpreview}}“ k testování vašeho nového CSS před uložením.",
        "userjsyoucanpreview": "<strong>Tip:</strong> Použijte tlačítko „{{int:showpreview}}“ k testování vašeho nového JavaScriptu před uložením.",
        "usercsspreview": "<strong>Pamatujte, že si prohlížíte jen náhled vašeho uživatelského CSS, jelikož dosud nebyl uložen!</strong>",
        "changecontentmodel-success-text": "Model obsahu stránky [[:$1]] byl změněn.",
        "changecontentmodel-cannot-convert": "Obsah stránky [[:$1]] nelze zkonvertovat na typ $2.",
        "changecontentmodel-nodirectediting": "Model obsahu $1 nepodporuje přímou editaci",
+       "changecontentmodel-emptymodels-title": "Nejsou k dispozici žádné modely obsahu",
+       "changecontentmodel-emptymodels-text": "Obsah stránky [[:$1]] nelze zkonvertovat na žádný typ.",
        "log-name-contentmodel": "Kniha změny modelů obsahu",
        "log-description-contentmodel": "Události týkající se modelů obsahu stránek",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|založil|založila}} stránku $3 za použití nestandardního modelu obsahu „$5“",
        "lockdbsuccesstext": "Databáze {{grammar:2sg|{{SITENAME}}}} byla úspěšně uzamčena.\n<br />Nezapomeňte ji po dokončení údržby [[Special:UnlockDB|odemknout]].",
        "unlockdbsuccesstext": "Databáze {{grammar:2sg|{{SITENAME}}}} je odemčena.",
        "lockfilenotwritable": "Do souboru zámku databáze nelze zapisovat. Pro zamčení či odemčení databáze musí mít webový server právo zápisu do tohoto souboru.",
+       "databaselocked": "Databáze je již zamčená.",
        "databasenotlocked": "Databáze není uzamčena.",
        "lockedbyandtime": "({{gender:$1|zamkl|zamkla|zamkl}} $1 $2 v $3)",
        "move-page": "Přesunout „$1“",
index 6ed4fad..4cbca02 100644 (file)
@@ -24,7 +24,7 @@
        "tog-hideminor": "Cuddio golygiadau bychain yn rhestr y newidiadau diweddar",
        "tog-hidepatrolled": "Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr newidiadau diweddar",
        "tog-newpageshidepatrolled": "Cuddio tudalennau a batroliwyd o'r rhestr y tudalennau newydd",
-       "tog-hidecategorization": "Cuddiwych y categoriau",
+       "tog-hidecategorization": "Cuddiwch y categoriau",
        "tog-extendwatchlist": "Ehangu'r rhestr wylio i ddangos pob golygiad yn hytrach na'r diweddaraf yn unig",
        "tog-usenewrc": "Grwpio'r newidiadau bob yn ddalen yn y 'newidiadau diweddar' a'r 'rhestr wylio'",
        "tog-numberheadings": "Rhifo penawdau'n awtomatig",
@@ -55,7 +55,7 @@
        "tog-watchlistreloadautomatically": "Ail-lwyther y Rhestr wylio yn otomatigpan newider ffiltr (angen JavaScript)",
        "tog-watchlisthideanons": "Cuddio golygiadau gan ddefnyddwyr anhysbys rhag y rhestr wylio",
        "tog-watchlisthidepatrolled": "Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr wylio",
-       "tog-watchlisthidecategorization": "Cuddiwych y categoriau",
+       "tog-watchlisthidecategorization": "Cuddiwch y categoriau",
        "tog-ccmeonemails": "Anfon copi ataf pan anfonaf e-bost at ddefnyddiwr arall",
        "tog-diffonly": "Peidio â dangos cynnwys y dudalen islaw'r gymhariaeth ar dudalennau cymharu",
        "tog-showhiddencats": "Dangos categorïau cuddiedig",
        "rcshowhidemine": "$1 fy ngolygiadau",
        "rcshowhidemine-show": "Dangoser",
        "rcshowhidemine-hide": "Cuddier",
-       "rcshowhidecategorization": "Categorieiddio tudalen $1",
+       "rcshowhidecategorization": "Categoreiddio tudalen $1",
        "rcshowhidecategorization-show": "Dangos",
        "rcshowhidecategorization-hide": "Cuddio",
        "rclinks": "Dangos y $1 newid diweddaraf yn ystod y(r) $2 diwrnod diwethaf<br />$3",
index a4baefa..8c40276 100644 (file)
        "recentchanges-legend-heading": "<strong>Forklaring:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|listen over nye sider]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Vis",
        "rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.",
        "rclistfrom": "Vis nye ændringer startende fra den $3 kl. $2",
        "rcshowhideminor": "$1 mindre ændringer",
        "apisandbox": "API-sandkassen",
        "apisandbox-api-disabled": "API er deaktiveret på dette websted.",
        "apisandbox-intro": "Brug denne side til at eksperimentere med '''MediaWiki web service API'''.\nVi henviser til [//www.mediawiki.org/wiki/API:Main_page dokumentationen af API] for yderligere oplysninger om brug af API.  Eksempel: [//www.mediawiki.org/wiki/API#A_simple_example få indholdet af en forside]. Vælg en handling at se flere eksempler.\n\nBemærk, at selv om dette er en sandkasse, vil handlinger du udfører på denne side redigere wikien.",
+       "apisandbox-unfullscreen": "Vis side",
        "apisandbox-submit": "Lav forespørgsel",
        "apisandbox-reset": "Ryd",
        "apisandbox-examples": "Eksempler",
        "specialloguserlabel": "Udført af:",
        "speciallogtitlelabel": "Mål (titel eller {{ns:user}}:brugernavn for bruger):",
        "log": "Loglister",
+       "logeventslist-submit": "Vis",
        "all-logs-page": "Alle offentlige logger",
        "alllogstext": "Samlet visning af alle loggene på {{SITENAME}}.\nDu kan afgrænse visningen ved at vælge en logtype, brugernavn eller påvirket side. Der skelnes mellem små og store bogstaver for både bruger- og sidenavne.",
        "logempty": "Intet passende fundet.",
        "cachedspecial-viewing-cached-ts": "Du ser en hengemt version af denne side, som måske ikke er helt aktuel.",
        "cachedspecial-refresh-now": "Vis seneste.",
        "categories": "Kategorier",
+       "categories-submit": "Vis",
        "categoriespagetext": "Følgende {{PLURAL:$1|kategori|kategorier}} indeholder sider eller media.\n[[Special:UnusedCategories|Ubrugte kategorier]] vises ikke her.\nSe også [[Special:WantedCategories|ønskede kategorier]].",
        "categoriesfrom": "Vis kategorier startende med:",
        "deletedcontributions": "Slettede brugerbidrag",
        "wlnote": "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste <strong>$1</strong> ændringer}} i {{PLURAL:$2|den sidste time|de sidste <strong>$2</strong> timer}} op til den $3 kl. $4.",
        "wlshowlast": "Vis de seneste $1 timer $2 dage",
        "watchlist-hide": "Skjul",
+       "watchlist-submit": "Vis",
        "wlshowtime": "Vis seneste:",
        "wlshowhideminor": "mindre ændringer",
        "wlshowhidebots": "robotter",
        "delete-confirm": "Slet \"$1\"",
        "delete-legend": "Slet",
        "historywarning": "<strong>Advarsel:</strong> Siden du er ved at slette har en historie med $1 {{PLURAL:$1|version|versioner}}:",
+       "historyaction-submit": "Vis",
        "confirmdeletetext": "Du er ved at slette en side sammen med hele dens tilhørende historik.\nBekræft venligst at du virkelig vil gøre dette, at du forstår konsekvenserne, og at du gør det i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjerne]].",
        "actioncomplete": "Gennemført",
        "actionfailed": "Handlingen mislykkedes",
        "mw-widgets-titleinput-description-new-page": "side eksisterer ikke endnu",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
        "api-error-blacklisted": "Vælg venligst en anden, beskrivende titel.",
-       "randomrootpage": "Tilfældig stamside"
+       "randomrootpage": "Tilfældig stamside",
+       "log-action-filter-block": "Blokeringstype:",
+       "log-action-filter-move": "Flyttetype:",
+       "log-action-filter-patrol": "Patruljeringstype:",
+       "log-action-filter-protect": "Beskyttelsestype:",
+       "log-action-filter-block-block": "Blokering",
+       "log-action-filter-block-reblock": "Ændring af blokering",
+       "log-action-filter-delete-delete": "Sidesletning",
+       "log-action-filter-delete-restore": "Sidegendannelse",
+       "log-action-filter-delete-event": "Logsletning",
+       "log-action-filter-delete-revision": "Revisionssletning",
+       "log-action-filter-move-move": "Flytning uden overskrivelse af omdirigeringer",
+       "log-action-filter-move-move_redir": "Flytning med overskrivelse af omdirigeringer",
+       "log-action-filter-patrol-patrol": "Manuel patruljering",
+       "log-action-filter-patrol-autopatrol": "Automatisk patruljering",
+       "log-action-filter-protect-protect": "Beskyttelse",
+       "log-action-filter-protect-modify": "Ændring af beskyttelse",
+       "log-action-filter-protect-unprotect": "Fjernede beskyttelse",
+       "log-action-filter-protect-move_prot": "Flyttede beskyttelse"
 }
index 8904537..05a1720 100644 (file)
        "tog-ccmeonemails": "Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende",
        "tog-diffonly": "Beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite anzeigen",
        "tog-showhiddencats": "Versteckte Kategorien anzeigen",
-       "tog-norollbackdiff": "Unterschied nach dem Zurücksetzen unterdrücken",
+       "tog-norollbackdiff": "Unterschied nach dem Zurücksetzen nicht anzeigen",
        "tog-useeditwarning": "Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält",
        "tog-prefershttps": "Wenn angemeldet, immer eine sichere Verbindung benutzen.",
        "underline-always": "immer",
        "blankarticle": "<strong>Warnung:</strong> Die Seite, die du erstellst, ist leer.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Seite ohne Inhalt erstellt.",
        "anoneditwarning": "<strong>Warnung:</strong> Du bist nicht angemeldet. Deine IP-Adresse wird öffentlich sichtbar, falls du Bearbeitungen durchführst. Sofern du dich <strong>[$1 anmeldest]</strong> oder <strong>[$2 ein Benutzerkonto erstellst]</strong>, werden deine Bearbeitungen zusammen mit anderen Beiträgen deinem Benutzernamen zugeordnet.",
        "anonpreviewwarning": "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
-       "missingsummary": "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
+       "missingsummary": "<strong>Hinweis:</strong> Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
        "selfredirect": "<strong>Warnung:</strong> Du leitest auf diese Seite selbst weiter.\nDu hast vermutlich das falsche Weiterleitungsziel angegeben oder du bearbeitest die falsche Seite.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Weiterleitung dennoch erstellt.",
        "missingcommenttext": "Bitte gib unten einen Kommentar ein.",
        "missingcommentheader": "<strong>Achtung:</strong> Du hast keinen Betreff eingegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
        "editpage-cannot-use-custom-model": "Das Inhaltsmodell dieser Seite kann nicht geändert werden.",
        "longpageerror": "'''Fehler: Der Text, den du zu speichern versuchst, ist {{PLURAL:$1|ein Kilobyte|$1 Kilobyte}} groß. Dies ist größer als das erlaubte Maximum von {{PLURAL:$2|ein Kilobyte|$2 Kilobyte}}.'''\nEr kann nicht gespeichert werden.",
        "readonlywarning": "<strong>Achtung: Die Datenbank wurde für Wartungsarbeiten gesperrt, so dass deine Änderungen derzeit nicht gespeichert werden können.\nSichere den Text bitte lokal auf deinem Computer und versuche zu einem späteren Zeitpunkt, die Änderungen zu übertragen.</strong>\n\nGrund für die Sperre: $1",
-       "protectedpagewarning": "'''Achtung: Diese Seite wurde geschützt. Nur Benutzer mit Administratorrechten können die Seite bearbeiten.'''\nZur Information folgt der aktuelle Logbucheintrag:",
+       "protectedpagewarning": "<strong>Achtung: Diese Seite wurde geschützt. Nur Benutzer mit Administratorrechten können die Seite bearbeiten.</strong>\nZur Information folgt der aktuelle Logbucheintrag:",
        "semiprotectedpagewarning": "'''Halbsperrung:''' Die Seite wurde so geschützt, dass nur registrierte Benutzer diese ändern können.\nZur Information folgt der aktuelle Logbucheintrag:",
        "cascadeprotectedwarning": "<strong>Achtung:</strong> Diese Seite wurde so geschützt, dass sie nur durch Benutzer mit Administratorrechten bearbeitet werden kann. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:",
        "titleprotectedwarning": "'''Achtung: Die Seitenerstellung wurde so geschützt, dass nur Benutzer mit [[Special:ListGroupRights|speziellen Rechten]] diese Seite erstellen können.'''\nZur Information folgt der aktuelle Logbucheintrag:",
        "permissionserrorstext": "Du bist nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:",
        "permissionserrorstext-withaction": "Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:",
        "contentmodelediterror": "Du kannst diese Version nicht bearbeiten, da das Inhaltsmodell <code>$1</code> vom aktuellen Inhaltsmodell der Seite <code>$2</code> abweicht.",
-       "recreate-moveddeleted-warn": "'''Achtung: Du erstellst eine Seite, die bereits früher gelöscht wurde.'''\n\nBitte prüfe sorgfältig, ob die erneute Seitenerstellung den Richtlinien entspricht.\nZu deiner Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begründung für die vorhergehende Löschung:",
+       "recreate-moveddeleted-warn": "<strong>Achtung: Du erstellst eine Seite, die bereits früher gelöscht wurde.</strong>\n\nBitte prüfe sorgfältig, ob die erneute Seitenerstellung den Richtlinien entspricht.\nZu deiner Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begründung für die vorhergehende Löschung:",
        "moveddeleted-notice": "Diese Seite wurde gelöscht. Zur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
        "moveddeleted-notice-recent": "Leider wurde diese Seite kürzlich gelöscht (innerhalb der letzten 24 Stunden).\nZur Information wird das Lösch- und Verschiebungs-Logbuch für die Seite unten angezeigt.",
        "log-fulllog": "Alle Logbucheinträge ansehen",
        "changecontentmodel-success-text": "Der Inhaltstyp von [[:$1]] wurde geändert.",
        "changecontentmodel-cannot-convert": "Der Inhalt von [[:$1]] kann nicht zum Typ $2 konvertiert werden.",
        "changecontentmodel-nodirectediting": "Das Inhaltsmodell „$1“ unterstützt keine direkten Bearbeitungen",
+       "changecontentmodel-emptymodels-title": "Keine Inhaltsmodelle verfügbar",
+       "changecontentmodel-emptymodels-text": "Der Inhalt auf [[:$1]] kann zu keinem Typ konvertiert werden.",
        "log-name-contentmodel": "Inhaltsmodell-Änderungs-Logbuch",
        "log-description-contentmodel": "Ereignisse bezüglich den Inhaltsmodellen einer Seite",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|erstellte}} die Seite $3 mit einem Nicht-Standard-Inhaltsmodell „$5“",
        "lockdbsuccesstext": "Die {{SITENAME}}-Datenbank wurde gesperrt.<br />Bitte gib die Datenbank [[Special:UnlockDB|wieder frei]], sobald die Wartung abgeschlossen ist.",
        "unlockdbsuccesstext": "Die {{SITENAME}}-Datenbank wurde freigegeben.",
        "lockfilenotwritable": "Die Datenbank-Sperrdatei ist nicht beschreibbar. Zum Sperren oder Freigeben der Datenbank muss diese für den Webserver beschreibbar sein.",
+       "databaselocked": "Die Datenbank ist bereits gesperrt.",
        "databasenotlocked": "Die Datenbank ist nicht gesperrt.",
        "lockedbyandtime": "(von $1 am $2 um $3 Uhr)",
        "move-page": "Verschieben von „$1“",
        "movepagetext": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nDu kannst Weiterleitungen, die auf den Originaltitel verlinken, automatisch korrigieren lassen.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, letztere ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong>\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
        "movepagetext-noredirectfixer": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong>\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
        "movepagetalktext": "Falls du dieses Kästchen aktivierst, wird die dazugehörige Diskussionsseite automatisch auf den neuen Titel verschoben, sofern nicht bereits eine nicht-leere Diskussionsseite dort vorhanden ist.\n\nIn diesem Fall musst du die Seite manuell verschieben oder zusammenführen, falls erforderlich.",
-       "moveuserpage-warning": "'''Warnung:''' Du bist dabei, eine Benutzerseite zu verschieben. Bitte bedenke, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
+       "moveuserpage-warning": "<strong>Warnung:</strong> Du bist dabei, eine Benutzerseite zu verschieben. Bitte bedenke, dass dadurch nur die Benutzerseite verschoben, <em>nicht</em> aber der Benutzer umbenannt wird.",
        "movecategorypage-warning": "<strong>Warnung:</strong> Du bist gerade dabei, eine Kategorieseite zu verschieben. Bitte sei dir bewusst, dass nur die Seite verschoben wird. Alle der alten Kategorie zugeordneten Seiten werden <em>nicht</em> neu kategorisiert.",
        "movenologintext": "Du musst ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.",
        "movenotallowed": "Du hast nicht die erforderliche Berechtigung, um Seiten verschieben zu können.",
        "imageinvalidfilename": "Der Ziel-Dateiname ist ungültig",
        "fix-double-redirects": "Nach dem Verschieben alle Weiterleitungen auf die Ursprungsseite bereinigen",
        "move-leave-redirect": "Weiterleitung erstellen",
-       "protectedpagemovewarning": "'''Warnung:''' Diese Seite wurde so geschützt, dass sie nur von Benutzern mit Administratorenrechten verschoben werden kann.\nZur Information folgt der aktuelle Logbucheintrag:",
+       "protectedpagemovewarning": "<strong>Warnung:</strong> Diese Seite wurde so geschützt, dass sie nur von Benutzern mit Administratorenrechten verschoben werden kann.\nZur Information folgt der aktuelle Logbucheintrag:",
        "semiprotectedpagemovewarning": "'''Hinweis:''' Diese Seite wurde so geschützt, dass sie nur von angemeldeten Benutzern verschoben werden kann.\nZur Information folgt der aktuelle Logbucheintrag:",
        "move-over-sharedrepo": "[[:$1]] existiert in einem gemeinsam genutzten Repositorium. Das Verschieben einer Datei zu diesem Titel überschreibt die gemeinsam genutzte Datei.",
        "file-exists-sharedrepo": "Der gewählte Dateiname wird bereits in einem gemeinsam genutzten Repositorium verwendet.\nBitte wähle einen anderen Namen.",
        "filedelete-archive-read-only": "Das Archiv-Verzeichnis „$1“ ist für den Webserver nicht beschreibbar.",
        "previousdiff": "← Zum vorherigen Versionsunterschied",
        "nextdiff": "Zum nächsten Versionsunterschied →",
-       "mediawarning": "'''Warnung:''' Dieser Dateityp kann böswilligen Programmcode enthalten.\nDurch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt werden.",
+       "mediawarning": "<strong>Warnung:</strong> Dieser Dateityp kann böswilligen Programmcode enthalten.\nDurch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt werden.",
        "imagemaxsize": "Maximale Bildgröße:<br />''(für Dateibeschreibungsseiten)''",
        "thumbsize": "Standardgröße der Vorschaubilder:",
        "widthheightpage": "$1 × $2, {{PLURAL:$3|1 Seite|$3 Seiten}}",
index eb952b0..ba4d82b 100644 (file)
@@ -22,7 +22,8 @@
                        "아라",
                        "Calak",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Kumkumuk"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
        "hidden-category-category": "Kategoriyê nımıtey",
        "category-subcat-count": "{{PLURAL:$2|Na kategoriya de $1 bınkategoriyay estê.|$2 kategoriyan ra $1 bınkategoriyay asenê.}}",
        "category-subcat-count-limited": "Na kategoriye de {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê}}.",
-       "category-article-count": "{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Na kategoriye de $2 tenan ra, {{PLURAL:$1|ena pele esta|$1 peli}}, ena kategoriye miyan derê}}",
+       "category-article-count": "{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Ebe $2 ra pêro piya {{PLURAL:$1|ena pela na kategoriye dera|$1 enê peli na kategoriye derê.}}",
        "category-article-count-limited": "{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.",
        "category-file-count": "<noinclude>{{PLURAL:$2|Na kategoriye tenya dosyayanê cêrênan muhtewa kena.}}</noinclude>\n*Na kategoriye de $2 dosyayan ra {{PLURAL:$1|yew dosya tenêka esta| $1 dosyey asenê}}.",
        "category-file-count-limited": "{{PLURAL:$1|Dosya cêrêne|$1 Dosyê cêrêni}} na kategoriye derê.",
        "unprotectthispage": "Starkerdışe ena peler bıvurne",
        "newpage": "Pela newiye",
        "talkpage": "Ena pele sero werêne",
-       "talkpagelinktext": "vaten",
+       "talkpagelinktext": "werênayış",
        "specialpage": "Pela xısusiye",
        "personaltools": "Hacetê şexsiy",
        "articlepage": "Pela zerreki bıvêne",
-       "talk": "Vaten",
+       "talk": "Werênayış",
        "views": "Asayışi",
        "toolbox": "Haceti",
        "userpage": "Pela karberi bıvêne",
        "red-link-title": "$1 (pele çıniya)",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
-       "nstab-main": "Wesiqe",
+       "nstab-main": "Pele",
        "nstab-user": "Pela karberi",
        "nstab-media": "Pela medya",
        "nstab-special": "Pela xase",
        "resetpass_submit": "Parola eyar kere u newe ra dekewe",
        "changepassword-success": "Parola şıma be serkewtış vuriye!",
        "changepassword-throttled": "Şıma zaf ronıştış akerdış ke.Kerem ke verdi dekewten $1 bıpawe.",
-       "botpasswords-label-appid": "Bot name:",
+       "botpasswords-label-appid": "Nameyê boti:",
        "botpasswords-label-create": "Vıraze",
        "botpasswords-label-update": "Rocane ke",
        "botpasswords-label-cancel": "Bıtexelne",
        "botpasswords-label-delete": "Bestere",
-       "botpasswords-label-resetpassword": "Parola reset ke",
-       "botpasswords-label-grants-column": "Dayen",
+       "botpasswords-label-resetpassword": "Parola raçarne",
+       "botpasswords-label-grants-column": "Daye",
        "resetpass_forbidden": "parolayi nêvuryayi",
        "resetpass-no-info": "şıma gani hesab akere u hona bıeşke bırese cı",
        "resetpass-submit-loggedin": "Parola bıvurne",
        "userinvalidcssjstitle": "'''Teme:''' Mewzuyê \"$1\" çıniyo.\nDosyanê be namey .css u .js'i de herfa werdiye bıgurêne, mesela herında {{ns:user}}:Foo/Vector.css'i de {{ns:user}}:Foo/vector.css bınuse.",
        "updated": "(Rozeneya)",
        "note": "'''Not:'''",
-       "previewnote": "'''Şıma bızanê ke ena yew verqayta.'''\nVurnayışê şıma hona qeyd nêbiyo!",
+       "previewnote": "'''Şıma bızanê ke eno yew verqayto.'''\nVurnayışê şıma hewna qeyd nêbiyê!",
        "continue-editing": "Şo herunda vurnayışi",
        "previewconflict": "No seyrkerdışê verqaydi serê qutiyê nuşte tezim kerdış de yo, eke şıma qayile vurnayişê maddeyi seyino bıvini, no mocneno şıma.",
        "session_fail_preview": "Ma ef kere. Vindibiyayişê tayê datay ra a kerdışê hesabê şıma de ma vurnayişê şıma qayd nêkerd. Newe ra tesel (cereb) bıkere. Eke no qayde zi nêbo, [[Special:UserLogout|hesabê xo bıqefelne]] u newera a kere.",
        "last": "peyên",
        "page_first": "verên",
        "page_last": "peyên",
-       "histlegend": "Ferqê weçinıtışi: Qutiya versiyonan seba pêver sanayış işaret ke û dest be ''enter''i ya zi gocega cêrêne ro ne.<br />\nCetwel: <strong>({{int:ferq}})</strong> = ferqê verziyonê peyêni, <strong>({{int:peyên}})</strong> = ferqê versiyonê verêni, <strong>{{int:q}}</strong> = vurnayışo werdi.",
+       "histlegend": "Ferqê weçinıtışi: Qutiya versiyonan seba têversanayış işaret ke û dest be ''enter''i ya zi gocega cêrêne ro ne.<br />\nCedwel: <strong>({{int:ferq}})</strong> = ferqê verziyonê peyêni, <strong>({{int:peyên}})</strong> = ferqê versiyonê verêni, <strong>{{int:q}}</strong> = vurnayışo werdi.",
        "history-fieldset-title": "Tarixi bıvêne",
        "history-show-deleted": "Tenya esterıtey",
        "histfirst": "Verênêr",
        "group-sysop": "İdarekari",
        "group-bureaucrat": "Burokrati",
        "group-suppress": "Çımpawıteni",
-       "group-all": "(pêron)",
+       "group-all": "(pêro)",
        "group-user-member": "{{GENDER:$1|karber}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Karberê ke otomatikmen biyê araşt}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "enhancedrc-history": "tarix",
        "recentchanges": "Vurnayışê peyêni",
        "recentchanges-legend": "Tercihê vurnayışanê peyênan",
-       "recentchanges-summary": "Wiki sero vurnayışanê peyênan ena pele de teqib kerê.",
+       "recentchanges-summary": "Ena pele de wiki sero vurnayışanê peyênan teqib ke.",
        "recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
        "recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
        "recentchanges-label-newpage": "Enê vurnayışi ra yew pela newiye vıraziye",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
-       "rclistfrom": "$3 u seate $2 ra tepiya vurnayışanê neweyan bımocne",
-       "rcshowhideminor": "vurnayışanê werdiyan $1",
+       "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
+       "rcshowhideminor": "vurnayışê werdiyi $1",
        "rcshowhideminor-show": "Bımocne",
        "rcshowhideminor-hide": "Bınımne",
-       "rcshowhidebots": "Vurnayışanê botan $1",
+       "rcshowhidebots": "botan $1",
        "rcshowhidebots-show": "Bımocne",
        "rcshowhidebots-hide": "Bınımne",
        "rcshowhideliu": "karberê qeydbiyayeyi $1",
        "rcshowhideliu-show": "Bımocne",
        "rcshowhideliu-hide": "Bınımne",
-       "rcshowhideanons": "Bêname karberan $1",
+       "rcshowhideanons": "karberê bênameyi $1",
        "rcshowhideanons-show": "Bımocne",
        "rcshowhideanons-hide": "Bınımne",
        "rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
        "rcshowhidepatr-show": "Bımocne",
        "rcshowhidepatr-hide": "Bınımne",
-       "rcshowhidemine": "Vurnayışanê êdê mı $1",
+       "rcshowhidemine": "vurnayışanê mı $1",
        "rcshowhidemine-show": "Bımocne",
        "rcshowhidemine-hide": "Bınımne",
        "rcshowhidecategorization": "kategorizasyonê pele $1",
        "rcshowhidecategorization-show": "Bımocne",
        "rcshowhidecategorization-hide": "Bınımne",
-       "rclinks": "Peyên $2 rocan de $1 vurnayışan bımocne <br />$3",
+       "rclinks": "Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3",
        "diff": "ferq",
        "hist": "verên",
        "hide": "Bınımne",
        "uploadbtn": "Dosya bar ke",
        "reuploaddesc": "Barkerdışi iptal ke u peyser şo formê barkerdışi",
        "upload-tryagain": "Deskripyonê dosyayî ke vurîya ey qeyd bike",
-       "uploadnologin": "Şıma cıkewtış nêvıraşt o",
+       "uploadnologin": "Şıma cıkewtış nêvıraşto",
        "uploadnologintext": "Ti şeni $1 dosya bar bikere.",
        "upload_directory_missing": "Direktorê dosyayê ($1)î biyo vînî u webserver de nieşkeno viraziye.",
        "upload_directory_read_only": "Direktorê dosyayê ($1)î webserver de nieşkeno binuse.",
        "listgrouprights-group": "Grube",
        "listgrouprights-rights": "Heqqî",
        "listgrouprights-helppage": "Help:Heqqanê gruban",
-       "listgrouprights-members": "[listeya ezayan]",
+       "listgrouprights-members": "[lista ezayan]",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
        "listgrouprights-addgroup": "{{PLURAL:$2|Grube|Gruban}} cı kerê: $1",
        "watchlist-details": "{{PLURAL:$1|$1 pele|$1 peleyan}} listeyê seyr-kerdışi şıma dı, peleyanê vurnayışi dahil niyo.",
        "wlheader-enotif": "E-mail xeber dayiş abiyo.",
        "wlheader-showupdated": "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
-       "wlnote": "$3 seate u $4 deqa dıma {{PLURAL:$2|ju seate dı|'''$2''' ju seate dı}} {{PLURAL:$1|vurnayışe peyeni|vurnayışe '''$1''' peyeni}} cêrdeyê",
+       "wlnote": "$3 saete $4 ra dıme {{PLURAL:$2|yew saete de|'''$2''' saetan de}} {{PLURAL:$1|vurnayışo peyên|vurnayışê '''$1''' peyêni}} cêrderê.",
        "wlshowlast": "Peyni de vurnayışan ra  $1 seata u $2 roca  bımocnê",
        "watchlist-hide": "Bınımne",
        "wlshowtime": "Peyênan bımocne:",
-       "wlshowhideminor": "vurnayışanê werdiyan",
+       "wlshowhideminor": "vurnayışê werdiyi",
        "wlshowhidebots": "boti",
        "wlshowhideliu": "karberê qeydıni",
        "wlshowhideanons": "karberê anonimi",
        "actioncomplete": "Kar bi temam",
        "actionfailed": "kar nêbı",
        "deletedtext": "\"$1\" biya wedariya.\nQe qeydê wedarnayışi, $2 bevinin.",
-       "dellogpage": "Qeydê esternayışi",
+       "dellogpage": "Qeydê esterıtışi",
        "dellogpagetext": "listeya cêrıni heme qaydê hewn a kerdeyan o.",
-       "deletionlog": "Qeydê esternayışi",
+       "deletionlog": "qeydê esterıtışi",
        "reverted": "revizyono verin tepiya anciyayo",
        "deletecomment": "Sebeb:",
        "deleteotherreason": "Sebebo bin:",
        "sp-contributions-newbies": "Tenya iştıraqanê karberanê neweyan bımocne",
        "sp-contributions-newbies-sub": "Qe hesebê newe",
        "sp-contributions-newbies-title": "Îştîrakê karberî ser hesabê neweyî",
-       "sp-contributions-blocklog": "Qeydê meni",
+       "sp-contributions-blocklog": "qeydê kılitbiyayeyi",
        "sp-contributions-deleted": "iştırakê karberi esterdi",
        "sp-contributions-uploads": "barkerdey",
        "sp-contributions-logs": "qeydi",
        "contribslink": "iştıraqi",
        "emaillink": "e-poste bırışe",
        "autoblocker": "Şıma otomatikmen kılit biy, çıke adresa şımaya ''IP''y terefê \"[[User:$1|$1]]\" gureniyena.\nSebebê kılitbiyayışê $1'i \"$2\"o",
-       "blocklogpage": "Qeydê meni",
+       "blocklogpage": "Qeydê astengi",
        "blocklog-showlog": "verniyê no/na karberi cıwa ver geriyayo/ya.",
        "blocklog-showsuppresslog": "verniyê no/na karberi cıwa ver geriyayo/ya.",
        "blocklogentry": "[[$1]] biyo bloqe, sebeb: $3, hetana $2 do bıramo.",
        "htmlform-cloner-delete": "Wedare",
        "sqlite-has-fts": "$1 tam-metn destegê cı geyrayışiya piya",
        "sqlite-no-fts": "$1 tam-metn bê destegê cı geyrayışi",
-       "logentry-delete-delete": "Karber $1 pela $3 {{GENDER:$2|besternê}}",
+       "logentry-delete-delete": "$1 pela $3 {{GENDER:$2|esterıte}}",
        "logentry-delete-restore": "$1 pela $3 {{GENDER:$2|peyser arde}}",
        "logentry-delete-event": "$1 $3: $4 de asayışê {{PLURAL:$5|cıkerdışi|cıkerdışan}} {{GENDER:$2|vurna}}",
        "logentry-delete-revision": "$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} {{GENDER:$2|vurna}}",
index b20f732..379bbec 100644 (file)
@@ -46,7 +46,8 @@
                        "Giorgos456",
                        "SucreRouge",
                        "Gts-tg",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Αντιγόνη"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "wantedtemplates": "Ζητούμενα πρότυπα",
        "mostlinked": "Σελίδες με τους περισσότερους συνδέσμους προς αυτές",
        "mostlinkedcategories": "Κατηγορίες με τους περισσότερους συνδέσμους προς αυτές",
-       "mostlinkedtemplates": "ΣελίδεÏ\82 Ï\80οÏ\85 Î­Ï\87οÏ\85ν ÎµÎ½Ï\83Ï\89μαÏ\84Ï\89θεί Ï\80εÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81ο Î±Ï\80Ï\8c Ï\8cλεÏ\82 Ï\84ιÏ\82 Î¬Î»Î»ες",
+       "mostlinkedtemplates": "ΠεÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81ο ÎµÎ½Ï\83Ï\89μαÏ\84Ï\89μένεÏ\82 Ï\83ελίδες",
        "mostcategories": "Σελίδες με τις περισσότερες κατηγορίες",
        "mostimages": "Αρχεία με τους περισσότερους συνδέσμους προς αυτά",
        "mostinterwikis": "Σελίδες με τους περισσότερους διαγλωσσικούς συνδέσμους",
        "logentry-protect-protect": "$1 {{GENDER:$2|προστατευμένος|προστατευμένη}} $3 $4",
        "logentry-protect-modify": "$1 {{GENDER:$2|άλλαξε}} επίπεδο προστασίας για $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|άλλαξε}} επίπεδο προστασίας για $3 $4 [διαδοχική]",
-       "logentry-rights-rights": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας για {{GENDER:$3|τον|την}} $3 από $4 σε $5",
+       "logentry-rights-rights": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας για {{GENDER:$6|τον|την}} $3 από $4 σε $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας {{GENDER:$1|του|της}} $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|προωθήθηκε}} αυτόματα από το $4 στο $5",
        "logentry-upload-upload": "{{GENDER:$2|Ο|Η}} $1 ανέβασε το $3",
index a521ab5..e7fa4c7 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
        "whatlinkshere-links": "← links",
-       "whatlinkshere-hideredirs": "$1 redirects",
-       "whatlinkshere-hidetrans": "$1 transclusions",
-       "whatlinkshere-hidelinks": "$1 links",
-       "whatlinkshere-hideimages": "$1 file links",
+       "whatlinkshere-hideredirs": "Hide redirects",
+       "whatlinkshere-hidetrans": "Hide transclusions",
+       "whatlinkshere-hidelinks": "Hide links",
+       "whatlinkshere-hideimages": "Hide file links",
        "whatlinkshere-filters": "Filters",
        "whatlinkshere-submit": "Go",
        "autoblockid": "Autoblock #$1",
        "lockdbsuccesstext": "The database has been locked.<br />\nRemember to [[Special:UnlockDB|remove the lock]] after your maintenance is complete.",
        "unlockdbsuccesstext": "The database has been unlocked.",
        "lockfilenotwritable": "The database lock file is not writable.\nTo lock or unlock the database, this needs to be writable by the web server.",
+       "databaselocked": "The database is already locked.",
        "databasenotlocked": "The database is not locked.",
        "lockedbyandtime": "(by {{GENDER:$1|$1}} on $2 at $3)",
        "move-page": "Move $1",
index b9ef105..6168265 100644 (file)
@@ -89,7 +89,7 @@
        "tog-ccmeonemails": "Sendi al mi kopiojn de retpoŝtaĵoj, kiujn mi sendis al aliaj uzantoj.",
        "tog-diffonly": "Ne montri paĝan enhavon sub la ŝanĝmontrilo",
        "tog-showhiddencats": "Montri kaŝitajn kategoriojn",
-       "tog-norollbackdiff": "Preterlasi ŝanĝoelmontron post malfaro",
+       "tog-norollbackdiff": "Nemontri diferencon post plenumado de ŝanĝomalfaro",
        "tog-useeditwarning": "Averti min kiam mi forlasas redaktan paĝon kun nekonservitaj ŝanĝoj",
        "tog-prefershttps": "Ĉiam uzu sekuran konekton ensalutite",
        "underline-always": "Ĉiam",
        "talk": "Diskuto",
        "views": "Vidoj",
        "toolbox": "Iloj",
-       "userpage": "Vidi uzantan paĝon",
+       "userpage": "Vidi uzulan paĝon",
        "projectpage": "Rigardi projektopaĝon",
        "imagepage": "Vidi dosieropaĝon",
        "mediawikipage": "Vidi mesaĝopaĝon",
        "missingarticle-rev": "(versio#: $1)",
        "missingarticle-diff": "(Diferenco inter versioj: $1, $2)",
        "readonly_lag": "La datumbazo estis aŭtomate ŝlosita dum la subdatumbazo atingas la ĉefan datumbazon.",
+       "nonwrite-api-promise-error": "La 'Promeso-Ne-Skribi-API-Ago' HTTPa titolo estis sendita sed la peto estis al API skriba modulo.",
        "internalerror": "Interna eraro",
        "internalerror_info": "Interna eraro: $1",
        "internalerror-fatal-exception": "Neriparebla escepto de la tipo \"$1\"",
        "noemail": "Retpoŝtadreso ne estas registrita por uzanto \"$1\".",
        "noemailcreate": "Vi devas provizi validan retadreson",
        "passwordsent": "Oni sendis novan pasvorton al la retpoŝtadreso\nregistrita por \"$1\".\nBonvolu ensaluti denove ricevinte ĝin.",
-       "blocked-mailpassword": "Via IP-adreso estas forbarita de redaktado. Por preventi fiuzojn, la pasvorto-restaŭron estas malpermesita per tiu IP-adreso.",
+       "blocked-mailpassword": "Via IP-adreso estas forbarita de redaktado. Por preventi fiuzojn, la pasvorto-restaŭro per tiu IP-adreso estas malpermesita.",
        "eauthentsent": "Konfirma retmesaĝo estis sendita al la nomita retadreso. Antaŭ ol iu ajn alia mesaĝo estos sendita al la konto, vi devos sekvi la instrukciojn en la mesaĝo por konfirmi ke la konto ja estas via.",
        "throttled-mailpassword": "Retpoŝto kun reŝargita pasvorto estis jam sendita ene de la {{PLURAL:$1|lasta horo|lastaj $1 horoj}}.\nPor preventi misuzon, nur unu reŝargita pasvorto estos sendita dum {{PLURAL:$1|horo|$1 horoj}}.",
        "mailerror": "Okazis eraro sendante retpoŝtaĵon: $1",
        "botpasswords-label-grants": "Uzeblaj permesdonoj:",
        "botpasswords-help-grants": "Ĉiu permesdono provizas aliron al listitaj uzantaj permisoj, kiujn uzantkonto jam havas. Vidu la [[Special:ListGrants|tabelon de permisdonoj]] por pli da informo.",
        "botpasswords-label-restrictions": "Limigoj de uzado:",
-       "botpasswords-label-grants-column": "Permisdonita",
+       "botpasswords-label-grants-column": "Permeso donita",
        "botpasswords-bad-appid": "La robota nomo \"$1\" estas malvalida.",
        "botpasswords-insert-failed": "Aldono de la robota nomo \"$1\" ne sukcesis. Ĉu ĝi jam estis aldonita?",
        "botpasswords-update-failed": "Ĝisdatigo de la robota nomo \"$1\" ne sukcesis. Ĉu ĝi estis forigita?",
        "botpasswords-updated-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis ĝisdatigita.",
        "botpasswords-deleted-title": "Robota pasvorto forigita",
        "botpasswords-deleted-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis forigita.",
-       "botpasswords-newpassword": "La nova pasvorto por ensaluti kun <strong>$1</strong> estas <strong>$2</strong>. <em>Bonvolu registri tiun por referenconto.",
+       "botpasswords-newpassword": "La nova pasvorto por ensaluti per <strong>$1</strong> estas <strong>$2</strong>. <em>Bonvolu noti ĝin por estonta konsultado.",
        "botpasswords-no-provider": "Robotopasvortensalutoprovizilo (''BotPasswordsSessionProvider'') maldisponeblas.",
-       "botpasswords-restriction-failed": "Limigoj pri robota pasvorto maleblas tiun uzantonomon.",
+       "botpasswords-restriction-failed": "Limigoj pri robota pasvorto malebligas tiun ensalutadon.",
        "botpasswords-invalid-name": "La difinita uzantnomo malenhavas la robotopasvortan disigilon (\"$1\").",
        "botpasswords-not-exist": "Uzanto \"$1\" ne havas robotopasvorton, kiu nomiĝas \"$2\".",
        "resetpass_forbidden": "Pasvortoj ne estas ŝanĝeblaj",
        "passwordreset-emailtext-user": "Uzanto $1 de {{SITENAME}} petis restarigo de via pasvorto por {{SITENAME}}\n($4). La {{PLURAL:$3|jena uzanto-konto estas asociita|jenaj uzanto-kontoj estas asociitaj}} kun ĉi tiu retpoŝtadreso:\n\n$2\n\nĈi {{PLURAL:$3|tiu provizora pasvorto|tiuj provizoraj pasvortoj}} findatiĝos {{PLURAL:$5|unu tagon|$5 tagojn}}.\nVi devas ensaluti kaj elekti novan pasvorton nun. Se iu alia petis ĉi tion,\naŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas ŝanĝi\nĝin, vi povas ignori ĉi tiun mesaĝon kaj uzi vian malnovan pasvorton.",
        "passwordreset-emailelement": "Salutnomo: \n$1\n\nProvizora pasvorto: \n$2",
        "passwordreset-emailsentemail": "Se tiu ĉu retpoŝta adreso estas kunligita kun via konto, tiam al ĉi tiu adreso estos sendita retpoŝto por renovigi pasvorton.",
-       "passwordreset-emailsentusername": "Se estas retpoŝta adreso, kiu estas asocigita kun tiu uzantnomo, tiam sendos retpôstan mesaĝon pri reasigno de pasvorto.",
+       "passwordreset-emailsentusername": "Se estas retpoŝta adreso, kiu estas asociita kun tiu uzantnomo, tiam ni sendos retpoŝtan mesaĝon pri reagordado de la pasvorto.",
        "passwordreset-emailsent-capture": "Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata malsupre.",
        "passwordreset-emailerror-capture": "Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al la {{GENDER:$2|uzanto}} malsukcesis: $1",
        "changeemail": "Ŝanĝi aŭ forigi retpoŝtadreson",
        "permissionserrors": "Eraro pri permeso",
        "permissionserrorstext": "Vi ne rajtas fari tion pro la {{PLURAL:$1|sekva kialo|sekvaj kialoj}}:",
        "permissionserrorstext-withaction": "Vi ne rajtas $2, pro la {{PLURAL:$1|jena kialo|jenaj kialoj}}:",
-       "contentmodelediterror": "Vi ne povas prilabori ĉi tiun reviziaĵo, ĉar ĝia enhavoŝablono estas <code>$1</code>, kiu malsamas la aktualan enhavoŝablonon de la paĝo <code>$2</code>.",
+       "contentmodelediterror": "Vi ne povas prilabori ĉi tiun version, ĉar ĝia enhavomodelo estas <code>$1</code>, kiu malsamas la aktualan enhavomodelon de la paĝo <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Averto: Vi rekreas paĝon, kiu estis antaŭe forigita.'''\n\nVi konsideru, ĉu konvenas daŭre redakti ĉi tiun paĝon.\nJen la protokolo de forigoj kaj alinomigado por via oportuno:",
        "moveddeleted-notice": "Ĉi tiu paĝo estis forigita.\nPliaj detaloj estas en protokolo pri forigado kaj alinomado de tiu ĉi paĝo.",
-       "moveddeleted-notice-recent": "Pardonon, tiu paĝo freŝdate estis forigita (en la dauro de la lasta 24 horoj).\nLa forigo kaj la movprotokolo pri la paĝo estas provizitaj sube por referenco.",
+       "moveddeleted-notice-recent": "Pardonon, tiu ĉi paĝo freŝdate estis forigita (en la daŭro de la lastaj 24 horoj).\nLa foriga kaj la nomŝanĝa protokoloj pri la paĝo estas provizitaj sube por referenco.",
        "log-fulllog": "Vidi kompletan protokolon",
        "edit-hook-aborted": "Redakto estis ĉesigita per etendaĵo de la Vikia softvaro.\nĜi ne donis eksplikon.",
        "edit-gone-missing": "Ne eblis ĝisdatigi la paĝon.\nVerŝajne ĝi estis forigita.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Malplena objeto",
        "content-json-empty-array": "Malplena tabelo",
-       "duplicate-args-warning": "'''Averto:''' [[:$1]] vokas je [[:$2]] kun pli ol unu valoro por la parametro \"$3\". Nur la lasta liverita valoro estas uzonta.",
+       "duplicate-args-warning": "'''Averto:''' [[:$1]] vokas al [[:$2]] kun pli ol unu valoro por la parametro \"$3\". Nur la lasta liverita valoro estos uzata.",
        "duplicate-args-category": "Paĝoj kun pluroblaj argumentoj en ŝablonvokoj",
        "duplicate-args-category-desc": "La paĝo enhavas uzon de ŝablono kun pluroble uzitaj argumentoj, kiel ekzemple <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> aŭ <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Averto: Ĉi tiu paĝo enhavas tro da multekostaj sintaksaj funkcio-vokoj.\n\nĜi havu malpli ol $2 {{PLURAL:$2|vokon|vokojn}}, sed nun estas $1 {{PLURAL:$1|voko|vokoj}}.",
        "revdelete-submit": "Apliki al {{PLURAL:$1|elektita revizio|elektitaj revizioj}}",
        "revdelete-success": "'''Revizivideblecon ĝisdatigis.'''",
        "revdelete-failure": "'''Videblecon de revizio ne eblis ĝisdatigi:'''\n$1",
-       "logdelete-success": "'''Protokolovideblecon ensignitan.'''",
+       "logdelete-success": "'''Protokolovidebleco agordita.'''",
        "logdelete-failure": "'''Protokola videbleco ne estis akordebla:'''\n$1",
        "revdel-restore": "Ŝanĝi videblecon",
        "pagehist": "Paĝa historio",
        "mergehistory-fail-invalid-source": "Fonta paĝo estas malvalida.",
        "mergehistory-fail-invalid-dest": "Cela paĝo estas malvalida.",
        "mergehistory-fail-no-change": "Historio-kunfandado kunfandis neniun revizion. Bonvolu rekontroli la paĝon kaj la tempo-parametrojn.",
-       "mergehistory-fail-permission": "Nesufiĉa permesoj por kunfadi historion.",
+       "mergehistory-fail-permission": "Nesufiĉaj permesoj por kunfandi historion.",
        "mergehistory-fail-self-merge": "Fonta kaj cela paĝoj samas.",
-       "mergehistory-fail-timestamps-overlap": "Fonta revizio surkunigas aŭ postokuras la celan revizion.",
+       "mergehistory-fail-timestamps-overlap": "Fontaj modifoj okazis dum aŭ post la celaj modifoj.",
        "mergehistory-fail-toobig": "Ne eblas kunigi historiojn ĉar pli ol sojlo de $1 {{PLURAL:$1|revizio|revizioj}} estus {{PLURAL:$1|movita|movitaj}}.",
        "mergehistory-no-source": "Fontpaĝo $1 ne ekzistas.",
        "mergehistory-no-destination": "Celpaĝo $1 ne ekzistas.",
        "search-category": "(kategorio $1)",
        "search-file-match": "(kongruas kun dosiera enhavo)",
        "search-suggest": "Ĉu vi intenciis: $1",
-       "search-rewritten": "Montru rezultojn por $1. Serĉita anstataŭ $2.",
+       "search-rewritten": "Ni montras rezultojn por $1. Serĉi anstataŭe pri $2.",
        "search-interwiki-caption": "Kunprojektoj",
        "search-interwiki-default": "Rezultoj de $1:",
        "search-interwiki-more": "(plu)",
        "prefs-help-recentchangescount": "Ĉi tiu inkluzivas lastajn ŝanĝojn, paĝajn historiojn, kaj protokolojn.",
        "prefs-help-watchlist-token2": "Tio estas la sekreta ŝlosilo al la retfluo de via atentaro.\nĈiu, kiu konas ĝin, povas legi vian atentaron. Do, ne kunhavigu ĝin.\nSe vi devas, [[Special:ResetTokens|vi povas rekomencigi ĝin]].",
        "savedprefs": "Viaj preferoj estas konservitaj.",
-       "savedrights": "La uzanto-rajtojn de {{GENDER:$1|$1}} konservigis.",
+       "savedrights": "La uzanto-rajtoj de {{GENDER:$1|$1}} estis konservitaj.",
        "timezonelegend": "Horzono:",
        "localtime": "Loka tempo:",
        "timezoneuseserverdefault": "Uzi defaŭlton de servilo ($1)",
        "right-createpage": "Kreu paĝojn (kiuj ne estas diskuto-paĝoj)",
        "right-createtalk": "Krei diskuto-paĝojn",
        "right-createaccount": "Krei novajn uzanto-kontojn",
-       "right-autocreateaccount": "Aŭtomate ensaluti eksteruzantan konton",
+       "right-autocreateaccount": "Aŭtomate ensaluti per ekstera uzokonto",
        "right-minoredit": "Marki redaktojn kiel etajn",
        "right-move": "Movi paĝojn",
        "right-move-subpages": "Alinomigi paĝojn kun ĝiaj subpaĝoj",
        "right-bigdelete": "Forigi paĝojn kun grandaj historioj",
        "right-deletelogentry": "Forigi kaj malforigi specifajn enmetojn en la registro.",
        "right-deleterevision": "Forigi kaj malforigi specifajn versiojn de paĝoj",
-       "right-deletedhistory": "Vidi forigitajn historieroj, sen ties asociaj tekstoj",
+       "right-deletedhistory": "Vidi forigitajn historierojn, sen iliaj ligita teksto",
        "right-deletedtext": "Rigardi forigitan tekston kaj ŝanĝojn inter forigitaj revizioj.",
        "right-browsearchive": "Serĉi forigitajn paĝojn",
        "right-undelete": "Restarigi paĝon",
        "grant-group-file-interaction": "Interagi aŭdvidaĵajn dosierojn",
        "grant-group-watchlist-interaction": "Interagi vian atentaron",
        "grant-group-email": "Sendi retpoŝton",
-       "grant-group-high-volume": "Efektivigi ampleksege aktivecon",
+       "grant-group-high-volume": "Efektivigi ampleksegajn agojn",
        "grant-group-customization": "Personecigoj kaj preferoj",
        "grant-group-administration": "Efektivigi administrajn agojn",
        "grant-group-other": "Diversaj aktivecoj",
        "grant-createeditmovepage": "Krei, redakti kaj alinomi paĝojn",
        "grant-delete": "Forigi paĝojn, reviziaĵojn kaj protokolerojn",
        "grant-editinterface": "Redakti la MediaVikian nomspacon kaj la CSS/Ĝavoskripto de uzanto",
-       "grant-editmycssjs": "Redakti vian uzantan CSS/Ĝavoskripton",
-       "grant-editmyoptions": "Redakti vian uzantan preferojn",
+       "grant-editmycssjs": "Redakti viajn personajn CSS-kodon / Ĝavoskripton",
+       "grant-editmyoptions": "Redakti viajn personajn agordojn",
        "grant-editmywatchlist": "Redakti vian atentaron",
        "grant-editpage": "Redakti ekzistantajn paĝojn",
        "grant-editprotected": "Redakti protektitajn paĝojn",
-       "grant-highvolume": "Ampleksegaj redaktado",
+       "grant-highvolume": "Ampleksega redaktado",
        "grant-oversight": "Kaŝi uzantojn kaj forigi reviziaĵojn",
        "grant-patrol": "Patroli ŝanĝojn al pâgoj",
        "grant-protect": "Protekti kaj malprotekti paĝojn",
-       "grant-rollback": "Malvalidi ŝanĝojn al paĝoj",
+       "grant-rollback": "Malfari ŝanĝojn de paĝoj",
        "grant-sendemail": "Retpoŝti al aliaj uzantoj",
        "grant-uploadeditmovefile": "Alŝuti, anstataŭigi kaj alinomi dosierojn",
        "grant-uploadfile": "Alŝuti novajn dosierojn",
        "rcshowhidemine": "$1 miajn redaktojn",
        "rcshowhidemine-show": "Montri",
        "rcshowhidemine-hide": "Kaŝi",
-       "rcshowhidecategorization": "$1 paĝokategoriadon",
+       "rcshowhidecategorization": "$1 paĝa enkategoriigo",
        "rcshowhidecategorization-show": "Montri",
        "rcshowhidecategorization-hide": "Kaŝi",
        "rclinks": "Montri $1 lastajn ŝanĝojn dum la $2 lastaj tagoj.<br />$3",
        "recentchangeslinked-summary": "Jen listo de ŝanĝoj faritaj lastatempe al paĝoj ligitaj el specifa paĝo (aŭ al membroj de specifa kategorio).\nPaĝoj en [[Special:Watchlist|via atentaro]] estas '''grasaj'''.",
        "recentchangeslinked-page": "Nomo de paĝo:",
        "recentchangeslinked-to": "Montru ŝanĝojn al paĝoj ligitaj al la specifa paĝo anstataŭe.",
-       "recentchanges-page-added-to-category": "[[:$1]] kategorialdonita",
+       "recentchanges-page-added-to-category": "[[:$1]] aldonita al la kategorio",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] kategorialdonita, [[Special:WhatLinksHere/$1|tiu paĝo estas inkluzivita ene de aliaj paĝoj]]",
        "recentchanges-page-removed-from-category": "[[:$1]] kategoriforigita",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] kategoriforigita, [[Special:WhatLinksHere/$1|tiu paĝo estas inkluzivita ene de aliaj paĝoj]]",
        "uploadscripted": "HTML-aĵo aŭ skriptokodaĵo troviĝas en tiu ĉi tiu dosiero, kiun TTT-foliumilo eble interpretus erare.",
        "upload-scripted-pi-callback": "Malalŝuteblas dosieron, kiu enhavas instrukcion de XML-stilfolia traktado",
        "uploaded-script-svg": "Trovis skriptelbero \"$1\" en la alŝutita SVGa dosiero.",
-       "uploaded-hostile-svg": "Trovis malsekura CSS en la stilero de alŝutita SVGa dosiero.",
+       "uploaded-hostile-svg": "Trovis malsekuran CSS-kodon en la stila elemento de alŝutita SVG-a dosiero.",
        "uploaded-event-handler-on-svg": "Ensigni eventotraktilajn atributojn <code>$1=\"$2\"</code> estas malpermisita en SVGaj dosieroj.",
        "uploaded-href-attribute-svg": "Atributoj je \"href\" en SVGaj dosieroj nur povas ligi al \"http://\" aŭ \"https://\" celoj, trovis  <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Trovis je \"href\" ligita al malsekuraj datenoj: URIa celo <code>&lt;$1 $2=\"$3\"&gt;</code> en la alŝuta SVGa dosiero.",
        "uploaded-setting-href-svg": "Uzi la markon je \"set\" por aldoni atributon je \"href\" al ujero estas blokita.",
        "uploaded-wrong-setting-svg": "Uzi la ''ensigni'' (''<span lang=\"en\">set</span>'') markon por aldoni foran/datenan/skriptan celon al ajn atributon estas blokita. Trovis <code>&lt;set to=\"$1\"&gt;</code> en la alŝutita SVGan dosieron.",
        "uploaded-setting-handler-svg": "SVGa dosiero kiu ensignas la traktilan atributon (''<span lang=\"en\">handler</span>'') kun fora/datena/skripta estas blokita. Trovis <code>$1=\"$2\"</code> en la alsûtita SVGa dosiero.",
-       "uploaded-remote-url-svg": "SVGa dosiero kiu ensignas ajn stilan atributon kun fora URL estas blokita. Trovis <code>$1=\"$2\"</code> en la alsûtita SVGa dosiero.",
+       "uploaded-remote-url-svg": "SVG-a dosiero kiu asignas ajnan stilan atributon kun fora URL estas blokita. Ni trovis <code>$1=\"$2\"</code> en la alsûtita SVG-a dosiero.",
        "uploaded-image-filter-svg": "Trovis bildan filtrilon kun URL:  <code>&lt;$1 $2=\"$3\"&gt;</code> en la alŝutita SVGa dosiero.",
        "uploadscriptednamespace": "Ĉi tiu SVG-dosiero enhavas nevalidan nomspacon \"$1\"",
        "uploadinvalidxml": "Ne eblas interpreti la XML-sintakson en la alŝutita dosiero",
        "upload-options": "Alŝutaj agordoj",
        "watchthisupload": "Atenti ĉi tiun dosieron",
        "filewasdeleted": "Dosiero de ĉi tiu nomo estis antaŭe alŝutita kaj poste forigita. Bonvolu kontroli en la $1 antaŭ alŝuti ĝin denove.",
-       "filename-thumb-name": "Ĉi tiu aspektas kiel titolo de etigita versio de plena bildo. Bonvolu ne alŝuti etigitajn versiojn de bildoj en la sama vikio. Alimaniere, bonvolu modifi la dosiernomon pli signife, kaj ne plu havas la eta-versian prefikson.",
+       "filename-thumb-name": "Ĉi tiu aspektas kiel titolo de etigita versio de plena bildo. Bonvolu ne alŝuti etigitajn versiojn de bildoj al la sama vikio. Alimaniere, bonvolu modifi la dosiernomon al pli signifa, kiu ne havas la eta-versian prefikson.",
        "filename-bad-prefix": "La nomo de la dosiero kiun vi alŝutas komencas kun '''\"$1\"''', kiu estas nepriskriba nomo ofte aŭtomate donata de ciferecaj fotiloj. Bonvolu elekti pli priskriban nomon por via bildo.",
        "upload-proto-error": "Malvalida protokolo",
        "upload-proto-error-text": "Fora alŝuto devas URL-on komence de <code>http://</code> aŭ <code>ftp://</code>.",
        "upload-form-label-infoform-name": "Nomo",
        "upload-form-label-infoform-name-tooltip": "Unika priskriba titolo por tiu ĉi dosiero, kiu servos kiel dosiernomo. Eblas uzi normalan lingvaĵon kun interspacoj. Ne aldonu la dosieran aldonaĵon.",
        "upload-form-label-infoform-description": "Priskribo",
-       "upload-form-label-infoform-description-tooltip": "Bonvolu koncize priskribi ĉion noteblan pri la verko.\nPor foto, menciu la esencaj aĵoj bildigitaj, la okazon, aŭ la lokon.",
+       "upload-form-label-infoform-description-tooltip": "Bonvolu koncize priskribi ĉion notindan pri la verko.\nPri foto, menciu la esencajn aĵojn bildigitajn, la okazon, aŭ la lokon.",
        "upload-form-label-usage-title": "Uzo",
        "upload-form-label-usage-filename": "Dosiernomo",
        "upload-form-label-own-work": "Tio estas mia propra laboro",
        "upload-form-label-not-own-work-message-local": "Se vi ne eblas alŝuti tiun dosieron respektante de politikoj de {{SITENAME}}, bonvolu fermi tiun dialogon kaj provi denove kun alia metodo.",
        "upload-form-label-not-own-work-local-local": "Vi eble ŝatu egale pravi [[Special:Upload|la defaŭltan paĝon]].",
        "upload-form-label-own-work-message-default": "Mi komprenas ke mi alŝutas tiun dosieron al komunigita deponejo. Mi konfirmas ke mi faras tiun respektante de la uzadtermoj kaj de la permisilopolitikoj tie.",
+       "upload-form-label-not-own-work-message-default": "Se vi ne eblas alŝuti tiun dosieron respektante de politikoj de komuna deponejo, bonvolu fermi tiun dialogon kaj provi denove kun alia metodo.",
        "backend-fail-stream": "Ne povis fluigi dosieron $1.",
        "backend-fail-backup": "Ne povis enarkivigi dosieron $1.",
        "backend-fail-notexists": "La dosiero $1 ne ekzistas.",
        "uploadstash-summary": "Tiu ĉi paĝo alirebligas la dosierojn alŝutitajn (aŭ alŝutatajn), kiuj ne jam estas publikigitaj per la vikio. Tiujn ĉi dosierojn ne povas vidi  iu ajn, krom la alŝutinto mem.",
        "uploadstash-clear": "Malplenigi la dosierkonversejon.",
        "uploadstash-nofiles": "Mankas dosieroj en la konservejo.",
-       "uploadstash-badtoken": "Malsukcesis tiu ago, eble pro tio ke viaj ensalutiloj senvalidiĝis. Bonvolu reprovi.",
+       "uploadstash-badtoken": "Malsukcesis tiu ago, eble pro tio ke viaj ensalutiloj eksvalidiĝis. Bonvolu reprovi.",
        "uploadstash-errclear": "Malsukcesis la forigo de la dosieroj.",
        "uploadstash-refresh": "Aktualigi la dosierliston.",
-       "uploadstash-thumbnail": "Vidi bildetigon",
+       "uploadstash-thumbnail": "Vidi bildeton",
        "invalid-chunk-offset": "Malvalida deŝovo de dosierpeco",
        "img-auth-accessdenied": "Atingo malpermisita",
        "img-auth-nopathinfo": "Mankas PATH_INFO (informo pri dosiervojo).\nVia servilo ne estas konfigurita por sendi ĉi tiun informon.\nEble ĝi estas CGI-bazita kaj ne subtenas img_auth.\nVidu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (angle).",
        "listfiles-latestversion-no": "Ne",
        "file-anchor-link": "Dosiero",
        "filehist": "Dosiera historio",
-       "filehist-help": "Klaku daton/tempon por vidi la dosieron kiel ĝin ŝajnitan tiame.",
+       "filehist-help": "Klaku daton/tempon por vidi la dosieron kia ĝi aspektis tiam.",
        "filehist-deleteall": "forigi ĉiujn",
        "filehist-deleteone": "forigi",
        "filehist-revert": "restarigi",
        "apisandbox-dynamic-parameters-add-label": "Aldoni parametron:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nomo de parametro",
        "apisandbox-dynamic-error-exists": "Parametro nomata \"$1\" jam ekzistas.",
+       "apisandbox-deprecated-parameters": "Evitindajn parametrojn",
+       "apisandbox-fetch-token": "Aŭtoplenigu ĵetonon",
        "apisandbox-submit-invalid-fields-title": "Iuj kampoj estas malvalidaj.",
+       "apisandbox-submit-invalid-fields-message": "Bonvolu ĝustigi la markitajn kampojn kaj provi denove.",
        "apisandbox-results": "Rezultoj",
+       "apisandbox-sending-request": "Sendanta aplikprograminterfacan peton…",
        "apisandbox-request-url-label": "Mendi URL-on.",
        "apisandbox-request-time": "Tempo de peto:{{PLURAL:$1|$1 ms}}",
        "booksources": "Librofontoj",
        "listgrouprights-namespaceprotection-header": "Nomspacaj restriktoj",
        "listgrouprights-namespaceprotection-namespace": "Nomspaco",
        "listgrouprights-namespaceprotection-restrictedto": "Rajtoj, kiuj permesas al uzanto redakti",
-       "listgrants": "Rajdonaro",
+       "listgrants": "Rajtoj donitaj",
        "trackingcategories": "Kategorioj por kontrolado",
        "trackingcategories-summary": "Ĉi tiu paĝo listigas kategoriojn por kontrolado, aŭtomate farita de la Mediavikia programaro. Ties nomoj estas ŝanĝebla, ŝanĝante la paran sistemmesaĝon en la nomspaco {{ns:8}}.",
        "trackingcategories-msg": "Kategorio pri kontrolado",
        "wlshowhideanons": "anonimaj uzantoj",
        "wlshowhidepatr": "patrolitaj redaktoj",
        "wlshowhidemine": "miaj redaktoj",
-       "wlshowhidecategorization": "paĝokategoriado",
+       "wlshowhidecategorization": "paĝa enkategoriigo.",
        "watchlist-options": "Opcioj por atentaro",
        "watching": "Aldonata al la atentaro...",
        "unwatching": "Malatentante...",
        "deleteprotected": "Vi ne povas forigi ĉi tiun paĝon ĉar ĝi estis protektita.",
        "deleting-backlinks-warning": "<strong>Atentigo:</strong>\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Aliaj paĝoj]] ligas al aŭ transkludas tiun ĉi forigotan paĝon.",
        "rollback": "Restarigi antaŭan redakton",
-       "rollbacklink": "malvalidi",
+       "rollbacklink": "malfari",
        "rollbacklinkcount": "nuligi $1 {{PLURAL:$1|redakton|redaktojn}}",
        "rollbacklinkcount-morethan": "nuligi pli ol $1 {{PLURAL:$1|redakton|redaktojn}}",
        "rollbackfailed": "Malfaro malsukcesis",
        "tooltip-watchlistedit-raw-submit": "Ĝisdatigi atentaron",
        "tooltip-recreate": "Rekrei la paĝon malgraŭ ĝi estis forigita",
        "tooltip-upload": "Ekalŝuti",
-       "tooltip-rollback": "\"Malvalidi\" malfaras redakto(j)n al ĉi tiu paĝo de la lasta kontribuanto per unu klako.",
+       "tooltip-rollback": "\"Malfari\" per unu klako nuligas redakto(j)n de la lasta kontribuanto al ĉi tiu paĝo.",
        "tooltip-undo": "\"Malfari\" malfaris ĉi tiun redakton kaj malfermas la redakto-paĝon en antaŭvida reĝimo. Permesas aldoni kialon en la resumo.",
        "tooltip-preferences-save": "Konservi preferojn",
        "tooltip-summary": "Enigu mallongan resumon",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "paĝo ankoraŭ ne ekzistas",
-       "mw-widgets-titleinput-description-redirect": "alidirektas al $1",
+       "mw-widgets-titleinput-description-redirect": "alidirekti al $1",
        "api-error-blacklisted": "Bonvolu elekti alian, priskriban titolon.",
        "sessionprovider-generic": "$1 seancoj",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "kuketaj seancoj",
index 04ac48b..296b22e 100644 (file)
                        "Transonlohk",
                        "Eloy",
                        "Lemondoge",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Indiralena"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "tog-ccmeonemails": "Recibir copias de los correos electrónicos que envíe a otros usuarios",
        "tog-diffonly": "No mostrar el contenido de la página debajo de la lista de diferencias",
        "tog-showhiddencats": "Mostrar categorías ocultas",
-       "tog-norollbackdiff": "Omitir la lista de diferencias después de revertir",
+       "tog-norollbackdiff": "No mostrar la lista de diferencias después de revertir",
        "tog-useeditwarning": "Avisarme cuando abandone una página en edición con cambios sin guardar",
        "tog-prefershttps": "Utilizar siempre conexiones seguras en mis sesiones",
        "underline-always": "Siempre",
index 158f11a..d60607c 100644 (file)
@@ -70,6 +70,7 @@
        "tog-watchdefault": "افزودن صفحه‌ها و پرونده‌هایی که ویرایش می‌کنم به فهرست پیگیری‌های من",
        "tog-watchmoves": "افزودن صفحه‌ها و پرونده‌هایی که منتقل می‌کنم به فهرست پی‌گیری‌های من",
        "tog-watchdeletion": "افزودن صفحات و پرونده‌هایی که حذف می‌کنم به فهرست پی‌گیری‌های من",
+       "tog-watchuploads": "افزودن پرونده‌های جدید به فهرست پیگیری من",
        "tog-watchrollback": "افزودن صفحاتی که واگردانی می‌کنم به فهرست پیگیری‌های من",
        "tog-minordefault": "علامت زدن همهٔ ویرایش‌ها به عنوان «جزئی» به طور پیش‌فرض",
        "tog-previewontop": "نمایش دادن پیش‌نمایش بالای جعبهٔ ویرایش",
        "minoredit": "این ویرایش، جزئی است",
        "watchthis": "پی‌گیری این صفحه",
        "savearticle": "صفحه ذخیره شود",
+       "publishpage": "انتشار صفحه",
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نمایش تغییرات",
        "tooltip-ca-nstab-category": "دیدن صفحهٔ رده",
        "tooltip-minoredit": "این ویرایش را ویرایش جزئی نشانه‌گذاری کن",
        "tooltip-save": "تغییرات خود را ذخیره کنید",
+       "tooltip-publish": "انتشار تغییراتتان",
        "tooltip-preview": "پیش‌نمایش تغییرات شما، لطفاً قبل از ذخیره کردن صفحه از این کلید استفاده کنید.",
        "tooltip-diff": "نمایش تغییراتی که شما در متن داده‌اید.",
        "tooltip-compareselectedversions": "دیدن تفاوت‌های دو نسخهٔ انتخاب‌شده از این صفحه",
        "confirmemail_body_set": "یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1,\nآدرس ایمیل حساب «$2» در {{SITENAME}} را به این آدرس تغییر داده است.\n\nبرای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ قابلیت ایمیل در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:\n\n$3\n\nاگر این حساب متعلق به شما نیست، پیوند زیر را باز تا تغییر آدرس ایمیل، لغو شود:\n\n$5\n\nاین تأییدیه در $4 منقضی می‌گردد.",
        "confirmemail_invalidated": "تأیید نشانی ایمیل لغو شد",
        "invalidateemail": "لغو تأیید نشانی ایمیل",
+       "notificationemail_subject_changed": "نشانی ایمیل ثبت شدهٔ {{SITENAME}} تغییر یافته است",
+       "notificationemail_subject_removed": "نشانی ایمیل ثبت شدهٔ {{SITENAME}} حذف شده است",
        "scarytranscludedisabled": "[تراگنجانش بین‌ویکیانه فعال نیست]",
        "scarytranscludefailed": "[فراخوانی الگو برای $1 میسر نشد]",
        "scarytranscludefailed-httpstatus": "[فراخوانی الگو برای $1 میسر نشد: خطای اچ‌تی‌تی‌پی $2]",
        "searchsuggest-containing": "صفحه‌های دربردارنده...",
        "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتباه (Bad token).",
+       "api-error-blocked": "شما از ویرایش بسته شده‌اید.",
        "api-error-copyuploaddisabled": "بارگذاری با استفاده از نشانی اینترنتی در این کارساز غیرفعال است.",
        "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت.",
        "api-error-duplicate-archive": "{{PLURAL:$1| پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
        "sessionprovider-nocookies": "کوکی‌ها ممکن است غیر فعال شده باشند. اطمینان کسب کنید که کوکی‌ها را فعال کرده‌اید و دوباره آغاز کنید.",
        "randomrootpage": "صفحهٔ ریشهٔ تصادفی",
        "log-action-filter-block": "نوع بسته شدن:",
+       "log-action-filter-contentmodel": "تغییر نوع contentmodel:",
        "log-action-filter-delete": "نوع حذف:",
        "log-action-filter-import": "نوع واردات",
        "log-action-filter-managetags": "نوع مدیریت",
        "log-action-filter-block-reblock": "تصحیح بلاک",
        "log-action-filter-block-unblock": "باز شدن",
        "log-action-filter-contentmodel-change": "تغییر نوع محتوا",
+       "log-action-filter-contentmodel-new": "ایجاد صفحه با contentmodel غیر استاندارد",
        "log-action-filter-delete-delete": "حذف صفحه",
        "log-action-filter-delete-restore": "احیای صفحه",
        "log-action-filter-delete-event": "حذف سیاهه",
        "log-action-filter-newusers-create2": "ایجاد شده توسط کاربر ثبت نام شده",
        "log-action-filter-newusers-autocreate": "ایجاد خودکار",
        "log-action-filter-newusers-byemail": "ایجاد پسورد با ارسال به ایمیل",
+       "log-action-filter-patrol-patrol": "گشت غیرخودکار",
        "log-action-filter-patrol-autopatrol": "گشت خودکار",
        "log-action-filter-protect-protect": "محافظت",
        "log-action-filter-protect-modify": "اصلاح حفاظت",
        "log-action-filter-suppress-event": "جلوگیری از ورود",
        "log-action-filter-suppress-revision": "جلوگیری از ویرایش",
        "log-action-filter-suppress-delete": "متوقف سازی صفحه",
+       "log-action-filter-suppress-block": "مخفی‌سازی کاربر با بستن",
+       "log-action-filter-suppress-reblock": "مخفی‌سازی کاربر با بستن مجدد",
        "log-action-filter-upload-upload": "بارگذاری جدید",
        "log-action-filter-upload-overwrite": "بارگذاری دوباره"
 }
index e5985c0..9788eb5 100644 (file)
                        "Gnangbade",
                        "Frigory",
                        "Lemondoge",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Yasten"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "tog-editsectiononrightclick": "Activer la modification des sections par un clic droit sur les titres de section",
        "tog-watchcreations": "Ajouter à ma liste de suivi les pages que je crée et les fichiers que j’importe",
        "tog-watchdefault": "Ajouter à ma liste de suivi les pages et les fichiers que je modifie",
-       "tog-watchmoves": "Ajouter à ma liste de suivi les pages et les fichiers que je renomme",
+       "tog-watchmoves": "Ajouter les pages et les fichiers que je déplace dans ma liste de suivi",
        "tog-watchdeletion": "Ajouter à ma liste de suivi les pages et les fichiers que je supprime",
        "tog-watchuploads": "Ajouter les nouveaux fichiers que j’importe à ma liste de suivi",
        "tog-watchrollback": "Ajouter à ma liste de suivi les pages sur lesquelles j’ai effectué une révocation",
        "tog-enotifusertalkpages": "M’avertir par courriel si ma page de discussion est modifiée",
        "tog-enotifminoredits": "M’avertir par courriel également lors des modifications mineures des pages ou des fichiers",
        "tog-enotifrevealaddr": "Afficher mon adresse électronique dans les courriels de notification",
-       "tog-shownumberswatching": "Afficher le nombre d’utilisateurs qui suivent la page",
+       "tog-shownumberswatching": "Afficher le nombre d’utilisateurs en cours",
        "tog-oldsig": "Signature existante :",
        "tog-fancysig": "Traiter la signature comme du wikitexte (sans lien automatique)",
        "tog-uselivepreview": "Utiliser l’aperçu rapide",
        "viewhelppage": "Voir la page d'aide",
        "categorypage": "Voir la page de catégorie",
        "viewtalkpage": "Voir la page de discussion",
-       "otherlanguages": "Autres langues",
+       "otherlanguages": "Dans d'autres langues",
        "redirectedfrom": "(Redirigé depuis $1)",
        "redirectpagesub": "Page de redirection",
        "redirectto": "Rediriger vers :",
        "confirmable-no": "Non",
        "thisisdeleted": "Désirez-vous afficher ou restaurer $1 ?",
        "viewdeleted": "Voir $1 ?",
-       "restorelink": "{{PLURAL:$1|la modification effacée|les $1 modifications effacées}}",
+       "restorelink": "{{PLURAL:$1|une modification effacée|$1 modifications effacées}}",
        "feedlinks": "Flux :",
-       "feed-invalid": "Type de flux invalide.",
+       "feed-invalid": "Type de flux invalide pour abonnement.",
        "feed-unavailable": "Les flux de syndication ne sont pas disponibles",
        "site-rss-feed": "Flux RSS de $1",
        "site-atom-feed": "Flux Atom de $1",
        "noemail": "Aucune adresse de courriel n’a été enregistrée pour l'utilisateur « $1 ».",
        "noemailcreate": "Vous devez fournir une adresse de courriel valide",
        "passwordsent": "Un nouveau mot de passe a été envoyé à l’adresse de courriel de l’utilisateur « $1 ».\nVeuillez vous reconnecter après l’avoir reçu.",
-       "blocked-mailpassword": "Votre adresse IP est bloquée pour la modification. Pour éviter les abus, il n’est pas autorisé d’utiliser la récupération de mot de passe à partir de cette adresse IP.",
+       "blocked-mailpassword": "Votre adresse IP est bloquée en modification. Pour éviter les abus, il n’est pas autorisé d’utiliser la récupération de mot de passe à partir de cette adresse IP.",
        "eauthentsent": "Un courriel de confirmation a été envoyé à l’adresse indiquée.\nAvant qu’un autre courriel ne soit envoyé à ce compte, vous devrez suivre les instructions du courriel et confirmer que le compte est bien le vôtre.",
        "throttled-mailpassword": "Un courriel de réinitialisation de votre mot de passe a déjà été envoyé durant {{PLURAL:$1|la dernière heure|les $1 dernières heures}}. \nAfin d’éviter les abus, un seul courriel de réinitialisation de votre mot de passe sera envoyé par {{PLURAL:$1|heure|intervalle de $1 heures}}.",
        "mailerror": "Erreur lors de l’envoi du courriel : $1",
        "changecontentmodel-success-text": "Le modèle de contenu de [[:$1]] a été modifié.",
        "changecontentmodel-cannot-convert": "Le contenu sur [[:$1]] n’a pas pu être converti en un type de $2.",
        "changecontentmodel-nodirectediting": "Le modèle de contenu $1 ne permet pas la modification directe",
+       "changecontentmodel-emptymodels-title": "Aucun modèle de contenu disponible",
+       "changecontentmodel-emptymodels-text": "Le contenu sur [[:$1]] ne peut être converti en aucun type.",
        "log-name-contentmodel": "Journal de modification de modèle de contenu",
        "log-description-contentmodel": "Événements relatifs aux modèles de contenu d’une page",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|a créé}} la page $3 en utilisant un modèle de contenu « $5 » autre que celui par défaut",
        "lockdbsuccesstext": "La base de données a été verrouillée.<br />\nN'oubliez pas de la [[Special:UnlockDB|déverrouiller]] lorsque vous aurez terminé votre opération de maintenance.",
        "unlockdbsuccesstext": "La base de données a été déverrouillée.",
        "lockfilenotwritable": "Le fichier de verrouillage de la base de données n'est pas inscriptible.\nPour bloquer ou débloquer la base de données, il doit être accessible par le serveur web.",
+       "databaselocked": "La base de données est déjà verrouillée.",
        "databasenotlocked": "La base de données n'est pas verrouillée.",
        "lockedbyandtime": "(par $1 le $2 à $3)",
        "move-page": "Renommer $1",
        "invalidateemail": "Annuler la confirmation de l'adresse de courriel",
        "notificationemail_subject_changed": "L’adresse courriel enregistrée sur {{SITENAME}} a été changée",
        "notificationemail_subject_removed": "L’adresse courriel enregistrée sur {{SITENAME}} a été supprimée",
-       "notificationemail_body_changed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1,\na changé l’adresse courriel associée au compte « $2 » sur {{SITENAME}}\nen « $3 ».\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
+       "notificationemail_body_changed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1, a changé l’adresse courriel\nassociée au compte « $2 » sur {{SITENAME}} en « $3 ».\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
        "notificationemail_body_removed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1,\na suprrimé l’adresse courriel associée au compte « $2 » sur {{SITENAME}}.\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
        "scarytranscludedisabled": "[La transclusion interwiki est désactivée]",
        "scarytranscludefailed": "[La récupération de modèle a échoué pour $1]",
        "api-error-nomodule": "Erreur interne : aucun module de versement défini.",
        "api-error-ok-but-empty": "Erreur interne : Le serveur n'a pas répondu.",
        "api-error-overwrite": "Écraser un fichier existant n'est pas autorisé.",
-       "api-error-ratelimited": "Vous essayez de télécharger plus de fichiers dans un court espace de temps que ce que ce wiki autorise.\nVeuillez réessayer dans quelques minutes.",
+       "api-error-ratelimited": "Vous essayez de téléverser plus de fichiers dans un court espace de temps que ce que ce wiki peut accepter.\nVeuillez réessayer dans quelques minutes.",
        "api-error-stashfailed": "Erreur interne : le serveur n'a pas pu enregistrer le fichier temporaire.",
        "api-error-publishfailed": "Erreur interne : Le serveur n'a pas pu publier le fichier temporaire.",
        "api-error-stasherror": "Une erreur s'est produite lors du téléchargement du fichier pour le dissimuler.",
index 1d60303..6499e8e 100644 (file)
        "changecontentmodel-success-text": "O tipo de contido de [[:$1]] foi modificado.",
        "changecontentmodel-cannot-convert": "O contido en [[:$1]] non pode converterse ó tipo de $2.",
        "changecontentmodel-nodirectediting": "O modelo de contido $1 non permite a modificación directa",
+       "changecontentmodel-emptymodels-title": "Non hai modelos de contido dispoñibles",
+       "changecontentmodel-emptymodels-text": "O contido de [[:$1]] non pode converterse a ningún tipo.",
        "log-name-contentmodel": "Rexistro de cambios de modelo de contido",
        "log-description-contentmodel": "Eventos relacinados cos modelos de contido dunha páxina",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creou}} a páxina $3 usando un modelo de contido non predeterminado \"$5\"",
        "lockdbsuccesstext": "Pechouse a base de datos.<br />\nLembre [[Special:UnlockDB|eliminar o bloqueo]] unha vez completado o seu mantemento.",
        "unlockdbsuccesstext": "A base de datos foi desbloqueada.",
        "lockfilenotwritable": "Non se pode escribir no ficheiro de bloqueo da base de datos. Para bloquear ou desbloquear a base de datos, o servidor web ten que poder escribir neste ficheiro.",
+       "databaselocked": "A base de datos xa está bloqueada.",
        "databasenotlocked": "A base de datos non está bloqueada.",
        "lockedbyandtime": "(por $1 o $2 ás $3)",
        "move-page": "Mover \"$1\"",
index ad9c253..a56f74a 100644 (file)
        "newpassword": "Novem gupitutor:",
        "retypenew": "Novem gupitutor portun boroi:",
        "resetpass_submit": "Gupitutor tharai ani sotrorombh kor",
-       "changepassword-success": "Tujem gupitutor bodlop yoshosvi tharlam.",
+       "changepassword-success": "Tujem gupitutor bodol'lam!",
        "resetpass_forbidden": "Gupitutram bodlunk zaina",
        "resetpass-submit-loggedin": "Gupitutoor bodol",
        "resetpass-submit-cancel": "Roddh kor",
index 7415fe4..1abe8a9 100644 (file)
@@ -39,7 +39,7 @@
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "tog-hideminor": "הסתרת עריכות משניות בדף השינויים האחרונים",
-       "tog-hidepatrolled": "×\94סתרת ×©×\99× ×\95×\99×\99×\9d ×\91×\93×\95ק×\99×\9d בדף השינויים האחרונים",
+       "tog-hidepatrolled": "×\94סתרת ×¢×¨×\99×\9b×\95ת ×\91×\93×\95ק×\95ת בדף השינויים האחרונים",
        "tog-newpageshidepatrolled": "הסתרת דפים בדוקים ברשימת הדפים החדשים",
        "tog-hidecategorization": "הסתרת שינויים בקטגוריות של דפים",
        "tog-extendwatchlist": "הרחבת רשימת המעקב כך שתציג את כל השינויים, לא רק את השינויים האחרונים בכל דף",
@@ -77,7 +77,7 @@
        "tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דוא\"ל ששלחתי למשתמשים אחרים",
        "tog-diffonly": "ביטול הצגת תוכן הדף מתחת להשוואת הגרסאות",
        "tog-showhiddencats": "הצגת קטגוריות מוסתרות",
-       "tog-norollbackdiff": "×\94ש×\9e×\98ת ההבדלים בין הגרסאות לאחר ביצוע שחזור",
+       "tog-norollbackdiff": "×\9c×\90 ×\9c×\94צ×\99×\92 ×\90ת ההבדלים בין הגרסאות לאחר ביצוע שחזור",
        "tog-useeditwarning": "הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו",
        "tog-prefershttps": "תמיד להשתמש בתקשורת מאובטחת לאחר הכניסה לחשבון",
        "underline-always": "תמיד",
        "edit-no-change": "המערכת התעלמה מעריכתך כיוון שלא נעשה שינוי בטקסט.",
        "postedit-confirmation-created": "הדף נוצר.",
        "postedit-confirmation-restored": "הדף שוחזר.",
-       "postedit-confirmation-saved": "ער×\99×\9bתך נשמרה.",
+       "postedit-confirmation-saved": "×\94ער×\99×\9b×\94 ×©×\9cך נשמרה.",
        "edit-already-exists": "לא ניתן ליצור דף חדש.\nהוא כבר קיים.",
        "defaultmessagetext": "טקסט ההודעה המקורי",
        "content-failed-to-parse": "פענוח $2 כתוכן מסוג $1 נכשל: $3",
        "ntransclusions": "בשימוש {{PLURAL:$1|בדף אחד|ב־$1 דפים}}",
        "specialpage-empty": "אין תוצאות.",
        "lonelypages": "דפים יתומים",
-       "lonelypagestext": "×\94×\93פ×\99×\9d ×\94×\91×\90×\99×\9d ×\90×\99× ×\9d ×\9eק×\95שר×\99×\9d ×\9e×\93פ×\99×\9d ×\90×\97ר×\99×\9d ×\91×\90תר ×\96×\94 ×\95×\90×\99× ×\9d ×\9e×\95×\9b×\9c×\9c×\99×\9d ×\91×\94×\9d.",
+       "lonelypagestext": "×\94×\93פ×\99×\9d ×\94×\91×\90×\99×\9d ×\90×\99× ×\9d ×\9eק×\95שר×\99×\9d ×\95×\90×\99× ×\9d ×\9e×\95×\9b×\9c×\9c×\99×\9d ×\91×\93פ×\99×\9d ×\90×\97ר×\99×\9d ×\91×\90תר {{SITENAME}}.",
        "uncategorizedpages": "דפים חסרי קטגוריה",
        "uncategorizedcategories": "קטגוריות חסרות קטגוריה",
        "uncategorizedimages": "קבצים חסרי קטגוריה",
        "deadendpages": "דפים ללא קישורים",
        "deadendpagestext": "הדפים הבאים אינם מקשרים לדפים אחרים באתר {{SITENAME}}.",
        "protectedpages": "דפים מוגנים",
-       "protectedpages-indef": "×\94×\92× ×\95ת ×\9c×\96×\9e×\9f ×\91×\9cת×\99 ×\9e×\95×\92×\91×\9c בלבד",
+       "protectedpages-indef": "×\94×\92× ×\95ת ×\9c×\9c×\90 ×\94×\92×\91×\9cת ×\96×\9e×\9f בלבד",
        "protectedpages-summary": "בדף זה רשומים הדפים הקיימים שמוגנים כרגע. לרשימת הכותרות שמוגנות מפני יצירה, ראו [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "הגנות מדורגות בלבד",
        "protectedpages-noredirect": "הסתרת הפניות",
        "protectedpages-page": "דף",
        "protectedpages-expiry": "זמן פקיעה",
        "protectedpages-performer": "הוגן על־ידי",
-       "protectedpages-params": "פר×\9e×\98ר×\99×\9d ×\9cהגנה",
+       "protectedpages-params": "ר×\9eת ×\94הגנה",
        "protectedpages-reason": "סיבה",
        "protectedpages-submit": "הצגת דפים",
        "protectedpages-unknown-timestamp": "לא ידוע",
        "emailccsubject": "העתק של הודעתך למשתמש $1: $2",
        "emailsent": "הדואר נשלח",
        "emailsenttext": "הודעת הדואר האלקטרוני שלך נשלחה.",
-       "emailuserfooter": "$1 {{GENDER:$1|ש×\9c×\97|ש×\9c×\97×\94}} ×\90ת ×\94×\93×\95×\90\"×\9c ×\94×\96×\94 ×\9c{{GRAMMAR:ת×\97×\99×\9c×\99ת|$2}} ×\91×\90×\9eצע×\95ת ×¤×¢×\95×\9cת \"{{int:emailuser}}\" ב{{GRAMMAR:תחילית|{{SITENAME}}}}.",
+       "emailuserfooter": "$1 {{GENDER:$1|ש×\9c×\97|ש×\9c×\97×\94}} ×\90ת ×\94×\93×\95×\90\"×\9c ×\94×\96×\94 ×\9c{{GRAMMAR:ת×\97×\99×\9c×\99ת|$2}} ×\91×\90×\9eצע×\95ת ×\94ת×\9b×\95× ×\94 \"{{int:emailuser}}\" ב{{GRAMMAR:תחילית|{{SITENAME}}}}.",
        "usermessage-summary": "השארת הודעת מערכת.",
        "usermessage-editor": "שולח הודעות המערכת",
        "watchlist": "רשימת המעקב",
        "changecontentmodel-submit": "שינוי",
        "changecontentmodel-success-title": "מודל התוכן שוּנה",
        "changecontentmodel-success-text": "מודל התוכן של [[:$1]] שוּנה.",
-       "changecontentmodel-cannot-convert": "×\94ת×\95×\9b×\9f ×\91×\93×£ [[:$1]] ×\90×\99× ×\95 ×\99×\9b×\95×\9c ×\9c×\94×\99×\95ת ×\9e×\95×\9eר ×\9cס×\95×\92 ×©×\9c $2.",
+       "changecontentmodel-cannot-convert": "×\9c×\90 × ×\99ת×\9f ×\9c×\94×\9e×\99ר ×\90ת ×\94ת×\95×\9b×\9f ×©×\9c [[:$1]] ×\9cס×\95×\92 $2.",
        "changecontentmodel-nodirectediting": "מודל התוכן $1 אינו תומך בעריכה ישירה",
+       "changecontentmodel-emptymodels-title": "לא קיים מודל תוכן מתאים",
+       "changecontentmodel-emptymodels-text": "לא ניתן להמיר את התוכן של [[:$1]] לאף סוג.",
        "log-name-contentmodel": "יומן שינויי מודל תוכן",
        "log-description-contentmodel": "אירועים שקשורים למודל תוכן של דפים",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|יצר|יצרה}} את הדף $3 תוך שימוש במודל התוכן \"$5\" השונה ממודל ברירת המחדל",
        "protect-level-autoconfirmed": "רק משתמשים ותיקים מורשים",
        "protect-level-sysop": "רק מפעילי מערכת מורשים",
        "protect-summary-cascade": "מדורג",
-       "protect-expiring": "פוקעת $1 (UTC)",
-       "protect-expiring-local": "פוקעת $1",
+       "protect-expiring": "פוקעת ב{{GRAMMAR:תחילית|$1}} (UTC)",
+       "protect-expiring-local": "פוקעת ב{{GRAMMAR:תחילית|$1}}",
        "protect-expiry-indefinite": "בלתי מוגבלת בזמן",
        "protect-cascade": "הגנה על כל הדפים המוכללים בדף זה (הגנה מדורגת)",
        "protect-cantedit": "אין באפשרותך לשנות את רמת ההגנה על דף זה כיוון שאין לך הרשאה לערוך אותו.",
        "protect-edit-reasonlist": "עריכת סיבות ההגנה",
        "protect-expiry-options": "שעה:1 hour,יום:1 day,שבוע:1 week,שבועיים:2 weeks,חודש:1 month,שלושה חודשים:3 months,שישה חודשים:6 months,שנה:1 year,זמן בלתי מוגבל:infinite",
        "restriction-type": "הרשאה:",
-       "restriction-level": "ר×\9eת ×\94×\94×\92×\91×\9cה:",
+       "restriction-level": "ר×\9eת ×\94×\94×\92× ה:",
        "minimum-size": "גודל מינימלי",
        "maximum-size": "גודל מרבי:",
        "pagesize": "(בבתים)",
        "blocklist-rangeblocks": "הסתרת חסימות טווחים",
        "blocklist-timestamp": "זמן",
        "blocklist-target": "יעד",
-       "blocklist-expiry": "פקיעה",
+       "blocklist-expiry": "×\96×\9e×\9f ×¤×§×\99×¢×\94",
        "blocklist-by": "מפעיל חוסם",
        "blocklist-params": "הגדרות חסימה",
        "blocklist-reason": "סיבה",
        "ipblocklist-submit": "חיפוש",
        "ipblocklist-localblock": "חסימה מקומית",
        "ipblocklist-otherblocks": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
-       "infiniteblock": "×\91×\9cת×\99 ×\9e×\95×\92×\91×\9c ×\91זמן",
-       "expiringblock": "פ×\95קע ×\91Ö¾$2, $1",
+       "infiniteblock": "×\9c×\9c×\90 ×\94×\92×\91×\9cת זמן",
+       "expiringblock": "×\94×\97ס×\99×\9e×\94 ×¤×\95קעת ×\91{{GRAMMAR:ת×\97×\99×\9c×\99ת|$1}} ×\91שע×\94 $2",
        "anononlyblock": "משתמשים אנונימיים בלבד",
        "noautoblockblock": "חסימה אוטומטית מבוטלת",
        "createaccountblock": "יצירת חשבונות נחסמה",
        "lockdbsuccesstext": "בסיס הנתונים ננעל.<br />\nיש לזכור [[Special:UnlockDB|לשחרר את הנעילה]] לאחר שפעולת התחזוקה תסתיים.",
        "unlockdbsuccesstext": "שוחררה הנעילה של בסיס הנתונים",
        "lockfilenotwritable": "קובץ נעילת בסיס הנתונים אינו ניתן לכתיבה. כדי שאפשר יהיה לנעול את בסיס הנתונים או לבטל את נעילתו, שרת האינטרנט צריך לקבל הרשאות לכתוב אליו.",
+       "databaselocked": "בסיס הנתונים כבר נעול.",
        "databasenotlocked": "בסיס הנתונים אינו נעול.",
        "lockedbyandtime": "(על־ידי $1 ב־$3, $2)",
        "move-page": "העברת $1",
index 0d18acc..ac588bf 100644 (file)
                        "Adam-Yourist"
                ]
        },
-       "tog-underline": "Ð¥Ñ\8cожадеÑ\80га |ок|алÑ\82акадар:",
-       "tog-hideminor": "Ð¥Ñ\8cаÑ\82|аÑ\8fздаÑ\80а Ñ\87Ñ\83 ÐºÐµÑ\80даÑ\87а Ñ\85Ñ\83вÑ\86амаÑ\88a Ð·|амига Ð´Ð¾Ð»Ð° Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÑ\8aайладаккÑ\85а",
-       "tog-hidepatrolled": "Ð¥Ñ\8cаÑ\82|аÑ\8fздаÑ\80а Ñ\87Ñ\83 ÐºÐµÑ\80даÑ\87а Ñ\85Ñ\83вÑ\86амаÑ\88a Ð´|анийÑ\81адаÑ\8c Ð´Ð¾Ð»Ð° Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÑ\8aайладаккÑ\85а",
-       "tog-newpageshidepatrolled": "Ð¥Ñ\8cаÑ\82|аÑ\8fздаÑ\80а Ñ\87Ñ\83 ÐºÐµÑ\80даÑ\87а Ñ\85Ñ\83вÑ\86амаÑ\88a Ñ\85Ñ\8cанийÑ\81адаÑ\8c Ð´Ð¾Ð»Ð° Ð¾Ð°Ð³|онаÑ\88 ÐºÑ\8aайлаÑ\8fккÑ\85а",
-       "tog-hidecategorization": "Къайлаяккха оагӀонай категореш",
-       "tog-extendwatchlist": "ШеÑ\80адаÑ\8c Ñ\82еÑ\80кама Ñ\85Ñ\8cаÑ\82|аÑ\8fздаÑ\80, Ð¼Ð°Ñ\81Ñ\81адола Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\87Ñ\83лоаÑ\86аÑ\88 Ð´Ð¾Ð»Ð°, Ð°Ð»Ñ\85Ñ\85а Ñ\82|еÑ\85Ñ\8cаÑ\80а Ð´Ð°Ñ\8cÑ\80аÑ\88 Ð¼Ð°Ñ\80а Ð° Ð´Ð¾Ð°Ñ\86аÑ\88",
+       "tog-underline": "ТIаÑ\85Ñ\8cожаÑ\8fÑ\80га ÐºIала Ñ\82ака Ñ\85Ñ\8cакÑ\85ар:",
+       "tog-hideminor": "Ð\9aÑ\8aайладаккÑ\85а Ð·|амига Ð´Ð¾Ð»Ð° Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÐµÑ\80да Ñ\85Ñ\83вÑ\86амаÑ\88Ñ\82а Ñ\8eкÑ\8aеÑ\80а",
+       "tog-hidepatrolled": "Ð\9aÑ\8aайладаккÑ\85а Ñ\85а Ð´ÐµÑ\80а Ñ\87акÑ\85даÑ\8cнна Ð´Ð¾Ð»Ð° Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÐµÑ\80да Ñ\85Ñ\83вÑ\86амаÑ\88Ñ\82а Ñ\8eкÑ\8aеÑ\80а",
+       "tog-newpageshidepatrolled": "Ð\9aÑ\8aайлаÑ\8fÑ\8cккÑ\85а Ñ\85а Ð´ÐµÑ\80а Ñ\87акÑ\85Ñ\8aÑ\8fнна Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IонаÑ\88 ÐºÐµÑ\80да Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ñ\8eкÑ\8aеÑ\80а",
+       "tog-hidecategorization": "Къайлаяха оагӀонай категореш",
+       "tog-extendwatchlist": "Ð¥Ñ\8cаÑ\88еÑ\80Ñ\8aÑ\8fÑ\8c Ð¹Ð¾Ð»Ð° Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\81пиÑ\81ок, Ð¼Ð°Ñ\81Ñ\81адола Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\88е Ñ\87Ñ\83лоаÑ\86аÑ\88, Ñ\82|еÑ\85Ñ\8cаÑ\80а Ð´Ð°Ñ\8c Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85инна Ñ\86а IеÑ\88.",
        "tog-usenewrc": "Керда хувцамашка а хьат|аяздара зембаккхарга а эргадаккхараш тоабаде (JavaScript эша)",
        "tog-numberheadings": "Керташкашта аланза таьрахьа хотта",
        "tog-showtoolbar": "Г|алатнийcдара г|ирсагартакх хьахьокха (JavaScript)",
        "category_header": "«$1» категори чура оагIонаш",
        "subcategories": "Чуракатагаш",
        "category-media-header": "\"$1\" Категори чура файлаш",
-       "category-empty": "''УкÑ\85 ÐºÐ°Ñ\82ага Ñ\87Ñ\83 Ñ\86Ñ\85Ñ\8cаккÑ\85а Ð¾Ð°Ð³|онаÑ\88 Ðµ Ð¿Ð°Ñ\8cлаÑ\88 Ñ\8fÑ\86.''",
+       "category-empty": "''Ð\95Ñ\80 ÐºÐ°Ñ\82егоÑ\80и Ñ\85Ó\80анза Ñ\8fÑ\8cÑ\81Ñ\81а Ñ\8f (Ñ\86Ñ\85Ñ\8cаккÑ\85а Ð¾Ð°Ð³IонаÑ\88 Ðµ Ñ\84айлаÑ\88 Ð¹Ð¾Ð°Ñ\86аÑ\88).''",
        "hidden-categories": "{{PLURAL:$1|1=Къайла категори|Къайла категореш}}",
-       "hidden-category-category": "Ð\9aÑ\8aайла ÐºÐ°Ñ\82агаш",
-       "category-subcat-count": "{{PLURAL:$2|УкÑ\85 ÐºÐ°Ñ\82агa Ñ\82|еÑ\85Ñ\8cаÑ\80а Ð±Ñ\83Ñ\85каÑ\82аг Ñ\87Ñ\83лоаÑ\86.|{{PLURAL:$1|1=$1 Ð±Ñ\83Ñ\85каÑ\82аг Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\8f|$1 Ð±Ñ\83Ñ\85каÑ\82агаÑ\88 Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\8f}} $2 Ð¹Ð¾Ð»Ð°Ñ\87аÑ\80ex.}}",
-       "category-subcat-count-limited": "УкÑ\85 ÐºÐ°Ñ\82агa Ñ\87Ñ\83 {{PLURAL:$1|1=$1 Ðº|алкаÑ\82аг|$1 Ðº|алкаÑ\82агаÑ\88}}.",
-       "category-article-count": "{{PLURAL:$2|УкÑ\85 ÐºÐ°Ñ\82ага Ñ\86Ñ\85Ñ\8cа Ð¾Ð°Ð³|Ñ\83в Ð¼Ð°Ñ\80а Ñ\87Ñ\83лоаÑ\86аÑ\86.|{{PLURAL:$1|1=$1 Ð¾Ð°Ð³|Ñ\83в Ñ\85Ñ\8cаÑ\85екÑ\85а Ñ\8f|$1 Ð¾Ð°Ð³|oнаÑ\88 Ñ\85Ñ\8cаÑ\85екÑ\85а Ñ\8f}} Ñ\83кÑ\85 ÐºÐ°Ñ\82ага $2 Ð¹Ð¾Ð»Ð°Ñ\87аÑ\80\85.}}",
-       "category-article-count-limited": "УкÑ\85 ÐºÐ°Ñ\82ага Ñ\87Ñ\83 {{PLURAL:$1|1=$1 Ð¾Ð°Ð³|Ñ\83в|$1 Ð¾Ð°Ð³|oнаÑ\88}}.",
+       "hidden-category-category": "Ð\9aÑ\8aайла ÐºÐ°Ñ\82егоÑ\80еш",
+       "category-subcat-count": "{{PLURAL:$2|УкÑ\85 ÐºÐ°Ñ\82егоÑ\80и Ñ\87Ñ\83 Ñ\8f Ñ\83кÑ\85ан ÐºIалÑ\85аÑ\80а ÐºÐ°Ñ\82егоÑ\80и.|УкÑ\85 ÐºÐ°Ñ\82егоÑ\80и Ñ\87Ñ\83 Ñ\8f $1 {{PLURAL:$1|кIалÑ\85аÑ\80а ÐºÐ°Ñ\82егоÑ\80и|кIалÑ\85аÑ\80а ÐºÐ°Ñ\82егоÑ\80еÑ\88}} $2 Ð¼Ð°Ñ\81Ñ\81айолÑ\87аÑ\80еÑ\85.}}",
+       "category-subcat-count-limited": "УкÑ\85 ÐºÐ°Ñ\82егоÑ\80и Ñ\87Ñ\83 {{PLURAL:$1|кIалÑ\85аÑ\80а ÐºÐ°Ñ\82егоÑ\80и|$1 ÐºIалÑ\85аÑ\80а ÐºÐ°Ñ\82егоÑ\80еÑ\88}} Ñ\8f.",
+       "category-article-count": "{{PLURAL:$2|УкÑ\85 ÐºÐ°Ñ\82егоÑ\80и Ñ\87Ñ\83 Ñ\86аI Ð¼Ð°Ñ\80а Ð¾Ð°Ð³IÑ\83в Ñ\8fÑ\86.|УкÑ\85 ÐºÐ°Ñ\82егоÑ\80и Ñ\87Ñ\83 Ñ\8f $2 Ð¾Ð°Ð³Ó\80Ñ\83в, Ñ\86аÑ\80еÑ\85 Ð¾Ð°Ð³Ó\80онгаÑ\85Ñ\8c {{PLURAL:$1|Ñ\85Ñ\8cагойÑ\82а $1 Ð¾Ð°Ð³Ó\80Ñ\83в}}}}",
+       "category-article-count-limited": "УкÑ\85 ÐºÐ°Ñ\82егоÑ\80и Ñ\87Ñ\83 {{PLURAL:$1|$1 Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\8f|1=Ñ\86аI Ð¾Ð°Ð³Ó\80Ñ\83в Ð¼Ð°Ñ\80а Ñ\8fÑ\86}}.",
        "category-file-count": "{{PLURAL:$2|Укх катагори чу цаI мара файл яц.|{{PLURAL:$1|1=$1 файл хьахьокхаш я|$1 файл хьахьокхаш я}} укх категори $2 долачарeх.}}",
-       "category-file-count-limited": "УкÑ\85 ÐºÐ°Ñ\82ага Ñ\87Ñ\83 {{PLURAL:$1|1=$1 Ð»Ñ\83Ñ\80даÑ\80|$1 Ð»Ñ\83Ñ\80даÑ\80аÑ\88}}.",
+       "category-file-count-limited": "УкÑ\85 ÐºÐ°Ñ\82егоÑ\80и Ñ\87Ñ\83 {{PLURAL:$1|$1 Ñ\84айл|$1 Ñ\84айлаÑ\88|1=Ñ\86аI Ð¼Ð°Ñ\80а Ñ\84айл Ñ\8fÑ\86}}.",
        "listingcontinuesabbrev": "(дIахо)",
-       "index-category": "Ð\94|аÑ\85Ñ\8cожама Ð¾Ð°Ð³|онаш",
-       "noindex-category": "Ð\94|аÑ\85Ñ\8cожаманза Ð¾Ð°Ð³|онаш",
-       "broken-file-category": "Ð\9fаÑ\8cла Ñ\85Ñ\8cожадеÑ\80гаÑ\88Ñ\86а Ð±Ð¾Ð»Ñ\85беÑ\88 Ð¹Ð¾Ð°Ñ\86а Ð¾Ð°Ð³|онаш",
-       "about": "Ð\9bоаÑ\86ам",
+       "index-category": "Ð\98ндекÑ\81 Ð¾Ñ\82Ñ\82аеÑ\88 Ð¾Ð°Ð³Iонаш",
+       "noindex-category": "Ð\98ндекÑ\81 Ñ\86а Ð¾Ñ\82Ñ\82аеÑ\88 Ð¾Ð°Ð³Iонаш",
+       "broken-file-category": "Файла Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80гаÑ\88 Ð±Ð¾Ð»Ñ\85беÑ\88 Ð¹Ð¾Ð°Ñ\86а Ð¾Ð°Ð³Iонаш",
+       "about": "СÑ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80",
        "article": "Йоазув",
-       "newwindow": "(кердача коре)",
+       "newwindow": "&nbsp;(керда кора чу)",
        "cancel": "Эшац",
-       "moredotdotdot": "Д|ахо",
-       "morenotlisted": "Ер |ояздар хьалдиззанз да.",
-       "mypage": "Oаг|ув",
-       "mytalk": "Дувцам",
-       "anontalk": "Дувцар",
+       "moredotdotdot": "ДIахо...",
+       "morenotlisted": "Ер список хьалйиза яц.",
+       "mypage": "ОагIув",
+       "mytalk": "Дувца оттадар",
+       "anontalk": "Дувца оттадар",
        "navigation": "Навигаци",
        "and": "&#32;а",
        "qbfind": "Лахар",
-       "qbbrowse": "Б|аргтасса",
-       "qbedit": "Ð¥Ñ\83вÑ\86а",
-       "qbpageoptions": "Оаг|он оттамаш",
+       "qbbrowse": "БIаргтохар",
+       "qbedit": "Ð\9dиÑ\81Ñ\8aе",
+       "qbpageoptions": "ОагIон оттамаш",
        "qbmyoptions": "Са оттамаш",
        "faq": "КТХ",
        "faqpage": "Project:КТХ",
-       "actions": "Ð¥|амдаÑ\80аш",
+       "actions": "Ð\90Ñ\80дамаш",
        "namespaces": "ЦIерий мотташ",
-       "variants": "Ð\9aеÌ\81паш",
+       "variants": "Ð\92аÑ\80ианÑ\82аш",
        "navigation-heading": "Навигацен меню",
-       "errorpagetitle": "Г|алат",
-       "returnto": "цу $1 оаг|он т|а юхаг|о",
+       "errorpagetitle": "ГӀалат",
+       "returnto": "Укх $1 оагIона тIа юхагӀо.",
        "tagline": "Кечал укхазара: {{grammar:genitive|{{SITENAME}}}}",
-       "help": "Ð\93Ó\80о",
+       "help": "Ð\9dовкÑ\8a\81Ñ\82ал",
        "search": "Лахаp",
        "searchbutton": "Хьалáха",
-       "go": "Дехьа г|о",
+       "go": "Дехьавала",
        "searcharticle": "Дехьавала",
        "history": "Истори",
        "history_short": "Истори",
-       "updatedmarker": "Со Ñ\85анаÑ\87а Ð´ÐµÐ½Ñ\86а Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85иннaд",
+       "updatedmarker": "Со Ñ\82IеÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\83кÑ\85аз Ñ\85иннаÑ\87Ñ\83л Ñ\82IеÑ\85Ñ\8cагIа ÐºÐµÑ\80дадаÑ\8cккÑ\85ад",
        "printableversion": "Зарба тохара верси",
-       "permalink": "Даиман латташ йола хьожаярг",
-       "print": "Ð\9aепаÑ\82оÑ\85аÑ\80",
+       "permalink": "Ð\94аиман Ð»Ð°Ñ\82Ñ\82аÑ\88 Ð¹Ð¾Ð»Ð° Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80г",
+       "print": "Ð\97аÑ\80ба Ñ\82оÑ\85а",
        "view": "Хьажар",
-       "view-foreign": "УкÑ\85 $1 Ñ\8fÑ\85 Ñ\81айÑ\82а Ñ\87Ñ\83 Ñ\85Ñ\8cажа",
+       "view-foreign": "Укх $1 сайта чу хьажа",
        "edit": "Нийсде",
        "edit-local": "Хувца локальни йоазонца сурт оттадар",
-       "create": "Ð¥Ñ\8cаде",
+       "create": "Ð¥Ñ\8cакÑ\85олла",
        "create-local": "ТIатоха локальни йоазонца сурт оттадар",
-       "editthispage": "Ð\95Ñ\80 Ð¾Ð°Ð³|Ñ\83в Ñ\85Ñ\83вÑ\86а",
-       "create-this-page": "Ep oаг|ув хьае",
-       "delete": "Д|аяккха",
-       "deletethispage": "Ð\95Ñ\80 Ð¾Ð°Ð³|Ñ\83в Ð´|аÑ\8fÑ\8cккÑ\85а",
-       "undeletethispage": "Ð\95Ñ\80 Ð¾Ð°Ð³|Ñ\83в Ð´|аÑ\8fккÑ\85анз Ð¹Ð¸Ñ\82а",
-       "undelete_short": "Ð\9cеÑ\82Ñ\82аоÑ\82Ñ\82ае {{PLURAL:$1|1=Ñ\85Ñ\83вÑ\86ам|$1 Ñ\85Ñ\83вÑ\86амаÑ\88}}",
-       "viewdeleted_short": "Б|аргтасса {{PLURAL:$1|1=д|адаьккха хувцам|$1 д|адаьккха хувцамаш}}",
-       "protect": "Ð\9bоÑ\80аде",
+       "editthispage": "Ð\9dийÑ\81Ñ\8aе ÐµÑ\80 Ð¾Ð°Ð³IÑ\83в",
+       "create-this-page": "Хьакхолла ер оагӀув",
+       "delete": "ДӀаяккха",
+       "deletethispage": "Ð\94Ó\80аÑ\8fккÑ\85а ÐµÑ\80 Ð¾Ð°Ð³Ó\80Ñ\83в",
+       "undeletethispage": "ЮÑ\85амеÑ\82Ñ\82аоÑ\82Ñ\82ае ÐµÑ\80 Ð¾Ð°Ð³Ó\80Ñ\83в",
+       "undelete_short": "ЮÑ\85амеÑ\82Ñ\82аоÑ\82Ñ\82ае {{PLURAL:$1|$1 Ð½Ð¸Ð¹Ñ\81даÑ\80|$1 Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88|1=нийÑ\81даÑ\80}}",
+       "viewdeleted_short": "{{PLURAL:$1|$1 дIадаьккха нийсдарга|дIадаьккха нийсдарга|$1 дIадаьккха нийсдарашга}} хьажар",
+       "protect": "Ð\93Iо Ð´Ð°Ñ\80",
        "protect_change": "хувца",
-       "protectthispage": "Ð\9bоÑ\80ае ÐµÑ\80 Ð¾Ð°Ð³|Ñ\83в",
-       "unprotect": "Ð\9bоÑ\80ам хувца",
-       "unprotectthispage": "Ð\9bоÑ\80ам хувца",
+       "protectthispage": "Ð\93Iо Ð´Ðµ Ñ\83кÑ\85 Ð¾Ð°Ð³Iон",
+       "unprotect": "Ð\93Iо хувца",
+       "unprotectthispage": "УкÑ\85 Ð¾Ð°Ð³Iон Ð³Iо хувца",
        "newpage": "Керда оагӀув",
-       "talkpage": "УкÑ\85 Ð¾Ð°Ð³|он Ñ\82|а Ð´Ñ\83вÑ\86ам Ð±Ðµ",
+       "talkpage": "Ð\95Ñ\80 Ð¾Ð°Ð³IÑ\83в Ñ\8eвÑ\86а",
        "talkpagelinktext": "дувца оттадар",
-       "specialpage": "Ð\93\83лакÑ\85адаÑ\80а Ð¾Ð°Ð³|ув",
+       "specialpage": "Ð\91алÑ\85а Ð¾Ð°Ð³Ó\80ув",
        "personaltools": "Доакъашхочун гӀирсаш",
        "articlepage": "Йоазон т|а б|аргтасса",
        "talk": "Дувца оттадар",
        "nstab-main": "Йоазув",
        "nstab-user": "Дакъалаьцархо",
        "nstab-media": "Медифаг",
-       "nstab-special": "Ð\93Ó\80Ñ\83лакха оагӀув",
+       "nstab-special": "Ð\91алха оагӀув",
        "nstab-project": "Проектах лаьца",
        "nstab-image": "Файл",
        "nstab-mediawiki": "Хоам",
        "emailconfirmlink": "Доаржален хоамни хьожадорг дIачIоагIаде",
        "loginlanguagelabel": "Мотт: $1",
        "pt-login": "Чувала/яла",
-       "pt-createaccount": "Учёта яздар кхолла",
+       "pt-createaccount": "Учёта яздар хьакхолла",
        "pt-userlogout": "Аравала/яла",
        "changepassword": "КъайладIоaгIа дIахувцар",
        "oldpassword": "Къаьна къайладIоагӀа:",
        "filehist-dimensions": "Файлан боарам",
        "filehist-filesize": "Паьла юстарал",
        "filehist-comment": "Белгалдаккхар",
-       "imagelinks": "Файла пайда эцар",
+       "imagelinks": "Файлах пайда эцар",
        "linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIача $1 оагIуво тIахьожаву|ТIехьайоагIача $1 оагIувнаша тIахьожаву}} укх файла тIа:",
        "nolinkstoimage": "Йола паьла тIа  Iинк ю оагIувнаш дац",
        "sharedupload": "Ер паьла $1чера я, кхыча хьахьоадайтамча хьахайраде йийшайолаш я.",
        "tooltip-rollback": "Цкъа пIелг тоIабе дIадаккха тIехьара редакторас даь хувцамаш",
        "tooltip-undo": "Даь хувцар дIадаьккха, хьалххе хьажар хьахьокха, дIадаккхара бахьан Iочуязаде аьттув болаш.",
        "tooltip-summary": "Лоаца йоазонца сурт оттадар Iочуязаде",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|1=Къайла категори|Къайла категореш}} ($1)",
        "pageinfo-toolboxlink": "ОагIонах бола хоам",
        "previousdiff": "← Хьалхара нийсдар",
        "nextdiff": "ТIайоагIа нийсъар",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дувца оттадар]])",
        "duplicate-defaultsort": "Зем бе. Сатийна дIа-хьа хьоржама доагI \"$2\" хьалхара сатийна дIа-хьа хьоржама доагI \"$1\" хьахьоржа.",
        "version": "Доржам",
-       "version-specialpages": "Ð\93\83лакÑ\85ий Ð¾Ð°Ð³IÑ\83внаш",
+       "version-specialpages": "Ð\91алÑ\85а Ð¾Ð°Ð³Ó\80онаш",
        "version-version": "($1)",
        "version-software-version": "Доржам",
        "fileduplicatesearch-filename": "ПаьлацIи:",
index bb66a11..325f6ad 100644 (file)
        "noemail": "Það er ekkert netfang skráð fyrir notandan \"$1\".",
        "noemailcreate": "Þú verður að skrá gilt netfang",
        "passwordsent": "Nýtt lykilorð var sent á netfangið sem er skráð á „$1“.\nSkráðu þig inn á ný þegar þú hefur móttekið það.",
-       "blocked-mailpassword": "Þér er ekki heimilt að gera breytingar frá þessu netfangi og  því getur þú ekki fengið nýtt lykilorð í pósti.  Þetta er gert til þess að koma í veg fyrir skemmdarverk.",
+       "blocked-mailpassword": "IP-vistfangið þitt hefur verið útilokað frá því að gera breytingar. Til þess að koma í veg fyrir misnotkun er því ekki hægt að nýta sér endurheimtingu lykilorðs frá þessu IP-vistfangi.",
        "eauthentsent": "Staðfestingarpóstur hefur verið sendur á uppgefið netfang. Þú verður að fylgja leiðbeiningunum í póstinum til þess að virkja netfangið og staðfesta að það sé örugglega þitt.",
        "throttled-mailpassword": "Tölvupóstur til að endursetja lykilorðið hefur þegar verið sent, innan við $1 {{PLURAL:$1|síðasta klukkutímans|síðustu klukkutímanna}}.\nTil að koma í veg fyrir misnotkun, er aðeins einn tölvupóstur sendur {{PLURAL:$1|hvern $1 klukkutíma|hverja $1 klukkutíma}}.",
        "mailerror": "Upp kom villa við sendingu tölvupósts: $1",
        "resetpass_submit": "Skrifaðu aðgangsorðið og skráðu þig inn",
        "changepassword-success": "Það tókst að breyta lykilorðinu þínu!",
        "changepassword-throttled": "Þú hefur gert of margar tilraunir til innskráningar að undanförnu.\nBíddu í $1 áður en þú reynir aftur.",
+       "botpasswords": "Lykilorð róbóta",
        "botpasswords-label-create": "Búa til",
        "botpasswords-label-update": "Uppfæra",
        "botpasswords-label-cancel": "Hætta við",
        "minoredit": "Þetta er minniháttar breyting",
        "watchthis": "Vakta þessa síðu",
        "savearticle": "Vista síðu",
+       "publishpage": "Gefa út síðu",
        "preview": "Forskoða",
        "showpreview": "Forskoða",
        "showdiff": "Sýna breytingar",
index 087dea0..fe2cd10 100644 (file)
        "changecontentmodel-success-text": "Il tipo di contenuto di [[:$1]] è stato modificato.",
        "changecontentmodel-cannot-convert": "Il contenuto di [[:$1]] non può essere convertito in tipo $2.",
        "changecontentmodel-nodirectediting": "Il modello di contenuto $1 non supporta la modifica diretta",
+       "changecontentmodel-emptymodels-title": "Nessun modello di contenuto disponibile",
+       "changecontentmodel-emptymodels-text": "Il contenuto di [[:$1]] non può essere convertito in alcun tipo.",
        "log-name-contentmodel": "Modifiche del modello contenuti",
        "log-description-contentmodel": "Eventi relativi al modello di contenuto di una pagina",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|ha creato}} la pagina $3 utilizzando un modello di contenuto non predefinito \"$5\"",
        "lockdbsuccesstext": "Il database è stato bloccato.<br />\nRicordare di [[Special:UnlockDB|rimuovere il blocco]] dopo aver terminato le operazioni di manutenzione.",
        "unlockdbsuccesstext": "Il database è stato sbloccato.",
        "lockfilenotwritable": "Impossibile scrivere sul file di ''lock'' del database. L'accesso in scrittura a tale file da parte del server web è necessario per bloccare e sbloccare il database.",
+       "databaselocked": "Il database è già bloccato.",
        "databasenotlocked": "Il database non è bloccato.",
        "lockedbyandtime": "(da $1 il $2 alle $3)",
        "move-page": "Spostamento di $1",
index ad20843..1cdd9dc 100644 (file)
        "tog-ccmeonemails": "他の利用者に送信したメールの控えを自分にも送信",
        "tog-diffonly": "差分の下にページ内容を表示しない",
        "tog-showhiddencats": "隠しカテゴリを表示",
-       "tog-norollbackdiff": "巻き戻し後の差分を表示しない",
+       "tog-norollbackdiff": "ロールバック後の差分を表示しない",
        "tog-useeditwarning": "変更を保存せずに編集画面から離れようとしたら警告",
        "tog-prefershttps": "ログインする際、常に安全な接続を使用する",
        "underline-always": "常に付ける",
        "minoredit": "細部の編集",
        "watchthis": "このページをウォッチ",
        "savearticle": "ページを保存",
+       "publishpage": "ページを公開",
        "preview": "プレビュー",
        "showpreview": "プレビューを表示",
        "showdiff": "差分を表示",
        "ipb-unblock": "利用者またはIPアドレスのブロックを解除",
        "ipb-blocklist": "現在有効なブロックを表示",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}}の投稿の一覧",
+       "ipb-blocklist-duration-left": "残り $1",
        "unblockip": "ブロックを解除",
        "unblockiptext": "以下のフォームで利用者またはIPアドレスのブロックを解除できます。",
        "ipusubmit": "このブロックを解除",
index 4473782..a20bb2f 100644 (file)
                        "Matma Rex"
                ]
        },
-       "tog-underline": "Garisen ngisoré pranala:",
-       "tog-hideminor": "Dhelikaké besutan cilik ing owah-owahan pungkasan",
-       "tog-hidepatrolled": "Dhelikaké besutan awasan ing owah-owahan pungkasan",
-       "tog-newpageshidepatrolled": "Dhelikaké kaca kapanto saka daptar kaca anyar",
-       "tog-hidecategorization": "Dhelikaké kategorisasi kaca",
-       "tog-extendwatchlist": "Jembaraké daptar pangawasan kanggo nuduhaké kabèh owahan, ora mung sing paling anyar",
-       "tog-usenewrc": "Owah-owahané paguyuban miturut kaca nèng owah-owahan anyar lan daptar panto",
-       "tog-numberheadings": "Wènèhana nomer judul secara otomatis",
+       "tog-underline": "Nggaris ngisori pranala:",
+       "tog-hideminor": "Dhelikaké besutan cilik saka owah-owahan pungkasan",
+       "tog-hidepatrolled": "Dhelikaké besutan ingawasan saka owah-owahan pungkasan",
+       "tog-newpageshidepatrolled": "Dhelikaké kaca ingawasan saka pratélaning kaca anyar",
+       "tog-hidecategorization": "Dhelikaké gegebengan kaca",
+       "tog-extendwatchlist": "Ambakaké pawawangan nedya nuduhaké kabèh owahan, ora mung sing paling anyar",
+       "tog-usenewrc": "Golongaké owah-owahan miturut kaca ing owah-owahan anyar lan pawawangan",
+       "tog-numberheadings": "Wènèhi angkaning sesirah kanthi otomatis",
        "tog-showtoolbar": "Tuduhaké wilah piranti sarana besut",
        "tog-editondblclick": "Besut kaca sarana ngeklik pindho",
-       "tog-editsectiononrightclick": "Fungsèkna panyuntingan sub-bagian mawa klik-tengen ing judul bagian (mbutuhaké JavaScript)",
-       "tog-watchcreations": "Tambahaké kaca sing tak gawé lan berkas sing tak unggah nèng daptar pangawasan",
-       "tog-watchdefault": "Tambahaké kaca lan barkas sing tak sunting nyang pawawanganku",
-       "tog-watchmoves": "Tambahaké kaca lan berkas sing tak pindhahaké nèng daptar pangawasan",
-       "tog-watchdeletion": "Tambahaké kaca lan berkas sing tak busak nèng daptar pangawasan",
-       "tog-watchuploads": "Tambahaké barkas anyar sing tak unggah nyang pawawanganku",
-       "tog-watchrollback": "Tambahaké kaca sing tak wurungaké nyang pawawanganku",
-       "tog-minordefault": "Tandhanana kabèh suntingan dadi suntingan cilik secara baku",
+       "tog-editsectiononrightclick": "Idinaké mbesut pérangan sarana klik tengen ing sesirahing pérangan",
+       "tog-watchcreations": "Wuwuh kaca gawéanku lan barkas unggahanku nyang pawawanganku",
+       "tog-watchdefault": "Wuwuh kaca lan barkas besutanku nyang pawawanganku",
+       "tog-watchmoves": "Wuwuh kaca lan barkas lih-lihanku nyang pawawanganku",
+       "tog-watchdeletion": "Wuwuh kaca lan barkas busakanku nyang pawawanganku",
+       "tog-watchuploads": "Wuwuh barkas anyar unggahanku nyang pawawanganku",
+       "tog-watchrollback": "Wuwuh kaca sing tak wurungaké nyang pawawanganku",
+       "tog-minordefault": "Tengeri kabèh besutan minangka besutan cilik sacara baku",
        "tog-previewontop": "Deleng prawuryan sadurungé besut kothak",
-       "tog-previewonfirst": "Tuduhna pratayang ing suntingan kapisan",
-       "tog-enotifwatchlistpages": "Kirimi kula layang èlèktronik yèn ana kaca utawa berkas nèng daptar pangawasanku sing diowah",
-       "tog-enotifusertalkpages": "Kirimana aku layang e-mail yèn kaca dhiskusiku owah",
-       "tog-enotifminoredits": "Kirimi kula layang èlèktronik uga yèn ana suntingan cilik saka kaca lan berkas",
-       "tog-enotifrevealaddr": "Kirimana aku layang e-mail ing layang notifikasi",
-       "tog-shownumberswatching": "Tuduhna cacahé pangawas",
-       "tog-oldsig": "Tapak asma sing ana:",
-       "tog-fancysig": "Anggepen tapak asta minangka teks wiki (tanpa pranala otomatis)",
+       "tog-previewonfirst": "Tuduhaké prawuryan nalika mbesut pisanan",
+       "tog-enotifwatchlistpages": "Kirimi aku layangtronik yèn ana kaca utawa barkas ing pawawanganku sing diowah",
+       "tog-enotifusertalkpages": "Kirimi aku layangtronik yèn kaca gegunemanku diowah",
+       "tog-enotifminoredits": "Uga kirimi aku layangtronik yèn ana besutan cilik ing kaca lan barkas",
+       "tog-enotifrevealaddr": "Singkab alamat layangtronikku ing layang pawarta",
+       "tog-shownumberswatching": "Tuduhaké cacah wong sing ngawasi",
+       "tog-oldsig": "Tandha tangan sing ana:",
+       "tog-fancysig": "Anggep tandha tangan minangka tulisan wiki (tanpa pranala otomatis)",
        "tog-uselivepreview": "Trapaké prawuryan langsung",
        "tog-forceeditsummary": "Élingna aku menawa kothak ringkesan suntingan isih kosong",
-       "tog-watchlisthideown": "Delikna suntinganku ing daftar pangawasan",
+       "tog-watchlisthideown": "Dhelikaké besutanku saka pawawangan",
        "tog-watchlisthidebots": "Dhelikaké besutan bot saka pangawasan",
-       "tog-watchlisthideminor": "Delikna suntingan kecil di daftar pangawasan",
-       "tog-watchlisthideliu": "Ngumpetaké suntingan panganggo sing mlebu log seka daftar pangawasan",
+       "tog-watchlisthideminor": "Dhelikaké besutan cilik saka pawawangan",
+       "tog-watchlisthideliu": "Dhelikaké saka pawawangan besutaning wong sing mlebu",
        "tog-watchlistreloadautomatically": "Mot manèh pawawangan kanthi otomanis samangsa panyaring diowah (butuh JavaScript)",
-       "tog-watchlisthideanons": "Ngumpetaké suntingan panganggo anonim seka daftar pangawasan",
-       "tog-watchlisthidepatrolled": "Delikna suntingan sing wis dipatroli saka daftar pangawasan",
+       "tog-watchlisthideanons": "Dhelikaké saka pawawangan besutaning para anonim",
+       "tog-watchlisthidepatrolled": "Dhelikaké besutan ingawasan saka pawawangan",
        "tog-watchlisthidecategorization": "Dhelikaké kategorisasi kaca",
-       "tog-ccmeonemails": "Kirimana aku salinan layang e-mail sing tak-kirimaké menyang wong liya",
-       "tog-diffonly": "Aja dituduhaké isi kaca ing ngisor bédané suntingan",
-       "tog-showhiddencats": "Tuduhna kategori sing didelikaké",
-       "tog-norollbackdiff": "Lirwaaké prabédan sawusé nglakokaké sawijining pambalikan.",
-       "tog-useeditwarning": "Ã\88lingaké kula yèn kula ninggalaké suntingan sing durung kasimpen",
-       "tog-prefershttps": "Panggah sarana sambungan aman nalika mlebu",
-       "underline-always": "Mesthi",
+       "tog-ccmeonemails": "Kirimi aku salinan layangtronik sing tak kirim nyang wong liya",
+       "tog-diffonly": "Aja dituduhaké isining kaca ing ngisor bédané suntingan",
+       "tog-showhiddencats": "Tuduhaké kategori sing didhelikaké",
+       "tog-norollbackdiff": "Aja tuduhaké prabédan sawisé mbalèkaké.",
+       "tog-useeditwarning": "Ã\89lingaké kula yèn kula ninggalaké suntingan sing durung kasimpen",
+       "tog-prefershttps": "Tansah nganggo sambungan aman nalika mlebu",
+       "underline-always": "Tansah",
        "underline-never": "Ora tau",
-       "underline-default": "Kulit atau penjelajah bawaan",
-       "editfont-style": "Modhèl aksara (font) ing kotak suntingan:",
-       "editfont-default": "Standar panjelajah wèb",
+       "underline-default": "Baku kulit utawa pangluron",
+       "editfont-style": "Gagrag fon ing pambesutan:",
+       "editfont-default": "Baku pangluron",
        "editfont-monospace": "Fon monospasi",
        "editfont-sansserif": "Fon tansèrif",
        "editfont-serif": "Fon sèrif",
@@ -95,9 +95,9 @@
        "september": "Sèptèmber",
        "october": "Oktober",
        "november": "Nopèmber",
-       "december": "Désèmber",
+       "december": "Dhésèmber",
        "january-gen": "Januari",
-       "february-gen": "bruari",
+       "february-gen": "bruari",
        "march-gen": "Maret",
        "april-gen": "April",
        "may-gen": "Mèi",
        "september-gen": "Sèptèmber",
        "october-gen": "Oktober",
        "november-gen": "Nopèmber",
-       "december-gen": "Désèmber",
+       "december-gen": "Dhésèmber",
        "jan": "Jan",
        "feb": "Pèb",
        "mar": "Mar",
        "sep": "Sèp",
        "oct": "Okt",
        "nov": "Nop",
-       "dec": "Dès",
+       "dec": "D",
        "january-date": "Januari $1",
        "february-date": "Pèbruari $1",
        "march-date": "Maret $1",
        "august-date": "Agustus $1",
        "september-date": "$1 Sèptèmber",
        "october-date": "Oktober $1",
-       "november-date": "$1 Novèmber",
-       "december-date": "$1 Dèsèmber",
+       "november-date": "$1 Nopèmber",
+       "december-date": "$1 Dsèmber",
        "period-am": "Isuk-Awan",
        "period-pm": "Soré-Wengi",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategori}}",
        "category_header": "Kaca sajeroning kategori \"$1\"",
-       "subcategories": "Subkategori",
+       "subcategories": "Anak kategori",
        "category-media-header": "Médhia sajeroning kategori \"$1\"",
-       "category-empty": "''Kategori iki saiki ora ngandhut artikel utawa média.''",
-       "hidden-categories": "{{PLURAL:$1|Kategori kadhelikaké|Kategori kadhelikaké}}",
+       "category-empty": "<em>Kategori iki lagi ora ngandhut artikel utawa médhia.</em>",
+       "hidden-categories": "{{PLURAL:$1|Kategori kadhelikan}}",
        "hidden-category-category": "Kategori kadhelikan",
-       "category-subcat-count": "{{PLURAL:$2|Kategori iki mung ngandhut subkategori ngisor iki.|Kategori iki ngandhut {{PLURAL:$1|subkategori|$1 subkategori}} ngisor iki saka gunggung $2 subkategori.}}",
-       "category-subcat-count-limited": "Kategori iki ora duwé {{PLURAL:$1|subkategori|$1 subkategori}} ''berikut''.",
+       "category-subcat-count": "{{PLURAL:$2|Kategori iki mung ngandhut saanak kategori ngisor iki.|Kategori iki ngandhut {{PLURAL:$1|anak kategori|$1 anak kategori}} ngisor iki saka gunggung $2 anak kategori.}}",
+       "category-subcat-count-limited": "Kategori iki duwé {{PLURAL:$1|anak kategori|$1 anak kategori}} kaya ngisor iki.",
        "category-article-count": "{{PLURAL:$2|Kategori iki mung ngandhut kaca ngisor iki.|{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki ana ing kategori iki saka gunggung $2 kaca.}}",
        "category-article-count-limited": "Kategori iki ngandhut {{PLURAL:$1|kaca|$1 kaca-kaca}} sing kapacak ing ngisor iki.",
        "category-file-count": "{{PLURAL:$2|Kategori iki mung isi barkas iki.|{{PLURAL:$1|Barkas|$1 barkas}} iki ana sajeroning kategori iki saka $2 gunggungé.}}",
        "moredotdotdot": "Liyané...",
        "morenotlisted": "Pratélan iki ora jangkep.",
        "mypage": "Kaca",
-       "mytalk": "Wicara",
-       "anontalk": "Rembug",
+       "mytalk": "Geguneman",
+       "anontalk": "Geguneman",
        "navigation": "Napigasi",
        "and": "&#32;lan",
        "qbfind": "Golèk",
        "searchbutton": "Golèk",
        "go": "Menyang",
        "searcharticle": "Menyang",
-       "history": "Sajarah kaca",
+       "history": "Babading kaca",
        "history_short": "Babad",
        "updatedmarker": "wis inganyaran kawit tekaku sing pungkasan",
        "printableversion": "Cara cithakan",
        "deletethispage": "Busak kaca iki",
        "undeletethispage": "Wurungaké pambusaking kaca iki",
        "undelete_short": "Batal busak {{PLURAL:$1|sabesutan|$1 besutan}}",
-       "viewdeleted_short": "Pirsani {{PLURAL:$1|suntingan|suntingan}} ingkang sampun kabusak",
+       "viewdeleted_short": "Deleng {{PLURAL:$1|sabesutan sing kabusak|$1 besutan sing kabusak}}",
        "protect": "Reksa",
        "protect_change": "owah",
        "protectthispage": "Reksa kaca iki",
        "talkpage": "Rembug kaca iki",
        "talkpagelinktext": "gunem",
        "specialpage": "Kaca mirunggan",
-       "personaltools": "Piranti pribadi",
+       "personaltools": "Piranti priangga",
        "articlepage": "Deleng kaca isi",
-       "talk": "Rembug",
+       "talk": "Rerembugan",
        "views": "Praèn",
        "toolbox": "Piranti",
        "userpage": "Deleng kaca panganggo",
        "otherlanguages": "Ing basa liya",
        "redirectedfrom": "(Dilih saka $1)",
        "redirectpagesub": "Alih kaca",
-       "redirectto": "Malih nyang:",
+       "redirectto": "Ngalih menyang:",
        "lastmodifiedat": "Kaca iki pungkasan diowah kala $1, tabuh $2.",
-       "viewcount": "Kaca iki wis tau diaksès cacahé ping {{PLURAL:$1|siji|$1}}.",
+       "viewcount": "Kaca iki wis diaksès ping {{PLURAL:$1|siji|$1}}.",
        "protectedpage": "Kaca kareksa",
        "jumpto": "Jujug:",
        "jumptonavigation": "napigasi",
        "aboutpage": "Project:Bab",
        "copyright": "Kabèh isi kasedyakaké miturut $1.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
-       "currentevents": "Kadadéan saiki",
-       "currentevents-url": "Project:Kadadéan saiki",
+       "currentevents": "Kadadian saiki",
+       "currentevents-url": "Project:Kadadian saiki",
        "disclaimers": "Sélakan",
        "disclaimerpage": "Project:Sélakan umum",
        "edithelp": "Pitulung besut",
        "policy-url": "Project:Kabijakan",
        "portal": "Gapura paguyuban",
        "portal-url": "Project:Garupa paguyuban",
-       "privacy": "Niti pripasi",
+       "privacy": "Niti priangga",
        "privacypage": "Project:Niti pripasi",
        "badaccess": "Aksès ora olèh",
        "badaccess-group0": "Panjenengan ora pareng nglakokaké tindhakan sing panjenengan gayuh.",
        "laggedslavemode": "Pènget: Kaca iki mbokmenawa isiné dudu pangowahan pungkasan.",
        "readonly": "Umpak data kagembok",
        "enterlockreason": "Lebokna alesan panguncèn, kalebu uga prakiran kapan kunci bakal dibuka",
-       "readonlytext": "Database lagi dikunci marang panampan anyar. Pangurus sing ngunci mènèhi katrangan kaya mangkéné: <p>$1",
+       "readonlytext": "Juru administrasi sistem sing ngunci iku medhar mangkéné: $1",
        "missing-article": "Basis data ora bisa nemokaké tèks kaca sing kuduné ana, yaiku \"$1\" $2.\nBab iki bisasané disebabaké déning pranala daluwarsa menyang revisi sadurungé kaca sing wis dibusak.\nYèn dudu iki panyebabé, panjenengan manawa bisa nemokaké kasalahan (''bug'') jroning piranti alus (''software''). Mangga dilapuraké bab iki menyang [[Special:ListUsers/sysop|administrator]], kanthi nyebutaké alamat URL sing dituju",
        "missingarticle-rev": "(owahan#: $1)",
        "missingarticle-diff": "(Béda: $1, $2)",
        "cannotdelete-title": "Ora bisa mbusak kaca \"$1\"",
        "delete-hook-aborted": "Pambusakan dibatalaké déning ''hook''.\nOra ana alesané.",
        "no-null-revision": "Ora isa nggawe revisi 'null' anyar kanggo kaca \"$1\"",
-       "badtitle": "Sésirah ala",
-       "badtitletext": "Judhul kaca sing panjenengan ora bisa dituduhaké, kosong, utawa dadi judhul antar-basa utawa judhul antar-wiki. Iku bisa uga ana  sawijining utawa luwih aksara sing ora bisa didadèkaké judhul.",
+       "badtitle": "Sesirah ala",
+       "badtitletext": "Sesirahing kaca sing dikarepaké ora sah, suwung, utawa salah nggayut nyang sesirah antarabasa utawa antarawiki.\nIku mungkin ngandhut pralambang siji utawa luwih sing ora kena dianggo tumrap sesirah iki.",
        "perfcached": "Data iki mung dijupuk saka papan singgahan lan mungkin ora kaanyaran. Maksimum {{PLURAL:$1|sak asil|$1 asil}} sumadhiya nèng papan singgahan.",
        "perfcachedts": "Data iki mung dijupuk saka papan singgahan lan mungkin dianyari pungkasan $1. Maksimum {{PLURAL:$4|sak asil|$4 asil}} sumadhiya nèng papan singgahan.",
        "querypage-no-updates": "Update saka kaca iki lagi dipatèni. Data sing ana ing kéné saiki ora bisa bakal dibalèni unggah manèh.",
        "actionthrottled": "Tindakan diwatesi",
        "actionthrottledtext": "Minangka sawijining pepesthèn anti-spam, panjenengan diwatesi nglakoni tindhakan iki sing cacahé kakèhan ing wektu cendhak.\nMangga dicoba manèh ing sawetara menit.",
        "protectedpagetext": "Kaca iki wis digembok supaya ora bisa disunting lan diapa-apakaké.",
-       "viewsourcetext": "Panjenengan bisa mirsani utawa nulad sumber kaca iki:",
-       "viewyourtext": "Sampéyan bisa ndelok lan nyalin sumber '''suntingan Sampéyan''' nèng kaca iki:",
+       "viewsourcetext": "Sampéyan bisa ndeleng lan nyalin sumbering kaca iki.",
+       "viewyourtext": "Sampéyan bisa ndeleng lan nyalin sumbering <strong>besutaning sampéyan</strong> ing kaca iki.",
        "protectedinterface": "Kaca iki isiné tèks antarmuka sing dienggo software lan wis dikunci kanggo menghindari kasalahan.",
        "editinginterface": "'''Pènget:''' Panjenengan nyunting kaca sing dianggo nyedyakaké tèks antarmuka kanggo piranti alus.\nPangowahan kaca iki bakal awèh pangaruh marang tampilan antarmuka panganggo kanggoné panganggo liya.\nKanggo terjemahan, mangga nganggo [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], proyèk lokalisasi MediaWiki.",
        "cascadeprotected": "Kaca iki wis direksa saka panyuntingan amerga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} ngisor iki sing wis direksa mawa opsi \"runtun\" diaktifaké:\n$2",
        "welcomecreation-msg": "Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.",
        "yourname": "Jeneng panganggo:",
        "userlogin-yourname": "Jeneng panganggo",
-       "userlogin-yourname-ph": "Isi jeneng panganggo Sampéyan",
+       "userlogin-yourname-ph": "Isi jeneng panganggoning sampéyan",
        "createacct-another-username-ph": "Isi jeneng panganggo",
        "yourpassword": "Tembung wadi:",
        "userlogin-yourpassword": "Tembung wadi",
        "createacct-submit": "Gawé akun sampéyan",
        "createacct-another-submit": "Gawé akun",
        "createacct-benefit-heading": "{{SITENAME}} digawé déning wong-wong kaya déné sampéyan.",
-       "createacct-benefit-body1": "{{PLURAL:$1|besutan|besutan}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|kaca|kaca}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|panyumbang|panyumbang}} pungkasan",
+       "createacct-benefit-body1": "{{PLURAL:$1|besutan}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|sing nyumbang}} pungkasan",
        "badretype": "Sandhi panjenengan ora gathuk",
        "usernameinprogress": "Panggawéning akun tumrap jeneng panganggo iki tembé lumaku.\nEntèni sadhéla.",
        "userexists": "Jeneng panganggo sing dilebokaké lagi dianggo.\nMangga pilih jeneng liya.",
        "createaccount-title": "Gawé rékening kanggo {{SITENAME}}",
        "createaccount-text": "Ana wong sing nggawé sawijining akun utawa rékening kanggo alamat e-mail panjenengan ing {{SITENAME}} ($4) mawa jeneng \"$2\" lan tembung sandi \"$3\". Panjenengan disaranaké kanggo mlebu log lan ngganti tembung sandi panjenengan saiki.\n\nPanjenengan bisa nglirwakaké pesen iki yèn akun utawa rékening iki digawé déné sawijining kaluputan.",
        "login-throttled": "Panjenengan wis kakèhan njajal mlebu log.\nTulung nunggu dhisik $1 sadurungé njajal manèh.",
-       "login-abort-generic": "Sampéyan ora suksès mlebu log - Dibatalaké",
+       "login-abort-generic": "Sampéyan ora bisa mlebu - Kawurungan",
        "loginlanguagelabel": "Basa: $1",
        "suspicious-userlogout": "Panjaluk panjenengan supaya metu ditolak amarga katoné panjlajah internt utawa proksi panyinggah.",
        "createacct-another-realname-tip": "Jeneng asli ora kudu dilebokake.\n\nYen sampeyan milih nglebokake jeneng asli, jeneng kuwi bakal dinggo ngwenehi atribusi kanggo karya-karyane.",
        "user-mail-no-addy": "Njajal ngirim layang èlèktronik tanpa alamat layang èlèktronik.",
        "user-mail-no-body": "Nyoba ngirim layang e-mail, tapi isine kosong.",
        "changepassword": "Ganti tembung wadi",
-       "resetpass_announce": "Panjenengan wis mlebu log mawa kodhe sementara sing dikirim mawa e-mail. Menawa kersa nglanjutaké, panjenengan kudu milih tembung sandhi anyar ing kéné:",
+       "resetpass_announce": "Kanggo ngrampungaké lelakoning lumebu, sampéyan kudu masang tembung wadi anyar.",
        "resetpass_text": "<!-- Tambahaké teks ing kéné -->",
        "resetpass_header": "Ganti tembung wadining akun",
        "oldpassword": "Tembung wadi lawas:",
        "newpassword": "Tembung wadi anyar:",
        "retypenew": "Tik manèh tembung wadi anyaré:",
        "resetpass_submit": "Nata tembung sandhi lan mlebu log",
-       "changepassword-success": "Tembung sandhi panjenengan wis suksès diowahi!",
+       "changepassword-success": "Tembung wadining sampéyan kasil diowah!",
        "botpasswords": "Tembung wadi bot",
        "botpasswords-label-appid": "Jeneng bot:",
        "botpasswords-label-create": "Gawé",
        "passwordreset-emailtext-ip": "Ana uwong (mbok menawa Sampéyan, mawa angka IP $1) njaluk ganti tembung sandhiné Sampéyan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Rèkèning|Rèkèning-rèkèning}} ngisor iki magepokan karo padunungané layang èlèktronik iki:\n\n$2\n\n{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.\nSampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong liya sing njaluk iki, utawa yèn Sampéyan jebul wis kèlingan tembung sandhiné sing lawas saéngga ora ana niyat kanggo ngganti, Sampéyan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung sandhiné lawas Sampéyan.",
        "passwordreset-emailtext-user": "Panganggo $1 seka {{SITENAME}} njaluk ganti tembung sandhiné Sampéyan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Rèkèning|Rèkèning-rèkèning}} ngisor iki magepokan karo padunungané layang èlèktronik iki:\n\n$2\n\n{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.\nSampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong liya sing njaluk iki, utawa yèn Sampéyan jebul wis kèlingan tembung sandhiné sing lawas saéngga ora ana niyat kanggo ngganti, Sampéyan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung sandhiné lawas Sampéyan.",
        "passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung wadi sauntara: \n$2",
-       "passwordreset-emailsentemail": "Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim.",
+       "passwordreset-emailsentemail": "Yèn layang èlèktronik iki nggayut akuning sampéyan, layang kanggo salin tembung wadi bakal dikirim.",
        "passwordreset-emailsent-capture": "Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim, bisa didelok ngisor iki.",
        "passwordreset-emailerror-capture": "Layang èlèktronik pangèling tembung sandhi wis digawe, yaiku sing ditampilaké nèng ngisor iki, nanging ora kasil dikirim ing {{GENDER:$2|panganggo}}: $1",
-       "changeemail": "Ganti alamat layang èlèktronik",
+       "changeemail": "Owah utawa busak alamat layang èlèktronik",
        "changeemail-header": "Ganti alamat layang èlèktronik akun",
        "changeemail-no-info": "Sampéyan kudu mlebu log kanggo ngaksès kaca iki langsung.",
        "changeemail-oldemail": "Alamat layang èlèktronik saiki:",
        "resettokens-done": "Reset token.",
        "resettokens-resetbutton": "Reset token sing dipilih",
        "bold_sample": "Tulisan kandel",
-       "bold_tip": "Tulisann kandel",
-       "italic_sample": "Tulisan miring",
+       "bold_tip": "Tulisan kandel",
+       "italic_sample": "Tulisan dhoyong",
        "italic_tip": "Tulisan dhoyong",
        "link_sample": "Sesirah pranala",
        "link_tip": "Pranala njero",
        "extlink_tip": "Pranala jaba (élinga ater-ater http://)",
        "headline_sample": "Tulisan sesirah",
        "headline_tip": "Sesirah tataran 2",
-       "nowiki_sample": "Tèks iki ora bakal diformat",
+       "nowiki_sample": "Isi nganggo tulisan tanpa format ing kéné",
        "nowiki_tip": "Aja nganggo format wiki",
        "image_sample": "Conto.jpg",
-       "image_tip": "Mènèhi gambar/berkas",
+       "image_tip": "Barkas sisipan",
        "media_sample": "Conto.ogg",
        "media_tip": "Pranala barkas",
        "sig_tip": "Tandha tangan sampéyan mawa tandha wayah",
        "hr_tip": "Garis horisontal",
        "summary": "Tingkesan:",
-       "subject": "Subyek/judhul:",
+       "subject": "Jejer:",
        "minoredit": "Iki besutan cilik",
        "watchthis": "Awasi kaca iki",
        "savearticle": "Simpen kaca",
        "missingcommenttext": "Tulung lebokna komentar ing ngisor iki.",
        "missingcommentheader": "'''Pangéling:''' Sampéyan durung nyadhiyakaké judhul/jejer kanggo tanggepan iki.\nYèn Sampéyan klik \"{{int:savearticle}}\" manèh, suntingan Sampéyan bakal kasimpen tanpa kuwi.",
        "summary-preview": "Prawuryan tingkesan:",
-       "subject-preview": "Pratayang subyèk/judhul:",
+       "subject-preview": "Prawuryaning jejer:",
        "blockedtitle": "Panganggo kapalangan",
        "blockedtext": "'''Asma panganggo utawa alamat IP panjenengan diblokir.'''\n\nBlokir iki sing nglakoni $1.\nAlesané ''$2''.\n\n* Diblokir wiwit: $8\n* Kadaluwarsa pemblokiran ing: $6\n* Sing arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang e-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat e-mail sing sah ing [[Special:Preferences|préferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
        "autoblockedtext": "Alamat IP panjenangan wis diblokir minangka otomatis amerga dienggo déning panganggo liyané. Pamblokiran dilakoni déning $1 mawa alesan:\n\n:''$2''\n\n* Diblokir wiwit: $8\n* Blokir kadaluwarsa ing: $6\n* Sing dikarepaké diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké perkara iki.\n\nPanjenengan ora bisa nganggo fitur \"kirim e-mail panganggo iki\" kejaba panjenengan wis nglebokaké alamat e-mail sing sah ing [[Special:Preferences|préferènsi]] panjenengan lan panjenengan wis diblokir kanggo nggunakaké.\n\nID pamblokiran panjenengan iku #$5 lan alamat IP panjenengan iku $3. Tulung sertakna informasi ing dhuwur kabèh iki saben ngajokaké pitakonan panjenengan. Matur nuwun.",
        "blockednoreason": "ora ana alesan sing diwènèhaké",
-       "whitelistedittext": "Panjenengan kudu $1 supaya bisa nyunting artikel.",
+       "whitelistedittext": "Sampéyan kudu $1 murih bisa mbesut kaca.",
        "confirmedittext": "Panjenengan kudu ndhedhes alamat e-mail dhisik sadurungé pareng nyunting sawijining kaca. Mangga nglebokaké lan validasi alamat e-mail panjenengan sadurungé nglakoni panyuntingan. Alamat e-mail sawisé bisa diowahi liwat [[Special:Preferences|kaca préférènsi]]",
        "nosuchsectiontitle": "Pérangan ora katemu",
        "nosuchsectiontext": "Panjenengan nyoba nyunting sawijining bagéan sing ora ana.\nBagéan iki manawa wis dipindhah utawa dibusak nalika panjenengan buka.",
        "templatesusedsection": "{{PLURAL:$1|Cithakan}} sing dienggo ding bagian iki:",
        "template-protected": "(kareksa)",
        "template-semiprotected": "(semu kareksa)",
-       "hiddencategories": "Kaca iki sawijining anggota saka {{PLURAL:$1|1 kategori ndelik|$1 kategori-kategori ndelik}}:",
+       "hiddencategories": "Kaca iki anggotaning {{PLURAL:$1|1 kategori wadi|$1 kategori wadi}}:",
        "edittools": "<!-- Tèks ing ngisor iki bakal ditudhuhaké ing ngisoring isènan suntingan lan pangemotan.-->",
        "nocreatetext": "Situs iki ngwatesi kemampuan kanggo nggawé kaca anyar. Panjenengan bisa bali lan nyunting kaca sing wis ana, utawa mangga [[Special:UserLogin|mlebua log utawa ndaftar]]",
        "nocreate-loggedin": "Panjenengan ora kagungan idin kanggo nggawé kaca anyar.",
        "undo-success": "Suntingan iki bisa dibatalaké. Tulung priksa prabandhingan ing ngisor iki kanggo mesthèkaké yèn prakara iki pancèn sing bener panjenengan pèngin lakoni, banjur simpenen pangowahan iku kanggo ngrampungaké pambatalan suntingan.",
        "undo-failure": "Suntingan iki ora bisa dibatalakén amerga ana konflik panyuntingan antara.",
        "undo-norev": "Suntingan iki ora bisa dibatalaké amerga ora ana utawa wis dibusak.",
-       "undo-summary": "←Mbatalaké revisi $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|Dhiskusi]])",
+       "undo-summary": "Balèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|gunem]])",
        "undo-summary-username-hidden": "Batalna revisi $1 saking panganggo kang didhelikake",
        "cantcreateaccounttitle": "Akun ora bisa digawé",
        "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa rékening. Sing mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
        "logdelete-failure": "'''Aturan pandhelikan ora bisa disèt:'''\n$1",
        "revdel-restore": "Ngowahi visiblitas (pangatonan)",
        "pagehist": "Babading kaca",
-       "deletedhist": "Babad kabusakan",
+       "deletedhist": "Babad kabusak",
        "revdelete-hide-current": "Gagal ndhelikaké révisi tanggal $2, $1: iki arupa révisi paling anyar.\nRévisi iki ora bisa didhelikaké.",
        "revdelete-show-no-access": "Gagal nampilaké révisi tanggal $1, jam $2: révisi iki wis ditandhani \"kawates\".\nPanjenengan ora nduwèni aksès menyang révisi iki.",
        "revdelete-modify-no-access": "Gagal ngowahi révisi tanggal $1, jam $2: révisi iki wis ditandhani \"kawates\".\nPanjenengan ora nduwèni aksès menyang révisi iki.",
        "mergelog": "Gabung log",
        "revertmerge": "Batalna panggabungan",
        "mergelogpagetext": "Ing ngisor iki kapacak daftar panggabungan sajarah kaca ing kaca liyané.",
-       "history-title": "Riwayat rèvisi saka \"$1\"",
+       "history-title": "Babad owahaning \"$1\"",
        "difference-title": "Prabéda antara owahan \"$1\"",
        "difference-title-multipage": "Prabédhan antara kaca \"$1\" lan \"$2\"",
        "difference-multipage": "(Prabédhan antar kaca)",
        "searchmenu-exists": "'''Ana kaca kanthi jeneng \"[[$1]]\" ing wiki iki'''",
        "searchmenu-new": "<strong>Gawéa kaca \"[[:$1]]\" nyang wiki iki!</strong> {{PLURAL:$2|0=|Uga delenga kaca sing katemu sarana panggolèking sampéyan.|Uga delenga kasiling panggolèk.}}",
        "searchprofile-articles": "Kaca isi",
-       "searchprofile-images": "Sarwasarana",
+       "searchprofile-images": "Sarwamadya",
        "searchprofile-everything": "Samubarang",
        "searchprofile-advanced": "Lungidan",
        "searchprofile-articles-tooltip": "Golèkan ing $1",
        "search-external": "Panggolèkan èkstèrnal",
        "searchdisabled": "Sawetara wektu iki panjenengan ora bisa nggolèk mawa fungsi golèk {{SITENAME}}. Kanggo saiki mangga panjenengan bisa golèk nganggo Google. Nanging isi indèks Google kanggo {{SITENAME}} bisa waé lawas lan durung dianyari.",
        "search-error": "Ana kasalahan wektu nggoleki: $1",
-       "preferences": "Preferensi (pilihan)",
-       "mypreferences": "Préferènsi",
+       "preferences": "Pilihan",
+       "mypreferences": "Pilihan",
        "prefs-edits": "Gunggung besutan:",
        "prefsnologintext2": "Tulung $1 kanggo ngganti preferensi sampeyan.",
        "prefs-skin": "Kulit",
-       "skin-preview": "Pratilik",
-       "datedefault": "Ora ana préferènsi",
+       "skin-preview": "Prawuryan",
+       "datedefault": "Ora ana pilihan",
        "prefs-labs": "Piranti lab",
-       "prefs-user-pages": "Kaca panganggo",
-       "prefs-personal": "Profil panganggo",
+       "prefs-user-pages": "Kacaning sing nganggo",
+       "prefs-personal": "Panjèrènging sing nganggo",
        "prefs-rc": "Owah-owahan pungkasan",
-       "prefs-watchlist": "Dhaftar pangawasan",
+       "prefs-watchlist": "Pawawangan",
+       "prefs-editwatchlist": "Besut pawawangan",
+       "prefs-editwatchlist-label": "Besut isining pawawanganing sampéyan",
+       "prefs-editwatchlist-edit": "Deleng lan busak sesirah ing pawawanganing sampéyan",
+       "prefs-editwatchlist-raw": "Besut pawawangan lakaran",
+       "prefs-editwatchlist-clear": "Resiki pawawanganing sampéyan",
        "prefs-watchlist-days": "Cacahé dina sing dituduhaké ing dhaftar pangawasan:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|dina|dina}}",
        "prefs-watchlist-edits": "Cacahé suntingan maksimum sing dituduhaké ing dhaftar pangawasan sing luwih jangkep:",
        "prefs-watchlist-edits-max": "Gunggung maksimum: 1000",
-       "prefs-watchlist-token": "Token pantauan:",
+       "prefs-watchlist-token": "Tokening pawawangan:",
        "prefs-misc": "Liya-liya",
        "prefs-resetpass": "Ganti tembung sandi",
-       "prefs-changeemail": "Ganti alamat layang èlèktronik",
+       "prefs-changeemail": "Owah utawa busak alamat layangtronik",
        "prefs-setemail": "Setèl alamat layang èlèktronik",
        "prefs-email": "Opsi layang-e",
        "prefs-rendering": "Tampilan",
        "columns": "Kolom:",
        "searchresultshead": "Panggolèkan",
        "stub-threshold": "Ambang wates kanggo format <a href=\"#\" class=\"stub\">pranala rintisan</a>:",
+       "stub-threshold-sample-link": "pralampita",
        "stub-threshold-disabled": "Dipatèni",
        "recentchangesdays": "Cacahé dina sing dituduhaké ing owah-owahan pungkasan:",
        "recentchangesdays-max": "(maksimum $1 {{PLURAL:$1|dina|dina}})",
        "prefs-help-recentchangescount": "Iki klebu owah-owahan pungkasan, kaca sajarah, lan log.",
        "prefs-help-watchlist-token2": "Ini adalah kunci rahasia (token) ke web feed dari daftar pantauan Anda.\nSiapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan.\n[[Special:ResetTokens|Klik di sini jika Anda perlu menyetel ulang]].",
        "savedprefs": "Préferènsi Panjenengan wis disimpen",
+       "savedrights": "Haking panganggo {{GENDER:$1|$1}} wis kasimpen.",
        "timezonelegend": "Zona wektu:",
        "localtime": "Wektu saenggon:",
        "timezoneuseserverdefault": "Anggo gawan wiki ($1)",
        "prefs-namespaces": "Ruang jeneng / Bilik jeneng",
        "default": "baku",
        "prefs-files": "Berkas",
-       "prefs-custom-css": "CSS pribadi",
-       "prefs-custom-js": "JS pribadi",
+       "prefs-custom-css": "CSS priangga",
+       "prefs-custom-js": "JavaScript priangga",
        "prefs-common-css-js": "CSS/JS didumaké kanggo kabèh kulit:",
        "prefs-reset-intro": "Panjenengan bisa migunakaké kaca iki kanggo mbalèkaké préferensi panjenengan marang setèlan baku situs.\nPembalikan ora bisa dibatalaké.",
        "prefs-emailconfirm-label": "Konfirmasi layang-e:",
        "prefs-help-signature": "Komentar ing kaca wicara kudu ditapak astani nganggo \"<nowiki>~~~~</nowiki>\" sing bakal dikonvèrsi dadi tapak asta panjenengan lan tanggal wektu.",
        "badsig": "Tapak astanipun klèntu; cèk rambu HTML.",
        "badsiglength": "Tapak asta panjenengan kedawan.\nAja luwih saka {{PLURAL:$1|karakter|karakter}}.",
-       "yourgender": "Jinis kelamin:",
-       "gender-unknown": "Ora dinyatakaké",
-       "gender-male": "Lanang",
-       "gender-female": "Wadon",
+       "yourgender": "Kepiyé sampéyan medhar priangganing sampéyan?",
+       "gender-unknown": "Nalika nyebut sampéyan, piranti alus iku bakal nganggo tembung sing nétral jèndher sabisané",
+       "gender-male": "Dhèwèké mbesut kaca wiki",
+       "gender-female": "Dhèwèké mbesut kaca wiki",
        "prefs-help-gender": "Opsional: Dipigunakaké kanggo panyebutan jinis kelamin sing bener déning piranti alus.\nInformasi iki bakal kabuka kanggo publik.",
-       "email": "Layang élèktronik (E-mail)",
-       "prefs-help-realname": "* <strong>Asma asli</strong> (ora wajib): menawa panjenengan maringi, asma asli panjenengan bakal digunakaké kanggo mènèhi akrédhitasi kanggo kasil karya tulis panjenengan.",
+       "email": "Layangtronik",
+       "prefs-help-realname": "Jeneng asli manasuka.\nMenawa diisi, iku bakal kanggo ngatribusi sampéyan awit karyaning sampéyan.",
        "prefs-help-email": "Alamat layang èlèktronik sipaté mung pilihan, nanging dibutuhaké kanggo nyetèl ulang tembung sandhi yèn Sampéyan lali.",
        "prefs-help-email-others": "Sampéyan uga bisa milih kanggo ngidinaké wong liya ngubungi Sampéyan liwat layang èlèktronik sing ana ing kaca panganggo utawa kaca guneman.\nAlamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi Sampéyan.",
        "prefs-help-email-required": "Alamat layang-e dibutuhaké.",
-       "prefs-info": "Informasi dhasar",
+       "prefs-info": "Katerangan pokok",
        "prefs-i18n": "Internasionalisasi",
        "prefs-signature": "Tapak asma",
        "prefs-dateformat": "Format tanggal",
        "grouppage-suppress": "{{ns:project}}:Oversight",
        "right-read": "Maca kaca-kaca",
        "right-edit": "Besut kaca",
-       "right-createpage": "Nggawé kaca (sing dudu kaca dhiskusi)",
-       "right-createtalk": "Nggawé kaca dhiskusi",
+       "right-createpage": "Gawé kaca (sing dudu kaca rerembugan)",
+       "right-createtalk": "Gawé kaca rerembugan",
        "right-createaccount": "Nggawé rékening (akun) panganggo anyar",
        "right-minoredit": "Tandhani minangka besutan cilik",
-       "right-move": "Pindhahna kaca",
+       "right-move": "Ngalih kaca",
        "right-move-subpages": "Pindhahaké kaca lan kabèh anak-kacané",
        "right-move-rootuserpages": "Ngalih kaca panganggo oyod",
        "right-movefile": "Mindhah berkas",
        "right-bot": "Anggepen minangka prosès otomatis",
        "right-nominornewtalk": "Suntingan sithik (''minor'') ora ngwetokaké prompt pesen anyar",
        "right-apihighlimits": "Nganggo wates sing luwih dhuwur ing kwéri API",
-       "right-writeapi": "Migunakaké API panulisan",
+       "right-writeapi": "Nganggo API tulis",
        "right-delete": "Busak kaca-kaca",
        "right-bigdelete": "Busak kaca-kaca mawa sajarah panyuntingan sing gedhé",
        "right-deletelogentry": "Busak lan batalaké mbusak isi log spésipik",
        "right-viewmyprivateinfo": "Dheleng data pribadi sampeyan (kayata alamat layang elektronik, jeneng asli)",
        "right-editmyprivateinfo": "Owahi data pribadi sampeyan (kayata alamat layang elektronik, jeneng asli)",
        "right-editmyoptions": "Owahi preferensi sampeyan",
-       "right-rollback": "Sacara gelis mbalèkaké panganggo pungkasan sing nyunting kaca tartamtu",
+       "right-rollback": "Balèkaké kanthi gelis besutaning panganggo pungkasan sing mbesut kaca tinamtu",
        "right-markbotedits": "Tandhani besutan kawurungan minangka besutan bot",
        "right-noratelimit": "Ora dipengaruhi déning wates cacahing suntingan.",
        "right-import": "Impor kaca-kaca saka wiki liya",
        "action-move": "alihna kaca iki",
        "action-move-subpages": "mindahaké kaca iki, lan kabèh anak-kacané",
        "action-move-rootuserpages": "ngalih kaca panganggo oyod",
-       "action-movefile": "pindhahna berkas iki",
+       "action-movefile": "lih barkas iki",
        "action-upload": "ngunggahaké berkas iki",
        "action-reupload": "nindhih berkas sing wis ana",
        "action-reupload-shared": "nindhih berkas sing wis ana ing papan panyimpanan berkas sing dianggo bebarengan",
        "filehist-deleteone": "busaken iki",
        "filehist-revert": "balèkna",
        "filehist-current": "saiki",
-       "filehist-datetime": "Surya/Tabuh",
+       "filehist-datetime": "Tanggal/Tabuh",
        "filehist-thumb": "Gambar cilik",
        "filehist-thumbtext": "Gambar cilik kanggo owahan $1",
        "filehist-nothumb": "Ora ana miniatur",
        "filehist-dimensions": "Alang ujur",
        "filehist-filesize": "Gedhené berkas",
        "filehist-comment": "Tanggapan",
-       "imagelinks": "Panganggoan berkas",
+       "imagelinks": "Panganggoning barkas",
        "linkstoimage": "{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki nggayut barkas iki:",
        "linkstoimage-more": "Luwih saka $1 {{PLURAL:$1|kaca|kaca-kaca}} nduwèni pranala menyang berkas iki.\nDhaftar ing ngisor nuduhaké {{PLURAL:$1|kaca pisanan kanthi pranala langsung|$1 kaca kanthi pranala langsung}} menyang berkas iki.\n[[Special:WhatLinksHere/$2|dhaftar pepak]] uga ana.",
-       "nolinkstoimage": "Ora ana kaca sing nyambung menyang berkas iki.",
+       "nolinkstoimage": "Ora ana kaca sing nggayut menyang barkas iki.",
        "morelinkstoimage": "Ndeleng [[Special:WhatLinksHere/$1|luwih akèh pranala]] menyang berkas iki.",
        "linkstoimage-redirect": "$1 (alihan berkas) $2",
        "duplicatesoffile": "{{PLURAL:$1|berkas ing ngisor arupa duplikat|$1 berkas ing ngisor arupa duplikat}} saka berkas iki ([[Special:FileDuplicateSearch/$2|luwih rinci]]):",
        "newpages-username": "Asma panganggo:",
        "ancientpages": "Kaca-kaca langkung sepuh",
        "move": "Pindhahen",
-       "movethispage": "Pindhahna kaca iki",
+       "movethispage": "Lih kaca iki",
        "unusedimagestext": "Berkas-berkas sing kapacak iki ana nanging ora dienggo ing kaca apa waé.\nTulung digatèkaké yèn situs wèb liyané mbok-menawa bisa nyambung ing sawijining berkas sacara langsung mawa URL langsung, lan berkas-berkas kaya mengkéné iku mbok-menawa ana ing daftar iki senadyan ora dienggo aktif manèh.",
        "unusedcategoriestext": "Kategori iki ana senadyan ora ana artikel utawa kategori liyané sing nganggo.",
        "notargettitle": "Ora ana sasaran",
        "addedwatchtext": "Kaca \"[[:$1]]\" wis ditambahaké menyang [[Special:Watchlist|daftar pangawasan]].\nOwah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhèng, bakal dipacak ing kéné.",
        "removewatch": "Singkiraké saka daptar pangawasan",
        "removedwatchtext": "Kaca \"[[:$1]]\" wis dibusak saka [[Special:Watchlist|daftar pangawasan]].",
-       "watch": "Awati",
+       "watch": "Awasi",
        "watchthispage": "Periksa kaca iki",
        "unwatch": "Ora usah ngawasaké manèh",
        "unwatchthispage": "Batalna olèhé ngawasi kaca iki",
        "cantrollback": "Ora bisa mbalèkaké suntingan; panganggo pungkasan iku siji-sijiné penulis artikel iki.",
        "alreadyrolled": "Ora bisa mbalèkaké suntingan pungkasan [[:$1]] déning [[User:$2|$2]] ([[User talk:$2|Wicara]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); wong liya wis nyunting utawa mbalèkaké kaca artikel iku.\n\nSuntingan pungkasan dilakoni déning [[User:$3|$3]] ([[User talk:$3|Wicara]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Ringkesan suntingan yaiku: <em>$1</em>.",
-       "revertpage": "Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dipunwangsulaken dhateng ing vèrsi pungkasan déning [[User:$1|$1]]",
+       "revertpage": "Besutan sing dibalèkaké [[Special:Contributions/$2|$2]] ([[User talk:$2|gunem]]) bab owahan pungkasan déning [[User:$1|$1]]",
        "revertpage-nouser": "Suntingan déning panganggo sing didhelikake, dibalèkaké nèng benahan pungkasan déning [[User:$1|$1]]",
        "rollback-success": "Suntingan dibalèkaké déning $1;\ndiowahi bali menyang vèrsi pungkasan déning $2.",
        "sessionfailure-title": "Sèsi gagal",
        "namespace": "Lowah aran:",
        "invert": "Balèkaké pilihan",
        "tooltip-invert": "Centhang kothak iki kanggo ndhelikaké owahan saka kaca-kaca nèng njero bilik jeneng kapilih (lan bilik jeneng kakait yèn dicenthang)",
-       "namespace_association": "Bilik jeneng kakait",
+       "namespace_association": "Lowah aran magepokan",
        "tooltip-namespace_association": "Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk sing kakait karo bilik jeneng kapilih",
        "blanknamespace": "(Pokok)",
        "contributions": "Sumbangan {{GENDER:$1|panganggo}}",
        "nolinkshere-ns": " Ora ana kaca sing nduwé pranala menyang '''[[:$1]]''' ing bilik jeneng sing kapilih.",
        "isredirect": "kaca lih-lihan",
        "istemplate": "karo cithakan",
-       "isimage": "pranala berkas",
+       "isimage": "pranala barkas",
        "whatlinkshere-prev": "{{PLURAL:$1|sadurungé|$1 sadurungé}}",
        "whatlinkshere-next": "{{PLURAL:$1|sabanjuré|$1 sabanjuré}}",
        "whatlinkshere-links": "← pranala",
-       "whatlinkshere-hideredirs": "$1 pangalihan-pangalihan",
+       "whatlinkshere-hideredirs": "$1 lih-lihan",
        "whatlinkshere-hidetrans": "$1 transklusi",
        "whatlinkshere-hidelinks": "pranala-pranala $1",
        "whatlinkshere-hideimages": "$1 pranala berkas",
        "ipbother": "Wektu liya",
        "ipboptions": "2 jam:2 hours,1 dina:1 day,3 dina:3 days,1 minggu:1 week,2 minggu:2 weeks,1 sasi:1 month,3 sasi:3 months,6 sasi:6 months,1 taun:1 year,tanpa wates:infinite",
        "ipbhidename": "Delikna jeneng panganggo saka suntingan lan pratélan",
-       "ipbwatchuser": "Ngawasi kaca panganggo lan kaca-kaca dhiskusi panganggo iki",
+       "ipbwatchuser": "Wasi kaca panganggoning lan kaca gegunemaning panganggo iki",
        "ipb-disableusertalk": "Alangi panganggo iki nyunting kaca gunemané nalika diblokir",
        "ipb-change-block": "Blokir manèh panganggo kanthi sèting iki",
        "ipb-confirm": "Pesthèkaké blokir",
        "noautoblockblock": "pamblokiran otomatis dipatèni",
        "createaccountblock": "ndamelipun akun dipunblokir",
        "emailblock": "layang e-mail diblokir",
-       "blocklist-nousertalk": "ora éntuk nyunting kaca gunemané dhéwé",
+       "blocklist-nousertalk": "ora kena mbesut kaca guneman dhéwé",
        "ipblocklist-empty": "Daftar pamblokiran kosong.",
        "ipblocklist-no-results": "alamat IP utawa panganggo sing disuwun ora diblokir.",
        "blocklink": "palang",
        "block-log-flags-nocreate": "opsi nggawé akun utawa rékening dipatèni",
        "block-log-flags-noautoblock": "blokir otomatis dipatèni",
        "block-log-flags-noemail": "e-mail diblokir",
-       "block-log-flags-nousertalk": "ora éntuk nyunting kaca gunemané dhéwé",
+       "block-log-flags-nousertalk": "ora kena mbesut kaca guneman dhéwé",
        "block-log-flags-angry-autoblock": "paningkatan sistem pamblokiran otomatis wis diaktifaké",
        "block-log-flags-hiddenname": "jeneng panganggo didhelikaké",
        "range_block_disabled": "Fungsi pamblokir blok IP kanggo para opsis dipatèni.",
        "lockfilenotwritable": "Berkas kunci basis data ora bisa ditulis. Kanggo ngunci utawa mbuka basis data, berkas iki kudu ditulis déning server wèb.",
        "databasenotlocked": "Basis data ora dikunci.",
        "lockedbyandtime": "(déning {{GENDER:$1|$1}} tanggal $2 wanci $3)",
-       "move-page": "Pindhahna $1",
+       "move-page": "Ngalih $1",
        "move-page-legend": "Mindhah kaca",
        "movepagetext": "Formulir ing ngisor iki bakal ngowahi jeneng sawijining kaca, mindhah kabèh sajarahé menyang kaca sing anyar. Irah-irahan utawa judhul sing lawas bakal dadi kaca pangalihan menyang irah-irahan sing anyar. Pranala menyang kaca sing lawas ora bakal diowahi; dadi pastèkna dhisik mriksa pangalihan [[Special:DoubleRedirects|dobel]] utawa [[Special:BrokenRedirects|pangalihan sing rusak]] sawisé pamindhahan. Panjenengan sing tanggung jawab mastèkaké menawa kabèh pranala-pranala tetep nyambung ing kaca panujon kaya samesthiné.\n\nGatèkna yèn kaca iki '''ora''' bakal dipindhah yèn wis ana kaca liyané sing nganggo irah-irahan sing anyar, kejaba kaca iku kosong utawa ora nduwé sajarah panyuntingan. Dadi tegesé panjenengan bisa ngowahi jeneng kaca iku manèh kaya sedyakala menawa panjenengan luput, lan panjenengan ora bisa nimpani kaca sing wis ana.\n\n'''PÈNGET!'''\nPerkara iki bisa ngakibataké owah-owahan sing drastis lan ora kaduga kanggo kaca-kaca sing populèr;\npastekaké dhisik panjenengan ngerti konsekwènsi saka panggayuh panjenengan sadurungé dibanjuraké.",
        "movepagetext-noredirectfixer": "Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Peringatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
-       "movepagetalktext": "Kaca dhiskusi sing kagandhèng uga bakal dipindhahaké sacara otomatis '''kejaba yèn:'''\n\n*Sawijining kaca dhiskusi sing ora kosong wis ana sangisoring irah-irahan (judhul) anyar, utawa\n*Panjenengan ora maringi tandha cèk ing kothak ing ngisor iki.\n\nIng kasus-kasus iku, yèn panjenengan gayuh, panjenengan bisa mindhahaké utawa nggabung kaca iku sacara manual.",
+       "movepagetalktext": "Menawa sampéyan nyénthang kothak iki, kaca geguneman sing magepokan bakal otomatis dilih nyang sesirah anyar, kajaba kaca gegunemané wis ana isiné sadurungé.\n\nYèn mangkéné, sampéyan kudu ngalih utawa nggabung kaca-kaca iku kanthi manual.",
        "moveuserpage-warning": "'''Pèngetan:''' Sampéyan arep mindhahaké kaca panganggo. Mangga cathet yèn namung kaca sing bakal dipindhahaké lan panganggo '''ora''' bakal diganti jenengé.",
        "movenologintext": "Panjenengan kudu dadi panganggo sing wis ndaftar lan wis [[Special:UserLogin|mlebu log]] kanggo mindhah kaca.",
        "movenotallowed": "Panjenengan ora pareng ngalihaké kaca.",
        "cant-move-to-user-page": "Panjenengan ora nduwèni hak aksès kanggo mindhahaké kaca menyang sawijining kaca panganggoa (kajaba menyang anak-kaca panganggo).",
        "newtitle": "Menyang irah-irahan utawa judhul anyar:",
        "move-watch": "Awasna kaca iki",
-       "movepagebtn": "Pindhahna kaca",
+       "movepagebtn": "Ngalih kaca",
        "pagemovedsub": "Bisa kasil dipindhahaké",
        "movepage-moved": "'''\"$1\" dipindhahaké menyang \"$2\".'''",
        "movepage-moved-redirect": "Kaca pengalihan wis kacipta.",
        "movepage-moved-noredirect": "Kanggo gawé pengalihan wis ditahan.",
        "articleexists": "Satunggalipun kaca kanthi asma punika sampun wonten, utawi asma ingkang panjenengan pendhet mboten leres. Sumangga nyobi asma sanèsipun.",
        "cantmove-titleprotected": "Panjenengan ora bisa mindhahaké kaca iki menyang lokasi iki, amerga irah-irahan tujuan lagi direksa; ora olèh digawé",
-       "movetalk": "Pindahna kaca dhiskusi sing ana gandhèngané.",
-       "move-subpages": "Pindhahna anak-kaca (nganti $1)",
-       "move-talk-subpages": "Pindhahna anak-kaca saka kaca wicara (nganti $1)",
+       "movetalk": "Lih kaca geguneman sing magepokan",
+       "move-subpages": "Lih anak kaca (tekan $1)",
+       "move-talk-subpages": "Lih anak kaca saka kaca geguneman (tekan $1)",
        "movepage-page-exists": "Kaca $1 wis ana lan ora bisa ditindhes sacara otomatis.",
        "movepage-page-moved": "Kaca $1 wis dipindhah menyang $2.",
        "movepage-page-unmoved": "Kaca $1 ora bisa dialihaké menyang $2.",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|révisi}} saka $2",
        "javascripttest": "Panjajalan JavaScript",
        "javascripttest-qunit-intro": "Delok [dhokumèntasi panjajalan $1] nèng mediawiki.org.",
-       "tooltip-pt-userpage": "Kaca {{GENDER:|panganggo sampéyan}}",
+       "tooltip-pt-userpage": "Kaca {{GENDER:|panganggoning sampéyan}}",
        "tooltip-pt-anonuserpage": "Kaca panganggo IP panjenengan",
-       "tooltip-pt-mytalk": "Kaca paguneman {{GENDER:|sampéyan}}",
-       "tooltip-pt-anontalk": "Dhiskusi perkara suntingan saka alamat IP iki",
-       "tooltip-pt-preferences": "Pamiji {{GENDER:|sampéyan}}",
-       "tooltip-pt-watchlist": "Daftar kaca sing tak-awasi.",
+       "tooltip-pt-mytalk": "Kaca gegunemaning {{GENDER:|sampéyan}}",
+       "tooltip-pt-anontalk": "Rerembugan bab besutan-besutan saka alamat IP iki",
+       "tooltip-pt-preferences": "Pilihaning {{GENDER:|sampéyan}}",
+       "tooltip-pt-watchlist": "Pratélaning kaca sing sampéyan awasi owah-owahané",
        "tooltip-pt-mycontris": "Pratélaning sumbanganing {{GENDER:|sampéyan}}",
        "tooltip-pt-login": "Sampéyan prayogané mlebu masiya ora kudu",
        "tooltip-pt-logout": "Metu",
        "tooltip-pt-createaccount": "Sampéyan prayogané gawé akun lan mlebu masiya ora kudu",
-       "tooltip-ca-talk": "Parembuganing kaca isi",
+       "tooltip-ca-talk": "Rerembuganing kaca isi",
        "tooltip-ca-edit": "Besut kaca iki",
        "tooltip-ca-addsection": "Miwiti pérangan anyar",
        "tooltip-ca-viewsource": "Kaca iki direksa. \nSampéyan bisa ndeleng sumberé",
        "tooltip-ca-unprotect": "Ganti panjagan kaca iki",
        "tooltip-ca-delete": "Busak kaca iki",
        "tooltip-ca-undelete": "Balèkna suntingan ing kaca iki sadurungé kaca iki dibusak",
-       "tooltip-ca-move": "Aliha kaca iki",
+       "tooltip-ca-move": "Lih kaca iki",
        "tooltip-ca-watch": "Tambahaké kaca iki nyang pawawangan sapéyan",
        "tooltip-ca-unwatch": "Busak kaca iki saka daftar pangawasan panjenengan",
        "tooltip-search": "Golèk nyang {{SITENAME}}",
        "file-info-size": "$1 × $2 piksel, ukuran barkas: $3, jinis MIME: $4",
        "file-info-size-pages": "$1 × $2 piksel, gedhéné berkas: $3, jinisé MIME: $4, $5 {{PLURAL:$5|kaca|kaca}}",
        "file-nohires": "Ora ana résolusi sing luwih dhuwur.",
-       "svg-long-desc": "Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3",
+       "svg-long-desc": "Barkas SVG, nominal $1 × $2 piksel, gedhéning barkas: $3",
        "svg-long-desc-animated": "Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3",
        "svg-long-error": "Berkas SVG ora sah: $1",
        "show-big-image": "Barkas asli",
-       "show-big-image-preview": "Gedhéné pratayang iki: $1",
+       "show-big-image-preview": "Gedhéning prawuryan iki: $1",
        "show-big-image-other": "{{PLURAL:$2|Résolusi|Résolusi}} liya: $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "file-info-gif-looped": "mubeng",
        "exif-primarychromaticities": "Kromatisitas werna primer",
        "exif-ycbcrcoefficients": "Koèfisièn matriks transformasi papan werna",
        "exif-referenceblackwhite": "Wiji réferènsi pasangan ireng putih",
-       "exif-datetime": "Tanggal lan wektu pangowahan berkas",
+       "exif-datetime": "Tanggal lan tabuh owahing barkas",
        "exif-imagedescription": "Judhul gambar",
        "exif-make": "Produsèn kamera",
        "exif-model": "Modhèl kaméra",
        "watchlisttools-view": "Tuduhna owah-owahan sing ana gandhèngané",
        "watchlisttools-edit": "Deleng lan besut pawawangan",
        "watchlisttools-raw": "Besut pawawangan wantahan",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|wicara]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|geguneman]])",
        "duplicate-defaultsort": "Pènget: Kunci pilih asal (''Default sort key'') \"$2\" nggantèkaké kunci pilih asal sadurungé \"$1\".",
        "version": "Versi",
        "version-extensions": "Èkstènsi sing wis diinstalasi",
        "intentionallyblankpage": "Kaca iki disengajakaké kosong",
        "external_image_whitelist": " #Umbarna larikan iki apa anané<pre>\n#Pigunakaké fragmèn èksprèsi regular (mung bagéyan ing antara //) ing ngisor\n#Fragmèn ini bakal dicocogaké karo URL saka gambar-gambar èksternal\n#Fragmèn sing cocog bakal ditampilaké minangka gambar, yèn ora mung pranala menyang gambar waé sing ditampilaké\n#Larikan sing diwiwiti nganggo # dianggep minangka komentar\n#Iki ora mbédakaké aksara gedhé/cilik\n#Dèlèhna kabèh fragmèn èksprèsi regular sadhuwuré larikan iki. Umbarna larikan iki apa anané</pre>",
        "tags": "Tag pangowahan sing absah",
-       "tag-filter": "Panyaringan [[Special:Tags|tandha]]:",
+       "tag-filter": "Panyaringan [[Special:Tags|tenger]]:",
        "tag-filter-submit": "Penyaring",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tenger|Tenger}}]]: $2)",
        "tags-title": "Tag",
        "revdelete-uname-unhid": "jeneng panganggo dituduhaké",
        "revdelete-restricted": "rèstriksi ditrapaké marang para opsis",
        "revdelete-unrestricted": "rèstriksi marang para opsis dijabel",
-       "logentry-move-move": "$1 {{GENDER:$2|mindhahaké}} kaca $3 nèng $4",
+       "logentry-move-move": "$1 {{GENDER:$2|ngalih}} kaca $3 nyang $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|mindhahaké}} kaca $3 nèng $4 tanpa ninggalaké pangalihan",
        "logentry-move-move_redir": "$1 {{GENDER:$2|mindhahaké}} kaca $3 nèng $4 nindesi pangalihan liyane",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|mindhahaké}} kaca $3 nèng $4 nindesi pangalihan liyane tanpa nginggalaké pangalihan",
index ab4bed2..e9a314c 100644 (file)
        "tog-watchlistreloadautomatically": "필터가 수정될 때마다 주시문서 목록 자동으로 새로 고치기 (자바스크립트 필요)",
        "tog-watchlisthideanons": "주시문서 목록에서 익명 사용자의 편집을 숨기기",
        "tog-watchlisthidepatrolled": "주시문서 목록에서 점검한 편집을 숨기기",
-       "tog-watchlisthidecategorization": "페이지 류 숨기기",
+       "tog-watchlisthidecategorization": "페이지 류 숨기기",
        "tog-ccmeonemails": "이메일을 보낼 때 내 이메일로 복사본을 보내기",
        "tog-diffonly": "편집 차이를 비교할 때 문서 내용을 보지 않기",
        "tog-showhiddencats": "숨은 분류 보이기",
        "youhavenewmessages": "다른 사용자로부터의 $1가 {{PLURAL:$3|있습니다}}. ($2)",
        "youhavenewmessagesfromusers": "{{PLURAL:$3|다른 사용자로|사용자 $3명으로}}부터의 $1가 {{PLURAL:$4|있습니다}}. ($2)",
        "youhavenewmessagesmanyusers": "여러 사용자로부터의 $1가 있습니다. ($2)",
-       "newmessageslinkplural": "{{PLURAL:$1|새 메시지}}",
-       "newmessagesdifflinkplural": "마지막으로 {{PLURAL:$1|바뀐 내용}}",
+       "newmessageslinkplural": "{{PLURAL:$1|새 메시지|999=새 메시지}}",
+       "newmessagesdifflinkplural": "마지막으로 {{PLURAL:$1|바뀐 내용|999=바뀐 내용}}",
        "youhavenewmessagesmulti": "다른 사용자가 $1에 남긴 새 메시지가 있습니다",
        "editsection": "편집",
        "editold": "편집",
        "nstab-category": "분류",
        "mainpage-nstab": "대문",
        "nosuchaction": "이러한 명령이 없습니다",
-       "nosuchactiontext": "URL에 지정한 명령이 올바르지 않습니다.\nURL을 잘못 입력했거나, 올바르지 않은 링크를 따라갔을 수 있습니다.\n{{SITENAME}}에 사용하는 소프트웨어의 버그가 있을 수 있습니다.",
+       "nosuchactiontext": "URL에 지정한 명령이 올바르지 않습니다.\nURL을 잘못 입력했거나, 올바르지 않은 링크를 따라갔을 수 있습니다.\n{{SITENAME}}에 사용하는 소프트웨어의 버그일 수도 있습니다.",
        "nosuchspecialpage": "해당하는 특수 문서가 없습니다",
        "nospecialpagetext": "<strong>요청한 특수 문서가 존재하지 않습니다.</strong>\n\n특수 문서의 목록은 [[Special:SpecialPages|여기]]에서 볼 수 있습니다.",
        "error": "오류",
        "databaseerror": "데이터베이스 오류",
-       "databaseerror-text": "데이터베이스 쿼리에 오류가 발생했습니다.\n소프트웨어에 버그가 있을 수 있습니다.",
-       "databaseerror-textcl": "데이터베이스 쿼리 오류가 발생했습니다.",
+       "databaseerror-text": "데이터베이스 쿼리 오류가 발생했습니다.\n소프트웨어의 버그일 수 있습니다.",
+       "databaseerror-textcl": "데이터베이스 쿼리 오류가 발생했습니다.",
        "databaseerror-query": "쿼리: $1",
        "databaseerror-function": "함수: $1",
        "databaseerror-error": "오류: $1",
        "enterlockreason": "데이터베이스를 잠그는 이유와 예상되는 기간을 적어 주세요.",
        "readonlytext": "데이터베이스가 잠겨 있어서 문서를 편집할 수 없습니다. 데이터베이스 관리가 끝난 후에는 정상으로 돌아올 것입니다.\n\n시스템 관리자가 데이터베이스를 잠글 때 남긴 메시지는 다음과 같습니다: $1",
        "missing-article": "데이터베이스에서 \"$1\" 문서의 $2 텍스트를 찾지 못했습니다.\n\n삭제된 문서의 오래된 차이나 역사 링크를 보려고 시도할 때 이러한 문제가 발생할 수 있습니다.\n\n그렇지 않다면, 소프트웨어에 버그가 발생했을 수도 있습니다.\n[[Special:ListUsers/sysop|관리자]]에게 URL을 참조하여 알려주세요.",
-       "missingarticle-rev": "(판번호: $1)",
+       "missingarticle-rev": "(판 번호: $1)",
        "missingarticle-diff": "(차이: $1, $2)",
        "readonly_lag": "슬레이브 데이터베이스 서버들이 마스터 서버와 동기화되고 있습니다. 그 동안 데이터베이스가 자동으로 잠겨져 있습니다.",
        "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' HTTP 헤더가 붙어있지만 API 쓰기 모듈에 대한 요청을 했습니다.",
        "cannotdelete": "\"$1\" 문서나 파일을 삭제할 수 없습니다.\n이미 삭제되었을 수도 있습니다.",
        "cannotdelete-title": "\"$1\" 문서를 삭제할 수 없습니다.",
        "delete-hook-aborted": "훅이 삭제를 중단했습니다.\n아무런 설명도 주어지지 않았습니다.",
-       "no-null-revision": "\"$1\" 문서에 대한 새 빈 판을 만들 수 없습니다",
+       "no-null-revision": "\"$1\" 문서에 대한 빈 판을 새로 만들 수 없습니다.",
        "badtitle": "잘못된 제목",
        "badtitletext": "요청한 문서 제목이 잘못되었거나, 비어있거나, 잘못된 인터위키 제목으로 링크했습니다.\n문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.",
-       "title-invalid-empty": "요청한 페이지의 제목이 비거나 이름공간밖에 안 들어있습니다.",
+       "title-invalid-empty": "요청한 페이지의 제목이 비어있거나 이름공간의 이름만 포함하고 있습니다.",
        "title-invalid-utf8": "요청한 페이지 제목에 잘못된 UTF-8 글자가 있습니다.",
        "title-invalid-interwiki": "요청한 페이지 제목에 제목에는 사용될 수 없는 위키간 링크가 있습니다.",
        "title-invalid-talk-namespace": "요청한 페이지 제목이 존재하지 않는 토론 문서를 가리킵니다.",
        "title-invalid-characters": "요청된 문서 제목이 잘못된 문자를 포함하고 있습니다: \"$1\".",
        "title-invalid-relative": "제목에 상대 경로가 있습니다. 제목에 상대 경로를 쓰는 것은 적절하지 않습니다. 제목에 붙은 상대 경로는 사용자 브라우저에서 제대로 인식하지 못할 수도 있습니다.",
        "title-invalid-magic-tilde": "요청한 문서의 제목에 적절하지 못한 특수 물결 문자열(magic tilde sequence; <nowiki>~~~</nowiki>)이 들어있습니다.",
-       "title-invalid-too-long": "페이지 제목이 너무 깁니다. 페이지 제목 길이는 최대 $1 까지 설정할 수 있습니다.",
-       "title-invalid-leading-colon": "페이지 제목에 잘못된 문자가 포함되어 있습니다.",
+       "title-invalid-too-long": "요청된 페이지 제목이 너무 깁니다. 길이는 UTF-8 인코딩 기준 최대 $1 바이트까지 설정할 수 있습니다.",
+       "title-invalid-leading-colon": "요청된 페이지 제목 처음에 잘못된 콜론 문자가 포함되어 있습니다.",
        "perfcached": "다음 자료는 캐시된 것이며 최신이 아닐 수 있습니다. 캐시에 최대 {{PLURAL:$1|결과 한 개|결과 $1개}}가 있습니다.",
        "perfcachedts": "다음 자료는 캐시된 것으로, $1에 마지막으로 업데이트되었습니다. 캐시에 최대 {{PLURAL:$4|결과 한 개|결과 $4개}}가 있습니다.",
-       "querypage-no-updates": "ì\9d´ ë¬¸ì\84\9cì\9d\98 ê°±ì\8b ì\9d´ í\98\84ì\9e¬ ì¤\91ì§\80ë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9e\90ë£\8cê°\80 ì\9e ì\8b\9c 갱신되지 않을 것입니다.",
+       "querypage-no-updates": "ì\9d´ ë¬¸ì\84\9cì\9d\98 ê°±ì\8b ì\9d´ í\98\84ì\9e¬ ì¤\91ì§\80ë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì§\80ê¸\88ì\9d\80 ì\9e\90ë£\8cê°\80 갱신되지 않을 것입니다.",
        "viewsource": "원본 보기",
        "viewsource-title": "$1 문서 원본 보기",
        "actionthrottled": "동작 중지",
-       "actionthrottledtext": "악용을 막기 위해 짧은 시간 동안 이 작업을 너무 많이 수행하는 것을 ë§\89ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì \9cí\95\9cì\9d\84 ë\84\98ì\97\88ì\9c¼ë\8b\88 ëª\87 ë¶\84 ë\92¤ì\97\90 ì\83\88ë¡\9c ì\8b\9cë\8f\84í\95\98ì\84¸ì\9a\94.",
+       "actionthrottledtext": "악용을 막기 위해 짧은 시간 동안 이 작업을 너무 많이 수행하는 것을 ì \9cí\95\9cí\95\98ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì \9cí\95\9cì\9d\84 ë\84\98ì\97\88ì\9c¼ë\8b\88 ëª\87 ë¶\84 ë\92¤ì\97\90 ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95\98ì\84¸ì\9a\94.",
        "protectedpagetext": "이 문서는 편집하거나 다른 명령을 할 수 없도록 보호되어 있습니다.",
        "viewsourcetext": "문서의 원본을 보거나 복사할 수 있습니다.",
-       "viewyourtext": "이 문서로의 <strong>당신의 편집</strong>의 원본을 보고 복사할 수 있습니다.",
+       "viewyourtext": "이 문서에 속한 <strong>당신의 편집</strong>의 원본을 보고 복사할 수 있습니다.",
        "protectedinterface": "이 문서는 이 위키의 소프트웨어 인터페이스에 쓰이는 문서로, 부정 행위를 막기 위해 보호되어 있습니다.\n모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하시기 바랍니다.",
        "editinginterface": "<strong>경고:</strong> 소프트웨어 인터페이스에 쓰이는 문서를 고치고 있습니다.\n이 문서에 있는 내용을 바꾸면 이 위키에 있는 모든 사용자에게 영향을 끼칩니다.",
        "translateinterface": "모든 위키를 위해 번역을 추가하거나 바꾸려면, 미디어위키 지역화 프로젝트인 [//translatewiki.net/ translatewiki.net]을 사용해 주시기 바랍니다.",
        "cascadeprotected": "이 문서는 다음 \"연쇄적\" 보호가 걸린 {{PLURAL:$1|문서|문서들}}에 포함되어 있어 함께 보호됩니다:\n$2",
-       "namespaceprotected": "<strong>$1</strong> 이름공간의 문서를 편집할 수 있는 권한이 없습니다.",
+       "namespaceprotected": "<strong>$1</strong> 이름공간의 문서를 편집할 권한이 없습니다.",
        "customcssprotected": "여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 CSS 문서를 편집할 수 없습니다.",
        "customjsprotected": "여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 자바스크립트 문서를 편집할 수 없습니다.",
        "mycustomcssprotected": "이 CSS 문서를 편집할 권한이 없습니다.",
        "mypreferencesprotected": "내 환경 설정을 편집할 권한이 없습니다.",
        "ns-specialprotected": "특수 문서는 편집할 수 없습니다.",
        "titleprotected": "[[User:$1|$1]] 사용자가 문서 만들기를 금지했습니다.\n이유는 다음과 같습니다. <em>$2</em>",
-       "filereadonlyerror": "\"$2\" 파일 저장소가 읽기 전용이기 때문에 \"$1\" 파일을 바꿀 수 없습니다.\n\n저장소 관리자가 파일 저장소를 잠근 이유에 대한 설명을 남겼습니다: \"$3\".",
+       "filereadonlyerror": "\"$2\" 파일 저장소가 읽기 전용이기 때문에 \"$1\" 파일을 바꿀 수 없습니다.\n\n파일 저장소를 잠근 시스템 관리자가 다음과 같은 설명을 남겼습니다: \"$3\".",
        "invalidtitle-knownnamespace": "제목 오류: \"$2\" 이름공간과 \"$3\" 텍스트",
-       "invalidtitle-unknownnamespace": "제목 오류: 알 수 없는 $1 이름공간 번호와, \"$2\" 텍스트",
+       "invalidtitle-unknownnamespace": "제목 오류: 알 수 없는 $1 이름공간 번호와 \"$2\" 텍스트",
        "exception-nologin": "로그인하지 않음",
        "exception-nologin-text": "이 문서에 접근하거나 이 동작을 수행하려면 로그인하세요.",
        "exception-nologin-text-manual": "이 문서에 접근하거나 이 명령을 수행하려면 $1하세요.",
        "cannotlogoutnow-title": "지금 로그아웃할 수 없습니다",
        "cannotlogoutnow-text": "$1 사용 중에는 로그아웃이 불가능합니다.",
        "welcomeuser": "$1님, 환영합니다!",
-       "welcomecreation-msg": "계정이 만들어졌습니다.\n[[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.",
+       "welcomecreation-msg": "계정이 만들어졌습니다.\n{{SITENAME}}의 사용자 [[Special:Preferences|환경 설정]]을 바꿀 수 있습니다.",
        "yourname": "사용자 이름:",
-       "userlogin-yourname": "사용자 계정 이름",
-       "userlogin-yourname-ph": "사용자 계정 이름을 입력하세요",
-       "createacct-another-username-ph": "사용자 계정 이름을 입력하세요",
+       "userlogin-yourname": "사용자 이름",
+       "userlogin-yourname-ph": "사용자 이름을 입력하세요",
+       "createacct-another-username-ph": "사용자 이름을 입력하세요",
        "yourpassword": "비밀번호:",
        "userlogin-yourpassword": "비밀번호",
        "userlogin-yourpassword-ph": "비밀번호를 입력하세요",
        "yourpasswordagain": "비밀번호 다시 입력:",
        "createacct-yourpasswordagain": "비밀번호 확인",
        "createacct-yourpasswordagain-ph": "비밀번호를 다시 입력하세요",
-       "remembermypassword": "이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})",
+       "remembermypassword": "이 브라우저에 로그인 상태 저장하기 (최대 $1일)",
        "userlogin-remembermypassword": "로그인 상태를 유지하기",
        "userlogin-signwithsecure": "보안 연결 사용",
        "cannotloginnow-title": "지금 로그인할 수 없습니다.",
        "cannotloginnow-text": "$1 사용 중에는 로그인이 불가능합니다.",
        "yourdomainname": "도메인 이름:",
        "password-change-forbidden": "이 위키에서 비밀번호를 바꿀 수 없습니다.",
-       "externaldberror": "바깥 인증 데이터베이스에 오류가 있거나 바깥 계정을 새로 고칠 권한이 없습니다.",
+       "externaldberror": "인증 데이터베이스에 오류가 있거나 바깥 계정을 새로 고칠 권한이 없습니다.",
        "login": "로그인",
        "nav-login-createaccount": "로그인 / 계정 만들기",
        "userlogin": "로그인 / 계정 만들기",
        "createacct-emailoptional": "이메일 주소 (선택 사항)",
        "createacct-email-ph": "이메일 주소를 입력하세요",
        "createacct-another-email-ph": "이메일 주소를 입력하세요",
-       "createaccountmail": "ì\9e\84ì\8b\9c ì\9e\84ì\9d\98 비밀번호를 이메일로 보내기",
+       "createaccountmail": "ì\9e\84ì\9d\98ì\9d\98 ì\9e\84ì\8b\9c 비밀번호를 이메일로 보내기",
        "createacct-realname": "실명 (선택 사항)",
        "createaccountreason": "이유:",
        "createacct-reason": "이유",
        "userexists": "입력한 사용자 계정 이름이 이미 사용되고 있습니다.\n다른 이름을 선택하세요.",
        "loginerror": "로그인 오류",
        "createacct-error": "계정 만들기 오류",
-       "createaccounterror": "계정을 만들수 없습니다: $1",
-       "nocookiesnew": "사용자 계정을 만들었지만, 아직 로그인하고 있지 않습니다.\n{{SITENAME}}에서는 로그인 정보를 저장하기 위해 쿠키를 사용합니다.\n지금 사용하는 웹 브라우저는 쿠키를 사용하지 않도록 설정되어 있습니다.\n로그인하기 전에 웹 브라우저에서 쿠키를 사용하도록 설정해주세요.",
+       "createaccounterror": "계정을 만들 수 없습니다: $1",
+       "nocookiesnew": "사용자 계정을 만들었지만, 로그인되어 있지 않습니다.\n{{SITENAME}}에서는 로그인을 위해 쿠키를 사용합니다.\n사용자는 쿠키를 사용하지 않도록 설정되어 있습니다.\n쿠키를 사용하도록 설정한 다음 새로운 사용자 이름과 비밀번호로 로그인하세요.",
        "nocookieslogin": "{{SITENAME}}에서는 로그인을 위해 쿠키를 사용합니다.\n쿠키가 비활성되어 있습니다.\n쿠키 사용을 활성화한 다음 다시 시도하세요.",
        "nocookiesfornew": "요청의 출처를 확인할 수 없기 때문에 사용자 계정이 만들어지지 않았습니다.\n쿠키를 활성화한 것을 확인하고, 이 문서를 새로 고치고 나서 다시 시도하세요.",
        "noname": "사용자 계정 이름이 올바르지 않습니다.",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|토론]]) 사용자 계정이 만들어졌습니다.",
        "createaccount-title": "{{SITENAME}} 계정 만들기",
        "createaccount-text": "누군가가 {{SITENAME}} ($4)에서 사용자 이름 \"$2\", 비밀번호 \"$3\"로 당신의 이메일 주소가 등록된 계정을 만들었습니다. \n지금 로그인하여 비밀번호를 바꾸십시오.\n\n실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.",
-       "login-throttled": "로그인에 연속으로 실패하였습니다.\n$1 기다렸다가 다시 시도하세요.",
+       "login-throttled": "최근 너무 많이 로그인을 시도했습니다.\n$1 뒤에 다시 시도하세요.",
        "login-abort-generic": "로그인에 실패했습니다 - 중지됨",
        "login-migrated-generic": "당신의 계정이 마이그레이션되었으며, 당신의 사용자 이름이 더 이상 이 위키에 존재하지 않습니다.",
        "loginlanguagelabel": "언어: $1",
        "changepassword-success": "비밀번호가 바뀌었습니다!",
        "changepassword-throttled": "최근 너무 많이 로그인을 시도했습니다.\n$1 뒤에 다시 시도하세요.",
        "botpasswords": "봇 비밀번호",
-       "botpasswords-summary": "<em>봇 비밀번호</em>는 사용자의 기본 로그인 정보를 이용하지 않고 API를 통한 사용자 계정으로의 접근을 허용합니다. 봇 비밀번호를 이용하여 로그인할 때 이용 가능한 사용자 권한은 제한될 수 있습니다.\n\n이 기능을 이용할 이유가 없다면 굳이 이용하지 않으셔도 됩니다. 누구도 이 비밀번호의 생성을 사용자에게 요청할 수 없으며, 이를 수락하여 전달하지 말아 주십시오.",
+       "botpasswords-summary": "'''봇 비밀번호'''는 사용자의 기본 로그인 정보를 이용하지 않고 API를 통한 사용자 계정으로의 접근을 허용합니다. 봇 비밀번호를 이용하여 로그인할 때 이용 가능한 사용자 권한은 제한될 수 있습니다.\n\n이 기능을 이용할 이유가 없다면 굳이 이용하지 않으셔도 됩니다. 누구도 이 비밀번호의 생성을 사용자에게 요청할 수 없으며, 이를 수락하여 전달하지 말아 주십시오.",
        "botpasswords-disabled": "봇 비밀번호가 비활성화되었습니다.",
        "botpasswords-no-central-id": "봇 비밀번호를 사용하려면 통합 계정으로 로그인해야 합니다.",
        "botpasswords-existing": "기존의 봇 비밀번호",
        "botpasswords-invalid-name": "지정된 사용자 이름은 봇 비밀번호 구분자(\"$1\")를 포함하고 있지 않습니다.",
        "botpasswords-not-exist": "\"$1\" 사용자가 이름이 \"$2\"인 봇의 비밀번호를 가지고 있지 않습니다.",
        "resetpass_forbidden": "비밀번호를 바꿀 수 없습니다",
-       "resetpass-no-info": "ì\9d´ í\8a¹ì\88\98 ë¬¸ì\84\9cì\97\90 ì§\81ì \91 ì \91ê·¼í\95\98려면 ë°\98ë\93\9cì\8b\9c 로그인해야 합니다.",
+       "resetpass-no-info": "ì\9d´ í\8e\98ì\9d´ì§\80ì\97\90 ì§\81ì \91 ì \91ê·¼í\95\98려면 로그인해야 합니다.",
        "resetpass-submit-loggedin": "비밀번호 바꾸기",
        "resetpass-submit-cancel": "취소",
        "resetpass-wrong-oldpass": "비밀번호가 잘못되었거나 현재의 비밀번호와 같습니다.\n이미 비밀번호를 바꾸었거나 새 임시 비밀번호를 요청했을 수 있습니다.",
        "passwordreset-text-many": "{{PLURAL:$1|이메일을 통해 임시 비밀번호를 받으려면 필드 중 하나를 채우세요.}}",
        "passwordreset-disabled": "이 위키에서는 비밀번호를 재설정할 수 없습니다.",
        "passwordreset-emaildisabled": "이 위키에서 이메일 기능이 비활성화되어 있습니다.",
-       "passwordreset-username": "사용자 계정 이름:",
+       "passwordreset-username": "사용자 이름:",
        "passwordreset-domain": "도메인:",
        "passwordreset-capture": "발송 결과 이메일을 보시겠습니까?",
        "passwordreset-capture-help": "이 상자에 체크하면 이메일이 발송된 즉시 임시 비밀번호가 담긴 이메일을 볼 수 있습니다.",
        "changeemail": "이메일 주소를 바꾸거나 제거하기",
        "changeemail-header": "이메일 주소를 바꾸려면 이 양식을 채우세요. 계정에서 이메일 연동을 취소하고 싶다면 양식을 제출할 때 새 이메일 주소를 공란으로 두세요.",
        "changeemail-passwordrequired": "변경을 적용하려면 비밀번호를 입력해야 합니다.",
-       "changeemail-no-info": "ì\9d´ í\8a¹ì\88\98 ë¬¸ì\84\9cì\97\90 ì§\81ì \91 ì \91ê·¼í\95\98려면 ë°\98ë\93\9cì\8b\9c 로그인해야 합니다.",
+       "changeemail-no-info": "ì\9d´ í\8e\98ì\9d´ì§\80ì\97\90 ì§\81ì \91 ì \91ê·¼í\95\98려면 로그인해야 합니다.",
        "changeemail-oldemail": "현재 이메일 주소:",
        "changeemail-newemail": "새 이메일 주소:",
        "changeemail-newemail-help": "이메일 주소를 삭제하고자 한다면 이 칸을 빈칸으로 두세요. 비밀번호 재설정이 불가능해지며, 이메일 주소가 없다면 이메일을 받을 수 없습니다.",
        "changeemail-none": "(없음)",
        "changeemail-password": "{{SITENAME}} 비밀번호:",
        "changeemail-submit": "이메일 주소 바꾸기",
-       "changeemail-throttled": "로그인에 연속으로 너무 많이 실패하였습니다.\n$1 기다렸다가 다시 시도하세요.",
+       "changeemail-throttled": "최근 너무 많이 로그인을 시도했습니다.\n$1 뒤에 다시 시도하세요.",
        "changeemail-nochange": "다른 이메일 주소를 입력해 주세요.",
        "resettokens": "토큰 재설정",
        "resettokens-text": "여기에 당신의 계정과 관련된 특정 개인 데이터에 접근을 허용하는 토큰을 재설정합니다.\n\n토큰이 다른 사람에게 알려졌거나 계정이 침해되었을 때는 재설정해야 합니다.",
        "preview": "미리 보기",
        "showpreview": "미리 보기",
        "showdiff": "차이 보기",
-       "blankarticle": "<strong>경고:</strong> 만들려는 문서가 비어 있습니다.\n\"{{int:savearticle}}\"을 다시 클릭하면, 문서에 내용이 없이 만들어집니다.",
+       "blankarticle": "<strong>경고:</strong> 만들려는 문서가 비어 있습니다.\n\"{{int:savearticle}}\"을 다시 클릭하면, 아무 내용 없이 문서가 만들어집니다.",
        "anoneditwarning": "<strong>경고:</strong> 로그인을 하고 있지 않습니다. 편집을 하게 되면 IP 주소가 공개적으로 보여집니다. <strong>[$1 로그인]</strong>하거나 <strong>[$2 계정을 생성하면]</strong>, 편집 시에 다른 이점과 함께 사용자 이름이 표시됩니다.",
        "anonpreviewwarning": "<em>로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서의 편집 역사에 남게 됩니다.</em>",
        "missingsummary": "'''알림:''' 편집 요약을 적지 않았습니다.\n이대로 \"{{int:savearticle}}\"을 클릭하면 편집 요약 없이 저장됩니다.",
        "userpage-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.\n이 문서를 만들거나 편집하기 전에 계정이 존재하는지 확인해주세요.",
        "userpage-userdoesnotexist-view": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
        "blocked-notice-logextract": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 최근 차단 기록을 참조하십시오:",
-       "clearyourcache": "<strong>참고:</strong> 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* <strong>파이어폭스 / 사파리</strong>: <em>Shift</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em> 또는 <em>Ctrl-R</em> 을 입력 (Mac에서는 <em>⌘-R</em>)\n* <strong>구글 크롬</strong>: <em>Ctrl-Shift-R</em>키를 입력 (Mac에서는 <em>⌘-Shift-R</em>)\n* <strong>인터넷 익스플로러</strong>: <em>Ctrl</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em>를 입력.\n* <strong>오페라:</strong> <em>메뉴 → 설정</em>(맥의 경우 <em>오페라 → 환경 설정</em>)으로 이동한 다음 <em>개인 정보 보호 및 보안 → 검색 데이터 지우기 → 캐시한 이미지 및 파일</em> 누름.",
+       "clearyourcache": "<strong>참고:</strong> 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* <strong>파이어폭스 / 사파리</strong>: <em>Shift</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em> 또는 <em>Ctrl-R</em> 을 입력 (Mac에서는 <em>⌘-R</em>)\n* <strong>구글 크롬</strong>: <em>Ctrl-Shift-R</em>키를 입력 (Mac에서는 <em>⌘-Shift-R</em>)\n* <strong>인터넷 익스플로러</strong>: <em>Ctrl</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em>를 입력.\n* <strong>오페라:</strong> <em>메뉴 → 설정</em>(맥의 경우 <em>오페라 → 환경 설정</em>)으로 이동한 다음 <em>개인 정보 보호 및 보안 → 검색 데이터 지우기 → 캐시한 이미지 및 파일</em> 누름.",
        "usercssyoucanpreview": "'''안내''': CSS 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
        "userjsyoucanpreview": "'''안내''': 자바스크립트 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
        "usercsspreview": "'''사용자 CSS의 미리 보기입니다.'''\n'''아직 저장하지 않았습니다!'''",
        "note": "<strong>참고:</strong>",
        "previewnote": "'''이 화면은 미리 보기입니다.'''\n편집한 내용은 아직 저장하지 않았습니다!",
        "continue-editing": "편집 영역으로 가기",
-       "previewconflict": "이 미리 보기는 저장할 때의 모습으로 위쪽 편집창의 문서를 반영합니다.",
+       "previewconflict": "이 미리 보기는 저장할 때의 모습으로, 위쪽 편집 영역의 텍스트를 반영합니다.",
        "session_fail_preview": "세션 데이터가 없어져 편집을 저장하지 못했습니다.\n\n로그아웃되었는지도 모릅니다. <strong>아직 로그인 상태인지 확인하고 다시 시도해주세요</strong>.\n다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인하세요. 그리고 브라우저 설정에서 쿠키 사용을 허용하는지 확인하세요.",
        "session_fail_preview_html": "세션 데이터가 없어져 편집을 저장하지 못했습니다.\n\n<em>{{SITENAME}}에서 HTML 입력을 허용하기 때문에, 자바스크립트 공격을 막기 위해 미리 보기는 숨겨져 있습니다.</em>\n\n<strong>적합하게 편집을 시도했다면 다시 시도해주세요.</strong>\n다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인하고, 브라우저가 이 사이트에서 쿠키를 허용하는지 확인하세요.",
        "token_suffix_mismatch": "'''저장하려는 내용의 문장 부호가 망가져 있습니다.'''\n문서 보호를 위해 해당 내용을 저장하지 않습니다.\n버그가 있는 익명 프록시 서비스 등을 사용할 때 이런 문제가 발생할 수 있습니다.",
        "explainconflict": "문서를 편집하는 도중에 누군가 이 문서를 고쳤습니다.\n위쪽의 문서가 지금 바뀐 문서이고, 아래쪽의 문서가 당신이 편집한 문서입니다.\n아래쪽의 내용을 위쪽에 적절히 합쳐 주시기 바랍니다.\n\"{{int:savearticle}}\"을 누르면 '''위쪽의 편집 내역만''' 저장됩니다.",
        "yourtext": "당신의 편집",
        "storedversion": "현재 문서",
-       "nonunicodebrowser": "<strong>경고: 웹 브라우저가 유니코드를 완벽하게 지원하지 않습니다.</strong>\n아스키가 아닌 문자가 16진수 코드로 나타날 수 있습니다.",
+       "nonunicodebrowser": "<strong>경고: 브라우저가 유니코드를 지원하지 않습니다.</strong>\n문서를 안전하게 편집할 수 있도록 다음의 우회 방안이 제공됩니다: 편집 상자에서 아스키가 아닌 문자가 16진수 코드로 나타납니다.",
        "editingold": "<strong>경고: 이 문서의 오래된 판을 편집하고 있습니다.</strong>\n이것을 저장하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.",
        "yourdiff": "차이",
        "copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n<strong>저작권이 있는 내용을 허가 없이 저장하지 마세요!</strong>",
        "readonlywarning": "<strong>경고: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.</strong>\n편집 내용을 복사하여 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.\n\n데이터베이스를 잠근 시스템 관리자가 남긴 설명은 다음과 같습니다: $1",
        "protectedpagewarning": "<strong>경고: 이 문서는 관리자 권한이 있는 사용자만 편집할 수 있도록 보호되어 있습니다.</strong>\n이 문서의 최근 기록을 참조하십시오:",
        "semiprotectedpagewarning": "<strong>참고:</strong> 이 문서는 계정을 등록한 사용자만이 편집할 수 있도록 보호되어 있습니다.\n이 문서의 최근 기록을 참조하십시오:",
-       "cascadeprotectedwarning": "<strong>경고:</strong> 이 문서는 보호되어 있어 관리자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
+       "cascadeprotectedwarning": "<strong>경고:</strong> 이 문서는 보호되어 있어 관리자 권한이 있는 사용자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
        "titleprotectedwarning": "<strong>경고: 이 문서는 보호되어 있어, 문서를 만드려면 [[Special:ListGroupRights|특정한 권한]]이 필요합니다.</strong>\n아래 문서의 최근 기록을 참조하십시오:",
        "templatesused": "이 문서에서 사용한 {{PLURAL:$1|틀}}:",
        "templatesusedpreview": "이 미리 보기에서 사용하고 있는 {{PLURAL:$1|틀}}:",
        "duplicate-args-category": "중복된 인수를 사용한 틀의 호출을 포함한 문서",
        "duplicate-args-category-desc": "문서에 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>나 <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>와 같은, 인수를 중복하여 사용한 틀 호출을 포함합니다.",
        "expensive-parserfunction-warning": "<strong>경고:</strong> 이 문서는 너무 많은 파서 함수를 포함하고 있습니다.\n\n$2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개를 쓰고 있습니다}}.",
-       "expensive-parserfunction-category": "느린 파서 함수 호출을 너무 많이 하는 문서",
+       "expensive-parserfunction-category": "파서 함수 호출을 너무 많이 사용하는 문서",
        "post-expand-template-inclusion-warning": "<strong>경고:</strong> 틀 포함 크기가 너무 큽니다.\n일부 틀은 포함되지 않을 수 있습니다.",
        "post-expand-template-inclusion-category": "사용한 틀의 크기가 지나치게 큰 문서의 목록",
        "post-expand-template-argument-warning": "<strong>경고:</strong> 이 문서는 전개하면 크기가 너무 큰 틀 인수가 하나 이상 포함되어 있습니다.\n이 인수는 생략했습니다.",
        "parser-unstrip-loop-warning": "Unstrip의 반복을 감지했습니다",
        "parser-unstrip-recursion-limit": "Unstrip의 재귀 한도를 초과했습니다 ($1)",
        "converter-manual-rule-error": "언어 변환 규칙을 수동으로 지정하는 도중 오류",
-       "undo-success": "편집을 되돌릴 수 있습니다.\n편집 되돌리기를 완료하려면 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.",
+       "undo-success": "편집을 되돌릴 수 있습니다.\n이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.",
        "undo-failure": "중간의 다른 편집과 충돌하여 이 편집을 되돌릴 수 없습니다.",
        "undo-norev": "문서가 없거나 삭제되었기 때문에 편집을 되돌릴 수 없습니다.",
        "undo-nochange": "편집이 이미 되돌려진 것으로 나타납니다.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]])의 $1판 편집을 되돌림",
        "undo-summary-username-hidden": "숨겨진 사용자가 $1 판을 되돌림",
        "cantcreateaccounttitle": "계정을 만들 수 없습니다",
-       "cantcreateaccount-text": "현재 아이피 주소('''$1''')는 [[User:$3|$3]] 사용자에 의해 계정 만들기가 차단되었습니다.\n\n차단 이유는 다음과 같습니다: $2",
+       "cantcreateaccount-text": "현재 IP 주소('''$1''')는 [[User:$3|$3]] 사용자에 의해 계정 만들기가 차단되었습니다.\n\n차단 이유는 다음과 같습니다: $2",
        "cantcreateaccount-range-text": "당신의 IP 주소(<strong>$4</strong>)가 속해 있는 <strong>$1</strong> 대역에서의 계정 생성을 [[User:$3|$3]] 사용자가 차단하였습니다.\n\n$3 사용자가 제시한 이유는 \"$2\"입니다.",
        "viewpagelogs": "이 문서의 기록 보기",
        "nohistory": "이 문서는 편집 역사가 없습니다.",
        "logdelete-selected": "{{PLURAL:$1|선택한 기록}}:",
        "revdelete-text-text": "삭제된 판은 여전히 문서 역사에 남게 되지만, 그 내용의 일부는 다른 사람들이 접근할 수 없게 됩니다.",
        "revdelete-text-file": "삭제된 파일 버전은 계속 파일 역사에 남게 되지만, 내용의 일부는 다른 사람들이 접근할 수 없게 됩니다.",
-       "logdelete-text": "ì\82­ì \9cë\90\9c ë¡\9cê·¸ ë\82´ì\9a©ì\9d\80 ë¡\9cê·¸ì\97\90 ë³´ì\97¬ì§\80ê² ì§\80ë§\8c, ë\82´ì\9a©ì\9d\98 ì\9d¼ë¶\80ë\8a\94 ë\8b¤ë¥¸ ì\82¬ë\9e\8cë\93¤이 접근할 수 없게 됩니다.",
+       "logdelete-text": "ì\82­ì \9cë\90\9c ë¡\9cê·¸ ë\82´ì\9a©ì\9d\80 ë¡\9cê·¸ì\97\90 ë\82\98í\83\80ë\82\98ì§\80ë§\8c, ë\82´ì\9a© ì¤\91 ì\9d¼ë¶\80ë\8a\94 ì\9d¼ë°\98ì\9d¸이 접근할 수 없게 됩니다.",
        "revdelete-text-others": "다른 관리자는 여전히 숨겨진 내용에 접근할 수 있고 추가 제한이 설정되어 있지 않으면, 다시 되살릴 수 있습니다.",
-       "revdelete-confirm": "ì\9d´ ì\9e\91ì\97\85ì\9d\84 ì\88\98í\96\89í\95\98ë\8a\94 ê²\83ì\9d\98 ê²°ê³¼ë¥¼ ì\95\8cê³  ì\9e\88ì\9c¼ë©°, [[{{MediaWiki:Policy-url}}|ì \95ì±\85]]ì\97\90 ë§\9eë\8a\94 í\96\89ë\8f\99ì\9d¸지 확인해주세요.",
+       "revdelete-confirm": "ì\9d´ ì\9e\91ì\97\85ì\9d\98 ì\88\98í\96\89 ê²°ê³¼ë¥¼ ì\95\8cê³  ì\9e\88ì\9c¼ë©°, ì\9d´ ì\9e\91ì\97\85ì\9d´ [[{{MediaWiki:Policy-url}}|ì \95ì±\85]]ì\97\90 ì\9d\98ê±°í\95\98ë\8a\94지 확인해주세요.",
        "revdelete-suppress-text": "숨기기는 <strong>다음 경우에만</strong> 사용되어야 합니다:\n* 잠재적인 비방 정보\n* 부적절한 개인 정보\n*: 집 주소, 전화번호, 주민등록번호 등",
        "revdelete-legend": "보이기 제한을 설정",
        "revdelete-hide-text": "판 문자열",
        "mergehistory-submit": "판 합치기",
        "mergehistory-empty": "합칠 수 있는 판이 없습니다.",
        "mergehistory-done": "$1 문서의 {{PLURAL:$3|판}} $3개{{PLURAL:$3|가}} [[:$2]]에 성공적으로 합쳐졌습니다.",
-       "mergehistory-fail": "역사 합치기를 수행할 수 없습니다, 문서와 시간 변수를 다시 확인하세요.",
-       "mergehistory-fail-bad-timestamp": "타임스탬프(timestamp)가 적절하지 않습니다.",
+       "mergehistory-fail": "역사 합치기를 수행할 수 없습니다. 문서와 시간 변수를 다시 확인하세요.",
+       "mergehistory-fail-bad-timestamp": "타임스탬프가 적절하지 않습니다.",
        "mergehistory-fail-invalid-source": "원본 문서가 적절하지 않습니다.",
        "mergehistory-fail-invalid-dest": "대상 문서가 적절하지 않습니다.",
        "mergehistory-fail-no-change": "역사 병합은 모든 판을 병합하지 못했습니다. 문서와 시간 변수를 다시 확인하여 주십시오.",
        "notextmatches": "해당하는 문서 없음",
        "prevn": "이전 {{PLURAL:$1|$1개}}",
        "nextn": "다음 {{PLURAL:$1|$1개}}",
-       "prev-page": "전 페이지",
+       "prev-page": "ì\9d´ì \84 í\8e\98ì\9d´ì§\80",
        "next-page": "다음 페이지",
        "prevn-title": "이전 {{PLURAL:$1|결과}} $1개",
        "nextn-title": "다음 {{PLURAL:$1|결과}} $1개",
index 610b404..7e4cc1a 100644 (file)
@@ -52,7 +52,7 @@
        "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",
-       "tog-norollbackdiff": "Donn noh „{{int:Rollback}}“ de Ungerscheide nit aanzeije",
+       "tog-norollbackdiff": "Donn noh „{{int:Rollback}}“ de Ongerscheide nit aanzeije",
        "tog-useeditwarning": "Donn mesch warne, wann esch vun en Sigg fott jonn, ih dat esch all ming Änderunge avjeschpeischert hann.",
        "tog-prefershttps": "Jangk emmer övver en verschlößelte Verbendong bei Enlogge",
        "underline-always": "jo, ongershtriishe",
        "upload-form-label-infoform-description": "Äkliehrong",
        "upload-form-label-usage-title": "Der Jebruch",
        "upload-form-label-usage-filename": "Dä Dattei iehre Nahme",
-       "upload-form-label-own-work": "dat es ming eije Wärk",
+       "upload-form-label-own-work": "Dat es ming eije Wärk",
        "upload-form-label-infoform-categories": "Saachjroppe",
        "upload-form-label-infoform-date": "Dattum",
-       "upload-form-label-not-own-work-message-local": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteule huh lahde kanns un derbei de Rähjelle {{ucfirst:{{GRAMMAR:vun|{{ucfirst:{{SITENAME}}}}}}}} ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
+       "upload-form-label-not-own-work-message-local": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteule huh lahde kanns un derbei och de Rähjelle {{GRAMMAR:vun|{{ucfirst:{{SITENAME}}}}}} ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
        "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.",
        "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.",
-       "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.",
+       "upload-form-label-not-own-work-message-default": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteije huh lahde kanns un derbei de Rähjelle ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
        "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.",
        "searchsuggest-containing": "dren änthallde…",
        "api-error-badaccess-groups": "Do häs nit et Rääsch, Datteije en heh dat Wiki huhzelaade.",
        "api-error-badtoken": "Fähler: et Kännzeijsche (<i lang=\"en\">token</i>) es kappott.",
+       "api-error-blocked": "Do bes föh et Änndere jeschpächt.",
        "api-error-copyuploaddisabled": "Et Huhlaade vun enem <i lang=\"en\">URL</i> es op däm ẞööver heh nit zohjelohße.",
        "api-error-duplicate": "Mer han em Wiki ald {{PLURAL:$1|[en Dattei]|[$1 andere Datteije]|[kein Dattei]}} mem akeraat sellve Enhalldt.",
        "api-error-duplicate-archive": "Mer hatte {{PLURAL:$1|[en ander Dattei]|[ander Datteije]|[kein ander Dattei]}} heh em Wiki mem sellve Enhalt, ävver se {{PLURAL:$1|es|sen|es}} ald fottjeschmeße woode.",
index 2962ddf..374650e 100644 (file)
        "continue-editing": "Gitt weider an de Beräich fir z'änneren",
        "previewconflict": "Dir gesitt an dem ieweschten Textfeld wéi den Text ausgesi wäert, wann Dir späichert.",
        "session_fail_preview": "<strong>Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.</strong>\nVersicht et w.e.g. nach eng Kéier.\nWann de Problem dann ëmmer nach bestoe sollt, da versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen.",
-       "session_fail_preview_html": "<strong>Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.</strong>\n\n<em>Well op {{SITENAME}} 'raw HTML' aktivéiert ass, gouf d'Uweise vun der nach net gespäicherter Versioun ausgeblennt fir JavaScript-Attacken ze vermeiden.</em>\n\n<strong>Wann Dir eng berechtegt Ännerung maache wëllt, da versicht et w.e.g. nach eng Kéier.\nWann de Problem dann ëmmer nach bestoe sollt, versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen.</strong>",
+       "session_fail_preview_html": "Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.\n\n<em>Well op {{SITENAME}} 'raw HTML' aktivéiert ass, gouf d'Uweise vun der nach net gespäicherter Versioun ausgeblennt fir JavaScript-Attacken ze vermeiden.</em>\n\n<strong>Wann Dir eng berechtegt Ännerung maache wëllt, da versicht et w.e.g. nach eng Kéier.</strong>\n\nWann de Problem dann ëmmer nach bestoe sollt, versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen a vergewëssert Iech datt Äre Browser d^Späichere vu Cookieë vun dësem Site zouléisst.",
        "token_suffix_mismatch": "'''Är Ännerung gouf refuséiert, well Äre Browser Zeechen am Ännerungs-Identifiant verännert huet.'''\nD'Ännerung gouf refuséiert, fir ze verhënneren datt den Text op der Säit onliesbar gëtt.\nDëst geschitt heiansdo wann Dir en anonyme Proxy-Service um Internet benotzt.",
        "edit_form_incomplete": "'''En Deel vum Ännerungsformulaire koum net um Server un; iwwerpréift w.e.g ob Är Ännerunge komplett sinn a probéiert nach emol.'''",
        "editing": "Ännere vu(n) $1",
index 8511b83..7caf232 100644 (file)
        "remembermypassword": "Prisiminti prisijungimo duomenis šiame kompiuteryje (daugiausiai $1 {{PLURAL:$1|dieną|dienas|dienų}})",
        "userlogin-remembermypassword": "Įsiminti mane",
        "userlogin-signwithsecure": "Naudoti saugią jungtį",
-       "cannotloginnow-title": "Negalima prisijungti dabar",
+       "cannotloginnow-title": "Dabar negalima prisijungti",
        "cannotloginnow-text": "Prisijungimas negalimas, kai naudojama $1.",
        "yourdomainname": "Jūsų domenas:",
        "password-change-forbidden": "Jus negalite keisti slaptažodžių šioje wiki.",
index 1bd4a2b..6b6edce 100644 (file)
        "sp-contributions-submit": "Chhoē",
        "whatlinkshere": "Tó-ūi liân kàu chia",
        "whatlinkshere-title": "Liân khì \"$1\" ê ia̍h-bīn",
-       "whatlinkshere-page": "頁:",
+       "whatlinkshere-page": "Ia̍h:",
        "linkshere": "Í-hā '''[[:$1]]''' liân kàu chia:",
        "nolinkshere": "Bô poàⁿ ia̍h liân kàu '''[[:$1]]'''.",
        "isredirect": "choán-ia̍h",
        "tooltip-ca-viewsource": "Chit ia̍h pó-hō͘ tiâu leh.\nLí ē-sái khoàⁿ i ê goân-sú-bé.",
        "tooltip-ca-history": "Chit ia̍h ê chá-chêng pán-pún",
        "tooltip-ca-delete": "Thâi chit ia̍h",
-       "tooltip-ca-move": "徙這頁",
+       "tooltip-ca-move": "Sóa chit ia̍h",
        "tooltip-ca-watch": "共這頁加入去你的監視單",
        "tooltip-ca-unwatch": "Lí ê kàm-sī-toaⁿ soá tiàu chit ia̍h.",
        "tooltip-search": "Chhoé {{SITENAME}}",
        "tooltip-diff": "Hián-sī lí tùi bûn-pún só͘ chò ê kái-tōng",
        "tooltip-watch": "共這頁加入去你的監視單",
        "tooltip-rollback": "Ji̍h \"Hoê-choán\" ē-sái thè tńg-khì téng-chi̍t-ê kái ê lâng ê ia̍h.",
-       "tooltip-preferences-save": "保存設定",
+       "tooltip-preferences-save": "Pó-chûn siat-tēng",
        "tooltip-summary": "Siá chi̍t-ê kán-tan soat-bêng",
        "anonymous": "{{SITENAME}} bô kì-miâ ê iōng-chiá",
        "siteuser": "{{SITENAME}} iōng-chiá $1",
index 0b63961..6d43901 100644 (file)
        "feedback-useragent": "Aggente utente:",
        "searchsuggest-search": "Truova",
        "searchsuggest-containing": "tène...",
+       "api-error-autoblocked": "Ll'indirizzo IP d' 'o vuosto è stato bloccato automaticamente, pecché a nu mumento l'ausaje n'utenza bloccata.",
        "api-error-badaccess-groups": "Tun putite carrecà file ncopp' 'a sta wiki.",
        "api-error-badtoken": "Errore interno: 'O token nun è buono.",
+       "api-error-blocked": "Site stato/a bloccato/a, nun putite ffà cagnamiente.",
        "api-error-copyuploaddisabled": "'A funzione carrcà 'e n'URL nun è appicciata dint'a stu server.",
        "api-error-duplicate": "Nce {{PLURAL:$1|sta è n'atu file|stanno ati file}} ncopp' 'o sito ch' 'e cuntenute eguale eguale.",
        "api-error-duplicate-archive": "Nce {{PLURAL:$1|steva n'atu file|stevano ati file}} già ncopp' 'o sito ch' 'e stisse cuntenute, però {{PLURAL:$1|è stato|so' state}} scancellate.",
        "api-error-nomodule": "Errore interno: Nisciuno modulo 'e carreca mpustato.",
        "api-error-ok-but-empty": "Errore interno: Nisciuna resposta 'a 'o server.",
        "api-error-overwrite": "Sovrascrivere nu file ch'esiste già nun è permesso.",
+       "api-error-ratelimited": "Vuje avite tntato 'e carrecà cchiù file dint'a nu mumento curt' 'e tiempo ca sta wiki premmettesse.\nPe' piacere, tentate n'ata vota int'a nu poch' 'e minute.",
        "api-error-stashfailed": "Errore interno: 'O server nun ngarraje a s'astipà 'o file temporaneo.",
        "api-error-publishfailed": "Errore interno: 'O server nun ngarraje a pubbrecà 'o file temporaneo.",
        "api-error-stasherror": "'A carreca d' 'o file 'n stash è asciuta male, ce sta n'errore.",
index 97f08d2..bee6f50 100644 (file)
        "right-userrights": "Alle gebrukersrechten bewarken",
        "right-userrights-interwiki": "Gebrukersrechten van gebrukers in aandere wiki's wiezigen",
        "right-siteadmin": "De databanke blokkeren en weer vriegeven",
-       "right-override-export-depth": "Ziejen uutvoeren, oek de ziejen waor naor verwezen wörden, tot n diepte van 5",
+       "right-override-export-depth": "Ziejen exporteren, oek de ziejen waor naor verwezen wördt, tot n diepte van 5",
        "right-sendemail": "Bericht versturen naor aandere gebrukers",
        "right-passwordreset": "Bekiek netpostberichten veur t opniej instellen van joew wachtwoord",
        "newuserlogpage": "Logboek mit anwas",
        "semiprotectedpagemovewarning": "'''Waorschuwing:''' disse zied kan allinnig deur eregistreerden gebrukers herneumd wörden.\nDe leste logboekregel steet hieronder:",
        "move-over-sharedrepo": "== t Bestaand besteet al ==\n[[:$1]] besteet al in de edeelden mediadatabanke. A'j n bestaand naor disse titel herneumen, dan ku'j  t edeelden bestaand niet gebruken.",
        "file-exists-sharedrepo": "Disse bestaandsnaam besteet al in de edeelden mediadatabanke.\nKies n aandere bestaandsnaam.",
-       "export": "Ziejen uutvoeren",
-       "exporttext": "De tekste en geschiedenisse van n zied of n koppel ziejen kunnen in XML-formaot uutevoerd wörden. Dit bestaand ku'j daornao uutvoeren naor n aandere MediaWiki deur de [[Special:Import|invoerzied]] te gebruken.\n\nZet in t onderstaonde veld de namen van de ziejen die'j uutvoeren willen, één zied per regel, en gif an o'j alle versies mit de bewarkingssamenvatting uutvoeren willen of allinnig de leste versies mit de bewarkingssamenvatting.\n\nA'j dat leste doon willen dan ku'j oek n verwiezing gebruken, bieveurbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] veur de zied \"[[{{MediaWiki:Mainpage}}]]\".",
-       "exportall": "Alle ziejen uutvoeren",
+       "export": "Ziejen exporteren",
+       "exporttext": "De tekste en geschiedenisse van n zied of n koppel ziejen kunnen in XML-formaot uutevoerd wörden. Dit bestaand ku'j daornao exporteren naor n aandere MediaWiki deur de [[Special:Import|invoerzied]] te gebruken.\n\nZet in t onderstaonde veld de namen van de ziejen die'j exporteren willen, één zied per regel, en geef an o'j alle versies mit de bewarkingssamenvatting exporteren willen of allinnig de leste versies mit de bewarkingssamenvatting.\n\nA'j dat leste doon willen dan ku'j oek n verwiezing gebruken, bieveurbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] veur de zied \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Alle ziejen exporteren",
        "exportcuronly": "Allinnig de actuele versie, niet de veurgeschiedenisse",
-       "exportnohistory": "----\n'''NB:''' t uutvoeren van de hele geschiedenisse is uutezet vanwegen prestasieredens.",
+       "exportnohistory": "----\n'''NB:''' t exporteren van de hele geschiedenisse is uutezet vanwegen prestasieredens.",
        "exportlistauthors": "De hele auteurslieste opnemen veur elke zied",
-       "export-submit": "Uutvoeren",
+       "export-submit": "Exporteren",
        "export-addcattext": "Ziejen derbie doon uut de kategorie:",
        "export-addcat": "Derbie doon",
        "export-addnstext": "Ziejen uut de volgende naamruumte derbie doon:",
index c01b64a..2d415db 100644 (file)
                        "Gaute",
                        "Macofe",
                        "Chameleon222",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Mortensson"
                ]
        },
        "tog-underline": "Strek under lenkjer:",
        "tog-hideminor": "Gøym småplukk i lista over siste endringar",
        "tog-hidepatrolled": "Gøym patruljerte endringar i lista over siste endringar",
        "tog-newpageshidepatrolled": "Gøym patruljerte sider frå lista over nye sider",
+       "tog-hidecategorization": "Løyn sidekategoriseringa",
        "tog-extendwatchlist": "Utvid overvakingslista til å vise alle endringane, ikkje berre dei siste",
        "tog-usenewrc": "Grupper endringar etter side i siste endringane og på overvakingslista",
        "tog-numberheadings": "Vis nummererte overskrifter",
@@ -41,6 +43,8 @@
        "tog-watchdefault": "Legg til sidene og filene eg endrar på overvakingslista mi",
        "tog-watchmoves": "Legg til sidene og filene eg flytter på overvakingslista mi",
        "tog-watchdeletion": "Legg til sidene og filene eg slettar på overvakingslista mi",
+       "tog-watchuploads": "Overvak nye filer som eg lastar opp",
+       "tog-watchrollback": "Overvak sider som eg har attra",
        "tog-minordefault": "Merk endringar som «småplukk» som standard",
        "tog-previewontop": "Vis førehandsvisinga før endringsboksen",
        "tog-previewonfirst": "Førehandsvis første endring",
        "tog-watchlisthidebots": "Gøym endringar gjorde av robotar i overvakingslista",
        "tog-watchlisthideminor": "Gøym småplukk i overvakingslista",
        "tog-watchlisthideliu": "Gøym endringar av innlogga brukarar i overvakingslista.",
+       "tog-watchlistreloadautomatically": "Oppdater overvakingslista automatisk når eit filter vert endra (krev JavaScript)",
        "tog-watchlisthideanons": "Gøym endringar av anonyme brukarar i overvakingslista.",
        "tog-watchlisthidepatrolled": "Gøym patruljerte endringar i overvakingslista",
+       "tog-watchlisthidecategorization": "Løyn sidekategoriseringa",
        "tog-ccmeonemails": "Send meg kopi av e-postane eg sender til andre brukarar",
        "tog-diffonly": "Ikkje vis sideinnhaldet under skilnadene mellom versjonane",
        "tog-showhiddencats": "Vis gøymde kategoriar",
        "october-date": "$1. oktober",
        "november-date": "$1. november",
        "december-date": "$1. desember",
+       "period-am": "f.m.",
+       "period-pm": "e.m.",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategoriar}}",
        "category_header": "Artiklar i kategorien «$1»",
        "subcategories": "Underkategoriar",
        "morenotlisted": "Lista er ikkje heil.",
        "mypage": "Sida mi",
        "mytalk": "Diskusjon",
-       "anontalk": "Diskusjonside for denne IP-adressa",
+       "anontalk": "Diskusjon",
        "navigation": "Navigering",
        "and": "&#32;og",
        "qbfind": "Finn",
index 36f4051..97c6921 100644 (file)
@@ -4,7 +4,8 @@
                        "Denö",
                        "Hiloin Natoi",
                        "Ilja.mos",
-                       "Mashoi7"
+                       "Mashoi7",
+                       "Misosoof"
                ]
        },
        "tog-underline": "Linkien alleviivuamine:",
        "resetpass_submit": "Azeta peittosana da kirjuttai sistiemah:",
        "changepassword-success": "Sinun peittosana on vaihtettu!",
        "changepassword-throttled": "Olet oppinuh kirjuttuakseh liijan moni kerdua. Ole hyvä, vuota $1 enne ku opit uvvessah.",
+       "botpasswords-label-create": "Luaji",
+       "botpasswords-label-update": "Päivitä",
+       "botpasswords-label-cancel": "Hylgiä",
+       "botpasswords-label-delete": "Poista",
        "resetpass_forbidden": "Ei voi vaihtua peittosanua",
        "resetpass-no-info": "Et voi nähtä tädä sivuu kuni et ole kirjutannuhes.",
        "resetpass-submit-loggedin": "Vaihta peittosana",
index 480bcb2..dc4f956 100644 (file)
        "tog-ccmeonemails": "Przesyłaj mi kopie wiadomości, które wysyłam do innych użytkowników",
        "tog-diffonly": "Nie pokazuj treści stron pod porównaniami zmian",
        "tog-showhiddencats": "Pokazuj ukryte kategorie",
-       "tog-norollbackdiff": "Pomiń pokazywanie zmian po użyciu funkcji „cofnij”",
+       "tog-norollbackdiff": "Nie pokazuj zmian po użyciu funkcji „cofnij”",
        "tog-useeditwarning": "Ostrzegaj mnie, gdy opuszczam stronę edycji bez zapisania zmian",
        "tog-prefershttps": "Zawsze używaj bezpiecznego połączenia po zalogowaniu",
        "underline-always": "Zawsze",
        "minoredit": "To jest drobna zmiana",
        "watchthis": "Obserwuj",
        "savearticle": "Zapisz",
+       "publishpage": "Opublikuj stronę",
        "preview": "Podgląd",
        "showpreview": "Pokaż podgląd",
        "showdiff": "Podgląd zmian",
        "lockdbsuccesstext": "Baza danych została zablokowana.<br />\nPamiętaj by [[Special:UnlockDB|zdjąć blokadę]] po zakończeniu działań administracyjnych.",
        "unlockdbsuccesstext": "Baza danych została odblokowana.",
        "lockfilenotwritable": "Nie można zapisać pliku blokady bazy danych.\nBlokowanie i odblokowywanie bazy danych, wymaga by plik mógł być zapisywany przez web serwer.",
+       "databaselocked": "Baza danych jest już zablokowana.",
        "databasenotlocked": "Baza danych nie jest zablokowana.",
        "lockedbyandtime": "(przez $1 dnia $2 o $3)",
        "move-page": "Przenieś $1",
index 2438f95..76b66bf 100644 (file)
        "watchlistedit-raw-done": "ستاسې کتنلړ اوسمهاله شو.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 سرليک ورگډ شو|$1 سرليکونه ورگډ شوه}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 سرليک ليرې شو|$1 سرليکونه ليري شوه}}:",
-       "watchlistedit-clear-title": "کتنلړ سپين شو",
+       "watchlistedit-clear-title": "کتنلړ سپينول",
        "watchlistedit-clear-legend": "کتنلړ سپينول",
        "watchlistedit-clear-titles": "سرليکونه:",
        "watchlistedit-clear-submit": "کتنلړ سپينول (دا دايمي ده!)",
index ce019cf..2faea55 100644 (file)
        "unlockdbsuccesssub": "Used as subtitle in [[Special:UnlockDB]].\n\nSee also:\n* {{msg-mw|Lockdbsuccesssub|subtitle}}\n* {{msg-mw|Lockdbsuccesstext|text}}\n* {{msg-mw|Unlockdbsuccesssub|subtitle}}\n* {{msg-mw|Unlockdbsuccesstext|text}}",
        "lockdbsuccesstext": "Used as message text in [[Special:LockDB]].\n\nSee also:\n* {{msg-mw|Lockdbsuccesssub|subtitle}}\n* {{msg-mw|Lockdbsuccesstext|text}}\n* {{msg-mw|Unlockdbsuccesssub|subtitle}}\n* {{msg-mw|Unlockdbsuccesstext|text}}",
        "unlockdbsuccesstext": "Used as message text in [[Special:UnlockDB]].\n\nSee also:\n* {{msg-mw|Lockdbsuccesssub|subtitle}}\n* {{msg-mw|Lockdbsuccesstext|text}}\n* {{msg-mw|Unlockdbsuccesssub|subtitle}}\n* {{msg-mw|Unlockdbsuccesstext|text}}",
-       "lockfilenotwritable": "'No longer needed' on wikipedia.",
+       "lockfilenotwritable": "Used as error message in [[Special:LockDB]].",
+       "databaselocked": "Used as error message in [[Special:LockDB]].\nThe title of this error message is {{msg-mw|Lockdb}}.\n\nSee also:\n* {{msg-mw|Lockdb|title}}\n* {{msg-mw|Databaselocked|message}}",
        "databasenotlocked": "Used as error message in [[Special:UnlockDB]].\nThe title of this error message is {{msg-mw|Lockdb}}.\n\nSee also:\n* {{msg-mw|Lockdb|title}}\n* {{msg-mw|Databasenotlocked|message}}",
        "lockedbyandtime": "Used as part of the message when a database is locked through [[Special:LockDB]]. Parameters:\n* $1 is the user that locked the database.\n* $2 is the date on which the lock was made\n* $3 is the time at which the lock was made",
        "move-page": "Used as page title of [[Special:MovePage]] to move pages.\n\nSee example: [[Special:MovePage/Portal:En]].\n\nParameters:\n* $1 - the name of the page to be moved (without link)\n{{Identical|Move}}",
index a2eecbe..bfd77ff 100644 (file)
        "userpage-userdoesnotexist": "Учётной записи «<nowiki>$1</nowiki>» не существует. Убедитесь, что вы действительно желаете создать или изменить эту страницу.",
        "userpage-userdoesnotexist-view": "Не зарегистрировано учётной записи «$1».",
        "blocked-notice-logextract": "Этот участник в данный момент заблокирован.\nНиже приведена последняя запись из журнала блокировок:",
-       "clearyourcache": "'''Замечание.''' Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.\n* '''Firefox / Safari:''' Удерживая клавишу ''Shift'', нажмите на панели инструментов ''Обновить'' либо нажмите ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac)\n* '''Google Chrome:''' Нажмите ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)\n* '''Internet Explorer:''' Удерживая ''Ctrl'', нажмите ''Обновить'' либо нажмите ''Ctrl-F5''\n* '''Opera:''' Выберите очистку кэша в меню ''Инструменты → Настройки''",
+       "clearyourcache": "<strong>Замечание.</strong> Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.\n* <strong>Firefox / Safari:</strong> Удерживая клавишу <em>Shift</em>, нажмите на панели инструментов <em>Обновить</em> либо нажмите <em>Ctrl-F5</em> или <em>Ctrl-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Google Chrome:</strong> Нажмите <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer:</strong> Удерживая <em>Ctrl</em>, нажмите <em>Обновить</em> либо нажмите <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Перейдите в <em>Menu → Настройки</em> (<em>Opera → Настройки</em> на Mac), а затем <em>Безопасность → Очистить историю посещений → Кэшированные изображения и файлы</em>",
        "usercssyoucanpreview": "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый CSS-файл перед сохранением.",
        "userjsyoucanpreview": "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый JS-файл перед сохранением.",
        "usercsspreview": "'''Помните, что это только предварительный просмотр вашего CSS-файла, он ещё не сохранён!'''",
        "changecontentmodel-success-text": "Модель содержимого [[:$1]] была изменена.",
        "changecontentmodel-cannot-convert": "Содержимое [[:$1]] не может быть преобразовано к типу $2.",
        "changecontentmodel-nodirectediting": "Модель содержимого $1 не поддерживает прямое редактирование",
+       "changecontentmodel-emptymodels-title": "Нет доступных моделей содержимого",
+       "changecontentmodel-emptymodels-text": "Содержимое на [[:$1]] не может быть преобразовано ни к одному типу.",
        "log-name-contentmodel": "Журнал изменения моделей содержимого",
        "log-description-contentmodel": "События, связанные с моделями содержимого страниц",
        "logentry-contentmodel-new": "$1 создал{{GENDER:$2||а}} страницу $3 с использованием нестандартной модели содержимого «$5»",
        "lockdbsuccesstext": "База данных проекта была заблокирована.<br />\nНе забудьте [[Special:UnlockDB|убрать блокировку]] после завершения процедуры обслуживания.",
        "unlockdbsuccesstext": "База данных проекта была разблокирована.",
        "lockfilenotwritable": "Нет права на запись в файл блокировки базы данных. Чтобы заблокировать или разблокировать базу данных, веб-сервер должен иметь разрешение на запись в этот файл.",
+       "databaselocked": "База данных уже заблокирована.",
        "databasenotlocked": "База данных не была заблокирована.",
        "lockedbyandtime": "($1 $2 $3)",
        "move-page": "$1 — переименование",
        "tooltip-ca-nstab-category": "Страница категории",
        "tooltip-minoredit": "Отметить это изменение как незначительное",
        "tooltip-save": "Сохранить ваши изменения",
+       "tooltip-publish": "Опубликовать ваши изменения",
        "tooltip-preview": "Предварительный просмотр страницы; пожалуйста, используйте его перед сохранением!",
        "tooltip-diff": "Показать изменения, сделанные по отношению к исходному тексту.",
        "tooltip-compareselectedversions": "Посмотреть разницу между двумя выбранными версиями этой страницы.",
        "feedback-useragent": "Браузер:",
        "searchsuggest-search": "Поиск",
        "searchsuggest-containing": "содержащие…",
+       "api-error-autoblocked": "Ваш IP-адрес был автоматически заблокирован, потому что он был использован заблокированным участником.",
        "api-error-badaccess-groups": "Вам не разрешено загружать файлы в эту вики.",
        "api-error-badtoken": "Внутренняя ошибка:  некорректный токен.",
+       "api-error-blocked": "Редактирование было для вас заблокировано.",
        "api-error-copyuploaddisabled": "Загрузка по URL-адресу отключена на этом сервере.",
        "api-error-duplicate": "Уже {{PLURAL:$1|существует другой файл|существуют другие файлы}} с таким же содержимым.",
        "api-error-duplicate-archive": "Раньше на сайте {{PLURAL:$1|1=уже был файл|были файлы}} с точно таким же содержанием, но {{PLURAL:$1|1=он был удалён|они были удалены}}.",
        "api-error-nomodule": "Внутренняя ошибка: не настроен модуль загрузки.",
        "api-error-ok-but-empty": "Внутренняя ошибка: нет ответа от сервера.",
        "api-error-overwrite": "Не допускается замена существующего файла.",
+       "api-error-ratelimited": "Вы пытаетесь загрузить несколько файлов за более короткий промежуток времени, чем это позволено.\nПожалуйста, попробуйте ещё раз через несколько минут.",
        "api-error-stashfailed": "Внутренняя ошибка: сервер не смог сохранить временный файл.",
        "api-error-publishfailed": "Внутренняя ошибка: сервер не смог сохранить временный файл.",
        "api-error-stasherror": "При загрузке файла в хранилище произошла ошибка.",
index 82ae376..728952f 100644 (file)
@@ -54,7 +54,7 @@
        "tog-ccmeonemails": "Pošlji mi kopijo e-pošt, ki jih pošljem drugim uporabnikom",
        "tog-diffonly": "Pod primerjavo ne prikaži vsebine strani",
        "tog-showhiddencats": "Prikaži skrite kategorije",
-       "tog-norollbackdiff": "Ne prikaži primerjave po izvedeni vrnitvi",
+       "tog-norollbackdiff": "Po izvedeni vrnitvi ne prikaži primerjave",
        "tog-useeditwarning": "Opozori me, ko skušam zapreti urejevalno polje z neshranjenimi spremembami",
        "tog-prefershttps": "Med prijavo vedno uporabljaj varno povezavo",
        "underline-always": "Vedno",
        "changecontentmodel-success-text": "Spremenili smo vrsto vsebine [[:$1]].",
        "changecontentmodel-cannot-convert": "Vsebine na [[:$1]] ni mogoče pretvoriti v vrsto $2.",
        "changecontentmodel-nodirectediting": "Model vsebine $1 ne podpira neposrednega urejanja",
+       "changecontentmodel-emptymodels-title": "Na voljo ni noben model vsebine",
+       "changecontentmodel-emptymodels-text": "Vsebine na [[:$1]] ni mogoče pretvoriti v katero koli vrsto.",
        "log-name-contentmodel": "Dnevnik sprememb modela vsebine",
        "log-description-contentmodel": "Dogodki, povezani z modeli vsebin strani",
        "logentry-contentmodel-new": "$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} stran $3 z neprivzetim modelom vsebine »$5«",
        "lockdbsuccesstext": "Podatkovna baza je bila zaklenjena.<br />\nNe pozabite je [[Special:UnlockDB|odkleniti]], ko boste končali z vzdrževanjem.",
        "unlockdbsuccesstext": "Zbirka podatkov {{GRAMMAR:rodilnik|{{SITENAME}}}} je spet odklenjena.",
        "lockfilenotwritable": "Datoteka zaklepanja zbirke podatkov ni zapisljiva.\nZa zaklepanje in odklepanje zbirke podatkov mora biti ta datoteka zapisljiva s strani spletnega strežnika.",
+       "databaselocked": "Zbirka podatkov je že zaklenjena.",
        "databasenotlocked": "Zbirka podatkov ni zaklenjena.",
        "lockedbyandtime": "($1 dne $2 ob $3)",
        "move-page": "Preimenuj $1",
index 4c271d9..df323fe 100644 (file)
        "history-feed-description": "Versionshistorik för denna sida på wikin",
        "history-feed-item-nocomment": "$1 den $2",
        "history-feed-empty": "Den begärda sidan finns inte.\nDen kan ha tagits bort från wikin eller bytt namn.\nProva att [[Special:Search|söka på wikin]] för relevanta nya sidor.",
-       "history-edit-tags": "Redigera taggar för valda sidversioner",
+       "history-edit-tags": "Redigera märken för valda sidversioner",
        "rev-deleted-comment": "(redigeringssammanfattning togs bort)",
        "rev-deleted-user": "(användarnamn borttaget)",
        "rev-deleted-event": "(loggdetaljer borttagna)",
        "right-override-export-depth": "Exportera sidor inklusive länkade sidor till ett djup på 5",
        "right-sendemail": "Skicka e-post till andra användare",
        "right-passwordreset": "Visa e-postmeddelanden med lösenordsåterställning",
-       "right-managechangetags": "Skapa och radera [[Special:Tags|taggar]] från databasen",
-       "right-applychangetags": "Tillämpa [[Special:Tags|taggar]] tillsammans med ens ändringar",
+       "right-managechangetags": "Skapa och radera [[Special:Tags|märken]] från databasen",
+       "right-applychangetags": "Tillämpa [[Special:Tags|märken]] tillsammans med ens ändringar",
        "right-changetags": "Lägg till och ta bort godtyckliga [[Special:Tags|märken]] på individuella sidversioner och loggposter.",
        "grant-generic": "Rättighetsgrupp \"$1\"",
        "grant-group-page-interaction": "Interagera med sidor",
        "action-viewmyprivateinfo": "visa din privata information",
        "action-editmyprivateinfo": "redigera din privata information",
        "action-editcontentmodel": "ändra innehållsmodellen för en sida",
-       "action-managechangetags": "skapa och radera taggar från databasen",
-       "action-applychangetags": "tillämpa taggar tillsammans med dina ändringar",
+       "action-managechangetags": "skapa och radera märken från databasen",
+       "action-applychangetags": "tillämpa märken tillsammans med dina ändringar",
        "action-changetags": "lägg till och ta bort godtyckliga märken på individuella sidversioner och loggposter",
        "nchanges": "$1 {{PLURAL:$1|ändring|ändringar}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sedan senaste besöket}}",
        "logempty": "Inga matchande träffar i loggen.",
        "log-title-wildcard": "Sök efter sidtitlar som börjar med texten",
        "showhideselectedlogentries": "Visa/Dölj markerade loggposter",
-       "log-edit-tags": "Redigera taggar i valda loggposter",
+       "log-edit-tags": "Redigera märken i valda loggposter",
        "checkbox-select": "Välj: $1",
        "checkbox-all": "Alla",
        "checkbox-none": "Ingen",
        "changecontentmodel-success-text": "Innehållstypen för [[:$1]] har ändrats.",
        "changecontentmodel-cannot-convert": "Innehållet på [[:$1]] kan inte konverteras till typen $2.",
        "changecontentmodel-nodirectediting": "Innehållsmodellen $1 stöder inte direkt redigering",
+       "changecontentmodel-emptymodels-title": "Inget innehållsmodeller finns tillgängliga",
+       "changecontentmodel-emptymodels-text": "Innehållet på [[:$1]] kan inte konverteras till någon typ.",
        "log-name-contentmodel": "Ändringslogg för innehållsmodellen",
        "log-description-contentmodel": "Händelser som är relaterade till en sidas innehållsmodeller",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|skapade}} sidan $3 med den icke-standardiserade innehållsmodellen \"$5\"",
        "lockdbsuccesstext": "Databasen är nu låst.\n<br />Kom ihåg att [[Special:UnlockDB|ta bort låsningen]] när du är färdig med ditt underhåll.",
        "unlockdbsuccesstext": "Databasen är upplåst.",
        "lockfilenotwritable": "Det går inte att skriva till databasens låsfil. För att låsa eller låsa upp databasen, så måste webbservern kunna skriva till den filen.",
+       "databaselocked": "Databasen är redan låst.",
        "databasenotlocked": "Databasen är inte låst.",
        "lockedbyandtime": "(av $1 den $2 kl. $3)",
        "move-page": "Flytta $1",
        "tags-hitcount": "$1 {{PLURAL:$1|ändring|ändringar}}",
        "tags-manage-no-permission": "Du har inte behörighet att hantera förändringstaggar.",
        "tags-manage-blocked": "Du kan inte hantera ändringsmärken när du är blockerad.",
-       "tags-create-heading": "Skapa en ny tag",
+       "tags-create-heading": "Skapa ett nytt märke",
        "tags-create-explanation": "Som standard, kommer nyskapade taggar att bli tillgängliga för användning av användare och botar.",
-       "tags-create-tag-name": "Taggnamn:",
+       "tags-create-tag-name": "Märkesnamn:",
        "tags-create-reason": "Anledning:",
        "tags-create-submit": "Skapa",
-       "tags-create-no-name": "Du måste ange ett taggnamn.",
-       "tags-create-invalid-chars": "Taggnamn får inte innehålla kommatecken (<code>,</code>) eller snedstreck (<code>/</code>).",
-       "tags-create-invalid-title-chars": "Taggnamn får inte innehålla tecken som inte kan användas i sidtitlar.",
-       "tags-create-already-exists": "Taggen \"$1\" finns redan.",
-       "tags-create-warnings-above": "Följande {{PLURAL:$2|varning |varningar}} stöttes på när du försöker skapa etiketten \" $1 \":",
-       "tags-create-warnings-below": "Vill du fortsätta att skapa taggen?",
-       "tags-delete-title": "Radera tagg",
-       "tags-delete-explanation-initial": "Du är på väg att ta bort taggen \"$1\" från databasen.",
+       "tags-create-no-name": "Du måste ange ett märkesnamn.",
+       "tags-create-invalid-chars": "Märkesnamn får inte innehålla kommatecken (<code>,</code>) eller snedstreck (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Märkesnamn får inte innehålla tecken som inte kan användas i sidtitlar.",
+       "tags-create-already-exists": "Märket \"$1\" finns redan.",
+       "tags-create-warnings-above": "Följande {{PLURAL:$2|varning|varningar}} uppstod när du försökte skapa märket \"$1\":",
+       "tags-create-warnings-below": "Vill du fortsätta att skapa märket?",
+       "tags-delete-title": "Radera märke",
+       "tags-delete-explanation-initial": "Du är på väg att ta bort märket \"$1\" från databasen.",
        "tags-delete-explanation-in-use": "Den kommer att tas bort från {{PLURAL:$2|$2 sidversioner eller loggposter|alla $2 sidversioner och/eller loggposter}} som den för närvarande används på.",
-       "tags-delete-explanation-warning": "Denna åtgärd är <strong>oåterkallelig</strong> och <strong>kan inte ångras</strong>, inte ens av databasadministratörer. Var säker på att detta är den tagg du vill radera.",
-       "tags-delete-explanation-active": "<strong>Taggen\" $1 \" är fortfarande aktiv, och kommer att fortsätta att appliceras i framtiden.</strong> För att hindra detta, gå till den eller de platser där taggen är inställd att användas, och inaktivera den där.",
+       "tags-delete-explanation-warning": "Denna åtgärd är <strong>oåterkallelig</strong> och <strong>kan inte ångras</strong>, inte ens av databasadministratörer. Var säker på att detta är det märke du vill radera.",
+       "tags-delete-explanation-active": "<strong>Märket \"$1\" är fortfarande aktivt, och kommer att fortsätta att appliceras i framtiden.</strong> För att hindra detta, gå till den eller de platser där märket är inställd att användas, och inaktivera den där.",
        "tags-delete-reason": "Anledning:",
-       "tags-delete-submit": "Radera denna tagg oåterkalleligen",
-       "tags-delete-not-allowed": "Tagg definierade med ett tillägg kan inte raderas utan att tillägget specifikt tillåter det.",
-       "tags-delete-not-found": "Taggen \"$1\" finns inte.",
-       "tags-delete-too-many-uses": "Taggen \"$1\" appliceras på mer än $2 {{PLURAL:$2|version|versioner}}, vilket innebär att den inte kan raderas.",
-       "tags-delete-warnings-after-delete": "Taggen \"$1\" raderades, men följande {{PLURAL:$2|varning|varningar}} inträffade:",
-       "tags-activate-title": "Aktivera tagg",
-       "tags-activate-question": "Du är på väg att aktivera taggen \"$1\".",
+       "tags-delete-submit": "Radera denna märke oåterkalleligen",
+       "tags-delete-not-allowed": "Märken definierade med ett tillägg kan inte raderas utan att tillägget specifikt tillåter det.",
+       "tags-delete-not-found": "Märket \"$1\" finns inte.",
+       "tags-delete-too-many-uses": "Märket \"$1\" appliceras på fler än $2 {{PLURAL:$2|version|versioner}}, vilket innebär att det inte kan raderas.",
+       "tags-delete-warnings-after-delete": "Märket \"$1\" raderades, men följande {{PLURAL:$2|varning|varningar}} uppstod:",
+       "tags-activate-title": "Aktivera märke",
+       "tags-activate-question": "Du är på väg att aktivera märket \"$1\".",
        "tags-activate-reason": "Anledning:",
-       "tags-activate-not-allowed": "Det är inte möjligt att aktivera taggen \"$1\".",
-       "tags-activate-not-found": "Taggen \"$1\" finns inte.",
+       "tags-activate-not-allowed": "Det är inte möjligt att aktivera märket \"$1\".",
+       "tags-activate-not-found": "Märket \"$1\" finns inte.",
        "tags-activate-submit": "Aktivera",
-       "tags-deactivate-title": "Inaktivera tagg",
-       "tags-deactivate-question": "Du är på väg att inaktivera taggen \"$1\".",
+       "tags-deactivate-title": "Inaktivera märke",
+       "tags-deactivate-question": "Du är på väg att inaktivera märket \"$1\".",
        "tags-deactivate-reason": "Anledning:",
-       "tags-deactivate-not-allowed": "Det är inte möjligt att inaktivera taggen \"$1\".",
+       "tags-deactivate-not-allowed": "Det är inte möjligt att inaktivera märket \"$1\".",
        "tags-deactivate-submit": "Inaktivera",
-       "tags-apply-no-permission": "Du har inte behörighet att tillämpa taggar på dina ändringar",
+       "tags-apply-no-permission": "Du har inte behörighet att tillämpa märken på dina ändringar",
        "tags-apply-blocked": "Du kan inte ange ändringsmärken med dina ändringar medans du är blockerad.",
        "tags-apply-not-allowed-one": "Märket \"$1\" kan inte läggas till manuellt.",
        "tags-apply-not-allowed-multi": "Följande {{PLURAL:$2|märke|märken}} kan inte läggas till manuellt: $1",
-       "tags-update-no-permission": "Du har inte behörighet att lägga till eller ta bort taggar från individuella sidversioner eller loggposter.",
+       "tags-update-no-permission": "Du har inte behörighet att lägga till eller ta bort märken från individuella sidversioner eller loggposter.",
        "tags-update-blocked": "Du kan inte lägga till eller ta bort ändringsmärken när du är blockerad.",
        "tags-update-add-not-allowed-one": "Märket \"$1\" kan inte läggas till manuellt.",
        "tags-update-add-not-allowed-multi": "Följande {{PLURAL:$2|märke|märken}} kan inte läggas till manuellt: $1",
        "logentry-upload-revert": "$1 {{GENDER:$2|laddade upp}} $3",
        "log-name-managetags": "Märkeshanteringslogg",
        "log-description-managetags": "Denna sida innehåller administrativa [[Special:Tags|märke]]srelaterade uppgifter. Loggen innehåller bara åtgärder som utförts manuellt av en administratör; märken kan skapas eller raderas av wikins mjukvara utan att en post registreras i loggen.",
-       "logentry-managetags-create": "$1 {{GENDER:$2|skapade}} taggen \"$4\"",
-       "logentry-managetags-delete": "$1 {{GENDER:$2|raderade}} taggen \"$4\" (borttagen från $5 {{PLURAL:$5|version eller loggpost|versioner och/eller loggposter}})",
-       "logentry-managetags-activate": "$1 {{GENDER:$2|aktiverade}} taggen \"$4\" för användning av användare och botar.",
-       "logentry-managetags-deactivate": "$1 {{GENDER:$2|inaktiverade}} taggen \"$4\" för användning av användare och botar.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|skapade}} märket \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|raderade}} märket \"$4\" (borttagen från $5 {{PLURAL:$5|version eller loggpost|versioner och/eller loggposter}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|aktiverade}} märket \"$4\" för användning av användare och botar.",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|inaktiverade}} märket \"$4\" för användning av användare och botar.",
        "log-name-tag": "Märkeslogg",
-       "log-description-tag": "Denna sida visar när användare har lagt till eller tagit bort [[Special:Tags|taggar]] från individuella sidversioner eller loggposter. Loggen registrerar inte handlingar där märken hanteras i redigeringar, raderingar eller liknande handlingar.",
+       "log-description-tag": "Denna sida visar när användare har lagt till eller tagit bort [[Special:Tags|märken]] från individuella sidversioner eller loggposter. Loggen registrerar inte handlingar där märken hanteras i redigeringar, raderingar eller liknande handlingar.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|lade till}} {{PLURAL:$7|märket|märkena}} $6 för sidversionen $4 av sidan $3",
        "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|lade till}} {{PLURAL:$7|märket|märkena}} $6 till loggposten $5 för siden $3",
        "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|tog bort}} {{PLURAL:$9|märket|märkena}} $8 från sidversionen $4 av sidan $3",
        "feedback-useragent": "Användaragent:",
        "searchsuggest-search": "Sök",
        "searchsuggest-containing": "innehåller...",
+       "api-error-autoblocked": "Din IP-adress har blockerats automatiskt eftersom den har använts av en blockerad användare.",
        "api-error-badaccess-groups": "Du får inte ladda upp filer till denna wiki.",
        "api-error-badtoken": "Internt fel: felaktig nyckel.",
+       "api-error-blocked": "Du har blockerats från att redigera.",
        "api-error-copyuploaddisabled": "Uppladdning via URL är inaktiverad på den här servern.",
        "api-error-duplicate": "Det finns redan {{PLURAL:$1|en annan fil|andra filer}} på webbplatsen med samma innehåll.",
        "api-error-duplicate-archive": "Det fanns redan {{PLURAL:$1|en annan fil|några andra filer}} på webbplatsen med samma innehåll, men {{PLURAL:$1|den har|de har}} raderats.",
        "api-error-nomodule": "Internt fel: ingen uppladdningsmodul uppsatt.",
        "api-error-ok-but-empty": "Internt fel: Inget svar från servern.",
        "api-error-overwrite": "Det är inte tillåtet att skriva över en befintlig fil.",
+       "api-error-ratelimited": "Du försöker ladda upp fler filer inom en kort tidsrymd än denna wiki tillåter.\nFörsök igen om några minuter.",
        "api-error-stashfailed": "Internt fel: servern kunde inte lagra temporär fil.",
        "api-error-publishfailed": "Internt fel: Servern kunde inte publicera temporär fil.",
        "api-error-stasherror": "Ett fel uppstod under uppladdningen av filen till mellanlagringsfilen.",
        "sessionprovider-nocookies": "Cookies kan vara inaktiverade. Se till att du har cookies aktiverat och försök igen.",
        "randomrootpage": "Slumprotsida",
        "log-action-filter-block": "Typ av blockering:",
+       "log-action-filter-contentmodel": "Typ av innehållsmodellsändring:",
        "log-action-filter-delete": "Typ av radering:",
        "log-action-filter-import": "Importeringstyp:",
+       "log-action-filter-managetags": "Typ av märkeshanteringsåtgärd:",
        "log-action-filter-move": "Flyttningstyp:",
        "log-action-filter-newusers": "Typ av kontoskapande:",
        "log-action-filter-patrol": "Typ av patrullering:",
        "log-action-filter-protect": "Typ av skydd:",
+       "log-action-filter-rights": "Typ av rättighetsändring",
        "log-action-filter-suppress": "Censurtyp",
        "log-action-filter-upload": "Typ av uppladdning:",
        "log-action-filter-all": "Alla",
        "log-action-filter-block-reblock": "Blockeringsändring",
        "log-action-filter-block-unblock": "Tog bort blockering",
        "log-action-filter-contentmodel-change": "Ändring av innehållsmodell",
+       "log-action-filter-contentmodel-new": "Skapande av sida med icke-standardiserad innehållsmodell",
        "log-action-filter-delete-delete": "Radering av sida",
        "log-action-filter-delete-restore": "Återställde sida",
        "log-action-filter-delete-event": "Radering av logg",
        "log-action-filter-protect-move_prot": "Flyttade skydd",
        "log-action-filter-rights-rights": "Manuell ändring",
        "log-action-filter-rights-autopromote": "Automatisk ändring",
+       "log-action-filter-suppress-event": "Loggcensur",
+       "log-action-filter-suppress-revision": "Sidversionscensur",
+       "log-action-filter-suppress-delete": "Sidcensur",
        "log-action-filter-upload-upload": "Ny uppladdning",
        "log-action-filter-upload-overwrite": "Återuppladdning"
 }
index 938549c..141e30d 100644 (file)
        "rcshowhidemine-show": "göster",
        "rcshowhidemine-hide": "gizle",
        "rcshowhidecategorization": "sayfa kategorizasyonunu $1",
-       "rcshowhidecategorization-show": "Göster",
-       "rcshowhidecategorization-hide": "Gizle",
+       "rcshowhidecategorization-show": "göster",
+       "rcshowhidecategorization-hide": "gizle",
        "rclinks": "Son $2 günde yapılan son $1 değişikliği göster;<br /> $3",
        "diff": "fark",
        "hist": "geçmiş",
index 411180d..24f55bf 100644 (file)
        "minoredit": "Незначна зміна",
        "watchthis": "Спостерігати за цією сторінкою",
        "savearticle": "Зберегти сторінку",
+       "publishpage": "Опублікувати сторінку",
        "preview": "Попередній перегляд",
        "showpreview": "Попередній перегляд",
        "showdiff": "Показати зміни",
        "changecontentmodel-success-text": "Тип вмісту сторінки [[:$1]] було змінено.",
        "changecontentmodel-cannot-convert": "Вміст сторінки [[:$1]] не можна перетворити на вміст типу $2.",
        "changecontentmodel-nodirectediting": "Модель вмісту $1 не підтримує пряме редагування",
+       "changecontentmodel-emptymodels-title": "Немає доступних моделей коментарів",
+       "changecontentmodel-emptymodels-text": "Вміст сторінки [[:$1]] не може бути перетворений до будь якого типу.",
        "log-name-contentmodel": "Журнал змін моделі вмісту",
        "log-description-contentmodel": "Події, пов'язані з моделями вмісту сторінки",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|створив|створила}} сторінку $3, використовуючи нестандартну модель вмісту «$5»",
        "unblockip": "Розблокувати IP-адресу",
        "unblockiptext": "Використовуйте подану нижче форму, щоб відновити можливість збереження з раніше заблокованої IP-адреси.",
        "ipusubmit": "Зняти це блокування",
-       "unblocked": "[[User:$1|$1]] {{GENDER:$1|Ñ\80азблокований|Ñ\80азблокована}}",
+       "unblocked": "[[User:$1|$1]] {{GENDER:$1|Ñ\80озблокований|Ñ\80озблокована}}",
        "unblocked-range": "$1 розблоковано",
        "unblocked-id": "Блокування $1 було зняте",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] вже розлоковано.",
        "lockdbsuccesstext": "Базу даних проекту заблоковано.<br />\nНе забудьте її [[Special:UnlockDB|розблокувати]] після завершення обслуговування.",
        "unlockdbsuccesstext": "Базу даних проекту розблоковано.",
        "lockfilenotwritable": "Немає права на запис в файл блокування бази даних. Щоб заблокувати чи розблокувати БД, веб-сервер повинен мати дозвіл на запис в цей файл.",
+       "databaselocked": "База даних вже заблокована.",
        "databasenotlocked": "База даних не заблокована.",
        "lockedbyandtime": "($1 $2 $3)",
        "move-page": "Перейменування сторінки «$1»",
        "feedback-useragent": "User Agent:",
        "searchsuggest-search": "Пошук",
        "searchsuggest-containing": "що містять...",
+       "api-error-autoblocked": "Вашу IP-адресу було заблоковано автоматично, тому що її використовував заблокований користувач.",
        "api-error-badaccess-groups": "Вам не дозволено завантажувати файли до цього вікіпроекту.",
        "api-error-badtoken": "Внутрішня помилка: некоректний токен.",
+       "api-error-blocked": "Можливість редагування для вас заблоковано.",
        "api-error-copyuploaddisabled": "На цьому сервері вимкнене завантаження за URL-адресою.",
        "api-error-duplicate": "Уже {{PLURAL:$1|1=існує інший файл|існують інші файли}} з таким самим вмістом.",
        "api-error-duplicate-archive": "Раніше на сайті вже {{PLURAL:$1|1=був файл|були файли}} з ідентичним вмістом, але {{PLURAL:$1|1=його|їх}} вилучили.",
index e0e6ce8..d63feb5 100644 (file)
@@ -53,7 +53,7 @@
        "tog-ccmeonemails": "Padad-i ak hin mga kopya hin mga email nga akon ginpapadara ha iba nga mga gumaramit",
        "tog-diffonly": "Ayaw igpakita an sulod han pakli ha ilarom han pagkakaiba",
        "tog-showhiddencats": "Igpakita an mga tinago nga mga kaarangay",
-       "tog-norollbackdiff": "Iglat-ang an kaiban kahuman himoa an libot-pabalik",
+       "tog-norollbackdiff": "Ayaw igpakita an kaiban kahuman himoa an rollback",
        "tog-useeditwarning": "Pasabti ako kun nabaya ako hin ginliwat ng pakli nga waray katipig an mga pagbag-o",
        "tog-prefershttps": "Pirmihi paggamit hin segurado nga koneksyon kun nakalog-in",
        "underline-always": "Pirme",
        "createaccount-title": "Paghimo hin akawnt para han {{SITENAME}}",
        "createaccount-text": "Mayda tawo nga naghimo hin akawnt nga gingamit an imo email address ha {{SITENAME}} ($4) nga ginngaranan nga \"$2\", nga may-ada tigaman-panakob nga \"$3\".\n\nKinahanglan ka maglog-in ngan igbal-iw an imo tigaman-panakob yana dayon.\n\nPuydi nimo pabay-on ini nga mensahe, kun ini nga paghimo hin akwant in nagsayop la.",
        "login-throttled": "Damo na an imo login attempts ha pagkayana.\nAlayon paghulat hin $1 san-o ka umutro.",
-       "login-abort-generic": "An imo paglog-in in diri malinamposon - Naundang",
+       "login-abort-generic": "An imo paglog-in in pakyas - Gin-undang",
        "login-migrated-generic": "An imo account in nabalhin, ngan an imo agnay-gumaramit in waray na hinin nga wiki.",
        "loginlanguagelabel": "Pinulongan: $1",
        "suspicious-userlogout": "Waray ka tugoti pag-logout tungod nga baga ini ginpadangat hin usa nga broken browser o caching proxy.",
        "newpassword": "Bag-o nga tigaman-pagsulod:",
        "retypenew": "Utroha pagbutang an bag-o nga tigaman-pagsulod:",
        "resetpass_submit": "Igbutang an password ngan log in",
-       "changepassword-success": "Malinamposon an pagbal-iw hit imo tigaman-panakob!",
+       "changepassword-success": "Malinamposon an pagliwat hit imo password!",
        "changepassword-throttled": "Damo na nga mga paningkamot hin pagsakob an imo ginhimò.\nAlayon paghulat hin $1 san-o ka umutro.",
        "botpasswords": "Mga bot password",
        "botpasswords-disabled": "Ginparong an mga bot password.",
        "rev-delundel": "igpakita/igtago",
        "rev-showdeleted": "igpakita",
        "revisiondelete": "Pagpara/pagtanggal han pagpara nga mga rebisyon",
+       "revdelete-nooldid-title": "Diri ginkakarawat an target revision",
        "revdelete-show-file-confirm": "Sigurado ka nga gusto mo makita an ginpara nga pagliwat han file \"<nowiki>$1</nowiki>\" tikang $2 ha $3?",
        "revdelete-show-file-submit": "Oo",
        "revdelete-hide-text": "Rebisyon nga sinurat",
        "right-reupload": "Sapawa an mga aada nga mga paypay",
        "right-reupload-own": "Igsapaw an aada yana nga mga paypay nga ginkarga-pasaka nimo mismo",
        "right-upload_by_url": "Igkarga paigbaw an mga paypay tikang ha uska URL",
+       "right-purge": "Igpurge an site cache han pakli bisan waray kompirmasyon",
        "right-autoconfirmed": "Diri malalalbtan hin IP-nga-nahibasi nga mga rate hin paglimit",
        "right-bot": "Igtrato komo uska naglulugaring nga proseso",
        "right-writeapi": "Paggamit han write API",
        "listgrouprights-removegroup-self": "Igtanggal an {{PLURAL:$2|grupo|mga grupo}} tikang ha kalugaringon nga akawnt: $1",
        "listgrouprights-addgroup-self-all": "Igdugang an ngatanan nga mga grupo ha kalugaringon nga akawnt",
        "listgrouprights-removegroup-self-all": "Igtanggal an ngatanan nga mga grupo tikang ha kalugaringon nga akawnt",
+       "listgrants-rights": "Mga katungod",
+       "trackingcategories": "Ginsusubay an mga kategorya",
+       "trackingcategories-name": "Ngaran han mensahe",
        "mailnologin": "Waray kakadtoan nga address",
        "mailnologintext": "Kinahanglan nimo nga [[Special:UserLogin|nakalog-in]] ngan may-ada balido nga email address ha imo[[Special:Preferences|mga preperensya]] para makapadangat hin email ngadto ha iba nga mga gumaramit.",
        "emailuser": "Ig-e-mail ini nga gumaramit",
        "protectcomment": "Katadongan:",
        "protect-default": "Togota an ngatanan nga mga gumaramit",
        "protect-level-sysop": "Tuguti la an mga magdudumara",
+       "protect-expiring": "mawawaray gamit pag-$1 (UTC)",
+       "protect-expiring-local": "mawawaray gamit $1",
+       "protect-expiry-indefinite": "waray kataposan",
        "protect-othertime": "Lain nga oras:",
        "protect-othertime-op": "lain nga oras",
        "protect-otherreason": "Lain/dugang nga katadongan:",
index 36b1f8d..fe5623f 100644 (file)
@@ -17,7 +17,8 @@
                        "පසිඳු කාවින්ද",
                        "Matma Rex",
                        "Macofe",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Alefbeis"
                ]
        },
        "tog-underline": "שטרייכט אונטער לינקען",
@@ -35,6 +36,7 @@
        "tog-watchdefault": "צולייגן בלעטער וואס איך רעדאקטיר צו מיין אכטונג ליסטע",
        "tog-watchmoves": "צולייגן בלעטער וואס איך באוועג און טעקעס וואס איך לאד ארויף צו מיין אכטונג ליסטע",
        "tog-watchdeletion": "צולייגן בלעטער וואס איך מעק אויס צו מיין אויפפאסונג ליסטע",
+       "tog-watchuploads": "לייגט צו נייע פיילס וואס איך טוה ארויפלאדירן צו מיין וואטש ליסטע",
        "tog-watchrollback": "צולייגן צו מיין אויפפאסן ליסטע בלעטער אויף וואס איך האב אדורכגעפירט א צוריקשטעלן.",
        "tog-minordefault": "באגרענעצן אלע רעדאַקטירונגען גרונטלעך אלס מינערדיק",
        "tog-previewontop": "צײַג די \"פֿאָרויסיגע װײַזונג\" גלײַך בײַ דער ערשטער באַאַרבעטונג",
@@ -58,7 +60,7 @@
        "tog-ccmeonemails": "שיק מיר קאפיעס פון בליצבריוו וואס איך שיק צו אנדערע באַניצער",
        "tog-diffonly": "ווייז נישט אינהאלט אונטער די דיפערענץ",
        "tog-showhiddencats": "ווײַזן באהאלטענע קאטעגאריעס",
-       "tog-norollbackdiff": "×\94×\99פ×\98 ×\90×\99×\91ער ווײַזן אונטערשייד נאכן אויספֿירן א צוריקדריי",
+       "tog-norollbackdiff": "× ×\99ש×\98 ווײַזן אונטערשייד נאכן אויספֿירן א צוריקדריי",
        "tog-useeditwarning": "שטעלן א ווארענונג ווען איך לאז איבער א רעדאקטירונג בלאט מיט נישט אויפגעהיטענע ענדערונגען",
        "tog-prefershttps": "ניצט שטענדיק א זיכערע פארבינדונג ווען ארײַנגלאגירט",
        "underline-always": "אייביג",
        "february-gen": "פעברואר",
        "march-gen": "מערץ",
        "april-gen": "אַפּריל",
-       "may-gen": "×\9e×\99י",
+       "may-gen": "×\9e×\90Ö·י",
        "june-gen": "יוני",
        "july-gen": "יולי",
        "august-gen": "אויגוסט",
        "returnto": "צוריקקערן צו $1.",
        "tagline": "פֿון {{SITENAME}}",
        "help": "הילף",
-       "search": "×\96×\95×\9b×\9f",
-       "searchbutton": "×\96×\95×\9b×\9f",
+       "search": "×\96×\95×\9a",
+       "searchbutton": "×\96×\95×\9a",
        "go": "גיין",
        "searcharticle": "גיין",
        "history": "בלאט היסטאריע",
        "protectedpage": "באשיצטער בלאט",
        "jumpto": "שפּרינג צו:",
        "jumptonavigation": "נאַוויגאַציע",
-       "jumptosearch": "×\96×\95×\9b×\9f",
+       "jumptosearch": "×\96×\95×\9a",
        "view-pool-error": "אנטשולדיגט, די סערווערס זענען איבערגעפילט איצט.\nצופיל באניצער פרובירן צו ליינען דעם בלאט.\nביטע ווארטן א ביסל צייט בעפאר איר פרובירט ווידער אריינגיין אינעם בלאט.\n\n$1",
        "generic-pool-error": "אנטשולדיגט, די סערווערס זענען איבערגעפילט איצט.\nצופיל באניצער פרובירן צו באקוקן דעם רעסורס.\nביטע ווארטן א ביסל צייט בעפאר איר פרובירט ווידער אריינטרעטן אין דעם רעסורס.",
        "pool-timeout": "אַריבער דער צײַט וואַרטן פֿאר דער שליסונג",
        "newmessageslinkplural": "{{PLURAL:$1|א נייע מעלדונג|999=נייע מעלדונגען}}",
        "newmessagesdifflinkplural": "לעצטע {{PLURAL:$1|ענדערונג|999=ענדערונגען}}",
        "youhavenewmessagesmulti": "איר האט נייע מעלדונגען אין $1",
-       "editsection": "×\91×\90Ö·×\90ַר×\91×¢×\98ן",
+       "editsection": "רע×\93×\90ַק×\98×\99רן",
        "editold": "רעדאַקטירן",
        "viewsourceold": "ווײַזן מקור",
        "editlink": "רעדאַקטירן",
        "red-link-title": "$1 (בלאט טוט נאָך נישט עקזיסטירן)",
        "sort-descending": "סארטירן אַראָפ",
        "sort-ascending": "סארטירן אַרויף",
-       "nstab-main": "×\90ַר×\98×\99ק×\9c",
+       "nstab-main": "×\91×\9c×\90Ö·×\98",
        "nstab-user": "באַניצער בלאט",
        "nstab-media": "מעדיע בלאט",
        "nstab-special": "ספעציעלער בלאט",
        "virus-unknownscanner": "אומבאוואוסטער אנטי־ווירוס:",
        "logouttext": "'''איר האָט זיך ארויסלאָגירט.'''\n\nבאמערקט אז געוויסע בלעטער קענען זיך ווייטער ארויסשטעלן אזוי ווי ווען איר זענט אריינלאגירט, ביז איר וועט אויסליידיגן דעם בלעטערער זאפאס.",
        "cannotlogoutnow-title": "קען נישט ארויסלאגירן אצינד",
+       "cannotlogoutnow-text": "ארויסלאגירן נישט מעגלעך ווען מען ניצט $1.",
        "welcomeuser": "ברוך הבא, $1!",
        "welcomecreation-msg": "מ'האט געשאפן אייער קאנטע.\nפארגעסט נישט צו ענדערן אייערע [[Special:Preferences|{{SITENAME}} פרעפערענצן]].",
        "yourname": "באַניצער נאָמען:",
        "userlogin-remembermypassword": "לאז מיך בלײַבן ארײַנלאגירט",
        "userlogin-signwithsecure": "ניצן זיכערן סארווער",
        "cannotloginnow-title": "קען נישט אריינלאגירן אצינד",
+       "cannotloginnow-text": "אריינלאגירן נישט מעגלעך ווען מען ניצט $1.",
        "yourdomainname": "אײַער געביט:",
        "password-change-forbidden": "איר קען נישט ענדערן פאסווערטער אויף דער וויקי.",
        "externaldberror": "עס איז אדער פארגעקומען אן אויטענטיקאציע דאטנבאזע פֿעלער אדער איר זענט נישט ערמעגליכט צו דערהיינטיגן אייער דרויסנדיגע קאנטע.",
        "nocookieslogin": "{{SITENAME}} נוצט קיכלעך כדי אַרײַנלאגירן באַניצער.\nבײַ אײַך זענען קיכלעך אומדערמעגלעכט.\nביטע אַקטיווירט זיי און פרובירט נאכאַמאָל.",
        "nocookiesfornew": "מען האט נישט געשאַפֿן די באַניצער קאנטע, ווײַל מען האט נישט געקענט באַשטעטיקן איר מקור.\nטוט פֿעסטשטעלן אָז קיכלעך זענען אַקטיווירט, לאָדט אָן נאכאַמאל דעם בלאַט און פרואווט ווידער.",
        "noname": "איר האט נישט אַרײַנגעשטעלט קײַן גילטיקן באַניצער נאָמען.",
-       "loginsuccesstitle": "אריינלאגירט מיט הצלחה",
+       "loginsuccesstitle": "אריינלאגירט",
        "loginsuccess": "'''איר זענט אַצינד אַרײַנלאָגירט אין {{SITENAME}} ווי \"$1\".'''",
        "nosuchuser": "נישטא קיין באניצער מיטן נאמען  \"$1\".\n\nקוקט איבער אײַער אויסלייג, אדער [[Special:UserLogin/signup|שאַפֿט א נײַע קאנטע]].",
        "nosuchusershort": "נישטאָ קיין באַניצער מיטן נאָמען \"$1\".\nביטע באַשטעטיקט דעם אויסלייג.",
        "createaccount-title": "קאנטע באשאפֿן אין {{SITENAME}}",
        "createaccount-text": "עמעצער האט באשאפֿן א קאנטע פֿאר אייער ע-פאסט אדרעס אין {{SITENAME}} ($4) מיטן נאמען \"$2\" און  פאסווארט \"$3\". איר דארפט אצינד איינלאגירן און ענדערן דאס פאסווארט.\n\nאיר קענט איגנארירן די מעלדונג, ווען די קאנטע איז באשאפֿן בטעות.",
        "login-throttled": "איר האט געפרוווט צופֿיל מאל אריינלאגירן.\nזייט אזוי גוט און וואַרט $1 איידער איר פרוווט נאכאמאל.",
-       "login-abort-generic": "×\90ײַער ×\90רײַנ×\9c×\90×\92×\99ר×\95× ×\92 ×\90×\99×\96 × ×\99ש×\98 ×\92×¢×\95×\95×¢×\9f ×\93ערפֿ×\90×\9c×\92ר×\99×\99×\9a—אָפגעשטעלט",
+       "login-abort-generic": "×\90ײַער ×\90רײַנ×\9c×\90×\92×\99ר×\95× ×\92 ×\90×\99×\96 ×\93×\95ר×\9b×\92עפ×\90×\9c×\9f—אָפגעשטעלט",
        "login-migrated-generic": "אײַער קאנטע איז געווארן מיגרירט, און אײַער באניצער־נאמען איז מער נישט פאראן אויף דער וויקי.",
        "loginlanguagelabel": "שפראך: $1",
        "suspicious-userlogout": " אײַער בקשה אַרויסלאָגירן זיך איז אפגעלייגט געווארן ווייַל אייגנטלעך איז זי געשיקט דורך אַ צעבראכענעם בלעטערער אָדער א פראקסי מיט א זאפאס.",
        "createacct-another-realname-tip": "עכטער נאמען איז אפציאנאל.\nאויב איר וויילט אויס צוצושטעלן אים, וועט דאס גענוצט ווערן צו געבן אטריבוציע פאר זייער ארבעט.",
-       "pt-login": "אַרײַנלאגירן",
+       "pt-login": "אריינלאגירן",
        "pt-login-button": "אַרײַנלאָגירן",
        "pt-createaccount": "שאַפֿן אַ קאנטע",
        "pt-userlogout": "אַרויסלאָגירן",
        "newpassword": "ניי פּאסוואָרט:",
        "retypenew": "ווידער שרײַבן פאַסווארט:",
        "resetpass_submit": "שטעלן פאסווארט און אריינלאגירן",
-       "changepassword-success": "אייער פאַסווארט איז געטוישט געווארן מיט דערפֿאלג!",
+       "changepassword-success": "אייער פאַסווארט איז געטוישט געווארן!",
        "changepassword-throttled": "איר האט געפרוווט צופֿיל מאל אריינלאגירן.\nזייט אזוי גוט און וואַרט $1 איידער איר פרוווט נאכאמאל.",
+       "botpasswords": "באט פאסווערטער",
+       "botpasswords-label-appid": "באט נאמען:",
        "botpasswords-label-create": "שאַפֿן",
        "botpasswords-label-update": "דערהײַנטיקן",
        "botpasswords-label-cancel": "אַנולירן",
        "botpasswords-label-delete": "אויסמעקן",
        "botpasswords-label-resetpassword": "ווידערשטעלן פאַסווארט",
+       "botpasswords-label-grants-column": "נאכגעגעבן",
+       "botpasswords-created-title": "באט פאסווארט געשאפן",
+       "botpasswords-created-body": "דאס באט פאסווארט פאר באט־נאמען \"$1\" פון באניצער \"$2\" איז געשאפן געווארן.",
+       "botpasswords-updated-title": "באט פאסווארט דערהיינטיקט",
+       "botpasswords-updated-body": "דאס באט פאסווארט פאר באט־נאמען \"$1\" פון באניצער \"$2\" איז דערהיינטיקט געווארן.",
+       "botpasswords-deleted-title": "באט פאסווארט אויסגעמעקט",
        "resetpass_forbidden": "פאסווערטער קענען נישט ווערן געטוישט",
        "resetpass-no-info": "איר דארפֿט זיין אריינלאגירט צוצוקומען גלייך צו דעם דאזיגן בלאט.",
        "resetpass-submit-loggedin": "טוישן פאסווארט",
        "resetpass-submit-cancel": "אַנולירן",
-       "resetpass-wrong-oldpass": "×\90×\95×\9e×\92×\99×\9c×\98×\99×\92 ×¦×²Ö·×\98×\95×\95ײַ×\9c×\99ק ×\90×\93ער ×\9c×\95×\99פֿ×\99ק ×¤×\90ַס×\95×\95×\90ר×\98.\n×\90×\99ר ×\94×\90×\98 ×\9e×¢×\92×\9c×¢×\9a ×©×\95×\99×\9f ×\92×¢×\98×\95×\99ש×\98 ×\90×\99×\99ער ×¤×\90ַס×\95×\95×\90ר×\98 ×\9e×\99×\98 ×\94צ×\9c×\97×\94 ×\90×\93ער ×\92×¢×\91×¢×\98×\9f ×\90 × ×²Ö·  ×¦×²Ö·×\98×\95×\95ײַ×\9c×\99ק ×¤×\90ַס×\95×\95×\90ר×\98.",
+       "resetpass-wrong-oldpass": "אומגילטיג צײַטווײַליק אדער לויפֿיק פאַסווארט.\nאיר האט מעגלעך שוין געטוישט אייער פאַסווארט אדער געבעטן א נײַ  צײַטווײַליק פאַסווארט.",
        "resetpass-recycled": "זײַט אזוי גוט שטעטל אירע פאסווארט צו עפעס אנדערש פונעם לויפיקן פאסווארט.",
        "resetpass-temp-emailed": "איר האט זיך ארי לאגירת מיט א פראוויזארישן קאד געשיקט דורכן ע־פאסט. כדי שליסן דאס ארײַנלאגירן, דארט איר שטעלן א נײַ פאסווארט דא.",
        "resetpass-temp-password": "צײַטווייליק פאַסווארט:",
        "passwordreset-emailtext-user": "באניצער $1 אויף  {{SITENAME}} האט געבעטן צוריקצושטעלן אייער פאסווארט פאר {{SITENAME}} ($4).\nדי פאלגנדע באניצער {{PLURAL:$3|קאנטע איז|קאנטעס זענען}} פארבונדן מיט דעם ע־פאסט אדרעס:\n\n$2\n\n{{PLURAL:$3|דאס פראוויזארישע פאסווארט|די פראוויזארישע פאסווערטער}} וועלן אויסגיין נאך {{PLURAL:$5|איין טאג|$5 טעג}}.\nאיר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה,\nאדער ווען איר געדענקט יא אייער פריעריקע פאסווארט, און וויל עס נישט ענדערן,\n קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.",
        "passwordreset-emailelement": "באַניצער נאָמען: \n$1\n\nפראוויזארישער פּאַראָל: \n$2",
        "passwordreset-emailsentemail": "טאמער איז דער ע־פאסט אדרעס פארקניפט מיט אייער קאנטע, וועט מען שיקן א פאסווארט צוריקשטעלן ע-פּאָסט.",
+       "passwordreset-emailsentusername": "טאמער איז פאראן אן ע־פאסט אדרעס פארקניפט מיט דעם באניצער־נאמען, וועט מען שיקן א פאסווארט צוריקשטעלן ע-פּאָסט.",
        "passwordreset-emailsent-capture": "מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.",
        "passwordreset-emailerror-capture": "מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1",
        "changeemail": "ענדערן אדער אראפנעמען ע-פּאָסט אַדרעס",
        "minoredit": "דאס איז א מינערדיגע ענדערונג",
        "watchthis": "טוט אױפֿפּאַסן דעם בלאט",
        "savearticle": "אויפהיטן בלאַט",
+       "publishpage": "פובליצירן בלאט",
        "preview": "פֿאראויסקוק",
        "showpreview": "ווייזן פאָרױסקוק",
        "showdiff": "ווײַז די ענדערונגען",
        "userpage-userdoesnotexist": "באניצער קאנטע \"$1\" איז נישט אײַנגעשריבן.\nקוקט איבער צי איר ווילט שאפֿן/רעדאקטירן דעם בלאט.",
        "userpage-userdoesnotexist-view": "באניצער קאנטע \"$1\" איז נישט איינגעשריבן.",
        "blocked-notice-logextract": "דער באַניצער איז דערווייַל פֿאַרשפאַרט.\nדי לעצטע בלאָקירן לאג אַקציע איז צוגעשטעלט אונטן:",
-       "clearyourcache": "'''אַכטונג:''' נאכן אויפֿהיטן, ברויכט איר אפשר נאך אַריבערגיין דעם בלעטערערס זאַפאַס צו זען די ענדערונגען.\n\n* '''פֿייערפוקס/סאפֿארי:''' האלט אראפ ''שיפֿט'' בשעתן דרוקן ''Reload'', אדער דרוקט ''Ctrl-F5'' אדער ''Ctrl-R'' (אויף א מאקינטאש ''⌘-R'')\n\n* '''גוגל כראם:''' דרוקט ''Ctrl-Shift-R'' (אויף א מאקינטאש ''⌘-Shift-R'')\n\n* '''אינטערנעט עקספלארער:''' האלט אראפ ''Ctrl'' בשעתן קליקן ''Refresh'', אדער  דרוקט ''Ctrl-F5''\n\n* '''אפערע:''' ליידיגט אויס דעם זאַפאַס אין ''Tools → Preferences'' (''העדפות'' > ''כלים'')",
+       "clearyourcache": "'''אַכטונג:''' נאכן אויפֿהיטן, ברויכט איר אפשר נאך אַריבערגיין דעם בלעטערערס זאַפאַס צו זען די ענדערונגען.\n\n* '''פֿייערפוקס/סאפֿארי:''' האלט אראפ ''שיפֿט'' בשעתן דרוקן ''Reload'', אדער דרוקט ''Ctrl-F5'' אדער ''Ctrl-R'' (אויף א מאקינטאש ''⌘-R'')\n\n* '''גוגל כראם:''' דרוקט ''Ctrl-Shift-R'' (אויף א מאקינטאש ''⌘-Shift-R'')\n\n* '''אינטערנעט עקספלארער:''' האלט אראפ ''Ctrl'' בשעתן קליקן ''Refresh'', אדער  דרוקט ''Ctrl-F5''\n\n* <strong>אפערע:</strong> גייט צו <em>מעניו → שטעלונגען</em> (<em> אפערע → פרעפערנצן</em> אויף א מעק) און דערנאך צו <em>פריוואטקייט & און זיכערהייט → אראפראמען בלעטערן דאטן → בילדער און טעקעס אין זאפאס</em>",
        "usercssyoucanpreview": "'''טיפ:''' נוצט דאס {{int:showpreview}} קנעפל אויספרובירן אייער CSS בעפארן אויפהיטן.",
        "userjsyoucanpreview": "'''טיפ:''' נוצט דאס {{int:showpreview}} קנעפל אויספרובירן אייער  JavaScript בעפארן אויפהיטן.",
        "usercsspreview": "'''געדענקט אז איר טוט בלויז פאראויס זען אייער באניצער CSS.'''\n'''ער איז דערווייל נאכנישט אויפֿגעהיטן!'''",
        "revdelete-unsuppress": "טוה אפ באגרענעצונגן אין גענדערטע רעוויזיעס",
        "revdelete-log": "אורזאַך:",
        "revdelete-submit": "צושטעלן צו {{PLURAL:$1|סעלעקטירטער רעוויזיע| סעלעקטירטע רעוויזיעס}}",
-       "revdelete-success": "'''רע×\95×\95×\99×\96×\99×¢ ×\96×¢×\91×\90ַרק×\99×\99×\98 ×\93ערפֿ×\90×\9c×\92ר×\99×\99×\9a ×\93ער×\94ײַנ×\98×\99ק×\98.'''",
+       "revdelete-success": "'''רעוויזיע זעבאַרקייט דערהײַנטיקט.'''",
        "revdelete-failure": "'''נישט מעגלעך צו דערהײַנטיקן רעוויזיע זעבאַרקייט:'''\n$1",
-       "logdelete-success": "'''לאג באהאלטן איז סוקסעספול איינגעשטעלט.'''",
+       "logdelete-success": "'''לאגבוך זעבארקייט איינגעשטעלט.'''",
        "logdelete-failure": "'''נישט מעגלעך צו שטעלן לאג זעבאַרקייט:'''\n$1",
        "revdel-restore": "טויש די זעבארקייט",
        "pagehist": "בלאט היסטאריע",
        "userrights-changeable-col": "גרופעס איר קענט ענדערן",
        "userrights-unchangeable-col": "גרופעס איר קענט נישט ענדערן",
        "userrights-conflict": "קאנפֿליקט פון באניצער־רעכטן ענדערונגען! זייט אזוי גוט רעצענזירן און באשטעטיקן אײַערע ענדערונגען.",
-       "userrights-removed-self": "×\90×\99ר ×\94×\90×\98 ×\93ערפ×\90×\9c×\92ר×\99×\99×\9a ×\90ר×\90פ×\92×¢× ×\95×\9e×¢×\9f ×\90×\99×\99ערע ×\90×\99×\99×\92×¢× ×¢ ×¨×¢×\9b×\98×¢. אזוי קענט איר מער נישט דערגרייכן דעם בלאט.",
+       "userrights-removed-self": "×\90×\99ר ×\94×\90×\98 ×\90ר×\90פ×\92×¢× ×\95×\9e×¢×\9f ×\90×\99×\99ערע ×\90×\99×\99×\92×¢× ×¢ ×¨×¢×\9b×\98×\9f. אזוי קענט איר מער נישט דערגרייכן דעם בלאט.",
        "group": "גרופע:",
        "group-user": "באניצערס",
        "group-autoconfirmed": "באַשטעטיקטע באַניצער",
        "grant-group-file-interaction": "אינטעראגירן מיט מעדיע",
        "grant-group-email": "שיקן ע־פאסט",
        "grant-createaccount": "שאַפֿן קאנטעס",
+       "grant-uploadfile": "אַרויפֿלאָדן נייע טעקעס",
+       "grant-basic": "בעיסיק רעכטן",
+       "grant-viewmywatchlist": "קוקט אייער אויפפאסונג ליסטע",
        "newuserlogpage": "נייע באַניצערס לאָג-בוך",
        "newuserlogpagetext": "דאס איז א לאג פון באַניצערס אײַנשרײַבונגען.",
        "rightslog": "באַניצער רעכטן לאג",
        "imagelinks": "טעקע באַניץ",
        "linkstoimage": "{{PLURAL:$1|דער פאלגנדער בלאט ניצט|די פאלגנדע בלעטער ניצן}} דאס דאזיגע בילד:",
        "linkstoimage-more": "מער ווי $1 {{PLURAL:$1|בלאַט פֿאַרבינדט|בלעטער פֿאַרבינדן}} צו דער דאזיגער טעקע.\nדי פֿאלגנדע ליסטע ווײַזט  {{PLURAL:$1|דעם ערשטן בלאַט לינק|די ערשטע $1 בלאַט לינקען}} צו דער טעקע.\nס'איז פֿאַראַן[[Special:WhatLinksHere/$2|פֿולע רשימה]].",
-       "nolinkstoimage": "× ×\99ש×\98×\90 ×§×\99×\99×\9f ×\91×\9c×¢×\98ער ×\95×\95×\90ס × ×\99צ×\9f ×\93×\90ס ×\93×\90×\96×\99×\92×¢ ×\91×\99×\9c×\93.",
+       "nolinkstoimage": "× ×\99ש×\98×\90 ×§×\99×\99×\9f ×\91×\9c×¢×\98ער ×\95×\95×\90ס ×¤×\90ר×\91×\99× ×\93×\9f ×¦×\95 ×\93×\99 ×\98עקע.",
        "morelinkstoimage": "באַקוקן  [[Special:WhatLinksHere/$1|מער לינקען]] צו דער טעקע.",
        "linkstoimage-redirect": "$1 (טעקע ווײַטערפֿירונג) $2",
        "duplicatesoffile": "די פֿאלגנדע {{PLURAL:$1|טעקע דופליקירט|$1 טעקעס דופליקירן}} די דאזיגע טעקע ([[Special:FileDuplicateSearch/$2|נאך פרטים]]):",
        "unusedtemplates": "נישט באניצטע מוסטערן",
        "unusedtemplatestext": "דער בלאט ווײַזט אלע בלעטער אינעם {{ns:template}} נאמענטייל וואס זענען נישט אײַנגעשלאסן אין אן אנדער בלאט. געדענקט צו באקוקן אנדערע בלעטער פאר לינקען צו די מוסטערן איידער איר מעקט זיי אויס.",
        "unusedtemplateswlh": "אנדערע פֿאַרבינדונגען",
-       "randompage": "צ×\95פֿע×\9c×\99×\92ער ×\90ַר×\98×\99ק×\9c",
+       "randompage": "צ×\95פֿע×\9c×\99×\92ער ×\91×\9c×\90×\98",
        "randompage-nopages": "נישטא קיין בלעטער אין {{PLURAL:$2|דעם פאלגנדן נאמענטייל |די פאלגנדע נאמענטיילן}} \"$1\".",
        "randomincategory": "צופעליקער בלאט אין קאטעגאריע",
        "randomincategory-invalidcategory": "\"$1\" איז נישט קיין גילטיקער קאטעגאריע נאמען.",
        "querypage-disabled": "דער באַזונדער־בלאַט איז אומאַקטיווירט צוליב אויספֿירונג סיבות.",
        "apihelp": "API־הילף",
        "apihelp-no-such-module": "מאָדול \"$1\" נישט געפונען.",
+       "apisandbox-unfullscreen": "ווייזן בלאט",
        "apisandbox-reset": "רייניקן",
+       "apisandbox-retry": "פרובירן נאכאמאל",
+       "apisandbox-helpurls": "הילף לינקען",
+       "apisandbox-examples": "ביישפילן",
        "apisandbox-results": "רעזולטאטן",
        "booksources": "דרויסנדיגע ליטעראַטור ISBN",
        "booksources-search-legend": "זוכן פאר דרויסנדע ביכער מקורות",
        "logempty": "נישטא קיין פאַסנדיקע זאכן אין לאג.",
        "log-title-wildcard": "זוכן טיטלען וואס הייבן אָן מיט דעם טעקסט",
        "showhideselectedlogentries": "ווײַזן/באַהאַלטן געקליבענע לאגבוך אקציעס",
+       "checkbox-all": "אַלע",
+       "checkbox-none": "קיינע",
+       "checkbox-invert": "אומקערן",
        "allpages": "אַלע בלעטער",
        "nextpage": "קומענדיקער בלאַט ($1)",
        "prevpage": "פֿריִערדיקער בלאַט ($1)",
        "listgrouprights-namespaceprotection-header": "נאמענטייל באשרענקונגען",
        "listgrouprights-namespaceprotection-namespace": "נאָמענטייל",
        "listgrouprights-namespaceprotection-restrictedto": "רעכט(ן) וואס דערלויבט באניצער צו רעדאקטירן",
+       "listgrants-grant": "צולאזן",
+       "listgrants-rights": "רעכטן",
        "trackingcategories": "אויפפאסן־קאטעגאריעס",
        "trackingcategories-msg": "אויפפאסן־קאטעגאריע",
        "trackingcategories-name": "מעלדונג נאמען",
        "wlnote": "אונטן {{PLURAL:$1|איז די לעצטע ענדערונג|זענען די לעצטע <strong>$1</strong> ענדערונגען}} אין {{PLURAL:$2|דער לעצטער שעה|די לעצטע <strong>$2</strong> שעה'ן}} ביז $3, $4.",
        "wlshowlast": "ווײַזן די לעצטע $1 שעה'ן  $2 טעג",
        "watchlist-hide": "באַהאַלטן",
+       "watchlist-submit": "ווײַזן",
        "wlshowtime": "צייט־פעריאד צו ווייזן:",
        "wlshowhideminor": "מינערדיקער רעדאקטירונגען",
        "wlshowhidebots": "באטן",
        "wlshowhideanons": "אַנאָנימע באַניצער",
        "wlshowhidepatr": "פאטראלירטע רעדאקטירונגען",
        "wlshowhidemine": "מיינע רעקאקטירונגען",
+       "wlshowhidecategorization": "בלאט קאטעגאריזירונג",
        "watchlist-options": "אויפֿפאַסן ליסטע ברירות",
        "watching": "אויפפאסענדונג…",
        "unwatching": "נעמט אראפ פון אויפפאסונג ליסטע…",
        "delete-toobig": "דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אזעלכע בלעטער איז באַגרענעצט געווארן בכדי צו פֿאַרמײַדן א צופֿעליגע פֿאַרשטערונג פֿון  {{SITENAME}}.",
        "delete-warning-toobig": "דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אים קען פֿאַרשטערן דאַטנבאַזע אפעראַציעס פֿון {{SITENAME}}; זײַט פֿארזיכטיג איידער איר מעקט אויס.",
        "deleteprotected": "איר קענט נישט אויסמעקן דעם בלאט ווײַל ער איז געשיצט.",
-       "deleting-backlinks-warning": "'''ווארענוג:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|אנדערע בלעטער]]  פארבינדן צום בלאט אדער אריבערשליסן דעם בלאט איר האלט ביי אויסמעקן.",
+       "deleting-backlinks-warning": "</strong>ווארענוג:<strong>\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|אנדערע בלעטער]]  פארבינדן צום בלאט אדער אריבערשליסן דעם בלאט איר האלט ביי אויסמעקן.",
        "rollback": "צוריקדרייען רעדאַקטירונגען",
        "rollbacklink": "צוריקדרייען",
        "rollbacklinkcount": "צוריקדרייען $1 {{PLURAL:$1|רעדאקטירונג|רעדאקטירונגען}}",
        "rollbackfailed": "צוריקדרייען דורכגעפֿאַלן",
        "cantrollback": "מען קען נישט צוריקדרייען די ענדערונג – דער לעצטער בײַשטייערער איז דער איינציגסטער שרײַבער אין דעם בלאַט.",
        "alreadyrolled": "מען קען נישט צוריקדרייען די לעצטע ענדערונג פון בלאט [[:$1]] פֿון\n[[User:$2|$2]] ([[User talk:$2|רעדן]]{{int:pipe-separator}} [[Special:Contributions/$2|{{int:contribslink}}]]);\nאן אנדערער האט שוין געענדערט אדער צוריקגעדרייט דעם בלאט.\n\nדי לעצטע ענדערונג צום בלאַט איז געווען פון [[User:$3|$3]] ([[User talk:$3|רעדן]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "קורץ ווארט איז געווען: \"'''$1'''\".",
+       "editcomment": "קורץ ווארט איז געווען: <em>$1</em>.",
        "revertpage": "רעדאַקטירונגען פֿון  [[Special:Contributions/$2|$2]] צוריקגענומען ([[User talk:$2|רעדן]])  צו דער לעצטער ווערסיע פֿון [[User:$1|$1]]",
        "revertpage-nouser": "צוריקגעשטעלט רעדאַקטירונגען פֿון א באהאלטענעם באַניצער צו לעצטער רעוויזיע פֿון {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "צוריקגעדרייט רעדאַקטירונגען פֿון $1 צו דער לעצטע ווערסיע פֿון $2",
        "changecontentmodel-title-label": "בלאט־טיטל",
        "changecontentmodel-model-label": "נייער אינהאלט מאדעל",
        "changecontentmodel-reason-label": "אורזאַך:",
+       "changecontentmodel-submit": "טוישן",
        "logentry-contentmodel-change-revertlink": "צוריקשטעלן",
        "logentry-contentmodel-change-revert": "צוריקשטעלן",
        "protectlogpage": "באשיצונג לאָג-בוך",
        "ipb-unblock": "אויפֿבלאקירן א באַניצער נאמען אדער IP אדרעס",
        "ipb-blocklist": "זעט עקזיסטירנדע בלאקירונגען",
        "ipb-blocklist-contribs": "בײַשטײַערונגען פֿון {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "נאך $1",
        "unblockip": "אויפֿבלאקירן באניצער",
        "unblockiptext": "מיט דעם פארמולאר קענט איר צוריקשטעלן שרייבן ערלויבניש צו אן IP אדרעס אדער באניצער נאמען וואס איז געווען בלאקירט.",
        "ipusubmit": "אוועקנעמען דעם בלאק",
        "blocklink": "ארויסטרייבן",
        "unblocklink": "באַפֿרײַען",
        "change-blocklink": "ענדערן בלאק",
-       "contribslink": "×\91×\90Ö·× ×\99צערס ×\91ײַש×\98ײַער×\95× ×\92×¢×\9f",
+       "contribslink": "בײַשטײַערונגען",
        "emaillink": "שיקן ע־פאסט",
        "autoblocker": "אויטאמאטיש בלאקירט ווייל אײַער IP אדרעס איז לעצטנס געניצט געווארן דורך [[User:$1|$1]]. \nדער סיבה וואס איז אנגעבען געווארן איז: \"$2\".",
        "blocklogpage": "בלאקירן לאג",
        "import-nonewrevisions": "קיין רעוויזיעס נישט אימפארטירט (אדער אלע שוין דא, אדער איבערגעהיפט צוליב גרײַזן).",
        "xml-error-string": "$1 בײַ שורה $2, זייל $3 (בייט $4): $5",
        "import-upload": "אַרויפֿלאָדן XML דאַטן",
-       "import-token-mismatch": "×\90ָנ×\95×\95ער ×¤×\95×\9f ×¡×¢×¡×\99×¢ ×\93×\90Ö·×\98×\9f.\n ×\91×\99×\98×¢ ×¤×¨×\95×\91×\99ר×\98 × ×\90×\9b×\90×\9e×\90×\9c.",
+       "import-token-mismatch": "פ×\90ר×\9c×\95ס×\98 ×¤×\95×\9f ×¡×¢×¡×\99×¢ ×\93×\90×\98×\9f. \n\nקע×\9f ×\96×\99×\99×\9f ×\90×\96 ×\90×\99ר ×\96×¢× ×¢×\9f ×\92×¢×\95×\95×\90ר×\9f ×\90ר×\95×\99ס×\9c×\90×\92×\99ר×\98\n<strong>×\91×\99×\98×¢ ×¤×¨×\95×\91×\99ר×\98 × ×\90×\9b×\90×\9e×\90×\9c</strong>. \n\n×\90×\95×\99×\91 ×¡'×\90ר×\91×¢×\98 × ×\90×\9a ×\90×\9cס × ×\99×\98, ×¤×¨×\95×\91×\99ר×\98 [[Special:UserLogout|×\90ר×\95×\99ס×\9c×\90×\92×\99ר×\9f]] ×\90×\95×\9f ×\96×\99×\9a ×¦×\95ר×\99ק ×\90ר×\99×\99× ×\9c×\90×\92×\99ר×\9f.",
        "import-invalid-interwiki": "נישט מעגלעך צו אימפארטירן פון ספעציפֿירטער וויקי.",
        "import-error-edit": "דעם בלאט \"$1\" קען מען נישט אימפארטירן ווייל איר האט נישט די רעכט אים צו רעדאקטירן.",
        "import-error-create": "דעם  בלאט \"$1\" האט מען נישט אימפארטירט ווייל איר האט נישט די רעכט צו שאפן אים.",
        "tooltip-pt-mycontris": "ליסטע פון {{GENDER:|אייערע}} ביישטייערונגען",
        "tooltip-pt-login": "עס איז רעקאָמענדירט זיך אײַנשרײַבן; ס'איז אבער נישט קיין פֿליכט",
        "tooltip-pt-logout": "ארויסלאגירן",
-       "tooltip-pt-createaccount": "איר ווערט דערמוטיגט צו שאפן א קאנטע און אריינלאגירן; ס'איז אביר נישט אבליגאטאריש",
+       "tooltip-pt-createaccount": "איר ווערט דערמוטיגט צו שאַפֿן א קאנטע און אריינלאגירן; ס׳איז אבער נישט פארפליכטעט",
        "tooltip-ca-talk": "שמועס וועגן דעם אינהאַלט בלאַט",
-       "tooltip-ca-edit": "רעדאקטירן דעם בלאַט",
+       "tooltip-ca-edit": "רעדאַקטירן דעם בלאַט",
        "tooltip-ca-addsection": "אָנהייבן א נײַע אָפטיילונג",
        "tooltip-ca-viewsource": "דאס איז א פֿארשלאסענער בלאט, איר קענט נאר באַקוקן זיין מקור",
        "tooltip-ca-history": "פריערדיגע ווערסיעס פון דעם בלאט.",
        "tooltip-ca-move": "באַוועגן דעם בלאַט",
        "tooltip-ca-watch": "לייגט צו דעם בלאט אויפצופאסן",
        "tooltip-ca-unwatch": "נעמט אַראָפּ דעם בלאַט פון נאָכפאָלג־ליסטע",
-       "tooltip-search": "×\96×\95×\9b×\98 ×\90×\99× ×¢×\9d ×¡×\99×\99×\98",
+       "tooltip-search": "×\96×\95×\9a {{SITENAME}}",
        "tooltip-search-go": "גייט צו א בלאט מיט אט דעם נאמען, אויב ער עקסיסטירט",
        "tooltip-search-fulltext": "זוכט דעם טעקסט אין די בלעטער",
-       "tooltip-p-logo": "×\94×\95×\99פ×\98 ×\96×\99×\99ט",
+       "tooltip-p-logo": "×\91×\90Ö·×\96×\95×\9b×\9f ×\93×¢×\9d ×\94×\95×\99פ×\98 ×\91×\9c×\90Ö·ט",
        "tooltip-n-mainpage": "באַזוכט דעם הויפּט־זײַט",
        "tooltip-n-mainpage-description": "באַזוכן דעם הויפט בלאַט",
        "tooltip-n-portal": "גייט אריין אין די געמיינדע צו שמועסן",
        "tooltip-n-currentevents": "מער אינפארמאציע איבער אקטועלע געשענישען",
-       "tooltip-n-recentchanges": "ליסטע פון לעצטע ענדערונגען",
+       "tooltip-n-recentchanges": "ליסטע פון לעצטע ענדערונגען אין דעם וויקי",
        "tooltip-n-randompage": "וועלט אויס א צופעליגער בלאט",
-       "tooltip-n-help": "×\94×\99×\9c×£",
-       "tooltip-t-whatlinkshere": "×\90×\9c×¢ ×\91×\9c×¢×\98ער ×\95×\95×\90ס ×¤×\90ר×\91×\99× ×\93×¢×\9f ×¦×\95 ×\93×¢×\9d ×\91×\9c×\90×\98",
+       "tooltip-n-help": "×\93ער ×¤×\9c×\90×¥ ×\90×\95×\99סצ×\95×\92עפ×\99× ×¢×\9f",
+       "tooltip-t-whatlinkshere": "×\90×\9c×¢ ×\9c×\99ס×\98×¢ ×¤×\95×\9f ×\90×\9c×¢ ×\91×\9c×¢×\98ער ×\95×\95×\90ס ×¤×\90ר×\91×\99× ×\93×\98 ×\90×\94ער",
        "tooltip-t-recentchangeslinked": "אלע ענדערונגען פון בלעטער וואס זענען אהער פארבינדען",
        "tooltip-feed-rss": "דערהײַנטיגט אויטאמאטיש פון אר.עס.עס. RSS",
        "tooltip-feed-atom": "לייג צו אן אטאמאטישער אפדעיט דורך אטאם Atom",
        "lastmodifiedatby": "די לעצטע ענדערונג פֿון דעם בלאַט איז געווען $2, $1 דורך $3.",
        "othercontribs": "באזירט אויף ארבעט פון $1.",
        "others": "אנדערע",
-       "siteusers": "{{PLURAL:$2|באַניצער| באַניצערס}} {{SITENAME}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1| באַניצער}}| באַניצערס}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2| אַנאנימער באַניצער|אַנאנימע באַניצער}} $1",
        "creditspage": "בלאט קרעדיטס",
        "nocredits": "נישט פאראן קיין אינפארמאציע פאר דעם בלאט.",
        "scarytranscludedisabled": "[אינטערוויקי אריבערשליסן איז אַנולירט]",
        "scarytranscludetoolong": "[URL צו לאנג]",
        "deletedwhileediting": "ווארענונג: דער בלאט איז געווארן אויסגעמעקט נאכדעם וואס איר האט אנגעהויבן רעדאקטירן!",
-       "confirmrecreate": "באַניצער [[User:$1|$1]] ([[User talk:$1|רעדן]]) האט אויסגעמעקט דעם בלאט נאכדעם וואס איר האט אנגעהויבן דאס צו ענדערן, אלס אָנגעבליכער סיבה:\n:'''$2'''\nביטע באשטעטיגט אז איר ווילט טאקע צוריקשטעלן דעם בלאט.",
+       "confirmrecreate": "באַניצער [[User:$1|$1]] ([[User talk:$1|רעדן]]) {{GENDER:$1|האט אויסגעמעקט}} דעם בלאט נאכדעם וואס איר האט אנגעהויבן דאס צו ענדערן, אלס אָנגעבליכער סיבה:\n: <em>$2</em>\nביטע באשטעטיגט אז איר ווילט טאקע צוריקשטעלן דעם בלאט.",
        "recreate": "שאַפֿן פֿונדאסניי",
        "confirm_purge_button": "אויספֿירן",
        "confirm-purge-top": "אויסקלארן די קאשעי פון דעם בלאט?",
        "fileduplicatesearch-submit": "זוכן",
        "fileduplicatesearch-info": "$1 × $2 פיקסעל<br />טעקע גרייס: $3<br /> טיפ MIME: $4",
        "fileduplicatesearch-noresults": "קיין טעקע מיטן נאמען \"$1\" נישט געטראפֿן.",
-       "specialpages": "ספּעציעלע זײַטן",
+       "specialpages": "ספעציעלע בלעטער",
        "specialpages-note-top": "לעגענדע",
        "specialpages-note": "* נארמאַלע באַזונדערע בלעטער.\n* <span class=\"mw-specialpagerestricted\">באַגרענעצטע באַזונדערע בלעטער.</span>",
        "specialpages-group-maintenance": "אויפֿהאַלטונג באַריכטן",
        "logentry-newusers-create2": "באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}} דורך $3",
        "logentry-newusers-byemail": "באניצער קאנטע $3 איז {{GENDER:$2|געשאפן געווארן}} דורך $1 און דאס פאסווארט איז געשיקט געווארט דורך ע־פאסט",
        "logentry-newusers-autocreate": "באַניצער קאנטע $1 {{GENDER:$2|געשאפן}} אויטאמאטיש",
-       "logentry-rights-rights": "$1 האָט {{GENDER:$2|געביטן}} גרופּע מיטגלידערשאַפט פאַר $3 פון $4 אויף $5",
+       "logentry-rights-rights": "$1 האָט {{GENDER:$2|געביטן}} גרופּע מיטגלידערשאַפט פאַר {{GENDER:$6|$3}} פון $4 אויף $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|האט געביטן}} גרופע מיטגלידערשאפט פאר $3",
        "logentry-rights-autopromote": "$1 אויטאמאטיש  {{GENDER:$2|פראמאווירט}} פון $4 צו $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|האט ארויפגעלאדן}} $3",
        "feedback-subject": "טעמע:",
        "feedback-submit": "אײַנגעבן",
        "feedback-thanks": "ייש\"כ! אײַער פֿידבעק איז געווארן ארויפגעלעגט צום בלאט \"[$2 $1]\".",
-       "searchsuggest-search": "×\96×\95×\9b×\9f",
+       "searchsuggest-search": "×\96×\95×\9a",
        "searchsuggest-containing": "כולל…",
        "api-error-badaccess-groups": "איר האט נישט קיין רעכטן אַרויפֿלאָדן טעקעס אויף דער וויקי.",
        "api-error-badtoken": "אינערלעכער גרײַז: סימן טויג נישט.",
index cde58b0..68b3945 100644 (file)
        "changecontentmodel-success-text": "[[:$1]]的内容类型被更改。",
        "changecontentmodel-cannot-convert": "[[:$1]]上的内容不能转换为$2的一个类型。",
        "changecontentmodel-nodirectediting": "$1内容模型不支持直接编辑",
+       "changecontentmodel-emptymodels-title": "没有内容模型可用",
+       "changecontentmodel-emptymodels-text": "[[:$1]]上的内容不能转换为任何类型。",
        "log-name-contentmodel": "内容模型更改日志",
        "log-description-contentmodel": "与一个页面的内容模型相关的活动",
        "logentry-contentmodel-new": "$1已使用非默认的内容模型“$5”{{GENDER:$2|创建}}页面$3",
        "lockdbsuccesstext": "数据库已锁定。<br />请记住在维护工作完成后[[Special:UnlockDB|解锁数据库]]。",
        "unlockdbsuccesstext": "数据库已解锁。",
        "lockfilenotwritable": "数据库锁定文件不可写。要锁定和解锁数据库,该文件必须对网络服务器可写。",
+       "databaselocked": "数据库已被锁定。",
        "databasenotlocked": "数据库未被锁定。",
        "lockedbyandtime": "(由 {{GENDER:$1|$1}} 于$2 $3执行)",
        "move-page": "移动$1",
index 55b554f..2ec731c 100644 (file)
@@ -70,7 +70,8 @@
                        "Bowleerin",
                        "飞舞回堂前",
                        "Bbslam",
-                       "Zerng07"
+                       "Zerng07",
+                       "Reke"
                ]
        },
        "tog-underline": "底線標示連結:",
        "minoredit": "這是一個小修訂",
        "watchthis": "監視此頁面",
        "savearticle": "儲存頁面",
+       "publishpage": "發布頁面",
        "preview": "預覽",
        "showpreview": "顯示預覽",
        "showdiff": "顯示變更",
        "changecontentmodel-success-text": "已變更 [[:$1]] 的內容類型。",
        "changecontentmodel-cannot-convert": "[[:$1]] 的內容無法轉換為 $2 類型。",
        "changecontentmodel-nodirectediting": "$1 的內容模型不支援直接編輯",
+       "changecontentmodel-emptymodels-title": "沒有內容模型可用",
+       "changecontentmodel-emptymodels-text": "[[:$1]]上的內容不能轉換為任何類型。",
        "log-name-contentmodel": "內容模型變更日誌",
        "log-description-contentmodel": "與頁面內容模型相關的事件",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|已使用}}非預設的內容模型 \"$5\" 建立頁面 $3",
        "lockdbsuccesstext": "已鎖定資料庫。<br />\n請記得在維護完成後 [[Special:UnlockDB|解除鎖定]] 資料庫。",
        "unlockdbsuccesstext": "已解除鎖定資料庫。",
        "lockfilenotwritable": "沒有權限寫入資料庫鎖定檔案。\n網頁伺服器需要該檔案的寫入權限以鎖定和解除鎖定資料庫。",
+       "databaselocked": "資料庫已被鎖定。",
        "databasenotlocked": "資料庫尚未鎖定。",
        "lockedbyandtime": "(由 {{GENDER:$1|$1}} 於 $2 的 $3)",
        "move-page": "移動 $1",
        "tooltip-ca-nstab-category": "檢視分類頁面",
        "tooltip-minoredit": "標記為小修訂",
        "tooltip-save": "儲存您的變更",
+       "tooltip-publish": "發佈您的更改",
        "tooltip-preview": "請在儲存前預覽您的變更!",
        "tooltip-diff": "顯示您對內容所做的變更",
        "tooltip-compareselectedversions": "查閱此頁面兩個已選擇的修訂間的差異",
        "invalidateemail": "取消電子郵件確認",
        "notificationemail_subject_changed": "{{SITENAME}} 註冊的電子郵件位址已變更",
        "notificationemail_subject_removed": "{{SITENAME}} 註冊的電子郵件位址已移除",
+       "notificationemail_body_changed": "來自IP位址$1的某個人(可能是您),在{{SITENAME}}上將帳號\"$2\"的電子郵件位址改成\"$3\"。\n\n如果非您本人所為,請立即跟網站管理員聯繫。",
+       "notificationemail_body_removed": "來自IP位址$1的某人(可能是您),在{{SITENAME}}上移除了帳號$2的電子郵件位址。\n\n如果非您本人所為,請立即跟網站管理員聯繫。",
        "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
        "scarytranscludefailed": "[模板 $1 讀取失敗]",
        "scarytranscludefailed-httpstatus": "[模板 $1 讀取失敗:HTTP $2]",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|已保護}} $3 $4 [連鎖]",
        "logentry-protect-modify": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4 [連鎖]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格由 $4 成為 $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|已更改}} {{GENDER:$6|$3}} 的群組成員資格由 $4 成為 $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格",
        "logentry-rights-autopromote": "$1 已自動{{GENDER:$2|提升}}從 $4 成為 $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|已上傳}} $3",
        "feedback-useragent": "使用者代理:",
        "searchsuggest-search": "搜尋",
        "searchsuggest-containing": "包含...",
+       "api-error-autoblocked": "您的IP位址已經被自動封禁,因為它曾經被一名已封禁的使用者使用過。",
        "api-error-badaccess-groups": "您沒有權限在此 Wiki 上傳檔案。",
        "api-error-badtoken": "內部錯誤:密鑰錯誤。",
+       "api-error-blocked": "您已被封禁,無法編輯。",
        "api-error-copyuploaddisabled": "此伺服器已停用使用 URL 上傳檔案的功能。",
        "api-error-duplicate": "在網站上已有相同內容的{{PLURAL:$1|其他檔案|其他檔案}}。",
        "api-error-duplicate-archive": "在網站上曾有相同內容的{{PLURAL:$1|其他檔案|其他檔案}},但已被刪除。",
        "api-error-nomodule": "內部錯誤:缺少上傳模組集。",
        "api-error-ok-but-empty": "內部錯誤:伺服器沒有回應。",
        "api-error-overwrite": "不允許覆蓋已存在的檔案。",
+       "api-error-ratelimited": "您正在嘗試在比本wiki所允許時間更短的時間內,上傳更多的檔案。請稍待幾分鐘之後再試一次。",
        "api-error-stashfailed": "內部錯誤:伺服器儲存暫存檔案失敗。",
        "api-error-publishfailed": "內部錯誤:伺服器發佈暫存檔案失敗。",
        "api-error-stasherror": "上傳檔案至儲藏庫時發生錯誤。",
        "api-error-unknownerror": "不明錯誤:\"$1\"。",
        "api-error-uploaddisabled": "此 Wiki 的上傳功能已停用。",
        "api-error-verification-error": "此檔案可能已損壞,或副檔名錯誤。",
+       "api-error-was-deleted": "與此名稱相同的檔案曾被上傳過,隨後遭到刪除。",
        "duration-seconds": "$1 秒",
        "duration-minutes": "$1 分鐘",
        "duration-hours": "$1 小時",
        "special-characters-group-ipa": "國際音標",
        "special-characters-group-symbols": "符號",
        "special-characters-group-greek": "希臘文",
+       "special-characters-group-greekextended": "希臘字母擴展",
        "special-characters-group-cyrillic": "斯拉夫文",
        "special-characters-group-arabic": "阿拉伯文",
        "special-characters-group-arabicextended": "阿拉伯文擴充",
index e54c4a7..2c577ed 100644 (file)
@@ -48,13 +48,19 @@ $namespaceGenderAliases = [
 $specialPageAliases = [
        'Activeusers'               => [ 'Aktivní_uživatelé', 'Aktivni_uzivatele' ],
        'Allmessages'               => [ 'Všechna_hlášení', 'Všechny_zprávy', 'Vsechna_hlaseni', 'Vsechny_zpravy' ],
+       'AllMyUploads'              => [ 'Všechny_moje_soubory', 'Všechny_mé_soubory' ],
        'Allpages'                  => [ 'Všechny_stránky', 'Vsechny_stranky' ],
        'Ancientpages'              => [ 'Nejstarší_stránky', 'Staré_stránky', 'Stare_stranky' ],
+       'ApiHelp'                   => [ 'Nápověda_k_API' ],
+       'ApiSandbox'                => [ 'API_pískoviště' ],
+       'Badtitle'                  => [ 'Neplatný_název' ],
        'Blankpage'                 => [ 'Prázdná_stránka' ],
        'Block'                     => [ 'Blokování', 'Blokovani', 'Blokovat_uživatele', 'Blokovat_IP', 'Blokovat_uzivatele' ],
        'Booksources'               => [ 'Zdroje_knih' ],
+       'BotPasswords'              => [ 'Hesla_pro_boty' ],
        'BrokenRedirects'           => [ 'Přerušená_přesměrování', 'Prerusena_presmerovani' ],
        'Categories'                => [ 'Kategorie' ],
+       'ChangeContentModel'        => [ 'Změnit_model_obsahu_stránky' ],
        'ChangeEmail'               => [ 'Změna_emailu', 'Zmena_emailu' ],
        'ChangePassword'            => [ 'Změna_hesla', 'Zmena_hesla' ],
        'ComparePages'              => [ 'Porovnání_stránek', 'PorovnáníStránek', 'Porovnani_stranek', 'PorovnaniStranek' ],
@@ -63,7 +69,10 @@ $specialPageAliases = [
        'CreateAccount'             => [ 'Vytvořit_účet', 'Vytvorit_ucet' ],
        'Deadendpages'              => [ 'Slepé_stránky', 'Slepe_stranky' ],
        'DeletedContributions'      => [ 'Smazané_příspěvky', 'Smazane_prispevky' ],
+       'Diff'                      => [ 'Rozdíl' ],
        'DoubleRedirects'           => [ 'Dvojitá_přesměrování', 'Dvojita_presmerovani' ],
+       'EditTags'                  => [ 'Upravit_značky' ],
+       'EditWatchlist'             => [ 'Upravit_seznam_sledovaných_stránek' ],
        'Emailuser'                 => [ 'E-mail' ],
        'ExpandTemplates'           => [ 'Testy_šablon' ],
        'Export'                    => [ 'Exportovat_stránky' ],
@@ -76,7 +85,9 @@ $specialPageAliases = [
        'LinkSearch'                => [ 'Hledání_odkazů', 'Hledani_odkazu' ],
        'Listadmins'                => [ 'Seznam_správců', 'Seznam_spravcu' ],
        'Listbots'                  => [ 'Seznam_botů', 'Seznam_botu' ],
+       'ListDuplicatedFiles'       => [ 'Seznam_duplicitních_souborů' ],
        'Listfiles'                 => [ 'Seznam_souborů', 'Seznam_souboru' ],
+       'Listgrants'                => [ 'Seznam_grantů' ],
        'Listgrouprights'           => [ 'Práva_uživatelských_skupin', 'Seznam_uživatelských_práv', 'Seznam_uzivatelskych_prav' ],
        'Listredirects'             => [ 'Seznam_přesměrování', 'Seznam_presmerovani' ],
        'Listusers'                 => [ 'Uživatelé', 'Uzivatele', 'Seznam_uživatelů', 'Seznam_uzivatelu' ],
@@ -84,6 +95,7 @@ $specialPageAliases = [
        'Log'                       => [ 'Protokolovací_záznamy', 'Protokoly', 'Protokol', 'Protokolovaci_zaznamy' ],
        'Lonelypages'               => [ 'Sirotčí_stránky', 'Sirotci_stranky' ],
        'Longpages'                 => [ 'Nejdelší_stránky', 'Nejdelsi_stranky' ],
+       'MediaStatistics'           => [ 'Statistika_souborů', 'Statistiky_souborů' ],
        'MergeHistory'              => [ 'Sloučení_historie', 'Slouceni_historie', 'Sloučit_historii' ],
        'MIMEsearch'                => [ 'Hledání_podle_MIME', 'Hledani_podle_MIME', 'Hledat_podle_MIME_typu' ],
        'Mostcategories'            => [ 'Stránky_s_nejvíce_kategoriemi', 'Stranky_s_nejvice_kategoriemi', 'Stránky_s_nejvyšším_počtem_kategorií' ],
@@ -94,18 +106,27 @@ $specialPageAliases = [
        'Mostrevisions'             => [ 'Stránky_s_nejvíce_editacemi', 'Stranky_s_nejvice_editacemi', 'Stránky_s_nejvyšším_počtem_editací' ],
        'Movepage'                  => [ 'Přesunout_stránku', 'Přejmenovat_stránku' ],
        'Mycontributions'           => [ 'Mé_příspěvky', 'Me_prispevky' ],
+       'MyLanguage'                => [ 'V_mém_jazyce', 'Můj_jazyk' ],
        'Mypage'                    => [ 'Moje_stránka', 'Moje_stranka' ],
        'Mytalk'                    => [ 'Moje_diskuse' ],
+       'Myuploads'                 => [ 'Moje_soubory', 'Mé_soubory' ],
        'Newimages'                 => [ 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ],
        'Newpages'                  => [ 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ],
        'PasswordReset'             => [ 'Reset_hesla', 'Resetovat_heslo' ],
+       'PagesWithProp'             => [ 'Stránky_s_vlastností', 'Stránky_s_vlastnostmi' ],
+       'PasswordReset'             => [ 'Reset_hesla', 'Resetovat_heslo', 'Obnova_hesla', 'Obnovit_heslo' ],
+       'PermanentLink'             => [ 'Trvalý_odkaz' ],
        'Preferences'               => [ 'Nastavení', 'Nastaveni' ],
+       'Prefixindex'               => [ 'Stránky_podle_začátku' ],
        'Protectedpages'            => [ 'Zamčené_stránky', 'Zamcene_stranky' ],
        'Protectedtitles'           => [ 'Zamčené_názvy', 'Zamcene_nazvy', 'Stránky_které_nelze_vytvořit' ],
        'Randompage'                => [ 'Náhodná_stránka', 'Nahodna_stranka' ],
        'Randomredirect'            => [ 'Náhodné_přesměrování', 'Nahodne_presmerovani' ],
+       'RandomInCategory'          => [ 'Náhodná_stránka_v_kategorii' ],
+       'Randomrootpage'            => [ 'Náhodná_kořenová_stránka' ],
        'Recentchanges'             => [ 'Poslední_změny', 'Posledni_zmeny' ],
        'Recentchangeslinked'       => [ 'Související_změny', 'Souvisejici_zmeny' ],
+       'Redirect'                  => [ 'Přesměrování', 'Přesměrovat' ],
        'Revisiondelete'            => [ 'Smazat_revizi' ],
        'Search'                    => [ 'Hledání', 'Hledani' ],
        'Shortpages'                => [ 'Nejkratší_stránky', 'Nejkratsi_stranky' ],
index dc9431f..2db0139 100644 (file)
@@ -98,6 +98,7 @@ TEXT
                $options = [
                        'LIMIT' => self::BATCH_SIZE,
                        'ORDER BY' => $orderBy,
+                       'STRAIGHT_JOIN' // per T58041
                ];
 
                if ( $force || $dryRun ) {
index 625c02e..9a8b058 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:02Z
+ * Date: 2016-05-10T22:58:27Z
  */
 ( function ( OO ) {
 
index eeb4b28..9ec7278 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:06Z
+ * Date: 2016-05-10T22:58:31Z
  */
 .oo-ui-element-hidden {
        display: none !important;
        display: none;
 }
 .oo-ui-textInputWidget [type="search"]::-webkit-search-decoration,
-.oo-ui-textInputWidget [type="search"]::-webkit-search-cancel-button,
-.oo-ui-textInputWidget [type="search"]::-webkit-search-results-button,
-.oo-ui-textInputWidget [type="search"]::-webkit-search-results-decoration {
+.oo-ui-textInputWidget [type="search"]::-webkit-search-cancel-button {
        display: none;
 }
 .oo-ui-textInputWidget > .oo-ui-iconElement-icon,
index 268a680..ba293e4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:06Z
+ * Date: 2016-05-10T22:58:31Z
  */
 .oo-ui-element-hidden {
        display: none !important;
@@ -62,9 +62,6 @@
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        margin-left: 0.46875em;
 }
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
-       box-shadow: inset 0 0 0 1px #347bff, 0 0 0 1px #347bff;
-}
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button .oo-ui-indicatorElement-indicator {
        margin-right: 0;
 }
@@ -77,6 +74,9 @@
        padding-right: 0.25em;
        color: #333333;
 }
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #347bff, 0 0 0 1px #347bff;
+}
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #555555;
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
        color: #cccccc;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus {
-       box-shadow: none;
-}
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
        display: none;
 }
 .oo-ui-textInputWidget [type="search"]::-webkit-search-decoration,
-.oo-ui-textInputWidget [type="search"]::-webkit-search-cancel-button,
-.oo-ui-textInputWidget [type="search"]::-webkit-search-results-button,
-.oo-ui-textInputWidget [type="search"]::-webkit-search-results-decoration {
+.oo-ui-textInputWidget [type="search"]::-webkit-search-cancel-button {
        display: none;
 }
 .oo-ui-textInputWidget > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
        outline: 0;
        border-color: #347bff;
-       box-shadow: inset 0 0 0 0.1em #347bff;
+       box-shadow: inset 0 0 0 1px #347bff;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
index ddfee91..cbc02eb 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:02Z
+ * Date: 2016-05-10T22:58:27Z
  */
 ( function ( OO ) {
 
@@ -2001,10 +2001,13 @@ OO.ui.mixin.ButtonElement.prototype.toggleFramed = function ( framed ) {
 /**
  * Set the button's active state.
  *
- * The active state occurs when a {@link OO.ui.ButtonOptionWidget ButtonOptionWidget} or
- * a {@link OO.ui.ToggleButtonWidget ToggleButtonWidget} is pressed. This method does nothing
- * for other button types.
+ * The active state can be set on:
  *
+ *  - {@link OO.ui.ButtonOptionWidget ButtonOptionWidget} when it is selected
+ *  - {@link OO.ui.ToggleButtonWidget ToggleButtonWidget} when it is toggle on
+ *  - {@link OO.ui.ButtonWidget ButtonWidget} when clicking the button would only refresh the page
+ *
+ * @protected
  * @param {boolean} value Make button active
  * @chainable
  */
@@ -2017,6 +2020,7 @@ OO.ui.mixin.ButtonElement.prototype.setActive = function ( value ) {
 /**
  * Check if the button is active
  *
+ * @protected
  * @return {boolean} The button is active
  */
 OO.ui.mixin.ButtonElement.prototype.isActive = function () {
@@ -3332,6 +3336,7 @@ OO.ui.mixin.AccessKeyedElement.prototype.getAccessKey = function () {
  *
  * @constructor
  * @param {Object} [config] Configuration options
+ * @cfg {boolean} [active=false] Whether button should be shown as active
  * @cfg {string} [href] Hyperlink to visit when the button is clicked.
  * @cfg {string} [target] The frame or window in which to open the hyperlink.
  * @cfg {boolean} [noFollow] Search engine traversal hint (default: true)
@@ -3366,6 +3371,7 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
        this.$element
                .addClass( 'oo-ui-buttonWidget' )
                .append( this.$button );
+       this.setActive( config.active );
        this.setHref( config.href );
        this.setTarget( config.target );
        this.setNoFollow( config.noFollow );
@@ -3522,6 +3528,14 @@ OO.ui.ButtonWidget.prototype.setNoFollow = function ( noFollow ) {
        return this;
 };
 
+// Override method visibility hints from ButtonElement
+/**
+ * @method setActive
+ */
+/**
+ * @method isActive
+ */
+
 /**
  * A ButtonGroupWidget groups related buttons and is used together with OO.ui.ButtonWidget and
  * its subclasses. Each button in a group is addressed by a unique reference. Buttons can be added,
index c1150d0..3a99fba 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:02Z
+ * Date: 2016-05-10T22:58:27Z
  */
 ( function ( OO ) {
 
index 957dcfc..d757813 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:06Z
+ * Date: 2016-05-10T22:58:31Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
index 1faf7e5..82335a4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:06Z
+ * Date: 2016-05-10T22:58:31Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
index 49b9674..d976448 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:02Z
+ * Date: 2016-05-10T22:58:27Z
  */
 ( function ( OO ) {
 
index 4de8cea..7a45a25 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:06Z
+ * Date: 2016-05-10T22:58:31Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
index 5c48ea5..a530235 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:06Z
+ * Date: 2016-05-10T22:58:31Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus {
        border-color: #347bff;
+       box-shadow: inset 0 0 0 1px #347bff;
        outline: 0;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on {
 .oo-ui-numberInputWidget-field > .oo-ui-buttonWidget {
        width: 2.5em;
 }
-.oo-ui-numberInputWidget-minusButton.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
+.oo-ui-numberInputWidget-minusButton.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        border-top-right-radius: 0;
        border-bottom-right-radius: 0;
        border-right-width: 0;
 }
-.oo-ui-numberInputWidget-plusButton.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
+.oo-ui-numberInputWidget-plusButton.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        border-top-left-radius: 0;
        border-bottom-left-radius: 0;
        border-left-width: 0;
index 366aa38..e3c2bd5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:02Z
+ * Date: 2016-05-10T22:58:27Z
  */
 ( function ( OO ) {
 
index 764f40c..6dfe142 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:06Z
+ * Date: 2016-05-10T22:58:31Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
        background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
index deda1d0..9a544d6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:06Z
+ * Date: 2016-05-10T22:58:31Z
  */
 .oo-ui-window {
        background: transparent;
index 93a870c..37b7d90 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.1
+ * OOjs UI v0.17.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-03T22:58:02Z
+ * Date: 2016-05-10T22:58:27Z
  */
 ( function ( OO ) {
 
index 975ec2a..d04e3a6 100644 (file)
@@ -84,6 +84,7 @@ pre,
 }
 
 img,
+figure,
 .wikitable,
 .thumb {
        /* Pagination */
@@ -172,6 +173,7 @@ a {
 .mw-body a.external.text:after,
 .mw-body a.external.autonumber:after {
        content: " (" attr( href ) ")";
+       word-break: break-all;
        word-wrap: break-word;
 }
 
old mode 100644 (file)
new mode 100755 (executable)
index 8c2b53a..df03679
         * @cfg {boolean} [performSearchOnClick=true] If true, the script will start a search when-
         *  ever a user hits a suggestion. If false, the text of the suggestion is inserted into the
         *  text field only.
+        *  @cfg {string} [dataLocation='header'] Where the search input field will be
+        *  used (header or content).
         */
        mw.widgets.SearchInputWidget = function MwWidgetsSearchInputWidget( config ) {
                config = $.extend( {
                        type: 'search',
                        icon: 'search',
                        maxLength: undefined,
-                       performSearchOnClick: true
+                       performSearchOnClick: true,
+                       dataLocation: 'header'
                }, config );
 
                // Parent constructor
index 9cef1c4..3e010d0 100644 (file)
                 * @since 1.22
                 */
                postWithToken: function ( tokenType, params, ajaxOptions ) {
-                       var api = this;
+                       var api = this,
+                               abortable;
 
-                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
+                       return ( abortable = api.getToken( tokenType, params.assert ) ).then( function ( token ) {
                                params.token = token;
-                               return api.post( params, ajaxOptions ).then(
+                               return ( abortable = api.post( params, ajaxOptions ) ).then(
                                        // If no error, return to caller as-is
                                        null,
                                        // Error handler
                                                        api.badToken( tokenType );
                                                        // Try again, once
                                                        params.token = undefined;
-                                                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
+                                                       return ( abortable = api.getToken( tokenType, params.assert ) ).then( function ( token ) {
                                                                params.token = token;
-                                                               return api.post( params, ajaxOptions );
+                                                               return ( abortable = api.post( params, ajaxOptions ) ).promise();
                                                        } );
                                                }
 
                                                return this;
                                        }
                                );
-                       } );
+                       } ).promise( { abort: function () {
+                               abortable.abort();
+                       } } );
                },
 
                /**
index 6c38d50..4f917a5 100644 (file)
@@ -238,6 +238,7 @@ class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
                        'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', 'LBFactory' ],
                        'DBLoadBalancer' => [ 'DBLoadBalancer', 'LoadBalancer' ],
                        'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
+                       'GenderCache' => [ 'GenderCache', GenderCache::class ],
                ];
        }
 
diff --git a/tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php b/tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
new file mode 100644 (file)
index 0000000..f1f9295
--- /dev/null
@@ -0,0 +1,1592 @@
+<?php
+
+use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ *
+ * @covers ApiQueryWatchlist
+ */
+class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
+
+       public function __construct( $name = null, array $data = [], $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+               $this->tablesUsed = array_unique(
+                       array_merge( $this->tablesUsed, [ 'watchlist', 'recentchanges', 'page' ] )
+               );
+       }
+
+       protected function setUp() {
+               parent::setUp();
+               self::$users['ApiQueryWatchlistIntegrationTestUser']
+                       = new TestUser( 'ApiQueryWatchlistIntegrationTestUser' );
+               self::$users['ApiQueryWatchlistIntegrationTestUser2']
+                       = new TestUser( 'ApiQueryWatchlistIntegrationTestUser2' );
+               $this->doLogin( 'ApiQueryWatchlistIntegrationTestUser' );
+       }
+
+       private function getTestUser() {
+               return self::$users['ApiQueryWatchlistIntegrationTestUser']->getUser();
+       }
+
+       private function getNonLoggedInTestUser() {
+               return self::$users['ApiQueryWatchlistIntegrationTestUser2']->getUser();
+       }
+
+       private function getSysopTestUser() {
+               return self::$users['sysop']->getUser();
+       }
+
+       private function doPageEdit( User $user, LinkTarget $target, $content, $summary ) {
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $content, $title ),
+                       $summary,
+                       0,
+                       false,
+                       $user
+               );
+       }
+
+       private function doMinorPageEdit( User $user, LinkTarget $target, $content, $summary ) {
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $content, $title ),
+                       $summary,
+                       EDIT_MINOR,
+                       false,
+                       $user
+               );
+       }
+
+       private function doBotPageEdit( User $user, LinkTarget $target, $content, $summary ) {
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $content, $title ),
+                       $summary,
+                       EDIT_FORCE_BOT,
+                       false,
+                       $user
+               );
+       }
+
+       private function doAnonPageEdit( LinkTarget $target, $content, $summary ) {
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $content, $title ),
+                       $summary,
+                       0,
+                       false,
+                       User::newFromId( 0 )
+               );
+       }
+
+       private function doPatrolledPageEdit(
+               User $user,
+               LinkTarget $target,
+               $content,
+               $summary,
+               User $patrollingUser
+       ) {
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $status = $page->doEditContent(
+                       ContentHandler::makeContent( $content, $title ),
+                       $summary,
+                       0,
+                       false,
+                       $user
+               );
+               /** @var Revision $rev */
+               $rev = $status->value['revision'];
+               $rc = $rev->getRecentChange();
+               $rc->doMarkPatrolled( $patrollingUser, false, [] );
+       }
+
+       private function deletePage( LinkTarget $target, $reason ) {
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $page->doDeleteArticleReal( $reason );
+       }
+
+       /**
+        * Performs a batch of page edits as a specified user
+        * @param User $user
+        * @param array $editData associative array, keys:
+        *                        - target    => LinkTarget page to edit
+        *                        - content   => string new content
+        *                        - summary   => string edit summary
+        *                        - minorEdit => bool mark as minor edit if true (defaults to false)
+        *                        - botEdit   => bool mark as bot edit if true (defaults to false)
+        */
+       private function doPageEdits( User $user, array $editData ) {
+               foreach ( $editData as $singleEditData ) {
+                       if ( array_key_exists( 'minorEdit', $singleEditData ) && $singleEditData['minorEdit'] ) {
+                               $this->doMinorPageEdit(
+                                       $user,
+                                       $singleEditData['target'],
+                                       $singleEditData['content'],
+                                       $singleEditData['summary']
+                               );
+                               continue;
+                       }
+                       if ( array_key_exists( 'botEdit', $singleEditData ) && $singleEditData['botEdit'] ) {
+                               $this->doBotPageEdit(
+                                       $user,
+                                       $singleEditData['target'],
+                                       $singleEditData['content'],
+                                       $singleEditData['summary']
+                               );
+                               continue;
+                       }
+                       $this->doPageEdit(
+                               $user,
+                               $singleEditData['target'],
+                               $singleEditData['content'],
+                               $singleEditData['summary']
+                       );
+               }
+       }
+
+       private function getWatchedItemStore() {
+               return MediaWikiServices::getInstance()->getWatchedItemStore();
+       }
+
+       /**
+        * @param User $user
+        * @param LinkTarget[] $targets
+        */
+       private function watchPages( User $user, array $targets ) {
+               $store = $this->getWatchedItemStore();
+               $store->addWatchBatchForUser( $user, $targets );
+       }
+
+       private function doListWatchlistRequest( array $params = [], $user = null ) {
+               return $this->doApiRequest(
+                       array_merge(
+                               [ 'action' => 'query', 'list' => 'watchlist' ],
+                               $params
+                       ), null, false, $user
+               );
+       }
+
+       private function doGeneratorWatchlistRequest( array $params = [] ) {
+               return $this->doApiRequest(
+                       array_merge(
+                               [ 'action' => 'query', 'generator' => 'watchlist' ],
+                               $params
+                       )
+               );
+       }
+
+       private function getItemsFromApiResponse( array $response ) {
+               return $response[0]['query']['watchlist'];
+       }
+
+       /**
+        * Convenience method to assert that actual items array fetched from API is equal to the expected
+        * array, Unlike assertEquals this only checks if values of specified keys are equal in both
+        * arrays. This could be used e.g. not to compare IDs that could change between test run
+        * but only stable keys.
+        * Optionally this also checks that specified keys are present in the actual item without
+        * performing any checks on the related values.
+        *
+        * @param array $actualItems               array of actual items (associative arrays)
+        * @param array $expectedItems             array of expected items (associative arrays),
+        *                                         those items have less keys than actual items
+        * @param array $keysUsedInValueComparison list of keys of the actual item that will be used
+        *                                         in the comparison of values
+        * @param array $requiredKeys              optional, list of keys that must be present in the
+        *                                         actual items. Values of those keys are not checked.
+        */
+       private function assertArraySubsetsEqual(
+               array $actualItems,
+               array $expectedItems,
+               array $keysUsedInValueComparison,
+               array $requiredKeys = []
+       ) {
+               $this->assertCount( count( $expectedItems ), $actualItems );
+
+               // not checking values of all keys of the actual item, so removing unwanted keys from comparison
+               $actualItemsOnlyComparedValues = array_map(
+                       function( array $item ) use ( $keysUsedInValueComparison ) {
+                               return array_intersect_key( $item, array_flip( $keysUsedInValueComparison ) );
+                       },
+                       $actualItems
+               );
+
+               $this->assertEquals(
+                       $expectedItems,
+                       $actualItemsOnlyComparedValues
+               );
+
+               // Check that each item in $actualItems contains all of keys specified in $requiredKeys
+               $actualItemsKeysOnly = array_map( 'array_keys', $actualItems );
+               foreach ( $actualItemsKeysOnly as $keysOfTheItem ) {
+                       $this->assertEmpty( array_diff( $requiredKeys, $keysOfTheItem ) );
+               }
+       }
+
+       private function getTitleFormatter() {
+               return new MediaWikiTitleCodec( Language::factory( 'en' ), GenderCache::singleton() );
+       }
+
+       private function getPrefixedText( LinkTarget $target ) {
+               $formatter = $this->getTitleFormatter();
+               return $formatter->getPrefixedText( $target );
+       }
+
+       private function cleanTestUsersWatchlist() {
+               $user = $this->getTestUser();
+               $store = $this->getWatchedItemStore();
+               $items = $store->getWatchedItemsForUser( $user );
+               foreach ( $items as $item ) {
+                       $store->removeWatch( $user, $item->getLinkTarget() );
+               }
+       }
+
+       public function testListWatchlist_returnsWatchedItemsWithRCInfo() {
+               // Clean up after previous tests that might have added something to the watchlist of
+               // the user with the same user ID as user used here as the test user
+               $this->cleanTestUsersWatchlist();
+
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $result = $this->doListWatchlistRequest();
+
+               $this->assertArrayHasKey( 'query', $result[0] );
+               $this->assertArrayHasKey( 'watchlist', $result[0]['query'] );
+
+               $this->assertArraySubsetsEqual(
+                       $this->getItemsFromApiResponse( $result ),
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                                       'bot' => false,
+                                       'new' => true,
+                                       'minor' => false,
+                               ]
+                       ],
+                       [ 'type', 'ns', 'title', 'bot', 'new', 'minor' ],
+                       [ 'pageid', 'revid', 'old_revid' ]
+               );
+       }
+
+       public function testIdsPropParameter() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'ids', ] );
+               $items = $this->getItemsFromApiResponse( $result );
+
+               $this->assertCount( 1, $items );
+               $this->assertArrayHasKey( 'pageid', $items[0] );
+               $this->assertArrayHasKey( 'revid', $items[0] );
+               $this->assertArrayHasKey( 'old_revid', $items[0] );
+               $this->assertEquals( 'new', $items[0]['type'] );
+       }
+
+       public function testTitlePropParameter() {
+               $user = $this->getTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $subjectTarget,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $talkTarget,
+                                       'content' => 'Some Talk Page Content',
+                                       'summary' => 'Create Talk page',
+                               ],
+                       ]
+               );
+               $this->watchPages( $user, [ $subjectTarget, $talkTarget ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'title', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $talkTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $talkTarget ),
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testFlagsPropParameter() {
+               $user = $this->getTestUser();
+               $normalEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $minorEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageM' );
+               $botEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageB' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $normalEditTarget,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $minorEditTarget,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $minorEditTarget,
+                                       'content' => 'Slightly Better Content',
+                                       'summary' => 'Change content',
+                                       'minorEdit' => true,
+                               ],
+                               [
+                                       'target' => $botEditTarget,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page with a bot',
+                                       'botEdit' => true,
+                               ],
+                       ]
+               );
+               $this->watchPages( $user, [ $normalEditTarget, $minorEditTarget, $botEditTarget ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'flags', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'new' => true,
+                                       'minor' => false,
+                                       'bot' => true,
+                               ],
+                               [
+                                       'type' => 'edit',
+                                       'new' => false,
+                                       'minor' => true,
+                                       'bot' => false,
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'new' => true,
+                                       'minor' => false,
+                                       'bot' => false,
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testUserPropParameter() {
+               $user = $this->getTestUser();
+               $userEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $anonEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageA' );
+               $this->doPageEdit(
+                       $user,
+                       $userEditTarget,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->doAnonPageEdit(
+                       $anonEditTarget,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $userEditTarget, $anonEditTarget ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'user', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'anon' => true,
+                                       'user' => User::newFromId( 0 )->getName(),
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'user' => $user->getName(),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testUserIdPropParameter() {
+               $user = $this->getTestUser();
+               $userEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $anonEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageA' );
+               $this->doPageEdit(
+                       $user,
+                       $userEditTarget,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->doAnonPageEdit(
+                       $anonEditTarget,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $userEditTarget, $anonEditTarget ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'userid', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'anon' => true,
+                                       'user' => 0,
+                                       'userid' => 0,
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'user' => $user->getId(),
+                                       'userid' => $user->getId(),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testCommentPropParameter() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the <b>page</b>'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'comment', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'comment' => 'Create the <b>page</b>',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testParsedCommentPropParameter() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the <b>page</b>'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'parsedcomment', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'parsedcomment' => 'Create the &lt;b&gt;page&lt;/b&gt;',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testTimestampPropParameter() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'timestamp', ] );
+               $items = $this->getItemsFromApiResponse( $result );
+
+               $this->assertCount( 1, $items );
+               $this->assertArrayHasKey( 'timestamp', $items[0] );
+               $this->assertInternalType( 'string', $items[0]['timestamp'] );
+       }
+
+       public function testSizesPropParameter() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'sizes', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'oldlen' => 0,
+                                       'newlen' => 12,
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testNotificationTimestampPropParameter() {
+               $otherUser = $this->getNonLoggedInTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $otherUser,
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+               $store = $this->getWatchedItemStore();
+               $store->addWatch( $this->getTestUser(), $target );
+               $store->updateNotificationTimestamp(
+                       $otherUser,
+                       $target,
+                       '20151212010101'
+               );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'notificationtimestamp', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'notificationtimestamp' => '2015-12-12T01:01:01Z',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       private function setupPatrolledSpecificFixtures( User $user ) {
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+
+               $this->doPatrolledPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the page (this gets patrolled)',
+                       $user
+               );
+
+               $this->watchPages( $user, [ $target ] );
+       }
+
+       public function testPatrolPropParameter() {
+               $user = $this->getSysopTestUser();
+               $this->setupPatrolledSpecificFixtures( $user );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'patrol', ], $user );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'patrolled' => true,
+                                       'unpatrolled' => false,
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       private function createPageAndDeleteIt( LinkTarget $target ) {
+               $this->doPageEdit(
+                       $this->getTestUser(),
+                       $target,
+                       'Some Content',
+                       'Create the page that will be deleted'
+               );
+               $this->deletePage( $target, 'Important Reason' );
+       }
+
+       public function testLoginfoPropParameter() {
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->createPageAndDeleteIt( $target );
+
+               $this->watchPages( $this->getTestUser(), [ $target ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'loginfo', ] );
+
+               $this->assertArraySubsetsEqual(
+                       $this->getItemsFromApiResponse( $result ),
+                       [
+                               [
+                                       'type' => 'log',
+                                       'logtype' => 'delete',
+                                       'logaction' => 'delete',
+                                       'logparams' => [],
+                               ],
+                       ],
+                       [ 'type', 'logtype', 'logaction', 'logparams' ],
+                       [ 'logid' ]
+               );
+       }
+
+       public function testEmptyPropParameter() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => '', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testNamespaceParam() {
+               $user = $this->getTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $subjectTarget,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $talkTarget,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the talk page',
+                               ],
+                       ]
+               );
+               $this->watchPages( $user, [ $subjectTarget, $talkTarget ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlnamespace' => '0', ] );
+
+               $this->assertArraySubsetsEqual(
+                       $this->getItemsFromApiResponse( $result ),
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                               ],
+                       ],
+                       [ 'ns', 'title' ]
+               );
+       }
+
+       public function testUserParam() {
+               $user = $this->getTestUser();
+               $otherUser = $this->getNonLoggedInTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $subjectTarget,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->doPageEdit(
+                       $otherUser,
+                       $talkTarget,
+                       'What is this page about?',
+                       'Create the talk page'
+               );
+               $this->watchPages( $user, [ $subjectTarget, $talkTarget ] );
+
+               $result = $this->doListWatchlistRequest( [
+                       'wlprop' => 'user|title',
+                       'wluser' => $otherUser->getName(),
+               ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $talkTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $talkTarget ),
+                                       'user' => $otherUser->getName(),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testExcludeUserParam() {
+               $user = $this->getTestUser();
+               $otherUser = $this->getNonLoggedInTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $subjectTarget,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->doPageEdit(
+                       $otherUser,
+                       $talkTarget,
+                       'What is this page about?',
+                       'Create the talk page'
+               );
+               $this->watchPages( $user, [ $subjectTarget, $talkTarget ] );
+
+               $result = $this->doListWatchlistRequest( [
+                       'wlprop' => 'user|title',
+                       'wlexcludeuser' => $otherUser->getName(),
+               ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                                       'user' => $user->getName(),
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testShowMinorParams() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $target,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $target,
+                                       'content' => 'Slightly Better Content',
+                                       'summary' => 'Change content',
+                                       'minorEdit' => true,
+                               ],
+                       ]
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $resultMinor = $this->doListWatchlistRequest( [ 'wlshow' => 'minor', 'wlprop' => 'flags' ] );
+               $resultNotMinor = $this->doListWatchlistRequest( [ 'wlshow' => '!minor', 'wlprop' => 'flags' ] );
+
+               $this->assertArraySubsetsEqual(
+                       $this->getItemsFromApiResponse( $resultMinor ),
+                       [
+                               [ 'minor' => true, ]
+                       ],
+                       [ 'minor' ]
+               );
+               $this->assertEmpty( $this->getItemsFromApiResponse( $resultNotMinor ) );
+       }
+
+       public function testShowBotParams() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doBotPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $resultBot = $this->doListWatchlistRequest( [ 'wlshow' => 'bot' ] );
+               $resultNotBot = $this->doListWatchlistRequest( [ 'wlshow' => '!bot' ] );
+
+               $this->assertArraySubsetsEqual(
+                       $this->getItemsFromApiResponse( $resultBot ),
+                       [
+                               [ 'bot' => true ],
+                       ],
+                       [ 'bot' ]
+               );
+               $this->assertEmpty( $this->getItemsFromApiResponse( $resultNotBot ) );
+       }
+
+       public function testShowAnonParams() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doAnonPageEdit(
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $resultAnon = $this->doListWatchlistRequest( [
+                       'wlprop' => 'user',
+                       'wlshow' => 'anon'
+               ] );
+               $resultNotAnon = $this->doListWatchlistRequest( [
+                       'wlprop' => 'user',
+                       'wlshow' => '!anon'
+               ] );
+
+               $this->assertArraySubsetsEqual(
+                       $this->getItemsFromApiResponse( $resultAnon ),
+                       [
+                               [ 'anon' => true ],
+                       ],
+                       [ 'anon' ]
+               );
+               $this->assertEmpty( $this->getItemsFromApiResponse( $resultNotAnon ) );
+       }
+
+       public function testShowUnreadParams() {
+               $user = $this->getTestUser();
+               $otherUser = $this->getNonLoggedInTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $subjectTarget,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->doPageEdit(
+                       $otherUser,
+                       $talkTarget,
+                       'Some Content',
+                       'Create the talk page'
+               );
+               $store = $this->getWatchedItemStore();
+               $store->addWatchBatchForUser( $user, [ $subjectTarget, $talkTarget ] );
+               $store->updateNotificationTimestamp(
+                       $otherUser,
+                       $talkTarget,
+                       '20151212010101'
+               );
+
+               $resultUnread = $this->doListWatchlistRequest( [
+                       'wlprop' => 'notificationtimestamp|title',
+                       'wlshow' => 'unread'
+               ] );
+               $resultNotUnread = $this->doListWatchlistRequest( [
+                       'wlprop' => 'notificationtimestamp|title',
+                       'wlshow' => '!unread'
+               ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'notificationtimestamp' => '2015-12-12T01:01:01Z',
+                                       'ns' => $talkTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $talkTarget )
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $resultUnread )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'notificationtimestamp' => '',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget )
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $resultNotUnread )
+               );
+       }
+
+       public function testShowPatrolledParams() {
+               $user = $this->getSysopTestUser();
+               $this->setupPatrolledSpecificFixtures( $user );
+
+               $resultPatrolled = $this->doListWatchlistRequest( [
+                       'wlprop' => 'patrol',
+                       'wlshow' => 'patrolled'
+               ], $user );
+               $resultNotPatrolled = $this->doListWatchlistRequest( [
+                       'wlprop' => 'patrol',
+                       'wlshow' => '!patrolled'
+               ], $user );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'patrolled' => true,
+                                       'unpatrolled' => false,
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $resultPatrolled )
+               );
+               $this->assertEmpty( $this->getItemsFromApiResponse( $resultNotPatrolled ) );
+       }
+
+       public function testNewAndEditTypeParameters() {
+               $user = $this->getTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $subjectTarget,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $subjectTarget,
+                                       'content' => 'Some Other Content',
+                                       'summary' => 'Change the content',
+                               ],
+                               [
+                                       'target' => $talkTarget,
+                                       'content' => 'Some Talk Page Content',
+                                       'summary' => 'Create Talk page',
+                               ],
+                       ]
+               );
+               $this->watchPages( $user, [ $subjectTarget, $talkTarget ] );
+
+               $resultNew = $this->doListWatchlistRequest( [ 'wlprop' => 'title', 'wltype' => 'new' ] );
+               $resultEdit = $this->doListWatchlistRequest( [ 'wlprop' => 'title', 'wltype' => 'edit' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $talkTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $talkTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultNew )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'edit',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultEdit )
+               );
+       }
+
+       public function testLogTypeParameters() {
+               $user = $this->getTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->createPageAndDeleteIt( $subjectTarget );
+               $this->doPageEdit(
+                       $user,
+                       $talkTarget,
+                       'Some Talk Page Content',
+                       'Create Talk page'
+               );
+               $this->watchPages( $user, [ $subjectTarget, $talkTarget ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'title', 'wltype' => 'log' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'log',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       private function getExternalRC( LinkTarget $target ) {
+               $title = Title::newFromLinkTarget( $target );
+
+               $rc = new RecentChange;
+               $rc->mTitle = $title;
+               $rc->mAttribs = [
+                       'rc_timestamp' => wfTimestamp( TS_MW ),
+                       'rc_namespace' => $title->getNamespace(),
+                       'rc_title' => $title->getDBkey(),
+                       'rc_type' => RC_EXTERNAL,
+                       'rc_source' => 'foo',
+                       'rc_minor' => 0,
+                       'rc_cur_id' => $title->getArticleID(),
+                       'rc_user' => 0,
+                       'rc_user_text' => 'External User',
+                       'rc_comment' => '',
+                       'rc_this_oldid' => $title->getLatestRevID(),
+                       'rc_last_oldid' => $title->getLatestRevID(),
+                       'rc_bot' => 0,
+                       'rc_ip' => '',
+                       'rc_patrolled' => 0,
+                       'rc_new' => 0,
+                       'rc_old_len' => $title->getLength(),
+                       'rc_new_len' => $title->getLength(),
+                       'rc_deleted' => 0,
+                       'rc_logid' => 0,
+                       'rc_log_type' => null,
+                       'rc_log_action' => '',
+                       'rc_params' => '',
+               ];
+               $rc->mExtra = [
+                       'prefixedDBkey' => $title->getPrefixedDBkey(),
+                       'lastTimestamp' => 0,
+                       'oldSize' => $title->getLength(),
+                       'newSize' => $title->getLength(),
+                       'pageStatus' => 'changed'
+               ];
+
+               return $rc;
+       }
+
+       public function testExternalTypeParameters() {
+               $user = $this->getTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $subjectTarget,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->doPageEdit(
+                       $user,
+                       $talkTarget,
+                       'Some Talk Page Content',
+                       'Create Talk page'
+               );
+
+               $rc = $this->getExternalRC( $subjectTarget );
+               $rc->save();
+
+               $this->watchPages( $user, [ $subjectTarget, $talkTarget ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'title', 'wltype' => 'external' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'external',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testCategorizeTypeParameter() {
+               $user = $this->getTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $categoryTarget = new TitleValue( NS_CATEGORY, 'ApiQueryWatchlistIntegrationTestCategory' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $categoryTarget,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the category',
+                               ],
+                               [
+                                       'target' => $subjectTarget,
+                                       'content' => 'Some Content [[Category:ApiQueryWatchlistIntegrationTestCategory]]t',
+                                       'summary' => 'Create the page and add it to the category',
+                               ],
+                       ]
+               );
+               $title = Title::newFromLinkTarget( $subjectTarget );
+               $revision = Revision::newFromTitle( $title );
+
+               $rc = RecentChange::newForCategorization(
+                       $revision->getTimestamp(),
+                       Title::newFromLinkTarget( $categoryTarget ),
+                       $user,
+                       $revision->getComment(),
+                       $title,
+                       0,
+                       $revision->getId(),
+                       null,
+                       false
+               );
+               $rc->save();
+
+               $this->watchPages( $user, [ $subjectTarget, $categoryTarget ] );
+
+               $result = $this->doListWatchlistRequest( [ 'wlprop' => 'title', 'wltype' => 'categorize' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'categorize',
+                                       'ns' => $categoryTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $categoryTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testLimitParam() {
+               $user = $this->getTestUser();
+               $target1 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $target2 = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $target3 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage2' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $target1,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $target2,
+                                       'content' => 'Some Talk Page Content',
+                                       'summary' => 'Create Talk page',
+                               ],
+                               [
+                                       'target' => $target3,
+                                       'content' => 'Some Other Content',
+                                       'summary' => 'Create the page',
+                               ],
+                       ]
+               );
+               $this->watchPages( $user, [ $target1, $target2, $target3 ] );
+
+               $resultWithoutLimit = $this->doListWatchlistRequest( [ 'wlprop' => 'title' ] );
+               $resultWithLimit = $this->doListWatchlistRequest( [ 'wllimit' => 2, 'wlprop' => 'title' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target3->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target3 )
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target2->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target2 )
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target1->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target1 )
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultWithoutLimit )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target3->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target3 )
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target2->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target2 )
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultWithLimit )
+               );
+               $this->assertArrayHasKey( 'continue', $resultWithLimit[0] );
+               $this->assertArrayHasKey( 'wlcontinue', $resultWithLimit[0]['continue'] );
+       }
+
+       public function testAllRevParam() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $target,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $target,
+                                       'content' => 'Some Other Content',
+                                       'summary' => 'Change the content',
+                               ],
+                       ]
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $resultAllRev = $this->doListWatchlistRequest( [ 'wlprop' => 'title', 'wlallrev' => '', ] );
+               $resultNoAllRev = $this->doListWatchlistRequest( [ 'wlprop' => 'title' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'edit',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultNoAllRev )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'edit',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultAllRev )
+               );
+       }
+
+       public function testDirParams() {
+               $user = $this->getTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $subjectTarget,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $talkTarget,
+                                       'content' => 'Some Talk Page Content',
+                                       'summary' => 'Create Talk page',
+                               ],
+                       ]
+               );
+               $this->watchPages( $user, [ $subjectTarget, $talkTarget ] );
+
+               $resultDirOlder = $this->doListWatchlistRequest( [ 'wldir' => 'older', 'wlprop' => 'title' ] );
+               $resultDirNewer = $this->doListWatchlistRequest( [ 'wldir' => 'newer', 'wlprop' => 'title' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $talkTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $talkTarget )
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget )
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultDirOlder )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget )
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $talkTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $talkTarget )
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultDirNewer )
+               );
+       }
+
+       public function testStartEndParams() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $resultStart = $this->doListWatchlistRequest( [
+                       'wlstart' => '20010115000000',
+                       'wldir' => 'newer',
+                       'wlprop' => 'title',
+               ] );
+               $resultEnd = $this->doListWatchlistRequest( [
+                       'wlend' => '20010115000000',
+                       'wldir' => 'newer',
+                       'wlprop' => 'title',
+               ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $resultStart )
+               );
+               $this->assertEmpty( $this->getItemsFromApiResponse( $resultEnd ) );
+       }
+
+       public function testContinueParam() {
+               $user = $this->getTestUser();
+               $target1 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $target2 = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
+               $target3 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage2' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $target1,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $target2,
+                                       'content' => 'Some Talk Page Content',
+                                       'summary' => 'Create Talk page',
+                               ],
+                               [
+                                       'target' => $target3,
+                                       'content' => 'Some Other Content',
+                                       'summary' => 'Create the page',
+                               ],
+                       ]
+               );
+               $this->watchPages( $user, [ $target1, $target2, $target3 ] );
+
+               $firstResult = $this->doListWatchlistRequest( [ 'wllimit' => 2, 'wlprop' => 'title' ] );
+               $this->assertArrayHasKey( 'continue', $firstResult[0] );
+               $this->assertArrayHasKey( 'wlcontinue', $firstResult[0]['continue'] );
+
+               $continuationParam = $firstResult[0]['continue']['wlcontinue'];
+
+               $continuedResult = $this->doListWatchlistRequest(
+                       [ 'wlcontinue' => $continuationParam, 'wlprop' => 'title' ]
+               );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target3->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target3 ),
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target2->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target2 ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $firstResult )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target1->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target1 )
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $continuedResult )
+               );
+       }
+
+       public function testOwnerAndTokenParams() {
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $this->getTestUser(),
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+
+               $otherUser = $this->getNonLoggedInTestUser();
+               $otherUser->setOption( 'watchlisttoken', '1234567890' );
+               $otherUser->saveSettings();
+
+               $this->watchPages( $otherUser, [ $target ] );
+
+               $result = $this->doListWatchlistRequest( [
+                       'wlowner' => $otherUser->getName(),
+                       'wltoken' => '1234567890',
+                       'wlprop' => 'title',
+               ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target )
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testOwnerAndTokenParams_wrongToken() {
+               $otherUser = $this->getNonLoggedInTestUser();
+               $otherUser->setOption( 'watchlisttoken', '1234567890' );
+               $otherUser->saveSettings();
+
+               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+
+               $this->doListWatchlistRequest( [
+                       'wlowner' => $otherUser->getName(),
+                       'wltoken' => 'wrong-token',
+               ] );
+       }
+
+       public function testOwnerAndTokenParams_noWatchlistTokenSet() {
+               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+
+               $this->doListWatchlistRequest( [
+                       'wlowner' => $this->getNonLoggedInTestUser()->getName(),
+                       'wltoken' => 'some-token',
+               ] );
+       }
+
+       public function testGeneratorWatchlistPropInfo_returnsWatchedPages() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdit(
+                       $user,
+                       $target,
+                       'Some Content',
+                       'Create the page'
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $result = $this->doGeneratorWatchlistRequest( [ 'prop' => 'info' ] );
+
+               $this->assertArrayHasKey( 'query', $result[0] );
+               $this->assertArrayHasKey( 'pages', $result[0]['query'] );
+
+               // $result[0]['query']['pages'] uses page ids as keys. Page ids don't matter here, so drop them
+               $pages = array_values( $result[0]['query']['pages'] );
+
+               $this->assertArraySubsetsEqual(
+                       $pages,
+                       [
+                               [
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                                       'new' => true,
+                               ]
+                       ],
+                       [ 'ns', 'title', 'new' ]
+               );
+       }
+
+       public function testGeneratorWatchlistPropRevisions_returnsWatchedItemsRevisions() {
+               $user = $this->getTestUser();
+               $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $target,
+                                       'content' => 'Some Content',
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $target,
+                                       'content' => 'Some Other Content',
+                                       'summary' => 'Change the content',
+                               ],
+                       ]
+               );
+               $this->watchPages( $user, [ $target ] );
+
+               $result = $this->doGeneratorWatchlistRequest( [ 'prop' => 'revisions', 'gwlallrev' => '' ] );
+
+               $this->assertArrayHasKey( 'query', $result[0] );
+               $this->assertArrayHasKey( 'pages', $result[0]['query'] );
+
+               // $result[0]['query']['pages'] uses page ids as keys. Page ids don't matter here, so drop them
+               $pages = array_values( $result[0]['query']['pages'] );
+
+               $this->assertCount( 1, $pages );
+               $this->assertEquals( 0, $pages[0]['ns'] );
+               $this->assertEquals( $this->getPrefixedText( $target ), $pages[0]['title'] );
+               $this->assertArraySubsetsEqual(
+                       $pages[0]['revisions'],
+                       [
+                               [
+                                       'comment' => 'Create the page',
+                                       'user' => $user->getName(),
+                                       'minor' => false,
+                               ],
+                               [
+                                       'comment' => 'Change the content',
+                                       'user' => $user->getName(),
+                                       'minor' => false,
+                               ],
+                       ],
+                       [ 'comment', 'user', 'minor' ]
+               );
+       }
+
+}
index 2efc802..45f1382 100644 (file)
@@ -161,7 +161,7 @@ class RecentChangeTest extends MediaWikiTestCase {
                $pageProps->expects( $this->once() )
                        ->method( 'getProperties' )
                        ->with( $categoryTitle, 'hiddencat' )
-                       ->will( $this->returnValue( $isHidden ? [ $categoryTitle->getArticleID() => '' ] : [ ] ) );
+                       ->will( $this->returnValue( $isHidden ? [ $categoryTitle->getArticleID() => '' ] : [] ) );
 
                $scopedOverride = PageProps::overrideInstance( $pageProps );
 
index d6e1d9e..9f4e1fa 100644 (file)
@@ -22,7 +22,7 @@ class WikiCategoryPageTest extends MediaWikiLangTestCase {
                $pageProps->expects( $this->once() )
                        ->method( 'getProperties' )
                        ->with( $title, 'hiddencat' )
-                       ->will( $this->returnValue( [ ] ) );
+                       ->will( $this->returnValue( [] ) );
 
                $scopedOverride = PageProps::overrideInstance( $pageProps );
 
@@ -50,7 +50,7 @@ class WikiCategoryPageTest extends MediaWikiLangTestCase {
                $pageProps->expects( $this->once() )
                        ->method( 'getProperties' )
                        ->with( $categoryTitle, 'hiddencat' )
-                       ->will( $this->returnValue( $isHidden ? [ $categoryTitle->getArticleID() => '' ] : [ ] ) );
+                       ->will( $this->returnValue( $isHidden ? [ $categoryTitle->getArticleID() => '' ] : [] ) );
 
                $scopedOverride = PageProps::overrideInstance( $pageProps );
 
index 15b47b4..d57ad04 100644 (file)
@@ -56,17 +56,26 @@ class PoolCounterTest extends MediaWikiTestCase {
 
                $keysWithTwoSlots = $keysWithFiveSlots = [];
                foreach ( range( 1, 100 ) as $i ) {
-                       $keysWithTwoSlots[] = $hashKeyIntoSlots->invoke( $poolCounter, 'key ' . $i, 2 );
-                       $keysWithFiveSlots[] = $hashKeyIntoSlots->invoke( $poolCounter, 'key ' . $i, 5 );
+                       $keysWithTwoSlots[] = $hashKeyIntoSlots->invoke( $poolCounter, 'test', 'key ' . $i, 2 );
+                       $keysWithFiveSlots[] = $hashKeyIntoSlots->invoke( $poolCounter, 'test', 'key ' . $i, 5 );
                }
 
-               $this->assertArrayEquals( range( 0, 1 ), array_unique( $keysWithTwoSlots ) );
-               $this->assertArrayEquals( range( 0, 4 ), array_unique( $keysWithFiveSlots ) );
+               $twoSlotKeys = [];
+               for ( $i = 0; $i <= 1; $i++ ) {
+                       $twoSlotKeys[] = "test:$i";
+               }
+               $fiveSlotKeys = [];
+               for ( $i = 0; $i <= 4; $i++ ) {
+                       $fiveSlotKeys[] = "test:$i";
+               }
+
+               $this->assertArrayEquals( $twoSlotKeys, array_unique( $keysWithTwoSlots ) );
+               $this->assertArrayEquals( $fiveSlotKeys, array_unique( $keysWithFiveSlots ) );
 
                // make sure it is deterministic
                $this->assertEquals(
-                       $hashKeyIntoSlots->invoke( $poolCounter, 'asdfgh', 1000 ),
-                       $hashKeyIntoSlots->invoke( $poolCounter, 'asdfgh', 1000 )
+                       $hashKeyIntoSlots->invoke( $poolCounter, 'test', 'asdfgh', 1000 ),
+                       $hashKeyIntoSlots->invoke( $poolCounter, 'test', 'asdfgh', 1000 )
                );
        }
 }
index ff22bfa..8f7b2a6 100644 (file)
@@ -103,6 +103,7 @@ class SessionInfoTest extends MediaWikiTestCase {
                $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
                $this->assertSame( $anonInfo, $info->getUserInfo() );
                $this->assertTrue( $info->isIdSafe() );
+               $this->assertFalse( $info->forceUse() );
                $this->assertFalse( $info->wasPersisted() );
                $this->assertFalse( $info->wasRemembered() );
                $this->assertFalse( $info->forceHTTPS() );
@@ -118,6 +119,7 @@ class SessionInfoTest extends MediaWikiTestCase {
                $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
                $this->assertSame( $unverifiedUserInfo, $info->getUserInfo() );
                $this->assertTrue( $info->isIdSafe() );
+               $this->assertFalse( $info->forceUse() );
                $this->assertFalse( $info->wasPersisted() );
                $this->assertFalse( $info->wasRemembered() );
                $this->assertFalse( $info->forceHTTPS() );
@@ -132,6 +134,7 @@ class SessionInfoTest extends MediaWikiTestCase {
                $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
                $this->assertSame( $userInfo, $info->getUserInfo() );
                $this->assertTrue( $info->isIdSafe() );
+               $this->assertFalse( $info->forceUse() );
                $this->assertFalse( $info->wasPersisted() );
                $this->assertTrue( $info->wasRemembered() );
                $this->assertFalse( $info->forceHTTPS() );
@@ -150,6 +153,7 @@ class SessionInfoTest extends MediaWikiTestCase {
                $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
                $this->assertSame( $anonInfo, $info->getUserInfo() );
                $this->assertFalse( $info->isIdSafe() );
+               $this->assertFalse( $info->forceUse() );
                $this->assertTrue( $info->wasPersisted() );
                $this->assertFalse( $info->wasRemembered() );
                $this->assertFalse( $info->forceHTTPS() );
@@ -165,6 +169,7 @@ class SessionInfoTest extends MediaWikiTestCase {
                $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
                $this->assertSame( $userInfo, $info->getUserInfo() );
                $this->assertFalse( $info->isIdSafe() );
+               $this->assertFalse( $info->forceUse() );
                $this->assertFalse( $info->wasPersisted() );
                $this->assertTrue( $info->wasRemembered() );
                $this->assertFalse( $info->forceHTTPS() );
@@ -180,6 +185,7 @@ class SessionInfoTest extends MediaWikiTestCase {
                $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
                $this->assertSame( $userInfo, $info->getUserInfo() );
                $this->assertFalse( $info->isIdSafe() );
+               $this->assertFalse( $info->forceUse() );
                $this->assertTrue( $info->wasPersisted() );
                $this->assertFalse( $info->wasRemembered() );
                $this->assertFalse( $info->forceHTTPS() );
@@ -231,6 +237,25 @@ class SessionInfoTest extends MediaWikiTestCase {
                $this->assertSame( SessionInfo::MIN_PRIORITY + 5, $info->getPriority() );
                $this->assertTrue( $info->isIdSafe() );
 
+               $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
+                       'id' => $id,
+                       'forceUse' => true,
+               ] );
+               $this->assertFalse( $info->forceUse(), 'no provider' );
+
+               $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
+                       'provider' => $provider,
+                       'forceUse' => true,
+               ] );
+               $this->assertFalse( $info->forceUse(), 'no id' );
+
+               $info = new SessionInfo( SessionInfo::MIN_PRIORITY + 5, [
+                       'provider' => $provider,
+                       'id' => $id,
+                       'forceUse' => true,
+               ] );
+               $this->assertTrue( $info->forceUse(), 'correct use' );
+
                $info = new SessionInfo( SessionInfo::MIN_PRIORITY, [
                        'id' => $id,
                        'forceHTTPS' => 1,
@@ -242,6 +267,7 @@ class SessionInfoTest extends MediaWikiTestCase {
                        'provider' => $provider,
                        'userInfo' => $userInfo,
                        'idIsSafe' => true,
+                       'forceUse' => true,
                        'persisted' => true,
                        'remembered' => true,
                        'forceHTTPS' => true,
@@ -255,6 +281,7 @@ class SessionInfoTest extends MediaWikiTestCase {
                $this->assertSame( $provider, $info->getProvider() );
                $this->assertSame( $userInfo, $info->getUserInfo() );
                $this->assertTrue( $info->isIdSafe() );
+               $this->assertTrue( $info->forceUse() );
                $this->assertTrue( $info->wasPersisted() );
                $this->assertTrue( $info->wasRemembered() );
                $this->assertTrue( $info->forceHTTPS() );
@@ -265,6 +292,7 @@ class SessionInfoTest extends MediaWikiTestCase {
                        'provider' => $provider2,
                        'userInfo' => $unverifiedUserInfo,
                        'idIsSafe' => false,
+                       'forceUse' => false,
                        'persisted' => false,
                        'remembered' => false,
                        'forceHTTPS' => false,
@@ -276,6 +304,7 @@ class SessionInfoTest extends MediaWikiTestCase {
                $this->assertSame( $provider2, $info->getProvider() );
                $this->assertSame( $unverifiedUserInfo, $info->getUserInfo() );
                $this->assertFalse( $info->isIdSafe() );
+               $this->assertFalse( $info->forceUse() );
                $this->assertFalse( $info->wasPersisted() );
                $this->assertFalse( $info->wasRemembered() );
                $this->assertFalse( $info->forceHTTPS() );
index d04d7ec..5f387ea 100644 (file)
@@ -642,6 +642,35 @@ class SessionManagerTest extends MediaWikiTestCase {
                }
        }
 
+       public function testInvalidateSessionsForUser() {
+               $user = User::newFromName( 'UTSysop' );
+               $manager = $this->getManager();
+
+               $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'invalidateSessionsForUser', '__toString' ] );
+
+               $provider1 = $providerBuilder->getMock();
+               $provider1->expects( $this->once() )->method( 'invalidateSessionsForUser' )
+                       ->with( $this->identicalTo( $user ) );
+               $provider1->expects( $this->any() )->method( '__toString' )
+                       ->will( $this->returnValue( 'MockProvider1' ) );
+
+               $provider2 = $providerBuilder->getMock();
+               $provider2->expects( $this->once() )->method( 'invalidateSessionsForUser' )
+                       ->with( $this->identicalTo( $user ) );
+               $provider2->expects( $this->any() )->method( '__toString' )
+                       ->will( $this->returnValue( 'MockProvider2' ) );
+
+               $this->config->set( 'SessionProviders', [
+                       $this->objectCacheDef( $provider1 ),
+                       $this->objectCacheDef( $provider2 ),
+               ] );
+
+               $oldToken = $user->getToken( true );
+               $manager->invalidateSessionsForUser( $user );
+               $this->assertNotEquals( $oldToken, $user->getToken() );
+       }
+
        public function testGetVaryHeaders() {
                $manager = $this->getManager();
 
@@ -1756,5 +1785,21 @@ class SessionManagerTest extends MediaWikiTestCase {
                        [ LogLevel::WARNING, 'Session "{session}": Hook aborted' ],
                ], $logger->getBuffer() );
                $logger->clearBuffer();
+               $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionCheckInfo' => [] ] );
+
+               // forceUse deletes bad backend data
+               $this->store->setSessionMeta( $id, [ 'userToken' => 'Bad' ] + $metadata );
+               $info = new SessionInfo( SessionInfo::MIN_PRIORITY, [
+                       'provider' => $provider,
+                       'id' => $id,
+                       'userInfo' => $userInfo,
+                       'forceUse' => true,
+               ] );
+               $this->assertTrue( $loadSessionInfoFromStore( $info ) );
+               $this->assertFalse( $this->store->getSession( $id ) );
+               $this->assertSame( [
+                       [ LogLevel::WARNING, 'Session "{session}": User token mismatch' ],
+               ], $logger->getBuffer() );
+               $logger->clearBuffer();
        }
 }
index 18b1efd..f80baf2 100644 (file)
@@ -27,6 +27,8 @@ class SessionProviderTest extends MediaWikiTestCase {
                $this->assertSame( $manager, $priv->manager );
                $this->assertSame( $manager, $provider->getManager() );
 
+               $provider->invalidateSessionsForUser( new \User );
+
                $this->assertSame( [], $provider->getVaryHeaders() );
                $this->assertSame( [], $provider->getVaryCookies() );
                $this->assertSame( null, $provider->suggestLoginUsername( new \FauxRequest ) );