Merge "Do not redirect to HTTPS when it's not supported"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 31 May 2016 17:39:48 +0000 (17:39 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 31 May 2016 17:39:48 +0000 (17:39 +0000)
157 files changed:
RELEASE-NOTES-1.28
composer.json
includes/DefaultSettings.php
includes/EditPage.php
includes/Linker.php
includes/MediaWiki.php
includes/WatchedItemStore.php
includes/WebRequest.php
includes/actions/RollbackAction.php
includes/api/ApiAMCreateAccount.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiClientLogin.php
includes/api/ApiMain.php
includes/api/ApiQuery.php
includes/api/ApiQueryAuthManagerInfo.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQueryUsers.php
includes/api/ApiStashEdit.php
includes/api/i18n/diq.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/it.json
includes/api/i18n/qqq.json
includes/api/i18n/ta.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/auth/AuthManager.php
includes/auth/AuthPluginPrimaryAuthenticationProvider.php
includes/auth/AuthenticationRequest.php
includes/auth/AuthenticationResponse.php
includes/auth/ConfirmLinkSecondaryAuthenticationProvider.php
includes/auth/CreateFromLoginAuthenticationRequest.php
includes/auth/CreationReasonAuthenticationRequest.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/collation/IcuCollation.php
includes/deferred/LinksUpdate.php
includes/htmlform/HTMLForm.php
includes/htmlform/OOUIHTMLForm.php
includes/installer/MysqlInstaller.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/linker/LinkRenderer.php
includes/linker/LinkRendererFactory.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/session/Session.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUpload.php
includes/title/MediaWikiTitleCodec.php
languages/i18n/ba.json
languages/i18n/be.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dty.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gor.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hu.json
languages/i18n/id.json
languages/i18n/inh.json
languages/i18n/it.json
languages/i18n/jut.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/lb.json
languages/i18n/lv.json
languages/i18n/map-bms.json
languages/i18n/mk.json
languages/i18n/nds-nl.json
languages/i18n/nl.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/tg-cyrl.json
languages/i18n/tly.json
languages/i18n/vi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/convertExtensionToRegistration.php
mw-config/config.css
package.json
resources/Resources.php
resources/src/mediawiki.action/mediawiki.action.history.css
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/oldshared.css
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.skinning/images/magnify-clip-ltr.png
resources/src/mediawiki.skinning/images/magnify-clip-rtl.png
resources/src/mediawiki.skinning/interface.css
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki.special/mediawiki.special.js [deleted file]
resources/src/mediawiki.special/mediawiki.special.recentchanges.js
resources/src/mediawiki.special/mediawiki.special.search.css
resources/src/mediawiki.special/mediawiki.special.search.styles.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.upload.css [deleted file]
resources/src/mediawiki.special/mediawiki.special.upload.styles.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.debug.less
tests/TestsAutoLoader.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MergeHistoryTest.php
tests/phpunit/includes/TestUserRegistry.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/auth/AuthPluginPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AuthenticationRequestTest.php
tests/phpunit/includes/auth/ConfirmLinkSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/CreateFromLoginAuthenticationRequestTest.php
tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/changes/CategoryMembershipChangeTest.php
tests/phpunit/includes/changes/EnhancedChangesListTest.php
tests/phpunit/includes/changes/OldChangesListTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php
tests/phpunit/includes/linker/LinkRendererFactoryTest.php
tests/phpunit/includes/linker/LinkRendererTest.php
tests/phpunit/includes/session/BotPasswordSessionProviderTest.php
tests/phpunit/includes/session/CookieSessionProviderTest.php
tests/phpunit/includes/session/SessionBackendTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/includes/user/BotPasswordTest.php
tests/phpunit/includes/user/CentralIdLookupTest.php
tests/phpunit/includes/user/LocalIdLookupTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/phpunit.php
tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js

index 518ace4..6348ac3 100644 (file)
@@ -9,11 +9,12 @@ production.
 * The load.php entry point now enforces the existing policy of not allowing
   access to session data, which includes the session user and the session
   user's language. If such access is attempted, an exception will be thrown.
+* The number of internal PBKDF2 iterations used to derive the session secret
+  is configurable via $wgSessionPbkdf2Iterations.
 
 === 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.
-* (T88044) Implemented one-click rollback handling via AJAX.
 
 === External library changes in 1.28 ===
 
index 5cc4a64..eddb5b0 100644 (file)
@@ -31,7 +31,7 @@
                "psr/log": "1.0.0",
                "wikimedia/assert": "0.2.2",
                "wikimedia/base-convert": "1.0.1",
-               "wikimedia/cdb": "1.4.0",
+               "wikimedia/cdb": "1.4.1",
                "wikimedia/cldr-plural-rule-parser": "1.0.0",
                "wikimedia/composer-merge-plugin": "1.3.1",
                "wikimedia/html-formatter": "1.0.1",
@@ -46,7 +46,7 @@
        "require-dev": {
                "jakub-onderka/php-parallel-lint": "0.9.2",
                "justinrainbow/json-schema": "~1.3",
-               "mediawiki/mediawiki-codesniffer": "0.7.1",
+               "mediawiki/mediawiki-codesniffer": "0.7.2",
                "monolog/monolog": "~1.18.2",
                "nikic/php-parser": "1.4.1",
                "nmred/kafka-php": "0.1.5",
index cef0215..0fe3388 100644 (file)
@@ -2386,6 +2386,13 @@ $wgSessionHandler = null;
  */
 $wgPHPSessionHandling = 'enable';
 
+/**
+ * Number of internal PBKDF2 iterations to use when deriving session secrets.
+ *
+ * @since 1.28
+ */
+$wgSessionPbkdf2Iterations = 10001;
+
 /**
  * If enabled, will send MemCached debugging information to $wgDebugLogFile
  */
@@ -4458,7 +4465,7 @@ $wgPasswordPolicy = [
  * @since 1.27
  * @deprecated since 1.27, for use during development only
  */
-$wgDisableAuthManager = true;
+$wgDisableAuthManager = false;
 
 /**
  * Configure AuthManager
index 8acd036..f2403fe 100644 (file)
@@ -3501,6 +3501,8 @@ HTML
                $cancelParams = [];
                if ( !$this->isConflict && $this->oldid > 0 ) {
                        $cancelParams['oldid'] = $this->oldid;
+               } elseif ( $this->getContextTitle()->isRedirect() ) {
+                       $cancelParams['redirect'] = 'no';
                }
                $attrs = [ 'id' => 'mw-editform-cancel' ];
 
index 0b80c08..0b2d3a7 100644 (file)
@@ -138,22 +138,30 @@ class Linker {
         * Return the CSS colour of a known link
         *
         * @since 1.16.3
-        * @param Title $t
+        * @param LinkTarget $t
         * @param int $threshold User defined threshold
         * @return string CSS class
         */
-       public static function getLinkColour( $t, $threshold ) {
-               $colour = '';
-               if ( $t->isRedirect() ) {
+       public static function getLinkColour( LinkTarget $t, $threshold ) {
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+               // Make sure the target is in the cache
+               $id = $linkCache->addLinkObj( $t );
+               if ( $id == 0 ) {
+                       // Doesn't exist
+                       return '';
+               }
+
+               if ( $linkCache->getGoodLinkFieldObj( $t, 'redirect' ) ) {
                        # Page is a redirect
-                       $colour = 'mw-redirect';
-               } elseif ( $threshold > 0 && $t->isContentPage() &&
-                       $t->exists() && $t->getLength() < $threshold
+                       return 'mw-redirect';
+               } elseif ( $threshold > 0 && MWNamespace::isContent( $t->getNamespace() )
+                       && $linkCache->getGoodLinkFieldObj( $t, 'length' ) < $threshold
                ) {
                        # Page is a stub
-                       $colour = 'stub';
+                       return 'stub';
                }
-               return $colour;
+
+               return '';
        }
 
        /**
@@ -235,6 +243,8 @@ class Linker {
                        return $linkRenderer->makeKnownLink( $target, $text, $customAttribs, $query );
                } elseif ( in_array( 'broken', $options, true ) ) {
                        return $linkRenderer->makeBrokenLink( $target, $text, $customAttribs, $query );
+               } elseif ( in_array( 'noclasses', $options, true ) ) {
+                       return $linkRenderer->makePreloadedLink( $target, $text, '', $customAttribs, $query );
                } else {
                        return $linkRenderer->makeLink( $target, $text, $customAttribs, $query );
                }
@@ -1746,8 +1756,6 @@ class Linker {
         *
         * If the option noBrackets is set the rollback link wont be enclosed in "[]".
         *
-        * See the "mediawiki.page.rollback" module for the client-side handling of this link.
-        *
         * @since 1.16.3. $context added in 1.20. $options added in 1.21
         *
         * @param Revision $rev
@@ -1776,8 +1784,6 @@ class Linker {
                        $inner = $context->msg( 'brackets' )->rawParams( $inner )->escaped();
                }
 
-               $context->getOutput()->addModules( 'mediawiki.page.rollback' );
-
                return '<span class="mw-rollback-link">' . $inner . '</span>';
        }
 
@@ -1872,6 +1878,7 @@ class Linker {
                $query = [
                        'action' => 'rollback',
                        'from' => $rev->getUserText(),
+                       'token' => $context->getUser()->getEditToken( 'rollback' ),
                ];
                $attrs = [
                        'data-mw' => 'interface',
index 8f93778..ee03f02 100644 (file)
@@ -667,10 +667,10 @@ class MediaWiki {
                $trxLimits = $this->config->get( 'TrxProfilerLimits' );
                $trxProfiler = Profiler::instance()->getTransactionProfiler();
                $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
-               if ( $request->wasPosted() ) {
-                       $trxProfiler->setExpectations( $trxLimits['POST'], __METHOD__ );
-               } else {
+               if ( $request->hasSafeMethod() ) {
                        $trxProfiler->setExpectations( $trxLimits['GET'], __METHOD__ );
+               } else {
+                       $trxProfiler->setExpectations( $trxLimits['POST'], __METHOD__ );
                }
 
                // If the user has forceHTTPS set to true, or if the user
index 6486955..515fbfc 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
-use MediaWiki\MediaWikiServices;
 use MediaWiki\Linker\LinkTarget;
 use Wikimedia\Assert\Assert;
 
@@ -81,14 +80,12 @@ class WatchedItemStore implements StatsdAwareInterface {
         * @return ScopedCallback to reset the overridden value
         * @throws MWException
         */
-       public function overrideDeferredUpdatesAddCallableUpdateCallback( $callback ) {
+       public function overrideDeferredUpdatesAddCallableUpdateCallback( callable $callback ) {
                if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
                        throw new MWException(
                                'Cannot override DeferredUpdates::addCallableUpdate callback in operation.'
                        );
                }
-               Assert::parameterType( 'callable', $callback, '$callback' );
-
                $previousValue = $this->deferredUpdatesAddCallableUpdateCallback;
                $this->deferredUpdatesAddCallableUpdateCallback = $callback;
                return new ScopedCallback( function() use ( $previousValue ) {
@@ -106,14 +103,12 @@ class WatchedItemStore implements StatsdAwareInterface {
         * @return ScopedCallback to reset the overridden value
         * @throws MWException
         */
-       public function overrideRevisionGetTimestampFromIdCallback( $callback ) {
+       public function overrideRevisionGetTimestampFromIdCallback( callable $callback ) {
                if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
                        throw new MWException(
                                'Cannot override Revision::getTimestampFromId callback in operation.'
                        );
                }
-               Assert::parameterType( 'callable', $callback, '$callback' );
-
                $previousValue = $this->revisionGetTimestampFromIdCallback;
                $this->revisionGetTimestampFromIdCallback = $callback;
                return new ScopedCallback( function() use ( $previousValue ) {
index 2333c78..152a3d2 100644 (file)
@@ -1249,6 +1249,26 @@ HTML;
                $this->ip = $ip;
        }
 
+       /**
+        * Check if this request uses a "safe" HTTP method
+        *
+        * Safe methods are verbs (e.g. GET/HEAD/OPTIONS) used for obtaining content. Such requests
+        * are not expected to mutate content, especially in ways attributable to the client. Verbs
+        * like POST and PUT are typical of non-safe requests which often change content.
+        *
+        * @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 hasSafeMethod() {
+               if ( !isset( $_SERVER['REQUEST_METHOD'] ) ) {
+                       return false; // CLI mode
+               }
+
+               return in_array( $_SERVER['REQUEST_METHOD'], [ 'GET', 'HEAD', 'OPTIONS', 'TRACE' ] );
+       }
+
        /**
         * Whether this request should be identified as being "safe"
         *
@@ -1268,21 +1288,15 @@ 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"
+               if ( $this->markedAsSafe && $this->wasPosted() ) {
+                       return true; // marked as a "safe" POST
                }
 
-               return false; // PUT/DELETE
+               return $this->hasSafeMethod();
        }
 
        /**
-        * Mark this request is identified as being nullipotent even if it is a POST request
+        * Mark this request as 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.
index e32582e..3e760fd 100644 (file)
@@ -25,7 +25,7 @@
  *
  * @ingroup Actions
  */
-class RollbackAction extends FormAction {
+class RollbackAction extends FormlessAction {
 
        public function getName() {
                return 'rollback';
@@ -35,37 +35,20 @@ class RollbackAction extends FormAction {
                return 'rollback';
        }
 
-       protected function preText() {
-               return $this->msg( 'confirm-rollback-top' )->parse();
-       }
-
-       protected function alterForm( HTMLForm $form ) {
-               $form->setSubmitTextMsg( 'confirm-rollback-button' );
-               $form->setTokenSalt( 'rollback' );
-
-               // Copy parameters from GET to confirmation form
-               $from = $this->getRequest()->getVal( 'from' );
-               if ( $from === null ) {
-                       throw new BadRequestError( 'rollbackfailed', 'rollback-missingparam' );
-               }
-               foreach ( [ 'from', 'bot', 'hidediff', 'summary' ] as $param ) {
-                       $val = $this->getRequest()->getVal( $param );
-                       if ( $val !== null ) {
-                               $form->addHiddenField( $param, $val );
-                       }
-               }
-       }
+       /**
+        * Temporarily unused message keys due to T88044/T136375:
+        * - confirm-rollback-top
+        * - confirm-rollback-button
+        * - rollbackfailed
+        * - rollback-missingparam
+        */
 
        /**
-        * This must return true so that HTMLForm::show() will not display the form again after
-        * submission. For rollback, display either the form or the result (success/error)
-        * not both.
-        *
-        * @return bool
         * @throws ErrorPageError
         */
-       public function onSubmit( $data ) {
-               $this->useTransactionalTimeLimit();
+       public function onView() {
+               // TODO: use $this->useTransactionalTimeLimit(); when POST only
+               wfTransactionalTimeLimit();
 
                $request = $this->getRequest();
                $user = $this->getUser();
@@ -86,8 +69,7 @@ class RollbackAction extends FormAction {
                $errors = $this->page->doRollback(
                        $from,
                        $request->getText( 'summary' ),
-                       // Provided by HTMLForm
-                       $request->getVal( 'wpEditToken' ),
+                       $request->getVal( 'token' ),
                        $request->getBool( 'bot' ),
                        $data,
                        $this->getUser()
@@ -115,7 +97,7 @@ class RollbackAction extends FormAction {
                                }
                        }
 
-                       return true;
+                       return;
                }
 
                # NOTE: Permission errors already handled by Action::checkExecute.
@@ -160,12 +142,7 @@ class RollbackAction extends FormAction {
                        );
                        $de->showDiff( '', '' );
                }
-               return true;
-       }
-
-       public function onSuccess() {
-               // Required by parent class, but redundant because onSubmit already shows
-               // the success message when needed.
+               return;
        }
 
        protected function getDescription() {
index 806b8d2..0a4b6dc 100644 (file)
@@ -109,9 +109,12 @@ class ApiAMCreateAccount extends ApiBase {
        }
 
        public function getAllowedParams() {
-               return ApiAuthManagerHelper::getStandardParams( AuthManager::ACTION_CREATE,
+               $ret = ApiAuthManagerHelper::getStandardParams( AuthManager::ACTION_CREATE,
                        'requests', 'messageformat', 'mergerequestfields', 'preservestate', 'returnurl', 'continue'
                );
+               $ret['preservestate'][ApiBase::PARAM_HELP_MSG_APPEND][] =
+                       'apihelp-createaccount-param-preservestate';
+               return $ret;
        }
 
        public function dynamicParameterDocumentation() {
index 2997405..e30f22b 100644 (file)
@@ -244,7 +244,7 @@ class ApiAuthManagerHelper {
                        $describe = $req->describeCredentials();
                        $reqInfo = [
                                'id' => $req->getUniqueId(),
-                               'metadata' => $req->getMetadata(),
+                               'metadata' => $req->getMetadata() + [ ApiResult::META_TYPE => 'assoc' ],
                        ];
                        switch ( $req->required ) {
                                case AuthenticationRequest::OPTIONAL:
@@ -283,7 +283,6 @@ class ApiAuthManagerHelper {
        private function formatFields( array $fields ) {
                static $copy = [
                        'type' => true,
-                       'image' => true,
                        'value' => true,
                ];
 
index 711234a..cffccb1 100644 (file)
@@ -23,6 +23,7 @@
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Auth\AuthenticationRequest;
 use MediaWiki\Auth\AuthenticationResponse;
+use MediaWiki\Auth\CreateFromLoginAuthenticationRequest;
 
 /**
  * Log in to the wiki with AuthManager
@@ -90,6 +91,13 @@ class ApiClientLogin extends ApiBase {
                        $res = $manager->beginAuthentication( $reqs, $params['returnurl'] );
                }
 
+               // Remove CreateFromLoginAuthenticationRequest from $res->neededRequests.
+               // It's there so a RESTART treated as UI will work right, but showing
+               // it to the API client is just confusing.
+               $res->neededRequests = ApiAuthManagerHelper::blacklistAuthenticationRequests(
+                       $res->neededRequests, [ CreateFromLoginAuthenticationRequest::class ]
+               );
+
                $this->getResult()->addValue( null, 'clientlogin',
                        $helper->formatAuthenticationResponse( $res ) );
        }
index 7f9b98b..ce9587f 100644 (file)
@@ -1391,15 +1391,13 @@ class ApiMain extends ApiBase {
        protected function setRequestExpectations( ApiBase $module ) {
                $limits = $this->getConfig()->get( 'TrxProfilerLimits' );
                $trxProfiler = Profiler::instance()->getTransactionProfiler();
-               if ( $this->getRequest()->wasPosted() ) {
-                       if ( $module->isWriteMode() ) {
-                               $trxProfiler->setExpectations( $limits['POST'], __METHOD__ );
-                       } else {
-                               $trxProfiler->setExpectations( $limits['POST-nonwrite'], __METHOD__ );
-                               $this->getRequest()->markAsSafeRequest();
-                       }
-               } else {
+               if ( $this->getRequest()->hasSafeMethod() ) {
                        $trxProfiler->setExpectations( $limits['GET'], __METHOD__ );
+               } elseif ( $this->getRequest()->wasPosted() && !$module->isWriteMode() ) {
+                       $trxProfiler->setExpectations( $limits['POST-nonwrite'], __METHOD__ );
+                       $this->getRequest()->markAsSafeRequest();
+               } else {
+                       $trxProfiler->setExpectations( $limits['POST'], __METHOD__ );
                }
        }
 
index 3ca4c08..ed4d373 100644 (file)
@@ -554,23 +554,34 @@ class ApiQuery extends ApiBase {
        }
 
        public function isReadMode() {
-               // We need to make an exception for ApiQueryTokens so login tokens can
-               // be fetched on private wikis. Restrict that exception as much as
-               // possible: no other modules allowed, and no pageset parameters
-               // either. We do allow the 'rawcontinue' and 'indexpageids' parameters
-               // since frameworks might add these unconditionally and they can't
-               // expose anything here.
+               // We need to make an exception for certain meta modules that should be
+               // accessible even without the 'read' right. Restrict the exception as
+               // much as possible: no other modules allowed, and no pageset
+               // parameters either. We do allow the 'rawcontinue' and 'indexpageids'
+               // parameters since frameworks might add these unconditionally and they
+               // can't expose anything here.
+               $this->mParams = $this->extractRequestParams();
                $params = array_filter(
                        array_diff_key(
-                               $this->extractRequestParams() + $this->getPageSet()->extractRequestParams(),
+                               $this->mParams + $this->getPageSet()->extractRequestParams(),
                                [ 'rawcontinue' => 1, 'indexpageids' => 1 ]
                        )
                );
-               if ( $params === [ 'meta' => [ 'tokens' ] ] ) {
-                       return false;
+               if ( array_keys( $params ) !== [ 'meta' ] ) {
+                       return true;
+               }
+
+               // Ask each module if it requires read mode. Any true => this returns
+               // true.
+               $modules = [];
+               $this->instantiateModules( $modules, 'meta' );
+               foreach ( $modules as $module ) {
+                       if ( $module->isReadMode() ) {
+                               return true;
+                       }
                }
 
-               return true;
+               return false;
        }
 
        protected function getExamplesMessages() {
index b591f9c..1d250e9 100644 (file)
@@ -43,7 +43,6 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase {
                        'canauthenticatenow' => $manager->canAuthenticateNow(),
                        'cancreateaccounts' => $manager->canCreateAccounts(),
                        'canlinkaccounts' => $manager->canLinkAccounts(),
-                       'haspreservedstate' => $helper->getPreservedRequest() !== null,
                ];
 
                if ( $params['securitysensitiveoperation'] !== null ) {
@@ -53,10 +52,27 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase {
                }
 
                if ( $params['requestsfor'] ) {
-                       $reqs = $manager->getAuthenticationRequests( $params['requestsfor'], $this->getUser() );
+                       $action = $params['requestsfor'];
+
+                       $preservedReq = $helper->getPreservedRequest();
+                       if ( $preservedReq ) {
+                               $ret += [
+                                       'haspreservedstate' => $preservedReq->hasStateForAction( $action ),
+                                       'hasprimarypreservedstate' => $preservedReq->hasPrimaryStateForAction( $action ),
+                                       'preservedusername' => (string)$preservedReq->username,
+                               ];
+                       } else {
+                               $ret += [
+                                       'haspreservedstate' => false,
+                                       'hasprimarypreservedstate' => false,
+                                       'preservedusername' => '',
+                               ];
+                       }
+
+                       $reqs = $manager->getAuthenticationRequests( $action, $this->getUser() );
 
                        // Filter out blacklisted requests, depending on the action
-                       switch ( $params['requestsfor'] ) {
+                       switch ( $action ) {
                                case AuthManager::ACTION_CHANGE:
                                        $reqs = ApiAuthManagerHelper::blacklistAuthenticationRequests(
                                                $reqs, $this->getConfig()->get( 'ChangeCredentialsBlacklist' )
@@ -75,8 +91,8 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase {
                $this->getResult()->addValue( [ 'query' ], $this->getModuleName(), $ret );
        }
 
-       public function getCacheMode( $params ) {
-               return 'public';
+       public function isReadMode() {
+               return false;
        }
 
        public function getAllowedParams() {
@@ -95,7 +111,7 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase {
                                        AuthManager::ACTION_UNLINK,
                                ],
                        ],
-               ] + ApiAuthManagerHelper::getStandardParams( '', 'mergerequestfields' );
+               ] + ApiAuthManagerHelper::getStandardParams( '', 'mergerequestfields', 'messageformat' );
        }
 
        protected function getExamplesMessages() {
index 64022ff..b816f43 100644 (file)
@@ -80,8 +80,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                        return false;
                }
 
-               return $wgUser->getEditToken(
-                       [ $title->getPrefixedText(), $rev->getUserText() ] );
+               return $wgUser->getEditToken( 'rollback' );
        }
 
        protected function run( ApiPageSet $resultPageSet = null ) {
index 68ec38d..5afb66f 100644 (file)
@@ -262,8 +262,11 @@ class ApiQueryUsers extends ApiQueryBase {
                                } else {
                                        $data[$u]['missing'] = true;
                                        if ( isset( $this->prop['cancreate'] ) && !$this->getConfig()->get( 'DisableAuthManager' ) ) {
-                                               $data[$u]['cancreate'] = MediaWiki\Auth\AuthManager::singleton()->canCreateAccount( $u )
-                                                       ->isGood();
+                                               $status = MediaWiki\Auth\AuthManager::singleton()->canCreateAccount( $u );
+                                               $data[$u]['cancreate'] = $status->isGood();
+                                               if ( !$status->isGood() ) {
+                                                       $data[$u]['cancreateerror'] = $this->getErrorFormatter()->arrayFromStatus( $status );
+                                               }
                                        }
                                }
                        } else {
index 93003cc..e739e51 100644 (file)
@@ -46,6 +46,10 @@ class ApiStashEdit extends ApiBase {
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
+               if ( $user->isBot() ) { // sanity
+                       $this->dieUsage( 'This interface is not supported for bots', 'botsnotsupported' );
+               }
+
                $page = $this->getTitleOrPageId( $params );
                $title = $page->getTitle();
 
@@ -123,6 +127,8 @@ class ApiStashEdit extends ApiBase {
                        $status = 'busy';
                }
 
+               $this->getStats()->increment( "editstash.cache_stores.$status" );
+
                $this->getResult()->addValue( null, $this->getModuleName(), [ 'status' => $status ] );
        }
 
@@ -259,6 +265,10 @@ class ApiStashEdit extends ApiBase {
         * @return stdClass|bool Returns false on cache miss
         */
        public static function checkCache( Title $title, Content $content, User $user ) {
+               if ( $user->isBot() ) {
+                       return false; // bots never stash - don't pollute stats
+               }
+
                $cache = ObjectCache::getLocalClusterInstance();
                $logger = LoggerFactory::getInstance( 'StashEdit' );
                $stats = RequestContext::getMain()->getStats();
index c737355..1ab1bc5 100644 (file)
@@ -2,9 +2,11 @@
        "@metadata": {
                "authors": [
                        "Gorizon",
-                       "Mirzali"
+                       "Mirzali",
+                       "Kumkumuk"
                ]
        },
+       "apihelp-block-description": "Enê karberi bloqe ke",
        "apihelp-createaccount-param-name": "Nameyê karberi.",
        "apihelp-delete-description": "Pele bestere.",
        "apihelp-disabled-description": "Eno modul aktiv niyo.",
@@ -25,6 +27,9 @@
        "apihelp-feedrecentchanges-param-hidebots": "Vurnayışanê botan bınımne.",
        "apihelp-feedrecentchanges-param-hideanons": "Vurnayışanê karberanê anoniman bınımne.",
        "apihelp-feedrecentchanges-param-hideliu": "Vurnayışanê karberanê qeydınan bınımne.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrey etiketi",
+       "apihelp-feedrecentchanges-example-simple": "Vurnayışê peyênan bıvin",
+       "apihelp-feedrecentchanges-example-30days": "Peyni vurnayışanê 30 raco bımosne",
        "apihelp-login-param-name": "Nameyê karberi.",
        "apihelp-login-param-password": "Parola.",
        "apihelp-login-param-domain": "Domain (optional).",
index 4e9309e..0f7548b 100644 (file)
@@ -60,6 +60,7 @@
        "apihelp-compare-example-1": "Create a diff between revision 1 and 2.",
 
        "apihelp-createaccount-description": "Create a new user account.",
+       "apihelp-createaccount-param-preservestate": "If <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> returned true for <samp>hasprimarypreservedstate</samp>, requests marked as <samp>primary-required</samp> should be omitted. If it returned a non-empty value for <samp>preservedusername</samp>, that username must be used for the <var>username</var> parameter.",
        "apihelp-createaccount-example-create": "Start the process of creating user <kbd>Example</kbd> with password <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Username.",
        "apihelp-createaccount-param-password": "Password (ignored if <var>$1mailpassword</var> is set).",
index 4d23b6f..44725a8 100644 (file)
@@ -24,7 +24,8 @@
                        "Elfix",
                        "Lbayle",
                        "Verdy p",
-                       "Yasten"
+                       "Yasten",
+                       "Trial"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Test :</strong> Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Accordé à}} : $2",
        "api-help-right-apihighlimits": "Utiliser des valeurs plus hautes dans les requêtes de l’API (requêtes lentes : $1 ; requêtes rapides : $2). Les limites pour les requêtes lentes s’appliquent aussi aux paramètres multivalués.",
        "api-help-open-in-apisandbox": "<small>[ouvrir dans le bac à sable]</small>",
-       "api-help-authmanager-general-usage": "La procédure générale pour utiliser ce module est la suivante :\n# Récupérer les champs disponibles avec <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$4</kbd>, et un jeton <kbd>$5</kbd> avec <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]].\n# Présenter les champs à l’utilisateur, et les lui faire soumettre.\n# Faire un envoi à ce module, en fournissant <var>$1returnurl</var> et les champs appropriés.\n# Vérifier le <samp>status</samp> dans la réponse.\n#* Si vous avez reçu <samp>PASS</samp> ou <samp>FAIL</samp>, c’est terminé. L’opération a soit réussi, soit échoué.\n#* Si vous avez reçu <samp>UI</samp>, affichez les nouveaux champs à l’utilisateur et faites-les-lui soumettre. Puis envoyez-les à ce module avec <var>$1continue</var> et l’ensemble des champs appropriés, et recommencez l’étape 4.\n#* Si vous avez reçu <samp>REDIRECT</samp>, envoyez l’utilisateur vers la cible <samp>redirecttarget</samp> et attendez le retour vers <var>$1returnurl</var>. Puis envoyez à ce module avec <var>$1continue</var> et tous les champs passés à l’URL de retour, puis répétez l’étape 4.\n#* Si vous avez reçu <samp>RESTART</samp>, cela veut dire que l’authentification a fonctionné, mais nous n’avons pas de compte utilisateur lié. Vous pouvez traiter cela comme un <samp>UI</samp> ou un <samp>FAIL</samp>.",
+       "api-help-authmanager-general-usage": "La procédure générale pour utiliser ce module est la suivante :\n# Récupérer les champs disponibles avec <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$4</kbd>, et un jeton <kbd>$5</kbd> avec <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Présenter les champs à l’utilisateur, et les lui faire soumettre.\n# Faire un envoi à ce module, en fournissant <var>$1returnurl</var> et les champs appropriés.\n# Vérifier le <samp>status</samp> dans la réponse.\n#* Si vous avez reçu <samp>PASS</samp> ou <samp>FAIL</samp>, c’est terminé. L’opération a soit réussi, soit échoué.\n#* Si vous avez reçu <samp>UI</samp>, affichez les nouveaux champs à l’utilisateur et faites-les-lui soumettre. Puis envoyez-les à ce module avec <var>$1continue</var> et l’ensemble des champs appropriés, et recommencez l’étape 4.\n#* Si vous avez reçu <samp>REDIRECT</samp>, envoyez l’utilisateur vers la cible <samp>redirecttarget</samp> et attendez le retour vers <var>$1returnurl</var>. Puis envoyez à ce module avec <var>$1continue</var> et tous les champs passés à l’URL de retour, puis répétez l’étape 4.\n#* Si vous avez reçu <samp>RESTART</samp>, cela veut dire que l’authentification a fonctionné, mais nous n’avons pas de compte utilisateur lié. Vous pouvez traiter cela comme un <samp>UI</samp> ou un <samp>FAIL</samp>.",
        "api-help-authmanagerhelper-requests": "Utiliser uniquement ces requêtes d’authentification, avec l’<samp>id</samp> renvoyé par <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$1</kbd> ou depuis une réponse précédente de ce module.",
        "api-help-authmanagerhelper-request": "Utiliser cette requête d’authentification, avec l’<samp>id</samp> renvoyé par <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$1</kbd>.",
        "api-help-authmanagerhelper-messageformat": "Format à utiliser pour retourner les messages.",
index d1acea6..33e8f5e 100644 (file)
@@ -35,6 +35,7 @@
        "apihelp-block-param-watchuser": "Segui la pagina utente e le pagine di discussione utente dell'utente o dell'indirizzo IP.",
        "apihelp-block-example-ip-simple": "Blocca l'indirizzo IP <kbd>192.0.2.5</kbd> per tre giorni con motivazione <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Blocca l'utente <kbd>Vandal</kbd> a tempo indeterminato con motivazione <kbd>Vandalism</kbd>, e impediscigli la creazione di nuovi account e l'invio di e-mail.",
+       "apihelp-changeauthenticationdata-description": "Modificare i dati di autenticazione per l'utente corrente.",
        "apihelp-changeauthenticationdata-example-password": "Tentativo di modificare la password dell'utente corrente a <kbd>ExamplePassword</kbd>.",
        "apihelp-checktoken-description": "Verifica la validità di un token da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo di token in corso di test.",
@@ -43,6 +44,7 @@
        "apihelp-checktoken-example-simple": "Verifica la validità di un token <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Cancella il flag <code>hasmsg</code> per l'utente corrente.",
        "apihelp-clearhasmsg-example-1": "Cancella il flag <code>hasmsg</code> per l'utente corrente.",
+       "apihelp-clientlogin-example-login": "Avvia il processo di accesso alla wiki come utente <kbd>Example</kbd> con password <kbd>ExamplePassword</kbd>.",
        "apihelp-clientlogin-example-login2": "Continua l'accesso dopo una risposta dell'<samp>UI</samp> per l'autenticazione a due fattori, fornendo un <var>OATHToken</var> di <kbd>987654</kbd>.",
        "apihelp-compare-description": "Ottieni le differenze tra 2 pagine.\n\nUn numero di revisione, il titolo di una pagina, o un ID di pagina deve essere indicato sia per il \"da\" che per lo \"a\".",
        "apihelp-compare-param-fromtitle": "Primo titolo da confrontare.",
@@ -53,7 +55,7 @@
        "apihelp-compare-param-torev": "Seconda revisione da confrontare.",
        "apihelp-compare-example-1": "Crea un diff tra revisione 1 e revisione 2.",
        "apihelp-createaccount-description": "Crea un nuovo account utente.",
-       "apihelp-createaccount-example-create": "Avviare il processo di creazione utente <kbd>Example</kbd> con password <kbd>ExamplePassword</kbd>.",
+       "apihelp-createaccount-example-create": "Avvia il processo di creazione utente <kbd>Example</kbd> con password <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Nome utente.",
        "apihelp-createaccount-param-password": "Password (verrà ignorata se è impostato <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Dominio per l'autenticazione esterna (opzionale).",
        "apihelp-import-param-namespace": "Importa in questo namespace. Non può essere usato insieme a <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importa come sottopagina di questa pagina. Non può essere usato insieme a <var>$1namespace</var>.",
        "apihelp-import-example-import": "Importa [[meta:Help:ParserFunctions]] nel namespace 100 con cronologia completa.",
-       "apihelp-linkaccount-description": "Collegamento di un account di un provider di terze parti all'utente corrente.",
-       "apihelp-login-description": "Accedi e ottieni i cookie di autenticazione.\n\nQuesta azione deve essere usata esclusivamente in combinazione con [[Special:BotPasswords]]; utilizzarla per l'accesso all'account principale è deprecato e può fallire senza preavviso. Per accedere in modo sicuro all'account principale, usa <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-linkaccount-description": "Collegamento di un'utenza di un provider di terze parti all'utente corrente.",
+       "apihelp-login-description": "Accedi e ottieni i cookie di autenticazione.\n\nQuesta azione deve essere usata esclusivamente in combinazione con [[Special:BotPasswords]]; utilizzarla per l'accesso all'account principale è deprecato e può fallire senza preavviso. Per accedere in modo sicuro all'utenza principale, usa <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "Accedi e ottieni i cookies di autenticazione.\n\nQuesta azione è deprecata e può fallire senza preavviso. Per accedere in modo sicuro, usa [[Special:ApiHelp/clientlogin|action=clientlogin]].",
        "apihelp-login-description-nonauthmanager": "Accedi e ottieni i cookie di autenticazione.\n\nIn caso di accesso riuscito, i cookies necessari saranno inclusi nella intestazioni di risposta HTTP. In caso di accesso fallito, ulteriori tentativi potrebbero essere limitati, in modo da contenere gli attacchi automatizzati per indovinare le password.",
        "apihelp-login-param-name": "Nome utente.",
        "apihelp-login-param-password": "Password.",
        "apihelp-query+allusers-param-excludegroup": "Escludi gli utenti nei gruppi indicati.",
        "apihelp-query+allusers-param-prop": "Quali pezzi di informazioni includere:",
        "apihelp-query+allusers-param-limit": "Quanti nomi utente totali restituire.",
-       "apihelp-query+authmanagerinfo-description": "Recuperare informazioni circa l'attuale stato di autenticazione.",
-       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Verificare se lo stato di autenticazione dell'utente attuale è sufficiente per la specifica operazione sensibile alla sicurezza.",
+       "apihelp-query+authmanagerinfo-description": "Recupera informazioni circa l'attuale stato di autenticazione.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Verifica se lo stato di autenticazione dell'utente attuale è sufficiente per la specifica operazione sensibile alla sicurezza.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Recupera informazioni circa le richieste di autenticazione necessarie per la specifica azione di autenticazione.",
+       "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "Verificare se l'autenticazione è sufficiente per l'azione <kbd>foo</kbd>.",
        "apihelp-query+backlinks-description": "Trova tutte le pagine che puntano a quella specificata.",
        "apihelp-query+backlinks-param-namespace": "Il namespace da elencare.",
        "apihelp-query+backlinks-param-dir": "La direzione in cui elencare.",
        "apihelp-query+userinfo-example-simple": "Ottieni informazioni sull'utente attuale.",
        "apihelp-query+users-description": "Ottieni informazioni su un elenco di utenti.",
        "apihelp-query+users-param-prop": "Quali pezzi di informazioni includere:",
+       "apihelp-query+users-paramvalue-prop-cancreate": "Indica se può essere creata un'utenza per nomi utente validi ma non registrati.",
        "apihelp-query+users-param-users": "Un elenco di utenti di cui ottenere informazioni.",
        "apihelp-query+watchlist-description": "Ottieni le ultime modifiche alle pagine tra gli osservati speciali dell'utente attuale.",
        "apihelp-query+watchlist-param-start": "Il timestamp da cui iniziare l'elenco.",
        "apihelp-query+watchlistraw-param-totitle": "Il titolo (con prefisso namespace) al quale interrompere l'elenco.",
        "apihelp-query+watchlistraw-example-simple": "Elenca le pagine fra gli osservati speciali dell'utente attuale.",
        "apihelp-query+watchlistraw-example-generator": "Recupera le informazioni sulle pagine fra gli osservati speciali dell'utente attuale.",
+       "apihelp-removeauthenticationdata-description": "Rimuove i dati di autenticazione per l'utente corrente.",
        "apihelp-removeauthenticationdata-example-simple": "Tentativo di rimuovere gli attuali dati utente per <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-description": "Invia una mail per reimpostare la password di un utente.",
+       "apihelp-resetpassword-description-noroutes": "Non sono disponibili rotte per la reimpostazione della password.\n\nAbilita le rotte in <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> per usare questo modulo.",
        "apihelp-resetpassword-param-user": "Utente in corso di ripristino.",
-       "apihelp-resetpassword-param-email": "Indirizzo email dell'utente in corso di ripristino.",
-       "apihelp-resetpassword-param-capture": "Ritorna le password temporanee che erano state inviate. Richiede il diritto utente <code>passwordreset</code>.",
-       "apihelp-resetpassword-example-user": "Invia un'email per reimpostare la password all'utente <kbd>Esempio</kbd>.",
+       "apihelp-resetpassword-param-email": "Indirizzo di posta elettronica dell'utente in corso di ripristino.",
+       "apihelp-resetpassword-param-capture": "Restituisce le password temporanee che erano state inviate. Richiede il diritto utente <code>passwordreset</code>.",
+       "apihelp-resetpassword-example-user": "Invia una mail per reimpostare la password all'utente <kbd>Example</kbd>.",
        "apihelp-revisiondelete-description": "Cancella e ripristina le versioni.",
        "apihelp-revisiondelete-param-type": "Tipo di cancellazione della versione effettuata.",
        "apihelp-revisiondelete-param-hide": "Cosa nascondere per ogni versione.",
        "apihelp-undelete-param-title": "Titolo della pagina da ripristinare.",
        "apihelp-undelete-param-reason": "Motivo per il ripristino.",
        "apihelp-undelete-param-tags": "Modifica etichette da applicare all'elemento del registro delle cancellazioni.",
-       "apihelp-unlinkaccount-description": "Rimuovere un account di terze parti collegato all'utente corrente.",
+       "apihelp-unlinkaccount-description": "Rimuove un'utenza di terze parti collegata all'utente corrente.",
+       "apihelp-unlinkaccount-example-simple": "Tentativo di rimuovere il collegamento dell'utente corrente per il provider associato con <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-upload-param-watch": "Osserva la pagina.",
        "apihelp-upload-param-file": "Contenuto del file.",
        "apihelp-upload-example-url": "Carica da un URL.",
        "api-help-permissions": "{{PLURAL:$1|Permesso|Permessi}}:",
        "api-help-open-in-apisandbox": "<small>[apri in una sandbox]</small>",
        "api-help-authmanager-general-usage": "La procedura generale per usare questo modulo é:\n# Ottenere i campi disponibili da <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$4</kbd>, e un token <kbd>$5</kbd> da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Mostra i campi all'utente e ottieni i dati che invia.\n# Esegui un post a questo modulo, fornendo <var>$1returnurl</var> e ogni campo rilevante.\n# Controlla <samp>status</samp> nella response.\n#* Se hai ricevuto <samp>PASS</samp> o <samp>FAIL</samp>, hai finito. L'operazione nel primo caso è andata a buon fine, nel secondo no.\n#* Se hai ricevuto <samp>UI</samp>, mostra i nuovi campi all'utente e ottieni i dati che invia. Esegui un post a questo modulo con <var>$1continue</var> e i campi rilevanti settati, quindi ripeti il punto 4.\n#* Se hai ricevuto <samp>REDIRECT</samp>, dirigi l'utente a <samp>redirecttarget</samp> e aspetta che ritorni a <var>$1returnurl</var>. A quel punto esegui un post a questo modulo con <var>$1continue</var> e ogni campo passato all'URL di ritorno, e ripeti il punto 4.\n#* Se hai ricevuto <samp>RESTART</samp>, vuol dire che l'autenticazione ha funzionato ma non abbiamo un account collegato. Potresti considerare questo caso come <samp>UI</samp> o come <samp>FAIL</samp>.",
-       "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizzare <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
+       "api-help-authmanagerhelper-preservestate": "Conserva lo stato da un precedente tentativo di accesso non riuscito, se possibile.",
+       "api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito <var>$1continue</var>.\n\nAlla ricezione di una risposta <samp>REDIRECT</samp>, in genere si apre un browser o una vista web all'URL specificato <samp>redirecttarget</samp> per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request <var>$1continue</var> a questo modulo API.",
+       "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
        "api-credits-header": "Crediti"
 }
index 6137457..991326d 100644 (file)
@@ -62,6 +62,7 @@
        "apihelp-compare-param-torev": "{{doc-apihelp-param|compare|torev}}",
        "apihelp-compare-example-1": "{{doc-apihelp-example|compare}}",
        "apihelp-createaccount-description": "{{doc-apihelp-description|createaccount}}",
+       "apihelp-createaccount-param-preservestate": "{{doc-apihelp-param|createaccount|preservestate|info=This message is displayed in addition to {{msg-mw|api-help-authmanagerhelper-preservestate}}.}}",
        "apihelp-createaccount-example-create": "{{doc-apihelp-example|createaccount}}",
        "apihelp-createaccount-param-name": "{{doc-apihelp-param|createaccount|name}}\n{{Identical|Username}}",
        "apihelp-createaccount-param-password": "{{doc-apihelp-param|createaccount|password}}",
index 04e9a43..5626b70 100644 (file)
@@ -2,9 +2,13 @@
        "@metadata": {
                "authors": [
                        "AntanO",
-                       "கலைவாணன்"
+                       "கலைவாணன்",
+                       "Info-farmer"
                ]
        },
+       "apihelp-main-param-action": "எச்செயலை செயற்படுத்த",
+       "apihelp-main-param-format": "பெற விரும்பும்  கோப்பு வடிவம்",
+       "apihelp-main-param-requestid": "இங்கு கொடுக்கப்படும் மதிப்பானது, விளைவில் இணையும். கோரிக்கைகளை வேறுபடுத்தப் பயன்படலாம்.",
        "apihelp-import-param-namespace": "இதனைப் பெயர்வெளிக்கு இறக்குமதி செய்யவும். <kbd>$1rootpage</kbd> அளவுருவை மீறச்செய்யும்.",
        "apihelp-import-param-rootpage": "இப்பக்கத்தின் துணைப்பக்கமாக இறக்குமதி செய்யவும். <kbd>$1namespace</kbd> அளவுரு வழங்கப்பட்டிருந்தால் இது புறக்கணிக்கப்படும்.",
        "api-help-source": "மூலம்: $1",
index a525f2e..0802c53 100644 (file)
@@ -10,7 +10,8 @@
                        "Macofe",
                        "Mix Gerder",
                        "Piramidion",
-                       "Andriykopanytsia"
+                       "Andriykopanytsia",
+                       "Максим Підліснюк"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документація]]\n* [[mw:API:FAQ|ЧаПи]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n</div>\n<strong>Статус:</strong> Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\n<strong>Хибні запити:</strong> Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Тестування:</strong> Для зручності тестування запитів API, див. [[Special:ApiSandbox]].",
@@ -39,6 +40,7 @@
        "apihelp-block-param-watchuser": "Спостерігати за сторінкою користувача чи IP-адреси і сторінкою обговорення.",
        "apihelp-block-example-ip-simple": "Блокувати IP-адресу <kbd>192.0.2.5</kbd> на три дні з причиною <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Блокувати користувача<kbd>Vandal</kbd> на невизначений термін з причиною <kbd>Vandalism</kbd> і заборонити створення нових облікових записів та надсилання електронної пошти.",
+       "apihelp-changeauthenticationdata-description": "Зміна параметрів аутентифікації для поточного користувача.",
        "apihelp-checktoken-description": "Перевірити коректність токена з <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Тип токена, який тестується.",
        "apihelp-checktoken-param-token": "Токен для тесту.",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Видає список змінних ID.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Видає список протоколів, дозволених у зовнішніх посиланнях.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Видає значення налаштувань користувача за замовчуванням.",
+       "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Повертає конфігурацію діалогу завантаження.",
        "apihelp-query+siteinfo-param-filteriw": "Видати лише локальні або лише нелокальні елементи карти інтервікі.",
        "apihelp-query+siteinfo-param-showalldb": "Перелічити усі сервери баз даних, а не лише той, який робить найбільшу затримку.",
        "apihelp-query+siteinfo-param-numberingroup": "Перераховує кількість користувачів у групах користувачів.",
index 65ae10e..2eb6aba 100644 (file)
        "apihelp-query+allusers-param-activeusers": "只列出最近$1{{PLURAL:$1|天}}内活跃的用户。",
        "apihelp-query+allusers-param-attachedwiki": "与<kbd>$1prop=centralids</kbd>一起使用,也表明用户是否附加于此ID定义的wiki。",
        "apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>开头的用户。",
+       "apihelp-query+authmanagerinfo-description": "检索有关当前身份验证状态的信息。",
        "apihelp-query+filerepoinfo-example-login": "检索当开始登录时可能使用的请求。",
        "apihelp-query+filerepoinfo-example-login-merged": "检索当开始登录时可能使用的请求,并合并表单字段。",
        "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "测试身份验证对操作<kbd>foo</kbd>是否足够。",
index efee53c..136ce26 100644 (file)
@@ -231,6 +231,17 @@ class AuthManager implements LoggerAwareInterface {
 
        /**
         * Start an authentication flow
+        *
+        * In addition to the AuthenticationRequests returned by
+        * $this->getAuthenticationRequests(), a client might include a
+        * CreateFromLoginAuthenticationRequest from a previous login attempt to
+        * preserve state.
+        *
+        * Instead of the AuthenticationRequests returned by
+        * $this->getAuthenticationRequests(), a client might pass a
+        * CreatedAccountAuthenticationRequest from an account creation that just
+        * succeeded to log in to the just-created account.
+        *
         * @param AuthenticationRequest[] $reqs
         * @param string $returnToUrl Url that REDIRECT responses should eventually
         *  return to.
@@ -344,8 +355,7 @@ class AuthManager implements LoggerAwareInterface {
         * Return values are interpreted as follows:
         * - status FAIL: Authentication failed. If $response->createRequest is
         *   set, that may be passed to self::beginAuthentication() or to
-        *   self::beginAccountCreation() (after adding a username, if necessary)
-        *   to preserve state.
+        *   self::beginAccountCreation() to preserve state.
         * - status REDIRECT: The client should be redirected to the contained URL,
         *   new AuthenticationRequests should be made (if any), then
         *   AuthManager::continueAuthentication() should be called.
@@ -950,6 +960,17 @@ class AuthManager implements LoggerAwareInterface {
 
        /**
         * Start an account creation flow
+        *
+        * In addition to the AuthenticationRequests returned by
+        * $this->getAuthenticationRequests(), a client might include a
+        * CreateFromLoginAuthenticationRequest from a previous login attempt. If
+        * <code>
+        * $createFromLoginAuthenticationRequest->hasPrimaryStateForAction( AuthManager::ACTION_CREATE )
+        * </code>
+        * returns true, any AuthenticationRequest::PRIMARY_REQUIRED requests
+        * should be omitted. If the CreateFromLoginAuthenticationRequest has a
+        * username set, that username must be used for all other requests.
+        *
         * @param User $creator User doing the account creation
         * @param AuthenticationRequest[] $reqs
         * @param string $returnToUrl Url that REDIRECT responses should eventually
@@ -1038,44 +1059,10 @@ class AuthManager implements LoggerAwareInterface {
                if ( $req ) {
                        $state['maybeLink'] = $req->maybeLink;
 
-                       // If we get here, the user didn't submit a form with any of the
-                       // usual AuthenticationRequests that are needed for an account
-                       // creation. So we need to determine if there are any and return a
-                       // UI response if so.
                        if ( $req->createRequest ) {
-                               // We have a createRequest from a
-                               // PrimaryAuthenticationProvider, so don't ask.
-                               $providers = $this->getPreAuthenticationProviders() +
-                                       $this->getSecondaryAuthenticationProviders();
-                       } else {
-                               // We're only preserving maybeLink, so ask for primary fields
-                               // too.
-                               $providers = $this->getPreAuthenticationProviders() +
-                                       $this->getPrimaryAuthenticationProviders() +
-                                       $this->getSecondaryAuthenticationProviders();
-                       }
-                       $reqs = $this->getAuthenticationRequestsInternal(
-                               self::ACTION_CREATE,
-                               [],
-                               $providers
-                       );
-                       // See if we need any requests to begin
-                       foreach ( (array)$reqs as $r ) {
-                               if ( !$r instanceof UsernameAuthenticationRequest &&
-                                       !$r instanceof UserDataAuthenticationRequest &&
-                                       !$r instanceof CreationReasonAuthenticationRequest
-                               ) {
-                                       // Needs some reqs, so request them
-                                       $reqs[] = new CreateFromLoginAuthenticationRequest( $req->createRequest, [] );
-                                       $state['continueRequests'] = $reqs;
-                                       $session->setSecret( 'AuthManager::accountCreationState', $state );
-                                       $session->persist();
-                                       return AuthenticationResponse::newUI( $reqs, wfMessage( 'authmanager-create-from-login' ) );
-                               }
+                               $reqs[] = $req->createRequest;
+                               $state['reqs'][] = $req->createRequest;
                        }
-                       // No reqs needed, so we can just continue.
-                       $req->createRequest->returnToUrl = $returnToUrl;
-                       $reqs = [ $req->createRequest ];
                }
 
                $session->setSecret( 'AuthManager::accountCreationState', $state );
@@ -1213,15 +1200,6 @@ class AuthManager implements LoggerAwareInterface {
                                $req->username = $state['username'];
                        }
 
-                       // If we're coming in from a create-from-login UI response, we need
-                       // to extract the createRequest (if any).
-                       $req = AuthenticationRequest::getRequestByClass(
-                               $reqs, CreateFromLoginAuthenticationRequest::class
-                       );
-                       if ( $req && $req->createRequest ) {
-                               $reqs[] = $req->createRequest;
-                       }
-
                        // Run pre-creation tests, if we haven't already
                        if ( !$state['ranPreTests'] ) {
                                $providers = $this->getPreAuthenticationProviders() +
index 9746637..b8e36bc 100644 (file)
@@ -329,7 +329,7 @@ class AuthPluginPrimaryAuthenticationProvider
                                if ( $req->domain === null ) {
                                        return \StatusValue::newGood( 'ignored' );
                                }
-                               if ( !$this->auth->validDomain( $domain ) ) {
+                               if ( !$this->auth->validDomain( $req->domain ) ) {
                                        return \StatusValue::newFatal( 'authmanager-authplugin-setpass-bad-domain' );
                                }
                        }
index 3c19b87..ff4d52e 100644 (file)
@@ -92,14 +92,12 @@ abstract class AuthenticationRequest {
         *     - select: <select>
         *     - checkbox: <input type="checkbox">
         *     - multiselect: More a grid of checkboxes than <select multi>
-        *     - button: <input type="image"> if 'image' is set, otherwise <input type="submit">
-        *       (uses 'label' as button text)
+        *     - button: <input type="submit"> (uses 'label' as button text)
         *     - hidden: Not visible to the user, but needs to be preserved for the next request
         *     - null: No widget, just display the 'label' message.
         *  - options: (array) Maps option values to Messages for the
         *      'select' and 'multiselect' types.
         *  - value: (string) Value (for 'null' and 'hidden') or default value (for other types).
-        *  - image: (string) URL of an image to use in connection with the input
         *  - label: (Message) Text suitable for a label in an HTML form
         *  - help: (Message) Text suitable as a description of what the field is
         *  - optional: (bool) If set and truthy, the field may be left empty
@@ -281,6 +279,21 @@ abstract class AuthenticationRequest {
        public static function mergeFieldInfo( array $reqs ) {
                $merged = [];
 
+               // fields that are required by some primary providers but not others are not actually required
+               $primaryRequests = array_filter( $reqs, function ( $req ) {
+                       return $req->required === AuthenticationRequest::PRIMARY_REQUIRED;
+               } );
+               $sharedRequiredPrimaryFields = array_reduce( $primaryRequests, function ( $shared, $req ) {
+                       $required = array_keys( array_filter( $req->getFieldInfo(), function ( $options ) {
+                               return empty( $options['optional'] );
+                       } ) );
+                       if ( $shared === null ) {
+                               return $required;
+                       } else {
+                               return array_intersect( $shared, $required );
+                       }
+               }, null );
+
                foreach ( $reqs as $req ) {
                        $info = $req->getFieldInfo();
                        if ( !$info ) {
@@ -288,8 +301,14 @@ abstract class AuthenticationRequest {
                        }
 
                        foreach ( $info as $name => $options ) {
-                               if ( $req->required !== self::REQUIRED ) {
+                               if (
                                        // If the request isn't required, its fields aren't required either.
+                                       $req->required === self::OPTIONAL
+                                       // If there is a primary not requiring this field, no matter how many others do,
+                                       // authentication can proceed without it.
+                                       || $req->required === self::PRIMARY_REQUIRED
+                                               && !in_array( $name, $sharedRequiredPrimaryFields, true )
+                               ) {
                                        $options['optional'] = true;
                                } else {
                                        $options['optional'] = !empty( $options['optional'] );
index db01825..5048cf8 100644 (file)
@@ -83,13 +83,14 @@ class AuthenticationResponse {
        /**
         * @var AuthenticationRequest|null
         *
-        * Returned with a PrimaryAuthenticationProvider login FAIL, this holds a
-        * request that should result in a PASS when passed to that provider's
-        * PrimaryAuthenticationProvider::beginPrimaryAccountCreation().
+        * Returned with a PrimaryAuthenticationProvider login FAIL or a PASS with
+        * no username, this holds a request that should result in a PASS when
+        * passed to that provider's PrimaryAuthenticationProvider::beginPrimaryAccountCreation().
         *
-        * Returned with an AuthManager login FAIL or RESTART, this holds a request
-        * that may be passed to AuthManager::beginCreateAccount() after setting
-        * its ->returnToUrl property. It may also be passed to
+        * Returned with an AuthManager login FAIL or RESTART, this holds a
+        * CreateFromLoginAuthenticationRequest that may be passed to
+        * AuthManager::beginCreateAccount(), possibly in place of any
+        * "primary-required" requests. It may also be passed to
         * AuthManager::beginAuthentication() to preserve state.
         */
        public $createRequest = null;
index 180aaae..57f1e6b 100644 (file)
@@ -50,7 +50,10 @@ class ConfirmLinkSecondaryAuthenticationProvider extends AbstractSecondaryAuthen
                if ( !is_array( $state ) ) {
                        return AuthenticationResponse::newAbstain();
                }
-               $maybeLink = $state['maybeLink'];
+
+               $maybeLink = array_filter( $state['maybeLink'], function ( $req ) {
+                       return $this->manager->allowsAuthenticationDataChange( $req )->isGood();
+               } );
                if ( !$maybeLink ) {
                        return AuthenticationResponse::newAbstain();
                }
@@ -134,7 +137,7 @@ class ConfirmLinkSecondaryAuthenticationProvider extends AbstractSecondaryAuthen
                                $combinedStatus->error( wfMessage( 'authprovider-confirmlink-success-line', $description ) );
                        } else {
                                $combinedStatus->error( wfMessage(
-                                       'authprovider-confirmlink-failure-line', $description, $status->getMessage()->text()
+                                       'authprovider-confirmlink-failed-line', $description, $status->getMessage()->text()
                                ) );
                        }
                }
index 949302d..ddeb13d 100644 (file)
@@ -25,7 +25,8 @@ namespace MediaWiki\Auth;
  * This transfers state between the login and account creation flows.
  *
  * AuthManager::getAuthenticationRequests() won't return this type, but it
- * may be passed to AuthManager::beginAccountCreation() anyway.
+ * may be passed to AuthManager::beginAuthentication() or
+ * AuthManager::beginAccountCreation() anyway.
  *
  * @ingroup Auth
  * @since 1.27
@@ -50,6 +51,7 @@ class CreateFromLoginAuthenticationRequest extends AuthenticationRequest {
        ) {
                $this->createRequest = $createRequest;
                $this->maybeLink = $maybeLink;
+               $this->username = $createRequest ? $createRequest->username : null;
        }
 
        public function getFieldInfo() {
@@ -59,4 +61,36 @@ class CreateFromLoginAuthenticationRequest extends AuthenticationRequest {
        public function loadFromSubmission( array $data ) {
                return true;
        }
+
+       /**
+        * Indicate whether this request contains any state for the specified
+        * action.
+        * @param string $action One of the AuthManager::ACTION_* constants
+        * @return boolean
+        */
+       public function hasStateForAction( $action ) {
+               switch ( $action ) {
+                       case AuthManager::ACTION_LOGIN:
+                               return (bool)$this->maybeLink;
+                       case AuthManager::ACTION_CREATE:
+                               return $this->maybeLink || $this->createRequest;
+                       default:
+                               return false;
+               }
+       }
+
+       /**
+        * Indicate whether this request contains state for the specified
+        * action sufficient to replace other primary-required requests.
+        * @param string $action One of the AuthManager::ACTION_* constants
+        * @return boolean
+        */
+       public function hasPrimaryStateForAction( $action ) {
+               switch ( $action ) {
+                       case AuthManager::ACTION_CREATE:
+                               return (bool)$this->createRequest;
+                       default:
+                               return false;
+               }
+       }
 }
index 1711aec..146470e 100644 (file)
@@ -10,6 +10,8 @@ class CreationReasonAuthenticationRequest extends AuthenticationRequest {
        /** @var string Account creation reason (only used when creating for someone else) */
        public $reason;
 
+       public $required = self::OPTIONAL;
+
        public function getFieldInfo() {
                return [
                        'reason' => [
index a7dd570..04d2524 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Cache
  */
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class representing a list of titles
@@ -116,7 +117,7 @@ class LinkBatch {
         * @return array Mapping PDBK to ID
         */
        public function execute() {
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
 
                return $this->executeInto( $linkCache );
        }
@@ -151,23 +152,26 @@ class LinkBatch {
                        return [];
                }
 
+               $titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
                // For each returned entry, add it to the list of good links, and remove it from $remaining
 
                $ids = [];
                $remaining = $this->data;
                foreach ( $res as $row ) {
-                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                       $title = new TitleValue( (int)$row->page_namespace, $row->page_title );
                        $cache->addGoodLinkObjFromRow( $title, $row );
-                       $ids[$title->getPrefixedDBkey()] = $row->page_id;
+                       $pdbk = $titleFormatter->getPrefixedDBkey( $title );
+                       $ids[$pdbk] = $row->page_id;
                        unset( $remaining[$row->page_namespace][$row->page_title] );
                }
 
                // The remaining links in $data are bad links, register them as such
                foreach ( $remaining as $ns => $dbkeys ) {
                        foreach ( $dbkeys as $dbkey => $unused ) {
-                               $title = Title::makeTitle( $ns, $dbkey );
+                               $title = new TitleValue( (int)$ns, $dbkey );
                                $cache->addBadLinkObj( $title );
-                               $ids[$title->getPrefixedDBkey()] = 0;
+                               $pdbk = $titleFormatter->getPrefixedDBkey( $title );
+                               $ids[$pdbk] = 0;
                        }
                }
 
@@ -218,7 +222,7 @@ class LinkBatch {
                        return false;
                }
 
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $genderCache->doLinkBatch( $this->data, $this->caller );
 
                return true;
index de44f9b..3fd29f3 100644 (file)
@@ -230,7 +230,9 @@ class LinkCache {
         */
        public function addLinkObj( LinkTarget $nt ) {
                $key = $this->titleFormatter->getPrefixedDBkey( $nt );
-               if ( $this->isBadLink( $key ) || $nt->isExternal() ) {
+               if ( $this->isBadLink( $key ) || $nt->isExternal()
+                       || $nt->inNamespace( NS_SPECIAL )
+               ) {
                        return 0;
                }
                $id = $this->getGoodLinkID( $key );
index b938ff0..9948040 100644 (file)
@@ -21,6 +21,8 @@
  *
  * @file
  */
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 class ChangesList extends ContextSource {
        /**
@@ -39,6 +41,11 @@ class ChangesList extends ContextSource {
        /** @var BagOStuff */
        protected $watchMsgCache;
 
+       /**
+        * @var LinkRenderer
+        */
+       protected $linkRenderer;
+
        /**
         * Changeslist constructor
         *
@@ -54,6 +61,7 @@ class ChangesList extends ContextSource {
                }
                $this->preCacheMessages();
                $this->watchMsgCache = new HashBagOStuff( [ 'maxKeys' => 50 ] );
+               $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
        }
 
        /**
@@ -337,8 +345,10 @@ class ChangesList extends ContextSource {
         */
        public function insertLog( &$s, $title, $logtype ) {
                $page = new LogPage( $logtype );
-               $logname = $page->getName()->setContext( $this->getContext() )->escaped();
-               $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
+               $logname = $page->getName()->setContext( $this->getContext() )->text();
+               $s .= $this->msg( 'parentheses' )->rawParams(
+                       $this->linkRenderer->makeKnownLink( $title, $logname )
+               )->escaped();
        }
 
        /**
@@ -363,9 +373,9 @@ class ChangesList extends ContextSource {
                                'oldid' => $rc->mAttribs['rc_last_oldid']
                        ];
 
-                       $diffLink = Linker::linkKnown(
+                       $diffLink = $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
-                               $this->message['diff'],
+                               new HtmlArmor( $this->message['diff'] ),
                                [],
                                $query
                        );
@@ -375,9 +385,9 @@ class ChangesList extends ContextSource {
                } else {
                        $diffhist = $diffLink . $this->message['pipe-separator'];
                        # History link
-                       $diffhist .= Linker::linkKnown(
+                       $diffhist .= $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
-                               $this->message['hist'],
+                               new HtmlArmor( $this->message['hist'] ),
                                [],
                                [
                                        'curid' => $rc->mAttribs['rc_cur_id'],
@@ -415,7 +425,7 @@ class ChangesList extends ContextSource {
                        $params = [ 'redirect' => 'no' ];
                }
 
-               $articlelink = Linker::link(
+               $articlelink = $this->linkRenderer->makeLink(
                        $rc->getTitle(),
                        null,
                        [ 'class' => 'mw-changeslist-title' ],
index 1070877..099a295 100644 (file)
@@ -54,7 +54,8 @@ class EnhancedChangesList extends ChangesList {
                // message is set by the parent ChangesList class
                $this->cacheEntryFactory = new RCCacheEntryFactory(
                        $context,
-                       $this->message
+                       $this->message,
+                       $this->linkRenderer
                );
        }
 
@@ -390,9 +391,9 @@ class EnhancedChangesList extends ChangesList {
                } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
                        $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
                } else {
-                       $link = Linker::linkKnown(
+                       $link = $this->linkRenderer->makeKnownLink(
                                $rcObj->getTitle(),
-                               $rcObj->timestamp,
+                               new HtmlArmor( $rcObj->timestamp ),
                                [],
                                $params
                        );
@@ -524,26 +525,24 @@ class EnhancedChangesList extends ChangesList {
                        ) {
                                $links['total-changes'] = $nchanges[$n];
                        } else {
-                               $links['total-changes'] = Linker::link(
+                               $links['total-changes'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
-                                       $nchanges[$n],
+                                       new HtmlArmor( $nchanges[$n] ),
                                        [],
                                        $queryParams + [
                                                'diff' => $currentRevision,
                                                'oldid' => $last->mAttribs['rc_last_oldid'],
-                                       ],
-                                       [ 'known', 'noclasses' ]
+                                       ]
                                );
                                if ( $sinceLast > 0 && $sinceLast < $n ) {
-                                       $links['total-changes-since-last'] = Linker::link(
+                                       $links['total-changes-since-last'] = $this->linkRenderer->makeKnownLink(
                                                        $block0->getTitle(),
-                                                       $sinceLastVisitMsg[$sinceLast],
+                                                       new HtmlArmor( $sinceLastVisitMsg[$sinceLast] ),
                                                        [],
                                                        $queryParams + [
                                                                'diff' => $currentRevision,
                                                                'oldid' => $unvisitedOldid,
-                                                       ],
-                                                       [ 'known', 'noclasses' ]
+                                                       ]
                                                );
                                }
                        }
@@ -558,9 +557,9 @@ class EnhancedChangesList extends ChangesList {
                        $params = $queryParams;
                        $params['action'] = 'history';
 
-                       $links['history'] = Linker::linkKnown(
+                       $links['history'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
-                                       $this->message['enhancedrc-history'],
+                                       new HtmlArmor( $this->message['enhancedrc-history'] ),
                                        [],
                                        $params
                                );
@@ -618,9 +617,11 @@ class EnhancedChangesList extends ChangesList {
                if ( $logType ) {
                        $logPage = new LogPage( $logType );
                        $logTitle = SpecialPage::getTitleFor( 'Log', $logType );
-                       $logName = $logPage->getName()->escaped();
+                       $logName = $logPage->getName()->text();
                        $data['logLink'] = $this->msg( 'parentheses' )
-                               ->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
+                               ->rawParams(
+                                       $this->linkRenderer->makeKnownLink( $logTitle, $logName )
+                               )->escaped();
                } else {
                        $data['articleLink'] = $this->getArticleLink( $rcObj, $rcObj->unpatrolled, $rcObj->watched );
                }
@@ -710,9 +711,10 @@ class EnhancedChangesList extends ChangesList {
                }
 
                $retVal = ' ' . $this->msg( 'parentheses' )
-                               ->rawParams( $rc->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
+                               ->rawParams( $rc->difflink . $this->message['pipe-separator']
+                                       . $this->linkRenderer->makeKnownLink(
                                                $pageTitle,
-                                               $this->message['hist'],
+                                               new HtmlArmor( $this->message['hist'] ),
                                                [],
                                                $query
                                        ) )->escaped();
index 549bc37..2c5c8b1 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use MediaWiki\Linker\LinkRenderer;
 
 class RCCacheEntryFactory {
 
@@ -28,13 +29,22 @@ class RCCacheEntryFactory {
        /* @var string[] */
        private $messages;
 
+       /**
+        * @var LinkRenderer
+        */
+       private $linkRenderer;
+
        /**
         * @param IContextSource $context
         * @param string[] $messages
+        * @param LinkRenderer $linkRenderer
         */
-       public function __construct( IContextSource $context, $messages ) {
+       public function __construct(
+               IContextSource $context, $messages, LinkRenderer $linkRenderer
+       ) {
                $this->context = $context;
                $this->messages = $messages;
+               $this->linkRenderer = $linkRenderer;
        }
 
        /**
@@ -99,7 +109,7 @@ class RCCacheEntryFactory {
 
                // New unpatrolled pages
                if ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
-                       $clink = Linker::linkKnown( $cacheEntry->getTitle() );
+                       $clink = $this->linkRenderer->makeKnownLink( $cacheEntry->getTitle() );
                // Log entries
                } elseif ( $type == RC_LOG ) {
                        $logType = $cacheEntry->mAttribs['rc_log_type'];
@@ -108,7 +118,7 @@ class RCCacheEntryFactory {
                                $clink = $this->getLogLink( $logType );
                        } else {
                                wfDebugLog( 'recentchanges', 'Unexpected log entry with no log type in recent changes' );
-                               $clink = Linker::link( $cacheEntry->getTitle() );
+                               $clink = $this->linkRenderer->makeLink( $cacheEntry->getTitle() );
                        }
                // Log entries (old format) and special pages
                } elseif ( $cacheEntry->mAttribs['rc_namespace'] == NS_SPECIAL ) {
@@ -116,7 +126,7 @@ class RCCacheEntryFactory {
                        $clink = '';
                // Edits
                } else {
-                       $clink = Linker::linkKnown( $cacheEntry->getTitle() );
+                       $clink = $this->linkRenderer->makeKnownLink( $cacheEntry->getTitle() );
                }
 
                return $clink;
@@ -125,10 +135,12 @@ class RCCacheEntryFactory {
        private function getLogLink( $logType ) {
                $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
                $logpage = new LogPage( $logType );
-               $logname = $logpage->getName()->escaped();
+               $logname = $logpage->getName()->text();
 
                $logLink = $this->context->msg( 'parentheses' )
-                       ->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
+                       ->rawParams(
+                               $this->linkRenderer->makeKnownLink( $logtitle, $logname )
+                       )->escaped();
 
                return $logLink;
        }
@@ -242,9 +254,9 @@ class RCCacheEntryFactory {
                if ( !$showDiffLinks || !$lastOldid || in_array( $type, $logTypes ) ) {
                        $lastLink = $lastMessage;
                } else {
-                       $lastLink = Linker::linkKnown(
+                       $lastLink = $this->linkRenderer->makeKnownLink(
                                $cacheEntry->getTitle(),
-                               $lastMessage,
+                               new HtmlArmor( $lastMessage ),
                                [],
                                $this->buildDiffQueryParams( $cacheEntry )
                        );
index a374b13..27f917b 100644 (file)
@@ -155,6 +155,11 @@ class IcuCollation extends Collation {
                'smn' => [ "Á", "Č", "Đ", "Ŋ", "Š", "Ŧ", "Ž", "Æ", "Ø", "Å", "Ä", "Ö" ],
                'sq' => [ "Ç", "Dh", "Ë", "Gj", "Ll", "Nj", "Rr", "Sh", "Th", "Xh", "Zh" ],
                'sr' => [],
+               'ta' => [
+                       "\xE0\xAE\x82", "ஃ", "க்ஷ", "க்", "ங்", "ச்", "ஞ்", "ட்", "ண்", "த்", "ந்",
+                       "ப்", "ம்", "ய்", "ர்", "ல்", "வ்", "ழ்", "ள்", "ற்", "ன்", "ஜ்", "ஶ்", "ஷ்",
+                       "ஸ்", "ஹ்", "க்ஷ்"
+               ],
                'tk' => [ "Ç", "Ä", "Ž", "Ň", "Ö", "Ş", "Ü", "Ý" ],
                'tl' => [ "Ñ", "Ng" ],
                'tr' => [ "Ç", "Ğ", "İ", "Ö", "Ş", "Ü" ],
@@ -188,20 +193,11 @@ class IcuCollation extends Collation {
        }
 
        public function getSortKey( $string ) {
-               // intl extension produces non null-terminated
-               // strings. Appending '' fixes it so that it doesn't generate
-               // a warning on each access in debug php.
-               MediaWiki\suppressWarnings();
-               $key = $this->mainCollator->getSortKey( $string ) . '';
-               MediaWiki\restoreWarnings();
-               return $key;
+               return $this->mainCollator->getSortKey( $string );
        }
 
        public function getPrimarySortKey( $string ) {
-               MediaWiki\suppressWarnings();
-               $key = $this->primaryCollator->getSortKey( $string ) . '';
-               MediaWiki\restoreWarnings();
-               return $key;
+               return $this->primaryCollator->getSortKey( $string );
        }
 
        public function getFirstLetter( $string ) {
index bd4238c..07b5614 100644 (file)
@@ -933,6 +933,14 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                $this->mRevision = $revision;
        }
 
+       /**
+        * @since 1.28
+        * @return null|Revision
+        */
+       public function getRevision() {
+               return $this->mRevision;
+       }
+
        /**
         * Set the User who triggered this LinksUpdate
         *
index e891c9c..de3e0ae 100644 (file)
@@ -894,6 +894,7 @@ class HTMLForm extends ContextSource {
         *  - id: (string, optional) DOM id for the button.
         *  - attribs: (array, optional) Additional HTML attributes.
         *  - flags: (string|string[], optional) OOUI flags.
+        *  - framed: (boolean=true, optional) OOUI framed attribute.
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function addButton( $data ) {
@@ -922,6 +923,7 @@ class HTMLForm extends ContextSource {
                        'id' => null,
                        'attribs' => null,
                        'flags' => null,
+                       'framed' => true,
                ];
 
                return $this;
index 711750b..e5e2d7c 100644 (file)
@@ -117,6 +117,7 @@ class OOUIHTMLForm extends HTMLForm {
                                'value' => $button['value'],
                                'label' => $label,
                                'flags' => $button['flags'],
+                               'framed' => $button['framed'],
                                'useInputTag' => $isBadIE,
                        ] + $attrs );
                }
index 799ca58..1bd3f51 100644 (file)
@@ -540,7 +540,7 @@ class MysqlInstaller extends DatabaseInstaller {
 
                        foreach ( $createHostList as $host ) {
                                $fullName = $this->buildFullUserName( $dbUser, $host );
-                               if ( !$this->userDefinitelyExists( $dbUser, $host ) ) {
+                               if ( !$this->userDefinitelyExists( $host, $dbUser ) ) {
                                        try {
                                                $this->db->begin( __METHOD__ );
                                                $this->db->query( "CREATE USER $fullName IDENTIFIED BY $escPass", __METHOD__ );
index b7653be..9711496 100644 (file)
@@ -244,6 +244,7 @@ class RefreshLinksJob extends Job {
                        // Needed by things like Echo notifications which need
                        // to know which user caused the links update
                        if ( $update instanceof LinksUpdate ) {
+                               $update->setRevision( $revision );
                                if ( !empty( $this->params['triggeringUser'] ) ) {
                                        $userInfo = $this->params['triggeringUser'];
                                        if ( $userInfo['userId'] ) {
index cb3acce..432dcb2 100644 (file)
@@ -52,13 +52,6 @@ class LinkRenderer {
         */
        private $expandUrls = false;
 
-       /**
-        * Whether extra classes should be added
-        *
-        * @var bool
-        */
-       private $noClasses = false;
-
        /**
         * @var int
         */
@@ -111,20 +104,6 @@ class LinkRenderer {
                return $this->expandUrls;
        }
 
-       /**
-        * @param bool $no
-        */
-       public function setNoClasses( $no ) {
-               $this->noClasses = $no;
-       }
-
-       /**
-        * @return bool
-        */
-       public function getNoClasses() {
-               return $this->noClasses;
-       }
-
        /**
         * @param int $threshold
         */
@@ -172,9 +151,6 @@ class LinkRenderer {
         */
        private function getLegacyOptions( $isKnown ) {
                $options = [ 'stubThreshold' => $this->stubThreshold ];
-               if ( $this->noClasses ) {
-                       $options[] = 'noclasses';
-               }
                if ( $this->forceArticlePath ) {
                        $options[] = 'forcearticlepath';
                }
@@ -249,14 +225,18 @@ class LinkRenderer {
        }
 
        /**
+        * If you have already looked up the proper CSS classes using Linker::getLinkColour()
+        * or some other method, use this to avoid looking it up again.
+        *
         * @param LinkTarget $target
         * @param string|HtmlArmor|null $text
+        * @param string $classes CSS classes to add
         * @param array $extraAttribs
         * @param array $query
         * @return string
         */
-       public function makeKnownLink(
-               LinkTarget $target, $text = null, array $extraAttribs = [], array $query = []
+       public function makePreloadedLink(
+               LinkTarget $target, $text = null, $classes, array $extraAttribs = [], array $query = []
        ) {
                // Run begin hook
                $ret = $this->runBeginHook( $target, $text, $extraAttribs, $query, true );
@@ -265,22 +245,7 @@ class LinkRenderer {
                }
                $target = $this->normalizeTarget( $target );
                $url = $this->getLinkURL( $target, $query );
-               $attribs = [];
-               if ( !$this->noClasses ) {
-                       $classes = [];
-                       if ( $target->isExternal() ) {
-                               $classes[] = 'extiw';
-                       }
-                       $title = Title::newFromLinkTarget( $target );
-                       $colour = Linker::getLinkColour( $title, $this->stubThreshold );
-                       if ( $colour !== '' ) {
-                               $classes[] = $colour;
-                       }
-                       if ( $classes ) {
-                               $attribs['class'] = implode( ' ', $classes );
-                       }
-               }
-
+               $attribs = [ 'class' => $classes ];
                $prefixedText = $this->titleFormatter->getPrefixedText( $target );
                if ( $prefixedText !== '' ) {
                        $attribs['title'] = $prefixedText;
@@ -297,6 +262,34 @@ class LinkRenderer {
                return $this->buildAElement( $target, $text, $attribs, true );
        }
 
+       /**
+        * @param LinkTarget $target
+        * @param string|HtmlArmor|null $text
+        * @param array $extraAttribs
+        * @param array $query
+        * @return string
+        */
+       public function makeKnownLink(
+               LinkTarget $target, $text = null, array $extraAttribs = [], array $query = []
+       ) {
+               $classes = [];
+               if ( $target->isExternal() ) {
+                       $classes[] = 'extiw';
+               }
+               $colour = Linker::getLinkColour( $target, $this->stubThreshold );
+               if ( $colour !== '' ) {
+                       $classes[] = $colour;
+               }
+
+               return $this->makePreloadedLink(
+                       $target,
+                       $text,
+                       $classes ? implode( ' ', $classes ) : '',
+                       $extraAttribs,
+                       $query
+               );
+       }
+
        /**
         * @param LinkTarget $target
         * @param string|HtmlArmor|null $text
@@ -326,7 +319,7 @@ class LinkRenderer {
                }
 
                $url = $this->getLinkURL( $target, $query );
-               $attribs = $this->noClasses ? [] : [ 'class' => 'new' ];
+               $attribs = [ 'class' => 'new' ];
                $prefixedText = $this->titleFormatter->getPrefixedText( $target );
                if ( $prefixedText !== '' ) {
                        // This ends up in parser cache!
index 3a30772..7124be1 100644 (file)
@@ -67,10 +67,6 @@ class LinkRendererFactory {
        public function createFromLegacyOptions( array $options ) {
                $linkRenderer = $this->create();
 
-               if ( in_array( 'noclasses', $options, true ) ) {
-                       $linkRenderer->setNoClasses( true );
-               }
-
                if ( in_array( 'forcearticlepath', $options, true ) ) {
                        $linkRenderer->setForceArticlePath( true );
                }
index 8575e69..1c6f404 100644 (file)
@@ -287,9 +287,10 @@ class LinkHolderArray {
                $colours = [];
                $linkCache = LinkCache::singleton();
                $output = $this->parent->getOutput();
+               $linkRenderer = $this->parent->getLinkRenderer();
+               $threshold = $linkRenderer->getStubThreshold();
 
                $dbr = wfGetDB( DB_SLAVE );
-               $threshold = $this->parent->getOptions()->getStubThreshold();
 
                # Sort by namespace
                ksort( $this->internals );
@@ -352,9 +353,6 @@ class LinkHolderArray {
                                $pdbk = $title->getPrefixedDBkey();
                                $linkCache->addGoodLinkObjFromRow( $title, $s );
                                $output->addLink( $title, $s->page_id );
-                               # @todo FIXME: Convoluted data flow
-                               # The redirect status and length is passed to getLinkColour via the LinkCache
-                               # Use formal parameters instead
                                $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
                                // add id to the extension todolist
                                $linkcolour_ids[$s->page_id] = $pdbk;
@@ -387,6 +385,8 @@ class LinkHolderArray {
                                }
                                if ( $displayText === '' ) {
                                        $displayText = null;
+                               } else {
+                                       $displayText = new HtmlArmor( $displayText );
                                }
                                if ( !isset( $colours[$pdbk] ) ) {
                                        $colours[$pdbk] = 'new';
@@ -395,15 +395,16 @@ class LinkHolderArray {
                                if ( $colours[$pdbk] == 'new' ) {
                                        $linkCache->addBadLinkObj( $title );
                                        $output->addLink( $title, 0 );
-                                       $type = [ 'broken' ];
+                                       $link = $linkRenderer->makeBrokenLink(
+                                               $title, $displayText, $attribs, $query
+                                       );
                                } else {
-                                       if ( $colours[$pdbk] != '' ) {
-                                               $attribs['class'] = $colours[$pdbk];
-                                       }
-                                       $type = [ 'known', 'noclasses' ];
+                                       $link = $linkRenderer->makePreloadedLink(
+                                               $title, $displayText, $colours[$pdbk], $attribs, $query
+                                       );
                                }
-                               $replacePairs[$searchkey] = Linker::link( $title, $displayText,
-                                               $attribs, $query, $type );
+
+                               $replacePairs[$searchkey] = $link;
                        }
                }
                $replacer = new HashtableReplacer( $replacePairs, 1 );
@@ -429,11 +430,12 @@ class LinkHolderArray {
                # Make interwiki link HTML
                $output = $this->parent->getOutput();
                $replacePairs = [];
-               $options = [
-                       'stubThreshold' => $this->parent->getOptions()->getStubThreshold(),
-               ];
+               $linkRenderer = $this->parent->getLinkRenderer();
                foreach ( $this->interwikis as $key => $link ) {
-                       $replacePairs[$key] = Linker::link( $link['title'], $link['text'], [], [], $options );
+                       $replacePairs[$key] = $linkRenderer->makeLink(
+                               $link['title'],
+                               new HtmlArmor( $link['text'] )
+                       );
                        $output->addInterwikiLink( $link['title'] );
                }
                $replacer = new HashtableReplacer( $replacePairs, 1 );
@@ -573,9 +575,6 @@ class LinkHolderArray {
                                                $entry['pdbk'] = $varPdbk;
 
                                                // set pdbk and colour
-                                               # @todo FIXME: Convoluted data flow
-                                               # The redirect status and length is passed to getLinkColour via the LinkCache
-                                               # Use formal parameters instead
                                                $colours[$varPdbk] = Linker::getLinkColour( $variantTitle, $threshold );
                                                $linkcolour_ids[$s->page_id] = $pdbk;
                                        }
index b5e5d80..17098f7 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  * @ingroup Parser
  */
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 /**
  * @defgroup Parser Parser
@@ -248,6 +250,11 @@ class Parser {
        /** @var SectionProfiler */
        protected $mProfiler;
 
+       /**
+        * @var LinkRenderer
+        */
+       protected $mLinkRenderer;
+
        /**
         * @param array $conf
         */
@@ -888,6 +895,24 @@ class Parser {
                return $this->mPreprocessor;
        }
 
+       /**
+        * Get a LinkRenderer instance to make links with
+        *
+        * @since 1.28
+        * @return LinkRenderer
+        */
+       public function getLinkRenderer() {
+               if ( !$this->mLinkRenderer ) {
+                       $this->mLinkRenderer = MediaWikiServices::getInstance()
+                               ->getLinkRendererFactory()->create();
+                       $this->mLinkRenderer->setStubThreshold(
+                               $this->getOptions()->getStubThreshold()
+                       );
+               }
+
+               return $this->mLinkRenderer;
+       }
+
        /**
         * Replaces all occurrences of HTML-style comments and the given tags
         * in the text with a random marker and returns the next text. The output
@@ -2329,7 +2354,7 @@ class Parser {
                        # batch file existence checks for NS_FILE and NS_MEDIA
                        if ( $iw == '' && $nt->isAlwaysKnown() ) {
                                $this->mOutput->addLink( $nt );
-                               $s .= $this->makeKnownLinkHolder( $nt, $text, [], $trail, $prefix );
+                               $s .= $this->makeKnownLinkHolder( $nt, $text, $trail, $prefix );
                        } else {
                                # Links will be added to the output link list after checking
                                $s .= $holders->makeHolder( $nt, $text, [], $trail, $prefix );
@@ -2347,22 +2372,20 @@ class Parser {
         *
         * @param Title $nt
         * @param string $text
-        * @param array|string $query
         * @param string $trail
         * @param string $prefix
         * @return string HTML-wikitext mix oh yuck
         */
-       public function makeKnownLinkHolder( $nt, $text = '', $query = [], $trail = '', $prefix = '' ) {
+       protected function makeKnownLinkHolder( $nt, $text = '', $trail = '', $prefix = '' ) {
                list( $inside, $trail ) = Linker::splitTrail( $trail );
 
-               if ( is_string( $query ) ) {
-                       $query = wfCgiToArray( $query );
-               }
                if ( $text == '' ) {
                        $text = htmlspecialchars( $nt->getPrefixedText() );
                }
 
-               $link = Linker::linkKnown( $nt, "$prefix$text$inside", [], $query );
+               $link = $this->getLinkRenderer()->makeKnownLink(
+                       $nt, new HtmlArmor( "$prefix$text$inside" )
+               );
 
                return $this->armorLinks( $link ) . $trail;
        }
index 29878d4..719f905 100644 (file)
@@ -384,7 +384,7 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
         * @return string[] Encryption key, HMAC key
         */
        private function getSecretKeys() {
-               global $wgSessionSecret, $wgSecretKey;
+               global $wgSessionSecret, $wgSecretKey, $wgSessionPbkdf2Iterations;
 
                $wikiSecret = $wgSessionSecret ?: $wgSecretKey;
                $userSecret = $this->get( 'wsSessionSecret', null );
@@ -392,14 +392,51 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                        $userSecret = \MWCryptRand::generateHex( 32 );
                        $this->set( 'wsSessionSecret', $userSecret );
                }
+               $iterations = $this->get( 'wsSessionPbkdf2Iterations', null );
+               if ( $iterations === null ) {
+                       $iterations = $wgSessionPbkdf2Iterations;
+                       $this->set( 'wsSessionPbkdf2Iterations', $iterations );
+               }
 
-               $keymats = hash_pbkdf2( 'sha256', $wikiSecret, $userSecret, 10001, 64, true );
+               $keymats = hash_pbkdf2( 'sha256', $wikiSecret, $userSecret, $iterations, 64, true );
                return [
                        substr( $keymats, 0, 32 ),
                        substr( $keymats, 32, 32 ),
                ];
        }
 
+       /**
+        * Decide what type of encryption to use, based on system capabilities.
+        * @return array
+        */
+       private function getEncryptionAlgorithm() {
+               global $wgSessionInsecureSecrets;
+
+               if (
+                       function_exists( 'openssl_encrypt' )
+                       && in_array( 'aes-256-ctr', openssl_get_cipher_methods(), true )
+               ) {
+                       return [ 'openssl', 'aes-256-ctr' ];
+               } elseif (
+                       function_exists( 'mcrypt_encrypt' )
+                       && in_array( 'rijndael-128', mcrypt_list_algorithms(), true )
+                       && in_array( 'ctr', mcrypt_list_modes(), true )
+               ) {
+                       return [ 'mcrypt', 'rijndael-128', 'ctr' ];
+               } elseif ( $wgSessionInsecureSecrets ) {
+                       // @todo: import a pure-PHP library for AES instead of this
+                       return [ 'insecure' ];
+               } else {
+                       throw new \BadMethodCallException(
+                               'Encryption is not available. You really should install the PHP OpenSSL extension, ' .
+                               'or failing that the mcrypt extension. But if you really can\'t and you\'re willing ' .
+                               'to accept insecure storage of sensitive session data, set ' .
+                               '$wgSessionInsecureSecrets = true in LocalSettings.php to make this exception go away.'
+                       );
+               }
+
+       }
+
        /**
         * Set a value in the session, encrypted
         *
@@ -409,8 +446,6 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
         * @param mixed $value
         */
        public function setSecret( $key, $value ) {
-               global $wgSessionInsecureSecrets;
-
                list( $encKey, $hmacKey ) = $this->getSecretKeys();
                $serialized = serialize( $value );
 
@@ -420,27 +455,27 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                // Encrypt
                // @todo: import a pure-PHP library for AES instead of doing $wgSessionInsecureSecrets
                $iv = \MWCryptRand::generate( 16, true );
-               if ( function_exists( 'openssl_encrypt' ) ) {
-                       $ciphertext = openssl_encrypt( $serialized, 'aes-256-ctr', $encKey, OPENSSL_RAW_DATA, $iv );
-                       if ( $ciphertext === false ) {
-                               throw new UnexpectedValueException( 'Encryption failed: ' . openssl_error_string() );
-                       }
-               } elseif ( function_exists( 'mcrypt_encrypt' ) ) {
-                       $ciphertext = mcrypt_encrypt( 'rijndael-128', $encKey, $serialized, 'ctr', $iv );
-                       if ( $ciphertext === false ) {
-                               throw new UnexpectedValueException( 'Encryption failed' );
-                       }
-               } elseif ( $wgSessionInsecureSecrets ) {
-                       $ex = new \Exception( 'No encryption is available, storing data as plain text' );
-                       $this->logger->warning( $ex->getMessage(), [ 'exception' => $ex ] );
-                       $ciphertext = $serialized;
-               } else {
-                       throw new \BadMethodCallException(
-                               'Encryption is not available. You really should install the PHP OpenSSL extension, ' .
-                               'or failing that the mcrypt extension. But if you really can\'t and you\'re willing ' .
-                               'to accept insecure storage of sensitive session data, set ' .
-                               '$wgSessionInsecureSecrets = true in LocalSettings.php to make this exception go away.'
-                       );
+               $algorithm = $this->getEncryptionAlgorithm();
+               switch ( $algorithm[0] ) {
+                       case 'openssl':
+                               $ciphertext = openssl_encrypt( $serialized, $algorithm[1], $encKey, OPENSSL_RAW_DATA, $iv );
+                               if ( $ciphertext === false ) {
+                                       throw new \UnexpectedValueException( 'Encryption failed: ' . openssl_error_string() );
+                               }
+                               break;
+                       case 'mcrypt':
+                               $ciphertext = mcrypt_encrypt( $algorithm[1], $encKey, $serialized, $algorithm[2], $iv );
+                               if ( $ciphertext === false ) {
+                                       throw new \UnexpectedValueException( 'Encryption failed' );
+                               }
+                               break;
+                       case 'insecure':
+                               $ex = new \Exception( 'No encryption is available, storing data as plain text' );
+                               $this->logger->warning( $ex->getMessage(), [ 'exception' => $ex ] );
+                               $ciphertext = $serialized;
+                               break;
+                       default:
+                               throw new \LogicException( 'invalid algorithm' );
                }
 
                // Seal
@@ -459,8 +494,6 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
         * @return mixed
         */
        public function getSecret( $key, $default = null ) {
-               global $wgSessionInsecureSecrets;
-
                // Fetch
                $encrypted = $this->get( $key, null );
                if ( $encrypted === null ) {
@@ -488,38 +521,35 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                }
 
                // Decrypt
-               // @todo: import a pure-PHP library for AES instead of doing $wgSessionInsecureSecrets
-               if ( function_exists( 'openssl_decrypt' ) ) {
-                       $serialized = openssl_decrypt(
-                               base64_decode( $ciphertext ), 'aes-256-ctr', $encKey, OPENSSL_RAW_DATA, base64_decode( $iv )
-                       );
-                       if ( $serialized === false ) {
-                               $ex = new \Exception( 'Decyption failed: ' . openssl_error_string() );
-                               $this->logger->debug( $ex->getMessage(), [ 'exception' => $ex ] );
-                               return $default;
-                       }
-               } elseif ( function_exists( 'mcrypt_decrypt' ) ) {
-                       $serialized = mcrypt_decrypt(
-                               'rijndael-128', $encKey, base64_decode( $ciphertext ), 'ctr', base64_decode( $iv )
-                       );
-                       if ( $serialized === false ) {
-                               $ex = new \Exception( 'Decyption failed' );
-                               $this->logger->debug( $ex->getMessage(), [ 'exception' => $ex ] );
-                               return $default;
-                       }
-               } elseif ( $wgSessionInsecureSecrets ) {
-                       $ex = new \Exception(
-                               'No encryption is available, retrieving data that was stored as plain text'
-                       );
-                       $this->logger->warning( $ex->getMessage(), [ 'exception' => $ex ] );
-                       $serialized = base64_decode( $ciphertext );
-               } else {
-                       throw new \BadMethodCallException(
-                               'Encryption is not available. You really should install the PHP OpenSSL extension, ' .
-                               'or failing that the mcrypt extension. But if you really can\'t and you\'re willing ' .
-                               'to accept insecure storage of sensitive session data, set ' .
-                               '$wgSessionInsecureSecrets = true in LocalSettings.php to make this exception go away.'
-                       );
+               $algorithm = $this->getEncryptionAlgorithm();
+               switch ( $algorithm[0] ) {
+                       case 'openssl':
+                               $serialized = openssl_decrypt( base64_decode( $ciphertext ), $algorithm[1], $encKey,
+                                       OPENSSL_RAW_DATA, base64_decode( $iv ) );
+                               if ( $serialized === false ) {
+                                       $ex = new \Exception( 'Decyption failed: ' . openssl_error_string() );
+                                       $this->logger->debug( $ex->getMessage(), [ 'exception' => $ex ] );
+                                       return $default;
+                               }
+                               break;
+                       case 'mcrypt':
+                               $serialized = mcrypt_decrypt( $algorithm[1], $encKey, base64_decode( $ciphertext ),
+                                       $algorithm[2], base64_decode( $iv ) );
+                               if ( $serialized === false ) {
+                                       $ex = new \Exception( 'Decyption failed' );
+                                       $this->logger->debug( $ex->getMessage(), [ 'exception' => $ex ] );
+                                       return $default;
+                               }
+                               break;
+                       case 'insecure':
+                               $ex = new \Exception(
+                                       'No encryption is available, retrieving data that was stored as plain text'
+                               );
+                               $this->logger->warning( $ex->getMessage(), [ 'exception' => $ex ] );
+                               $serialized = base64_decode( $ciphertext );
+                               break;
+                       default:
+                               throw new \LogicException( 'invalid algorithm' );
                }
 
                $value = unserialize( $serialized );
index bd6b08f..8dff163 100644 (file)
@@ -47,6 +47,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
        protected $mEntryErrorType = 'error';
 
        protected $mLoaded = false;
+       protected $mLoadedRequest = false;
        protected $mSecureLoginUrl;
 
        /** @var string */
@@ -89,19 +90,20 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $wgUseMediaWikiUIEverywhere = true;
        }
 
+       protected function setRequest( array $data, $wasPosted = null ) {
+               parent::setRequest( $data, $wasPosted );
+               $this->mLoadedRequest = false;
+       }
+
        /**
-        * Load data from request.
-        * @private
-        * @param string $subPage Subpage of Special:Userlogin
+        * Load basic request parameters for this Special page.
+        * @param $subPage
         */
-       protected function load( $subPage ) {
-               global $wgSecureLogin;
-
-               if ( $this->mLoaded ) {
+       private function loadRequestParameters( $subPage ) {
+               if ( $this->mLoadedRequest ) {
                        return;
                }
-               $this->mLoaded = true;
-
+               $this->mLoadedRequest = true;
                $request = $this->getRequest();
 
                $this->mPosted = $request->wasPosted();
@@ -114,6 +116,22 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $this->mLanguage = $request->getText( 'uselang' );
                $this->mReturnTo = $request->getVal( 'returnto', '' );
                $this->mReturnToQuery = $request->getVal( 'returntoquery', '' );
+       }
+
+       /**
+        * Load data from request.
+        * @private
+        * @param string $subPage Subpage of Special:Userlogin
+        */
+       protected function load( $subPage ) {
+               global $wgSecureLogin;
+
+               $this->loadRequestParameters( $subPage );
+               if ( $this->mLoaded ) {
+                       return;
+               }
+               $this->mLoaded = true;
+               $request = $this->getRequest();
 
                $securityLevel = $this->getRequest()->getText( 'force' );
                if (
@@ -185,6 +203,12 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                return $params;
        }
 
+       protected function beforeExecute( $subPage ) {
+               // finish initializing the class before processing the request - T135924
+               $this->loadRequestParameters( $subPage );
+               return parent::beforeExecute( $subPage );
+       }
+
        /**
         * @param string|null $subPage
         */
@@ -652,37 +676,26 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                if ( $wgLoginLanguageSelector && $this->mLanguage ) {
                                        $linkq .= '&uselang=' . $this->mLanguage;
                                }
-                               $createOrLoginHref = $linkTitle->getLocalURL( $linkq );
-
-                               if ( $this->getUser()->isLoggedIn() ) {
-                                       $createOrLoginHtml = Html::rawElement( 'div',
-                                               [ 'class' => 'mw-ui-vform-field' ],
-                                               Html::element( 'a',
-                                                       [
-                                                               'id' => 'mw-createaccount-join',
-                                                               'href' => $createOrLoginHref,
-                                                               // put right after all auth inputs in the tab order
-                                                               'tabindex' => 100,
-                                                       ],
-                                                       $this->msg( 'userlogin-createanother' )->escaped()
-                                               )
-                                       );
-                               } else {
-                                       $createOrLoginHtml = Html::rawElement( 'div',
-                                               [ 'id' => 'mw-createaccount-cta',
-                                                       'class' => 'mw-ui-vform-field' ],
-                                               $this->msg( 'userlogin-noaccount' )->escaped()
-                                               . Html::element( 'a',
-                                                       [
-                                                               'id' => 'mw-createaccount-join',
-                                                               'href' => $createOrLoginHref,
-                                                               'class' => 'mw-ui-button',
-                                                               'tabindex' => 100,
-                                                       ],
-                                                       $this->msg( 'userlogin-joinproject' )->escaped()
-                                               )
-                                       );
-                               }
+
+                               $loggedIn = $this->getUser()->isLoggedIn();
+                               $createOrLoginHtml = Html::rawElement( 'div',
+                                       [ 'id' => 'mw-createaccount' . ( !$loggedIn ? '-cta' : '' ),
+                                               'class' => ( $loggedIn ? 'mw-form-related-link-container' : 'mw-ui-vform-field' ) ],
+                                       ( $loggedIn ? '' : $this->msg( 'userlogin-noaccount' )->escaped() )
+                                       . Html::element( 'a',
+                                               [
+                                                       'id' => 'mw-createaccount-join' . ( $loggedIn ? '-loggedin' : '' ),
+                                                       'href' => $linkTitle->getLocalURL( $linkq ),
+                                                       'class' => ( $loggedIn ? '' : 'mw-ui-button' ),
+                                                       'tabindex' => 100,
+                                               ],
+                                               $this->msg(
+                                                       ( $this->getUser()->isLoggedIn() ?
+                                                               'userlogin-createanother' :
+                                                               'userlogin-joinproject'
+                                                       ) )->escaped()
+                                       )
+                               );
                                $form->addFooterText( $createOrLoginHtml );
                        }
                }
index d474ba5..b98ddda 100644 (file)
@@ -105,7 +105,7 @@ class SpecialSearch extends SpecialPage {
                $out = $this->getOutput();
                $out->allowClickjacking();
                $out->addModuleStyles( [
-                       'mediawiki.special', 'mediawiki.special.search', 'mediawiki.ui', 'mediawiki.ui.button',
+                       'mediawiki.special', 'mediawiki.special.search.styles', 'mediawiki.ui', 'mediawiki.ui.button',
                        'mediawiki.ui.input', 'mediawiki.widgets.SearchInputWidget.styles',
                ] );
                $this->addHelpLink( 'Help:Searching' );
@@ -1241,16 +1241,19 @@ class SpecialSearch extends SpecialPage {
                        'dataLocation' => 'content',
                ] );
 
+               $layout = new OOUI\ActionFieldLayout( $searchWidget, new OOUI\ButtonInputWidget( [
+                       'type' => 'submit',
+                       'label' => $this->msg( 'searchbutton' )->text(),
+                       'flags' => [ 'progressive', 'primary' ],
+               ] ), [
+                       'align' => 'top',
+               ] );
+
                $out =
                        Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
                        Html::hidden( 'profile', $this->profile ) .
                        Html::hidden( 'fulltext', 'Search' ) .
-                       $searchWidget .
-                       new OOUI\ButtonInputWidget( [
-                               'type' => 'submit',
-                               'label' => $this->msg( 'searchbutton' )->text(),
-                               'flags' => [ 'progressive', 'primary' ],
-                       ] );
+                       $layout;
 
                // Results-info
                if ( $totalNum > 0 && $this->offset < $totalNum ) {
index 09111f6..4b731cb 100644 (file)
@@ -368,7 +368,7 @@ class SpecialUpload extends SpecialPage {
                $sessionKey = $this->mUpload->stashSession();
 
                // Add styles for the warning, reused from the live preview
-               $this->getOutput()->addModuleStyles( 'mediawiki.special.upload' );
+               $this->getOutput()->addModuleStyles( 'mediawiki.special.upload.styles' );
 
                $warningHtml = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n"
                        . '<div class="mw-destfile-warning"><ul>';
index 38e9ecd..a937e75 100644 (file)
@@ -105,10 +105,16 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         */
        public function formatTitle( $namespace, $text, $fragment = '', $interwiki = '' ) {
                if ( $namespace !== false ) {
-                       $namespace = $this->getNamespaceName( $namespace, $text );
+                       // Try to get a namespace name, but fallback
+                       // to empty string if it doesn't exist
+                       try {
+                               $nsName = $this->getNamespaceName( $namespace, $text );
+                       } catch ( InvalidArgumentException $e ) {
+                               $nsName = '';
+                       }
 
-                       if ( $namespace !== '' ) {
-                               $text = $namespace . ':' . $text;
+                       if ( $namespace !== 0 ) {
+                               $text = $nsName . ':' . $text;
                        }
                }
 
index 770cc08..053ac54 100644 (file)
        "confirm-unwatch-button": "Тамам",
        "confirm-unwatch-top": "Был битте күҙәтеү исемлегенән сығарырғамы?",
        "confirm-rollback-button": "Яҡшы",
+       "confirm-rollback-top": "Был биттәге үҙгәртеүҙе кире алырғамы?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← алдағы бит",
        "imgmultipagenext": "киләһе бит →",
        "authmanager-email-help": "Электрон почта адресы",
        "authmanager-realname-label": "Ысын исемегеҙ",
        "authprovider-resetpass-skip-label": "Ҡалдырып торорға",
-       "changecredentials-submit": "Үҙгәртергә",
+       "changecredentials-submit": "Иҫәп мәғлүмәттәрен үҙгәртеү",
        "changecredentials-submit-cancel": "Кире алырға",
-       "removecredentials-submit": "Юйырға",
+       "removecredentials-submit": "Ð\98Ò«Ó\99п Ð¼Ó\99Ò\93лүмÓ\99Ñ\82Ñ\82Ó\99Ñ\80ен Ñ\8eйырға",
        "removecredentials-submit-cancel": "Кире алырға"
 }
index 3936c64..a52e33b 100644 (file)
        "confirm-watch-top": "Дабавіць старонку ў спіс назірання",
        "confirm-unwatch-button": "ОК",
        "confirm-unwatch-top": "Выняць гэту старонку з вашага спіса назірання?",
+       "confirm-rollback-top": "Адкаціць праўкі гэтай старонкі?",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← папярэдняя старонка",
        "imgmultipagenext": "наступная старонка →",
        "revdelete-restricted": "пастаўленыя абмежаванні на адміністратараў",
        "revdelete-unrestricted": "знятыя абмежаванні з адміністратараў",
        "logentry-block-block": "$1 заблакірава{{GENDER:$2|ў|ла}} {{GENDER:$4|$3}} на перыяд $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|разблакаваў|разблакавала}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|памяняў|памяняла}} настройкі блакіроўкі {{GENDER:$4|$3}} на перыяд $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|памяняў|памяняла}} параметры блакіроўкі {{GENDER:$4|$3}} на перыяд $5 $6",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|імпартаваў|імпартавала}} $3 з іншай вікі",
        "logentry-move-move": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4, не пакінуўшы перасылкі",
        "logentry-move-move_redir": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4 па-над перасылкаю",
index fa75a26..dfd246e 100644 (file)
@@ -45,7 +45,7 @@
        "tog-ccmeonemails": "हमरा द्वारा अन्य सदस्यन के भेजल गइल ईमेल के कॉपी हमरो के भेजल जाय",
        "tog-diffonly": "अन्तर देखावत समय अंतर की नीचे पन्ना के सामग्री मत देखावल जाव।",
        "tog-showhiddencats": "छिपल श्रेणियन के भी देखावल जाय",
-       "tog-norollbackdiff": "सà¤\82पादन à¤°à¥\8bलबà¥\88à¤\95 à¤\95à¤\87ला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85नà¥\8dतर मत देखावल जाव",
+       "tog-norollbackdiff": "रà¥\8bलबà¥\88à¤\95 à¤\95à¤\87ला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85à¤\82तर मत देखावल जाव",
        "tog-useeditwarning": "जो हम कौनों पन्ना पर संपादन करत घरी परिवर्तन के बिना सहेजले छोड़ देईं त हमके खबर कइल जाव",
        "tog-prefershttps": "जब खाता में लॉगिन करीं त हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
        "underline-always": "हमेशा",
        "morenotlisted": "इ सूची पूर्ण नइखे।",
        "mypage": "पन्ना",
        "mytalk": "हमार बातचीत पन्ना",
-       "anontalk": "à¤\87 à¤\86à¤\87॰पà¥\80 à¤\96ातिर à¤µà¤¾à¤°à¥\8dता",
+       "anontalk": "बातà¤\9aà¥\80त",
        "navigation": "नेविगेशन",
        "and": "&#32;अउर",
        "qbfind": "खोज",
        "nstab-template": "टेम्पलेट",
        "nstab-help": "मदद पन्ना",
        "nstab-category": "श्रेणी",
+       "mainpage-nstab": "मुख्य पन्ना",
        "nosuchaction": "अईसन कौनो कार्रवाई नाहि",
        "nosuchactiontext": "इ यू॰आर॰एल द्वारा निर्दिष्ट क्रिया अवैध बा।\nरउआ यू॰आर॰एल गलत लिखले होखब, या कउनो गलत कड़ी के प्रयोग कइले होखब।\nइ {{SITENAME}} के सॉफ़्टवेयर में त्रुटि भी हो सकत बा।",
        "nosuchspecialpage": "अईसन कौनो ख़ाश पन्ना नाहि",
        "laggedslavemode": "'''चेतावनी:''' इ पन्ना पर हाल के बदलाव ना होखे के आशंका बा।",
        "readonly": "डेटाबेस लॉक बा",
        "enterlockreason": "लॉक करे के कारण दिहीं, साथे लॉक खुले के समय के लगभग आकलन दिहीं।",
-       "readonlytext": "शायद à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dस à¤\95à¥\87 à¤\9aलतà¥\87 à¤¡à¤¾à¤\9fाबà¥\87स à¤¨à¤¯à¤¾ à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤¬à¤¦à¤²à¤¾à¤µ à¤¸à¥\87 à¤²à¥\89à¤\95 à¤\95रल à¤\97à¤\88ल à¤¬à¤¾, à¤\9cà¥\87à¤\95रा à¤¬à¤¾à¤¦ à¤\87 à¤\95à¥\87 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤¸à¥\8dथितà¥\80 à¤®à¥\87à¤\82 à¤\86 à¤\9cायà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82।\n\nà¤\9cà¤\89न à¤ªà¥\8dरबनà¥\8dधà¤\95 à¤\87 à¤\95à¥\87 à¤²à¥\89à¤\95 à¤\95à¤\87लà¥\87 à¤°à¤¹à¤²à¤¨ à¤\89 à¤¹à¤\87 à¤\95ारण à¤¦à¥\87हलà¥\87 à¤¬à¤¾à¤¡à¤¼à¤¨: $1",
+       "readonlytext": "डाà¤\9fाबà¥\87स à¤¨à¤¯à¤¾ à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤¬à¤¦à¤²à¤¾à¤µ à¤\96ातिर à¤²à¥\89à¤\95 à¤\95रल à¤\97à¤\87ल à¤¬à¤¾, à¤¶à¤¾à¤¯à¤¦ à¤°à¥\81à¤\9fà¥\80न à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dस à¤\95à¥\87 à¤\9aलतà¥\87, à¤\9cà¥\87à¤\95रा à¤¬à¤¾à¤¦ à¤\8f à¤\95à¥\87 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤¸à¥\8dथितà¥\80 à¤®à¥\87à¤\82 à¤\86 à¤\9cायà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82।\n\nà¤\9cà¤\89न à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरबà¤\82धà¤\95 à¤\8fह à¤\95à¥\87 à¤²à¥\89à¤\95 à¤\95à¤\87लà¥\87 à¤°à¤¹à¤²à¤¨ à¤\95ारण à¤¦à¥\87हलà¥\87 à¤¬à¤¾à¤¡à¤¼à¤¨ à¤\95ि: $1",
        "missing-article": "डेटाबास ऊ पन्ना के पाठ्य के ना खोज पाईल जौन ई के खोजे के रहल, नामित \"$1\" $2.\nई सब साधारणत: निम्नलिखीत अप्रचलित अन्तर अथवा एगो पन्ना पर इतिहास के लिंक जौन मिटा दिहल गईल बा के कारण भईल।\n\nयदि ई बात नईखे, त हो सकत बा सॉफ्टवेयर में बग पावत होखब।\nकृपया ई एगो  [[Special:ListUsers/sysop|प्रबन्धक]] के यू आर एल के बारे में एगो नोट बनाके खबर करीं।",
        "missingarticle-rev": "(संशोधन#: $1)",
        "missingarticle-diff": "(अंतर: $1, $2)",
        "nocookieslogin": "{{SITENAME}} प्रयोगकर्ता लोग के खाता में प्रवेश करावे खातिर कुकिज के प्रयोग करेला।\nराउर कुकिज असक्षम बा।\nकृपया उ के सक्षम करीं आ फिर से कोशिश करीं",
        "nocookiesfornew": "स्रोत के पुष्टि ना हो पावे के कारण इ खाता निर्मित ना करल गइल। \nसुनिश्चित करीं कि रउआ कुकीज़ सक्षम कइले बानी, पृष्ठ के पुनः लोड करीं आ पुनः प्रयास करीं।",
        "noname": "रउआ उपयुक्त प्रयोगकर्ता नाम नईखीं निर्दिष्ट कईले।",
-       "loginsuccesstitle": "à¤\96ाता à¤ªà¥\8dरवà¥\87श à¤®à¥\87à¤\82 à¤¸à¤«à¤²",
+       "loginsuccesstitle": "लà¥\89à¤\97िन à¤ªà¥\82रा",
        "loginsuccess": "''' \"$1\" के रुप में रउआ {{SITENAME}} में अब प्रवेश कर चुकल बानी।'''",
-       "nosuchuser": "\"$1\" à¤¨à¤¾à¤® à¤¸à¥\87 à¤\95à¥\8cनà¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤\88à¤\96न।\nपà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¸à¤\82वà¥\87दनशà¥\80ल à¤®à¤¾à¤®à¤²à¤¾ à¤¬à¤¾à¥¤\nशबà¥\8dद-वरà¥\8dतनà¥\80 à¤\95à¥\87 à¤\9cाà¤\81à¤\9a à¤\95रà¥\80à¤\82, à¤\86 à¤\9aाहà¥\87 [[Special:CreateAccount|एगो नया खाता बनाईं]]।",
+       "nosuchuser": "\"$1\" à¤¨à¤¾à¤\81व à¤\95à¥\87 à¤\95à¥\8cनà¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤\87à¤\96न।\nपà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¸à¤\82वà¥\87दनशà¥\80ल à¤®à¤¾à¤®à¤²à¤¾ à¤¬à¤¾à¥¤\nशबà¥\8dद à¤\86 à¤\87सà¥\8dपà¥\87लिà¤\82à¤\97 à¤\95à¥\87 à¤\9cाà¤\81à¤\9a à¤\95रà¥\80à¤\82, à¤¯à¤¾ [[Special:CreateAccount|एगो नया खाता बनाईं]]।",
        "nosuchusershort": "ई नाम से कौनो प्रयोगकर्ता नईखन \"$1\".\nआपन शब्द-वर्तनी के जाँच करीं।",
        "nouserspecified": "रउआ एगो प्रयोगकर्ता नाम निर्दिष्ट करे के बा।",
        "login-userblocked": "ई प्रयोगकर्ता के खाता निष्क्रिय हो चुकल बा। प्रवेश के आज्ञा नईखे।",
        "wrongpasswordempty": "गुप्त-शब्द खाली बा। कृपया फिर से कोशिश करीं।",
        "passwordtooshort": "गुप्त-शब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।",
        "passwordtoolong": "गुप्त-शब्द {{PLURAL:$1|$1 अक्षर}} से अधिक लमहर नइखे हो सकत।",
+       "passwordtoopopular": "अक्सरहा बीछल जाए वाला पासवर्ड ना इस्तेमाल होखी। कौनों अउरी खास अलग टाइप के पासवर्ड चुनीं।",
        "password-name-match": "राउर गुप्त-शब्द राउर प्रयोगकर्ता नाम से अलग होवे के चाहीं।",
        "password-login-forbidden": "इस सदस्यनाम आ गुप्तशब्द के प्रयोग वर्जित बा।",
        "mailmypassword": "गुप्तशब्द रिसेट करीं",
index 3e58532..49c2839 100644 (file)
        "mimesearch-summary": "এই পাতা তাদের MIME-এর ধরণের জন্য ফাইল ফিল্টার করা সক্ষম করে। ইনপুট: contenttype/subtype বা contenttype/*, উদা: <code>image/jpeg</code>।",
        "mimetype": "MIME ধরন:",
        "download": "ডাউনলোড",
-       "unwatchedpages": "নà¦\9cরà§\87 à¦¨à¦¾ à¦°à¦¾à¦\96া à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি",
+       "unwatchedpages": "নà¦\9cরà§\87 à¦¨à¦¾ à¦°à¦¾à¦\96া à¦ªà¦¾à¦¤à¦¾à¦¸à¦®à§\82হ",
        "listredirects": "তালিকা পুনর্নির্দেশগুলি",
        "listduplicatedfiles": "সদৃশ ফাইলের তালিকা",
        "listduplicatedfiles-summary": "এটি ফাইলসমূহের একটি তালিকা যেখানে একটি ফাইলের সাম্প্রতিকতম সংস্করণ অন্য আরেকটি ফাইলের সাম্প্রতিকতম সংস্করণের প্রতিলিপি। শুধু স্থানীয় ফাইল বিবেচনা করা হয়েছে।",
        "rollback-success-notify": "$1-এর সম্পাদনাগুলি বাতিল করা হয়েছে; \n$2-এর করা শেষ সংস্করণে ফেরত নেওয়া হয়েছে। [$3 পরিবর্তন দেখুন]",
        "sessionfailure-title": "সেশন পরিত্যক্ত",
        "sessionfailure": "আপনার প্রবেশ সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nঅনুগ্রহ ব্রাউজারের \"পিছনে\" বোতাম চাপুন এবং যে পাতা থেকে এসেছিলেন, তা পুনঃলোড করুন এবং আবার চেষ্টা করুন।",
+       "changecontentmodel": "একটি পাতার বিষয়বস্তুর মডেল পরিবর্তন",
        "changecontentmodel-legend": "বিষয়বস্তুর মডেল পরিবর্তন করুন",
        "changecontentmodel-title-label": "পাতার শিরোনাম",
        "changecontentmodel-model-label": "পাতার বিষয়বস্তুর প্রতিরূপ",
        "blankpage": "খালি পাতা",
        "intentionallyblankpage": "এই পাতাটি ইচ্ছা করে খালি রাখা হয়েছে",
        "external_image_whitelist": "  #এই লাইন ঠিক যেমন আছে<প্রাক> তেমন রাখুন<pre>\n #রেগুলার এক্সপ্রেশনের টুকরা নীচে (শুধুমাত্র অংশ / / মধ্যে যে যায়) বসান\n#এইগুলি এক্সটার্নাল (hotlinked) ইমেজের URL-এর সাথে মেলানো হবে\n#যেগুলি মিলবে, সেগুলি চিত্র হিসাবে প্রদর্শিত হবে, অন্যথায় শুধুমাত্র ইমেজ লিঙ্ক প্রদর্শিত হবে\n#যে লাইনের প্রারম্ভে # আছে সেই লাইনগুলি মন্তব্যসমূহ হিসাবে ব্যবহার করা হয়\n#এটি কেস-অসংবেদী\n\n#এই রেখার উপরের regex টুকরা বসান. এই লাইন ঠিক যেমন আছে তেমন রাখুন</pre>",
-       "tags": "সঠিà¦\95 à¦\9aà§\87à¦\9eà§\8dà¦\9c ট্যাগ",
+       "tags": "বà§\88ধ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন ট্যাগ",
        "tag-filter": "[[Special:Tags|ট্যাগ]] ছাকনী:",
        "tag-filter-submit": "ছাকনী",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ট্যাগ}}]]: $2)",
        "authprovider-resetpass-skip-help": "পাসওয়ার্ড পুনঃস্থাপন করা উপেক্ষা করুন।",
        "authform-wrongtoken": "ভুল টোকেন",
        "changecredentials-submit-cancel": "বাতিল",
-       "removecredentials-submit": "সরান",
+       "removecredentials-submit": "পরিà¦\9aয়পতà§\8dর à¦¸à¦°à¦¾à¦¨",
        "removecredentials-submit-cancel": "বাতিল",
        "credentialsform-account": "অ্যাকাউন্টের নাম:",
        "linkaccounts": "অ্যাকাউন্ট সংযোগ করুন"
index e4ed30f..180cb03 100644 (file)
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
        "api-error-blacklisted": "Molimo izaberite drugačiji, deskriptivniji naziv.",
-       "randomrootpage": "Slučajna root stranica"
+       "randomrootpage": "Slučajna root stranica",
+       "log-action-filter-block": "Vrsta blokiranja:",
+       "log-action-filter-delete": "Vrsta brisanja:",
+       "log-action-filter-all": "Sve",
+       "log-action-filter-block-block": "Blokiranje",
+       "log-action-filter-block-reblock": "Izmjena blokiranja",
+       "log-action-filter-block-unblock": "Deblokiranje",
+       "log-action-filter-delete-delete": "Brisanje stranice",
+       "log-action-filter-delete-restore": "Vraćanje obrisane stranice",
+       "log-action-filter-delete-event": "Brisanje unosa u zapisniku",
+       "log-action-filter-delete-revision": "Brisanje izmjene"
 }
index 40c0c0c..8d9aa55 100644 (file)
        "authmanager-link-no-primary": "Uvedené přihlašovací údaje nelze použít pro propojení účtů.",
        "authmanager-link-not-in-progress": "Propojování účtů neprobíhá nebo se ztratila data sezení. Začněte prosím znovu od začátku.",
        "authmanager-authplugin-setpass-failed-title": "Změna hesla se nezdařila",
+       "authmanager-authplugin-setpass-failed-message": "Autentizační modul změnu hesla zamítl.",
+       "authmanager-authplugin-create-fail": "Autentizační modul založení účtu zamítl.",
+       "authmanager-authplugin-setpass-denied": "Autentizační modul neumožňuje měnit hesla.",
        "authmanager-authplugin-setpass-bad-domain": "Neplatná doména.",
        "authmanager-autocreate-noperm": "Automatické zakládání účtů není povoleno.",
        "authmanager-autocreate-exception": "Automatické založení účtu je dočasně zakázáno kvůli předchozím chybám.",
        "cannotauth-not-allowed-title": "Přístup odmítnut",
        "cannotauth-not-allowed": "Nemáte oprávnění použít tuto stránku",
        "changecredentials": "Změna přihlašovacích údajů",
-       "changecredentials-submit": "Změnit",
+       "changecredentials-submit": "Změnit přihlašovací údaje",
        "changecredentials-submit-cancel": "Storno",
        "changecredentials-invalidsubpage": "$1 není platný typ přihlašovacích údajů.",
        "changecredentials-success": "Vaše přihlašovací údaje byly změněny.",
        "removecredentials": "Odstranění přihlašovacích údajů",
-       "removecredentials-submit": "Odstranit",
+       "removecredentials-submit": "Odstranit přihlašovací údaje",
        "removecredentials-submit-cancel": "Storno",
        "removecredentials-invalidsubpage": "$1 není platný typ přihlašovacích údajů.",
        "removecredentials-success": "Vaše přihlašovací údaje byly odstraněny.",
index 0981b43..d614209 100644 (file)
        "missingcommenttext": "Аяларах, тархасшăн, хăвар пĕлтерĕве çырăр.",
        "summary-preview": "Ăнлантару çапла пулĕ:",
        "subject-preview": "Статья ячĕ çапла пулĕ:",
-       "blockedtitle": "Хутшăнакана ĕçлеме чарнă",
+       "blockedtitle": "Хутшăнакана чарса хунă",
        "blockedtext": "'''Ку аккаунта е IP-адреса ĕçлеме чарнă.'''\n\n$1 администратор ĕçлеме чарнă. Сăлтавĕ çакă: ''«$2»''.\n\n* Чарнă вăхăт: $8\n* Çак вăхăтчен чарнă: $6\n* Çакна чарнă: $7\n\n$1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|администраторсем]] патне эсир çыру ярса меншĕн ĕçлеме чарнине сӳтсе явма пултаратăр.\n\nАсăрхар: [[Special:Preferences|хăвăрăн ĕнерлевсенче]] эл. почта адресне çирĕплетмен пулсан, е сайта кĕмен пулсан — администратор патне çыру яраймастăр. Администратор сире çыру яма чарнă пулсан — ку хутĕнче те çыру яраймăр.\n\nСирĕн IP-адрес — $3, чару идентификаторĕ — #$5. Çырусенче, тархасшăн, вĕсене пĕлтерĕр.",
        "blockednoreason": "сăлтавне пĕлтермен",
        "loginreqtitle": "Сайта кĕмелле",
        "linksearch-ok": "Шырамалли",
        "listusers-submit": "Кăтарт",
        "listusers-noresult": "Хутшăнакансем тупăнмарĕç.",
+       "listusers-blocked": "(чарса хунă)",
+       "activeusers-count": "$1 {{PLURAL:$1|тӳрлетни|тӳрлетнисем}} юлашки {{PLURAL:$3|кун|$3 кунсенче}}",
        "activeusers-hidesysops": "Администраторĕсене пытар",
        "listgrouprights-group": "Ушкăн",
        "listgrouprights-helppage": "Help:Ушкăн прависем",
index d85d458..84513be 100644 (file)
        "cannotauth-not-allowed-title": "Zugriff verweigert",
        "cannotauth-not-allowed": "Du bist nicht berechtigt, diese Seite zu verwenden.",
        "changecredentials": "Anmeldeinformationen ändern",
-       "changecredentials-submit": "Ändern",
+       "changecredentials-submit": "Anmeldeinformationen ändern",
        "changecredentials-submit-cancel": "Abbrechen",
        "changecredentials-invalidsubpage": "$1 ist kein gültiger Typ für Anmeldeinformationen.",
        "changecredentials-success": "Deine Anmeldeinformationen wurden geändert.",
        "removecredentials": "Anmeldeinformationen entfernen",
-       "removecredentials-submit": "Entfernen",
+       "removecredentials-submit": "Anmeldeinformationen entfernen",
        "removecredentials-submit-cancel": "Abbrechen",
        "removecredentials-invalidsubpage": "$1 ist kein gültiger Typ für Anmeldeinformationen.",
        "removecredentials-success": "Deine Anmeldeinformationen wurden entfernt.",
index 1b42105..5998e90 100644 (file)
        "december-date": "Kanun $1",
        "period-am": "AM",
        "period-pm": "PM",
-       "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriyi}}",
-       "category_header": "Pelê ke kategoriya \"$1\" derê",
+       "pagecategories": "{{PLURAL:$1|Kategori|Kategoriy}}",
+       "category_header": "Pelê ke kategoriye da \"$1\" miyan derê",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
        "category-empty": "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
        "qbedit": "Bıvurne",
        "qbpageoptions": "Ena pele",
        "qbmyoptions": "Pelê mı",
-       "faq": "PZP (Persê ke zehf persiyenê)",
+       "faq": "PZP",
        "faqpage": "Project: PZP",
        "actions": "Hereketi",
        "namespaces": "Heruna naman",
        "search": "Cı geyre",
        "searchbutton": "Cı geyre",
        "go": "Şo",
-       "searcharticle": "Şo",
+       "searcharticle": "So",
        "history": "Tarixê pele",
        "history_short": "Tarix",
        "updatedmarker": "cıkewtena mına peyêne ra dıme biyo rocane",
-       "printableversion": "Asayışê çapkerdışi",
+       "printableversion": "Versiyonê nusterin",
        "permalink": "Gıreyo jûqere",
-       "print": "Çap ke",
+       "print": "Çap kerdış",
        "view": "Bıvêne",
        "view-foreign": "$1'i bıvin",
        "edit": "Bıvurne",
        "viewhelppage": "Pela peşti bıvêne",
        "categorypage": "Pela kategoriye bıvêne",
        "viewtalkpage": "Werênayışi bıvêne",
-       "otherlanguages": "Zıwananê binan de",
+       "otherlanguages": "Yewna zıwand bıwan",
        "redirectedfrom": "(Pele da $1 ra heteneyê)",
        "redirectpagesub": "Pela berdışi",
        "redirectto": "Beno hetê:",
        "aboutpage": "Project:Heqa",
        "copyright": "Zerrekacı $1 bındı not biya.",
        "copyrightpage": "{{ns:project}}:Heqa telifi",
-       "currentevents": "Veng û vac",
+       "currentevents": "Rocani hadisey",
        "currentevents-url": "Project:Rocani hadisey",
        "disclaimers": "Redê mesuliyeti",
        "disclaimerpage": "Project:Reddê mesuliyetê bıngey",
        "mainpage": "Pela Seri",
        "mainpage-description": "Pela seri",
        "policy-url": "Project:Terzê hereketi",
-       "portal": "Portalê cemaeti",
+       "portal": "Portalê Gomey",
        "portal-url": "Project:Portalê cemaeti",
-       "privacy": "Madeyê dızdêni",
+       "privacy": "Politikay Nımnayışi",
        "privacypage": "Project:Xısusiyetê nımtışi",
        "badaccess": "Xeta mısadey",
        "badaccess-group0": "Heqa şıma çıniya, karo ke şıma waşt, bıkerê.",
        "viewsourcelink": "çımey bıvêne",
        "editsectionhint": "Leteyo ke bıvuriyo: $1",
        "toc": "Sernameyê meselan",
-       "showtoc": "bımocne",
+       "showtoc": "bıasene",
        "hidetoc": "bınımne",
        "collapsible-collapse": "Teng ke",
        "collapsible-expand": "Hera ke",
        "feed-invalid": "Qeydey cıresnayışê  beğşi nêvêreno.",
        "feed-unavailable": "Cıresnayışê şebekey çıniyê",
        "site-rss-feed": "$1 Cıresnayışê RSSi",
-       "site-atom-feed": "$1 Cıresnayışê atomi",
+       "site-atom-feed": "$1 Wari kerdena Atomi",
        "page-rss-feed": "\"$1\" Cıresnayışê RSSi",
        "page-atom-feed": "\"$1\" Cıresnayışê atomi",
        "feed-atom": "Atom",
        "createaccount-text": "Kesê, be e-posteyê şıma ra {{SITENAME}} ($4) de, ebe nameyê \"$2\" u parola \"$3\" ra yew hesab vıraşto.\nŞıma gani cı kewê u parola xo nıka bıvurnê.",
        "login-throttled": "Demekê $1 cıwa ver de şıma zah teşebbusê hesab akerdış kerd.\nBıne vındere u newe ra dest pê bıkere.",
        "login-abort-generic": "Dekewtışê şıma xırabo-terkneyayo",
+       "login-migrated-generic": "Hesabê şıma wedatiya yo u ena wiki de bamey şıma çıni yo.",
        "loginlanguagelabel": "Zıwan: $1",
        "suspicious-userlogout": "Waştişê tu ya veciyayişi kebul nibiya cunki ihtimal o ke waştiş yew browser ya zi proksiyê heripiyaye ra ameya.",
        "createacct-another-realname-tip": "Nameyo raştıkên keyfiyo.\nŞıma nameyo xoyo raştıkên ke bımocnê, seba iştırakanê karberi be ney ra istıfade beno.",
        "pt-login": "Cı kewe",
        "pt-login-button": "Cı kewe",
+       "pt-login-continue-button": "Cıkewten rê dewam ke",
        "pt-createaccount": "Hesab vıraze",
        "pt-userlogout": "Veciyayış",
        "php-mail-error-unknown": "PHP's mail() fonksiyoni de xırabin vıcyê.",
        "newpassword": "Parola newiye:",
        "retypenew": "Parola newiye tekrar ke:",
        "resetpass_submit": "Parola eyar kere u newe ra dekewe",
-       "changepassword-success": "Parola şıma be serkewtış vuriye!",
+       "changepassword-success": "Parolay şıma vuryaya!",
        "changepassword-throttled": "Şıma zaf ronıştış akerdış ke.Kerem ke verdi dekewten $1 bıpawe.",
+       "botpasswords": "Paroleyê botan",
+       "botpasswords-createnew": "Newe Paroleyê boti vıraze",
+       "botpasswords-editexisting": "Mewcud parolaye boti timar ke",
        "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 raçarne",
-       "botpasswords-label-grants-column": "Daye",
+       "botpasswords-label-grants-column": "Dayen",
+       "botpasswords-created-title": "Parolay boti vırazi yê",
+       "botpasswords-updated-title": "Parolay boti rocane yê",
+       "botpasswords-deleted-title": "Parolay boti esteri yê",
        "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",
        "passwordreset-emailsentemail": "Eke na seba hesabê şıma yew adresa e-posteyê qeydına, yew e-posteyê parola nênkerdışi rışiyeno.",
        "passwordreset-emailsent-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.",
        "passwordreset-emailerror-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1",
-       "changeemail": "E-posta adresa xo bıvurnê",
+       "changeemail": "E-posta adresa xo wedarne",
        "changeemail-header": "E-posya adresta hesabdê xo bıvurnê",
        "changeemail-no-info": "Şıma gani bıkewê pele ke derdest bıresê na pele.",
        "changeemail-oldemail": "E-postay şımawa nıkaêne:",
        "sig_tip": "İmzay şıma be morê zemani",
        "hr_tip": "Xeta verardiye (teserrufın bıgureyne/bıxebetne)",
        "summary": "Xulasa:",
-       "subject": "Mewzu/sernuşte:",
+       "subject": "Mewzu:",
        "minoredit": "No yew vurnayışo werdiyo",
        "watchthis": "Ena pele seyr ke",
        "savearticle": "Pele qeyd ke",
+       "publishpage": "Perer bıhesırne",
        "preview": "Verqayt",
        "showpreview": "Verqayti bımocne",
        "showdiff": "Vurnayışan bımocne",
        "missingcommenttext": "Cêr de jû fıkır bınusên, şıma rê zehmet.",
        "missingcommentheader": "'''Diqet:''' Şıma seba nê fıkrvaci yew mewzu/sernuşte nênuşt.\nEke şıma reyna \"{{int:savearticle}}\" bıtıknê, vırnayışê şıa bê mewzu/sernuşte do qeyd bo.",
        "summary-preview": "Verqaytê xulasa:",
-       "subject-preview": "Verqaytê mewzu/sernuştey:",
+       "subject-preview": "Verqaytê mewzu:",
+       "previewerrortext": "Verqaytê vurnayış de şıma dı xırabin amê meydan",
        "blockedtitle": "Karber blokekerdeo",
        "blockedtext": "<strong>No nameyê karberi ya zi na adresa IP blokekerdeya.</strong>\n\nVıraştoğê blokeyi: $1\nSebebê blokeyi: <em>$2</em>.\n\n* Sıftekerdena blokeyi: $8\n* Qediyayışê blokeyi: $6\n* Blokebiyaye: $7\n\nŞıma şenê  $1 de ya zi  yewna [[{{MediaWiki:Grouppage-sysop}}|administrator]]i de irtıbat kewê ke na mesela sero werênê, cemaet vırazê. \nŞıma nêşenê xısusiyetê \"karberi rê e-posta bırışe\" bıgureynê/bıxebetnê heta ke [[Special:Preferences|Tercihanê hesabi]] de yew e-posteyo ke vêreno, beli bi û şıma gureynayışê cı ra mehrum nêbiyê.\nIP adresa şımaya nıkayêne $3o û numreyê bloki #$5.\nŞıma rê zehmet, eke kewnê ra dıme, teferruatanê corênan not kerên.",
        "autoblockedtext": "IP adresê şıma otomotikmen kerda kılit, çıkı $1 verniya nê hesabi grota.\nSebebê cı zi:\n\n:''$2''\n\n* Dest pê kerdışê verni grotışi: $8\n* Qedyayişê verni grotışi: $6\n* Qayile ke bloqe bıbo: $7\n\nŞıma qayile qey weri kewtışê na mesela,  $1 ya na [[{{MediaWiki:Grouppage-sysop}}|serkaran ra]] yewi ra şenê irtibat kewê.\n\nNot, [[Special:Preferences|Tercihê karberi]] eke şıma yew e-postayo raşt nênuşt se şıma nêşenê na xususiyet ra \"karber rê e-posta bırışê\" istifade bıkeri.\n\nIP adresiya şıma yo nıkayên $3 u ID şıma yo ke musade nêdaye #$5. Eke şıma yew tehqiqat vırazeni malumatê corênan xo vira mekerê.",
        "yourdiff": "pêverronayiş",
        "copyrightwarning": "'''Recaya iqazi:'''Sita {{SITENAME}} ra iştıraqi pêro umışiya $2 zerredeyo (teferuatan rê $1 bıvênê).\n\nİştıraqê şıma, şıma qayıl niyê ke yewna merdumi kerpeyina bıvurnê ya zi yewna cayi ra vıla kerê ke, iştıraq mekewê.<br />\nFına zi qayılê ke iştıraq kewê, şıma qayılê ke şar vaco eno nuşte fılan kesi nusnayo ya zi meqemanê resmiyan ra zanayışê cı û malumatê cı esto / cayanê xoseran ra gırewtışi rê şıma garanti danê. '''Tiya de şıma werê telifi ra ke mısade nêgırewto, eserê cı tiya vıla mekerê! '''",
        "copyrightwarning2": "Ney bızanê ke nuşteyê ke şıma ruşnenê (şawenê) keyepela {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niyê kes bıvurno, nuşteyanê xo meerzê ita. <br />\nWexto ke şıma nuşteyi zi erzenê ita; şıma gani teahud bıdê koti ra ardo (qandê teferuati ra referans: $1).",
+       "editpage-cannot-use-custom-model": "Zerrekê  modelê ena peler şıma nêşenê bıvurnê",
        "longpageerror": "'''Xırab: Dergeya nuşte dê şıma nezdi {{PLURAL:$1|kilobayto|$1 kilobayto}}, feqet {{PLURAL:$2|kilobayt|$2 kilobayt}} ra vêşiyo. Qeyd biyayişê cı nêbeno'''",
        "readonlywarning": "'''Diqet: Semedê mıqayti, database kılit biyo. No sebeb ra vurnayişê şıma qayd nêbeno. Nuşteyanê şıma yewna serkar eşkeno wedaro u pey ra şıma eşkeni reyna ita de qayd bıker'''\n\nSerkar o ke kılit kerdo; no beyanat dayo: $1",
        "protectedpagewarning": "'''Diqet: No pel pawyeno, teyna serkari eşkeni bıvurni.'''\nWexta ke şıma no pel vurneni diqet bıkeri:",
        "permissionserrorstext": "Qey {{PLURAL:$1|sebebê|sebebê}} cêrini ra icazeyê şıma çin o:",
        "permissionserrorstext-withaction": "{{PLURAL:$1|Sebeba|Sebeb da}} cêri ra icazetê $2 çıniyo:",
        "recreate-moveddeleted-warn": "'''Hişyari: no pel o ke şıma vırazeni vere cû vırazyayo.'''\n\nDiqet bıkeri no vurnayişê şıma re gerek esto:",
-       "moveddeleted-notice": "Na per besternyaya.\nQeydé  besternayışi uq hewadayışi cér dé deyayo.",
+       "moveddeleted-notice": "Ena pela esteriya ya.\nQeydé  esternayışi u wedarnayışi cér dé deya yo.",
        "log-fulllog": "Temamê rocaneyi bıvine",
        "edit-hook-aborted": "Vurnayiş vınderiya.\nYew sebeb beyan nibı.",
        "edit-gone-missing": "Pel rocanebiyaye niyo.\nHewna kerde aseno.",
        "rev-deleted-event": "(fealiyetê cıkewtışi esteriyo)",
        "rev-deleted-user-contribs": "[nameyê karberi ya zi adresa IPy esteriya - vurnayış iştırakan ra nımniyo]",
        "rev-deleted-text-permission": "Çımraviyarnayışê ena pele '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
+       "rev-suppressed-text-permission": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-text-unhide": "Çımra viyarnayışê ena pele '''besterêno'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımra viyarnayışi bıvinê], eke wazenê dewam kerê.",
        "rev-suppressed-text-unhide": "Çımra viyarnayışê ena pele '''Degusneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degustış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımraviyarnayışi bıvênê], eke wazenê dewam kerê.",
        "rev-deleted-text-view": "Çımra viyarnayışê ena pele '''besternêno'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.",
        "rev-deleted-diff-view": "Jew timarkerdışê ena versiyon '''wedariyayo''.\nÎdarekarî şenê ena versiyon bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} wedarnayişî] de teferruat esto.",
        "rev-suppressed-diff-view": "Jew timarkerdışê ena versiyon '''Ploxneyış'' biyo.\nÎdarekarî eşkeno ena dif bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ploxnayış] de teferruat esto.",
        "rev-delundel": "bımocne/bınımne",
-       "rev-showdeleted": "bımocne",
+       "rev-showdeleted": "bıasene",
        "revisiondelete": "Çımraviyarnayışan bestere/peyser biya",
        "revdelete-nooldid-title": "Çımraviyarnayışo waşte nêvêreno",
        "revdelete-nooldid-text": "Şıma vıraştışê nê fonksiyoni rê ya yew çımraviyarnayışo waşte diyar nêkerdo, çımraviyarnayışo diyarkerde çıniyo, ya ki şıma wazenê ke çımraviyarnayışê nıkayêni bınımnê.",
        "revdelete-legend": "Şertanê vênayışi rone",
        "revdelete-hide-text": "Nuştey revizyoni",
        "revdelete-hide-image": "zerreyê dosyay bınımnê",
-       "revdelete-hide-name": "hedef u vaqa' bınımne",
+       "revdelete-hide-name": "hedef u parametreyan bınımne",
        "revdelete-hide-comment": "Xulasa bıvurne",
        "revdelete-hide-user": "IP asresa/namey  vırnoği",
        "revdelete-hide-restricted": "Malumatan pa serkaran u karberan ra bınım.",
        "prefs-labs": "Xacetê labs",
        "prefs-user-pages": "Pela Karberi",
        "prefs-personal": "Pela karberi",
-       "prefs-rc": "Vurnayışê peyêni",
+       "prefs-rc": "Vıryayışê bahdoyeni",
        "prefs-watchlist": "Lista seyrkerdışi",
        "prefs-watchlist-days": "Rocê ke lista seyrkerdışi de bêrê ramocnaene",
        "prefs-watchlist-days-max": "tewr vêşi $1 {{PLURAL:$1|roci|roci}}",
        "group": "Grube:",
        "group-user": "Karberi",
        "group-autoconfirmed": "Karberê ke otomatikmen biyê araşt",
-       "group-bot": "Boti",
+       "group-bot": "Roboti",
        "group-sysop": "İdarekari",
-       "group-bureaucrat": "Burokrati",
-       "group-suppress": "Çımpawıteni",
+       "group-bureaucrat": "Buroqrati",
+       "group-suppress": "Çımpawıti",
        "group-all": "(pêro)",
        "group-user-member": "{{GENDER:$1|karber}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Karberê ke otomatikmen biyê araşt}}",
        "nchanges": "$1 {{PLURAL:$1|fın vurna|fıni vurna}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ra yok wazino}}",
        "enhancedrc-history": "tarix",
-       "recentchanges": "Vurnayışê peyêni",
+       "recentchanges": "Vıryayışê bahdoyeni",
        "recentchanges-legend": "Tercihê vurnayışanê peyênan",
        "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-legend-heading": "<strong>Kıtabek:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
        "recentchanges-legend-plusminus": "''(±123)''",
+       "recentchanges-submit": "Bıasene",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
        "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
        "rcshowhideminor": "vurnayışê werdiyi $1",
-       "rcshowhideminor-show": "Bımocne",
+       "rcshowhideminor-show": "Bıasene",
        "rcshowhideminor-hide": "Bınımne",
        "rcshowhidebots": "botan $1",
-       "rcshowhidebots-show": "Bımocne",
+       "rcshowhidebots-show": "Bıasene",
        "rcshowhidebots-hide": "Bınımne",
-       "rcshowhideliu": "karberê qeydbiyayeyi $1",
-       "rcshowhideliu-show": "Bımocne",
+       "rcshowhideliu": "karberanê qeyd bıyayan $1",
+       "rcshowhideliu-show": "Bıasene",
        "rcshowhideliu-hide": "Bınımne",
        "rcshowhideanons": "karberê bênameyi $1",
-       "rcshowhideanons-show": "Bımocne",
+       "rcshowhideanons-show": "Bıasene",
        "rcshowhideanons-hide": "Bınımne",
        "rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
-       "rcshowhidepatr-show": "Bımocne",
+       "rcshowhidepatr-show": "Bıasene",
        "rcshowhidepatr-hide": "Bınımne",
        "rcshowhidemine": "vurnayışanê mı $1",
-       "rcshowhidemine-show": "Bımocne",
+       "rcshowhidemine-show": "Bıasene",
        "rcshowhidemine-hide": "Bınımne",
        "rcshowhidecategorization": "kategorizasyonê pele $1",
-       "rcshowhidecategorization-show": "Bımocne",
+       "rcshowhidecategorization-show": "Bıasene",
        "rcshowhidecategorization-hide": "Bınımne",
        "rclinks": "Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3",
        "diff": "ferq",
        "hist": "verên",
        "hide": "Bınımne",
-       "show": "Bımocne",
+       "show": "Bıasene",
        "minoreditletter": "q",
        "newpageletter": "N",
        "boteditletter": "b",
        "withoutinterwiki": "Pelê ke zıwananê binan rê gıreyê cı çıniyo",
        "withoutinterwiki-summary": "Enê pelî ke versiyonê ziwanî binî ra link nidano.",
        "withoutinterwiki-legend": "Verole",
-       "withoutinterwiki-submit": "Bımocne",
+       "withoutinterwiki-submit": "Bıasene",
        "fewestrevisions": "Pelê be senık çımraviyarnayışi",
        "nbytes": "$1 {{PLURAL:$1|bayt|bayti}}",
-       "ncategories": "$1 {{PLURAL:$1|Kategoriye|Kategoriyi}}",
+       "ncategories": "$1 {{PLURAL:$1|Kategori|Kategoriy}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikiy}}",
        "nlinks": "$1 {{PLURAL:$1|link|linkî}}",
        "nmembers": "$1 {{PLURAL:$1|eza|ezayan}}",
        "wantedtemplates": "Şablonê ke waziyenê",
        "mostlinked": "Pelî ke tewr zafî lînk bîy.",
        "mostlinkedcategories": "Kategoriyê ke tewr zehf meqaley tede estê",
-       "mostlinkedtemplates": "Pelê ke zêdêr gureniyenê",
+       "mostlinkedtemplates": "Pelê ke zaf biye daxil",
        "mostcategories": "Pelan ke tewr zaf kategorî estê.",
        "mostimages": "Dosyayan ke tewr zaf link estê.",
        "mostinterwikis": "Pelan ke tewr zaf interwiki biyê.",
        "mostrevisions": "Pelan ke tewr zaf revizyonî biyê.",
        "prefixindex": "Veroleya peley pêro",
        "prefixindex-namespace": "Peleyê Veroleyıni ($1 cay nami)",
+       "prefixindex-submit": "Bıasene",
        "prefixindex-strip": "Listeya réz bıyayışi",
        "shortpages": "Pelê kılmeki",
        "longpages": "Pelê dergeki",
        "protectedpages-performer": "Şeveknayışê karberi",
        "protectedpages-params": "Parametreyê şeveknayışi",
        "protectedpages-reason": "Sebeb",
+       "protectedpages-submit": "Asayışê pela",
        "protectedpages-unknown-timestamp": "Nêzanaye",
        "protectedpages-unknown-performer": "Karbero nêzanaye",
        "protectedtitles": "Sernameyê pawıteyi",
        "usereditcount": "$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}",
        "usercreated": "$2 de $1 {{GENDER:$3|viraziya}}",
        "newpages": "Pelê newey",
+       "newpages-submit": "Bıasene",
        "newpages-username": "Nameyê karberi:",
        "ancientpages": "Pelê kehenêri",
        "move": "Bere",
        "apisandbox": "API qumdor",
        "apisandbox-submit": "Bıwazê",
        "apisandbox-reset": "Bestere",
-       "apisandbox-examples": "Misal",
-       "apisandbox-results": "Netice",
+       "apisandbox-examples": "Misali",
+       "apisandbox-dynamic-parameters": "Parametreya debyayi",
+       "apisandbox-dynamic-parameters-add-label": "Parametre dek:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Nmaey parametrey",
+       "apisandbox-results": "Neticey",
+       "apisandbox-sending-request": "API waştış rışêno...",
        "apisandbox-request-url-label": "URL waştış:",
        "apisandbox-request-time": "Demê waştışi: $1",
        "booksources": "Çımeyê kıtaban",
        "specialloguserlabel": "Kerdoğ:",
        "speciallogtitlelabel": "Meqsed (sername ya zi {{ns:user}}:karberi rê nameyê karberi):",
        "log": "Qeydi",
+       "logeventslist-submit": "Bıasene",
        "all-logs-page": "Umumi qeydi pêro",
        "alllogstext": "qey {{SITENAME}}i mocnayişê heme rocaneyani.\ntipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyna hessasiyê herfa pil u qıciyi) bıweçine u esayiş qıc kerê.",
        "logempty": "qaydi de weina yew malumat çino",
        "log-title-wildcard": "sername yê ke pê ney nuşteyi destkenêpê bıgêr.",
        "showhideselectedlogentries": "Qeydê weçinayışê bımocne/bınımne dekerê",
+       "log-edit-tags": "Etiketanê weçinayê qeydan bıvurnê",
+       "checkbox-select": "Weçinaye: $1",
+       "checkbox-all": "Pêro",
+       "checkbox-none": "Temam",
        "allpages": "Peli pêro",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
        "cachedspecial-viewing-cached-ts": "Na pela raşt niya, şımayê enewke versiyonê verhafızada na pela vinenê.",
        "cachedspecial-refresh-now": "Peyêni bıvin.",
        "categories": "Kategoriy",
+       "categories-submit": "Bıasene",
        "categoriespagetext": "{{PLURAL:$1|Kategoriya cêrene|Kategoriyanê cêrênan}} de peli ya zi medya estê.\n[[Special:UnusedCategories|Kategoriyê ke nêxebetiyenê]] tiya de nêmocniyayê.\n[[Special:WantedCategories|Kategoriyanê waşteyeyan]] de zi bıvêne.",
        "categoriesfrom": "Kategoriyê ke be ninan dest pêkenê, bımocne:",
        "deletedcontributions": "İştırakê karberi esterdi",
        "linksearch-line": "$1, $2 ra link biya",
        "linksearch-error": "jokeri têna nameyê makina ya serekini de aseni/eseni.",
        "listusersfrom": "karber ê ke pey ıney detpêkeni ramocın:",
-       "listusers-submit": "Bımocne",
+       "listusers-submit": "Bıasene",
        "listusers-noresult": "karber nêdiyayo/a.",
        "listusers-blocked": "(blok biy)",
        "activeusers": "Listey karberan de aktivan",
        "activeusers-intro": "Ena yew listeya karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepya iştiraq kerdo ênan mocneno.",
-       "activeusers-count": "$1 peyni {{PLURAL:$3|roz de|$3 rozan de}} $1 {{PLURAL:$1|hereket|hereketi}} kerdê",
+       "activeusers-count": "Peyni  {{PLURAL:$3|roc de|$3 rocan de}} $1  {{PLURAL:$1|hereket kerdo|hereketi kerdê}}",
        "activeusers-from": "Enê karberi ra tepya bımocne:",
        "activeusers-hidebots": "Botan bınımne",
        "activeusers-hidesysops": "İdarekaran bınımne",
        "activeusers-noresult": "Karberi nêdiyayê.",
+       "activeusers-submit": "Karberanê aktivan bıasene",
        "listgrouprights": "heqê grubê karberi",
        "listgrouprights-summary": "wikiya cêrın a ke tede grubê karberi nişane biyê, listeya heqê cıresayişê inan o.\nqey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed]] belka esto.",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Heqa daiye</span>\n* <span class=\"listgrouprights-revoked\">Heqa gıreti</span>",
        "listgrouprights-group": "Grube",
        "listgrouprights-rights": "Heqqî",
        "listgrouprights-helppage": "Help:Heqqanê gruban",
-       "listgrouprights-members": "[lista ezayan]",
+       "listgrouprights-members": "[listey 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",
        "listgrouprights-removegroup-self": "Hesabê xo ra {{PLURAL:$2|grube|gruban}} bıvecê: $1",
        "listgrouprights-addgroup-self-all": "şıma eşkeni hesabê xo re heme gruban têare bıkerî",
        "listgrouprights-removegroup-self-all": "şıma hesabê xo ra eşkeni heme gruban bıveci",
+       "listgrouprights-namespaceprotection-header": "Kılm kerdena nameyan",
        "listgrouprights-namespaceprotection-namespace": "Heruna nami",
        "trackingcategories": "Kategoriyê teqibi",
        "trackingcategories-msg": "Kategoriya teqibi",
        "sp-contributions-username": "Adresa IPy ya zi nameyê karberi:",
        "sp-contributions-toponly": "Tenya rewizyonanê tewr peyniyan bimocne",
        "sp-contributions-submit": "Cı geyre",
-       "whatlinkshere": "Pele rê gırey",
+       "whatlinkshere": "Ena perer rê grey",
        "whatlinkshere-title": "Per da \"$1\" rê perê ke gre danê",
        "whatlinkshere-page": "Pele:",
        "linkshere": "Ena peleyan grey biya '''[[:$1]]''':",
        "tooltip-ca-move": "Ena pele bere",
        "tooltip-ca-watch": "Ena pele lista xoya seyrkerdışi ke",
        "tooltip-ca-unwatch": "Ena pele lista xoya seyrkerdışi ra vece",
-       "tooltip-search": "{{SITENAME}} de cı geyre",
+       "tooltip-search": "{{SITENAME}} de bıvin",
        "tooltip-search-go": "Ebe nê namey tami şo yew pela ke esta",
-       "tooltip-search-fulltext": "Pelan miyan de nê metıni cı geyre",
+       "tooltip-search-fulltext": "Pela miyan dı bı geyr ena metin",
        "tooltip-p-logo": "Pela seri bıvêne",
        "tooltip-n-mainpage": "Şo pela seri",
        "tooltip-n-mainpage-description": "Şo pela seri",
        "fileduplicatesearch-result-1": "Dosyayê ''$1î'' de hem-kopya çini yo.",
        "fileduplicatesearch-result-n": "Dosyayê ''$1î'' de {{PLURAL:$2|1 hem-kopya|$2 hem-kopyayî'}} esto.",
        "fileduplicatesearch-noresults": "Ebe namey \"$1\" ra dosya nêdiyayê.",
-       "specialpages": "Pelê xasi",
+       "specialpages": "Perê Xısusi",
        "specialpages-note-top": "Kıtabek",
        "specialpages-note": "* Pelê xasê normali.\n* <span class=\"mw-specialpagerestricted\">Pelê xasê nımıtey.</span>",
        "specialpages-group-maintenance": "Raporê pawıtışi",
index ac8d893..8ecebe6 100644 (file)
        "versionrequiredtext": "ये पाना प्रयोग गर्नका लागि MediaWiki $1 संस्करण चाहिन्छ ।\nहेर  [[Special:Version|version page]]",
        "ok": "भयो",
        "retrievedfrom": " \"$1\" बठे निकालिया",
-       "youhavenewmessages": "तमखी लेखा($2)मी $1 छ ।",
+       "youhavenewmessages": "तमखी लेखा($3)मी $1 ($2) छ ।",
        "youhavenewmessagesfromusers": "तमखी लेखा {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्तान}}($2)बठे$1",
        "youhavenewmessagesmanyusers": "तमलाई धेरै प्रयोगकर्ताहरू($2) बठे $1 छ ।",
        "newmessageslinkplural": "{{PLURAL:$1|एक नौलो रैबार|999=नौला रैबारहरू}}",
        "viewsource-title": " $1 को स्रोत हेर",
        "actionthrottled": "कार्य रोकिईयो",
        "actionthrottledtext": "स्पामको रोकथामको लागि , तमीलाई यो कार्य नापै समयमी मैथै पटक गद्दाबठे सिमित गरियाको छ, र तमीले आफ्नो सिमा पार गरिसक्याछौ ।\nकृपया केही मिनेट पछि पुन: प्रयास गर  ।",
+       "protectedpagetext": "यो पृष्ठ सम्पादन हुनबठे बचाउन सम्पादनमी तथा अन्य कार्यमी रोक लगाइया छ।",
        "viewsourcetext": "तम ये पृष्ठको स्रोत हेद्दु सकुन्छौ और उईको नक्कल उताद्दु सकुन्छौ |",
        "viewyourtext": "यै पानामी रह्याका '''तमरा सम्पादनहरू''' हेद्द या प्रतिलिपी गद्द सक्द्या हौ :",
        "editinginterface": "<strong>चेतावनी:</strong> तमी यै पानालाई सम्पादन गद्द लाग्याछौ, जनले सफ्टवेयरको लागि \nइन्टरफेस सामग्रीहरू प्रदान गरन्छ।\nयै पानामी गरियाको परिवर्तनले यै विकिमी अरु प्रयोगकर्तानको इन्टरफेसको प्रदर्शनमी प्रभाव पडन्छ ।",
        "namespaceprotected": "तमलाई '''$1'''  नेमस्पेसमी रह्याका पानाहरू सम्पादन गद्या अनुमति छैन ।",
        "customcssprotected": "तमलाई यो  पानो सम्पादन गद्दे अनुमति छैन, किनकी यैमी कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
        "customjsprotected": "तमलाई यो जाभास्कृप्ट पानो सम्पादन गद्दे अनुमति छैन, किनकी यैमी कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
+       "mycustomcssprotected": "ये CSS पृष्ठ सम्पादन गद्दका लागि तमलाइ अनुमति छैन ।",
+       "mycustomjsprotected": "ये JavaScript पृष्ठ सम्पादन गद्द लागि तमलाई अनुमति छैन।",
+       "myprivateinfoprotected": "तमसँग तमरो निजी जानकारीहरू सम्पादन ग्द्दे अनुमती छैन |",
+       "mypreferencesprotected": "तमसंग तमरो अभिरुचीहरू सम्पादन ग्द्दे अनुमती छैन |",
        "ns-specialprotected": "विशेष पृष्ठहरू सम्पादन अद्दु नाइँ सकिनो।",
        "titleprotected": "[[User:$1|$1]]द्वारा ये शीर्षक निर्माणहुनबठे जोगाइया छ।\nकारण <em>$2</em> हो ।",
        "filereadonlyerror": "फाइल \"$1\" लाई परिवर्तन अद्दु नाइँ सकिनो क्याईकि फाइल भण्डार  \"$2\" केवल पढ्ने स्थिति (read-only mode)मी छ।\n\nयेलाई सुरक्षित गर्ने प्रवन्धकले  यो कारण दियाकाछन् : ''$3''।",
        "virus-scanfailed": "जँचाई असफल(कोड $1)",
        "virus-unknownscanner": "थानभया एन्टीभाइरस:",
        "logouttext": "<strong>तमी अहिल बाहिर निस्क्याका  छौ।</strong>\n\nयाद राख्या तमीले ब्राउजरको क्याच खालि नगर्यासम्म कुनै पानाहरूमी तमी अझैं प्रवेश गरिरख्याको धेकाउन सक्छ।",
+       "cannotlogoutnow-title": "अईल भाईर निकल्ल नाइँ पाईनो",
+       "cannotlogoutnow-text": "भाईर निकल्ल असंभव छ जब प्रयोग $1",
        "welcomeuser": "$1स्वागत छ!",
        "welcomecreation-msg": "तमरो खाता तयार भयो । \nतमले चाहेको खण्डमी {{SITENAME}} [[Special:Preferences|रोजाइहरू]] परिवर्तन गद्द सक्द्याहौ ।",
        "yourname": "प्रयोगकर्ता नाम:",
        "yourdomainname": "तमरो ज्ञानक्षेत्र(डोमेन):",
        "password-change-forbidden": "ये विकिमी पासवर्ड परिवर्तन गर्न सक्नुहुन्न।",
        "login": "प्रवेश (लगईन)",
+       "login-security": "तमरो पहिचान जाचँ गर",
        "nav-login-createaccount": "प्रवेश गर्ने/नयाँ खाता बनाउन्या",
        "userlogin": "प्रवेश गर्ने / नयाँ खाता बनाउन्या",
        "userloginnocreate": "प्रवेश",
        "createacct-reason-ph": "क्याई तम नयाँ खाता खोल्ला छौ?",
        "createacct-submit": "तमरो खाता सिर्जना गर",
        "createacct-another-submit": "दोसरो खाता सिर्जना गर",
+       "createacct-continue-submit": "खाता खोल्लु जारि राख",
+       "createacct-another-continue-submit": "खाता खोल्लु जारि राख",
        "createacct-benefit-heading": "{{SITENAME}} तम जसाई मान्सुनले सिर्जना गरिया हो ।",
        "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन|सम्पादनहरू}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पाना|पानाहरू}}",
        "loginsuccesstitle": "प्रवेश सफल",
        "loginsuccess": "'''तमले {{SITENAME}}मी  \"$1\" को रुपमी प्रवेश गरया छौ।'''",
        "nouserspecified": "प्रयोगकर्ता नाम दिनु अनिवार्य छ।",
+       "login-userblocked": "ये प्रयोगकर्तालाई रोक लगाया छ। प्रवेश गददु अनुमति छैन।",
+       "wrongpassword": "पासवर्ड गलत हालियो।\nकृपया आजी प्रयास गरया।",
+       "wrongpasswordempty": "हालिएया पासवर्ड खालि थ्यो।\nकृपया आजी प्रयास गरया।",
+       "password-name-match": "तमरो प्रवेशशव्द प्रयोगकर्ता नाम है फरक हुनपडन्छ ।",
+       "password-login-forbidden": "ये प्रयोगकर्ता नाम र प्रवेश शव्द वर्जित गरिया छ।",
        "mailmypassword": "पासवर्ड पूर्वनिर्धारित गर",
        "passwordremindertitle": "{{SITENAME}}का लागि नयाँ अस्थायी पासवर्ड",
        "passwordremindertext": "कसैले (सायद तमी, IP ठेगाना $1 बाट), {{SITENAME}}($4) को लागि नौलो पासवर्ड अनुरोध गर्या छ । प्रयोगकर्ता \"$2\" को लागि नौलो अस्थायी पासवर्ड \"$3\"तयार पारिया छ । यदि यो तमरो इच्छामी भयाको भया अहिले तमीले लगइन गरीबर नौलो पासवर्ड छान्नु पड्ड्या हुन्छ ।\nतमरो अस्थायी पासवर्ड  {{PLURAL:$5|एक दिन|$5 दिनहरू पछि}} अमान्य हुन्याछ ।\n\nयदि कोही अरुले नै अनुरोध गर्याको हो भण्या , या तमीले आफ्नो पासवर्ड सम्झ्यौ भण्या, अथवा\nत्यैलाई परिवर्तन गर्न चाहन्नौ भण्या, तमीले यो सन्देसको वेवास्ता गद्दसक्द्याहौ र पुरानै पासवर्ड प्रयोग गरिरहन सक्द्याहौ ।",
        "resetpass_submit": "पासवर्ड व्यवस्थित गरी र प्रवेशगर्ने",
        "changepassword-success": "तमरो पासवर्ड सफलतापूर्वक परिवर्तन भयो!",
        "changepassword-throttled": "तमले अलै भौत फेर प्रवेशका निम्ति प्रयास गरया छौ।\nकृपया $1 थोक्कै जागी मात्र प्रयास गर।",
+       "botpasswords-label-appid": "बोट नाम:",
+       "botpasswords-label-create": "सृजना गर",
+       "botpasswords-label-update": "नयाँ बनाउनु",
+       "botpasswords-label-cancel": "रद्द",
+       "botpasswords-label-delete": "मेट्न्या",
+       "botpasswords-label-resetpassword": "पासवर्ड पूर्वनिर्धारित गर",
+       "botpasswords-label-grants": "अनुदान आवेदन:",
        "botpasswords-label-grants-column": "प्रदान भयो",
        "botpasswords-created-title": "बोट को पासवर्ड बन्यो",
        "botpasswords-updated-title": "बोट को पासवर्ड अपडेट भयो",
        "passwordreset-emailtitle": "{{SITENAME}}मा खाता विवरण",
        "passwordreset-emailelement": "प्रयोगकर्ताको नाम: \n$1\n\nअस्थाई पासवर्ड: \n$2",
        "passwordreset-emailsentemail": "पासवर्ड परिवर्तनका लागि इमेल पठाइया छ।",
+       "passwordreset-invalideamil": "अबैध ई-मेल ठेगाना",
        "changeemail": "इमेल ठेगाना बदेल वा हटा",
        "changeemail-header": "आफ्नो इमेल ठेगाना परिवर्तन गद्द यो फारम भर । यैलाई पुष्टि गद्द तमीले आफ्नो पासवर्ड हाल्नु पडन्छ।",
        "changeemail-oldemail": "अईलको इमेल-ठेगाना:",
        "sig_tip": "तमरो समयछाप सहितको दस्तखत",
        "hr_tip": "क्षितिजिय रेखा (कम प्रयोग गर्नुहोस्)",
        "summary": "सारांश:",
-       "subject": "विषय/शीर्षक:",
+       "subject": "विषय:",
        "minoredit": "यो नानो सम्पादन हो",
        "watchthis": "यै पानाको ध्यान राख",
        "savearticle": "सङ्ग्रह गर",
        "selfredirect": "<strong>चेतावनी:</strong> तम यै पानालाई आफुमी पुनः निर्देशित गद्द लाग्याछौ ।\nहुनसक्छ तम अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गद्द लाग्याछौ, वा गलत पानाको सम्पादन गद्द लाग्याछौ ।\nतम पुनः एकपल्ट \"{{int:savearticle}}\" क्लिक गद्दाछौ, पुनः निर्देशित तसै लै बनाइन्याछ।",
        "missingcommentheader": "'''याद गर :''' तमीले टिप्पणीमी विषय /शीर्ष पंक्ति  दियाका छैनौ ।\nतमीले फेरि \"{{int:savearticle}}\"  थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
        "summary-preview": "सारांश पूर्वालोकन:",
-       "subject-preview": "विषय/शीर्षपंक्ति पूर्वरुप:",
+       "subject-preview": "विषय पूर्वरुप:",
        "previewerrortext": "तमरो परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आयाको छ ।",
        "blockedtitle": "प्रयोककर्तालाई रोक लगाइया छ",
        "blockedtext": "'''तमरो प्रयोगकर्ता नाम या IP ठेगानालाई रोक लगाइएको छ ।'''\n\nरोक लगाउने  $1.\nरोक लगाउनाको कारण ''$2''.\n\n* रोक सुरू हुने : $8\n* रोक सकिने: $6\n* रोकबाट लक्षित: $7\n\nतमले  $1 वा और कोइ  [[{{MediaWiki:Grouppage-sysop}}|प्रवन्धक]] सँग रोकको बारेमी छलफल गर्न सम्पर्क गद्द सकुन्छौ ।\nतमले  'प्रयोगकर्तालाई इ-मेल गर्ने ' सुविधा मान्य इमेल ठेगाना [[Special:Preferences|रोजाइहरू]] मी नखुलाए सम्म प्रयोगगर्न पाउनुहुन्या छैन र यैको प्रयोग गर्नबठे रोक लगाइया छैन ।\nतमरो IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तमरा प्रश्नमी सबै जानकारी खुलाया ।",
        "autoblockedtext": "तमरो IP ठेगानामी रोक लगाइयाकोछ किन भण्या यो अर्को प्रयोगकर्ताले प्रयोग गर्याको थ्यो, जैलाई $1ले रोक लगायाका थ्या । \nरोक लगाउनाको कारण:\n:''$2''  \n\n* रोकावट सुरु: $8\n* रोकावट सकिन्या: $6\n* रोकावटको प्रयोजन: $7\n\nतम $1 सित सम्पर्क गर्न सकन्छौ अथवा कुनै [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]]सँग रोकबारे चर्चा गर्न सकन्छौ ।\n\nध्यान दिया कि तमले यै प्रयोगकर्ताकी लेखा ई-मेलको प्रयोग तबसम्म गद्द नाइसक्दा जबसम्म तमरो [[Special:Preferences|रोजाई]] दर्ता गद्दाइनौ वा यो ई-मेलको प्रयोगमी रोक लगाइयाको हुँदैन । \n\nतमरो वर्तमान IP ठेगाना हो- $3, अनि रोक लगाइयाको ID हो- #$5.\nकृपया कुनै बेला सोधनी गद्दु पड्या उपर्युक्त विवरण दर्शाया ।",
        "blockednoreason": "कारण दिइईया नाइँथिन",
        "whitelistedittext": "पाना सम्पादन गर्न तमले $1 गद्दु पडन्छ।",
+       "nosuchsectiontitle": " खण्ड फेला नाइँपडयो",
        "nosuchsectiontext": "तमले तसो खण्डको सम्पादन गद्या प्रयास गर्यौ जो अस्तित्वमी छैन।\nयैको नाम बदलियाको अथवा मेटाइयाको हुनुपडन्छ जब तमी यै पानालाई हेद्द लाग्याका छियौ ।",
        "loginreqtitle": "प्रवेशगर्नु जरुरी छ।",
        "loginreqlink": "प्रवेश (लग ईन)",
        "anontalkpagetext": "----''यो कुरडी पानो अज्ञात प्रयोगकर्ताको हो जनले अहिलसम्म खाता बनायाकै छैन, अथवा जनले यै पानाको उपयोग गर्दैन।\nयस कारण हामीले उनलाई उनरो आइ पी (IP) ठेगानाले चिन्न सकन्छौ। \nयस्तो आइ पी (IP) ठेगाना धेरै प्रयोगकर्तानको साझा हुनसकन्छ ।\nयदि तमी अज्ञात प्रयोगकर्ता हौ र तमलाई अचाहिँदो टिप्पणी भयाको अनुभव गद्दा छौ भण्या भविष्यमी अन्य अज्ञात प्रयोगकर्तासँगको भ्रमबाट बाँच्न कृपया [[Special:CreateAccount|खाता खोल]] अथवा [[Special:UserLogin|प्रवेश गर]] ''",
        "noarticletext": "यै लेखमी अहिल क्यै पन पाठ नाइथी  ।\nतमले और पृष्ठमी\n[[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षककी लेखा खोज]] गद्द सकन्छौ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पाना सम्बन्धित ढड्डामी खोज],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यै पानालाई सम्पादन गद्या]</span>.",
        "noarticletext-nopermission": "यै लेखमी अहिल केइ पन पाठ नाइथी  ।\nतमले और पानामी\n[[Special:Search/{{PAGENAME}}|यै पानाको शीर्षककी लेखा खोज]] गद्द सकन्छौ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पाना सम्बन्धित ढड्डामी खोज्न],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यै पानालाई सम्पादन गद्द] सकन्छौ</span>.",
+       "userpage-userdoesnotexist-view": "प्रयोगकर्ता खाता \"$1\" दर्ता गरिया छैन।",
        "userinvalidcssjstitle": "<strong>चेतावनी:</strong> यहाँ कोइपनि \"$1\" नामको खोल नाइथिन् ।\nप्रचलित .css तथा .js पानाहरूले निम्नपद शीर्षक प्रयोग गद्दान्, जस्तै {{ns:user}}:Foo/Vector.css को सट्टामी {{ns:user}}:Foo/vector.css",
        "updated": "नौला",
        "note": "'''सूचना:'''",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(अर्ध-सुरक्षित)",
        "hiddencategories": "यो पानो निम्न {{PLURAL:$1|1 लुकाइयाको श्रेणी|$1 लुकाइयाका श्रेणीहरू}}को हिस्सादार(सदस्य) हो :",
+       "sectioneditnotsupported-title": "खण्ड सम्पादन असमर्थित",
+       "sectioneditnotsupported-text": "ये पृष्ठमी खण्ड सम्पादन असमर्थित",
        "permissionserrors": "अधिकारमी त्रुटी",
        "permissionserrorstext-withaction": "$2 कि लेखा तमलाईँ अनुमति नाइथिन , यिन {{PLURAL:$1|कारणले|कारणहरुले}} गद्दा :",
        "moveddeleted-notice": "पानो मेटियाको छ।\nमेटियाका और सारियाका पानाहरूको सूची तल्तिर सन्दर्भखी लेखा दियाको छ।",
        "invalid-content-data": "अमान्य सामग्री डेटा",
        "content-not-allowed-here": "सामग्री \"$1\"  [[$2]] पानामी राख्न अनुमती छैन ।",
        "editwarning-warning": "यै पानाबठे बाहिर जाँदा तमले गर्याको कुनै पनि परिवर्तन हराउन्याछ ।\nयदि तमले लग इन गर्याको छ भण्या तमी यै सूचनालाई धेकाउन आफ्नो रोजाईहरूको \"{{int:prefs-editing}}\" भागमी गइबर बन्द गद्द सक्द्याहौ।",
+       "editpage-notsupportedcontentformat-title": "सामग्री प्रकार समर्थित नाइँथिन",
        "content-model-wikitext": "विकिपाठ",
        "content-model-text": "साधारण पाठ",
        "content-model-javascript": "जाभास्क्रिप्ट",
        "revdelete-submit": "{{PLURAL:$1|छानिया संशोधन|छान्निया संशोधनहरू}}मी प्रयोग गर्न्या",
        "revdelete-success": "'''संशोधन दृश्यता सफलतापूर्वक अद्यतन भयो।'''",
        "revdelete-failure": "'''संशोधन दृश्यता अद्यतन गर्न सकिएन:'''\n$1",
-       "logdelete-success": "'''लग दृष्टि सफलतापूर्वक मिलाइयो ।'''",
+       "logdelete-success": "लग दृष्टि मिलाइयो ।",
        "logdelete-failure": "'''लग दृष्टि मिलाउन सकिएन :'''\n$1",
        "revdel-restore": "दृष्टि परिवर्तन गर्न्या",
        "pagehist": "पाना इतिहास",
        "mergehistory-submit": "पुनरावलोकहरू जोड",
        "mergehistory-empty": "कोइलै पुनरावलोकनहरू जोड्ड नाइँमिल्लो ।",
        "mergehistory-done": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  $1बठे सफलतापूर्वक [[:$2]]मी थपियो ।",
+       "mergehistory-fail-bad-timestamp": "समय संख्या अस्विकार",
+       "mergehistory-fail-invalid-source": "अस्विकार स्रोत पृष्ठ",
+       "mergehistory-fail-invalid-dest": "अस्विकार लक्ष्य पृष्ठ",
+       "mergehistory-no-source": "स्रोत पृष्ठ $1 अस्तित्वमी छैन ।",
+       "mergehistory-no-destination": "गन्तव्य पृष्ठ $1 अस्तित्वमी छैन ।",
+       "mergehistory-invalid-source": "स्रोत पृष्ठ मान्य शीर्षकको हुनुपडन्छ ।",
+       "mergehistory-invalid-destination": "गन्तव्य पृष्ठ मान्य पृष्ठ शीर्षक हुनु पडन्छ।",
        "mergehistory-autocomment": " [[:$1]] लाई [[:$2]] मी जोडियो",
        "mergehistory-comment": " [[:$1]] लाई[[:$2]] मी जोडियो : $3",
        "mergehistory-same-destination": "स्रोत र गन्तव्य पाना एउटै हुनसक्दैनन्",
        "prefs-watchlist": "मेरो ध्यान सूची",
        "prefs-editwatchlist": "अवलोकनसूची सम्पादन",
        "prefs-editwatchlist-raw": "कच्चा अवलोकनसूची सम्पादन गद्दा",
+       "prefs-editwatchlist-clear": "तमरो अवलोकनसूची मेटा",
        "prefs-watchlist-days": "ध्यान सूचीमी धेकाउने दिनहरू:",
        "prefs-watchlist-edits-max": "सबै है ज्यादा संख्या : १०००",
        "prefs-watchlist-token": "अवलोकन सूची टोकन:",
        "badsiglength": "तमरो दस्तखत मैथै लामो छ।\nयो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।",
        "email": "ईमेल",
        "prefs-help-realname": "वास्तविक नाम ऐच्छिक हो ।\nतमीले खुलायौ भण्या तमरो कामको श्रेय दिनको लेखा यैको प्रयोग गरिन्या छ ।",
+       "prefs-help-email-required": "इमेल ठेगाना चाहिन्छ ।",
+       "prefs-info": "साधारण जानकारी",
+       "prefs-i18n": "अन्तर्राष्ट्रियकरण",
+       "prefs-signature": "हस्ताक्षर",
+       "prefs-dateformat": "मिति ढाँचा",
+       "prefs-timeoffset": "समय अफसेट",
+       "prefs-advancedediting": "सामान्य विकल्पहरू",
        "prefs-editor": "सम्पादक",
        "prefs-preview": "पूर्वावलोकन",
+       "prefs-advancedrc": "उन्नत विकल्पहरू",
+       "prefs-advancedrendering": "उन्नत विकल्पहरु",
+       "prefs-advancedsearchoptions": "उन्नत विकल्पहरू",
+       "prefs-advancedwatchlist": "उन्नत विकल्पहरू",
+       "prefs-displayrc": "धेकिन्या विकल्पहरू",
+       "prefs-displaywatchlist": "धेकिन्या विकल्पहरू",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "फरक",
        "prefs-help-prefershttps": "यो रोजाई तमरो अर्को  लग इन बठे लागु हुन्याछ ।",
+       "userrights": "प्रयोगकर्ता अधिकार व्यवस्थापन",
+       "userrights-lookup-user": "प्रयोगकर्ता समूह व्यवस्थापन गर",
+       "userrights-user-editname": "प्रयोगकर्ता नाम दिय:",
+       "editusergroup": "सम्पादन{{लिंग:$1}}समूहहरु",
+       "userrights-editusergroup": "प्रयोगकर्ता समूह सम्पादन गर",
+       "saveusergroups": "सुरक्षित{{लिंग:$1}}समूहहरु",
+       "userrights-groupsmember": "को सदस्य:",
+       "userrights-groupsmember-auto": "अंतर्निहित सदस्य:",
        "userrights-reason": "कारण:",
        "userrights-unchangeable-col": "तमीले परिवर्तन गद्द नसक्ने समूहहरू",
        "userrights-conflict": "प्रयोगकर्ताको अधिकार परिवर्तनमी मतभेद भयो ! कृपया तमरो परिवर्तन पुनरावलोकन तथा पुष्टि गर ।",
        "group-autoconfirmed": "स्वत स्थापित प्रयोगकर्ताहरू",
        "group-bot": "बोटहरू",
        "group-sysop": "प्रवन्धकहरू",
+       "group-bureaucrat": "प्रशासकहरू",
+       "group-suppress": "लुकौन्या वाला",
+       "group-all": "(सबै)",
+       "group-user-member": "{{लिङग:$1|प्रयोगकर्ता}}",
+       "group-autoconfirmed-member": "{{लिङग:$1|स्वनिर्धारित प्रयोगकर्ता}}",
+       "group-bot-member": "{{लिङग:$1|बोट}}",
+       "group-sysop-member": "{{लिङग:$1|प्रबन्धक}}",
+       "group-bureaucrat-member": "{{लिङग:$1|प्रशासक}}",
+       "group-suppress-member": "{{लिङग:$1|दबाउन्या}}",
+       "grouppage-user": "{{एनयस:आयोजना}}:प्रयोगकर्ताहरू",
+       "grouppage-autoconfirmed": "{{एनयस:आयोजना}}:स्वनिर्धारित प्रयोगकर्ताहरू",
+       "grouppage-bot": "{{एनयस:आयोजना}}:बोटहरु",
+       "grouppage-sysop": "{{एनयस:आयोजना}}:प्रबन्धकहरु",
+       "grouppage-bureaucrat": "{{एनयस:आयोजना}}:प्रशासकहरु",
+       "grouppage-suppress": "{{एनयस:आयोजना}}:लुकौन्या",
+       "right-read": "पृष्ठहरू पढ",
+       "right-edit": "पृष्ठहरू सम्पादन गर",
+       "right-createpage": "पृष्ठ निर्माण गर(छलफल पृष्ठहरू बाहेक)",
+       "right-createtalk": "छलफल पृष्ठ सृजना गर",
+       "right-createaccount": "नयाँ प्रयोगकर्ता खाता सृजना गर।",
+       "right-minoredit": "सम्पादनलाई सामान्य चिनो लगाउन्या",
+       "right-move": "पृष्ठहरू साददे",
        "right-move-subpages": "तिनीहरूको उपपाना सहित पानाको नाम बदल्ने",
        "right-move-rootuserpages": "मूल(root) प्रयोगकर्ताको पानाहरू साद्या",
+       "right-move-categorypages": "श्रेणी पृष्ठ सार",
        "right-movefile": "फाइलहरूको नाम बदल्न्या",
+       "right-suppressredirect": "पृष्ठ सार्दा स्रोत पृष्ठबठेई पठाउने लिंक नबनाउन्या",
        "right-upload": "फाइलहरू अपलोड गर्न्या",
+       "right-reupload": "रहेका फाइललाई अधिलेखन गर्न्या",
+       "right-reupload-own": "आफैले अपलोड  गरया रई आया फाइल अधिलेखन गर्न्या",
        "right-reupload-shared": "साझा मिडिया भण्डारमी स्थानियरुपमी फाइलहरू अधिक्रमण गर्न्या",
+       "right-upload_by_url": "URL बठे फाइल उर्ध्वभरण गर्ने",
+       "right-purge": "साइटको क्याश( cache) निश्चित नगरिकनै पर्ज(Purge) गर्ने",
        "right-writeapi": "लेखन API प्रयोग गद्य्या",
        "right-bigdelete": "लामो इतिहास भयाका पानाहरू मेट्ट्या",
        "right-deleterevision": "खुलाइयाको पानाहरू मेटाउन्या र मेटायाको रद्द गद्या",
index 5398858..f135f40 100644 (file)
        "cannotauth-not-allowed-title": "Permission denied",
        "cannotauth-not-allowed": "You are not allowed to use this page",
        "changecredentials" : "Change credentials",
-       "changecredentials-submit": "Change",
+       "changecredentials-submit": "Change credentials",
        "changecredentials-submit-cancel": "Cancel",
        "changecredentials-invalidsubpage": "$1 is not a valid credential type.",
        "changecredentials-success": "Your credentials have been changed.",
        "removecredentials" : "Remove credentials",
-       "removecredentials-submit": "Remove",
+       "removecredentials-submit": "Remove credentials",
        "removecredentials-submit-cancel": "Cancel",
        "removecredentials-invalidsubpage": "$1 is not a valid credential type.",
        "removecredentials-success": "Your credentials have been removed.",
index 66b168b..57b4a86 100644 (file)
        "confirm-watch-top": "Ĉu aldoni tiun ĉi paĝon al via atentaro?",
        "confirm-unwatch-button": "Ek!",
        "confirm-unwatch-top": "Ĉu forigi tiun ĉi paĝon el via atentaro?",
+       "confirm-rollback-button": "Bone",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "← antaŭa paĝo",
        "imgmultipagenext": "sekva paĝo →",
index ff70d1d..1afd483 100644 (file)
        "authprovider-resetpass-skip-label": "Omitir",
        "authform-nosession-login": "La autenticación fue exitosa, pero tu navegador no puede \"recordar\" haber iniciado sesión.\n\n$1",
        "authform-nosession-signup": "La cuenta ha sido creada, pero tu navegador no \"recuerda\" haber iniciado sesión.\n\n$1",
+       "specialpage-securitylevel-not-allowed-title": "No está permitido",
        "specialpage-securitylevel-not-allowed": "Lo siento, no tienes permitido usar esta página, porque tu identidad no pudo verificarse.",
        "authpage-cannot-login-continue": "No se puede continuar con el inicio de sesión. Lo más probable es que tu sesión haya expirado.",
        "authpage-cannot-create": "No se puede iniciar la creación de la cuenta.",
        "authpage-cannot-link-continue": "No se puede continuar con la vinculación de la cuenta. Lo más probable es que tu sesión haya expirado.",
        "cannotauth-not-allowed-title": "Permiso denegado",
        "changecredentials": "Cambiar las credenciales",
-       "changecredentials-submit": "Cambiar",
+       "changecredentials-submit": "Cambiar credenciales",
        "changecredentials-submit-cancel": "Cancelar",
        "changecredentials-success": "Tus credenciales han sido cambiadas.",
        "removecredentials": "Eliminar credenciales",
-       "removecredentials-submit": "Eliminar",
+       "removecredentials-submit": "Eliminar credenciales",
        "removecredentials-submit-cancel": "Cancelar",
        "removecredentials-success": "Tus credenciales han sido eliminadas.",
        "credentialsform-account": "Nombre de la cuenta:",
index 6324b22..e6455ce 100644 (file)
        "revertpage": "ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد",
        "revertpage-nouser": "ویرایش‌های انجام‌شده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.",
        "rollback-success": "ویرایش‌های $1 واگردانی شد؛\nصفحه به آخرین ویرایش $2 برگردانده شد.",
+       "rollback-success-notify": "ویرایش‌های توسط $1 واگردانی شد؛\nبه آخرین نسخه توسط $2 بازگردانی شد. [$3 نمایش تغییرات]",
        "sessionfailure-title": "خطای نشست کاربری",
        "sessionfailure": "به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد.\nلطفاً دکمهٔ «بازگشت» را در مرورگر خود بفشارید و صفحه‌ای که از آن به اینجا رسیده‌اید را دوباره فراخوانی کنید، سپس مجدداً سعی کنید.",
        "changecontentmodel": "ویرایش نمونه محتوای یک صفحه",
        "confirm-watch-top": "این صفحه به فهرست پی‌گیری‌های شما افزوده شود؟",
        "confirm-unwatch-button": "تأیید",
        "confirm-unwatch-top": "این صفحه از فهرست پی‌گیری‌های شما حذف شود؟",
+       "confirm-rollback-button": "باشد",
+       "confirm-rollback-top": "خنثی‌سازی ویرایش‌های این صفحه؟",
        "semicolon-separator": "؛&#32;",
        "comma-separator": "،&#32;",
        "percent": "$1٪",
index f085e45..fd1ca9f 100644 (file)
@@ -50,7 +50,8 @@
                        "Olimar",
                        "Mikahama",
                        "01miki10",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "BiscuitMan"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "noname": "Et ole määritellyt kelvollista käyttäjänimeä.",
        "loginsuccesstitle": "Olet kirjautunut sisään",
        "loginsuccess": "'''Olet kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''",
-       "nosuchuser": "Käyttäjää ”$1” ei ole olemassa. Nimet ovat kirjainkoosta riippuvaisia. Tarkista kirjoititko nimen oikein, tai [[Special:CreateAccount|luo uusi käyttäjätunnus]].",
+       "nosuchuser": "Käyttäjää \"$1\" ei ole olemassa.\nNimet ovat kirjainkoosta riippuvaisia. \nTarkista kirjoititko nimen oikein, tai [[Special:CreateAccount|luo uusi käyttäjätunnus]].",
        "nosuchusershort": "Käyttäjää nimeltä ”$1” ei ole. Kirjoititko nimen oikein?",
        "nouserspecified": "Käyttäjätunnusta ei ole määritelty.",
        "login-userblocked": "Tämä käyttäjä on estetty. Kirjautuminen ei ole sallittua.",
        "createacct-another-realname-tip": "Vapaaehtoinen.\nNimesi näytetään käyttäjätunnuksesi sijasta sivun tekijäluettelossa.",
        "pt-login": "Kirjaudu sisään",
        "pt-login-button": "Kirjaudu sisään",
+       "pt-login-continue-button": "Jatka kirjautumista",
        "pt-createaccount": "Luo tunnus",
        "pt-userlogout": "Kirjaudu ulos",
        "php-mail-error-unknown": "Tuntematon virhe PHP:n mail()-funktiossa",
        "log-action-filter-suppress-block": "Käyttäjätunnuksen häivyttäminen estämällä se",
        "log-action-filter-suppress-reblock": "Käyttäjätunnuksen häivyttäminen uudella estolla",
        "log-action-filter-upload-upload": "Uusi tallennus",
-       "log-action-filter-upload-overwrite": "Päälletallennus"
+       "log-action-filter-upload-overwrite": "Päälletallennus",
+       "authmanager-provider-temporarypassword": "Väliaikainen salasana",
+       "authprovider-resetpass-skip-label": "Ohita"
 }
index 7842756..2d9fa7d 100644 (file)
                        "Yasten",
                        "Psychoslave",
                        "Trial",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Dcausse"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "passwordreset-nosuchcaller": "L’appelant n’existe pas : $1",
        "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être qu'aucun fournisseur n’a été configuré ?",
        "passwordreset-invalideamil": "Adresse de messagerie non valide",
-       "passwordreset-nodata": "Aucun nom d’utilisateur ni adresse de messagerie n’a été fourni",
+       "passwordreset-nodata": "Ni nom d’utilisateur ni adresse de messagerie n’ont été fournis",
        "changeemail": "Changer ou supprimer l’adresse de courriel",
        "changeemail-header": "Complétez ce formulaire pour modifier votre adresse de courriel. Si vous voulez supprimer l’association d’une adresse de courriel avec votre compte, laissez la nouvelle adresse de courriel vide lors de la soumission du formulaire.",
        "changeemail-passwordrequired": "Vous devrez saisir votre mot de passe pour confirmer cette modification.",
        "revertpage": "Révocation des modifications de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]]) vers la dernière version de [[User:$1|$1]]",
        "revertpage-nouser": "Révocation des modifications par un utilisateur masqué à la dernière version par {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Révocation des modifications effectuées par $1 ;\nrétablissement de la dernière version par $2.",
-       "rollback-success-notify": "Modifications annulées par $1 ;\nretour à la dernière révision par $2. [$3 indique les changements]",
+       "rollback-success-notify": "Modifications annulées par $1 ;\nretour à la dernière révision par $2. [$3 Voir les changements]",
        "sessionfailure-title": "Erreur de session",
        "sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez cliquer sur « Précédent », rechargez la page d'où vous venez, puis réessayez.",
        "changecontentmodel": "Modifier le modèle de contenu d’une page",
        "confirm-unwatch-button": "Valider",
        "confirm-unwatch-top": "Supprimer cette page de votre liste de suivi ?",
        "confirm-rollback-button": "Valider",
-       "confirm-rollback-top": "Annuler les modifications de cette page?",
+       "confirm-rollback-top": "Révoquer les modifications de cette page ?",
        "semicolon-separator": "&nbsp;;&#32;",
        "colon-separator": "&nbsp;:&#32;",
        "percent": "$1&#160;%",
        "cannotauth-not-allowed-title": "Autorisation refusée",
        "cannotauth-not-allowed": "Vous n’êtes pas autorisé à utiliser cette page",
        "changecredentials": "Modifier les informations d’identification",
-       "changecredentials-submit": "Modifier",
+       "changecredentials-submit": "Modifier les informations d’identification",
        "changecredentials-submit-cancel": "Annuler",
        "changecredentials-invalidsubpage": "$1 n’est pas un type d’information d’identification valide.",
        "changecredentials-success": "Vos informations d’identification ont été modifiées.",
        "removecredentials": "Supprimer les informations d’identification",
-       "removecredentials-submit": "Supprimer",
+       "removecredentials-submit": "Supprimer les informations d'identification",
        "removecredentials-submit-cancel": "Annuler",
        "removecredentials-invalidsubpage": "$1 n’est pas un type d’information d’identification valide.",
        "removecredentials-success": "Vos informations d’identification ont été supprimées.",
index d8f5d4d..458fa5f 100644 (file)
        "noname": "Cha do thagh thu ainm-cleachdaiche dligheach.",
        "loginsuccesstitle": "Rinn thu logadh a-steach",
        "loginsuccess": "<strong>Rinn thu logadh a-steach air {{SITENAME}} mar \"$1\".</strong>",
-       "nosuchuser": "Chan eil cleachdaiche ann air a bheil \"$1\".\nTha ainmean chleachdaichean mothaichail do litrichean mòra 's beaga.\nThoir sùil air an litreachadh no [[Special:CreateAccount|cruthaich cunntas ùr]].",
+       "nosuchuser": "Chan eil cleachdaiche ann air a bheil \"$1\".\nTha ainmean chleachdaichean mothachail do litrichean mòra 's beaga.\nThoir sùil air an litreachadh no [[Special:CreateAccount|cruthaich cunntas ùr]].",
        "nosuchusershort": "Chan eil cleachdaiche ann leis an ainm \"$1\".\nCuir sùil air an litreachadh.",
        "nouserspecified": "Tha agad ri ainm-cleachdaiche a chur ann.",
        "login-userblocked": "Chaidh an cleachdaiche seo a chasgadh. Chan eil logadh a-steach ceadaichte dhaibh.",
        "accmailtext": "Chaidh facal-faire a chruthachadh air thuaiream airson [[User talk:$1|$1]] 's a chur gu $2.\n\nGabhaidh am facal-faire airson a' chunntais ùir seo atharrachadh air an fo <em>[[Special:ChangePassword|atharraich facal-faire]]</em> às dèidh dhan chleachdaiche logadh a-steach.",
        "newarticle": "(Ùr)",
        "newarticletext": "Lean thu ri ceangal gu duilleag nach eil ann fhathast.\nCuir teacs sa bhogsa gu h-ìosal gus an duilleag seo a chruthachadh (seall air [$1 duilleag na cobharach] airson barrachd fiosrachaidh).\nMura robh dùil agad ris an duilleag seo a ruigsinn, briog air a' phutan <strong>air ais</strong> 'nad bhrabhsair.",
-       "anontalkpagetext": "----\n<em>Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.</em>\nFeumaidh sinn an àireamh IP aca a chleachdadh air sgàth sin.\nFaodadh grunn chleachdaichean seòladh IP mar a chleachdadh còmhla.\nMas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:CreateAccount|clàraich thu]] no nach dèan thu [[Special:UserLogin|logadh a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?",
+       "anontalkpagetext": "----\n<em>Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.</em>\nFeumaidh sinn àireamh an t-seòlaidh IP aca a chleachdadh air sgàth sin.\nFaodadh grunn chleachdaichean seòladh IP mar sin a chleachdadh còmhla.\nMas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:CreateAccount|clàraich thu]] no nach dèan thu [[Special:UserLogin|logadh a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?",
        "noarticletext": "Chan eil teacsa sam bith anns an duilleag seo an-dràsta.\n'S urrainn dhut [[Special:Search/{{PAGENAME}}|an tiotal seo a lorg]] ann an duilleagan eile,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh],\nno [{{fullurl:{{FULLPAGENAME}}|action=edit}} an duilleag seo a chruthachadh]</span>.",
        "noarticletext-nopermission": "Chan eil teacsa sam bith san duilleag seo an-dràsta.\n'S urrainn dhut [[Special:Search/{{PAGENAME}}|tiotal na duilleige seo a lorg]] ann an duilleagan eile, no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh]</span> ach chan eil cead agad an duilleag seo a chruthachadh.",
        "missing-revision": "Chan eil mùthadh #$1 na duilleige \"{{FULLPAGENAME}}\" ann.\n\nMar is trice, tachraidh seo ma leanas tu ceangal san eachdraidh a tha fìor aosta 's a tha a' dol gu duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
        "right-override-export-depth": "Cead gus duilleagan às-phortadh, a' gabhail a-seach duilleagan ceangailte suas ri doimhneachd de 5",
        "right-sendemail": "Cead gus puist-d a chur gu cleachdaichean eile",
        "right-passwordreset": "Cead gus puist-d ath-shuidheachadh nam facal-faire a shealltainn",
-       "right-managechangetags": "Cruthaich is toir air falbh [[Special:Tags|tagaichean]] on stòr-dàta",
+       "right-managechangetags": "Cruthaich is gnìomhaich no neo-ghnìomhaich [[Special:Tags|tagaichean]]",
        "newuserlogpage": "Loga cruthachadh nan cleachdaichean",
        "newuserlogpagetext": "Seo loga nan cleachdaichean a chaidh a chruthachadh.",
        "rightslog": "Loga ceadan a' chleachdaiche",
        "action-viewmyprivateinfo": "seall am fiosrachadh prìobhaideach agad",
        "action-editmyprivateinfo": "deasaich am fiosrachadh prìobhaideach agad",
        "action-editcontentmodel": "deasaich modail susbaint duilleige",
-       "action-managechangetags": "cruthaich is thoir air falbh tagaichean on stòr-dàta",
+       "action-managechangetags": "cruthaich is gnìomhaich no neo-ghnìomhaich tagaichean",
        "nchanges": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
        "enhancedrc-since-last-visit": "$1 on tadhal mu dheireadh",
        "enhancedrc-history": "eachdraidh",
        "emailccsubject": "Lethbhreac dhen teachdaireachd agad gu $1: $2",
        "emailsent": "Post-d air a chur",
        "emailsenttext": "Chaidh an teachdaireachd puist-d agad a chur.",
-       "emailuserfooter": "Chaidh am post-d seo a chur o $1 gu $2 leis an fheart \"cuir post-d gu cleachdaiche\" air {{SITENAME}}.",
+       "emailuserfooter": "Chaidh am post-d seo a chur o $1 gu $2 leis an fheart \"{{int:emailuser}}\" air {{SITENAME}}.",
        "usermessage-summary": "A' fàgail teachdaireachd an t-siostaim.",
        "usermessage-editor": "Teachdaire an t-siostaim",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlistanontext": "Log a-steach gus nithean air a' chlàr-fhaire agad a shealltainn no a dheasachadh.",
        "watchnologin": "Chan eil thu air logadh a-steach",
        "addwatch": "Cuir air a' chlàr-fhaire",
-       "addedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a chur ris a' [[Special:Watchlist|chlàr-fhaire]] agad.\nNochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.",
+       "addedwatchtext": "Chaidh \"[[:$1]]\" agus duilleag na deasbaireachd aige a chur ris a' [[Special:Watchlist|chlàr-fhaire]] agad.",
        "addedwatchtext-short": "Chaidh an duilleag \"$1\" a chur ris a' chlàr-fhaire agad.",
        "removewatch": "Thoir air falbh on chlàr-fhaire",
-       "removedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a thoirt air falbh on [[Special:Watchlist|chlàr-fhaire]] agad.",
+       "removedwatchtext": "Chaidh \"[[:$1]]\" agus duilleag na deasbaireachd aige a thoirt air falbh on [[Special:Watchlist|chlàr-fhaire]] agad.",
        "removedwatchtext-short": "Chaidh an duilleag \"$1\" a thoirt ait falbh on chlàr-fhaire agad.",
        "watch": "Cum sùil air",
        "watchthispage": "Cum sùil air an duilleag seo",
        "deletepage": "Sguab às duilleag",
        "confirm": "Daingnich",
        "excontent": "stuth a bh' ann: '$1'",
-       "excontentauthor": "b' e: \"$1\" an t-susbaint (is \"[[Special:Contributions/$2|$2]]\" an aon deasaiche)",
+       "excontentauthor": "b' e: \"$1\" an t-susbaint agus \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]]) an aon deasaiche",
        "exbeforeblank": "an t-susbaint mus deach a bànachadh: \"$1\"",
        "delete-confirm": "Sguab às \"$1\"",
        "delete-legend": "Sguab às",
        "delete-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nChaidh sguabadh às nan duilleagan dhen leithid a chuingeachadh ach na dèid cron a dhèanamh air {{SITENAME}} le mearachd.",
        "delete-warning-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nMa sguabas tu às dhi, dh'fhaoidte gun dèan thu cron air na gnìomhan stòr-dàta aig {{SITENAME}}; mar sin, thoir an aire.",
        "deleteprotected": "Chan urrainn dhut an duilleag seo a sguabadh às on a chaidh a dìon.",
-       "deleting-backlinks-warning": "'''Rabhadh:''' Tha [[Special:WhatLinksHere/{{FULLPAGENAME}}|duilleag eile]] a' ceangal ris an duilleag a tha thu airson sguabadh às no 'ga gabhail a-steach 'na h-iomradh.",
+       "deleting-backlinks-warning": "<strong>Rabhadh:</strong> Tha [[Special:WhatLinksHere/{{FULLPAGENAME}}|duilleag eile]] a' ceangal ris an duilleag a tha thu airson sguabadh às no 'ga gabhail a-steach 'na h-iomradh.",
        "rollback": "Roilig atharraichean air ais",
        "rollbacklink": "roilig air ais",
        "rollbacklinkcount": "roilig $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} air ais",
        "protect-locked-blocked": "Chan urrainn dhut ìre an dìon atharrachadh rè bacaidh.\nSeo na roghainnean aig an duilleag <strong>$1</strong>:",
        "protect-locked-dblock": "Chan urrainn dhut ìre an dìon atharrachadh on a tha an stòr-dàta glaiste an-dràsta.\nSeo na roghainnean aig an duilleag <strong>$1</strong>:",
        "protect-locked-access": "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.\nSeo roghainnean làithreach na duilleige <strong>$1</strong>:",
-       "protect-cascadeon": "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon o bhith mar eas air.\n'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon o bhith mar eas.",
+       "protect-cascadeon": "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil i air a tar-ghabhail {{PLURAL:$1|san duilleag|sna duilleagan}} a leanas aig a bheil dìon o bhith mar eas air.\n'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon o bhith mar eas.",
        "protect-default": "Ceadaich a h-uile cleachdaiche",
        "protect-fallback": "Na ceadaich ach do chleachdaichean aig a bheil cead \"$1\"",
        "protect-level-autoconfirmed": "Na ceadaich ach cleachdaichean a chaidh an dearbhadh gu fèin-obrachail",
        "undeletepagetext": "Chaidh {{PLURAL:$1|an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|am $1 duilleag}} a sguabadh às ach tha {{PLURAL:$1|i|iad}} san tasglann fhathast 's gabhaidh {{PLURAL:$1|a h-aiseag|an aiseag}}.\nDh'fhaoidte gun dèid an tasglann a ghlanadh gu cunbhalach.",
        "undelete-fieldset-title": "Aisig mùthaidhean",
        "undeleteextrahelp": "Gus eachdraidh shlàn na duilleige aiseag, fàg gach bogsa bàn 's briog air <strong><em>{{int:undeletebtn}}</em></strong>.\nGus cuid dheth aiseag, cuir cromag sna bogsaichean airson nam mùthaidhean a tha thu airson aiseag 's briog air <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "Chaidh {{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} a chur san tasg-lann",
+       "undeleterevisions": "Chaidh {{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} a sguabadh às",
        "undeletehistory": "Ma dh'aisigeas tu an duilleag, thèid gach mùthadh aiseag dhan eachdraidh.\nMa chaidh duilleag air a bheil an aon ainm a chruthachadh às dèidh an sguabaidh às, nochdaidh na mùthaidhean air an aiseag san eachdraidh roimhpe.",
        "undeleterevdel": "Cha dèid an sguabadh às a neo-dhèanamh ma sguabadh seo às pàirt de mhùthadh na duilleige no an fhaidhle as ùire.\nMas e seo na thachradh, feumaidh tu a' chromag a thoirt far a' mhùthaidh as ùire a chaidh a sguabadh às no gun a bhith 'ga fhalach tuilleadh.",
        "undeletehistorynoadmin": "Chaidh an duilleag seo a sguabadh às.\nChì thu adhbhar an sguabaidh às sa ghearr-chunntas gu h-ìosal cho math ri fiosrachadh mu na chleachdaichean a dheasaich an duilleag seo mus deach a sguabadh às.\nChan fhaic ach rianairean an teacsa fhèin aig na mùthaidhean air an sguabadh às.",
        "whatlinkshere-next": "{{PLURAL:$1|an ath $1|an ath $1|na ath $1|an ath $1}}",
        "whatlinkshere-links": "← ceanglaichean",
        "whatlinkshere-hideredirs": "$1 ath-sheòlaidhean",
-       "whatlinkshere-hidetrans": "$1 transclusions",
+       "whatlinkshere-hidetrans": "$1 tar-ghabhalaichean",
        "whatlinkshere-hidelinks": "$1 ceanglaichean",
-       "whatlinkshere-hideimages": "$1 ceanglaichean nam faidhlichean",
+       "whatlinkshere-hideimages": "$1 ceanglaichean fhaidhlichean",
        "whatlinkshere-filters": "Criathairean",
        "autoblockid": "Fèin-bhacadh $1",
        "block": "Bac an cleachdaiche",
        "unblock": "Neo-bhac an cleachdaiche",
        "blockip": "Bac an cleachdaiche",
        "blockip-legend": "Bac an cleachdaiche",
-       "blockiptext": "Cleachd am foirm gu h-ìosal gus seòladh IP no cleachdaiche sònraichte a bhacadh o sgrìobhadh.\nNa dèan seo ach gus dìon o bhandalachd agus a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].\nLìon an t-adhbhar sònraichte gu h-ìosal (mar eisimpleir le iomradh air na duilleagan le bhandalachd orra).",
+       "blockiptext": "Cleachd am foirm gu h-ìosal gus seòladh IP no cleachdaiche sònraichte a bhacadh o sgrìobhadh.\nNa dèan seo ach gus dìon o bhandalachd agus a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].\nLìon an t-adhbhar sònraichte gu h-ìosal (mar eisimpleir le iomradh air na duilleagan le bhandalachd orra).\n'S urrainn dhut rainsean dhe sheòlaidhean IP a bhacadh le co-chàradh [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; is /$1 an rainse as motha a tha ceadaichte airson IPv4 agus /$2 airson IPv6.",
        "ipaddressorusername": "Seòladh IP no ainm-cleachdaiche:",
        "ipbexpiry": "Falbhaidh an ùine air:",
        "ipbreason": "Adhbhar:",
        "lockedbyandtime": "(le $1 $2 $3)",
        "move-page": "Gluais $1",
        "move-page-legend": "Gluais duilleag",
-       "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
-       "movepagetext-noredirectfixer": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-stiùireadh dhan tiotal ùr an uairsin.\nDearbhaich nach bi ath-sheòlaidhean [[Special:DoubleRedirects|dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinnteach gu bheil na ceanglaichean a' dol dha na h-àitichean a bu chòir.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gur urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
-       "movepagetalktext": "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois <strong>ach:</strong>\n*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no\n*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal\n\nMa thachras seo, feumaidh to an duilleag a ghluasad no cho-aonachadh a làimh, ma tha sin fa-near dhut.",
+       "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>An aire:</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
+       "movepagetext-noredirectfixer": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-stiùireadh dhan tiotal ùr an uairsin.\nDearbhaich nach bi ath-sheòlaidhean [[Special:DoubleRedirects|dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinnteach gu bheil na ceanglaichean a' dol dha na h-àitichean a bu chòir.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gur urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>An aire:</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
+       "movepagetalktext": "Ma chuireas tu cromag sa bhogsa seo, thèid duilleag na deasbaireachd a tha co-cheangailte ris a ghluasad dhan tiotal ùr gu fèin-obrachail ach ma tha duilleag na deasbaireachd nach eil falamh ann a shiud mar-thà.\n\nMa thachras seo, feumaidh tu an duilleag a ghluasad no cho-aonachadh a làimh ma tha sin fa-near dhut.",
        "moveuserpage-warning": "<strong>Rabhadh:</strong> Tha thu airson duilleag cleachdaiche a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> ainm ùr a thoirt air a' chleachdaiche.",
        "movecategorypage-warning": "<strong>Rabhadh:</strong> Tha thu airson duilleag roinn-seòrsa a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> gach duilleag a tha san t-seann roinn-seòrsa a chur ris an roinn-seòrsa ùr.",
        "movenologintext": "Feumaidh tu a bhith 'nad bhall clàraichte 's air [[Special:UserLogin|logadh a-steach]] mus gluais thu duilleag.",
        "cant-move-to-user-page": "Chan eil cead agad duilleag a ghluasad gu duilleag cleachdaiche (ach gu fo-dhuilleag cleachdaiche).",
        "cant-move-category-page": "Chan eil cead agad duilleagan roinn-seòrsa a ghluasad.",
        "cant-move-to-category-page": "Chan eil cead agad duilleag a ghluasad gu duilleag roinn-seòrsa.",
-       "newtitle": "Dhan tiotal ùr:",
+       "newtitle": "An tiotal ùr:",
        "move-watch": "Cum sùil air an duilleag thùsail agus an duilleag thairgaideach",
        "movepagebtn": "Gluais duilleag",
        "pagemovedsub": "Shoirbhich leat leis a' ghluasad",
        "movenosubpage": "Chan eil fo-dhuilleag aig an duilleag seo.",
        "movereason": "Adhbhar:",
        "revertmove": "till",
-       "delete_and_move_text": "== Tha sguabadh às a dhìth ==\nTha an duilleag-uidhe \"[[:$1]]\" ann mar-thà.\nA bheil thu airson a sguabadh às ach am bidh rum airson a' ghluasaid ann?",
+       "delete_and_move_text": "Tha an duilleag-uidhe \"[[:$1]]\" ann mar-thà.\nA bheil thu airson a sguabadh às ach am bidh rum airson a' ghluasaid ann?",
        "delete_and_move_confirm": "Siuthad, sguab às an duilleag",
        "delete_and_move_reason": "Chaidh a sguabadh às gus rum a airson a' ghluasaid o \"[[$1]]\" a chruthachadh",
        "selfmove": "Tha tiotalan an tùis a' chinn-uidhe co-ionnann;\nchan urrainn dhut duilleag a ghluasad dhan ionad aice fhèin.",
        "move-leave-redirect": "Fàg ath-stiùireadh ann",
        "protectedpagemovewarning": "<strong>Rabhadh: Chaidh an duilleag seo a dhìon 's chan urrainn ach dhan fheadhainn aig a bheil ùghdarras rianaire a ghluasad.</strong>\nChì thu an clàr mu dheireadh san loga mar fhiosrachadh dhut gu h-ìosal:",
        "semiprotectedpagemovewarning": "<strong>An aire:</strong> Chaidh an duilleag seo a dhìon 's chan fhaod ach cleachdaichean clàraichte a ghluasad.\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
-       "move-over-sharedrepo": "== Tha am faidhle ann ==\nTha [[:$1]] ann an ionad-tasgaidh co-roinnte. Thèid tar-àithneadh air an fhaidhle cho-roinnte ma ghluaiseas tu faidhle gun tiotal seo.",
+       "move-over-sharedrepo": "Tha [[:$1]] ann an ionad-tasgaidh co-roinnte. Thèid tar-àithneadh air an fhaidhle cho-roinnte ma ghluaiseas tu faidhle gun tiotal seo.",
        "file-exists-sharedrepo": "Tha ainm an fhaidhle a thagh thu 'ga chleachdadh ann an ionad-tasgaidh co-roinnte mar-thà.\nFeuch an tagh thu ainm eile.",
        "export": "Às-phortaich duilleagan",
        "exporttext": "'S urrainn dhut teacsa is eachdraidh an deasachaidh aig duilleag no duilleagan sònraichte às-phortachadh le XML timcheall air.\nGabhaidh seo ion-phortachadh gu uicidh eile a chleachdas MediaWiki air an [[Special:Import|duilleag ion-phortachaidh]].\n\nGus duilleagan às-phortachadh, cuir a-steach na tiotalan sa bhogsa-teacsa gu h-ìosal, gach tiotal air loidhne fa leth, agus tagh a bheil thu ag iarraidh am mùthadh làithreach cho math ri seann mhùthaidhean le loidhnichean eachdraidh nan duilleagan no a bheil thu ag iarraidh am mùthadh làithreach le fiosrachadh mun deasachadh mu dheireadh.\n\nMa chuir thu an roghainn eile romhad, 's urrainn dhut ceangal a chleachdadh cuideachd, mar eisimpleir [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] airson na duilleige \"[[{{MediaWiki:Mainpage}}]]\".",
        "thumbnail_image-missing": "Tha faidhle a dhìth a-rèit coltais: $1",
        "thumbnail_image-failure-limit": "Chaidh feuchainn cus tursan ($1 no a bharrachd) o chionn goirid gus an dealbhag seo a reandaradh. Feuch ris a-rithist uaireigin eile.",
        "import": "Ion-phortaich duilleagan",
-       "importinterwiki": "Ion-phortachadh tar-uicidh",
-       "import-interwiki-text": "Tagh uicidh 's tiotal na duilleige airson ion-phortachadh.\nThèid cinn-là nam mùthaidhean 's ainmean nan deasaichean a ghlèidheadh.\nThèid gach gnìomh ion-phortachadh tar-uicidh a chur ris an [[Special:Log/import|loga ion-phortachaidh]].",
+       "importinterwiki": "Ion-phortachadh o uicidh eile",
+       "import-interwiki-text": "Tagh uicidh 's tiotal na duilleige airson ion-phortachadh.\nThèid cinn-là nam mùthaidhean 's ainmean nan deasaichean a ghlèidheadh.\nThèid gach ion-phortachadh o uicidh eile a chur ris an [[Special:Log/import|loga ion-phortachaidh]].",
        "import-interwiki-sourcewiki": "An uicidh thùsail:",
        "import-interwiki-sourcepage": "An duilleag thùsail:",
        "import-interwiki-history": "Dèan lethbhreac de dh'eachdraidh nam mùthaidhean slàna airson na duilleige seo",
        "importcantopen": "Cha deach leinn am faidhle ion-phortachaidh fhosgladh.",
        "importbadinterwiki": "Droch cheangal eadar-uicodh",
        "importsuccess": "Tha an t-ion-phortachadh coileanta!",
-       "importnosources": "Cha deach tùs ion-phortachadh tar-uicidh a mhìneachadh agus tha luchdadh suas dìreach nan eachdraidhean à comas.",
+       "importnosources": "Cha deach uicidh gus ion-phortadh uaipe a shònrachadh agus tha luchdadh suas dìreach nan eachdraidhean à comas.",
        "importnofile": "Cha deach faidhle ion-phortachaidh a luchdadh suas.",
        "importuploaderrorsize": "Dh'fhàillig le luchdadh suas an fhaidhle ion-phortachaidh.\nTha am faidhle nas motha na tha ceadaichte.",
        "importuploaderrorpartial": "Dh'fhàillig le luchdadh suas an fhaidhle ion-phortachaidh.\nCha deach ach pàirt dhen fhaidhle a luchdadh suas.",
        "import-nonewrevisions": "Cha deach mùthadh ion-phortachadh (bha iad uile ann roimhe no chaidh an leigeil seachad ri linn mhearachdan).",
        "xml-error-string": "$1 air loidhne $2, colbh $3 (baidht $4): $5",
        "import-upload": "Luchdaich suas dàta XML",
-       "import-token-mismatch": "Chaidh dàta an t-seisein air chall.\nFeuch ris a-rithist.",
+       "import-token-mismatch": "Dh'fhaoidte gun deach do logadh a-mach. <strong>Dearbhaich gu bheil thu air do chlàradh a-steach fhathast agus feuch ris a-rithist</strong>.\nMur obraich e fhathast, feuch [[Special:UserLogout|clàradh a-mach]] is a-steach a-rithist agus dearbhaich gun ceadaich am brabhsair agad briosgaidean on bhrabhsair seo.",
        "import-invalid-interwiki": "Cha ghabh ion-phortachadh in uicidh a shònraich thu.",
        "import-error-edit": "Cha deach an duilleag \"$1\" ion-phortachadh o nach fhaod thu a deasachadh.",
        "import-error-create": "Cha deach an duilleag \"$1\" ion-phortachadh o nach fhaod thu a cruthachadh.",
        "tooltip-feed-rss": "Inbhir RSS airson na duilleige seo",
        "tooltip-feed-atom": "Inbhir Atom airson na duilleige seo",
        "tooltip-t-contributions": "Seall liosta na h-obrach a rinn {{GENDER:$1|an cleachdaiche}} seo",
-       "tooltip-t-emailuser": "Cuir post-dealain dhan chleachdaiche seo",
+       "tooltip-t-emailuser": "Cuir post-dealain dhan {{GENDER:$1|chleachdaiche seo}}",
        "tooltip-t-upload": "Luchdaich suas faidhle",
        "tooltip-t-specialpages": "Liosta de gach duilleag shònraichte",
        "tooltip-t-print": "Tionndadh dhen duilleag a ghabhas a chlò-bhualadh",
        "watchlistedit-raw-done": "Chaidh an clàr-faire agad ùrachadh.",
        "watchlistedit-raw-added": "Chaidh $1 {{PLURAL:$1|tiotal|thiotal|tiotalan|tiotal}} a chur ris:",
        "watchlistedit-raw-removed": "Chaidh $1 {{PLURAL:$1|tiotal|thiotal|tiotalan|tiotal}} a thoirt air falbh:",
-       "watchlistedit-clear-title": "Clàr-faire air a ghlanadh",
+       "watchlistedit-clear-title": "Glan an clàr-faire",
        "watchlistedit-clear-legend": "Glan an clàr-faire",
        "watchlistedit-clear-explain": "Thèid a h-uile tiotal a thoirt far a' chlàr-fhaire agad",
        "watchlistedit-clear-titles": "Tiotalan:",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Slighe artaigil]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath slighe sgriobt]",
-       "redirect": "Ath-stiùireadh le faidhle, cleachdaiche, duilleag no ID a' mhùthaidh",
-       "redirect-summary": "Nì an duilleag shònraichte seo ath-stiùireadh gu faidhle (le ainm faidhle), duilleag (le ID a' mhùthaidh no ID na duilleige) no duilleag cleachdaiche (le àireamh ID a' chleachdaiche). Seo mar a chleachdas tu e: [[{{#Special:Redirect}}/file/Ball-eisimpleir.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] no [[{{#Special:Redirect}}/user/101]].",
+       "redirect": "Ath-stiùireadh le faidhle, cleachdaiche, duilleag, mhùthadh no ID loga",
+       "redirect-summary": "Nì an duilleag shònraichte seo ath-stiùireadh gu faidhle (le ainm faidhle), duilleag (le ID a' mhùthaidh no ID na duilleige) no duilleag cleachdaiche (le àireamh ID a' chleachdaiche) no innteart an loga (le ID an loga). Seo mar a chleachdas tu e: [[{{#Special:Redirect}}/file/Ball-eisimpleir.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] no [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Siuthad",
        "redirect-lookup": "Rannsaich:",
        "redirect-value": "Luach:",
        "compare-revision-not-exists": "Chan eil am mùthadh a shònraich thu ann.",
        "dberr-problems": "Duilich! Tha trioblaid teicnigeach aig an làrach seo.",
        "dberr-again": "Feitheamh mionaid no dhà 's ath-luchdaich i.",
-       "dberr-info": "(Chan obraich an conaltradh ri frithealaiche an stòir-dhàta: $1)",
-       "dberr-info-hidden": "(Chan obraich an conaltradh ri frithealaiche an stòir-dhàta)",
+       "dberr-info": "(Chan urrainn dhuinn an stòr-dàta inntrigeadh: $1)",
+       "dberr-info-hidden": "(Chan urrainn duinn an stòr-dàta inntrigeadh)",
        "dberr-usegoogle": "Feuch lorg le Google san eadar-àm.",
        "dberr-outofdate": "Thoir an aire nach eil an clàr acasan air an t-susbaint againn cho ùr sa ghabhas ma dh'fhaoidte.",
        "dberr-cachederror": "Seo lethbhreac dhen duilleag a dh'iarr thu on tasgadan 's chan eil e cho ùr 's a ghabhas, ma dh'fhaoidte.",
        "api-error-badaccess-groups": "Chan eil cead agad gus faidhlichean a luchdadh suas dhan uicidh seo.",
        "api-error-badtoken": "Mearachd taobh a-staigh: Droch thòcan.",
        "api-error-copyuploaddisabled": "Tha luchdadh suas le URL à comas air an fhrithealaiche seo.",
-       "api-error-duplicate": "Tha {{PLURAL:$1|faidhle eile|are faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint.",
+       "api-error-duplicate": "Tha {{PLURAL:$1|faidhle eile|faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint.",
        "api-error-duplicate-archive": "Tha {{PLURAL:$1|faidhle eile|faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint ach chaidh {{PLURAL:$1|a sguabadh|an sguabadh}} às.",
        "api-error-empty-file": "Tha am faidhle a chuir thu a-null falamh.",
        "api-error-emptypage": "Chan fhaodar duilleagan falamh ùra a chruthachadh.",
        "expand_templates_generate_xml": "Seall craobh parsaidh an XML",
        "expand_templates_generate_rawhtml": "Seall bun-tùs an HTML",
        "expand_templates_preview": "Ro-sheall",
-       "pagelanguage": "Roghnaichear cànan nan duilleag",
+       "pagelanguage": "Atharraich cànan na duilleige",
        "pagelang-name": "Duilleag",
        "pagelang-language": "Cànan",
        "pagelang-use-default": "Cleachd an cànan tùsail",
        "action-pagelang": "atharraich cànan nan duilleagan",
        "log-name-pagelang": "Loga air atharrachadh nan cànan",
        "log-description-pagelang": "Seo loga dhe na h-atharraichean air cànanan nan duilleagan.",
-       "logentry-pagelang-pagelang": "Dh'atharraich $1 cànan nan duilleagan airson $3 o $4 gu $5.",
+       "logentry-pagelang-pagelang": "{{GENDER:$2|Dh'atharraich}} $1 an cànan aig $3 o $4 gu $5",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (an comas)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>à comas</strong>)",
        "mediastatistics": "Stadastaireachd nam meadhanan",
index 1166b4c..dcbc97a 100644 (file)
        "cannotauth-not-allowed-title": "Permiso rexeitado",
        "cannotauth-not-allowed": "Non ten permiso para usar esta páxina",
        "changecredentials": "Cambiar as credenciais",
-       "changecredentials-submit": "Cambiar",
+       "changecredentials-submit": "Cambiar credenciais",
        "changecredentials-submit-cancel": "Cancelar",
        "changecredentials-invalidsubpage": "$1 non é un tipo de información de identificación válido.",
        "changecredentials-success": "As súas credenciais foron cambiadas.",
        "removecredentials": "Eliminar credenciais",
-       "removecredentials-submit": "Eliminar",
+       "removecredentials-submit": "Eliminar credenciais",
        "removecredentials-submit-cancel": "Cancelar",
        "removecredentials-invalidsubpage": "$1 non é un tipo de información de identificación válido.",
        "removecredentials-success": "As súas credenciais foron eliminadas.",
index d81df3d..44c0b66 100644 (file)
        "exif-orientation-1": "सामान्य",
        "namespacesall": "सगळें",
        "monthsall": "सगळे",
+       "confirm-rollback-button": "बरें",
+       "confirm-rollback-top": "ह्या पाना वयलें संपादन आशिल्ले तशें करात?",
        "watchlisttools-view": "प्रस्तूत बदल पळयात.",
        "watchlisttools-edit": "सादुरवळेरी पळय आनी संपादीत करात",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|उलयात]])",
index 2264280..b14e01a 100644 (file)
        "october": "Oktober",
        "november": "Nopember",
        "december": "Desember",
-       "january-gen": "Yanuari",
+       "january-gen": "Januwari",
        "february-gen": "Peburuwari",
        "march-gen": "Maret",
        "april-gen": "April",
        "may-gen": "Meyi",
-       "june-gen": "Yuni",
-       "july-gen": "Yuli",
+       "june-gen": "Juni",
+       "july-gen": "Juli",
        "august-gen": "Agustus",
        "september-gen": "September",
        "october-gen": "Oktober",
        "broken-file-category": "Halaamani wolo pranala berkas ma lorusa",
        "about": "Tomimbihu",
        "article": "Tuwango halaman",
-       "newwindow": "huowa to janela bohu",
+       "newwindow": "hu'owa to janela bohu",
        "cancel": "Batali",
        "moredotdotdot": "Uweewo",
        "morenotlisted": "Daputari boti dipo ganapu",
        "mypage": "Halaamani",
-       "mytalk": "Bisala",
+       "mytalk": "Lo'iya",
        "anontalk": "Bisala",
        "navigation": "Navigasi",
        "and": "&#32;wawu",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
        "actions": "Huhutu",
-       "namespaces": "Ruang tanggulo",
+       "namespaces": "Huwali lo tanggulo",
        "variants": "Varian",
        "navigation-heading": "Menu navigasi",
        "errorpagetitle": "Lotaalawa",
        "print": "Cetaki",
        "view": "Bilohi",
        "view-foreign": "Bilohi to $1",
-       "edit": "Monguba",
+       "edit": "Momoli'o",
        "edit-local": "Ubawa deskripsi lokal",
        "create": "Mohutu",
        "create-local": "Duhengi deskripsi lokal",
        "unprotectthispage": "ubawa dudaha halaman botiye",
        "newpage": "Halaman bohu",
        "talkpage": "Bisalayi halaman boti",
-       "talkpagelinktext": "bisala",
+       "talkpagelinktext": "lo'iya",
        "specialpage": "Halaman uda'a",
        "personaltools": "Pilaakasi lo hihilawo",
        "articlepage": "Bilohi tuango halaman",
        "redirectedfrom": "Pilobale lonto $1",
        "redirectpagesub": "Halaman pilobaleyalo",
        "redirectto": "Mobale ode",
-       "lastmodifiedat": "Halaman botiye iluba pulitiyo $1, $2.",
+       "lastmodifiedat": "Halaman botiye biloli'o pulitiyo $1, $2.",
        "viewcount": "Halaman botiye ma hilu'o {{PLURAL:$1|$1 kali}}.<br />",
        "protectedpage": "Halaman udaha-daha",
        "jumpto": "Lumanti'a ode",
        "currentevents-url": "Project:U yilowali baharu",
        "disclaimers": "Momaahu",
        "disclaimerpage": "Project:Momaahu umum",
-       "edithelp": "Momantu monguba",
+       "edithelp": "Wubodu momoli'o",
        "helppage-top-gethelp": "Tuulungi",
        "mainpage": "Halaman Bungaliyo",
        "mainpage-description": "Halaman bungaliyo",
        "policy-url": "Project:Kebijakan",
        "portal": "Buubu'a leembo'a",
        "portal-url": "Project:Buubu'a lembo'a",
-       "privacy": "Tinepo lo privasi",
-       "privacypage": "Project:Tinepo lo privasi",
+       "privacy": "Tinepo privasi",
+       "privacypage": "Project:Tinepo privasi",
        "badaccess": "Tilala haku momu'o",
        "badaccess-group0": "Yi'o diya o iijini mohutu kalaja u hepohilemu",
        "badaccess-groups": "Huhutu hepohilemu bilatasiyaliyo to pengguna {{PLURAL:$2|lembo'a}}$1.",
        "newmessageslinkplural": "{{PLURAL:$1|tuwawu tahuli bohu|999=tahuli bohu}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|iluba|999=u iluba}} pulitiyo",
        "youhavenewmessagesmulti": "Yio lootapu tahuli bohu to $1",
-       "editsection": "monguba",
-       "editold": "monguba",
+       "editsection": "boli'a",
+       "editold": "boli'a",
        "viewsourceold": "Bilohi bungoliyo",
-       "editlink": "monguba",
+       "editlink": "boli'a",
        "viewsourcelink": "Bilohi bungoliyo",
-       "editsectionhint": "Monguba tayadu:$1",
+       "editsectionhint": "Momoli'o tayadu:$1",
        "toc": "Tuwango",
        "showtoc": "popobilehe",
        "hidetoc": "wanto'a",
        "site-atom-feed": "Paalo $1 Atom",
        "page-rss-feed": "Paalo $1 RSS",
        "page-atom-feed": "Paalo $1 Atom",
-       "red-link-title": "$1 (halaman dila sadi-sadia)",
+       "red-link-title": "$1 (halaman diila sadi-sadia)",
        "sort-descending": "Urutiya detibawa",
        "sort-ascending": "Urutiya deyitaato",
        "nstab-main": "Halaman",
        "sig_tip": "Pali lo ulu'umu wawu tuwoto wakutu",
        "hr_tip": "Garisi bula-bulawahu",
        "summary": "Limbu'o",
-       "minoredit": "Utiye iluba kiki'o",
+       "minoredit": "Utiye biloli'o ngo'idi",
        "watchthis": "Dahayi halaman botiye",
        "savearticle": "Tahuwa halaman",
        "showpreview": "Bilohi pratayang",
-       "showdiff": "Popobilohe u lo'ubawa",
+       "showdiff": "Popobilohe u loboli'a",
        "anoneditwarning": "<strong>Mopo'eela:</strong> Yi'o diipo tilumuwo. Alamat IP olemu ma ontonga lo tawu daata wonu yi'o momoli'o. Wonu Yi'o <strong>[$1 tumuwoto log]</strong> meyalo <strong>[$2 mohutu akun]</strong>, u biloli'umu madiatribusikan ode tanggulumu, wolo huna uweewoliyo.",
        "loginreqlink": "tumuwoto log",
        "newarticletext": "Yi'o lodudu'a wumbuta ode halaman diya'a. \nWonu mohutu halaman botiye, ketik tuwango halaman to kotak to tibawa botiye (bilohi [$1 halaman wubodu] ode habari wumbutiyo). \nWonu Yi'o ja sangaja tilumuwota ode halaman botiye, kutiya tombol <strong>mohuwalingo</strong>.",
        "permissionserrorstext-withaction": "Yi'o ja haku akses $2, sababu {{PLURAL:$1|alasani}} botiya:",
        "moveddeleted-notice": "Halaman botiye ma yiluluto.\nSebagai referensi, botiya log piloluluta wawu piloheyiya halaman botiye.",
        "viewpagelogs": "Bilohi log lo halaman botiye",
-       "currentrev-asof": "Revisi pulitiyo to $1",
-       "revisionasof": "Iluba to $1",
+       "currentrev-asof": "Biloli'o pulitiyo to $1",
+       "revisionasof": "Biloli'o to $1",
        "revision-info": "Biloli'o per $1 oleh {{GENDER:$6|$2}}$7",
-       "previousrevision": "Iluba yilaluma'o",
-       "nextrevision": "Revisi lapatiyoma'o →",
-       "currentrevisionlink": "Revisi pulitiyo",
+       "previousrevision": "Biloli'o yilaluma'o",
+       "nextrevision": "Biloli'o lapatiyoma'o →",
+       "currentrevisionlink": "Biloli'o pulitiyo",
        "cur": "mst",
        "last": "diipo",
-       "rev-delundel": "lo'ubawa bibilohu",
+       "rev-delundel": "popobilohe/wanto'a",
        "history-title": "Riwayati lo'u loboli'a lonto \"$1\"",
        "difference-title": "$1 hihede revisi",
        "lineno": "Baarisi $1:",
        "searchprofile-articles-tooltip": "Mololohu to $1",
        "searchprofile-images-tooltip": "Mololohe berkas",
        "searchprofile-everything-tooltip": "Mololohe nga'amila tuwango situs (wolo halaman polo'iyalo)",
-       "searchprofile-advanced-tooltip": "Mololohu to ruang tanggulo biasa",
+       "searchprofile-advanced-tooltip": "Mololohu to huwali lo tanggulo biasa",
        "search-result-size": "$1 ({{PLURAL:$2|1 tahe|$2 tahe}})",
        "search-redirect": "(mopobale $1)",
        "search-section": "(tayadu) $1",
        "right-writeapi": "Mopohuna API moluladu",
        "newuserlogpage": "Log ta ohu'uwo bohu",
        "enhancedrc-history": "riwayati",
-       "recentchanges": "Lo'ubawa u bohu",
-       "recentchanges-legend": "Tulawolo boli'o u bohu",
+       "recentchanges": "Boheli loboli'a mola",
+       "recentchanges-legend": "Tulawotolo boheli loboli'a mola",
        "recentchanges-summary": "Mololohe u yilo'ubawa bohu to halaman wiki botiye.",
-       "recentchanges-label-newpage": "Monguba utiye mohutu halaman bohu",
-       "recentchanges-label-minor": "Utiye iluba kiki'o",
-       "recentchanges-label-bot": "Longuba utiye kilaraja lo bot",
-       "recentchanges-label-unpatrolled": "U bilili'a botiye diipo pilatroli",
-       "recentchanges-label-plusminus": "Lo'ubawa tu'udu halaman boti to delomo bita",
+       "recentchanges-label-newpage": "Momoli'a utiye mohutu halaman bohu",
+       "recentchanges-label-minor": "Utiye biloli'o ngo'idi",
+       "recentchanges-label-bot": "Lomoli'a utiye kilaraja lo bot",
+       "recentchanges-label-unpatrolled": "U biloli'a botiye diipo pilatroli",
+       "recentchanges-label-plusminus": "Loboli'o tu'udu halaman boti to delomo bita",
        "recentchanges-legend-heading": "<strong>Keterangan:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (bilohi olo [[Special:NewPages|list of new pages]])",
-       "rclistfrom": "Popobilohe u lobohuwa lonto $2, $3",
-       "rcshowhideminor": "$1 iluba kiki'o",
+       "rclistfrom": "Popobilohe u loboli'a lonto $2, $3",
+       "rcshowhideminor": "$1 biloli'o ngo'idi",
        "rcshowhideminor-show": "Popobilohe",
        "rcshowhideminor-hide": "Wanto'a",
        "rcshowhidebots": "$1 bot",
        "rcshowhidebots-hide": "Wanto'a",
        "rcshowhideliu": "$1 ta ohu'uwo to daputari",
        "rcshowhideliu-hide": "Wanto'a",
-       "rcshowhideanons": "$1 iluba lo ta ja'otawa",
+       "rcshowhideanons": "$1 biloli'o lo tawu weewo",
        "rcshowhideanons-show": "Popobilohe",
        "rcshowhideanons-hide": "Wanto'a",
-       "rcshowhidemine": "$1 iluba'u",
+       "rcshowhidemine": "$1 biloli'u'u",
        "rcshowhidemine-show": "Popobilohe",
        "rcshowhidemine-hide": "Wanto'a",
        "rclinks": "Popobilohe $1 u yilo'boli'a pulitiyo to delomo $2 dulahu pulitiyo<br />$3",
        "minoreditletter": "k",
        "newpageletter": "B",
        "boteditletter": "b",
-       "rc-change-size-new": "$1 {{PLURAL:$1|bita}} lapato iluba",
-       "recentchangeslinked": "Lo'ubawa wayitiyo",
-       "recentchangeslinked-toolbox": "Lo'ubawa wayitiyo",
-       "recentchangeslinked-title": "Lo'ubawa a'aayita wolo $1",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bita}} lapato biloli'o",
+       "recentchangeslinked": "Loboli'a wayitiyo",
+       "recentchangeslinked-toolbox": "Loboli'o wayitiyo",
+       "recentchangeslinked-title": "Loboli'a a'aayita wolo $1",
        "recentchangeslinked-summary": "Utiye daputari lo'ubawa to halaman a'ayita wolo halaman tuwawu (meyalo tayadu to kategori tuwawu)\nHalaman to [[Special:Watchlist|he'awasiyamu]] ontonga <strong>cetakiya mohulodu</strong>.",
        "recentchangeslinked-page": "Tanggulo halaman:",
-       "recentchangeslinked-to": "Poppobilohe lo'ubawa to halaman u a'aita wolo halaman hepoposadiyalo",
+       "recentchangeslinked-to": "Poppobilohe loboli'a to halaman wayitiyo wolo halaman hepoposadiyalo",
        "upload": "Detohe berkas",
        "filedesc": "Limbu'o",
        "license-header": "Tayadu lisensi",
        "rollbacklink": "wuwalinga",
        "rollbacklinkcount": "pohuwalinga $1 {{PLURAL:$1|biloli'o}}",
        "protectlogpage": "Log mopo'aamani",
-       "namespace": "Ruangtanggulo",
-       "invert": "Pohuwalinga u pilili",
-       "tooltip-invert": "Centang kotak botiye u mopowanto'o halaman yiloboli'a to delomo huwali lo tanggulo u pilili (wawu huwali lo tanggulo a'ayita wanu dicentang)",
-       "namespace_association": "Huwali tanggulo a'aayita",
-       "tooltip-namespace_association": "Centang halaman botiye u mopowayito huwali lo tanggulo biisalawa meyalo subjek u a'ayita wolo huwali lo tanggulo u pilili.",
+       "namespace": "Huwali lo tanggulo",
+       "invert": "Pohuwalinga tilulawoto",
+       "tooltip-invert": "Centang kotak botiye u mopowanto'o halaman yiloboli'a to delomo huwali lo tanggulo tilulawoto (wawu huwali lo tanggulo a'ayita wanu dicentang)",
+       "namespace_association": "Huwali lo tanggulo a'aayita",
+       "tooltip-namespace_association": "Centang halaman botiye u mopowayito huwali lo tanggulo lo'iyawa meyalo subjek u a'ayita wolo huwali lo tanggulo u tilulawoto.",
        "blanknamespace": "Bungaliyo",
        "contributions": "Kontribusi {{GENDER:$1|Ta ohu'uwo}}",
        "mycontris": "Kontribusi",
        "tooltip-pt-logout": "Lumuwalo log",
        "tooltip-pt-createaccount": "Yi'o popoyingowaliyo mohutu akun wawu tumuwoto log; openu utiye ja wajibu",
        "tooltip-ca-talk": "Tombilu tomimbihu tuwango halaman",
-       "tooltip-ca-edit": "Ubawa halaman botiye",
+       "tooltip-ca-edit": "Boli'a halaman botiye",
        "tooltip-ca-addsection": "Mulai tayade bohu",
        "tooltip-ca-viewsource": "Halaman botiye daha-daha. Yi'o bo mowali momilohe bungo",
-       "tooltip-ca-history": "Iluba pulitiyo to halaman botiye",
+       "tooltip-ca-history": "Biloli'o pulitiyo to halaman botiye",
        "tooltip-ca-move": "Heyiya halaman botiye",
        "tooltip-ca-watch": "Popoduhengama'o halaman botiye to daputari he'awasiyalo",
        "tooltip-search": "Lolohe {{SITENAME}}",
        "tooltip-search-go": "Lolohe halaman tuwawu wolo tanggula delo odiye wonu woluwo",
        "tooltip-search-fulltext": "Lolohe halaman o tulade odiye",
-       "tooltip-p-logo": "Bilehi halamani bungaliyo",
+       "tooltip-p-logo": "Bilohi halaman bungaliyo",
        "tooltip-n-mainpage": "Bilohi halaman bungaliyo",
        "tooltip-n-mainpage-description": "Bilohi halaman bungaliyo",
        "tooltip-n-portal": "Tomimbihu poroyek, wolo u mowali pohutuwomu, to'utonu mololohe u tuwawu",
        "tooltip-n-currentevents": "Lolohe habari tomimbihu u yilowali baharu",
-       "tooltip-n-recentchanges": "Daputari iluba bohu todelomo wiki",
+       "tooltip-n-recentchanges": "Daputari boheli loboli'a mola to delomo wiki botiye",
        "tooltip-n-randompage": "Popobilohe totonula halaman",
-       "tooltip-n-help": "Taambati pololohela yibodu",
-       "tooltip-t-whatlinkshere": "Daputari nga'amila halaman wiki o wumbuta ode halaman boti",
-       "tooltip-t-recentchangeslinked": "U yilo'ubawa baharu to halaman o wumbuta ode halaman botiye",
+       "tooltip-n-help": "Taambati pololohela wubodu",
+       "tooltip-t-whatlinkshere": "Daputari nga'amila halaman wiki owumbuta ode halaman botiye",
+       "tooltip-t-recentchangeslinked": "Boheli loboli'a mola to halaman owumbuta ode halaman botiye",
        "tooltip-feed-atom": "Paalo atom ode halaman botiya",
        "tooltip-t-contributions": "Daputari kontribusi {{GENDER:$1|ta ohu'uwo botiye}}",
        "tooltip-t-upload": "Detohe berkas-berkas",
        "tooltip-t-permalink": "Wumbuta kakali u mopo'opiyohe halaman botiye",
        "tooltip-ca-nstab-main": "Bilohi tuwango halaman",
        "tooltip-ca-nstab-user": "Bilohi halaman pengguna",
-       "tooltip-ca-nstab-special": "Utiye halaman istimewa, wawu ja mowali ubaalo",
+       "tooltip-ca-nstab-special": "Utiye halaman istimewa, wawu ja mowali boli'olo",
        "tooltip-ca-nstab-project": "Bilohi halaman poroyek",
        "tooltip-ca-nstab-image": "Bilohi berkas lo halaman",
        "tooltip-ca-nstab-template": "Bilohi template",
        "tooltip-ca-nstab-category": "Bilohi kategori halaman",
-       "tooltip-save": "Tahuwa u ilubamu",
-       "tooltip-preview": "Bilohipo u ilubamu. Popopasiya utiye to'u diipo molahu.",
-       "tooltip-diff": "Bilohi u lo'ubawa pilohutumu",
+       "tooltip-save": "Tahuwa u biloli'umu",
+       "tooltip-preview": "Bilohipo u biloli'umu. Popopasiya utiye to'u diipo molahu.",
+       "tooltip-diff": "Bilohi u loboli'o pilohutumu",
        "tooltip-rollback": "\"Wuwalingo\" lopobatali u pilo'opiyohu to halaman botiye ode kontributor pulitiyo pe'enta lo klik.",
        "tooltip-undo": "\"wuwalingo\" lopobatali u biloli'a botiye wawu lomu'o kotak momoli'o wolo mode pratayang. Alasani mowali duhengalo to kotak limbu-limbu'o.",
        "tooltip-summary": "Tuwota tulade limbu-limbu'o",
-       "simpleantispam-label": "Momarakira anti-spam.\n<strong>kekeya</strong> tuwangalo!",
+       "simpleantispam-label": "Momarakisa anti-spam.\n<strong>kekeya</strong> tuwangalo!",
        "pageinfo-toolboxlink": "Halaman habari",
        "previousdiff": "← Biloli'o to'udiipo",
        "nextdiff": "Biloli'o lapatiyoma'o →",
        "file-info-size": "$1 x $2 piksel, tu'udu berkas:$3, MIME tipe: $4",
-       "file-nohires": "Diya'a resolusi molanggato",
+       "file-nohires": "Diya'a resolusi damango",
        "svg-long-desc": "Berkas SGV, nominal $1 x $2 piksel, damango berkas:$3",
        "show-big-image": "Berkas asli",
        "show-big-image-preview": "Tu'udu lo'u diipo mopobilohu: $1",
        "exif-orientation": "Orientasi",
        "exif-xresolution": "Resolusi bula-bulawahu",
        "exif-yresolution": "Resolusi bula-bulalingo",
-       "exif-datetime": "Tanggal wawu wakutu longuba berkas",
+       "exif-datetime": "Tanggal wawu wakutu lomoli'o berkas",
        "exif-make": "Pabiriki lo kamera",
        "exif-model": "Model lo kamera",
        "exif-software": "Pilakasi moluluhi'o",
index e3ae604..e4444d9 100644 (file)
        "versionrequired": "મીડીયાવિકિનું $1 સંસ્કરણ જરૂરી",
        "versionrequiredtext": "આ પાનાના વપરાશ માટે મીડિયાવિકિનું $1 સંસ્કરણ જરૂરી.\n\nજુઓ [[Special:Version|સંસ્કરણ પાનું]].",
        "ok": "મંજૂર",
-       "retrievedfrom": "\"$1\"થી લીધેલું",
+       "retrievedfrom": "\"$1\" થી મેળવેલ",
        "youhavenewmessages": "{{PLURAL:$3|તમારી પાસે}} $1 ($2).",
        "youhavenewmessagesfromusers": "આપને માટે {{PLURAL:$3|અન્ય સભ્ય|$3 અન્ય સભ્યો}} તરફથી $1 છે. ($2).",
        "youhavenewmessagesmanyusers": "આપને માટે ઘણાં સભ્યો તરફથી $1 છે ($2).",
index adffe21..4edc6c8 100644 (file)
@@ -76,7 +76,7 @@
        "tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
        "tog-watchlisthidecategorization": "הסתרת שינויים בקטגוריות של דפים",
        "tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דוא\"ל שאני {{GENDER:|שולח|שולחת}} למשתמשים",
-       "tog-diffonly": "×\91×\99×\98×\95×\9c ×\94צ×\92ת ×ª×\95×\9b×\9f ×\94×\93×£ ×\9eת×\97ת ×\9c×\94ש×\95×\95×\90ת הגרסאות",
+       "tog-diffonly": "×\9c×\90 ×\9c×\94צ×\99×\92 ×\90ת ×ª×\95×\9b×\9f ×\94×\93×£ ×\9eת×\97ת ×\9c×\94×\91×\93×\9c×\99×\9d ×\91×\99×\9f הגרסאות",
        "tog-showhiddencats": "הצגת קטגוריות מוסתרות",
        "tog-norollbackdiff": "לא להציג את ההבדלים בין הגרסאות לאחר ביצוע שחזור",
        "tog-useeditwarning": "הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו",
        "filenotfound": "הקובץ \"$1\" לא נמצא.",
        "unexpected": "ערך לא צפוי: \"$1\"=\"$2\"",
        "formerror": "שגיאה: לא ניתן היה לשלוח את הטופס.",
-       "badarticleerror": "×\9c×\90 × ×\99ת×\9f ×\9c×\91צע ×¤×¢×\95×\9c×\94 ×\96×\95 בדף זה.",
+       "badarticleerror": "×\9c×\90 × ×\99ת×\9f ×\9c×\91צע ×\90ת ×\94פע×\95×\9c×\94 ×\94×\96×\90ת בדף זה.",
        "cannotdelete": "לא ניתן היה למחוק את הדף או הקובץ \"$1\".\nייתכן שהוא כבר נמחק על־ידי משתמש אחר.",
        "cannotdelete-title": "לא ניתן למחוק את הדף \"$1\"",
        "delete-hook-aborted": "המחיקה הופסקה על־ידי מבנה Hook.\nלא ניתן הסבר.",
        "session_fail_preview": "מצטערים! לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.\n\nייתכן שנותקתם מהחשבון. <strong>אנא ודאו שאתם עדיין מחוברים לחשבון ונסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
        "session_fail_preview_html": "מצטערים! לא ניתן לבצע את עריכתם עקב אובדן מידע הכניסה.\n\n<em>כיוון שב{{grammar:תחילית|{{SITENAME}}}} אפשרות השימוש ב־HTML גולמי מופעלת, התצוגה המקדימה מוסתרת כדי למנוע התקפות JavaScript.</em>\n\n<strong>אם זהו ניסיון עריכה לגיטימי, אנא נסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
        "token_suffix_mismatch": "'''עריכתך נדחתה כיוון שהדפדפן שלך מחק את תווי הפיסוק באסימון העריכה.'''\nהעריכה נדחתה כדי למנוע בעיות כאלה בטקסט של הדף.\nלעתים התקלה מתרחשת עקב שימוש בשירות פרוקסי אנונימי פגום.",
-       "edit_form_incomplete": "'''כמה חלקים מטופס העריכה לא הגיעו לשרת; בדקו היטב שעריכותיכם לא נפגעו ונסו שוב.'''",
+       "edit_form_incomplete": "<strong>חלקים מסוימים מטופס העריכה לא הגיעו לשרת; נא לבדוק שהעריכה לא נפגעה ולנסות שוב.</strong>",
        "editing": "עריכת הדף \"$1\"",
        "creating": "יצירת הדף \"$1\"",
        "editingsection": "עריכת הדף \"$1\" (פסקה)",
        "content-failed-to-parse": "פענוח $2 כתוכן מסוג $1 נכשל: $3",
        "invalid-content-data": "מידע שגוי על התוכן",
        "content-not-allowed-here": "תוכן מסוג \"$1\" אינו מותר בדף [[$2]]",
-       "editwarning-warning": "×¢×\96×\99×\91ת ×\93×£ ×\96×\94 ×¢×©×\95×\99×\94 ×\9c×\92ר×\95×\9d ×\9c×\90×\95×\91×\93×\9f ×\9b×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×©×\91×\99צעת×\9d.\n×\90×\9d ×\90ת×\9d ×\9e×\97×\95×\91ר×\99×\9d ×\9c×\97ש×\91×\95×\9f, ×ª×\95×\9b×\9c×\95 ×\9c×\91×\98×\9c ×\90×\96×\94ר×\94 ×\96×\95 ×\91×\97×\9cק \"{{int:prefs-editing}}\" ×©×\91×\94×¢×\93פ×\95ת ×©×\9c×\9b×\9d.",
+       "editwarning-warning": "×¢×\96×\99×\91ת ×\93×£ ×\96×\94 ×¢×\9c×\95×\9c×\94 ×\9c×\92ר×\95×\9d ×\9c×\9b×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×©×\91×\99צעת ×\9c×\94×\99×¢×\9c×\9d. ×\90×\9d ×\99ש ×\9c×\9a ×\97ש×\91×\95×\9f ×\91×\90תר, ×\91×\90פשר×\95ת×\9a ×\9c×\91×\98×\9c ×\90ת ×\94×\90×\96×\94ר×\94 ×\94×\96×\90ת ×\91×\97×\9cק \"{{int:prefs-editing}}\" ×©×\91×\94×¢×\93פ×\95ת ×©×\9c×\9a.",
        "editpage-notsupportedcontentformat-title": "סוג התוכן אינו נתמך",
        "editpage-notsupportedcontentformat-text": "תוכן מסוג $1 אינו נתמך על־ידי מודל התוכן $2.",
        "content-model-wikitext": "קוד ויקי",
        "rev-showdeleted": "הצגה",
        "revisiondelete": "מחיקה ושחזור של גרסאות",
        "revdelete-nooldid-title": "גרסת מטרה בלתי תקינה",
-       "revdelete-nooldid-text": "×\90×\95 שלא ציינת שום גרסה שהפעולה תבוצע עליה, או שהגרסה שציינת אינה קיימת, או שניסית להסתיר את הגרסה הנוכחית.",
-       "revdelete-no-file": "×\94ק×\95×\91×¥ ×©×¦×\99×\99נת אינו קיים.",
-       "revdelete-show-file-confirm": "×\94×\90×\9d ×\90ת×\9d ×\91×\98×\95×\97×\99×\9d ×©×\91רצ×\95× ×\9b×\9d ×\9cצפ×\95ת ×\91×\92רס×\94 ×\94×\9e×\97×\95ק×\94 ×©×\9c ×\94ק×\95×\91×¥ \"<nowiki>$1</nowiki>\" ×\9eת×\90ר×\99×\9a $3, $2?",
+       "revdelete-nooldid-text": "×\99×\99ת×\9b×\9f שלא ציינת שום גרסה שהפעולה תבוצע עליה, או שהגרסה שציינת אינה קיימת, או שניסית להסתיר את הגרסה הנוכחית.",
+       "revdelete-no-file": "×\94ק×\95×\91×¥ ×©×¦×\95×\99×\9f אינו קיים.",
+       "revdelete-show-file-confirm": "×\94×\90×\9d ×\91רצ×\95× ×\9a ×\9cצפ×\95ת ×\91×\92רס×\94 ×\9e×\97×\95ק×\94 ×©×\9c ×\94ק×\95×\91×¥ \"<nowiki>$1</nowiki>\" ×\9eÖ¾$3, $2?",
        "revdelete-show-file-submit": "כן",
        "revdelete-selected-text": "{{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}} מתוך הדף [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|גרסת הקובץ שנבחרה|גרסאות הקובץ שנבחרו}} מתוך [[:$2]]:",
        "logdelete-text": "פעולות יומן שהוסתרו עדיין יופיעו בדפי היומנים, אבל התוכן שלהן לא יהיה זמין לציבור.",
        "revdelete-text-others": "מפעילי מערכת אחרים עדיין יוכלו לגשת לתוכן המוסתר ואף לשחזר אותו, אלא אם כן תוגדרנה הגבלות נוספות.",
        "revdelete-confirm": "אנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
-       "revdelete-suppress-text": "יש להשתמש בהעלמה '''אך ורק''' במקרים הבאים:\n* מידע שעלול להיות לשון הרע\n* חשיפת מידע אישי\n*: <em>כתובות בתים ומספרי טלפון, מספרי זהות, וכו'</em>",
+       "revdelete-suppress-text": "יש להשתמש בהעלמה <strong>אך ורק</strong> במקרים הבאים:\n* מידע שעלול להיות לשון הרע\n* חשיפת מידע אישי\n*: <em>כתובות בתים ומספרי טלפון, מספרי זהות, וכו'</em>",
        "revdelete-legend": "הגדרת הגבלות התצוגה",
-       "revdelete-hide-text": "תוכן הגרסה",
+       "revdelete-hide-text": "×\94סתרת ×ª×\95×\9b×\9f ×\94×\92רס×\94",
        "revdelete-hide-image": "הסתרת תוכן הקובץ",
        "revdelete-hide-name": "הסתרת היעד והפרמטרים",
-       "revdelete-hide-comment": "תקציר העריכה",
-       "revdelete-hide-user": "שם המשתמש או כתובת ה־IP של העורך",
+       "revdelete-hide-comment": "×\94סתרת ×ª×§×¦×\99ר ×\94ער×\99×\9b×\94",
+       "revdelete-hide-user": "×\94סתרת ×©×\9d ×\94×\9eשת×\9eש ×\90×\95 ×\9bת×\95×\91ת ×\94Ö¾IP ×©×\9c ×\94×¢×\95ר×\9a",
        "revdelete-hide-restricted": "העלמת המידע גם ממפעילי מערכת",
        "revdelete-radio-same": "(ללא שינוי)",
-       "revdelete-radio-set": "×\9e×\95סתר",
-       "revdelete-radio-unset": "×\92×\9c×\95×\99",
-       "revdelete-suppress": "×\94×¢×\9c×\9eת ×\94×\9e×\99×\93×¢ ×\92×\9d ×\9e×\9eפע×\99×\9c×\99 ×\94×\9eער×\9bת",
+       "revdelete-radio-set": "×\9b×\9f",
+       "revdelete-radio-unset": "×\9c×\90",
+       "revdelete-suppress": "העלמת המידע גם ממפעילי מערכת",
        "revdelete-unsuppress": "הסרת הגבלות בגרסאות המשוחזרות",
        "revdelete-log": "סיבה:",
        "revdelete-submit": "ביצוע על {{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}}",
        "revdel-restore": "שינוי מצב התצוגה",
        "pagehist": "היסטוריית הגרסאות של הדף",
        "deletedhist": "הגרסאות המחוקות",
-       "revdelete-hide-current": "שגיאה בהסתרת הפריט מתאריך $2, $1: זו הגרסה הנוכחית.\nלא ניתן להסתיר אותה.",
-       "revdelete-show-no-access": "שגיאה בהצגת הפריט מתאריך $2, $1: פריט זה סומן כ\"מוגבל\".\nאין לך גישה אליו.",
-       "revdelete-modify-no-access": "שגיאה בשינוי הפריט מתאריך $2, $1: פריט זה סומן כ\"מוגבל\".\nאין לכם גישה אליו.",
+       "revdelete-hide-current": "שגיאה בהסתרת הפריט מ־$2, $1: זו הגרסה הנוכחית.\nלא ניתן להסתיר אותה.",
+       "revdelete-show-no-access": "שגיאה בהצגת הפריט מ־$2, $1: פריט זה סומן כ\"מוגבל\".\nאין לך גישה אליו.",
+       "revdelete-modify-no-access": "שגיאה בשינוי הפריט מ־$2, $1: פריט זה סומן כ\"מוגבל\".\nאין לך גישה אליו.",
        "revdelete-modify-missing": "שגיאה בשינוי פריט מספר $1: הוא אינו נמצא בבסיס הנתונים!",
        "revdelete-no-change": "<strong>אזהרה:</strong> לפריט מ־$2, $1 כבר היו הגדרות התצוגה שביקשת.",
-       "revdelete-concurrent-change": "ש×\92×\99×\90×\94 ×\91ש×\99× ×\95×\99 ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c פריט מ־$2, $1: נראה שמצב התצוגה שלו כבר שוּנה על־ידי מישהו אחר בזמן שניסית לשנות אותו.\nבאפשרותך למצוא פרטים ביומנים.",
-       "revdelete-only-restricted": "שגיאה בהסתרת הפריט מתאריך $2, $1: אין באפשרותך להעלים פריטים ממפעילי המערכת מבלי לבחור גם באחת מאפשרויות הנראוּת האחרות.",
+       "revdelete-concurrent-change": "ש×\92×\99×\90×\94 ×\91ש×\99× ×\95×\99 ×\94פריט מ־$2, $1: נראה שמצב התצוגה שלו כבר שוּנה על־ידי מישהו אחר בזמן שניסית לשנות אותו.\nבאפשרותך למצוא פרטים ביומנים.",
+       "revdelete-only-restricted": "שגיאה בהסתרת הפריט מ־$2, $1: לא ניתן להעלים פריטים ממפעילי מערכת מבלי לבחור גם באחת מהאפשרויות האחרות.",
        "revdelete-reason-dropdown": "* סיבות מחיקה נפוצות\n** הפרת זכויות יוצרים\n** תקציר עריכה או מידע אישי לא הולמים\n** שם משתמש לא הולם\n** מידע שעלול להיות לשון הרע",
        "revdelete-otherreason": "סיבה אחרת/נוספת:",
        "revdelete-reasonotherlist": "סיבה אחרת",
        "prefs-watchlist-days": "מספר הימים שמוצגים ברשימת המעקב:",
        "prefs-watchlist-days-max": "לכל היותר {{PLURAL:$1|יום אחד|יומיים|$1 ימים}}",
        "prefs-watchlist-edits": "המספר המרבי של העריכות שמוצגות ברשימת המעקב המורחבת:",
-       "prefs-watchlist-edits-max": "לכל היותר: 1000",
+       "prefs-watchlist-edits-max": "לכל היותר: 1,000",
        "prefs-watchlist-token": "אסימון לרשימת המעקב:",
        "prefs-misc": "שונות",
        "prefs-resetpass": "שינוי סיסמה",
        "recentchangesdays-max": "לכל היותר {{PLURAL:$1|יום אחד|יומיים|$1 ימים}}",
        "recentchangescount": "מספר העריכות שמוצגות כברירת מחדל:",
        "prefs-help-recentchangescount": "ההעדפה הזאת כוללת את דף השינויים האחרונים, דפי היסטוריית גרסאות ויומנים.",
-       "prefs-help-watchlist-token2": "×\96×\94×\95 ×\94×\9eפת×\97 ×\94ס×\95×\93×\99 ×\9c×\94×\96× ×\94 ×©×\9c ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a.\n×\9b×\9c ×\9e×\99 ×©×\99×\95×\93×¢ ×\90×\95ת×\95 ×\99×\9b×\95×\9c ×\9cקר×\95×\90 ×\90ת ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a, ×\9c×\9b×\9f ×\90×\99×\9f ×\9cשתף ×\90×\95ת×\95.\n×\9cמקרה הצורך, אפשר [[Special:ResetTokens|לאפס את האסימון]].",
+       "prefs-help-watchlist-token2": "×\96×\94×\95 ×\94×\9eפת×\97 ×\94ס×\95×\93×\99 ×\9c×\94×\96× ×\94 ×©×\9c ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a.\n×\9b×\9c ×\9e×\99 ×©×\99×\95×\93×¢ ×\90×\95ת×\95 ×\99×\9b×\95×\9c ×\9cקר×\95×\90 ×\90ת ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a, ×\9c×\9b×\9f ×\90×\99×\9f ×\9cשתף ×\90×\95ת×\95.\n×\91מקרה הצורך, אפשר [[Special:ResetTokens|לאפס את האסימון]].",
        "savedprefs": "ההעדפות שלך נשמרו.",
        "savedrights": "ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} \"$1\" נשמרו.",
        "timezonelegend": "אזור זמן:",
        "protectedtitles-submit": "הצגת הדפים",
        "listusers": "רשימת משתמשים",
        "listusers-editsonly": "הצגת משתמשים עם עריכות בלבד",
-       "listusers-creationsort": "מיון לפי תאריך היצירה",
+       "listusers-creationsort": "מיון לפי תאריך היצירה של החשבון",
        "listusers-desc": "מיון בסדר יורד",
        "usereditcount": "{{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "usercreated": "{{GENDER:$3|נוצר|נוצרה}} ב־$2, $1",
        "trackingcategories-disabled": "הקטגוריה מבוטלת",
        "mailnologin": "אין כתובת לשליחה",
        "mailnologintext": "יש [[Special:UserLogin|להיכנס לחשבון]] ולהגדיר כתובת דואר אלקטרוני תקינה ב[[Special:Preferences|העדפות המשתמש]] כדי לשלוח דואר אלקטרוני למשתמשים אחרים.",
-       "emailuser": "שליחת דוא\"ל ל{{GENDER:{{BASEPAGENAME}}|משתמש זה|משתמשת זו}}",
-       "emailuser-title-target": "שליחת דוא\"ל {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
-       "emailuser-title-notarget": "שליחת דוא\"ל למשתמש",
+       "emailuser": "שליחת דוא\"ל ל{{GENDER:{{BASEPAGENAME}}|משתמש|משתמשת}}",
+       "emailuser-title-target": "שליחת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
+       "emailuser-title-notarget": "שליחת דואר אלקטרוני למשתמש",
        "emailpagetext": "ניתן להשתמש בטופס שלהלן כדי לשלוח הודעת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}.\nכתובת הדואר האלקטרוני שהזנת ב[[Special:Preferences|העדפות המשתמש שלך]] תופיע ככתובת שההודעה נשלחה ממנה, כדי לאפשר תגובה ישירה.",
        "defemailsubject": "דוא\"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש \"$1\"",
        "usermaildisabled": "שליחת דוא\"ל למשתמשים מבוטלת",
        "rollbacklinkcount": "שחזור {{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "rollbacklinkcount-morethan": "שחזור יותר מ{{PLURAL:$1|עריכה אחת|־$1 עריכות}}",
        "rollbackfailed": "השחזור נכשל",
-       "rollback-missingparam": "חסר פרמטר נדרש בבקשה.",
+       "rollback-missingparam": "חסרים פרמטרים נדרשים להגשת הבקשה.",
        "cantrollback": "לא ניתן לשחזר את העריכה;\nהתורם האחרון הוא היחיד שכתב בדף זה.",
        "alreadyrolled": "לא ניתן לשחזר את העריכה של [[User:$2|$2]] ([[User talk:$2|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) בדף [[:$1]]; הדף כבר נערך או שוחזר.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "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",
-       "rollback-success-notify": "ער×\99×\9b×\95ת ×©×\9c $1 ×©×\95×\97×\96ר×\95;\n× ×\95×\97×\96ר ×\9c×\92רס×\94 ×\94×\90×\97ר×\95× ×\94 ×\9e×\90ת $2 [$3 הצגת שינויים]",
+       "rollback-success-notify": "ש×\95×\97×\96ר ×\9eער×\99×\9b×\95ת ×©×\9c $1 ×\9cער×\99×\9b×\94 ×\94×\90×\97ר×\95× ×\94 ×©×\9c $2. [$3 הצגת שינויים]",
        "sessionfailure-title": "בעיה בחיבור",
        "sessionfailure": "נראה שיש בעיה בחיבורכם לאתר;\nפעולתכם בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבכם.\nאנא חזרו לדף הקודם, העלו אותו מחדש ונסו שוב.",
        "changecontentmodel": "שינוי מודל התוכן של דף",
        "badipaddress": "משתמש או כתובת IP שגויים.",
        "blockipsuccesssub": "החסימה הושלמה בהצלחה",
        "blockipsuccesstext": "{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.\n\nראו את [[Special:BlockList|רשימת החסומים]] כדי לצפות בחסימות.",
-       "ipb-blockingself": "אתם עומדים לחסום את עצמכם! האם אתם בטוחים שברצונכם לעשות זאת?",
-       "ipb-confirmhideuser": "אתם עומדים לחסום משתמש עם האפשרות \"הסתרת משתמש\". זה יעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם אתם בטוחים שברצונכם לעשות זאת?",
-       "ipb-confirmaction": "אם אתם באמת בטוחים שברצונכם לעשות זאת, אנא סמנו את השדה \"{{int:ipb-confirm}}\" שבתחתית.",
+       "ipb-blockingself": "{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} לחסום את {{GENDER:|עצמך|עצמך|עצמכם}}! האם {{GENDER:|אתה בטוח שברצונך|את בטוחה שברצונך|אתם בטוחים שברצונכם}} לעשות את זה?",
+       "ipb-confirmhideuser": "{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} לחסום משתמש עם האפשרות \"הסתרת משתמש\". זה יעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם {{GENDER:|אתה בטוח שברצונך|את בטוחה שברצונך|אתם בטוחים שברצונכם}} לעשות את זה?",
+       "ipb-confirmaction": "אם {{GENDER:|אתה בטוח שברצונך|את בטוחה שברצונך|אתם בטוחים שברצונכם}} לעשות זאת, אנא {{GENDER:|סמן|סמני|סמנו}} את השדה \"{{int:ipb-confirm}}\" שמופיע למטה.",
        "ipb-edit-dropdown": "עריכת סיבות החסימה",
        "ipb-unblock-addr": "שחרור חסימה של $1",
        "ipb-unblock": "שחרור חסימה של משתמש או כתובת IP",
        "tooltip-rollback": "שחזור בלחיצה אחת של העריכה או העריכות של התורם האחרון לדף זה",
        "tooltip-undo": "פתיחת חלון העריכה במצב תצוגה מקדימה כדי לשחזר את העריכה, תוך אפשרות להוספת סיבה בתקציר העריכה",
        "tooltip-preferences-save": "שמירת ההעדפות",
-       "tooltip-summary": "×\9c×\94×\9bנסת ×ª×§×¦×\99ר ×§×¦×¨",
+       "tooltip-summary": "ת×\99×\90×\95ר ×§×¦×¨ ×©×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×©×\91×\99צעת",
        "common.css": "/* הסגנונות הנכתבים כאן ישפיעו על כל העיצובים */",
        "print.css": "/* הסגנונות הנכתבים כאן ישפיעו על הפלט בהדפסה בלבד */",
        "noscript.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם ג'אווה-סקריפט מבוטל */",
        "cannotauth-not-allowed-title": "הגישה נדחתה",
        "cannotauth-not-allowed": "אינך מורשה להשתמש בדף זה",
        "changecredentials": "שינוי האישורים",
-       "changecredentials-submit": "שינוי",
+       "changecredentials-submit": "שינוי האישורים",
        "changecredentials-submit-cancel": "ביטול",
        "changecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
        "changecredentials-success": "האישורים שלך שונו.",
        "removecredentials": "הסרת האישורים",
-       "removecredentials-submit": "×\94סר×\94",
+       "removecredentials-submit": "×\94סרת ×\94×\90×\99ש×\95ר×\99×\9d",
        "removecredentials-submit-cancel": "ביטול",
        "removecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
        "removecredentials-success": "האישורים שלך הוסרו.",
index 2becd67..efa5ee6 100644 (file)
        "password-change-forbidden": "आप इस विकि पर कूटशब्द नहीं बदल सकते हैं।",
        "externaldberror": "या तो प्रमाणिकरण डाटाबेस में त्रुटि हुई है या फिर आपको अपना बाह्य खाता अपडेट करने की अनुमति नहीं है।",
        "login": "प्रवेश",
+       "login-security": "अपनी पहचान सत्यापित करें",
        "nav-login-createaccount": "सत्रारंभ / खाता खोलें",
        "userlogin": "सत्रारंभ / खाता खोलें",
        "userloginnocreate": "लॉग इन",
        "userlogin-resetpassword-link": "अपना पासवर्ड भूल गए?",
        "userlogin-helplink2": "लॉग इन करने में सहायता",
        "userlogin-loggedin": "आप {{GENDER:$1|$1}} के रूप में पहले से लॉग्ड इन हैं।\nकिसी अन्य सदस्य के रूप में लॉग इन करने के लिए निम्नलिखित फ़ॉर्म का प्रयोग करें।",
+       "userlogin-reauth": "आप {{GENDER:$1|$1}} हो, इसके लिए आपको एक और बार खाते में प्रवेश करना होगा।",
        "userlogin-createanother": "एक अन्य खाता खोलें",
        "createacct-emailrequired": "ई-मेल पता",
        "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
        "createacct-email-ph": "अपना ई-मेल पता लिखें",
        "createacct-another-email-ph": "ईमेल पता प्रदान करें",
        "createaccountmail": "एक अस्थायी यादृच्छिक (रैंडम) कूटशब्द चुनें और उसे निर्दिष्ट ई-मेल पते पर भेजें",
+       "createaccountmail-help": "इसका उपयोग बिना पासवर्ड जाने किसी और के लिए खाता खोलने के लिए उपयोग किया जाता है।",
        "createacct-realname": "असली नाम (वैकल्पिक)",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आप एक अन्य खाता क्यों बना रहे हैं",
+       "createacct-reason-help": "खाता निर्माण लॉग में यह सन्देश दिखाई देगा।",
        "createacct-submit": "अपना खाता बनाएँ",
        "createacct-another-submit": "खाता बनाएँ",
+       "createacct-continue-submit": "खाता निर्माण जारी रखें",
+       "createacct-another-continue-submit": "खाता निर्माण जारी रखें",
        "createacct-benefit-heading": "{{SITENAME}} आपके जैसे लोगों द्वारा बनायी गई है।",
        "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठ}}",
        "createacct-another-realname-tip": "असली नाम देना आवश्यक नहीं है।\nयदि आप प्रदान करते हैं तो इसका प्रयोग सदस्य के योगदानों के लिये उनको श्रेय (attribution) देने के लिये किया जायेगा।",
        "pt-login": "लॉग इन",
        "pt-login-button": "लॉग इन",
+       "pt-login-continue-button": "प्रवेश जारी रखें",
        "pt-createaccount": "खाता बनाएँ",
        "pt-userlogout": "लॉगआउट",
        "php-mail-error-unknown": "PHP के mail() फ़ंक्शन में अज्ञात त्रुटि हुई।",
        "botpasswords-invalid-name": "जो सदस्य नाम आप बता रहे हो, उसमें बॉट पासवर्ड अलग करने वाला (\"$1\") नहीं है।",
        "botpasswords-not-exist": "सदस्य \"$1\" के आप बॉट पासवर्ड नहीं है, जिसका नाम \"$2\" है।",
        "resetpass_forbidden": "कूटशब्द बदले नहीं जा सकते",
+       "resetpass_forbidden-reason": "पासवर्ड नहीं बदला : $1",
        "resetpass-no-info": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "resetpass-submit-loggedin": "कूटशब्द बदलें",
        "resetpass-submit-cancel": "रद्द करें",
        "passwordreset-emailsentusername": "यदि कोई ईमेल इस खाते से जुड़ी है तो पासवर्ड आपके ईमेल में भेज दिया जाएगा।",
        "passwordreset-emailsent-capture": "नीचे दिखाया गया कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
        "passwordreset-emailerror-capture": "नीचे दृष्टित कूटशब्द रीसेट ई-मेल उत्पन्न किया गया था, परंतु उसे {{GENDER:$2|सदस्य}} को भेजना असफल रहा।\nत्रुटि: $1",
+       "passwordreset-emailerror-capture2": "{{GENDER:$2|सदस्य}} को ईमेल भेजना विफल : $1 {{PLURAL:$3|सदस्य नाम और पासवर्ड|सदस्य नाम और पासवर्ड की सूची}} नीचे दिया गया है।",
        "passwordreset-invalideamil": "अवैध ईमेल पता",
        "changeemail": "ई-मेल पता परिवर्तित करें",
        "changeemail-header": "अपना ईमेल पता परिवर्तन हेतु इसे पूरा करें। यदि आप अपना वर्तमान ईमेल पता हटाना चाहते हैं, तो इसे खाली छोड़ दें और इसे भेजें।",
        "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 ने  $3 पृष्ठ का {{GENDER:$2|निर्माण}} किया बिना मूल सामग्री प्रारूप के \"$5\"",
        "confirmemail_body_set": "किसी ने, शायद आपने ही, आई॰पी पते $1 से,\n{{SITENAME}} पर \"$2\" सदस्य खाते का ई-मेल पता यह ईमेल पता निर्दिष्ट किया है।\n\nइस बात की पुष्टि करने के लिए कि यह सदस्य खाता आपका ही है,\nऔर {{SITENAME}} पर ईमेल सुविधाएँ शुरू करने के लिए निम्न लिंक अपने ब्राउज़र में खोलें:\n\n$3\n\nयदि यह सदस्य खाता आपका नहीं है, ई-मेल पुष्टि रद्द करने के लिए निम्न लिंक पर जाएँ:\n\n$5\n\nयह पुष्टिकरण लिंक $6 को $7 के बाद काम नहीं करेंगे।",
        "confirmemail_invalidated": "इ-मेल एड्रेस प्रमाणिकरण रद्द कर दिया गया हैं",
        "invalidateemail": "इ-मेल प्रमाणिकरण रद्द करें",
+       "notificationemail_subject_changed": "{{SITENAME}} पंजीकृत ईमेल खाता बदला गया।",
+       "notificationemail_subject_removed": "{{SITENAME}} पंजीकृत ईमेल खाता हटाया गया।",
        "scarytranscludedisabled": "[आंतरविकि ट्रान्स्क्लुडिंग बंद हैं]",
        "scarytranscludefailed": "[$1 के लिये साँचा मँगा नहीं पाए]",
        "scarytranscludefailed-httpstatus": "[$1 के लिये साँचा मँगा नहीं पाए, त्रुटि: HTTP $2]",
        "confirm-watch-top": "इस पृष्ठ को अपने ध्यानसूची में जोड़ें?",
        "confirm-unwatch-button": "ठीक है",
        "confirm-unwatch-top": "यह पृष्ठ अपने ध्यानसूचीसे हटाएं?",
+       "confirm-rollback-button": "ठीक है",
+       "confirm-rollback-top": "इस पृष्ठ के सम्पादन पूर्ववत करें?",
        "semicolon-separator": ";",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← पिछला पृष्ठ",
        "watchlistedit-raw-done": "आपकी ध्यानसूची अपडेट कर दी गई हैं",
        "watchlistedit-raw-added": "{{PLURAL:$1|1शीर्षक|$1 शीर्षक}} बढा दिये:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1शीर्षक|$1 शीर्षक}} हटा दिये:",
-       "watchlistedit-clear-title": "धà¥\8dयानसà¥\82à¤\9aà¥\80 à¤\96ालà¥\80 à¤\95à¥\80",
+       "watchlistedit-clear-title": "धà¥\8dयानसà¥\82à¤\9aà¥\80 à¤\96ालà¥\80 à¤\95रà¥\87à¤\82",
        "watchlistedit-clear-legend": "ध्यानसूची खाली करें",
        "watchlistedit-clear-explain": "आपकी ध्यानसूची से सभी पृष्ठ हटा दिये जायेंगे",
        "watchlistedit-clear-titles": "खिताब:",
        "timezone-local": "स्थानीय",
        "duplicate-defaultsort": "'''Warning:''' पुरानी मूल क्रमांकन कुंजी \"$1\" के बजाय अब मूल क्रमांकन कुंजी \"$2\" होगी।",
        "duplicate-displaytitle": "<strong>चेतावनी:</strong> शीर्षक दिखाएँ \"$2\" पूर्व दिखाए गए शीर्षक \"$1\" पर छा रहा है।",
+       "restricted-displaytitle": "<strong>चेतावनी :</strong> प्रदर्शित शीर्षक \"$1\" को नजरअंदाज किया गया है, क्योंकि यह वास्तविक शीर्षक से मिलता नहीं है।",
        "invalid-indicator-name": "<strong>त्रुटि:</strong> पृष्ठ स्थिति सांकेतक <code>नाम</code> गुण खाली नहीं रहना चाहिए।",
        "version": "रूपान्तर",
        "version-extensions": "इन्स्टॉल की हुई एक्स्टेंशन",
        "version-libraries-license": "अनुज्ञापत्र",
        "version-libraries-description": "विवरण",
        "version-libraries-authors": "लेखक",
-       "redirect": "à¤\85नà¥\81पà¥\8dरà¥\87षित à¤\95रà¥\87à¤\82 à¤«à¤¼à¤¾à¤\87ल, à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता, à¤¯à¤¾ à¤¸à¤\82शà¥\8bधन à¤ªà¤¹à¤\9aान à¤\95à¥\87 à¤\86धार à¤ªà¤°",
+       "redirect": "फ़ाà¤\87ल, à¤¸à¤¦à¤¸à¥\8dय, à¤ªà¥\83षà¥\8dठ, à¤\85वतरण à¤¯à¤¾ à¤²à¥\89à¤\97 à¤\86à¤\88डà¥\80 à¤¦à¥\8dवारा à¤\85नà¥\81पà¥\8dरà¥\87षित",
        "redirect-summary": "यह विशेष पृष्ठ फ़ाइलनाम प्रदान करने पर फ़ाइल नाम को, पृष्ठ आइ॰दी अथवा अवतरण आइ॰दी देने पर पृष्ठ को, और सदस्य आइ॰दी देने पर सदस्य पृष्ठ को पुनर्प्रेषित करता है। उदाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], या [[{{#Special:Redirect}}/user/101]]।",
        "redirect-submit": "जायें",
        "redirect-lookup": "ढूँढें:",
        "feedback-useragent": "सदस्य कर्ता:",
        "searchsuggest-search": "खोज",
        "searchsuggest-containing": "...से युक्त",
+       "api-error-autoblocked": "आपका आईपी पता अपने आप अवरोधित हो गया, क्योंकि यह किसी अवरोधित सदस्य द्वारा उपयोग किया गया था।",
        "api-error-badaccess-groups": "आपको इस विकि के लिए फ़ाइलें अपलोड करने की अनुमति नहीं है.",
        "api-error-badtoken": "आंतरिक त्रुटि: बुरी टोकन।",
        "api-error-blocked": "आपको सम्पादन से अवरोधित किया गया है।",
        "log-action-filter-delete-event": "पृष्ठ हटाने का लॉग",
        "log-action-filter-delete-revision": "अवतरण हटाना",
        "log-action-filter-managetags-create": "टैग निर्मित",
+       "log-action-filter-newusers-create": "अज्ञात सदस्य द्वारा निर्मित",
+       "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-upload-overwrite": "फिर से अपलोड",
        "authmanager-create-disabled": "खाता निर्माण निष्क्रिय है।",
        "authmanager-authplugin-setpass-failed-title": "पासवर्ड बदलाव विफल हुआ।",
+       "authmanager-authplugin-setpass-bad-domain": "अमान्य जालस्थल।",
+       "authmanager-autocreate-noperm": "स्वचालित खाता निर्माण की अनुमति नहीं है।",
+       "authmanager-autocreate-exception": "स्वचालित खाता निर्माण को पहले के कुछ त्रुटियों के कारण कुछ समय के लिए निष्क्रिय किया गया है।",
        "authmanager-userdoesnotexist": "सदस्य खाता \"$1\" पंजीकृत नहीं है।",
        "authmanager-email-label": "ईमेल",
        "authmanager-email-help": "ईमेल पता",
        "authmanager-realname-label": "वास्तविक नाम",
+       "authmanager-realname-help": "सदस्य का वास्तविक नाम",
        "authmanager-provider-temporarypassword": "अस्थाई पासवर्ड",
+       "authprovider-confirmlink-request-label": "खाते जो जोड़ने हैं।",
        "authprovider-confirmlink-success-line": "$1 : सफलतापूर्वक जुड़ा।",
+       "authprovider-confirmlink-failed": "खाता जोड़ने का काम पूरी तरह से नहीं हो पाया : $1",
        "authprovider-resetpass-skip-label": "छोड़ें",
        "authform-newtoken": "टोकन लापता है $1",
        "authform-notoken": "टोकन लापता है",
        "authform-wrongtoken": "गलत टोकन",
+       "specialpage-securitylevel-not-allowed-title": "अनुमति नहीं है",
+       "specialpage-securitylevel-not-allowed": "क्षमा करें, आप इस पृष्ठ का उपयोग नहीं कर सकते हैं, क्योंकि आपकी जानकारी सत्यापित नहीं है।",
+       "authpage-cannot-login": "प्रवेश करने में अक्षम।",
+       "authpage-cannot-login-continue": "प्रवेश करने में अक्षम। हो सकता है कि आपका सत्र समय समाप्त हो गया।",
+       "authpage-cannot-create": "खाता निर्माण में अक्षम है।",
+       "authpage-cannot-create-continue": "खाता निर्माण में अक्षम है। हो सकता है कि आपका सत्र समाप्त हो गया हो।",
+       "authpage-cannot-link": "खाता जोड़ना शुरू नहीं कर सकते।",
+       "authpage-cannot-link-continue": "खाता जोड़ने में विफल रहा। हो सकता है कि आपका सत्र समय समाप्त हो गया।",
+       "cannotauth-not-allowed-title": "अनुमति नहीं मिली।",
        "cannotauth-not-allowed": "आपको इस पृष्ठ के उपयोग की अनुमति नहीं है।",
-       "changecredentials-submit": "बदलाव",
+       "changecredentials": "साख बदलें",
+       "changecredentials-submit": "साख बदलें",
        "changecredentials-submit-cancel": "रद्द करें",
-       "removecredentials-submit": "हटायें",
+       "changecredentials-invalidsubpage": "$1 सही परिचय प्रकार नहीं है।",
+       "changecredentials-success": "आपका परिचय बदला गया।",
+       "removecredentials": "परिचय निकालें",
+       "removecredentials-submit": "परिचय निकालें",
        "removecredentials-submit-cancel": "रद्द करें",
+       "removecredentials-invalidsubpage": "$1 सही परिचय प्रकार नहीं है।",
+       "removecredentials-success": "आपका परिचय निकाल दिया गया है।",
+       "credentialsform-provider": "परिचय प्रकार :",
        "credentialsform-account": "खाते का नाम:",
        "cannotlink-no-provider-title": "कोई जुड़ा खाता नहीं है।",
        "cannotlink-no-provider": "कोई जुड़ा खाता नहीं है।",
index ec08c26..ab45656 100644 (file)
        "recentchangeslinked-page": "Lap neve:",
        "recentchangeslinked-to": "Inkább az erre linkelő lapok változtatásait mutasd",
        "recentchanges-page-added-to-category": "[[:$1]] hozzáadva a kategóriához",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] és [[Special:WhatLinksHere/$1|{{PLURAL:$2|egy oldal|$2 oldal}}]] hozzáadva a kategóriához",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] hozzáadva a kategóriához, [[Special:WhatLinksHere/$1|ez a lap be van illesztve más lapokra]]",
        "recentchanges-page-removed-from-category": "[[:$1]] eltávolítva a kategóriából",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] és {{PLURAL:$2|egy oldal|$2 oldal}} eltávolítva a kategóriából",
        "upload": "Fájl feltöltése",
index ef604e0..55891e2 100644 (file)
@@ -45,7 +45,8 @@
                        "WongKentir",
                        "Rachmat.Wahidi",
                        "Arief",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Mbrt"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "revertpage": "←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]",
        "revertpage-nouser": "Mengembalikan suntingan oleh (nama pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]",
        "rollback-success": "Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.",
+       "rollback-success-notify": "Mengembalikan suntingan oleh $1; rubah kembali untuk revisi terakhir oleh $2. [$3 Lihat perubahan]",
        "sessionfailure-title": "Kegagalan sesi",
        "sessionfailure": "Sepertinya ada masalah dengan sesi log Anda; log Anda telah dibatalkan untuk mencegah pembajakan. Silakan tekan tombol \"kembali\" dan muat kembali halaman sebelum Anda masuk, lalu coba lagi.",
        "changecontentmodel": "Ubah model isi sebuah halaman",
index cc8a44d..419a359 100644 (file)
        },
        "tog-underline": "ТIахьожаярга кIала така хьакхар:",
        "tog-hideminor": "Къайладаккха з|амига дола хувцамаш керда хувцамашта юкъера",
-       "tog-hidepatrolled": "Къайладаккха ха дера чакхдаьнна дола хувцамаш керда хувцамашта юкъера",
-       "tog-newpageshidepatrolled": "Къайлаяьккха ха дера чакхъянна йола оагIонаш керда оагIонашта юкъера",
+       "tog-hidepatrolled": "Къайладаккха ха дера чакхдаьнна дола (патрулированные) хувцамаш керда хувцамашта юкъера",
+       "tog-newpageshidepatrolled": "Къайлаяьккха ха дера чакхъянна йола (патрулированные) оагIонаш керда оагIонашта юкъера",
        "tog-hidecategorization": "Къайлаяха оагӀонай категореш",
        "tog-extendwatchlist": "Хьашеръяь йола зем бара список, массадола хувцамаш ше чулоацаш, тIеххьара даь хувцамаш хинна ца Iеш.",
        "tog-usenewrc": "Хувцамаш тоабаш еш леладе керда нийсдарашка а, зем бара списка чу а",
-       "tog-numberheadings": "Ð\90вÑ\82омаÑ\82иÑ\87еÑ\81ки Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°Ñ\88Ñ\82а Ð½Ñ\83меÑ\80аÑ\86и Ñ\85Ñ\8cае",
+       "tog-numberheadings": "Ð\90вÑ\82омаÑ\82иÑ\87еÑ\81ки Ð½Ñ\83меÑ\80аÑ\86и Ñ\85Ñ\8cае Ð´Ð¾Ð°ÐºÑ\8aой Ñ\86IеÑ\80аÑ\88Ñ\82а",
        "tog-showtoolbar": "ГIирсий панель хьахьокха хувцам беч хана",
        "tog-editondblclick": "Нисъе оагӀонаш шозза IотӀатоӀаеча (JavaScript)",
-       "tog-editsectiononrightclick": "Нийсде дакъа шозза дахка аьтта тоIаер тӀатоӀайича заголовка тIа (JavaScript)",
-       "tog-watchcreations": "Ð\97ем Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка тIатоха аз хьаяь оагIонаши чуяьккха файлаши",
-       "tog-watchdefault": "Ð\97ем Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка тIатоха аз хийца оагIонаши файлай йоазонца сурташ оттадари",
-       "tog-watchmoves": "Ð\97ем Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка тIатоха аз цIи хийца оагIонаши файлаши",
-       "tog-watchdeletion": "Ð\97ем Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка тIатоха аз дIаяьккха оагIонаши файлаши",
+       "tog-editsectiononrightclick": "Нийсде дáкъа шозза дахка аьттехьара тоIаер тӀатоӀайича дáкъа цIера тIа (JavaScript)",
+       "tog-watchcreations": "Ð\97ем Ð±ÐµÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ð° Ñ\84айлаÑ\88Ñ\82а а тIатоха аз хьаяь оагIонаши чуяьккха файлаши",
+       "tog-watchdefault": "Ð\97ем Ð±ÐµÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ð° Ñ\84айлаÑ\88Ñ\82а а тIатоха аз хийца оагIонаши файлай йоазонца сурташ оттадари",
+       "tog-watchmoves": "Ð\97ем Ð±ÐµÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ð° Ñ\84айлаÑ\88Ñ\82а а тIатоха аз цIи хийца оагIонаши файлаши",
+       "tog-watchdeletion": "Ð\97ем Ð±ÐµÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ð° Ñ\84айлаÑ\88Ñ\82а а тIатоха аз дIаяьккха оагIонаши файлаши",
        "tog-minordefault": "Массаза зIамига долаш санна белгалде хувцамаш.",
        "tog-previewontop": "Хьалххе бӀаргтохар хьагойта хувцама кора хьалхашкахь",
        "tog-previewonfirst": "Хувцама дехьавоалаш хан хьалххе бӀаргтохар хьагойта",
-       "tog-enotifwatchlistpages": "ЭлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\87Ñ\82е Ð³Iолла Ñ\81ога Ñ\85оам Ð±Ðµ Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка Ñ\87Ñ\83Ñ\80а Ð¾Ð°Ð³Iонай а файлаш хувцарах",
+       "tog-enotifwatchlistpages": "ЭлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\87Ñ\82е Ð³Iолла Ñ\81ога Ñ\85оам Ð±Ðµ Ð·ÐµÐ¼ Ð±ÐµÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IонаÑ\88 а файлаш хувцарах",
        "tog-enotifusertalkpages": "Электронни почте гIолла сога хоам бе са дувца оттадара оагIув хийцача",
        "tog-enotifminoredits": "ОагIонашта а файлашта даь хувцамаш геттара зIамига дале а хоам бе сога",
        "tog-enotifrevealaddr": "ДIахайта хоамбараш чу бIаргадейта са почта адрес",
-       "tog-shownumberswatching": "Шоай зем бара списка чу оагIув чуяьккха доакьошхой таьрахь гойта",
+       "tog-shownumberswatching": "Шоаш зем бу оагIонашта юкъе ер оагIув чуяьккха доакьошхоша таьрахь гойта",
        "tog-oldsig": "ХIанзара яздаь кулг:",
        "tog-fancysig": "Кулг яздара ший йола вики-разметка (автоматически тIахьожаярг йоацаш)",
        "tog-uselivepreview": "Пайда эца сиха дола хьалххе бIаргтохар",
        "thu": "Ер",
        "fri": "ПI",
        "sat": "Шоа",
-       "january": "АгIой бутт",
-       "february": "Саь-кур бутт",
-       "march": "Мутт-хьал бутт",
-       "april": "Тушоли бутт",
-       "may_long": "Села бутт",
-       "june": "Этинга бутт",
-       "july": "Баьцамеа бутт",
-       "august": "Мяцхали бутт",
-       "september": "Михий бутт",
-       "october": "АьрхIий бутт",
-       "november": "Лай чилла бутт",
-       "december": "Чан-тар бутт",
-       "january-gen": "АгIой бетт",
+       "january": "АгIой",
+       "february": "Саь-кур",
+       "march": "Мутт-хьал",
+       "april": "Тушоли",
+       "may_long": "Села",
+       "june": "Этинга",
+       "july": "Баьцамеа",
+       "august": "Мяцхали",
+       "september": "Михий",
+       "october": "АьрхIий",
+       "november": "Лай чилла",
+       "december": "Чан-тар",
+       "january-gen": "АгIой",
        "february-gen": "Саь-кур",
-       "march-gen": "Мутт-хьал бетт",
-       "april-gen": "Тушоли бетт",
-       "may-gen": "Села бетт",
-       "june-gen": "Этинга бетт",
-       "july-gen": "Баьцамеа бетт",
-       "august-gen": "Мецхали бетт",
-       "september-gen": "Тов\\Ð\9cиÑ\85ий Ð±ÐµÑ\82Ñ\82",
-       "october-gen": "Ð\90Ñ\80даÑ\80ий\\Ð\90Ñ\8cÑ\80Ñ\85Iий Ð±ÐµÑ\82Ñ\82",
-       "november-gen": "Лай чилла бетт",
-       "december-gen": "Чан-тар бетт",
+       "march-gen": "Мутт-хьал",
+       "april-gen": "Тушоли",
+       "may-gen": "Села",
+       "june-gen": "Этинга",
+       "july-gen": "Баьцамеа",
+       "august-gen": "Мяцхали",
+       "september-gen": "Ð\9cиÑ\85ий",
+       "october-gen": "Ð\90Ñ\8cÑ\80Ñ\85Iий",
+       "november-gen": "Лай чилла",
+       "december-gen": "Чан-тар",
        "jan": "АгIой",
        "feb": "Саь-кур",
        "mar": "Мутт-хьал",
        "jul": "Баьцамеа",
        "aug": "Мяцхали",
        "sep": "Михий",
-       "oct": "Ð\90Ñ\80даÑ\80ий\\Ð\90Ñ\8cÑ\80Ñ\85Iий",
+       "oct": "АьрхIий",
        "nov": "Лай чилла",
        "dec": "Чан-тар",
-       "january-date": "АгIой бутт $1",
-       "february-date": "Саь-кур бутт $1",
-       "march-date": "Муттхьол $1",
+       "january-date": "АгIой $1",
+       "february-date": "Саь-кур $1",
+       "march-date": "Мутт-хьал $1",
        "april-date": "Тушоли $1",
-       "may-date": "Села бутт $1",
+       "may-date": "Села $1",
        "june-date": "Аьтинг $1",
        "july-date": "К|имарс $1",
        "august-date": "Мангал $1",
        "september-date": "Моажол $1",
-       "october-date": "Тов $1",
-       "november-date": "Лай чилла бутт $1",
+       "october-date": "Ð\90Ñ\8cÑ\80Ñ\85Iий $1",
+       "november-date": "Лай чилла $1",
        "december-date": "Чантар $1",
        "period-am": "ДЦ",
        "period-pm": "ДТ",
        "category-empty": "''Ер категори хӀанза яьсса я (цхьаккха оагIонаш е файлаш йоацаш).''",
        "hidden-categories": "{{PLURAL:$1|1=Къайла категори|Къайла категореш}}",
        "hidden-category-category": "Къайла категореш",
-       "category-subcat-count": "{{PLURAL:$2|Укх категори чу я укхан кIалхара категори.|Укх категори чу я $1 {{PLURAL:$1|кIалхара категори|кIалхара категореш}} $2 массайолчарех.}}",
+       "category-subcat-count": "{{PLURAL:$2|Укх категори чу я алхха ер кIалхара категори.|Укх категори чу $2-нен юкъе $1 {{PLURAL:$1|кIалхара категори|кIалхара категореш}} я}}",
        "category-subcat-count-limited": "Укх категори чу {{PLURAL:$1|кIалхара категори|$1 кIалхара категореш}} я.",
        "category-article-count": "{{PLURAL:$2|Укх категори чу цаI мара оагIув яц.|Укх категори чу я $2 оагӀув, царех оагӀонгахь {{PLURAL:$1|хьагойта $1 оагӀув}}}}",
        "category-article-count-limited": "Укх категори чу {{PLURAL:$1|$1 оагӀув я|1=цаI оагӀув мара яц}}.",
        "about": "Сурт оттадар",
        "article": "Йоазув",
        "newwindow": "&nbsp;(керда кора чу)",
-       "cancel": "ЭÑ\88аÑ\86",
+       "cancel": "ЮÑ\85адаккÑ\85а",
        "moredotdotdot": "ДIахо...",
        "morenotlisted": "Ер список хьалйиза яц.",
        "mypage": "ОагIув",
        "and": "&#32;а",
        "qbfind": "Лахар",
        "qbbrowse": "БIаргтохар",
-       "qbedit": "Нисъе",
+       "qbedit": "Нийсде",
        "qbpageoptions": "ОагIон оттамаш",
        "qbmyoptions": "Са оттамаш",
        "faq": "КТХ",
        "delete": "ДӀаяккха",
        "deletethispage": "ДӀаяккха ер оагӀув",
        "undeletethispage": "Юхаметтаоттае ер оагӀув",
-       "undelete_short": "ЮÑ\85амеÑ\82Ñ\82аоÑ\82Ñ\82ае {{PLURAL:$1|$1 Ð½Ð¸Ð¹Ñ\81даÑ\80|$1 Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88|1=нийÑ\81даÑ\80}}",
+       "undelete_short": "ЮÑ\85амеÑ\82Ñ\82аоÑ\82Ñ\82де {{PLURAL:$1|$1 Ð½Ð¸Ð¹Ñ\81даÑ\80|$1 Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88}}",
        "viewdeleted_short": "{{PLURAL:$1|$1 дIадаьккха нийсдарга|дIадаьккха нийсдарга|$1 дIадаьккха нийсдарашга}} хьажар",
-       "protect": "Ð\93Iо Ð´Ð°Ñ\80",
+       "protect": "Ð\93Iо Ð´Ðµ",
        "protect_change": "хувца",
-       "protectthispage": "ГIо де укх оагIон",
+       "protectthispage": "ГIо (лорадар) де укх оагIон",
        "unprotect": "ГIо хувца",
-       "unprotectthispage": "Укх оагIон гIо хувца",
+       "unprotectthispage": "Укх оагIон гIо (лорадар) хувца",
        "newpage": "Керда оагӀув",
        "talkpage": "Ер оагIув ювца",
        "talkpagelinktext": "дувца оттадар",
-       "specialpage": "Ð\91алха оагӀув",
+       "specialpage": "Ð\93\83лакха оагӀув",
        "personaltools": "Доакъашхочун гӀирсаш",
        "articlepage": "Йоазон т|а б|аргтасса",
        "talk": "Дувца оттадар",
        "categorypage": "Катага оаг|oн т|а б|аргтасса",
        "viewtalkpage": "Дувцамага б|аргтасса",
        "otherlanguages": "Кхыча меттаех",
-       "redirectedfrom": "($1 тIaра укхаз хьахьожаяь я)",
+       "redirectedfrom": "($1 дIа-сахьожаяьй укхаз)",
        "redirectpagesub": "Д|а-хьа дайта оаг|ув",
        "redirectto": "ДIа-сахьожадар укхаза:",
        "lastmodifiedat": "Укх оагIoн тIеххьара хувцам: $2, $1.",
        "internalerror_info": "Чура гӀалат: $1",
        "cannotdelete-title": "ОагIув дIаяккха йиш яц \"$1\"",
        "badtitle": "Мегаш йоаца цӀи",
-       "badtitletext": "Ð\95заÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³Ó\80он Ñ\86Ó\80и Ð½Ð¸Ð¹Ñ\81а Ñ\8fÑ\86, Ñ\8fÑ\8cÑ\81Ñ\81а Ñ\8f, Ðµ Ñ\85аÑ\80Ñ\86аÑ\85Ñ\8c Ð¹Ð¾Ð°Ð»Ð°Ñ\8fй Ð¼ÐµÑ\82Ñ\82ай Ñ\8eкÑ\8aеÑ\80а Ñ\86Iи Ðµ Ð¸Ð½Ñ\82еÑ\80вики Ñ\86Ó\80и. Ð\98Ñ\88Ñ\82Ñ\82а, Ñ\86Ó\80еÑ\80а Ñ\8eкÑ\8aе Ð¾Ñ\82Ñ\82аде Ð¼ÐµÐ³Ð°Ñ\88 Ð´Ð¾Ð°Ñ\86а Ñ\85Ñ\8cаÑ\80акÑ\8aаÑ\88 Ð½Ð¸Ð¹Ñ\81аденна Ñ\85ила Ñ\82аÑ\80лÑ\83ш да.",
+       "badtitletext": "Ð\95заÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³Ó\80он Ñ\86Ó\80и Ð½Ð¸Ð¹Ñ\81а Ñ\8fÑ\86, Ñ\8fÑ\8cÑ\81Ñ\81а Ñ\8f, Ðµ Ñ\85аÑ\80Ñ\86аÑ\85Ñ\8c Ð¹Ð¾Ð°Ð»Ð°Ñ\8fй Ð¼ÐµÑ\82Ñ\82ий Ñ\8eкÑ\8aеÑ\80а Ñ\86Iи Ðµ Ð¸Ð½Ñ\82еÑ\80вики Ñ\86Ó\80и. Ð\98Ñ\88Ñ\82Ñ\82а, Ñ\86Ó\80еÑ\80а Ñ\8eкÑ\8aе Ð¾Ñ\82Ñ\82аде Ð¼ÐµÐ³Ð°Ñ\88 Ð´Ð¾Ð°Ñ\86а Ñ\85Ñ\8cаÑ\80акаÑ\88 Ð½Ð¸Ð¹Ñ\81аденна Ñ\85ила Ð¼ÐµÐ³Ð°ш да.",
        "viewsource": "Хьажар",
        "actionthrottled": "Сихален овзамал",
        "protectedpagetext": "Ер оаг|ув къайла я хувцамаш дергдоацаш е кхы дола х|амдараш.",
        "userlogin-resetlink": "Чувала/яла цӀии дIоагӀаи дийцаденнадий?",
        "userlogin-resetpassword-link": "ТIеракхосс хьа пароль?",
        "userlogin-helplink2": "Система чуваларах новкъостал",
-       "createacct-emailoptional": "ЭлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81 (Ñ\86а Ñ\8fздой мегаш да)",
+       "createacct-emailoptional": "ЭлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81 (Ñ\86а Ñ\8fздиÑ\87а мегаш да)",
        "createacct-email-ph": "Iочуязде хьа электронни почта адрес",
        "createaccountmail": "КъайладIоагIа д-хоамнец хьадайта",
        "createaccountreason": "Бахьан:",
        "createacct-reason": "Бахьан",
        "createacct-submit": "Хьакхолла учета яздар",
-       "createacct-benefit-heading": "{{SITENAME}} — хьо санна болача наха цхьан беш бола къахьгам ба.",
+       "createacct-benefit-heading": "{{SITENAME}} â\80\94 Ñ\85Ñ\8cо Ñ\81анна Ð±Ð¾Ð»Ð°Ñ\87а Ð½Ð°Ñ\85а Ñ\86Ñ\85Ñ\8cан Ð±ÐµÑ\88 Ð±Ð¾Ð»Ð° ÐºÑ\8aаÑ\85Ñ\8cегам Ð±Ð°.",
        "createacct-benefit-body1": "{{PLURAL:$1|нийсдар|нийсдараш}}",
        "createacct-benefit-body2": "{{PLURAL:$1|статья|статьяш}}",
        "createacct-benefit-body3": "{{PLURAL:$1|доакъашхо|доакъашхой}} тӀеххьара хан",
        "passwordreset": "Пароль тIеракхоссар",
        "passwordreset-username": "Дакъалаьцархочунна цӀи:",
        "passwordreset-email": "Д-хоамни моттиг:",
-       "bold_sample": "Ð\90Ñ\85\81ома Ñ\82екÑ\81Ñ\82",
-       "bold_tip": "Ð\90Ñ\85\81ома Ñ\82екÑ\81Ñ\82",
+       "bold_sample": "Сома Ñ\8fздаÑ\80",
+       "bold_tip": "Сома Ñ\8fздаÑ\80",
        "italic_sample": "Сиха йоазон текст",
        "italic_tip": "Сиха йоазон текст",
-       "link_sample": "ТIаÑ\85Ñ\8cожаÑ\8fÑ\80га Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº",
+       "link_sample": "ТIаÑ\85Ñ\8cожаÑ\8fÑ\80га Ð´Ã¡ÐºÑ\8aа Ñ\86Iи",
        "link_tip": "Чура тIахьожаярг",
-       "extlink_sample": "http://www.example.com Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80га Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº",
+       "extlink_sample": "http://www.example.com Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80га Ð´Ã¡ÐºÑ\8aа Ñ\86Iи",
        "extlink_tip": "Арахьара тIахьожаярг (йиц ма ялийтта префикс http://)",
-       "headline_sample": "Ð\97аголовка текст",
-       "headline_tip": "2-гӀа лагӀа заголовок",
+       "headline_sample": "Ð\94áкÑ\8aа Ñ\86IеÑ\80а текст",
+       "headline_tip": "2-гӀа лагӀара дáкъа цIи",
        "nowiki_sample": "Укхаза хувца езаш йоаца текст хьачуоттае",
        "nowiki_tip": "Теркал ма е вики-форматировани",
        "image_tip": "ДIачуоттаяь файл",
        "savearticle": "ОагӀув дIаязъе",
        "preview": "Хьалхе бӀаргтассар",
        "showpreview": "Хьалххе бIаргтохар",
-       "showdiff": "Даь хувцамаш",
+       "showdiff": "Даь дола хувцамаш",
        "anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 учёта яздар хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
        "summary-preview": "Лоацам ба:",
        "subject-preview": "Кортале хургья:",
        "loginreqpagetext": "Кхыйола оагӀувнашка хьожаргдолаш, оаш $1 де деза.",
        "accmailtitle": "КъайладIоагӀа дӀадахьийтад",
        "newarticle": "(Kерда)",
-       "newarticletext": "Шо Ñ\85Ñ\8cожаÑ\8fÑ\80гаÑ\86а Ð´ÐµÑ\85Ñ\8cадаÑ\8cннад Ð¹Ð¾Ð°Ñ\86а Ð¾Ð°Ð³Ó\80он Ñ\82Ó\80а.\nÐ\98з ÐºÑ\85оллаÑ\80гÑ\8cйолаÑ\88 ÐºÓ\80алÑ\85агÓ\80а Ð´Ð¾Ð°Ð»Ð° ÐºÐ¾Ñ\80аÑ\87Ñ\83 Ñ\82екÑ\81Ñ\82 IоÑ\87Ñ\83Ñ\8fзаде (нагаÑ\85Ñ\8cа ÐºÑ\85еÑ\82аде Ñ\85ала Ð´Ð°Ð»Ðµ [$1 Ð½Ð¾Ð²ÐºÑ\8aоÑ\81Ñ\82алан Ð¾Ð°Ð³Ó\80онга] Ñ\85Ñ\8cажа).\nЦа Ñ\85овÑ\88 Ñ\83кÑ\85аза Ð½Ð¸Ð¹Ñ\81деннадале, Ñ\88оай Ð±Ñ\80аÑ\83зеÑ\80а '''ЮÑ\85а''' (назад) ÐºÐ½Ð¾Ð¿ÐºÐ° Ñ\82Ó\80а Ð¿Ó\80елга тоӀабе.",
-       "noarticletext": "ХIанз укх оагӀув тӀа текст яц.\nШун аьттув ба [[Special:Search/{{PAGENAME}}|цу тайпара цӀи хьоаяр кораде]] кхыйола йоазуваш чу, иштта\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола тептарий яздаьраш], е\n'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} изза мо цӀи йолаш оагӀув кхолла]'''</span>.",
-       "noarticletext-nopermission": "Ð¥Iанз Ñ\83кÑ\85 Ð¾Ð°Ð³Ó\80он Ñ\82Ó\80а Ñ\82екÑ\81Ñ\82 Ñ\8fÑ\86.\nШÑ\83н Ð°Ñ\8cÑ\82Ñ\82Ñ\83в Ð±Ð° [[Special:Search/{{PAGENAME}}|Ñ\86Ñ\83 Ñ\82айпаÑ\80а Ñ\86Ó\80и Ð±ÐµÐ»Ð³Ð°Ð»Ñ\8aÑ\8fÑ\80 Ñ\85Ñ\8cалаÑ\85а]] ÐºÑ\85Ñ\8bйола Ð¾Ð°Ð³IонаÑ\88 Ñ\82Iа, Ð¸Ñ\88Ñ\82Ñ\82а\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ñ\86Ñ\83н Ñ\82аÑ\80а Ð´Ð¾Ð»Ð° Ñ\82епÑ\82аÑ\80ай Ñ\8fздаÑ\8cÑ\80аÑ\88].</span> Ð\98Ñ\88Ñ\82Ñ\82а Ð¹Ð¾Ð»Ð° (Ð\95Ñ\80) оагӀув хьакхолла Хьа бокъо яц.",
+       "newarticletext": "Шо Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80гаÑ\86а Ð´ÐµÑ\85Ñ\8cадаÑ\8cннад Ð¹Ð¾Ð°Ñ\86а Ð¾Ð°Ð³Ó\80он Ñ\82Ó\80а.\nÐ\98з Ñ\85Ñ\8cакÑ\85оллаÑ\80гÑ\8cйолаÑ\88 ÐºÓ\80алÑ\85агÓ\80а Ð´Ð¾Ð°Ð»Ð° ÐºÐ¾Ñ\80аÑ\87Ñ\83 Ñ\82екÑ\81Ñ\82 IоÑ\87Ñ\83Ñ\8fзде (нагаÑ\85Ñ\8cа Ñ\81анна ÐºÑ\85еÑ\82аде Ñ\85ала Ð´Ð°Ð»Ðµ [$1 Ð½Ð¾Ð²ÐºÑ\8aоÑ\81Ñ\82алаÑ\80а Ð¾Ð°Ð³Ó\80онга] Ñ\85Ñ\8cажа).\nЦа Ñ\85овÑ\88 Ñ\83кÑ\85аза Ð½Ð¸Ð¹Ñ\81деннадале, Ñ\88оай Ð±Ñ\80аÑ\83зеÑ\80а '''ЮÑ\85а''' (назад) Ñ\82оIаеÑ\80 Ñ\82Ó\80а Ð¿Ó\80елг тоӀабе.",
+       "noarticletext": "ХIанза укх оагӀон тӀа текст яц.\nШун аьттув ба [[Special:Search/{{PAGENAME}}|цу тайпара цӀи хьоаяр кораде]] кхыйола оагIонаш тIа, иштта\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола тептарий дIаяздаьраш], е\n'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} изза мо цӀи йолаш оагӀув хьакхолла]'''</span>.",
+       "noarticletext-nopermission": "Ð¥Iанз Ñ\83кÑ\85 Ð¾Ð°Ð³Ó\80он Ñ\82Ó\80а Ñ\82екÑ\81Ñ\82 Ñ\8fÑ\86.\nШÑ\83н Ð°Ñ\8cÑ\82Ñ\82Ñ\83в Ð±Ð° [[Special:Search/{{PAGENAME}}|Ñ\86Ñ\83 Ñ\82айпаÑ\80а Ñ\86Ó\80и Ð±ÐµÐ»Ð³Ð°Ð»Ñ\8aÑ\8fÑ\80 Ñ\85Ñ\8cалаÑ\85а]] ÐºÑ\85Ñ\8bйола Ð¾Ð°Ð³IонаÑ\88 Ñ\82Iа, Ð¸Ñ\88Ñ\82Ñ\82а\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ñ\82аÑ\80а Ð´Ð¾Ð»Ð° Ñ\82епÑ\82аÑ\80ай Ð´IаÑ\8fздаÑ\8cÑ\80аÑ\88].</span> Ð\95Ñ\80 оагӀув хьакхолла Хьа бокъо яц.",
        "note": "'''ХӀамоалар:'''",
        "previewnote": "'''Хьалхе б|аргтассам мара бац.'''\nЯздам кхы яздаь дац!",
        "editing": "Хувцам: $1",
        "editconflict": "ГӀалатнийсдара къовсам: $1",
        "yourtext": "Хьа яздам",
        "copyrightwarning": "Теркам бе, $2 ($1 хьажа) бокъонаца лорадеш, тӀахьежама кӀала уллаш, оаш мел чуяккхаш дола хоамаш, яздамаш долга.\nНаггахь санна шоай яздамаш пурам доацаш мала волашву саго хувца е кхы дола моттиге яздердолаш, безам беци, укхаз Ӏочуцаяздеча, дикаьгӀа да.<br />\nОаш дош лу, даь дола хувцама да волга/йолга, е оаш пурам долаш Ӏочуяздеш да кхычера меттигара шоай яздамаш/хоамаш.\n'''Яздархой бокъоца лорадеш дола хӀамаш, цара пурам доацаш, Ӏочумаязаде!'''",
-       "templatesused": "УкÑ\85 Ð¾Ð°Ð³Iон Ñ\82Iа {{PLURAL:$1|1=пайда Ñ\8dÑ\86а Ð\9bо|пайда Ñ\8dÑ\86а Ð\9bонаш}}:",
+       "templatesused": "УкÑ\85 Ð¾Ð°Ð³Iон Ñ\82Iа {{PLURAL:$1|1=пайда Ñ\8dÑ\86а Ð»Ð¾|пайда Ñ\8dÑ\86а Ð»ÐµÑ\80аш}}:",
        "templatesusedpreview": "Хьалхе бӀаргтассама оагӀув тӀа леладеш дола {{PLURAL:$1|1=Куцкеп|Куцкепаш}}:",
        "template-protected": "(лорадаь да)",
        "template-semiprotected": "(цхьа долча даькъе гIо оттадаь да)",
        "lineno": "МугI $1:",
        "compareselectedversions": "Хьаржа доржамаша тарона тIа хьажа",
        "editundo": "юхадаккха",
+       "diff-multi-sameuser": "({{PLURAL:$1|цхьа юкъ хулаш йола верси|$1 юкъ хулаш йола версеш}} гуш яц цу доакъашхочун)",
        "searchresults": "Лахар чакхдоалаш корадаьр",
        "searchresults-title": "«$1» лахар",
        "notextmatches": "ОагIувнаша яздамий вIашагIакхетараш дац",
        "nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
        "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
        "nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
-       "shown-title": "Хьóкха $1 {{PLURAL:$1|даь йоазо|даь йоазонаш}} укх оáгIувна тIа",
+       "shown-title": "Хьóкха $1 {{PLURAL:$1|даь йоазо|даь йоазонаш}} укх оáгIон тIа",
        "viewprevnext": "ДIахьажа ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Укх масса-хьахьоадайтамач ер оаг|ув \"[[:$1]]\" я'''",
        "searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
        "searchprofile-articles-tooltip": "$1 чу лахар",
        "searchprofile-images-tooltip": "Файлаш лахар",
        "searchprofile-everything-tooltip": "Массайола оагIонаш тIа лахар (дувцар оттадара оагIонаш чулоацаш)",
-       "searchprofile-advanced-tooltip": "IоÑ\87Ñ\83Ñ\8fзаÑ\8fÑ\8c Ñ\86IеÑ\80аÑ\80енаÑ\88каÑ\85 лаха",
+       "searchprofile-advanced-tooltip": "IоÑ\87Ñ\83Ñ\8fзаÑ\8fÑ\8c Ñ\86IеÑ\80ий Ð¼Ð¾Ñ\82Ñ\82аÑ\88ка лаха",
        "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
        "search-result-category-size": "{{PLURAL:$1|1=$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|1=$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|1=$3 паьла|$3 паьлий}})",
        "search-redirect": "(дIа-сахьожадар $1 тIара)",
-       "search-section": "(дакъа «$1»)",
+       "search-section": "(дáкъа «$1»)",
        "search-suggest": "Хьона эшар ер хила мега: $1",
        "search-interwiki-caption": "Гаргалон хьахьоадайтамаш",
        "search-interwiki-default": "$1 хьахиннараш:",
        "search-relatedarticle": "шоайл дола",
        "searchrelated": "гаргара",
        "searchall": "деррига",
-       "search-nonefound": "Хьа дехар дара вIаши нийса доагIаш хилар корадаьдац.",
+       "search-showingresults": "{{PLURAL:$4|Кораяьй <strong>$1</strong> — цхьа оагӀув|Из дош корадаьд <strong>$3</strong> оагӀонашка, царех гойта $2 оагӀув}}",
+       "search-nonefound": "Хьа дехар дара вIаши нийса доагIаш дар корадаьдац.",
        "powersearch-legend": " Доккха тахкар",
        "powersearch-ns": " ЦIерий аренашкахь лахар",
        "powersearch-toggleall": "Деррига",
        "right-createtalk": "дувцама оагIувний хьакхоллам",
        "right-move": "ОагIувний цIи хувца",
        "right-movefile": "Паьлий цIи хувца",
+       "right-writeapi": "ДIаяздара лаьрххIа API пайда эцар",
        "newuserlogpage": "Доакъашхой дIаязбаь таптар",
        "rightslog": "Дакъалаьцархочунна бокъона тептар",
        "action-read": "Укх оагIуви дешам",
        "nchanges": "$1 {{PLURAL:$1|1=хувцам|хувцамаш}}",
        "enhancedrc-history": "истори",
        "recentchanges": "Керда хувцамаш",
-       "recentchanges-legend": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86амай Ð¾Ñ\82Ñ\82амаш",
+       "recentchanges-legend": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86амай Ð³IиÑ\80Ñ\81аÑ\88 Ñ\82оаÑ\8fÑ\80аш",
        "recentchanges-summary": "КIалхагIа ханашца нийсдаь дIаяьздаь да {{grammar:genitive|{{SITENAME}}}}  оагIонай тIеххьара хувцамаш.",
        "recentchanges-feed-description": "Укх ларамца тIехьара массахувцамашт теркам бе.",
        "recentchanges-label-newpage": "Укх хувцамаца керда оагIув кхелла хиннай",
        "rclistfrom": "$3 $2 денза даь хувцамаш хьахьокха",
        "rcshowhideminor": "$1 зIамига нийсдараш",
        "rcshowhideminor-show": "Хьахьокха",
-       "rcshowhideminor-hide": "Ð\94Iакъайладаккха",
+       "rcshowhideminor-hide": "Ð\9aъайладаккха",
        "rcshowhidebots": "$1 боташ",
        "rcshowhidebots-show": "Хьахьокха",
-       "rcshowhidebots-hide": "Ð\94Iакъайладаккха",
+       "rcshowhidebots-hide": "Ð\9aъайладаккха",
        "rcshowhideliu": "$1 бовзийтарчара доакъашхой",
        "rcshowhideliu-hide": "Къайлабаха",
        "rcshowhideanons": "$1 цIияккханза доакъашхой",
        "rcshowhidepatr": "$1 теркам даь хувцамаш",
        "rcshowhidemine": "$1 хьа нийсдараш",
        "rcshowhidemine-show": "Хьахьокха",
-       "rcshowhidemine-hide": "Ð\94Iакъайладаккха",
+       "rcshowhidemine-hide": "Ð\9aъайладаккха",
        "rclinks": "Хьахьокха $2 дийнахь даь хинна тIеххьара $1 хувцамаш\n<br />$3",
        "diff": "башхало",
        "hist": "истори",
        "recentchangeslinked-feed": "Гаргалон хувцамаш",
        "recentchangeslinked-toolbox": "Укханца вIашагIдувзаденна хувцамаш",
        "recentchangeslinked-title": "$1ца вIашидувзаденна хувцамаш",
-       "recentchangeslinked-summary": "Ð\95Ñ\80, Iинк Ñ\8fÑ\8c Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IÑ\83в (е Ñ\83кÑ\85 Ñ\86аÑ\82егаÑ\87Ñ\83 Ñ\87Ñ\83йоагIаÑ\80аÑ\88), Ð´Ñ\83кÑ\85а Ñ\85а Ð¹Ð¾Ð°Ñ\86аÑ\88 Ñ\85Ñ\8cийÑ\86а Ð¾Ð°Ð³IÑ\83внаÑ\88кий Ð´Ð°Ð³Ð°Ñ\80ле Ñ\8f.\n[[Special:Watchlist|ШÑ\83н Ñ\82еÑ\80кама Ð´Ð°Ð³Ð°Ñ\80ленаÑ\88каÑ\85]] Ñ\87Ñ\83йоагIа Ð¾Ð°Ð³IÑ\83внаÑ\88 '''белгалаÑ\8fÑ\8c Ñ\8f'''.",
+       "recentchangeslinked-summary": "Ð\91елгалаÑ\8fÑ\8c Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IÑ\83в Ñ\82IаÑ\85Ñ\8cожавеÑ\88 (е Ð±ÐµÐ»Ð³Ð°Ð»Ð°Ñ\8fÑ\8c Ð¹Ð¾Ð»Ð° ÐºÐ°Ñ\82егоÑ\80ен Ñ\8eкÑ\8aейоагIаÑ\88) Ð¹Ð¾Ð»Ñ\87а Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ð´Ð°Ñ\8c Ñ\85Ñ\83вÑ\86амаÑ\88 Ð´Ð° ÐµÑ\80аÑ\88.\n[[Special:Watchlist|Ð¥Ñ\8cа Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\81пиÑ\81ок]] Ñ\8eкÑ\8aейоагIаÑ\88 Ð¾Ð°Ð³IонаÑ\88 '''белгалаÑ\8fÑ\8cй'''.",
        "recentchangeslinked-page": "ОагIон цIи",
        "recentchangeslinked-to": "Вешта, белгаляьккха оагIон тIахьожавеш дола оагIонашта даь хувцамаш хьахьокха.",
        "upload": "Файл чуяккха",
        "filedesc": "Лоаца йоазонца сурт оттадар",
        "fileuploadsummary": "Лоаца лоацам:",
        "license": "ЦIийяздар",
-       "license-header": "Лицензирование",
+       "license-header": "Лицензировани",
        "imgfile": "файл",
        "listfiles": "Паьлий дагарче",
        "listfiles_date": "Денха",
        "listfiles_description": "Лоацам",
        "listfiles_count": "Доржамаш",
        "file-anchor-link": "Файл",
-       "filehist": "Файлан истори",
+       "filehist": "Файла истори",
        "filehist-help": "Кнопка таьрахь/ха тоIае цу хан файл мишта хиннай хьожаpгволаш/йолаш",
        "filehist-revert": "юхаяьккха",
        "filehist-current": "xIанзара",
        "filehist-thumb": "ЗIамигасурт",
        "filehist-thumbtext": "ЗIамига сурт укх версин $1",
        "filehist-user": "Доакъашхо",
-       "filehist-dimensions": "Файлан боарам",
+       "filehist-dimensions": "Файла боарам",
        "filehist-filesize": "Паьла юстарал",
        "filehist-comment": "Белгалдаккхар",
        "imagelinks": "Файлах пайда эцар",
-       "linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIача $1 оагIуво тIахьожаву|ТIехьайоагIача $1 оагIувнаша тIахьожаву}} укх файла тIа:",
+       "linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIача $1 оагIо тIахьожаву|ТIехьайоагIача $1 оагIонаш тIахьожаву}} укх файла тIа:",
        "nolinkstoimage": "Укх файла тIахьожавеш йола оагIонаш яц.",
        "sharedupload": "Ер паьла $1чера я, кхыча хьахьоадайтамча хьахайраде йийшайолаш я.",
        "sharedupload-desc-here": "Ер файл $1 чура я, иштта кхыйола проекташ чу пайда эца аьттув болаш я.\nЦун [$2 йоазонца сурт оттадара оагIон] информаци кIалхахь хьайоалаяй.",
        "undeleteviewlink": "хьажа",
        "undelete-search-submit": "Хьалáха",
        "namespace": "ЦIерий мотт",
-       "invert": "Харжар юхадаккха",
+       "invert": "Хержар юхадаккха",
+       "tooltip-invert": "Оттае ер белгало, хержа цIерий мотта чу а (белгалъяь яле вIашагIъювзаенна цIерий мотта чу а), оагIонаш тIа а даь хувцамаш къайладоахаргдолаш",
        "namespace_association": "Ювзаенна мотт",
+       "tooltip-namespace_association": "Оттае ер белгало, иштта хержа цIерий моттаца вIашагIъювзаенна дувца оттадара цIерий мотт (е кхыяр) юкъейоаккхаргйолаш",
        "blanknamespace": "(Кертера)",
        "contributions": "{{GENDER:$1|Доакъашхочун}} къахьегам",
        "contributions-title": "$1 дакъалаьцархочунна къахьегам",
        "sp-contributions-toponly": "ТIехьара доржамаш лоархаш дола хувцамаш мара ма хьокха",
        "sp-contributions-submit": "Хьалáха",
        "whatlinkshere": "ТIахьожаяргаш укхаза",
-       "whatlinkshere-title": "\"$1\" тIахьожавеш йола оагIонаш",
-       "whatlinkshere-page": "ОагIув",
+       "whatlinkshere-title": "\"$1а\" тIахьожавеш йола оагIонаш",
+       "whatlinkshere-page": "ОагIув:",
        "linkshere": "ТIехьайоагIа оагIонаш тIахьожаву «'''[[:$1]]'''»:",
        "nolinkshere": "'''[[:$1]]''' оагIув тIа, кхыдола оагIувашкара Iинкаш йоацаш я",
        "isredirect": "оагIув-дIа-сахьожадар",
        "whatlinkshere-hidetrans": "$1 юкъейоалаяраш",
        "whatlinkshere-hidelinks": "$1 тIахьожаяргаш",
        "whatlinkshere-hideimages": "$1 суртIинкаш",
-       "whatlinkshere-filters": "Фильтры",
+       "whatlinkshere-filters": "Фильтраш",
        "blockip": "Укх {{GENDER:$1|доакъошхочоа}} ч|ега бола",
        "ipboptions": "2 сахьат:2 hours,1 ди:1 day,3 ди:3 days,1 кIира:1 week,2 кIира:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шу:1 year,сиха ца луш:infinite",
        "ipblocklist": "ЧIега бела дакъалаьцархой",
        "tooltip-pt-createaccount": "Хьа бокъо я учёта яздар кхелла система чу вала, амма параз долаш дац из.",
        "tooltip-ca-talk": "ОагIон чулоацам дувца оттадар",
        "tooltip-ca-edit": "Нийсъе ер оагIув",
-       "tooltip-ca-addsection": "Керда дакъа хьаде",
+       "tooltip-ca-addsection": "Керда дáкъа хьаде",
        "tooltip-ca-viewsource": "Ер оагIув хувцамбарах гIо теха (лорая) я, амма цунна дIадолалу текстага хьажа а, из тIерхьаязъе а бокъо я.",
        "tooltip-ca-history": "Укх оагIон даь хувцамаш тIа дола тептар",
        "tooltip-ca-protect": "Eр оагIув лорае",
        "tooltip-ca-unwatch": "Ер оагIув теркам беча каьхата тIара дIаяькха",
        "tooltip-search": "Хьалáха {{grammar:prepositional|{{SITENAME}}}} чу",
        "tooltip-search-go": "Изза мо цӀи йолаш оагӀон тӀa дехьавала",
-       "tooltip-search-fulltext": "Ð\98зза Ð¼Ð¾ Ñ\8fздаÑ\80 Ð´Ð¾Ð»Ð°Ñ\88 Ð¾Ð°Ð³Ó\80Ñ\83внаш лаха",
+       "tooltip-search-fulltext": "Ð\98зза Ð¼Ð¾ Ñ\82екÑ\81Ñ\82 Ð¹Ð¾Ð»Ð°Ñ\88 Ð¾Ð°Ð³Ó\80онаш лаха",
        "tooltip-p-logo": "Керттера оагIон тIа дехьавала",
        "tooltip-n-mainpage": "Керттера оагIон тIа дехьавала",
        "tooltip-n-mainpage-description": "Керттера оагIон тIа дехьавала",
-       "tooltip-n-portal": "Ð\93IалгIай Ð\92икипедех лаьца дар а, укхаза де мегаш дар а, малагIа фуд а, мича да а",
+       "tooltip-n-portal": "Ð\93IалгIай Ð\92икипейдах лаьца дар а, укхаза де мегаш дар а, малагIа фуд а, мича да а",
        "tooltip-n-currentevents": "ХIанзара хинна хIамах бола хоам",
        "tooltip-n-recentchanges": "ТӀеххьара хувцамай список",
        "tooltip-n-randompage": "Башхало йоаца ца ховш нийсъенна оагӀув хьаела",
        "tooltip-n-help": "Новкъостал лаха мегаш йола моттиг",
        "tooltip-t-whatlinkshere": "Укхаза тIахьожавеш йола оагIонаш",
-       "tooltip-t-recentchangeslinked": "Укх оагIуво тIахьожавеш йолча оагIонай тIеххьара хувцамаш",
+       "tooltip-t-recentchangeslinked": "Укх оагIо тIахьожавеш йолча оагIонай тIеххьара хувцамаш",
        "tooltip-feed-rss": "Укх оагIувна RSSчу гойтар",
-       "tooltip-feed-atom": "Укх оаг|увна Atomчу гойтар",
+       "tooltip-feed-atom": "Укх оагIонна лаьрххIа Atom чу трансляци яр",
        "tooltip-t-contributions": "{{GENDER:$1|Укх доакъашхочо хийца}} йола оагIонаш",
        "tooltip-t-emailuser": "Укх дакъалаьцархочоа зIы яхьийта",
        "tooltip-t-upload": "Файлаш чуяккха",
-       "tooltip-t-specialpages": "ГIулакха оагIувнаш",
+       "tooltip-t-specialpages": "ГIулакха оагIонаш",
        "tooltip-t-print": "Укх оагIон зарба тохара верси",
-       "tooltip-t-permalink": "ОагIон укх версин тIахьожавеш йола даим латташ йола хьожаярг",
+       "tooltip-t-permalink": "Ð\9eагIон Ñ\83кÑ\85 Ð²ÐµÑ\80Ñ\81ин Ñ\82IаÑ\85Ñ\8cожавеÑ\88 Ð¹Ð¾Ð»Ð° Ð´Ð°Ð¸Ð¼ Ð»Ð°Ñ\82Ñ\82аÑ\88 Ð¹Ð¾Ð»Ð° Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80г",
        "tooltip-ca-nstab-main": "ОагIон чурадар",
        "tooltip-ca-nstab-user": "Доакъашхочун ше доалахь йола оагIув",
        "tooltip-ca-nstab-special": "Ер гIулакха оагIув я, из хувца бокъо яц",
        "tooltip-ca-nstab-project": "Проектан оагIув",
-       "tooltip-ca-nstab-image": "Файлан оагӀув",
+       "tooltip-ca-nstab-image": "Файла оагӀув",
        "tooltip-ca-nstab-template": "Лера оагIув",
        "tooltip-ca-nstab-help": "ГӀон оагIув",
-       "tooltip-ca-nstab-category": "Ð\9aаÑ\82егоÑ\80ий оагӀув",
+       "tooltip-ca-nstab-category": "Ð\9aаÑ\82егоÑ\80ен оагӀув",
        "tooltip-minoredit": "Ер хувцар башха доаца санна белгалде",
-       "tooltip-save": "Хьай хувцамаш лорадеш дIаязде",
-       "tooltip-preview": "Дехар да, оагӀув лораешь дIаязъелехь из мишта я тахка хьалххе хьажарах пайда эцаш!",
+       "tooltip-save": "Хьа хувцамаш лорадеш дIаязде",
+       "tooltip-preview": "Дехар да, оагӀув лораешь дIаязъелехь из мишта я тахка хьалххе бIаргтохарах пайда эцаш!",
        "tooltip-diff": "ДIадолалу текстаца даь хувцамаш хьахьокха",
        "tooltip-compareselectedversions": "Укх оагIувни шин доржамаш тIа юкъера хувцамаш зе.",
        "tooltip-watch": "Ер оагIув теркам беча каьхата тIа яькха",
        "pageinfo-toolboxlink": "ОагIонах бола хоам",
        "previousdiff": "← Хьалхара нийсдар",
        "nextdiff": "ТIайоагIа нийсъар",
-       "file-info-size": "$1 × $2 {{PLURAL:$2|пиксель}}, файлан боарам: $3, MIME-тайпа: $4",
+       "file-info-size": "$1 × $2 {{PLURAL:$2|пиксель}}, файла боарам: $3, MIME-тайпа: $4",
        "file-nohires": "Укхал дуккхагIа доккхал долаш верси яц",
        "svg-long-desc": "SVG-файл, номинально $1 × $2 {{PLURAL:$2|пиксель}}, файлан боарам: $3",
        "show-big-image": "ДIадолалу файл",
        "show-big-image-preview": "Боарам хьалххе бIаргтохач хан: $1.",
-       "show-big-image-other": "{{PLURAL:$2|1=Ð\9aÑ\85Ñ\8bйола  Ñ\80азÑ\80еÑ\88ени|Ð\9aÑ\85Ñ\8bйола  Ñ\80азÑ\80еÑ\88енеÑ\88}}: $1.",
+       "show-big-image-other": "{{PLURAL:$2|1=Ð\9aÑ\85Ñ\8bбола Ñ\82IеÑ\80а Ð±Ð¾Ð°Ñ\80ам|Ð\9aÑ\85Ñ\8bбола Ñ\82IеÑ\80а Ð±Ð¾Ð°Ñ\80ам}}: $1.",
        "show-big-image-size": "$1 × $2 пиксель",
        "noimages": "Суртaш бIаргагуш дац.",
        "ilsubmit": "Хьалáха",
        "bad_image_list": "Бустам цу тайпара хила беза:\n\nДагарлен хьаракъаш мара лоарх|аш хургьяц (укх тамагIалгацa * дувлашду мугIараш).\nМугIарен хьалхара Iинк, сурт Iоттае пурам доаца Iинка, хила еза. \nЦу мугIара тIехьайоагIа Iинкаш, арадаккхар мо лоарх|аш хургья, вешта аьлча, йоазувашка чуIоттаде мегаш дола сурт санна ларх|а мега.",
        "metadata": "Мета-дараш",
-       "metadata-help": "ФайлаÑ\81 ÐºÑ\85Ñ\8bдола Ñ\85оамаш чулоаца, цифровой суртдоакхарго е сканеро тIатохаш дола. Нагахьа файл чуякхачул тIехьа хийца хинна дале, цхьаццайола параметраш хIанзара сурта тара йоацаш хила мегаш я.",
+       "metadata-help": "Файло ÐºÑ\85Ñ\8bдола Ð´Ð°Ñ\80аш чулоаца, цифровой суртдоакхарго е сканеро тIатохаш дола. Нагахьа файл чуякхачул тIехьа хийца хинна дале, цхьаццайола параметраш хIанзара сурта тара йоацаш хила мегаш я.",
        "metadata-expand": "Кхыдола хIамаш хьахьокха",
        "metadata-collapse": "Кхыдола хIамаш къайладаккха",
        "metadata-fields": "Укх списке дагaрадаь суртай метахоамай йистош, хьахьекха хургда суртан оагIон тIа, метахоамай таблица хьоарчая йолаш. Юхедиса йистош къайла хургда.\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-orientation": "Сурта белгало",
-       "exif-xresolution": "ПхьорагIа разрешени",
-       "exif-yresolution": "УрагIа разрешени",
+       "exif-xresolution": "ПхьорагIа тIера боарам",
+       "exif-yresolution": "УрагIа тIера боарам",
+       "exif-datetime": "Файл хийца хинна таьрахьи хаи",
        "exif-imagedescription": "Сурта цIи",
+       "exif-make": "Камера кийчъяь арахийцар",
        "exif-model": "Камера модель",
        "exif-software": "Программни Iалашдар",
        "exif-artist": "Яздархо",
        "exif-colorspace": "Бесай мотт",
        "exif-pixelxdimension": "Сурта шорал",
        "exif-pixelydimension": "Сурта лакхал",
+       "exif-datetimeoriginal": "Оригинальни таьрахьи хаи",
        "exif-datetimedigitized": "Оцифровк яь таьрахь а, ха а",
        "exif-writer": "Яздама да",
        "exif-languagecode": "Мотт",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дувца оттадар]])",
        "duplicate-defaultsort": "Зем бе. Сатийна дIа-хьа хьоржама доагI \"$2\" хьалхара сатийна дIа-хьа хьоржама доагI \"$1\" хьахьоржа.",
        "version": "Доржам",
-       "version-specialpages": "Ð\91алха оагӀонаш",
+       "version-specialpages": "Ð\93\83лакха оагӀонаш",
        "version-version": "($1)",
        "version-software-version": "Доржам",
        "fileduplicatesearch-filename": "ПаьлацIи:",
        "fileduplicatesearch-submit": "Хьалáха",
-       "specialpages": "ЛаьрххIа йола оагIувнаш",
+       "specialpages": "ЛаьрххIа йола оагIонаш",
        "specialpages-group-users": "Дакъалаьцархой, цара бокъо",
        "specialpages-group-pages": "ОагIувний дагарченаш",
        "specialpages-group-pagetools": "ОагIувнаша гIирсаш",
        "external_image_whitelist": "#Ер мугI ший долаш тайпара дита<pre>\n#Каст-каста оаламаш укхаза дIаязаде(юкъе дола дакъа //)\n#арара суртий URLца дIанийсалургда уш.\n#Пайдан дола, сурташ мо хьахьекха хургья, дахIодараш, сурта тIа Iинкаш мо хуpгья хьахьекха.\n#Укх # тамагIалгаца дIадувлаш дола мугIанаш, оалам мо лоархаш да.\n#МугIанаш яздaтакха каьда да\n\n#Каст-каста оаламаш укх мугIа лакхе дIаязаде. Из мугI ший долаш тайпара дита</pre>",
-       "tag-filter": "[[Special:Tags|белгалонай]] Ð»Ñ\83Ñ\82Ñ\82аÑ\80г:",
+       "tag-filter": "[[Special:Tags|Ð\91елгалонай]] Ñ\84илÑ\8cÑ\82Ñ\80:",
        "tag-filter-submit": "ЦIенъе",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Белгало|Белгалонаш}}]]: $2)",
        "tags-title": "Йоазонаш",
index d4670e4..06fd0b2 100644 (file)
        "password-change-forbidden": "Non è possibile modificare le password su questo wiki.",
        "externaldberror": "Si è verificato un errore con il server di autenticazione esterno, oppure non si dispone delle autorizzazioni necessarie per aggiornare il proprio accesso esterno.",
        "login": "Entra",
+       "login-security": "Verifica la tua identità",
        "nav-login-createaccount": "Entra / registrati",
        "userlogin": "Entra / registrati",
        "userloginnocreate": "Entra",
        "createacct-email-ph": "Inserisci il tuo indirizzo email",
        "createacct-another-email-ph": "Inserisci l'indirizzo di posta elettronica",
        "createaccountmail": "Usa una password casuale temporanea e inviala all'indirizzo di posta elettronica specificato",
+       "createaccountmail-help": "Può essere utilizzato per creare un'utenza per un'altra persona senza doverne conoscere la password.",
        "createacct-realname": "Nome reale (opzionale)",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Perché stai creando un'altra utenza",
-       "createacct-reason-help": "Messaggio visualizzato nel registro della creazione dell'account",
+       "createacct-reason-help": "Messaggio visualizzato nel registro della creazione dell'utenza",
        "createacct-submit": "Crea la tua utenza",
        "createacct-another-submit": "Crea utenza",
-       "createacct-another-continue-submit": "Continuare la creazione dell'account",
+       "createacct-continue-submit": "Continua la creazione dell'utenza",
+       "createacct-another-continue-submit": "Continua la creazione dell'utenza",
        "createacct-benefit-heading": "{{SITENAME}} cresce grazie a persone come te.",
        "createacct-benefit-body1": "{{PLURAL:$1|modifica|modifiche}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|pagine}}",
        "nocookiesnew": "La registrazione è stata completata, ma non è stato possibile accedere a {{SITENAME}} perché i cookie sono disattivati. Riprovare l'accesso con il nome utente e la password appena creati dopo aver attivato i cookie nel proprio browser.",
        "nocookieslogin": "L'accesso a {{SITENAME}} richiede l'uso dei cookie, che risultano disattivati. Riprovare l'accesso dopo aver attivato i cookie nel proprio browser.",
        "nocookiesfornew": "L'account utente non è stato creato, poiché non abbiamo potuto confermare la sua fonte.\nAssicurati di avere attivato i cookie, ricarica questa pagina e riprova.",
-       "createacct-loginerror": "L'account è stato creato correttamente ma non è stato possibile farti accedere in modo automatico. Per piacere procedi a [[Special:UserLogin|accesso manuale]].",
+       "createacct-loginerror": "L'utenza è stata creata correttamente, ma non è stato possibile farti accedere in modo automatico. Procedi con l'[[Special:UserLogin|accesso manuale]].",
        "noname": "Il nome utente indicato non è valido.",
        "loginsuccesstitle": "Accesso effettuato",
        "loginsuccess": "'''Sei stato connesso al server di {{SITENAME}} con il nome utente di \"$1\".'''",
        "createacct-another-realname-tip": "L'indicazione del proprio nome vero è opzionale; se si sceglie di inserirlo, verrà utilizzato per attribuire la paternità dei contenuti inviati.",
        "pt-login": "Entra",
        "pt-login-button": "Entra",
+       "pt-login-continue-button": "Continua l'accesso",
        "pt-createaccount": "Registrati",
        "pt-userlogout": "esci",
        "php-mail-error-unknown": "Errore sconosciuto nella funzione PHP mail()",
        "passwordreset-emailsentusername": "Se c'è un indirizzo di posta elettronica associato con questo nome utente, allora verrà inviata una email per reimpostare la password.",
        "passwordreset-emailsent-capture": "È stata inviata una email di reimpostazione della password, il contenuto è riportato di seguito.",
        "passwordreset-emailerror-capture": "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
+       "passwordreset-emailsent-capture2": "L'email di reimpostazione della password {{PLURAL:$1|è stata inviata|sono state inviate}}. {{PLURAL:$1|Il nome|L'elenco di nomi}} utente e password è mostrato di seguito.",
+       "passwordreset-emailerror-capture2": "Invio di email {{GENDER:$2|all'utente}} non riuscito: $1. {{PLURAL:$3|Il nome|L'elenco di nomi}} utente e password è mostrato di seguito.",
+       "passwordreset-nocaller": "Un chiamante deve essere fornito",
+       "passwordreset-nosuchcaller": "Chiamante non esiste: $1",
        "passwordreset-ignored": "La reimpostazione della password non è stata gestita. Forse nessun provider è configurato?",
+       "passwordreset-invalideamil": "Indirizzo di posta elettronica non valido",
+       "passwordreset-nodata": "Non è stato fornito né un nome utente né un indirizzo di posta elettronica",
        "changeemail": "Modifica o rimuovi indirizzo di posta elettronica",
        "changeemail-header": "Completa questo modulo per cambiare il tuo indirizzo email. Se vuoi rimuovere l'associazione di qualsiasi indirizzo email dalla tua utenza, lascia il nuovo indirizzo email vuoto quando invii il modulo.",
        "changeemail-passwordrequired": "Sarà necessario inserire la password per confermare la modifica.",
        "timezone-local": "Locale",
        "duplicate-defaultsort": "Attenzione: la chiave di ordinamento predefinita \"$2\" sostituisce la precedente \"$1\".",
        "duplicate-displaytitle": "<strong>Attenzione:</strong> il titolo visualizzato \"$2\" sostituisce il precedente titolo \"$1\".",
+       "restricted-displaytitle": "<strong>Attenzione:</strong> Il titolo visualizzato \"$1\" è stato ignorato poiché non equivalente al titolo attuale della pagina.",
        "invalid-indicator-name": "<strong>Errore:</strong> attributo <code>name</code> degli indicatori dello stato della pagina non può essere vuoto.",
        "version": "Versione",
        "version-extensions": "Estensioni installate",
        "log-action-filter-suppress-reblock": "Soppressione utente da ri-blocco",
        "log-action-filter-upload-upload": "Nuovo caricamento",
        "log-action-filter-upload-overwrite": "Ricaricamento",
+       "authmanager-authn-not-in-progress": "L'autenticazione non è in corso o i dati della sessione sono andati persi. Si prega di ricominciare dall'inizio.",
+       "authmanager-authn-no-primary": "Le credenziali fornite non possono essere autenticate.",
        "authmanager-authn-no-local-user": "Le credenziali fornite non sono associate a nessun utente di questo wiki.",
-       "authmanager-authn-autocreate-failed": "Creazione automatica di un account locale fallita: $1",
-       "authmanager-create-disabled": "La creazione di account è disabilitata.",
-       "authmanager-create-from-login": "Per creare il tuo account, per piacere completa i campi qui sotto.",
-       "authmanager-create-not-in-progress": "La creazione di un account non è in corso o i dati della sessione sono andati persi. Si prega di ricominciare nuovamente dall'inizio.",
-       "authmanager-create-no-primary": "Le credenziali fornite non possono essere utilizzate per la creazione dell'account.",
+       "authmanager-authn-no-local-user-link": "Le credenziali fornite sono valide ma non sono associate a nessun utente di questa wiki. Accedi in un modo diverso o crea un nuovo utente, e avrai un'opzione per collegare le tue credenziali precedenti a quell'utenza.",
+       "authmanager-authn-autocreate-failed": "Creazione automatica di un'utenza locale fallita: $1",
+       "authmanager-change-not-supported": "Le credenziali fornite non possono essere modificate, dato che non verrebbero usate da nulla.",
+       "authmanager-create-disabled": "La creazione di utenze è disabilitata.",
+       "authmanager-create-from-login": "Per creare la tua utenza, completa i campi qui sotto.",
+       "authmanager-create-not-in-progress": "La creazione di un'utenza non è in corso o i dati della sessione sono andati persi. Si prega di ricominciare nuovamente dall'inizio.",
+       "authmanager-create-no-primary": "Le credenziali fornite non possono essere utilizzate per la creazione dell'utenza.",
+       "authmanager-link-no-primary": "Le credenziali fornite non possono essere utilizzate per il collegamento dell'utenza.",
+       "authmanager-link-not-in-progress": "Il collegamento dell'utenza non è in corso o i dati della sessione sono andati persi. Si prega di ricominciare dall'inizio.",
+       "authmanager-authplugin-setpass-failed-title": "Modifica della password fallita",
        "authmanager-authplugin-setpass-failed-message": "Il plugin di autenticazione ha impedito la modifica della password.",
-       "authmanager-authplugin-create-fail": "Il plugin di autenticazione ha impedito la creazione dell'account.",
+       "authmanager-authplugin-create-fail": "Il plugin di autenticazione ha impedito la creazione dell'utenza.",
        "authmanager-authplugin-setpass-denied": "Il plugin di autenticazione non consente di cambiare le password.",
-       "authmanager-autocreate-noperm": "La creazione automatica di un account non è permessa.",
+       "authmanager-authplugin-setpass-bad-domain": "Dominio non valido.",
+       "authmanager-autocreate-noperm": "La creazione automatica dell'utenza non è permessa.",
+       "authmanager-autocreate-exception": "La creazione automatica di utenze è temporaneamente disabilitata a causa di errori precedenti.",
        "authmanager-userdoesnotexist": "L'utenza \"$1\" non è registrata.",
        "authmanager-userlogin-remembermypassword-help": "Se la password deve essere ricordata più a lungo rispetto alla durata della sessione.",
+       "authmanager-username-help": "Nome utente per l'autenticazione.",
        "authmanager-password-help": "Password per l'autenticazione.",
+       "authmanager-domain-help": "Dominio per l'autenticazione esterna.",
        "authmanager-retype-help": "Conferma nuovamente la password.",
+       "authmanager-email-label": "Email",
        "authmanager-email-help": "Indirizzo email",
+       "authmanager-realname-label": "Nome reale",
        "authmanager-realname-help": "Nome reale dell'utente",
        "authmanager-provider-password": "Autenticazione basata su password",
        "authmanager-provider-password-domain": "Autenticazione con password o basata su dominio",
-       "authprovider-confirmlink-message": "Basandosi sui recenti tentativi di login, i seguenti accounts possono essere collegati al tuo account wiki. Collegarli ti consente di effettuare il login tramite essi. Si prega di selezionare quelli che devono essere collegati.",
-       "authprovider-confirmlink-success-line": "$1: Collegato correttamente.",
-       "authprovider-confirmlink-failed": "Il collegamento dell'account non è pienamente riuscito: $1",
+       "authmanager-provider-temporarypassword": "Password temporanea",
+       "authprovider-confirmlink-message": "Basandosi sui recenti tentativi di accesso, le seguenti utenze possono essere collegate al tuo account wiki. Collegarli ti consente di effettuare l'accesso tramite di esse. Si prega di selezionare quelli che devono essere collegate.",
+       "authprovider-confirmlink-request-label": "Utenze che dovrebbero essere collegate",
+       "authprovider-confirmlink-success-line": "$1: collegato correttamente.",
+       "authprovider-confirmlink-failed": "Il collegamento dell'utenza non è pienamente riuscito: $1",
+       "authprovider-confirmlink-ok-help": "Continua dopo la visualizzazione di messaggi di errore di collegamento.",
+       "authprovider-resetpass-skip-label": "Salta",
+       "authprovider-resetpass-skip-help": "Salta reimpostazione della password.",
        "authform-nosession-login": "L'autenticazione ha avuto successo, ma il tuo browser non è in grado di \"ricordare\" che ti sei collegato.\n\n$1",
+       "authform-nosession-signup": "L'utenza è stata creata, ma il tuo browser non è in grado di \"ricordare\" che ti sei collegato.\n\n$1",
        "authform-newtoken": "Token mancante. $1",
        "authform-notoken": "Token mancante",
        "authform-wrongtoken": "Token errato",
+       "specialpage-securitylevel-not-allowed-title": "Non consentito",
        "specialpage-securitylevel-not-allowed": "Siamo spiacenti, non sei autorizzato ad utilizzare questa pagina perché la tua identità non può essere verificata.",
+       "authpage-cannot-login": "Impossibile avviare l'accesso.",
        "authpage-cannot-login-continue": "Impossibile continuare l'accesso. La tua sessione è probabilmente scaduta.",
-       "authpage-cannot-link": "Impossibile avviare il collegamento dell'account.",
-       "authpage-cannot-link-continue": "Impossibile continuare il collegamento dell'account. La tua sessione è probabilmente scaduta.",
+       "authpage-cannot-create": "Impossibile iniziare la creazione dell'utenza.",
+       "authpage-cannot-create-continue": "Impossibile continuare la creazione dell'utenza. La tua sessione è probabilmente scaduta.",
+       "authpage-cannot-link": "Impossibile avviare il collegamento dell'utenza.",
+       "authpage-cannot-link-continue": "Impossibile continuare il collegamento dell'utenza. La tua sessione è probabilmente scaduta.",
        "cannotauth-not-allowed-title": "Permesso negato",
-       "changecredentials": "Modifica delle credenziali",
-       "changecredentials-submit": "Modifica",
+       "cannotauth-not-allowed": "Non sei autorizzato a utilizzare questa pagina",
+       "changecredentials": "Modifica credenziali",
+       "changecredentials-submit": "Modifica credenziali",
        "changecredentials-submit-cancel": "Annulla",
        "changecredentials-invalidsubpage": "$1 non è una tipologia di credenziale valida.",
-       "removecredentials-submit": "Rimuovi",
+       "changecredentials-success": "Le tue credenziali sono state modificate.",
+       "removecredentials": "Rimuovi credenziali",
+       "removecredentials-submit": "Rimuovi credenziali",
        "removecredentials-submit-cancel": "Annulla",
-       "cannotlink-no-provider-title": "Non ci sono account collegabili.",
-       "cannotlink-no-provider": "Non ci sono account collegabili.",
-       "linkaccounts-success-text": "L'account è stato collegato."
+       "removecredentials-invalidsubpage": "$1 non è una tipologia di credenziale valida.",
+       "removecredentials-success": "Le tue credenziali sono state eliminate.",
+       "credentialsform-provider": "Tipo di credenziali:",
+       "credentialsform-account": "Nome utenza:",
+       "cannotlink-no-provider-title": "Non ci sono utenze collegabili",
+       "cannotlink-no-provider": "Non ci sono utenze collegabili.",
+       "linkaccounts": "Collega utenze",
+       "linkaccounts-success-text": "L'utenza è stata collegata.",
+       "linkaccounts-submit": "Collega utenze",
+       "unlinkaccounts": "Scollega utenze",
+       "unlinkaccounts-success": "L'utenza è stata scollegata."
 }
index f446921..57d4099 100644 (file)
        "morenotlisted": "Listen ä ett komplett.",
        "mypage": "Siid",
        "mytalk": "Diskusjon",
-       "anontalk": "Diskusjonssiid for denn IP-adress",
+       "anontalk": "Diskusjonssiid",
        "navigation": "Navigasjon",
        "and": "&#32;å",
        "qbfind": "Syeg",
        "viewsource-title": "Sie tjeljkoden te $1",
        "actionthrottled": "Begrænsneng å hånjleng",
        "viewsourcetext": "Du ken dog se og åfskreve'n keldekode til æ side:",
+       "exception-nologin": "Ikke loggen på",
        "welcomeuser": "Wælkomen, $1!",
        "welcomecreation-msg": "Det konto ä bløwen opretten.\nGlæmm ett å ønda din [[Special:Preferences|instellenge for {{SITENAME}}]].",
        "yourname": "Det brugenaun:",
        "createacct-emailoptional": "E-mailadress (walgfri)",
        "createacct-email-ph": "Intast dej e-mailadress",
        "createacct-another-email-ph": "Intast e-mailadress",
+       "createaccountreason": "Begrunjels:",
        "createacct-submit": "Oprett det konto",
+       "createacct-another-submit": "Oprett konto",
        "createacct-benefit-heading": "{{SITENAME}} laws å menske som du.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigiireng|redigiirenge}}",
        "createacct-benefit-body2": "{{PLURAL:$1|siid|side}}",
        "pt-createaccount": "Oprett konto",
        "pt-userlogout": "Logg å",
        "retypenew": "Djentast ny adgångskode",
+       "botpasswords-label-delete": "Slett",
        "resetpass-submit-cancel": "Åbryd",
        "passwordreset": "Nullstell adgångskode",
+       "passwordreset-username": "Brugenaun:",
        "bold_sample": "Fied tekst",
        "bold_tip": "Fied tekst",
        "italic_sample": "Kursiw tekst",
        "history-feed-title": "Versjonshistori",
        "history-feed-item-nocomment": "$1 mä $2",
        "rev-delundel": "ønda sijtbarhed",
+       "revdelete-show-file-submit": "Ja",
+       "revdelete-log": "Begrunjels:",
        "history-title": "$1: Versjonshistorik",
        "difference-title": "Forskell mellem versjone å \"$1\"",
        "lineno": "Linje $1:",
        "badsig": "Syntaksi i signaturen ä udjylji; kontrolliir wenlist den brugtje HTML.",
        "badsiglength": "Din signatur ä for lång. Den ma hyest inholj $1 {{PLURAL:$1|tejn}}.",
        "yourgender": "Hwant forträkke du å blyw beskriiwen?",
+       "email": "E-mail",
        "prefs-help-realname": "Åndjiels å rijti naun ä walgfritj.\nHwes du wælge å oplys det naun, wil dä blyw brugtj te å tilskriiw dej det arbejt.",
        "prefs-editor": "Redigiirengsprogramme",
        "prefs-preview": "Forhånjswisneng",
        "rcshowhideminor-show": "Wis",
        "rcshowhideminor-hide": "Sjul",
        "rcshowhidebots": "$1 robotte",
-       "rcshowhidebots-show": "Sjul",
+       "rcshowhidebots-show": "Wis",
        "rcshowhidebots-hide": "Sjul",
        "rcshowhideliu": "$1 registriirtje bruga",
        "rcshowhideliu-show": "Wis",
        "rcshowhidemine": "$1 ejne bidraw",
        "rcshowhidemine-show": "Wis",
        "rcshowhidemine-hide": "Sjul",
+       "rcshowhidecategorization-show": "Wis",
+       "rcshowhidecategorization-hide": "Sjul",
        "rclinks": "Wis siensti $1 øndrenge i di sisti $2 daw<br />$3",
        "diff": "forskell",
        "hist": "historik",
index 38ef8c0..c8172ed 100644 (file)
@@ -33,6 +33,7 @@
        "tog-watchdefault": "Мен өңдеген беттерді және файлдарды бақылау тізіміне қосу",
        "tog-watchmoves": "Мен жылжытқан беттерді және файлдарды бақылау тізіміне қосу",
        "tog-watchdeletion": "Мен жойған беттерді және файлдарды бақылау тізіміне қосу",
+       "tog-watchuploads": "Бақылау тізіміме мен жүктеген файлдарды қосу",
        "tog-watchrollback": "Мен шегіндіруін орындаған беттерді бақылау тізіміме қосу",
        "tog-minordefault": "Әдепкі бойынша барлық өңдемелерді шағын деп белгілеу",
        "tog-previewontop": "Қарап шығу аумағын өңдеу терезесінің жоғарғы жағында көрсету",
        "fewestrevisions": "Ең аз түзетілген беттер",
        "nbytes": "$1 {{PLURAL:$1|байт|байт}}",
        "ncategories": "$1 {{PLURAL:$1|Санат|Санаттар}}",
-       "ninterwikis": "$1 {{PLURAL:$1|интеруики|интеруикилер}}",
+       "ninterwikis": "$1 {{PLURAL:$1|интеруики|интеруики}}",
        "nlinks": "$1 сілтеме",
        "nmembers": "$1 {{PLURAL:$1|мүше|мүше}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|мүше|мүше}}",
index f493da3..527b8d9 100644 (file)
        "passwordreset-emailsent-capture": "비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.",
        "passwordreset-emailerror-capture": "비밀번호 재설정 이메일이 생성되어 아래에 나타나 있지만, {{GENDER:$2|사용자}}에게 발송하는 데에는 실패했습니다: $1",
        "passwordreset-emailsent-capture2": "비밀번호 재설정 이메일을 보냈습니다. {{PLURAL:$1|사용자 이름과 비밀번호는|사용자 이름과 비밀번호의 목록은}} 아래에 나타납니다.",
-       "passwordreset-emailerror-capture2": "사용자 이메일 보내기 실패: $1 {{PLURAL:$3|사용자 이름과 비밀번호가|사용자 이름과 비밀번호의 목록이}} 아래에 나타납니다.",
+       "passwordreset-emailerror-capture2": "{{GENDER:$2|사용자}} 이메일 보내기 실패: $1 {{PLURAL:$3|사용자 이름과 비밀번호가|사용자 이름과 비밀번호의 목록이}} 아래에 나타납니다.",
        "passwordreset-nocaller": "호출자를 지정해야 합니다",
        "passwordreset-nosuchcaller": "호출자가 존재하지 않습니다: $1",
        "passwordreset-ignored": "비밀번호 재설정을 처리하지 못했습니다. 제공자가 구성되지 않았기 때문일 수 있습니다.",
        "trackingcategories-msg": "추적용 분류",
        "trackingcategories-name": "메시지 이름",
        "trackingcategories-desc": "분류 포함 기준",
+       "restricted-displaytitle-ignored": "제목 표시가 무시된 문서",
+       "restricted-displaytitle-ignored-desc": "문서의 실제 제목과 일치하지 않기 때문에 무시된 <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>이 있는 문서입니다.",
        "noindex-category-desc": "문서는 그것과 그 플래그가 허용된 곳에 있는 이름공간에서 <code><nowiki>__NOINDEX__</nowiki></code> 특수 명령이 있기 때문에 로봇이 색인하지 않습니다.",
        "index-category-desc": "문서는 그것(과 플래그가 허용된 곳에 있는 이름공간에 있는 것)에 <code><nowiki>__INDEX__</nowiki></code>가 있어서, 정상적이지 않을 곳에 로봇에 의해 색인됩니다.",
        "post-expand-template-inclusion-category-desc": "모든 틀을 전개하였을 때, 문서 크기가 <code>$wgMaxArticleSize</code>보다 커지므로, 어떤 틀은 전개하지 않았습니다.",
        "revertpage": "[[Special:Contributions/$2|$2]]([[User talk:$2|토론]])의 편집을 [[User:$1|$1]]의 마지막 판으로 되돌림",
        "revertpage-nouser": "숨긴 사용자의 편집을 {{GENDER:$1|[[User:$1|$1]]}}의 마지막 판으로 되돌림",
        "rollback-success": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다.",
+       "rollback-success-notify": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다. [$3 차이 보기]",
        "sessionfailure-title": "세션 실패",
        "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
        "changecontentmodel": "문서의 콘텐츠 모델을 변경",
        "confirm-unwatch-button": "확인",
        "confirm-unwatch-top": "이 문서를 주시문서 목록에서 뺄까요?",
        "confirm-rollback-button": "확인",
+       "confirm-rollback-top": "이 문서의 편집을 되돌리시겠습니까?",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← 이전 페이지",
        "imgmultipagenext": "다음 페이지 →",
        "authprovider-resetpass-skip-help": "비밀번호 재설정을 건너뜁니다.",
        "authform-nosession-login": "인증은 성공했으나 사용자의 브라우저가 로그인 상태를 저장하지 못했습니다.\n\n$1",
        "authform-nosession-signup": "계정은 생성되었으나 사용자의 브라우저가 로그인 상태를 저장하지 못했습니다.\n\n$1",
+       "authform-newtoken": "토큰이 없습니다. $1",
+       "authform-notoken": "토큰이 없습니다",
        "authform-wrongtoken": "잘못된 토큰",
        "specialpage-securitylevel-not-allowed-title": "허용하지 않음",
        "authpage-cannot-login": "로그인을 시작할 수 없습니다.",
index a5b3dbe..ce4419a 100644 (file)
        "confirm-watch-top": "Sulle mer di Sigg en Ding Oppaßleß opnämme?",
        "confirm-unwatch-button": "Lohß Jonn!",
        "confirm-unwatch-top": "Sulle mer di Sigg uß Dinger Oppaßleß erußnämme?",
+       "confirm-rollback-button": "Lohß Jonn!",
        "semicolon-separator": ";",
        "word-separator": "&#32;",
        "ellipsis": "&nbsp;…",
        "api-error-blacklisted": "Söhk Der ene anndere Nahme uß, dä mih drövver säht.",
        "randomrootpage": "Zofällige Aanfangs-Sigg",
        "log-action-filter-delete-delete": "En Sigg wohd fott jeschmeße",
+       "authmanager-authplugin-setpass-failed-title": "Dat Paßwoot ze änndere hät nit jeflupp",
        "authmanager-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ es nit ennjedrahre.",
        "authmanager-domain-help": "De Domäijn för de Zohjangsdaht vun ußerhallef beschtähtech ze krijje.",
+       "authmanager-email-label": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
        "authmanager-email-help": "De Addräß för de <i lang=\"en\">e-mail</i>",
+       "authmanager-realname-label": "Der „reeschteje“ Nahme",
+       "authmanager-provider-temporarypassword": "Zweschepasswood:",
        "authprovider-resetpass-skip-label": "Övverjonn",
+       "specialpage-securitylevel-not-allowed-title": "Nit zohjelohße",
+       "cannotauth-not-allowed-title": "Zohjang verbodde.",
+       "changecredentials-submit": "Ändere",
        "changecredentials-submit-cancel": "Ophüre",
-       "removecredentials-submit": "Fott nämme"
+       "removecredentials-submit": "Fott nämme",
+       "removecredentials-submit-cancel": "Ophüre"
 }
index 62ed2a3..e43af93 100644 (file)
        "confirm-watch-top": "Dës Säit op Är Iwwerwaachungslëscht bäisetzen?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Dës Säit vun Ärer Iwwerwaachungslëscht erofhuelen?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Ännerunge vun dëser Säit zrécksetzen?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← Vireg Säit",
        "imgmultipagenext": "nächst Säit →",
        "authprovider-resetpass-skip-label": "Iwwersprangen",
        "authprovider-resetpass-skip-help": "D'Zrécksetze vum Passwuert iwwersprangen",
        "specialpage-securitylevel-not-allowed-title": "Net erlaabt",
+       "specialpage-securitylevel-not-allowed": "Leider däerft Dir dës Säit net benotze well Är Identitéit net konnt iwwerpréift ginn.",
        "cannotauth-not-allowed-title": "Erlaabnes refuséiert",
+       "cannotauth-not-allowed": "Dir däerft dës Säit net benotzen",
        "changecredentials-submit": "Änneren",
        "changecredentials-submit-cancel": "Ofbriechen",
        "changecredentials-success": "Är Idendifikatiounsinformatioune goufe geännert.",
        "removecredentials-submit": "Ewechhuelen",
        "removecredentials-submit-cancel": "Ofbriechen",
        "credentialsform-account": "Numm vum Kont:",
-       "linkaccounts": "Benotzerkonte verbannen"
+       "cannotlink-no-provider-title": "Et gëtt keng Benotzerkonte fir ze verlinken",
+       "linkaccounts": "Benotzerkonte verbannen",
+       "linkaccounts-submit": "Benotzerkonte verbannen"
 }
index 3eb98b1..6019bc8 100644 (file)
        "minoredit": "Maznozīmīgs labojums",
        "watchthis": "Uzraudzīt šo lapu",
        "savearticle": "Saglabāt lapu",
+       "publishpage": "Saglabāt lapu",
        "preview": "Pirmskats",
        "showpreview": "Rādīt pirmskatu",
        "showdiff": "Rādīt izmaiņas",
        "userpage-userdoesnotexist": "Lietotājs \"<nowiki>$1</nowiki>\" nav reģistrēts.\nLūdzu, pārliecinies vai vēlies izveidot/izmainīt šo lapu.",
        "userpage-userdoesnotexist-view": "Dalībnieks \"$1\" nav reģistrēts.",
        "blocked-notice-logextract": "Šis dalībnieks pašlaik ir nobloķēts.\n\nPēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:",
-       "clearyourcache": "'''Piezīme:''' Lai redzētu izmaiņas, pēc saglabāšanas jums var nākties iztīrīt sava pārlūka kešatmiņu.\n* '''Firefox / Safari:''' Pieturiet ''Shift'' un klikšķiniet uz ''Pārlādēt'' vai nospiediet ''Ctrl-F5'' vai ''Ctrl-R'' (''Command-R'' uz Mac)\n* '''Google Chrome:''' Nospiediet ''Ctrl-Shift-R'' (''Command-Shift-R'' uz Mac)\n* '''Internet Explorer:''' Pieturiet ''Ctrl'' un klikšķiniet uz ''Pārlādēt'' vai nospiediet ''Ctrl-F5''\n* '''Konqueror:''' Klikšķiniet uz ''Pārlādēt'' vai nospiediet ''F5''\n* '''Opera:''' Iztīriet kešatmiņu ''Tools → Preferences''",
+       "clearyourcache": "<strong>Piezīme:</strong> Lai redzētu izmaiņas, pēc saglabāšanas var nākties iztīrīt sava pārlūka kešatmiņu.\n* <strong>Firefox / Safari:</strong> Pieturi <em>Shift</em> un klikšķini uz <em>Pārlādēt</em> vai nospied <em>Ctrl-F5</em> vai <em>Ctrl-R</em> (<em>⌘-R</em> uz Mac)\n* <strong>Google Chrome:</strong> Nospied <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> uz Mac)\n* <strong>Internet Explorer:</strong> Pieturi <em>Ctrl</em> un klikšķini uz <em>Pārlādēt</em> vai nospied <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Dodies uz <em>Menu → Settings</em> (<em>Opera → Preferences</em> uz Mac) un pēc tam uz <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Ieteikums:''' Lieto pogu \"{{int:showpreview}}\", lai pārbaudītu savu jauno CSS pirms saglabāšanas.",
        "userjsyoucanpreview": "'''Ieteikums:''' Lieto pogu \"{{int:showpreview}}\", lai pārbaudītu savu jauno JavaScript pirms saglabāšanas.",
        "usercsspreview": "'''Atceries, ka šis ir tikai tava dalībnieka CSS pirmskats, lapa vēl nav saglabāta!'''",
        "right-siteadmin": "Bloķēt un atbloķēt datubāzi",
        "right-sendemail": "Sūtīt e-pastu citiem dalībniekiem",
        "right-passwordreset": "Apskatīt paroles atiestatīšanas e-pasta ziņojumus",
+       "grant-group-email": "Sūtīt e-pastu",
+       "grant-createaccount": "Izveidot kontu",
        "newuserlogpage": "Jauno dalībnieku reģistrs",
        "newuserlogpagetext": "Jauno lietotājvārdu reģistrs.",
        "rightslog": "Dalībnieku tiesību reģistrs",
        "upload-form-label-infoform-description": "Apraksts",
        "upload-form-label-usage-title": "Pielietojums",
        "upload-form-label-usage-filename": "Faila nosaukums",
+       "upload-form-label-infoform-categories": "Kategorijas",
+       "upload-form-label-infoform-date": "Datums",
        "backend-fail-stream": "Nevar straumēt failu $1.",
        "backend-fail-backup": "Nevar dublēt failu $1.",
        "backend-fail-notexists": "Fails $1 nepastāv.",
        "apisandbox": "API smilškaste",
        "apisandbox-api-disabled": "API ir atspējots šajā tīmekļa vietnē.",
        "apisandbox-reset": "Notīrīt",
+       "apisandbox-retry": "Mēģināt vēlreiz",
        "apisandbox-examples": "Piemēri",
        "apisandbox-results": "Rezultāti",
        "apisandbox-request-url-label": "Pieprasījuma URL:",
        "confirm-watch-button": "Labi",
        "confirm-watch-top": "Pievienot šo lapu uzraugāmo lapu sarakstam?",
        "confirm-unwatch-button": "Labi",
+       "confirm-rollback-button": "Labi",
        "imgmultipageprev": "← iepriekšējā lapa",
        "imgmultipagenext": "nākamā lapa →",
        "imgmultigo": "Aiziet!",
index b2eed98..8450bb8 100644 (file)
@@ -7,13 +7,15 @@
                        "לערי ריינהארט",
                        "Bennylin",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Mbrt"
                ]
        },
        "tog-underline": "Garisen ngisoré pranala:",
        "tog-hideminor": "Umpetna suntingan cilik nang owahan anyar",
        "tog-hidepatrolled": "Umpetna suntingan sing wis dipatroli nang owahan anyar",
        "tog-newpageshidepatrolled": "Umpetna kaca sing wis dipatroli sekang daftar kaca anyar",
+       "tog-hidecategorization": "Umpetna kategori nang kaca",
        "tog-extendwatchlist": "Kembangna daftar pengawasan kanggo nidokna kabeh pangowahan, ora mung sing paling anyar thok",
        "tog-usenewrc": "Klompok owahan miturut kaca nang owahan anyar lan daptar pangawasan (mbutuhna JavaScript)",
        "tog-numberheadings": "Aweh nomer judul secara otomatis",
@@ -24,6 +26,7 @@
        "tog-watchdefault": "Tambahna kaca lan berkas sing tek-sunting maring daptar pangawasanne inyong",
        "tog-watchmoves": "Tambahna kaca lan berkas sing tek-pindah maring daptar pangawasanne inyong",
        "tog-watchdeletion": "Tambahna kaca lan berkas sing tek-busek maring daptar pangawasanne inyong",
+       "tog-watchuploads": "Sogna file anyar sing nyong unggah nang daptar sawangane nyong",
        "tog-watchrollback": "Tambahna kaca sing wis tek rollback maring daftar pangawasane inyong",
        "tog-minordefault": "Otomatis nandani kabeh suntingan dadi suntingan cilik",
        "tog-previewontop": "Tidokna pratayang sedurunge kotak sunting",
        "tog-watchlisthidebots": "Umpetna suntingane bot sekang daftar pangawasan",
        "tog-watchlisthideminor": "Umpetna suntingan cilik sekang daftar pangawasan",
        "tog-watchlisthideliu": "Umpetna suntingane pangganggo sing mlebu log sekang daftar pangawasan",
+       "tog-watchlistreloadautomatically": "Muat balik daptar sawangane otomatis yen saringan kebesut (Perintaeh JavaScript)",
        "tog-watchlisthideanons": "Umpetna suntingane panganggo anonim sekang daftar pangawasan",
        "tog-watchlisthidepatrolled": "Umpetna suntingan sing wis dipatroli sekang daftar pangawasan",
+       "tog-watchlisthidecategorization": "Umpetna kategori nang kaca",
        "tog-ccmeonemails": "Kirimi inyong salinan imel sing tak-kirimna maring panganggo sejen",
        "tog-diffonly": "Aja tidokna isi kaca nang ngisor bedane suntingan",
        "tog-showhiddencats": "Tidokna kategori sing diumpetna",
-       "tog-norollbackdiff": "Lirwakna perbedaan seuwise nglakokna pambalikan",
+       "tog-norollbackdiff": "Aja ndeleng perbedaane seuwise nglakokna pambalikan",
        "tog-useeditwarning": "Elingna inyong angger ninggalna kaca panyuntingan sing durung disimpen owahane",
        "tog-prefershttps": "Gunakna koneksi aman terus angger mlebu log",
        "underline-always": "Saben",
        "poolcounter-usage-error": "Usage error: $1",
        "aboutsite": "Prakara {{SITENAME}}",
        "aboutpage": "Project:Prakara",
-       "copyright": "Kabeh teks ana miturut $1.",
+       "copyright": "Kabeh teks ana miturut $1 namung sing cathetan liya beda.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
        "currentevents": "Kedaden Anyar",
        "currentevents-url": "Project:Prastawa sekiye",
        "nstab-template": "Cithakan",
        "nstab-help": "Pitulung",
        "nstab-category": "Kategori:",
+       "mainpage-nstab": "Kaca Utama",
        "nosuchaction": "Ora ana tindakan kaya kuwe",
        "nosuchactiontext": "Tindakan sing dijaluk URL kuwe ora sah.\nRika ndeyan salah ngetikna URL, utawa ngetutna pranala sing ora bener.\nKiye bisa uga ngindikasikna nek ana ''bug'' nang piranti alus sing digunakna nang {{SITENAME}}.",
        "nosuchspecialpage": "Ora ana kaca astamiwa kaya kuwe",
        "nospecialpagetext": "<strong>Rika njaluk kaca astamiwa sing ora sah.</strong>\n\nDaftar kaca astamiwa sing sah teyeng dideleng nang [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kasalahan",
        "databaseerror": "Kasalahan basis data",
+       "databaseerror-function": "Fungsine:$1",
+       "databaseerror-error": "Eror:$1",
        "laggedslavemode": "'''Pènget:''' Kaca kiye mbokmenawa isiné dudu pangowahan pungkasan.",
        "readonly": "Basis data dikunci",
        "enterlockreason": "Lebokna alesan panguncèn, kalebu uga prakiran kapan kunci bakal dibuka",
-       "readonlytext": "Basis data lagi dikunci sekang inputan anyar lan modifikasi liyane, ndeyane lagi ana perawatan basis data, seuwise kuwe tuli bakal balik normal maning.\n\nAdministrator sing ngunci kiye aweh katerangan kaya kiye: $1",
+       "readonlytext": "Basis data agi dikonci sekang inputan anyar lan modifikasi liyane, ndeyane agi ana perawatan basis data, seuwise kuwe toli bakal mbalik normal maning.\n\nAdministrator sing ngunci kiye aweh katerangan kaya kiye: $1",
        "missing-article": "Basis data ora teyeng nemokna teks paca sing kudune ana, yaiku \"$1\" $2.\n\nKiye biasanye jalaran pranala daluwarsa maring revisi sedurunge sekang kaca sing wis dibusak.\n\nAngger dudu kuwe sebabe, Rika ndeyan nemokna \"bug\" nang software. \nMonggo dilaporna maring [[Special:ListUsers/sysop|administrator]], karo nyebutna URL sing dituju.\n\nA",
        "missingarticle-rev": "(révisi#: $1)",
        "missingarticle-diff": "(Béda: $1, $2)",
        "filerenameerror": "Ora teyeng ngowahi jeneng berkas sekang \"$1\" dadi \"$2\".",
        "filedeleteerror": "Ora teyeng mbusak berkas \"$1\".",
        "directorycreateerror": "Ora teyeng nggawé dirèktori \"$1\".",
+       "directoryreadonlyerror": "Direktori \"$1\" mung diwaca thok.",
+       "directorynotreadableerror": "Direktori \"$1\" ora teyeng diwaca.",
        "filenotfound": "Ora teyeng nemokna berkas \"$1\".",
        "unexpected": "Nilai-ne nang jaba jangkauan: \"$1\"=\"$2\".",
        "formerror": "Kasalahan: Ora teyeng ngirimna formulir.",
        "actionthrottledtext": "Kanggo ngukur anti-spam, Rika diwatesi gole nglakoni tikdakan kiye keseringen nang wektu sing cendhak, lan Rika uwis nglewati watese kuwe.\nMonggo dijajal maning nang sawetara menit.",
        "protectedpagetext": "Kaca kiye uwis dikunci ben ora teyeng disunting utawa aksi liyane (pokoke ora teyeng diapa-apakna maning).",
        "viewsourcetext": "Rika teyeng ndeleng lan nyalin sumbere kaca kiye:",
-       "viewyourtext": "Rika teyeng ndeleng lan nyalin sumbere '''suntingane Rika''' nang kaca kiye:",
+       "viewyourtext": "Rika teyeng ndeleng lan nyalin sumbere <strong>suntingane Rika</strong> meng kaca kiye:",
        "protectedinterface": "Kaca kiye isine teks antarmuka ding dienggo piranti alus nang wiki kiye, lan uwis dikunci nggo menghindari kasalahan.\nKanggo nambaih utawa ngowaih terjemahan nang kabeh wiki, monggo gunakna [//translatewiki.net/ translatewiki.net], proyek lokalisasi MediaWiki.",
-       "editinginterface": "'''Pènget:''' Rika nyunting kaca sing dienggo nyedyakna tèks antarmuka kanggo piranti alus.\nPangowahan kaca kiye bakal awèh pangaruh maring tampilan antarmuka panganggo duweke panganggo sejen nang wiki kiye.\nAngger arep nambaih utawa ngowaih terjemahan, monggo gunakna [//translatewiki.net/translatewiki.net], proyèk lokalisasi MediaWiki.",
+       "editinginterface": "'''Penget:''' Rika nyunting kaca sing dienggo nyedyakna teks antarmuka kanggo piranti alus.\nPangowahan kaca kiye engko aweh pangaruh maring tampilan antarmuka panganggo duweke panganggo liyane nang wiki kiye.",
        "cascadeprotected": "Kaca kiye wis direksa sekang penyuntingan jalaran melu mlebu nang {{PLURAL:$1|kaca|kaca-kaca}} nang ngisor kiye sing wis direksa nganggo opsi \"runtun\":\n$2",
        "namespaceprotected": "Rika ora duwe hak akses kanggo nyunting kaca nang bilik jeneng '''$1'''.",
        "customcssprotected": "Rika ora duwe izin nggo nyunting kaca CSS kiye, jalaran isine pengaturan pribadine panganggo sejen.",
        "filereadonlyerror": "Ora teyeng ngowaih berkas \"$1\" jalaran panyimpenan berkas \"$2\" ana nang mode-mung-teyeng-diwaca.\n\nAdministrator sing ngunci aweh keterangan: \"$3\".",
        "invalidtitle-knownnamespace": "Irah-irahan ora sah nang bilikjeneng \"$2\" lan teks \"$3\"",
        "invalidtitle-unknownnamespace": "Judhul ora sah nang bilik jeneng sing ora dingerteni nomer $1 lan teks \"$2\"",
-       "exception-nologin-text": "Kaca utawa kelakon kiye mbutuhna mlebu log nèng wiki kiye dhisit.",
+       "exception-nologin": "Urung mlebu",
+       "exception-nologin-text": "Tulung mlebu disit ben Rika duwe akses maring kaca kiye.",
+       "exception-nologin-text-manual": "Tulung $1 ben tenyeng duwe akses maring kaca kiye.",
        "virus-badscanner": "Kasalahan konfigurasi: pamindai virus ora dikenal: ''$1''",
        "virus-scanfailed": "Pemindaian gagal (kode $1)",
        "virus-unknownscanner": "Antivirus ora ditepungi:",
        "logouttext": "'''Rika uwis metu log sekang sistem.'''\n\nDigatekna ya, cokan ana kaca sing esih terus nidokna nek rika esih mlebu log nganti Rika mbusak singgahan nang panjelajah web-e Rika.",
+       "cannotlogoutnow-title": "Ora teyeng metu siki",
+       "cannotlogoutnow-text": "Metu ora dadi angger nganggo:$1",
+       "welcomeuser": "Sugeng teka,$1",
        "welcomecreation-msg": "Akune Rika uwis digawe. \nAja kelalen ngowaih [[Special:Preferences|preferensi {{SITENAME}}]] Rika.",
        "yourname": "Jeneng panganggo:",
        "userlogin-yourname": "Jenengpanganggo",
        "remembermypassword": "Emutna data login-ne inyong nang peramban kiye (kanggo paling suwe $1 {{PLURAL:$1|dina|dina}})",
        "userlogin-remembermypassword": "Jorna ben Inyong tetep mlebu log",
        "userlogin-signwithsecure": "Gunakna koneksi aman",
+       "cannotloginnow-title": "Ora teyeng mlebu siki",
        "yourdomainname": "Domain Rika:",
        "password-change-forbidden": "Rika ora teyeng ngowaih tembung sandhi nang wiki kiye.",
        "externaldberror": "Ana kesalahan otentikasi basis data utawa Rika ora olih nglakokna pemutakhiran maring akun eksternale Rika.",
        "createacct-reason-ph": "Kenangapa Rika nggawe akun sejen",
        "createacct-submit": "Gawe akune Rika",
        "createacct-another-submit": "Gawe akun liyane",
+       "createacct-continue-submit": "Lanjutna penggawean akun",
        "createacct-benefit-heading": "{{SITENAME}} kuwe digawe nang wong kaya Rika.",
        "createacct-benefit-body1": "{{PLURAL:$1|owahan|owahan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
        "noname": "Jeneng panganggo sing Rika lebokna ora sah.",
        "loginsuccesstitle": "Sukses mlebu log",
        "loginsuccess": "'''Rika sekiye mlebu log nang {{SITENAME}} nganggo jeneng \"$1\".'''",
-       "nosuchuser": "Ora ana panganggo sing jenenge \"$1\".\nJeneng panganggo kuwe mbedakna kapitalisasi.\nPriksa maning ejaane Rika, utawa [[Special:CreateAccount|gawe akun anyar]]",
+       "nosuchuser": "Ora ana panganggo sing jenenge \"$1\".\nJeneng panganggo kuwe dibedakna nang kapitalisasi.\nPriksa maning ejaane Rika, utawa [[Special:CreateAccount|gawe akun anyar]]",
        "nosuchusershort": "Ora ana panganggo sing jenenge \"$1\".\nJajal dipriksa maning ejaane Rika.",
        "nouserspecified": "Rika kudu nglebokna jeneng panganggo.",
        "login-userblocked": "Panganggo kiye diblok. Ora olih mlebu log.",
        "revertpage": "Suntingane [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dibalekna maring vèrsi pungkasan sekang [[User:$1|$1]]",
        "revertpage-nouser": "Mbalekna suntingan sekang (jeneng panganggo dibusek) ming revisi pungkasan sekang [[User:$1|$1]]",
        "rollback-success": "Mbalekna suntingane $1;\ndibalekna ming revisi pungkasan sekang $2.",
+       "rollback-success-notify": "Mbalekna besutan sekang $1; owah mbalik nggo revisi mburi sekang $2. [$3 Deleng owahane]",
        "sessionfailure-title": "Sèsi gagal",
        "sessionfailure": "Ketone lagi ana masalah karo sesi log-e Rika;\nloge Rika wis dibatalna nggo nyegah pambajakan.\nMonggo mbalik ming kaca sedurunge, dibaleni gole muatna kaca (reload) lan jajal diunggahna maning.",
        "protectlogpage": "Log pangreksan",
index f534f84..3ff2f81 100644 (file)
        "confirm-watch-top": "Да ја додадам страницава во набљудуваните?",
        "confirm-unwatch-button": "ОК",
        "confirm-unwatch-top": "Да ја отстранам страницава од набљудуваните?",
+       "confirm-rollback-button": "ОК",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "&larr; претходна страница",
        "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": "Арапски-проширено",
        "api-error-blacklisted": "Одберете поинаков, описен наслов.",
        "sessionprovider-generic": "$1 седници",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "седници со колачиња",
-       "randomrootpage": "Случајна основна страница"
+       "randomrootpage": "Случајна основна страница",
+       "log-action-filter-block": "Тип на блок:",
+       "log-action-filter-contentmodel": "Тип на змена на содржинскиот модел:",
+       "log-action-filter-delete": "Тип на бришење:",
+       "log-action-filter-import": "Тип на увоз:",
+       "log-action-filter-managetags": "Тип на дејство за управување со ознаки:",
+       "log-action-filter-move": "Тип на преместување:",
+       "log-action-filter-newusers": "Тип на создавање сметка:",
+       "log-action-filter-patrol": "Тип на патролирање:",
+       "log-action-filter-protect": "Тип на заштита:",
+       "log-action-filter-rights": "Тип на промена во правата",
+       "log-action-filter-suppress": "Тип на скривање",
+       "log-action-filter-upload": "Тип на подигање:",
+       "log-action-filter-all": "Сите",
+       "log-action-filter-block-block": "блокирање",
+       "log-action-filter-block-reblock": "Измена на блок",
+       "log-action-filter-block-unblock": "Одблокирање",
+       "log-action-filter-contentmodel-change": "Промена на содржински модел",
+       "log-action-filter-contentmodel-new": "Создавање страница со нестандарден содржински модел",
+       "log-action-filter-delete-delete": "Бришење на страница",
+       "log-action-filter-delete-restore": "Повраток на страница",
+       "log-action-filter-delete-event": "Бришење на дневник",
+       "log-action-filter-delete-revision": "Бришење на преработка",
+       "log-action-filter-import-interwiki": "Прекувики-увоз",
+       "log-action-filter-import-upload": "Увоз со подигање XML",
+       "log-action-filter-managetags-create": "Создавање на ознаки",
+       "log-action-filter-managetags-delete": "Бришење на ознаки",
+       "log-action-filter-managetags-activate": "Активирање на ознаки",
+       "log-action-filter-managetags-deactivate": "Деактивирање на ознаки",
+       "log-action-filter-move-move": "Преместување без запис врз пренасочувања"
 }
index b612fe1..319be59 100644 (file)
        "badtitletext": "De naam van de op-evreugen zied is niet geldig, leeg, of n interwiki-verwiezing naor n onbekende of ongeldige wiki.",
        "perfcached": "Disse gegevens koemen uut t tussengeheugen en bin misschien niet aktueel. Der {{PLURAL:$1|is hooguut een resultaot|bin hooguut $1 resultaoten}} beschikbaor in t tussengeheugen.",
        "perfcachedts": "Disse gegevens koemen uut t tussengeheugen die veur t lest bie-ewörken is op $2 um $3. Der {{PLURAL:$4|is hooguut een resultaot|bin hooguut $4 resultaoten}} beschikbaor in t tussengeheugen.",
-       "querypage-no-updates": "'''Disse zied wörden niet meer bie-ewörken.'''",
+       "querypage-no-updates": "'''Disse zied wördt niet meer bie-ewörken.'''",
        "viewsource": "Brontekste bekieken",
        "viewsource-title": "Bron bekieken van $1",
        "actionthrottled": "Haandeling tegenehöllen",
        "unusedimages": "Ongebruukten bestaanden",
        "wantedcategories": "Gewunste kategorieën",
        "wantedpages": "Gewunste ziejen",
+       "wantedpages-summary": "Lieste van niet-bestaonde ziejen mit de meeste verwiezingen derhinne, ziejen waor allinnig mer naor deurverwezen wördt staon der niet bie. Veur n lieste van niet-bestaonde ziejen waor naor deurverwezen wördt, ku'j terechte op [[{{#special:BrokenRedirects}}|de lieste van ebreuken deurverwiezingen]].",
        "wantedpages-badtitle": "Ongeldige ziednaam in resultaot: $1",
        "wantedfiles": "Gewunste bestaanden",
        "wantedfiletext-cat": "De volgende bestaanden wörden gebruukt mer bestaon niet. Bestaanden van externe databanken kunnen op-eneumen ween in de lieste, ondanks dat ze bestaon. Soortgelieke vals positieven wörden <del>deurehaold weeregeven</del>. Ziejen die niet-bestaonde bestaanden insluten staon op de zied [[:$1]].",
index fa9dcb9..fa03e51 100644 (file)
        "undelete-error-long": "Er zijn fouten opgetreden bij het herstellen van het bestand:\n\n$1",
        "undelete-show-file-confirm": "Weet u zeker dat u een verwijderde versie van het bestand \"<nowiki>$1</nowiki>\" van $2 om $3 wilt bekijken?",
        "undelete-show-file-submit": "Ja",
-       "namespace": "Naamruimte:",
+       "namespace": "Naamruimte:&nbsp;",
        "invert": "Selectie omkeren",
        "tooltip-invert": "Selecteer dit om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)",
        "tooltip-whatlinkshere-invert": "Selecteer dit vakje om koppelingen van pagina's in de geselecteerde naamruimte te verbergen.",
        "confirm-watch-top": "Deze pagina toevoegen aan uw volglijst?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Deze pagina verwijderen uit uw volglijst?",
+       "confirm-rollback-button": "OK",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← vorige pagina",
        "imgmultipagenext": "volgende pagina →",
        "timezone-local": "Lokale tijd",
        "duplicate-defaultsort": "'''Waarschuwing:''' de standaardsortering \"$2\" krijgt voorrang voor de sortering \"$1\".",
        "duplicate-displaytitle": "<strong>Waarschuwing:</strong>Titelweergave \"$2\" overschrijft eerdere titelweergave \"$1\".",
-       "restricted-displaytitle": "<strong>Waarschuwing:</strong> Titelweergave \"$1\" werd genegeerd omdat het niet overeenkomt met de werkelijke titel van de pagina.",
+       "restricted-displaytitle": "<strong>Waarschuwing:</strong> Titelweergave \"$1\" werd genegeerd omdat deze niet overeenkomt met de werkelijke paginatitel.",
        "invalid-indicator-name": "<strong>Fout:</strong> de eigenschap <code>name</code> van de paginastatusindicators mag niet leeg zijn.",
        "version": "Versie",
        "version-extensions": "Geïnstalleerde uitbreidingen",
        "log-action-filter-rights-rights": "Handmatige aanpassing",
        "log-action-filter-rights-autopromote": "Automatische aanpassing",
        "log-action-filter-upload-upload": "Nieuwe upload",
-       "log-action-filter-upload-overwrite": "Herupload"
+       "log-action-filter-upload-overwrite": "Herupload",
+       "authmanager-email-label": "E-mail"
 }
index 1085b31..9624722 100644 (file)
        "password-change-forbidden": "ਇਸ ਵਿਕੀ ਤੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।",
        "externaldberror": "ਜਾਂ ਤਾਂ ਪ੍ਰਮਾਣਕੀ ਡਾਟਾਬੇਸ ਦੋਸ਼ ਆਇਆ ਹੈ ਜਾਂ ਤੁਹਾਨੂੰ ਆਪਣੇ ਬਾਹਰੀ ਖਾਤੇ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "login": "ਲਾਗਇਨ",
+       "login-security": "ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੜਤਾਲ ਕਰਵਾਉ",
        "nav-login-createaccount": "ਲਾਗਇਨ/ਖਾਤਾ ਬਣਾਓ",
        "userlogin": "ਲਾਗਇਨ/ਖਾਤਾ ਬਣਾਓ",
        "userloginnocreate": "ਲਾਗਇਨ",
        "noname": "ਤੁਸੀਂ ਇੱਕ ਸਹੀ ਯੂਜ਼ਰ-ਨਾਂ ਨਹੀਂ ਦਿੱਤਾ।",
        "loginsuccesstitle": "ਲਾਗਇਨ ਸਫ਼ਲ",
        "loginsuccess": "'''ਤੁਸੀਂ {{SITENAME}} ਉੱਤੇ \"$1\" ਵਜੋਂ ਲਾਗਇਨ ਹੋ ਚੁੱਕੇ ਹੋ।'''",
-       "nosuchuser": "!\"$1\" ਨਾਂ ਨਾਲ਼ ਕੋਈ ਵਰਤੋਂਕਾਰ ਨਹੀਂ ਹੈ। ਵੱਡੇ ਅਤੇ ਛੋਟੇ ਅੱਖਰ ਵਰਤਣ ਨਾਲ ਫ਼ਰਕ ਪੈਂਦਾ ਹੈ।\nਆਪਣੇ ਸਪੈਲਿੰਗ ਨੂੰ ਧਿਆਨ ਨਾਲ ਚੈੱਕ ਕਰੋ ਜਾਂ [[Special:CreateAccount|ਨਵਾਂ ਖਾਤਾ ਬਣਾਓ]]",
+       "nosuchuser": "!\"$1\" ਨਾਂ ਨਾਲ ਕੋਈ ਵਰਤੋਂਕਾਰ ਨਹੀਂ ਹੈ।\nਵੱਡੇ ਅਤੇ ਛੋਟੇ ਅੱਖਰ ਵਰਤਣ ਨਾਲ ਫ਼ਰਕ ਪੈਂਦਾ ਹੈ।\nਆਪਣੇ ਸ਼ਬਦਜੋੜ ਧਿਆਨ ਨਾਲ ਜਾਂਚੋ ਜਾਂ [[Special:CreateAccount|ਨਵਾਂ ਖਾਤਾ ਬਣਾਉ]]",
        "nosuchusershort": "\"$1\" ਨਾਂ ਨਾਲ ਕੋਈ ਵੀ ਵਰਤੋਂਕਾਰ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਸਪੈਲਿੰਗ ਧਿਆਨ ਨਾਲ ਚੈੱਕ ਕਰੋ।",
        "nouserspecified": "ਤੁਹਾਨੂੰ ਇੱਕ ਯੂਜ਼ਰ-ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ।",
        "login-userblocked": "ਇਹ ਯੂਜ਼ਰ-ਨਾਂ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। ਲਾਗਇਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "accmailtext": "[[User talk:$1|$1]] ਲਈ ਰਲ਼ਵੇਂ ਤੌਰ ’ਤੇ ਬਣਿਆ ਪਾਸਵਰਡ $2 ਨੂੰ ਭੇਜਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।\nਇਸ ਨਵੇਂ ਖਾਤੇ ਲਈ ਲਾਗਇਨ ਕਰਨ ਤੋਂ ਬਾਅਦ ''[[Special:ChangePassword|ਪਾਸਵਰਡ ਬਦਲੋ]]'' ’ਤੇ ਜਾ ਕੇ ਪਾਸਵਰਡ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।",
        "newarticle": "(ਨਵਾਂ)",
        "newarticletext": "ਤੁਸੀਂ ਕਿਸੇ ਅਜਿਹੇ ਸਫ਼ੇ ਦੇ ਕੜੀ ’ਤੇ ਹੋ ਜੋ ਹਾਲੇ ਬਣਾਇਆ ਨਹੀਂ ਗਿਆ।\nਸਫ਼ਾ ਬਣਾਉਣ ਲਈ ਹੇਠ ਦਿੱਤੇ ਖਾਨੇ ਵਿਚ ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ। (ਹੋਰ ਮਦਦ ਲਈ [$1 ਮਦਦ ਸਫ਼ਾ] ਵੇਖੋ।)\nਜੇ ਤੁਸੀਂ ਗ਼ਲਤੀ ਨਾਲ ਇੱਥੇ ਆਏ ਹੋ ਤਾਂ ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਦੇ '''ਪਿੱਛੇ''' ਬਟਨ ’ਤੇ ਕਲਿੱਕ ਕਰੋ।",
-       "anontalkpagetext": "----''à¨\87ਹ à¨\87à¨\95 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰ à¨²à¨\88 à¨\87à¨\95 à¨\9aਰà¨\9aਾ à¨¸à¨«à¨¼à¨¾ à¨¹à©\88 à¨\9cਿਸਨà©\87 à¨¹à¨¾à¨²à©\87 à¨\96ਾਤਾ à¨¨à¨¹à©\80 à¨¬à¨£à¨¾à¨\87à¨\86 à¨\9cਾà¨\82 à¨\89ਸਨà©\82à©° à¨µà¨°à¨¤ à¨¨à¨¹à©\80à¨\82 à¨°à¨¿à¨¹à¨¾à¥¤\nà¨\87ਸ à¨µà¨¾à¨¸à¨¤à©\87 à¨¸à¨¾à¨¡à©\87 à¨\95à©\8bਲ à¨\89ਸਨà©\82à©° à¨ªà¨\9bਾਨਣ à¨²à¨\88 IP à¨ªà¨¤à¨¾ à¨¹à©\88।\nà¨\87à¨\95 IP à¨ªà¨¤à¨¾ à¨\95à¨\88 à¨µà¨°à¨¤à¨£ à¨µà¨¾à¨²à¨¼à¨¿à¨\86à¨\82 à¨¦à©\81à¨\86ਰਾ à¨¸à¨¾à¨\82à¨\9dਾ à¨\95à©\80ਤਾ à¨\9cਾ à¨¸à¨\95ਦਾ à¨¹à©\88।\nà¨\9cà©\87 à¨¤à©\81ਸà©\80à¨\82 à¨\87ੱà¨\95 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰ à¨¹à©\8b à¨\85ਤà©\87 à¨¸à¨®à¨\9dਦà©\87 à¨¹à©\8b à¨\95ਿ à¨\87ਹ à¨\9fਿੱਪਣà©\80à¨\86à¨\82 à¨¤à©\81ਹਾਡà©\87 à¨²à¨\88 à¨¹à¨¨ à¨¤à¨¾à¨\82 à¨®à¨¿à¨¹à¨°à¨¬à¨¾à¨¨à©\80 à¨\95ਰà¨\95à©\87 à¨¹à©\8bਰਾà¨\82 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰਾà¨\82 à¨¨à¨¾à¨²à¨¼ à¨ªà©\88ਦਾ à¨¹à©\8bਣ à¨µà¨¾à¨²à¨¼à©\80 à¨\89ਲà¨\9dਣ à¨¤à©\8bà¨\82 à¨¬à¨\9aਣ à¨²à¨\88 [[Special:CreateAccount|à¨\96ਾਤਾ à¨¬à¨£à¨¾à¨\93]] ਜਾਂ [[Special:UserLogin|ਲਾਗਇਨ ਕਰੋ]]।''",
+       "anontalkpagetext": "----''à¨\87ਹ à¨\95ਿਸà©\87 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰ à¨²à¨\88 à¨\87à¨\95 à¨\9aਰà¨\9aਾ à¨¸à¨«à¨¼à¨¾ à¨¹à©\88 à¨\9cਿਸਨà©\87 à¨¹à¨¾à¨²à©\87 à¨\96ਾਤਾ à¨¨à¨¹à©\80à¨\82 à¨¬à¨£à¨¾à¨\87à¨\86 à¨\9cਾà¨\82 à¨\9cਿਹà©\9cਾ à¨\87ਸਨà©\82à©° à¨µà¨°à¨¤à¨¦à¨¾ à¨¨à¨¹à©\80à¨\82 à¨¹à©\88।\nà¨\87ਸ à¨µà¨¾à¨¸à¨¤à©\87 à¨¸à¨¾à¨¡à©\87 à¨\95à©\8bਲ à¨\89ਸਨà©\82à©° à¨ªà¨\9bਾਨਣ à¨²à¨\88 IP à¨ªà¨¤à¨¾ à¨¹à©\88।\nà¨\85à¨\9cਿਹਾ à¨\95à©\8bà¨\88 IP à¨ªà¨¤à¨¾ à¨\95à¨\88 à¨µà¨°à¨¤à¨£ à¨µà¨¾à¨²à¨¿à¨\86à¨\82 à¨µà©±à¨²à©\8bà¨\82 à¨¸à¨¾à¨\82à¨\9dਾ à¨\95à©\80ਤਾ à¨\9cਾ à¨¸à¨\95ਦਾ à¨¹à©\88।\nà¨\9cà©\87 à¨¤à©\81ਸà©\80à¨\82 à¨\87ੱà¨\95 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰ à¨¹à©\8b à¨\85ਤà©\87 à¨¸à¨®à¨\9dਦà©\87 à¨¹à©\8b à¨\95ਿ à¨¤à©\81ਹਾਡà©\87 à¨²à¨\88 à¨¬à©\87ਮਤਲਬ à¨\9fਿੱਪਣà©\80à¨\86à¨\82 à¨¹à©\8b à¨°à¨¹à©\80à¨\86à¨\82 à¨¹à¨¨ à¨¤à¨¾à¨\82 à¨®à¨¿à¨¹à¨°à¨¬à¨¾à¨¨à©\80 à¨\95ਰà¨\95à©\87 à¨¹à©\8bਰਾà¨\82 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰਾà¨\82 à¨¨à¨¾à¨² à¨ªà©\88ਦਾ à¨¹à©\8bਣ à¨µà¨¾à¨²à¨¼à©\80 à¨\89ਲà¨\9dਣ à¨¤à©\8bà¨\82 à¨¬à¨\9aਣ à¨²à¨\88 [[Special:CreateAccount|à¨\96ਾਤਾ à¨¬à¨£à¨¾à¨\89]] ਜਾਂ [[Special:UserLogin|ਲਾਗਇਨ ਕਰੋ]]।''",
        "noarticletext": "ਫ਼ਿਲਹਾਲ ਇਸ ਸਫ਼ੇ ’ਤੇ ਕੋਈ ਲਿਖਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਦੂਜੇ ਸਫ਼ਿਆਂ ’ਤੇ [[Special:Search/{{PAGENAME}}|ਇਸ ਸਿਰਲੇਖ ਦੀ ਖੋਜ]] ਕਰ ਸਕਦੇ ਹੋ, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ਸਬੰਧਤ ਚਿੱਠੇ ਲੱਭ] ਸਕਦੇ ਹੋ ਜਾਂ ਇਸ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਸਫ਼ੇ ਵਿਚ ਲਿਖ] ਸਕਦੇ ਹੋ</span>।",
        "noarticletext-nopermission": "ਫ਼ਿਲਹਾਲ ਇਸ ਪੰਨੇ ’ਤੇ ਕੋਈ ਲਿਖਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਦੂਸਰੇ ਪੰਨਿਆਂ ’ਤੇ [[Special:Search/{{PAGENAME}}|ਇਸ ਸਿਰਲੇਖ ਦੀ ਖੋਜ]] ਕਰ ਸਕਦੇ ਹੋ, ਸਬੰਧਤ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ਚਿੱਠੇ] ਖੋਜ ਸਕਦੇ ਹੋ ਜਾਂ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਪੰਨੇ ਵਿੱਚ ਲਿਖ] ਸਕਦੇ ਹੋ।</span>",
        "userpage-userdoesnotexist": "ਵਰਤੋਂਕਾਰ ਖਾਤਾ \"$1\" ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ।\nਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਣਾਉਣਾ/ਸੋਧਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਮਿਰਬਾਨੀ ਕਰਕੇ ਜਾਂਚ ਕਰ ਲਓ।",
        "confirm-watch-top": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਜੋੜਨਾ ਹੈ?",
        "confirm-unwatch-button": "ਠੀਕ ਹੈ",
        "confirm-unwatch-top": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਤੋਂ ਹਟਾਉਣਾ ਹੈ?",
+       "confirm-rollback-button": "ਠੀਕ ਹੈ",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← ਪਿਛਲਾ ਸਫ਼ਾ",
        "imgmultipagenext": "ਅਗਲਾ ਸਫ਼ਾ →",
        "special-characters-group-khmer": "ਖ਼ਮੇਰ",
        "special-characters-title-endash": "ਅੰਗਰੇਜ਼ੀ ਡੈਸ਼",
        "special-characters-title-emdash": "em ਡੈਸ਼",
-       "special-characters-title-minus": "ਘਟਾਓ ਦਾ ਨਿਸ਼ਾਨ"
+       "special-characters-title-minus": "ਘਟਾਓ ਦਾ ਨਿਸ਼ਾਨ",
+       "authmanager-password-help": "ਪ੍ਰਮਾਣਿਕਤਾ ਲਈ ਪਛਾਣ-ਸ਼ਬਦ।",
+       "authmanager-email-label": "ਈਮੇਲ",
+       "authmanager-email-help": "ਈਮੇਲ ਪਤਾ",
+       "authmanager-realname-label": "ਅਸਲੀ ਨਾਂ",
+       "authprovider-resetpass-skip-label": "ਛੱਡ ਦਿਉ",
+       "specialpage-securitylevel-not-allowed-title": "ਇਜਾਜ਼ਤ ਨਹੀਂ",
+       "cannotauth-not-allowed-title": "ਪ੍ਰਵਾਨਗੀ ਨਹੀਂ ਮਿਲੀ",
+       "changecredentials-submit-cancel": "ਰੱਦ ਕਰੋ",
+       "removecredentials-submit-cancel": "ਰੱਦ ਕਰੋ",
+       "credentialsform-account": "ਖਾਤੇ ਦਾ ਨਾਂ:"
 }
index e1c45bf..8bc9c54 100644 (file)
        "gender-female": "kobieta",
        "prefs-help-gender": "Podanie płci nie jest obowiązkowe. Jeśli zdecydujesz się ją określić, oprogramowanie dostosuje do niej interfejs. Informacja o Twojej płci będzie widoczna dla wszystkich.",
        "email": "E‐mail",
-       "prefs-help-realname": "Imię i nazwisko jest opcjonalne.\nJeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje autorstwo.",
+       "prefs-help-realname": "Imię i nazwisko jest opcjonalne.\nJeśli zdecydujesz się je podać, zostaną użyte, by udokumentować twoje autorstwo.",
        "prefs-help-email": "Podanie adresu e‐mail nie jest obowiązkowe, lecz jest konieczne do zresetowania zapomnianego hasła.",
        "prefs-help-email-others": "Możesz również umożliwić innym użytkownikom wysłanie do Ciebie e‐maila poprzez Twoją stronę użytkownika lub stronę dyskusji (bez ujawniania Twojego adresu).",
        "prefs-help-email-required": "Wymagany jest adres e‐mail.",
        "specialpage-securitylevel-not-allowed": "Niestety, nie możesz korzystać z tej strony, ponieważ twoja tożsamość nie może zostać zweryfikowana.",
        "authpage-cannot-login-continue": "Nie można kontynuować logowania. Sesja najprawdopodobniej wygasła.",
        "cannotauth-not-allowed-title": "Brak dostępu",
+       "changecredentials-submit": "Zmień poświadczenia",
        "changecredentials-submit-cancel": "Anuluj",
-       "removecredentials-submit": "Usuń",
+       "removecredentials-submit": "Usuń poświadczenia",
        "removecredentials-submit-cancel": "Anuluj",
        "credentialsform-account": "Nazwa konta:"
 }
index f58bee7..3d32f5b 100644 (file)
        "newarticle": "(Neuv)",
        "newarticletext": "A l'é andaje dapress a na liura a na pàgina che a esist ancor nen.\nPër creé la pàgina, ch'a ancamin-a a scrive ant lë spassi sì-sota (vëdde la [$1 pàgina d'agiut] për savèjne ëd pì).\nS'a l'é rivà sì për eror, ch'a sgnaca ël boton '''andaré''' ëd sò navigador.",
        "anontalkpagetext": "----\n<em>Costa a l'é la pàgina ëd ciaciarade për n'utent anònim che a l'é ancó pa duvertasse un cont, ò pura che a lo deuvra nen.</em>\nAlora i l'oma da dovré ël nùmer d'adrëssa IP për deje n'identificassion a chiel o chila.\nN'adrëssa IP përparèj a peul esse partagià da vàire utent.\nSe chiel a l'é n'utent anònim e a l'ha l'impression d'arsèive dij coment sensa sust, për piasì [[Special:CreateAccount|ch'a crea un cont]] o [[Special:UserLogin|ch'a rintra ant ël sistema]] për evité dë fé confusion con d'àutri utent anònim.''",
-       "noarticletext": "Al moment costa pàgina a l'é veuida.\nA peul [[Special:Search/{{PAGENAME}}|sërché cost tìtol]] andrinta a d'àutre pàgine, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],\no purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} creé sta pàgina]</span>.",
+       "noarticletext": "Al moment costa pàgina a l'é veuida.\nA peul [[Special:Search/{{PAGENAME}}|sërché cost tìtol]] andrinta a d'àutre pàgine, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],\no bin [{{fullurl:{{FULLPAGENAME}}|action=edit}} creé sta pàgina]</span>.",
        "noarticletext-nopermission": "Al moment a-i é gnun test ansima a costa pàgina.\nA peul [[Special:Search/{{PAGENAME}}|sërché ës tìtol ëd pàgina]] an d'àutre pàgine,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant j'argistr colegà]</span>, ma a l'ha pa ël përmess ëd creé costa pàgina.",
        "missing-revision": "La revision nùmer $1 dla pàgina antitolà «{{FULLPAGENAME}}» a esist pa.\n\nSòn a l'é normalment causà da l'andèje dapress a na vej liura stòrica a na pàgina ch'a l'é stàita scancelà. Ij detaj a peulo esse trovà ant ël [registr ëd jë scancelament ëd {{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
        "userpage-userdoesnotexist": "Lë stranòm «<nowiki>$1</nowiki>» a l'é pa registrà. Për piasì ch'a varda se da bon a veul creé o modifiché costa pàgina.",
index d2053db..9479ec8 100644 (file)
        "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}",
        "rollbacklinkcount-morethan": "reverter mais do que $1 {{PLURAL:$1|edição|edições}}",
        "rollbackfailed": "A reversão falhou",
+       "rollback-missingparam": "Faltam parâmetros obrigatórios no pedido.",
        "cantrollback": "Não foi possível reverter a edição; o último contribuidor é o único autor desta página",
        "alreadyrolled": "Não foi possível reverter as edições de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discussão]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nalguém editou ou já reverteu a página.\n\nA última edição foi de [[User:$3|$3]] ([[User talk:$3|discussão]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "O resumo da edição era: <em$1</em>.",
        "revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]",
        "revertpage-nouser": "Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
+       "rollback-success-notify": "Foram revertidas as edições de $1 para a última revisão de $2. [$3 Mostrar alterações]",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
        "changecontentmodel": "Editar o modelo de conteúdo de uma página",
        "confirm-watch-top": "Adicionar esta página à lista de páginas vigiadas?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Remover esta página da lista de páginas vigiadas?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Reverter as edições desta página?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← página anterior",
        "imgmultipagenext": "página seguinte →",
index 069b685..e2a4f8b 100644 (file)
        "revertpage": "Parameters:\n* $1 - username 1\n* $2 - username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from\nSee also:\n* {{msg-mw|Revertpage-nouser}}\n{{Identical|Revert}}",
        "revertpage-nouser": "This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.\n\nIn other cases the message {{msg-mw|Revertpage}} is used.\n\nParameters:\n* $1 - username 1, can be used for GENDER\n* $2 - (Optional) username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from",
        "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.\n{{Identical|Revert}}\n{{Identical|Rollback}}",
-       "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n*{{mw-msg|showdiff}}\n{{Identical|rollback-success}}\n{{Format|jquerymsg}}",
+       "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{Identical|rollback-success}}\n{{Format|jquerymsg}}",
        "sessionfailure-title": "Used as title of the error message {{msg-mw|Sessionfailure}}.",
        "sessionfailure": "Used as error message.\n\nThe title for this error message is {{msg-mw|Sessionfailure-title}}.",
        "changecontentmodel": "Title of the change content model special page",
        "tooltip-ca-nstab-category": "Tooltip shown when hovering over the {{msg-mw|Nstab-category}} tab.\n\nSee also:\n* {{msg-mw|Nstab-category}}\n* {{msg-mw|Accesskey-ca-nstab-category}}\n* {{msg-mw|Tooltip-ca-nstab-category}}",
        "tooltip-minoredit": "Tooltip shown when hovering over the \"{{msg-mw|Minoredit}}\" link below the edit form.\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "tooltip-save": "This is the text that appears when you hover the mouse over {{msg-mw|Savearticle}} button on the edit page.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}",
-       "tooltip-publish": "This is the text that appears when you hover the mouse over {{msg-mw|publishpage}} button on the edit page.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|publishpage}}\n* {{msg-mw|Accesskey-publish}}\n{{Identical|Publish page}}",
+       "tooltip-publish": "This is the text that appears when you hover the mouse over {{msg-mw|publishpage}} button on the edit page.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|publishpage}}\n* {{msg-mw|Accesskey-publish}}",
        "tooltip-preview": "Tooltip shown when hovering over {{msg-mw|Showpreview}} button.\n\nIf the length of the translated message is over 60 characters (including spaces) then the end of the message will be cut off when using Firefox 2.0.0.7 browser, Linux operating system and the Monobook skin.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}",
        "tooltip-diff": "This is the text (tooltip) that appears when you hover the mouse over {{msg-mw|Showdiff}} button on the edit page.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}",
        "tooltip-compareselectedversions": "Tooltip of {{msg-mw|Compareselectedversions}} (which is used as button in history pages).\n\nSee also:\n* {{msg-mw|Compareselectedversions}}\n* {{msg-mw|Accesskey-compareselectedversions}}\n* {{msg-mw|Tooltip-compareselectedversions}}",
        "cannotauth-not-allowed-title": "Title of the error page shown when the user tries to use an authentication-related page they should not have access to.",
        "cannotauth-not-allowed": "Text of the error page shown when the user tries t use an authentication-related page they should not have access to.",
        "changecredentials": "Title of the special page [[Special:ChangeCredentials]] which allows changing authentication credentials (such as the password).",
-       "changecredentials-submit": "Used on [[Special:ChangeCredentials]].\n{{Identical|Change}}",
+       "changecredentials-submit": "Used on [[Special:ChangeCredentials]].",
        "changecredentials-submit-cancel": "Used on [[Special:ChangeCredentials]].\n{{Identical|Cancel}}",
        "changecredentials-invalidsubpage": "Error message shown when using [[Special:ChangeCredentials]] with an invalid type.\n\nParameters:\n* $1 - subpage name.",
        "changecredentials-success": "Success message after using [[Special:ChangeCredentials]].",
        "removecredentials": "Title of the special page [[Special:RemoveCredentials]] which allows removing authentication credentials (such as a two-factor token).",
-       "removecredentials-submit": "Used on [[Special:RemoveCredentials]].\n{{Identical|Remove}}",
+       "removecredentials-submit": "Used on [[Special:RemoveCredentials]].",
        "removecredentials-submit-cancel": "Used on [[Special:RemoveCredentials]].\n{{Identical|Cancel}}",
        "removecredentials-invalidsubpage": "Error message shown when using [[Special:RemoveCredentials]] with an invalid type.\n\nParameters:\n* $1 - subpage name.",
        "removecredentials-success": "Success message after using [[Special:RemoveCredentials]].",
index 07166e6..936e6ac 100644 (file)
        "lockdbsuccesstext": "Baza de date a fost blocată.<br />\nNu uitați să o [[Special:UnlockDB|deblocați]] la terminarea operațiilor administrative.",
        "unlockdbsuccesstext": "Baza de date a fost deblocată.",
        "lockfilenotwritable": "Fișierul bazei de date închise nu poate fi scris.\nPentru a închide sau deschide baza de date, acesta trebuie să poată fi scris de serverul web.",
+       "databaselocked": "Baza de date este deja blocată.",
        "databasenotlocked": "Baza de date nu este blocată.",
        "lockedbyandtime": "(de $1, pe $2, la $3 )",
        "move-page": "Redenumire $1",
index 74e3dd9..ce6805e 100644 (file)
@@ -74,7 +74,7 @@
        "tog-ccmeonemails": "Пошаљи ми копије имејлова које пошаљем другим корисницима",
        "tog-diffonly": "Не приказуј садржај странице испод разлика",
        "tog-showhiddencats": "Прикажи скривене категорије",
-       "tog-norollbackdiff": "Ð\98зоÑ\81Ñ\82ави разлику након извршеног враћања",
+       "tog-norollbackdiff": "Ð\9dе Ð¿Ñ\80иказÑ\83Ñ\98 разлику након извршеног враћања",
        "tog-useeditwarning": "Упозори ме када напуштам страницу са несачуваним променама",
        "tog-prefershttps": "Увек користи сигурну конекцију када сам пријављен.",
        "underline-always": "увек подвлачи",
        "category_header": "Странице у категорији „$1“",
        "subcategories": "Поткатегорије",
        "category-media-header": "Датотеке у категорији „$1“",
-       "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ова категорија тренутно не садржи странице или датотеке.''</div>",
+       "category-empty": "<em>Ова категорија тренутно не садржи странице или датотеке.</em>",
        "hidden-categories": "{{PLURAL:$1|Сакривена категорија|Сакривене категорије}}",
        "hidden-category-category": "Скривене категорије",
        "category-subcat-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|1=следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}",
        "newwindow": "(отвара се у новом прозору)",
        "cancel": "Откажи",
        "moredotdotdot": "Више…",
-       "morenotlisted": "Ова листа није комплетна.",
+       "morenotlisted": "Овај списак није комплетан.",
        "mypage": "Страница",
        "mytalk": "Разговор",
        "anontalk": "Разговор",
        "accmailtext": "Лозинка за {{GENDER:$1|корисника|корисницу}} [[User talk:$1|$1]] је послата на $2. Након пријаве, лозинка се може променити [[Special:ChangePassword|овде]].",
        "newarticle": "(нови)",
        "newarticletext": "Дошли сте на страницу која још не постоји.\nДа бисте је направили, почните да куцате у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
-       "anontalkpagetext": "---- Ово је страница за разговор с анонимним корисником који још нема налог или га не користи.\nЗбог тога морамо да користимо бројчану ИП адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:CreateAccount|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.",
+       "anontalkpagetext": "----\n<em>Ово је страница за разговор с анонимним корисником који још нема налог или га не користи.</em>\nЗбог тога морамо да користимо бројчану ИП адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:CreateAccount|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.",
        "noarticletext": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} направити ову страницу]</span>.",
        "noarticletext-nopermission": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама или <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне дневнике]</span>, али немате дозволу да направите ову страницу.",
        "missing-revision": "Не могу да пронађем измену бр. $1 на страници под називом „{{FULLPAGENAME}}“.\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
        "right-override-export-depth": "извоз страница укључујући и повазене странице до дубине од пет веза",
        "right-sendemail": "слање имејла другим корисницима",
        "right-passwordreset": "прегледање порука за обнављање лозинке",
-       "right-managechangetags": "прављење и/или брисање [[Special:Tags|ознака]] из базе података",
+       "right-managechangetags": "прављење и (де)активирање [[Special:Tags|ознака]]",
        "right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије измене",
        "right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним изменама и уносима у дневницима",
        "grant-group-page-interaction": "Уређивање страница",
        "action-viewmyprivateinfo": "прегледање ваших личних података",
        "action-editmyprivateinfo": "уређивање ваших личних података",
        "action-editcontentmodel": "мењање модела садржаја странице",
-       "action-managechangetags": "прављење и/или брисање ознака из базе података",
+       "action-managechangetags": "прављење и (де)активирање ознака",
        "action-applychangetags": "додавање ознака на ваше измене",
        "action-changetags": "додавање и уклањање разних ознака на појединачним изменама и уносима у дневницима",
        "nchanges": "$1 {{PLURAL:$1|измена|измене|измена}}",
        "import-nonewrevisions": "Измене нису увезене (све су већ биле или присутне или прескочене због грешки).",
        "xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5",
        "import-upload": "Отпремање XML података",
-       "import-token-mismatch": "Губитак података о сесији.\nПокушајте поново.",
+       "import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени.\n<strong>Молимо Вас проверите да ли сте још увек пријављени и покушајте поново<strong>.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли Ваш веб-пртраживач дозвољава колачиће са овог сајта.",
        "import-invalid-interwiki": "Не могу да увозим с наведеног викија.",
        "import-error-edit": "Страница „$1“ није увезена јер вам није дозвољено да је уређујете.",
        "import-error-create": "Страница „$1“ није увезена јер вам није дозвољено да је направите.",
index fced0d0..132dcac 100644 (file)
        "right-override-export-depth": "izvoz stranica uključujući i povazene stranice do dubine od pet veza",
        "right-sendemail": "slanje e-poruka drugim korisnicima",
        "right-passwordreset": "pregledanje poruka za obnavljanje lozinke",
-       "right-managechangetags": "pravljenje i/ili brisanje [[Special:Tags|oznaka]] iz baze podataka",
+       "right-managechangetags": "pravljenje i (de)aktiviranje [[Special:Tags|oznaka]]",
        "grant-group-page-interaction": "Uređivanje stranica",
        "grant-group-file-interaction": "Uređivanje datoteka",
        "grant-group-watchlist-interaction": "Uređivanje vašeg spiska nadgledanja",
index 828ca49..78c343d 100644 (file)
        "passwordreset-emailerror-capture": "En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till {{GENDER:$2|användaren}}: $1",
        "passwordreset-emailsent-capture2": "{{PLURAL:$1|E-postmeddelande|E-postmeddelanden}} för återställning av lösenord har skickats. {{PLURAL:$1|Användarnamnet och lösenordet|Listan över användarnamn och lösenord}} visas nedan.",
        "passwordreset-emailerror-capture2": "Kunde inte skicka e-post till {{GENDER:$2|användaren}}: $1 {{PLURAL:$3|Användarnamnet och lösenordet|Listan över användarnamn och lösenord}} listas nedan.",
+       "passwordreset-nocaller": "En användare måste anges",
+       "passwordreset-nosuchcaller": "Användare finns inte: $1",
        "passwordreset-ignored": "Lösenordsåterställningen hanterades inte. Kanske ingen leverantör har konfigurerats?",
        "passwordreset-invalideamil": "Ogiltig e-postadress",
        "passwordreset-nodata": "Varken ett användarnamn eller en e-postadress angavs",
        "cannotauth-not-allowed-title": "Tillgång nekad",
        "cannotauth-not-allowed": "Du har inte behörighet att använda denna sida",
        "changecredentials": "Ändra inloggningsuppgifter",
-       "changecredentials-submit": "Ändra",
+       "changecredentials-submit": "Ändra inloggningsuppgifter",
        "changecredentials-submit-cancel": "Avbryt",
        "changecredentials-invalidsubpage": "$1 är inte en giltig typ av inloggningsuppgift.",
        "changecredentials-success": "Dina inloggningsuppgifter har ändrats.",
        "removecredentials": "Ta bort inloggningsuppgifter",
-       "removecredentials-submit": "Ta bort",
+       "removecredentials-submit": "Ta bort inloggningsuppgifter",
        "removecredentials-submit-cancel": "Avbryt",
        "removecredentials-invalidsubpage": "$1 är inte en giltig typ av inloggningsuppgift.",
        "removecredentials-success": "Dina inloggningsuppgifter har tagits bort.",
index 1308537..8ca8832 100644 (file)
                        "Maathavan",
                        "தமிழ்க்குரிசில்",
                        "Nemo bis",
-                       "JAaron95"
+                       "JAaron95",
+                       "Info-farmer"
                ]
        },
-       "tog-underline": "à®\87ணà¯\88பà¯\8dபà¯\81à®\95ளà¯\81à®\95à¯\8dà®\95à¯\81 à®\85à®\9fிà®\95à¯\8dà®\95à¯\8bà®\9fிà®\9fà¯\81",
+       "tog-underline": "à®\85à®\9fிà®\95à¯\8dà®\95à¯\8bà®\9fிà®\9fà¯\8dà®\9fதà¯\8dதà¯\88 à®\87ணà¯\88:",
        "tog-hideminor": "அண்மைய மாற்றங்களில் சிறிய தொகுப்புகளை மறை",
        "tog-hidepatrolled": "அண்மைய மாற்றங்களில் ரோந்திட்ட தொகுப்புகளை மறைக்கவும்",
        "tog-newpageshidepatrolled": "பலமுறை பார்வையிட்ட பக்கங்களைப் புதியபக்கங்களின் பட்டியலில் காட்டவேண்டாம்.",
index 6450ba1..015cf04 100644 (file)
        "expand_templates_remove_comments": "Ҳазфи тавзеҳот",
        "expand_templates_generate_xml": "Намоиши дарахти таҷзеҳи XML",
        "expand_templates_preview": "Пешнамоиш",
-       "randomrootpage": "Саҳифаи решавии тасодуфӣ"
+       "randomrootpage": "Саҳифаи решавии тасодуфӣ",
+       "changecredentials-submit": "Тағйири ҳисоби корбарӣ",
+       "removecredentials-submit": "Хориҷи эътиборнома"
 }
index b3bc4dc..6a78e81 100644 (file)
        "actions": "Һәрәкәтон",
        "namespaces": "Номон мәконон",
        "variants": "Вариантон",
+       "navigation-heading": "Naviqasiyə menü",
        "errorpagetitle": "Сәһв",
        "returnto": "Бә сәһифә огәрдеј $1.",
        "tagline": "Материал че {{SITENAME}}",
        "unprotectthispage": "Ын сәһифә мыдофијә дәгиш кардеј",
        "newpage": "Тожә сәһифә",
        "talkpage": "Ым сәһифә мызокирә кардеј",
-       "talkpagelinktext": "Mızokirə",
+       "talkpagelinktext": "Müzakirə",
        "specialpage": "Хысусијә сәһифә",
        "personaltools": "Шәхси диләгон",
        "articlepage": "Мәғолә дијә кардеј",
        "talk": "Mızokirə",
        "views": "Тәмшо кардеј",
-       "toolbox": "Диләгон",
+       "toolbox": "Diləqon",
        "userpage": "Иштирокәкә сәһифә дијә кардеј",
        "projectpage": "Нәхши сәһифә дијә кардеј",
        "imagepage": "Фајли сәһифә дијә кардеј",
        "copyrightpage": "{{ns:project}}:Мыәллифә һуғуғ",
        "currentevents": "Есәтнә һодисон",
        "currentevents-url": "Project: Есәтнә һодисон",
-       "disclaimers": "Çe məsuliyyətiku imtino.",
+       "disclaimers": "Çı məsuliyyətiku imtina",
        "disclaimerpage": "Project:Дејни бә гиј ныгәтеј",
        "edithelp": "Арајиш бо редактә кардеј",
-       "mainpage": "Əsosə səhifə",
+       "mainpage": "Sərlohə",
        "mainpage-description": "Әсосә сәһифә",
        "policy-url": "Project:Ғајдон",
        "portal": "Ҹәмјәт",
        "nstab-image": "Фајл",
        "nstab-template": "Ғәлиб",
        "nstab-category": "Тиспир",
+       "mainpage-nstab": "Sərlohə",
        "error": "Сәһв",
        "readonly": "Бә база нывыште блок быә.",
        "missing-article": "База мәлумотон дыләдә бә ахтар кардә быә саһифон «$1» $2 барәдә мәлумот пәјдо карде ныбе.\nЖыго вәзијјәт бе бәзне бә вахтики, ым сәһифә че рәдд кардә быә сәһифә канә рәвојәте.\nГирәм ым жыго ни, жәгәдә шымә програм тәминатијәдә сәһв пәјдо кардәјоне.\nХаһиш кардәмон че сәһифә URL-и бә [[Special:ListUsers/sysop|администратори]] бывғандәнән.",
        "createaccountreason": "Сәбәб:",
        "mailmypassword": "Нујә парол вығандеј бә Е-номә.",
        "loginlanguagelabel": "Зывон: $1",
+       "pt-login": "Dəşi",
+       "pt-createaccount": "Qeydiyyat",
        "changepassword": "Пароли дәгиш кардеј",
        "resetpass_header": "Иштирокәкә пароли дәгиш карде",
        "oldpassword": "Канә парол:",
        "preview": "Сыфтәнә нишо дој",
        "showpreview": "Сыфтәнә нишо дој",
        "showdiff": "Дәғандә быә дәгишон",
-       "anoneditwarning": "'''Дығғәт.''' Шымә ыштәни едәштәнијоне системәдә.\nШымә IP-унвон бә ым сәһифә дәгишон тарых ғејд бәбе.",
+       "anoneditwarning": "<strong>Diqqət:</strong> Şımə bə sistem dəşənin. Berdəm şımə qıli sərost bıkon çı şımə lP-ünvani harkəs bəvinde. Berdəm <strong>[$1 daxil bıbu]</strong> jaanki <strong>[$2 hesob okə]</strong>, \nşımə sərostəti bə şımə nom nıvışte bəbe, imən bə şımə co üstünlükon bədoe",
        "loginreqlink": "ыштәни едаштеј",
        "newarticle": "(Нујә)",
        "newarticletext": "Шымә давардијон де сәбони бә сәһифә, әмма жыго сәһифә ни.\nБо сәһифә офәјеј мәтн бынывыштән жиннә пенҹәдә (мыффәссәл дијә быкән [$1 араијшә сәһифә]).\nГирәм шымә ијо де сәһви бешијон, һиччекәни ыштә браузери \"думо\" егәтән.",
-       "noarticletext": "Есәт бы сәһифәдә мәтн ни.\nШымә бәзынешон [[Special:Search/{{PAGENAME}}|пәјдо кардеј конҹо ым ном һесте]] бә ҹо мәғолонәдә,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналон ујғунә нывыштәјон пәјдо кардеј],\nјаанки '''[{{fullurl:{{FULLPAGENAME}}|action=edit}}де жыго номи сәһифә офәјеј ]'''</span>.",
+       "noarticletext": "Isə bı səhəfədə mətn ni.\nŞımə bəzneyon [[Special:Search/{{PAGENAME}}|peydo kardey konco im nom hıste] bə co səhəfədə,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} bə jurnalon uyğunə nıvıştəyon pedo kardey],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
        "noarticletext-nopermission": "Есәт бы сәһифәдә мәтн ни. \nШымә бәзынејон [[Special:Search/{{PAGENAME}}|пәјдо кардеј конҹо ым ном һесте]] бә ҹо мәғолонәдә,\nјаанки <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналон ујғунә нывыштәјон пәјдо кардеј].</span>, интаси шымәку изн ни ым сәһифә офәје.",
        "previewnote": "'''Јодәдә огәтән ки ым һәлә сыфтәнә нишо доје.'''\nШымә дәгишон һәлә огәтә быәнин!",
        "editing": "Редәктә кардеј $1",
        "viewpagelogs": "Бо ым сәһифә журналон нишо дој",
        "currentrev-asof": "Есәтнә рәвојәт бә $1",
        "revisionasof": "Рәвојәт $1",
-       "revision-info": "Рәвојәти мәлумот: $1; $2",
+       "revision-info": "Çı $7 $1 tarixədə kardə sərostəti",
        "previousrevision": "← Навынәни",
        "nextrevision": "Думотоно шә →",
        "currentrevisionlink": "Есәтнә рәвојәт",
        "shown-title": "Нишо дој $1 {{PLURAL:$1|нывыштәј|нывыштәјон}} сәһифәдә",
        "viewprevnext": "Дијә кардеј ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Бы вики-нәхшәдә һесте сәһифә «[[:$1]]»'''",
-       "searchmenu-new": "'''Сәһифә офәјеј «[[:$1]]» бә ым вики-нахшәдә!'''",
+       "searchmenu-new": "<strong> im vikiədə \"[[:$1]]\" səhifə okəy!</strong> {{PLURAL:$2|0=|Həmçinin bə nəve nəticədə peydo bıə səhifon dekə.| Bə nəve nəticədə peydo bıə nəticon dekə.}}",
        "searchprofile-articles": "Әсосә сәһифон",
        "searchprofile-images": "Мултимедијә",
        "searchprofile-everything": "Һар вырәдә",
        "rclistfrom": "$3 $2 вахтику дәгишон нишо быдә",
        "rcshowhideminor": "$1 гәдәлијә дәгишон",
        "rcshowhidebots": "$1 ботон",
-       "rcshowhideliu": "$1 ыштәни едаштә иштирокәкон",
+       "rcshowhideliu": "$1 qeyd bıə iştirakəkon",
        "rcshowhideanons": "$1 әнәномә иштирокәкон",
        "rcshowhidepatr": "$1 осә кардә быә дәгишон",
        "rcshowhidemine": "$1 ыштә дәгишон",
        "filedelete-comment": "Сәбәб:",
        "filedelete-submit": "Рәдд кардеј",
        "randompage": "Рајрастә мәғолә",
+       "randomincategory-submit": "Давард",
        "statistics": "Статистика",
        "nbytes": "$1 {{PLURAL:$1|бајт|бајтон}}",
        "nmembers": "$1 {{PLURAL:$1|узв|узвон}}",
        "whatlinkshere-prev": "{{PLURAL:$1|навынәни|навынәни $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|думотоно шә|думотоно шә $1}}",
        "whatlinkshere-links": "← сәбонон",
-       "whatlinkshere-hideredirs": "$1 бә тожә унвон вығандеј",
-       "whatlinkshere-hidetrans": "$1 әловон",
-       "whatlinkshere-hidelinks": "$1 сәбонон",
+       "whatlinkshere-hideredirs": "$1 bə tojə ünvan vığande",
+       "whatlinkshere-hidetrans": "$1 əlavon",
+       "whatlinkshere-hidelinks": "$1 səbonon",
        "whatlinkshere-hideimages": "$1 фајлинә сәбонон",
        "whatlinkshere-filters": "Филтрон",
        "ipbreason": "Сәбәб:",
        "allmessages-filter-submit": "Давард",
        "thumbnail-more": "Һејве кардеј",
        "thumbnail_error": "Гәдә шикили туму кардејәдә сәһв: $1",
-       "tooltip-pt-userpage": "ШÑ\8bмÓ\99 Ð¸Ñ\88Ñ\82иÑ\80окÓ\99кÓ\99 Ñ\81Ó\99һиÑ\84Ó\99",
-       "tooltip-pt-mytalk": "ШÑ\8bмÓ\99 Ð¼Ñ\8bзокиÑ\80он Ñ\81Ó\99һиÑ\84Ó\99",
-       "tooltip-pt-preferences": "Шымә кукон",
+       "tooltip-pt-userpage": "Å\9eımÉ\99 sÉ\99hifÉ\99",
+       "tooltip-pt-mytalk": "Å\9eımÉ\99 müzakirÉ\99 sÉ\99hifÉ\99",
+       "tooltip-pt-preferences": "Şımə nizamon",
        "tooltip-pt-watchlist": "Сәһифон сијоһи, конҹо шымә де дығғәти дијә кардејдәјон бә дәгишон",
-       "tooltip-pt-mycontris": "Шымә гәнҹон сијоһи",
+       "tooltip-pt-mycontris": "Şımə səroston siyahi",
        "tooltip-pt-login": "Ијо бәбе ыштәни ғејд кардовнијеј системәдә, интаси ым һукман ни",
        "tooltip-pt-logout": "Системәдә кој орохнијеј",
+       "tooltip-pt-createaccount": "Təklif kardəmon, boştə tojə səhifə okənən və bə sistem dıştə nomi dəşənən, hərçənd ım mütləq ni",
        "tooltip-ca-talk": "Сәһифә мығдори бәрәдә мызокирә",
-       "tooltip-ca-edit": "Ым сәһифә бәбе дагиш кардеј. Быһамијән, огәтеј бә нав, \"сыфтәнә нишо дој\" истифодә быкән",
+       "tooltip-ca-edit": "İm səhifə sərost karde",
        "tooltip-ca-addsection": "Нујә ғысм офәјеј",
        "tooltip-ca-viewsource": "Ым сәһифә мыдофијә быә дагиш кардеку, әммә шымә бәзынешон дијә кардеј ијән сурәт бекардеј әчәј бешемонә мәтни",
        "tooltip-ca-history": "Сәһифә дәгишон журнал",
        "tooltip-t-whatlinkshere": "Бә ым сәһифә сәбон вардә һәммәј вики сәһифон сијоһи",
        "tooltip-t-recentchangeslinked": "Охонә дәгишон сәһифонәдә, бә ком сәһифон сәбон вардә ым сәһифә",
        "tooltip-feed-atom": "Транслјасијә кардеј бә Atom бо ым сәһифә",
-       "tooltip-t-contributions": "Че иштирок кардәкәси дагиш кардә быә сәһифон сијоһи",
+       "tooltip-t-contributions": "Çı iştirak kardəkəsi dəgiş kardə səhifon siyohi",
        "tooltip-t-emailuser": "Бы иштироәкә номә вығәнде",
        "tooltip-t-upload": "Шикилон јаанки мултимедијә фајлон бо жај",
        "tooltip-t-specialpages": "Xıdmətə səhifon siyohi",
        "tooltip-ca-nstab-main": "Мәғолә мығдор",
        "tooltip-ca-nstab-user": "Иштирок кардәкәси сәһифә",
        "tooltip-ca-nstab-media": "Медиа-фајл",
-       "tooltip-ca-nstab-special": "Ым хыдмәтә сәһифәје бычыми горә дәгиш кардеј әбыни",
+       "tooltip-ca-nstab-special": "İm xidmətə səhifəye bəçi qorşo sərost karde əbıni",
        "tooltip-ca-nstab-project": "Нәхши сәһифә",
        "tooltip-ca-nstab-image": "Фајли сәһифә",
        "tooltip-ca-nstab-template": "Ғәлиби сәһифә",
        "tooltip-summary": "Кыртә тәсвир бынывыштән",
        "pageinfo-header-edits": "Дәгиш кардә быә чијон тарых",
        "pageinfo-redirects-value": "$1",
+       "pageinfo-toolboxlink": "Səhifə həxədə məlumaton",
        "previousdiff": "← Навынәни дәгиши",
        "nextdiff": "Думотоно шә дәгиши →",
        "file-info-size": "$1 × $2 пиксел, фајли памјә: $3, MIME тип: $4",
        "file-nohires": "Ән барзә рәвојәт ни.",
        "svg-long-desc": "SVG фајл, номинәләдә $1 × $2 пиксел, фајли памјә: $3",
-       "show-big-image": "Тикәјән јолә кејфијјәтинә шикил",
+       "show-big-image": "Çı fayli əsl",
+       "show-big-image-size": "$1 × $2 piksel",
        "ilsubmit": "Нәве",
        "bad_image_list": "Формат бәпе быбу жыго:\n\nБә һисоб сә быәбен әнҹәх сијоһи әсосон (де * рәмзи бино быә сәтырон).\nСәтыри иминә сәбон бәпе быбу сәбон бә ғәдәғән кардә быә бо дәғанде шикили.\nПешонә сәбонон бә һамонә сәтырәдә бәнә истино дијә кардә бәбен, јәни мәғолон, бә коврә шикил дахыл карде бәзне бе.",
        "metadata": "Метамәлумотон",
        "specialpages": "Хысусијә сәһифон",
        "external_image_whitelist": " #Ым сәтри огәтәнән чокнәј әв һесте<pre>\n#Рә рә истифадә быә фрагментон ијо быдәнән (ә һиссә, че // мијонәдә бедә )\n#Әвон ды харичи шикили URL и дуз бәбен.\n#Дуз омә гылә бәнә шикили нишо бәбе, амандәни бәнә шикили линк нишо бәбе.\n#Сәтрон де # комментариј һисоб бедән.\n#Сәтрон бә регистри һәссос нин.\n\n#Рә рә око доә быә фрагментон че сәтри пентоно ијо быдәнән. Ым сәтри огәтәнән чокнәј һесте.</pre>",
        "tag-filter": "[[Special:Tags|нышонон]] филтр:",
-       "tags-title": "Нышонон"
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Nişon|Nişonon}}]]: $2)",
+       "tags-title": "Нышонон",
+       "logentry-newusers-create": "$1 istifadəmon hesob okarde be",
+       "searchsuggest-search": "Nəve"
 }
index 65cae9d..0225abc 100644 (file)
@@ -77,7 +77,7 @@
        "tog-ccmeonemails": "Gửi bản sao cho tôi khi gửi thư điện tử cho người khác",
        "tog-diffonly": "Không hiển thị nội dung trang dưới phần so sánh phiên bản",
        "tog-showhiddencats": "Hiển thị thể loại ẩn",
-       "tog-norollbackdiff": "Không so sánh sau khi lùi sửa",
+       "tog-norollbackdiff": "Bỏ qua bản so sánh sau khi lùi sửa",
        "tog-useeditwarning": "Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang",
        "tog-prefershttps": "Luôn kết nối an toàn khi đăng nhập",
        "underline-always": "Luôn luôn",
        "password-change-forbidden": "Bạn không thể đổi mật khẩu trên wiki này.",
        "externaldberror": "Có lỗi khi xác nhận cơ sở dữ liệu bên ngoài hoặc bạn không được phép cập nhật tài khoản bên ngoài.",
        "login": "Đăng nhập",
+       "login-security": "Xác minh danh tính của bạn",
        "nav-login-createaccount": "Đăng nhập / Mở tài khoản",
        "userlogin": "Đăng nhập / Mở tài khoản",
        "userloginnocreate": "Đăng nhập",
        "userlogin-resetpassword-link": "Quên mật khẩu?",
        "userlogin-helplink2": "Trợ giúp đăng nhập",
        "userlogin-loggedin": "Bạn đã đăng nhập với tên {{GENDER:$1}}$1.\nHãy sử dụng biểu mẫu ở dưới để đăng nhập với tài khoản người dùng khác.",
+       "userlogin-reauth": "Bạn phải đăng nhập lại để xác minh rằng bạn là $1.",
        "userlogin-createanother": "Mở thêm tài khoản",
        "createacct-emailrequired": "Địa chỉ thư điện tử",
        "createacct-emailoptional": "Địa chỉ thư điện tử (tùy chọn)",
        "createacct-email-ph": "Nhập địa chỉ thư điện tử của bạn",
        "createacct-another-email-ph": "Nhập địa chỉ thư điện tử",
        "createaccountmail": "Sử dụng mật khẩu ngẫu nhiên tạm và gửi nó cho địa chỉ thư điện tử được chỉ định",
+       "createaccountmail-help": "Có thể sử dụng để tạo tài khoản cho người khác mà không được biết mật khẩu.",
        "createacct-realname": "Tên thật (tùy chọn)",
        "createaccountreason": "Lý do:",
        "createacct-reason": "Lý do",
        "createacct-reason-ph": "Nhập lý do tạo một tài khoản khác",
+       "createacct-reason-help": "Thông điệp xuất hiện trong nhật trình tạo tài khoản",
        "createacct-submit": "Tạo tài khoản",
        "createacct-another-submit": "Mở tài khoản",
+       "createacct-continue-submit": "Tiếp tục tạo tài khoản",
+       "createacct-another-continue-submit": "Tiếp tục tạo tài khoản",
        "createacct-benefit-heading": "{{SITENAME}} được xây dựng bởi những người như bạn.",
        "createacct-benefit-body1": "{{PLURAL:$1}}lần sửa đổi",
        "createacct-benefit-body2": "{{PLURAL:$1}}trang nội dung",
        "nocookiesnew": "Bạn đã tạo tài khoản thành công, nhưng bạn chưa đăng nhập. {{SITENAME}} sử dụng cookie để đăng nhập vào tài khoản. Bạn đã tắt cookie. Xin hãy bật cookie lên, rồi đăng nhập lại với tên người dùng và mật khẩu mới.",
        "nocookieslogin": "{{SITENAME}} sử dụng cookie để đăng nhập thành viên. Bạn đã tắt cookie. Xin hãy kích hoạt rồi thử lại.",
        "nocookiesfornew": "Không thể mở tài khoản vì không thể xác nhận nguồn yêu cầu nó.\nHãy chắc chắn bạn đã bật lên cookie, làm mới trang này, và thử lại.",
+       "createacct-loginerror": "Bạn đã tạo tài khoản thành công nhưng không thể tự động đăng nhập. Xin hãy [[Special:UserLogin|đăng nhập thủ công]].",
        "noname": "Chưa nhập tên.",
        "loginsuccesstitle": "Đã đăng nhập",
        "loginsuccess": "'''Bạn đã đăng nhập vào {{SITENAME}} với tên “$1”.'''",
        "createacct-another-realname-tip": "Tên thật là không bắt buộc. \n\nNếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao của bạn.",
        "pt-login": "Đăng nhập",
        "pt-login-button": "Đăng nhập",
+       "pt-login-continue-button": "Tiếp tục đăng nhập",
        "pt-createaccount": "Mở tài khoản",
        "pt-userlogout": "Đăng xuất",
        "php-mail-error-unknown": "Lỗi không rõ trong hàm PHP mail()",
        "botpasswords-invalid-name": "Tên người dùng đã chỉ định không chứa dấu tách mật khẩu bot (\"$1\").",
        "botpasswords-not-exist": "Người dùng \"$1\" không có mật khẩu bot có tên \"$2\".",
        "resetpass_forbidden": "Không được đổi mật khẩu",
+       "resetpass_forbidden-reason": "Không thể đổi mật khẩu: $1",
        "resetpass-no-info": "Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.",
        "resetpass-submit-loggedin": "Thay đổi mật khẩu",
        "resetpass-submit-cancel": "Hủy bỏ",
        "passwordreset-emailsentusername": "Nếu một địa chỉ thư điện tử đã gắn với tên người dùng này thì một thư điện tử để đặt lại mật khẩu sẽ được gửi đến.",
        "passwordreset-emailsent-capture": "Thư điện tử để tái tạo mật khẩu đã được gửi, nội dung như sau.",
        "passwordreset-emailerror-capture": "Chúng tôi đã tạo thư tái tạo mật khẩu dưới đây, nhưng không thể gửi đến {{GENDER:$2}}người dùng: $1",
+       "passwordreset-emailsent-capture2": "Đã gửi {{PLURAL:$1|thư điện tử|các thư điện tử}} để đặt lại mật khẩu. {{PLURAL:$1|Tên người dùng và mật khẩu|Các tên người dùng và mật khẩu}} được liệt kê dưới đây.",
+       "passwordreset-emailerror-capture2": "Không gửi được thư điện tử đến {{GENDER:$2}}người dùng: $1 {{PLURAL:$3|Tên người dùng và mật khẩu|Các tên người dùng và mật khẩu}} được liệt kê dưới đây.",
+       "passwordreset-nocaller": "Yêu cầu hàm gọi",
+       "passwordreset-nosuchcaller": "Hàm gọi không tồn tại: $1",
+       "passwordreset-ignored": "Tác vụ đặt lại mật khẩu không được xử lý. Có lẽ trình cung cấp chưa được cấu hình?",
+       "passwordreset-invalideamil": "Địa chỉ thư điện tử không hợp lệ",
+       "passwordreset-nodata": "Cả tên người dùng và địa chỉ thư điện tử bị thiếu",
        "changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
        "changeemail-header": "Điền biểu mẫu này để đổi địa chỉ thư điện tử của bạn. Nếu bạn muốn gỡ địa chỉ thư điện tử nào khỏi tài khoản của bạn, để trống hộp địa chỉ thư điện tử mới và lưu biểu mẫu.",
        "changeemail-passwordrequired": "Bạn sẽ cần phải nhập mật khẩu của bạn để xác nhận thay đổi này.",
        "accmailtext": "Một mật khẩu được tạo ngẫu nhiên cho [[User talk:$1|$1]] đã được gửi đến $2. Có thể đổi mật khẩu tại trang ''[[Special:ChangePassword|đổi mật khẩu]]'' sau khi đã đăng nhập.",
        "newarticle": "(Mới)",
        "newarticletext": "Bạn đi đến đây từ một liên kết đến một trang chưa tồn tại. Để tạo trang, hãy bắt đầu gõ vào ô bên dưới (xem [$1 trang trợ giúp] để có thêm thông tin). Nếu bạn đến đây do nhầm lẫn, chỉ cần nhấn vào nút '''Lùi''' (hoặc Trở lại, Quay lại, Back) trong trình duyệt của bạn.",
-       "anontalkpagetext": "----''Đây là trang thảo luận của một người dùng vô danh chưa tạo tài khoản hoặc có tài khoản nhưng không đăng nhập.\nDo đó chúng ta phải dùng một dãy số gọi là địa chỉ IP để xác định anh/chị ta.\nMột địa chỉ IP như vậy có thể có nhiều người cùng dùng chung.\nNếu bạn là một thành viên vô danh và cảm thấy rằng có những lời bàn luận không thích hợp đang nhắm vào bạn, xin hãy [[Special:CreateAccount|tạo tài khoản]] hoặc [[Special:UserLogin|đăng nhập]] để tránh sự nhầm lẫn về sau với những thành viên vô danh khác.''",
+       "anontalkpagetext": "----\n<em>Đây là trang thảo luận của một người dùng vô danh chưa tạo tài khoản hoặc có tài khoản nhưng không đăng nhập.</em>\nDo đó chúng ta phải dùng một dãy số gọi là địa chỉ IP để xác định anh/chị ta.\nMột địa chỉ IP như vậy có thể có nhiều người cùng dùng chung.\nNếu bạn là một thành viên vô danh và cảm thấy rằng có những lời bàn luận không thích hợp đang nhắm vào bạn, xin hãy [[Special:CreateAccount|tạo tài khoản]] hoặc [[Special:UserLogin|đăng nhập]] để tránh sự nhầm lẫn về sau với những thành viên vô danh khác.",
        "noarticletext": "Trang này hiện chưa có nội dung.\nBạn có thể [[Special:Search/{{PAGENAME}}|tìm kiếm tựa trang này]] trong các trang khác, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tìm trong các nhật trình liên quan],\nhoặc [{{fullurl:{{FULLPAGENAME}}|action=edit}} tạo mới trang này]</span>.",
        "noarticletext-nopermission": "Trang này hiện đang trống.\nBạn có thể [[Special:Search/{{PAGENAME}}|tìm kiếm tựa trang này]] tại các trang khác, hoặc <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tìm kiếm các nhật trình liên quan]</span>, nhưng bạn không được phép tạo trang này.",
        "missing-revision": "Phiên bản #$1 của trang có tên “{{FULLPAGENAME}}” không tồn tại.\n\nLỗi này thường xuất hiện đối khi theo dõi liên kết lỗi thời đến phiên bản cũ của một trang đã bị xóa.\nXem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].",
        "undo-failure": "Sửa đổi không thể phục hồi vì đã có những sửa đổi mới ở sau.",
        "undo-norev": "Sửa đổi không thể hồi phục vì nó không tồn tại hoặc đã bị xóa.",
        "undo-nochange": "Hình như sửa đổi này đã được lùi lại rồi.",
-       "undo-summary": "Đã lùi lại sửa đổi $1 của [[Special:Contributions/$2|$2]] ([[User talk:$2|Thảo luận]])",
+       "undo-summary": "Đã lùi lại sửa đổi $1 của [[Special:Contributions/$2|$2]] ([[User talk:$2|thảo luận]])",
        "undo-summary-username-hidden": "Đã lùi lại sửa đổi $1 của một người dùng ẩn",
        "cantcreateaccounttitle": "Không thể mở tài khoản",
        "cantcreateaccount-text": "Chức năng tài tạo khoản từ địa chỉ IP này ('''$1''') đã bị [[User:$3|$3]] cấm.\n\nLý do được $3 đưa ra là ''$2''",
        "prefs-watchlist-days-max": "Tối đa $1 ngày",
        "prefs-watchlist-edits": "Số lần sửa đổi tối đa trong danh sách theo dõi mở rộng:",
        "prefs-watchlist-edits-max": "Con số tối đa: 1.000",
-       "prefs-watchlist-token": "Số thẻ Danh sách theo dõi:",
+       "prefs-watchlist-token": "Dấu hiệu cho danh sách theo dõi:",
        "prefs-misc": "Linh tinh",
        "prefs-resetpass": "Thay đổi mật khẩu",
        "prefs-changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
        "right-override-export-depth": "Xuất trang kèm theo các trang được liên kết đến với độ sâu tối đa là 5",
        "right-sendemail": "Gửi thư điện tử cho thành viên khác",
        "right-passwordreset": "Xem các thư điện tử đặt lại mật khẩu",
-       "right-managechangetags": "Tạo và xóa [[Special:Tags|thẻ]] từ cơ sở dữ liệu",
+       "right-managechangetags": "Tạo và bật/tắt [[Special:Tags|thẻ]]",
        "right-applychangetags": "Áp dụng [[Special:Tags|thẻ]], cùng với những thay đổi của một người",
        "right-changetags": "Thêm và loại bỏ tùy ý các [[Special:Tags|thẻ]] vào các phiên bản riêng và các mục nhật trình",
+       "right-deletechangetags": "Xóa [[Special:Tags|thẻ]] khỏi cơ sở dữ liệu",
        "grant-generic": "Gói quyền “$1”",
        "grant-group-page-interaction": "Tương tác với trang",
        "grant-group-file-interaction": "Tương tác với tập tin",
        "action-viewmyprivateinfo": "xem thông tin cá nhân của bạn",
        "action-editmyprivateinfo": "sửa đổi thông tin cá nhân của bạn",
        "action-editcontentmodel": "sửa kiểu nội dung của trang",
-       "action-managechangetags": "tạo và xóa các thẻ từ cơ sở dữ liệu",
+       "action-managechangetags": "tạo và bật/tắt thẻ",
        "action-applychangetags": "áp dụng các thẻ cùng với những thay đổi của bạn",
        "action-changetags": "thêm và loại bỏ các thẻ tùy ý trên các phiên bản riêng và các mục nhật trình",
+       "action-deletechangetags": "xóa thẻ khỏi cơ sở dữ liệu",
        "nchanges": "$1 thay đổi",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sau lần truy cập vừa rồi}}",
        "enhancedrc-history": "lịch sử",
        "trackingcategories-msg": "Thể loại phần mềm",
        "trackingcategories-name": "Tên thông điệp",
        "trackingcategories-desc": "Tiêu chuẩn xếp thể loại",
+       "restricted-displaytitle-ignored": "Trang có tên hiển thị được bỏ qua",
+       "restricted-displaytitle-ignored-desc": "Trang có <code><nowiki>{{TÊN_HIỂN_THỊ}}</nowiki></code>, <code><nowiki>{{TÊNHIỂNTHỊ}}</nowiki></code>, hoặc <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> được bỏ qua vì nó không tương đương với tên thật của trang.",
        "noindex-category-desc": "Trang này không được các robot đánh chỉ mục vì trang có từ thần chú <code><nowiki>__NOINDEX__</nowiki></code> và nằm trong không gian tên cho phép từ thần chú này.",
        "index-category-desc": "Trang này có từ thần chú <code><nowiki>__INDEX__</nowiki></code> và nằm trong một không gian tên cho phép từ thần chú này, nên được các robot đánh chỉ mục, trong khi bình thường nó không được đánh chỉ mục.",
        "post-expand-template-inclusion-category-desc": "Kích thước trang sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung hết toàn bộ bản mẫu, nên một số bản mẫu không được bung.",
        "rollbacklinkcount": "lùi tất cả $1 sửa đổi",
        "rollbacklinkcount-morethan": "lùi tất cả hơn $1 sửa đổi",
        "rollbackfailed": "Lùi sửa đổi không thành công",
+       "rollback-missingparam": "Yêu cầu thiếu những tham số bắt buộc.",
        "cantrollback": "Không lùi sửa đổi được;\nngười viết trang cuối cùng cũng là tác giả duy nhất của trang này.",
        "alreadyrolled": "Không thể lùi tất cả sửa đổi cuối của [[User:$2|$2]] ([[User talk:$2|thảo luận]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tại [[:$1]]; ai đó đã thực hiện sửa đổi hoặc thực hiện lùi tất cả rồi.\n\nSửa đổi cuối cùng tại trang do [[User:$3|$3]] ([[User talk:$3|thảo luận]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) thực hiện.",
        "editcomment": "Tóm lược sửa đổi: <em>$1</em>.",
        "revertpage": "Đã lùi lại sửa đổi của [[Special:Contributions/$2|$2]] ([[User talk:$2|Thảo luận]]) quay về phiên bản cuối của [[User:$1|$1]]",
        "revertpage-nouser": "Đã lùi lại sửa đổi của người dùng ẩn quay về phiên bản cuối của {{GENDER:$1}}[[User:$1|$1]]",
        "rollback-success": "Đã hủy sửa đổi của $1;\nquay về phiên bản cuối của $2.",
+       "rollback-success-notify": "Đã hủy sửa đổi của $1;\nquay về phiên bản cuối của $2. [$3 Xem thay đổi]",
        "sessionfailure-title": "Phiên thất bại",
        "sessionfailure": "Dường như có trục trặc với phiên đăng nhập của bạn; thao tác này đã bị hủy để tránh việc cướp quyền đăng nhập. Xin hãy nhấn nút “Back”, tải lại trang đó, rồi thử lại.",
        "changecontentmodel": "Thay đổi kiểu nội dung của một trang",
        "changecontentmodel-success-text": "Kiểu nội dung của [[:$1]] đã được thay đổi.",
        "changecontentmodel-cannot-convert": "Không thể chuyển đổi nội dung [[:$1]] thành nội dung dưới dạng $2.",
        "changecontentmodel-nodirectediting": "Kiểu nội dung $1 không hỗ trợ sửa đổi trực tiếp",
+       "changecontentmodel-emptymodels-title": "Không có sẵn kiểu nội dung nào",
+       "changecontentmodel-emptymodels-text": "Không thể chuyển đổi nội dung tại [[:$1]] thành nội dung dưới định dạng nào.",
        "log-name-contentmodel": "Nhật trình thay đổi kiểu nội dung",
        "log-description-contentmodel": "Sự kiện có liên quan đến kiểu nội dung của trang.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2}}đã tạo trang $3 với kiểu nội dung không mặc định “$5”",
        "lockdbsuccesstext": "Cơ sở dữ liệu đã bị khóa.\n<br />Nhớ [[Special:UnlockDB|mở khóa]] sau khi bảo trì xong.",
        "unlockdbsuccesstext": "Cơ sở dữ liệu đã được mở khóa.",
        "lockfilenotwritable": "Tập tin khóa của cơ sở dữ liệu không cho phép ghi. Để khóa hay mở khóa cơ sở dữ liệu, máy chủ web phải có khả năng ghi tập tin.",
+       "databaselocked": "Cơ sở dữ liệu đã được khóa rồi.",
        "databasenotlocked": "Cơ sở dữ liệu không bị khóa.",
        "lockedbyandtime": "($1 khóa vào $2 lúc $3)",
        "move-page": "Di chuyển $1",
        "confirm-watch-top": "Bạn có muốn thêm trang này vào danh sách theo dõi của bạn?",
        "confirm-unwatch-button": "Ngừng theo dõi",
        "confirm-unwatch-top": "Bạn có muốn gỡ trang này khỏi danh sách theo dõi của bạn?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Có muốn lùi lại các sửa đổi trong trang này?",
        "ellipsis": "…",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← trang trước",
        "timezone-local": "Địa phương",
        "duplicate-defaultsort": "Cảnh báo: Từ khóa xếp mặc định “$2” ghi đè từ khóa trước, “$1”.",
        "duplicate-displaytitle": "<strong>Cảnh báo:</strong> Tên hiển thị “$2” ghi đè tên hiển thị “$1” bên trên.",
+       "restricted-displaytitle": "<strong>Chú ý:</strong> Tên hiển thị “$1” được bỏ qua vì nó không tương đương với tên thật của trang.",
        "invalid-indicator-name": "<strong>Lỗi:</strong> Không thể để trống thuộc tính <code>name</code> của cái chỉ trạng thái trang.",
        "version": "Phiên bản",
        "version-extensions": "Các phần mở rộng được cài đặt",
        "tags-delete-not-found": "Thẻ “$1” không tồn tại.",
        "tags-delete-too-many-uses": "Thẻ “$1” được áp dụng cho hơn $2 phiên bản, có nghĩa là nó không thể bị xóa.",
        "tags-delete-warnings-after-delete": "Thẻ “$1” đã được xóa thành công, nhưng gặp phải {{PLURAL:$2|cảnh báo|các cảnh báo}} sau:",
+       "tags-delete-no-permission": "Bạn không có quyền hạn để xóa các thẻ thay đổi.",
        "tags-activate-title": "Kích hoạt thẻ",
        "tags-activate-question": "Bạn sắp sửa kích hoạt thẻ “$1”.",
        "tags-activate-reason": "Lý do:",
        "log-action-filter-suppress-block": "Ẩn giấu người dùng bằng cách cấm",
        "log-action-filter-suppress-reblock": "Ẩn giấu người dùng bằng cách cấm lại",
        "log-action-filter-upload-upload": "Tải lên mới",
-       "log-action-filter-upload-overwrite": "Tải lên lại"
+       "log-action-filter-upload-overwrite": "Tải lên lại",
+       "authmanager-authn-not-in-progress": "Không phải đang xác thực, hoặc dữ liệu phiên làm việc bị mất. Xin hãy thử lại từ đầu.",
+       "authmanager-authn-no-primary": "Không thể xác thực định danh được cung cấp.",
+       "authmanager-authn-no-local-user": "Định danh được cung cấp không ứng với người dùng nào trên wiki này.",
+       "authmanager-authn-no-local-user-link": "Định danh được cung cấp có hợp lệ nhưng không ứng với người dùng nào trên wiki này. Hãy đăng nhập một cách khác hoặc tạo tài khoản mới; bạn sẽ có cơ hội để liên kết định danh cũ với tài khoản mới.",
+       "authmanager-authn-autocreate-failed": "Thất bại khi tự động tạo tài khoản địa phương: $1",
+       "authmanager-change-not-supported": "Không thể thay đổi định danh được cung cấp, vì sẽ không có gì sử dụng nó.",
+       "authmanager-create-disabled": "Chứng năng tạo tài khoản được tắt.",
+       "authmanager-create-from-login": "Để tạo tài khoản của mình, xin hãy điền vào các thông tin bên dưới.",
+       "authmanager-create-not-in-progress": "Không phải đang tạo tài khoản, hoặc dữ liệu phiên làm việc bị mất. Xin hãy thử lại từ đầu.",
+       "authmanager-create-no-primary": "Không thể sử dụng định danh được cung cấp để tạo tài khoản.",
+       "authmanager-link-no-primary": "Không thể sử dụng định danh được cung cấp để liên kết tài khoản.",
+       "authmanager-link-not-in-progress": "Không phải đang liên kết tài khoản, hoặc dữ liệu phiên làm việc bị mất. Xin hãy thử lại từ đầu.",
+       "authmanager-authplugin-setpass-failed-title": "Thay đổi mật khẩu bị thất bại",
+       "authmanager-authplugin-setpass-failed-message": "Phần bổ trợ xác thực đã từ chối việc đổi mật khẩu.",
+       "authmanager-authplugin-create-fail": "Phần bổ trợ xác thực đã từ chối việc tạo tài khoản.",
+       "authmanager-authplugin-setpass-denied": "Phần bổ trợ xác thực không cho phép đổi mật khẩu.",
+       "authmanager-authplugin-setpass-bad-domain": "Tên miền không hợp lệ.",
+       "authmanager-autocreate-noperm": "Không cho phép tự động tạo tài khoản.",
+       "authmanager-autocreate-exception": "Tạm thời không cho phép tự động tạo tài khoản vì các lỗi trước đây.",
+       "authmanager-userdoesnotexist": "Chưa có tài khoản với tên “$1”.",
+       "authmanager-userlogin-remembermypassword-help": "Mật khẩu có nên được duy trì sau phiên làm việc hay không.",
+       "authmanager-username-help": "Tên người dùng để xác thực.",
+       "authmanager-password-help": "Mật khẩu để xác thực.",
+       "authmanager-domain-help": "Tên miền để xác thực bên ngoài.",
+       "authmanager-retype-help": "Mật khẩu lần nữa để xác nhận.",
+       "authmanager-email-label": "Thư điện tử",
+       "authmanager-email-help": "Địa chỉ thư điện tử",
+       "authmanager-realname-label": "Tên thật",
+       "authmanager-realname-help": "Tên thật của người dùng",
+       "authmanager-provider-password": "Xác thực qua mật khẩu",
+       "authmanager-provider-password-domain": "Xác thực qua mật khẩu và tên miền",
+       "authmanager-provider-temporarypassword": "Mật khẩu tạm",
+       "authprovider-confirmlink-message": "Dựa trên các lần bạn thử đăng nhập gần đây, có thể liên kết các tài khoản bên dưới với tài khoản wiki của bạn. Sau khi liên kết các tài khoản này, bạn có thể đăng nhập qua chúng. Xin hãy chọn các tài khoản để liên kết.",
+       "authprovider-confirmlink-request-label": "Các tài khoản để liên kết",
+       "authprovider-confirmlink-success-line": "$1: Đã liên kết thành công.",
+       "authprovider-confirmlink-failed": "Việc liên kết tài khoản không hoàn toàn thành công: $1",
+       "authprovider-confirmlink-ok-help": "Tiếp tục sau khi hiển thị các thông báo liên kết thất bại.",
+       "authprovider-resetpass-skip-label": "Bỏ qua",
+       "authprovider-resetpass-skip-help": "Bỏ qua việc đặt lại mật khẩu.",
+       "authform-nosession-login": "Đã xác thực thành công, nhưng trình duyệt của bạn không thể duy trì đăng nhập.\n\n$1",
+       "authform-nosession-signup": "Đã tạo tài khoản thành công, nhưng trình duyệt của bạn không thể duy trì đăng nhập.\n\n$1",
+       "authform-newtoken": "Dấu hiệu bị mất. $1",
+       "authform-notoken": "Dấu hiệu bị mất",
+       "authform-wrongtoken": "Dấu hiệu sai",
+       "specialpage-securitylevel-not-allowed-title": "Không được phép",
+       "specialpage-securitylevel-not-allowed": "Rất tiếc, bạn không được phép sử dụng trang này vì không thể xác nhận danh tính của bạn.",
+       "authpage-cannot-login": "Không thể tiến hành đăng nhập.",
+       "authpage-cannot-login-continue": "Không thể tiếp tục đăng nhập. Có lẽ phiên làm việc của bạn đã hết hạn.",
+       "authpage-cannot-create": "Không thể tiến hành tạo tài khoản.",
+       "authpage-cannot-create-continue": "Không thể tiếp tục tạo tài khoản. Có lẽ phiên làm việc của bạn đã hết hạn.",
+       "authpage-cannot-link": "Không thể tiến hành liên kết tài khoản.",
+       "authpage-cannot-link-continue": "Không thể tiếp tục liên kết tài khoản. Có lẽ phiên làm việc của bạn đã hết hạn.",
+       "cannotauth-not-allowed-title": "Không cho phép",
+       "cannotauth-not-allowed": "Bạn không có quyền sử dụng trang này.",
+       "changecredentials": "Thay đổi định danh",
+       "changecredentials-submit": "Thay đổi định danh",
+       "changecredentials-submit-cancel": "Hủy bỏ",
+       "changecredentials-invalidsubpage": "$1 không phải là kiểu định danh hợp lệ.",
+       "changecredentials-success": "Đã thay đổi định danh của bạn.",
+       "removecredentials": "Xóa định danh",
+       "removecredentials-submit": "Xóa định danh",
+       "removecredentials-submit-cancel": "Hủy bỏ",
+       "removecredentials-invalidsubpage": "$1 không phải là kiểu định danh hợp lệ.",
+       "removecredentials-success": "Đã xóa định danh của bạn.",
+       "credentialsform-provider": "Kiểu định danh:",
+       "credentialsform-account": "Tên tài khoản:",
+       "cannotlink-no-provider-title": "Không có tài khoản liên kết được",
+       "cannotlink-no-provider": "Không có tài khoản liên kết được.",
+       "linkaccounts": "Liên kết tài khoản",
+       "linkaccounts-success-text": "Đã liên kết tài khoản.",
+       "linkaccounts-submit": "Liên kết tài khoản",
+       "unlinkaccounts": "Gỡ liên kết tài khoản",
+       "unlinkaccounts-success": "Đã gỡ liên kết tài khoản."
 }
index db0fc48..0e9c30e 100644 (file)
        "cannotauth-not-allowed-title": "权限被拒绝",
        "cannotauth-not-allowed": "您不被允许使用此页面",
        "changecredentials": "更改证书",
-       "changecredentials-submit": "更改",
+       "changecredentials-submit": "更改证书",
        "changecredentials-submit-cancel": "取消",
        "changecredentials-invalidsubpage": "$1不是有效的证书类型。",
        "changecredentials-success": "您的证书已被更改。",
        "removecredentials": "移除证书",
-       "removecredentials-submit": "移除",
+       "removecredentials-submit": "移除证书",
        "removecredentials-submit-cancel": "取消",
        "removecredentials-invalidsubpage": "$1不是有效的证书类型。",
        "removecredentials-success": "您的证书已被移除。",
index 9a52c63..c2a6729 100644 (file)
        "createacct-email-ph": "輸入您的電子郵件地址",
        "createacct-another-email-ph": "輸入電子郵件地址",
        "createaccountmail": "使用臨時的隨機密碼,並將它寄至指定的電子郵件地址",
+       "createaccountmail-help": "可用來建立其他人的帳號 (不需要知道密碼)。",
        "createacct-realname": "真實姓名 (選填)",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "passwordreset-emailsentusername": "若此確實為您使用者名稱所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "passwordreset-emailsent-capture": "已寄出重設密碼的電子郵件,並於下方顯示。",
        "passwordreset-emailerror-capture": "下列為重設密碼的電子郵件內容,傳送給{{GENDER:$2|使用者}}失敗:$1",
+       "passwordreset-emailsent-capture2": "密碼重設{{PLURAL:$1|郵件|郵件}}已寄出,{{PLURAL:$1|使用者名稱與密碼|使用者名稱與密碼}}如下顯示。",
+       "passwordreset-emailerror-capture2": "寄發電子郵件給{{GENDER:$2|使用者}}失敗:$1,{{PLURAL:$3|使用者名稱與密碼|使用者名稱與密碼}}如下顯示。",
+       "passwordreset-nocaller": "必須提供 caller",
+       "passwordreset-nosuchcaller": "Caller 不存在:$1",
+       "passwordreset-ignored": "未處理密碼重設動作,可能尚未設定提供者?",
+       "passwordreset-invalideamil": "無效的電子郵件地址",
+       "passwordreset-nodata": "未提供使用者名稱或是電子郵件地址",
        "changeemail": "變更或移除電子郵件地址",
        "changeemail-header": "請填寫此表單來變更您的電子郵件地址,若您想要移除您帳號所連結的所有電子郵件地址,請於新電子郵件地址欄位留空。",
        "changeemail-passwordrequired": "您須要輸入您的密碼來確認此次變更。",
        "minoredit": "這是一個小修訂",
        "watchthis": "監視此頁面",
        "savearticle": "儲存頁面",
-       "publishpage": "發頁面",
+       "publishpage": "發頁面",
        "preview": "預覽",
        "showpreview": "顯示預覽",
        "showdiff": "顯示變更",
        "userpage-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。\n若您要建立/編輯此頁面,請先檢查是否正確。",
        "userpage-userdoesnotexist-view": "使用者帳號 \"$1\" 尚未註冊。",
        "blocked-notice-logextract": "此使用者目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
-       "clearyourcache": "<strong>注意:</strong>在您儲存之後您必須清除瀏覽器快取才可看到最新的變更。\n* <strong>Firefox / Safari:</strong>按住 <em>Shift</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em> 或 <em>Ctrl-R</em> (Mac 則為 <em>⌘-R</em>) \n* <strong>Google Chrome:</strong>按 <em>Ctrl-Shift-R</em> (Mac 則為 <em>⌘-Shift-R</em>) \n* <strong>Internet Explorer:</strong>按住 <em>Ctrl</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em>\n* <strong>Opera:</strong>進入 <em>工具 → 偏好設定</em> 中清除快取。",
+       "clearyourcache": "<strong>注意:</strong>在您儲存之後您必須清除瀏覽器快取才可看到最新的變更。\n* <strong>Firefox / Safari:</strong>按住 <em>Shift</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em> 或 <em>Ctrl-R</em> (Mac 則為 <em>⌘-R</em>) \n* <strong>Google Chrome:</strong>按 <em>Ctrl-Shift-R</em> (Mac 則為 <em>⌘-Shift-R</em>) \n* <strong>Internet Explorer:</strong>按住 <em>Ctrl</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em>\n* <strong>Opera:</strong>前往 <em>選單 → 設定</em> (在 Mac 為 <em>Opera → 偏好設定</em>) 然後再到 <em>隱私 & 安全性 → 清除瀏覽資料 → 已快取的圖片與檔案</em>。",
        "usercssyoucanpreview": "<strong>提示:</strong>在儲存之前使用 \"{{int:showpreview}}\" 按鈕來測試您的新 CSS 。",
        "userjsyoucanpreview": "<strong>提示:</strong>在儲存之前使用 \"{{int:showpreview}}\" 按鈕來測試您的新 JavaScript 。",
        "usercsspreview": "<strong>您目前正預覽您的使用者 CSS,CSS 還尚未儲存!</strong>",
        "previewnote": "<strong>您目前正在預覽,您的變更還尚未儲存!</strong>",
        "continue-editing": "前往編輯框",
        "previewconflict": "此預覽顯示了您於上方文字編輯框中的內容儲存之後將會顯示的結果。",
-       "session_fail_preview": "很抱歉!由於連線階段的資料遺失,以至於我們無法處理您的編輯動作。\n您可能已經登出了。<strong>請您確認您仍然在登入狀態,並請再試一次<strong/>。\n請再試一次。\n如果仍然失敗,請 [[Special:UserLogout|登出]] 後重新登入,並請您確認您的瀏覽器允許此網站的Cookie。",
+       "session_fail_preview": "很抱歉!由於連線階段的資料遺失,以至於我們無法處理您的編輯動作。\n您可能已經登出了。<strong>請您確認您仍然在登入狀態,並請再試一次</strong>。\n請再試一次。\n如果仍然失敗,請 [[Special:UserLogout|登出]] 後重新登入,並請您確認您的瀏覽器允許此網站的 Cookie。",
        "session_fail_preview_html": "<strong>抱歉!由於是次登入時段出現資料遺失,我們無法處理您所作出的編輯。</strong>\n\n<em> {{SITENAME}} 已開啟了原始 HTML 模式,故此預覽畫面將不會顯示以避免 JavaScript 攻擊。</em>\n\n<strong>如您希望真正能夠作出這次編輯,請再試一次。</strong>\n如果仍不成功,請 [[Special:UserLogout|登出]] 後再重新登入,並確保瀏覽器設定為「允許這個網域的cookie」。",
        "token_suffix_mismatch": "<strong>因您使用的瀏覽器破壞了編輯密鑰中的特殊符號,您的編輯已被拒絕。</strong>\n為了避免破壞頁面內容,已拒絕此次編輯動作,\n會發生這個問題通常是因為您使用了有問題的匿名網頁代理伺服器。",
        "edit_form_incomplete": "<strong>部份編輯的內容未送至伺服器,請檢查您的編輯內容是否完整並再試一次。</strong>",
        "right-override-export-depth": "匯出頁面包含連結內容,深度上限為 5 層",
        "right-sendemail": "傳送電子郵件聯絡其他使用者",
        "right-passwordreset": "檢視重設密碼電子郵件",
-       "right-managechangetags": "建立並自資料庫移除[[Special:Tags|標籤]]",
+       "right-managechangetags": "建立並自資料庫 (取消) 啟用 [[Special:Tags|標籤]]",
        "right-applychangetags": "連同某個人的變更一起套用[[Special:Tags|標籤]]",
        "right-changetags": "加入與移除任何於各別修訂與日誌項目的[[Special:Tags|標籤]]",
+       "right-deletechangetags": "從資料庫刪除 [[Special:Tags|標籤]]",
        "grant-generic": "\"$1\" 權限組合",
        "grant-group-page-interaction": "與頁面互動",
        "grant-group-file-interaction": "與媒體互動",
        "action-viewmyprivateinfo": "檢視您的個人資訊",
        "action-editmyprivateinfo": "編輯您的個人資訊",
        "action-editcontentmodel": "編輯頁面的內容模型",
-       "action-managechangetags": "建立並自資料庫移除標籤",
+       "action-managechangetags": "建立與 (取消) 啟用標籤",
        "action-applychangetags": "連同您的變更一起套用標籤",
        "action-changetags": "加入與移除任何於各別修訂與日誌項目的標籤",
+       "action-deletechangetags": "從資料庫刪除標籤",
        "nchanges": "$1 次變更",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次拜訪}}已有 $1",
        "enhancedrc-history": "歷史",
        "trackingcategories-msg": "追蹤分類",
        "trackingcategories-name": "訊息名稱",
        "trackingcategories-desc": "分類收錄標準",
+       "restricted-displaytitle-ignored": "已忽略顯示標題的頁面",
+       "restricted-displaytitle-ignored-desc": "頁面已忽略 <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>,因該標題於頁面實際標題不相同。",
        "noindex-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__NOINDEX__</nowiki></code> 未被機器人列入索引的頁面。",
        "index-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__INDEX__</nowiki></code> 被機器人列入索引的頁面。",
        "post-expand-template-inclusion-category-desc": "展開模板後大小超過 <code>$wgMaxArticleSize</code> 導致部份模板未正常展開的頁面。",
        "rollbacklinkcount": "還原 $1 次編輯",
        "rollbacklinkcount-morethan": "還原超過 $1 次{{PLURAL:$1|編輯}}",
        "rollbackfailed": "還原失敗",
+       "rollback-missingparam": "請求缺少必要參數。",
        "cantrollback": "無法還原編輯;\n此頁面的最後貢獻者是唯一的作者。",
        "alreadyrolled": "無法還原由 [[User:$2|$2]] ([[User talk:$2|對話]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]] 所作的最後一次編輯 [[:$1]],已有其他人編輯或還原了該頁面。\n\n最後一次編輯該頁面的使用者是 [[User:$3|$3]] ([[User talk:$3|對話]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
        "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 所做的編輯;\n變更回由 $2 修訂的最後一個版本。",
+       "rollback-success-notify": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。[$3 顯示變更]",
        "sessionfailure-title": "連線階段失敗",
        "sessionfailure": "您的登入連線階段似乎有問題,\n為了預防連線階段受到劫持攻擊,此動作已經被取消。\n請返回上一頁,重新讀取該頁面再試一次。",
        "changecontentmodel": "變更頁面的內容模型",
        "confirm-watch-top": "新增此頁面至您的監視清單?",
        "confirm-unwatch-button": "確定",
        "confirm-unwatch-top": "從您的監視清單中移除此頁面?",
+       "confirm-rollback-button": "確定",
+       "confirm-rollback-top": "還原編輯到此頁面?",
        "semicolon-separator": ";",
        "comma-separator": "、",
        "colon-separator": ":",
        "timezone-local": "當地",
        "duplicate-defaultsort": "<strong>警告:</strong>預設的排序鍵 \"$2\" 會覆蓋先前預設的排序鍵 \"$1\"。",
        "duplicate-displaytitle": "<strong>警告:</strong> 顯示標題 \"$2\" 覆蓋之前的顯示標題 \"$1\"。",
+       "restricted-displaytitle": "<strong>警告:</strong> 由於顯示標題與頁面實際標題不哃,已忽略顯示標題 \"$1\"。",
        "invalid-indicator-name": "<strong>錯誤:</strong>頁面狀態指示的 <code>name</code> 屬性不能為空。",
        "version": "版本",
        "version-extensions": "已安裝的擴充套件",
        "tags-delete-not-found": "標籤 \"$1\" 不存在。",
        "tags-delete-too-many-uses": "標籤 \"$1\" 會套用至 $2 筆以上的{{PLURAL:$2|修訂|修訂}},這代表該標籤將無法刪除。",
        "tags-delete-warnings-after-delete": "標籤 \"$1\" 已刪除,但發生下列{{PLURAL:$2|警告|警告}}:",
+       "tags-delete-no-permission": "您沒有權限刪除標籤。",
        "tags-activate-title": "啟動標籤",
        "tags-activate-question": "您正要啟動標籤 \"$1\"。",
        "tags-activate-reason": "原因:",
        "api-error-autoblocked": "您的IP位址已經被自動封禁,因為它曾經被一名已封禁的使用者使用過。",
        "api-error-badaccess-groups": "您沒有權限在此 Wiki 上傳檔案。",
        "api-error-badtoken": "內部錯誤:密鑰錯誤。",
-       "api-error-blocked": "您已被封,無法編輯。",
+       "api-error-blocked": "您已被封,無法編輯。",
        "api-error-copyuploaddisabled": "此伺服器已停用使用 URL 上傳檔案的功能。",
        "api-error-duplicate": "在網站上已有相同內容的{{PLURAL:$1|其他檔案|其他檔案}}。",
        "api-error-duplicate-archive": "在網站上曾有相同內容的{{PLURAL:$1|其他檔案|其他檔案}},但已被刪除。",
        "log-action-filter-suppress-reblock": "由重新封鎖禁止顯示使用者",
        "log-action-filter-upload-upload": "新上傳",
        "log-action-filter-upload-overwrite": "重新上傳",
+       "authmanager-authn-not-in-progress": "認証尚未進行或連線階段資料已遺失,請重頭再開始。",
+       "authmanager-authn-no-primary": "提供的憑證無法用來認証。",
+       "authmanager-authn-no-local-user": "提供的憑證沒有與任何在此 wiki 上的使用者相關聯。",
+       "authmanager-authn-no-local-user-link": "提供的憑證有效但沒有與任何在此 wiki 上的使用者相關聯。請採用其他方式登入,或建立新使用者,您將會有選項可以連結您先前的憑證到新帳號。",
+       "authmanager-authn-autocreate-failed": "自動建立本地帳號失敗:$1",
+       "authmanager-change-not-supported": "提供的憑證無法變更,因為尚無法使用。",
+       "authmanager-create-disabled": "已關閉帳號自動建立。",
+       "authmanager-create-from-login": "要建立您的帳號,請先填寫以下欄位。",
+       "authmanager-create-not-in-progress": "帳號建立尚未進行或連線階段資料已遺失,請重頭再開始。",
+       "authmanager-create-no-primary": "提供的憑證無使用在帳號建立。",
+       "authmanager-link-no-primary": "提供的憑證無使用在帳號連結。",
+       "authmanager-link-not-in-progress": "帳號連結尚未進行或連線階段資料已遺失,請重頭再開始。",
+       "authmanager-authplugin-setpass-failed-title": "密碼變更失敗",
+       "authmanager-authplugin-setpass-failed-message": "認証外掛已拒絕密碼變更。",
+       "authmanager-authplugin-create-fail": "認証外掛已拒絕帳號建立。",
+       "authmanager-authplugin-setpass-denied": "認証外掛不允許更改密碼。",
+       "authmanager-authplugin-setpass-bad-domain": "無效網域。",
+       "authmanager-autocreate-noperm": "不允許自動帳號建立。",
+       "authmanager-autocreate-exception": "自動帳號建立因發生錯誤臨時關閉。",
        "authmanager-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
+       "authmanager-userlogin-remembermypassword-help": "是否要記住密碼來取得更長的連線階段時間。",
        "authmanager-username-help": "認証用的使用者名稱。",
        "authmanager-password-help": "認証用的密碼。",
        "authmanager-domain-help": "外部認証用的網域。",
        "authmanager-provider-password": "Password-based 認証",
        "authmanager-provider-password-domain": "Password- 及 domain-based 認証",
        "authmanager-provider-temporarypassword": "臨時密碼",
+       "authprovider-confirmlink-message": "根據您最近的登入嘗試次數,以下帳號可以被連結至您的 wiki 帳號。連結帳號可以讓您使用這些帳號登入。請選擇一個您想連結的帳號。",
+       "authprovider-confirmlink-request-label": "應連結的帳號",
+       "authprovider-confirmlink-success-line": "$1:已成功連結。",
+       "authprovider-confirmlink-failed": "帳號連結未完全成功:$1",
+       "authprovider-confirmlink-ok-help": "顯示連結失敗訊息後繼續。",
        "authprovider-resetpass-skip-label": "略過",
        "authprovider-resetpass-skip-help": "略過重設密碼。",
+       "authform-nosession-login": "已成功認証,但您的瀏覽器無法 \"記住\" 登入資訊。\n\n$1",
+       "authform-nosession-signup": "已建立帳號,但您的瀏覽器無法 \"記住\" 登入資訊。\n\n$1",
+       "authform-newtoken": "缺少密鑰。$1",
+       "authform-notoken": "缺少密鑰",
+       "authform-wrongtoken": "密鑰錯誤",
        "specialpage-securitylevel-not-allowed-title": "不允許",
+       "specialpage-securitylevel-not-allowed": "抱歉,您不被允許使用此頁面,由於您的身份尚無法被驗証。",
+       "authpage-cannot-login": "無法開始登入。",
+       "authpage-cannot-login-continue": "無法繼續登入,您的連線階段似乎已逾時。",
+       "authpage-cannot-create": "無法開始帳號建立。",
+       "authpage-cannot-create-continue": "無法繼續帳號建立,您的連線階段似乎已逾時。",
+       "authpage-cannot-link": "無法開始帳號連結。",
+       "authpage-cannot-link-continue": "無法繼續帳號連結,您的連線階段似乎已逾時。",
        "cannotauth-not-allowed-title": "權限不足",
        "cannotauth-not-allowed": "您不被允許使用此頁面",
        "changecredentials": "更改憑證",
-       "changecredentials-submit": "更改",
+       "changecredentials-submit": "更改憑證",
        "changecredentials-submit-cancel": "取消",
        "changecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
        "changecredentials-success": "已更改您的憑證。",
        "removecredentials": "移除憑證",
-       "removecredentials-submit": "移除",
+       "removecredentials-submit": "移除憑證",
        "removecredentials-submit-cancel": "取消",
        "removecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
        "removecredentials-success": "已移除您的憑證。",
index aab2087..7c87e10 100644 (file)
@@ -59,6 +59,7 @@ class ConvertExtensionToRegistration extends Maintenance {
                $this->addArg( 'path', 'Location to the PHP entry point you wish to convert',
                        /* $required = */ true );
                $this->addOption( 'skin', 'Whether to write to skin.json', false, false );
+               $this->addOption( 'config-prefix', 'Custom prefix for configuration settings', false, true );
        }
 
        protected function getAllGlobals() {
@@ -92,6 +93,10 @@ class ConvertExtensionToRegistration extends Maintenance {
                $this->dir = dirname( realpath( $this->getArg( 0 ) ) );
                $this->json = [];
                $globalSettings = $this->getAllGlobals();
+               $configPrefix = $this->getOption( 'config-prefix', 'wg' );
+               if ( $configPrefix !== 'wg' ) {
+                       $this->json['config']['_prefix'] = $configPrefix;
+               }
                foreach ( $vars as $name => $value ) {
                        $realName = substr( $name, 2 ); // Strip 'wg'
                        if ( $realName === false ) {
@@ -113,9 +118,14 @@ class ConvertExtensionToRegistration extends Maintenance {
                                        $this->noLongerSupportedGlobals[$realName] . '). ' .
                                        "Please update the entry point before convert to registration.\n" );
                                $this->hasWarning = true;
-                       } elseif ( strpos( $name, 'wg' ) === 0 ) {
+                       } elseif ( strpos( $name, $configPrefix ) === 0 ) {
                                // Most likely a config setting
-                               $this->json['config'][$realName] = $value;
+                               $this->json['config'][substr( $name, strlen( $configPrefix ) )] = $value;
+                       } elseif ( $configPrefix !== 'wg' && strpos( $name, 'wg' ) === 0 ) {
+                               // Warn about this
+                               $this->output( 'Warning: Skipped global "' . $name . '" (' .
+                                       'config prefix is "' . $configPrefix . '"). ' .
+                                       "Please check that this setting isn't needed.\n" );
                        }
                }
 
index 9cfc40f..3aeb1ed 100644 (file)
 .success-message {
        font-weight: bold;
        font-size: 110%;
-       color: #0f0;
+       color: #008000;
 }
 
 .success-box {
index 8bc9ca4..6fde2e0 100644 (file)
     "grunt-contrib-watch": "1.0.0",
     "grunt-jscs": "2.8.0",
     "grunt-jsonlint": "1.0.7",
-    "grunt-karma": "1.0.0",
+    "grunt-karma": "0.12.2",
     "grunt-stylelint": "0.3.0",
     "karma": "0.13.22",
-    "karma-chrome-launcher": "1.0.1",
-    "karma-firefox-launcher": "1.0.0",
-    "karma-qunit": "1.0.0",
+    "karma-chrome-launcher": "0.2.2",
+    "karma-firefox-launcher": "0.1.7",
+    "karma-qunit": "0.1.9",
     "qunitjs": "1.22.0",
     "stylelint-config-wikimedia": "0.1.0"
   }
index bacf1e6..831fb0c 100644 (file)
@@ -1060,14 +1060,17 @@ return [
                        // @todo Load this message in content language
                        'colon-separator',
                ],
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.htmlform.styles' => [
                'styles' => 'resources/src/mediawiki/mediawiki.htmlform.css',
                'position' => 'top',
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.htmlform.ooui.styles' => [
                'styles' => 'resources/src/mediawiki/mediawiki.htmlform.ooui.css',
                'position' => 'top',
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.icon' => [
                'styles' => 'resources/src/mediawiki/mediawiki.icon.less',
@@ -1726,7 +1729,6 @@ return [
 
        'mediawiki.special' => [
                'position' => 'top',
-               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.js',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.css',
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -1737,7 +1739,6 @@ return [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.apisandbox.css',
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.apisandbox.js',
                'dependencies' => [
-                       'mediawiki.special',
                        'mediawiki.api',
                        'mediawiki.jqueryMsg',
                        'oojs-ui',
@@ -1880,7 +1881,6 @@ return [
        ],
        'mediawiki.special.recentchanges' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.recentchanges.js',
-               'dependencies' => 'mediawiki.special',
                'position' => 'top',
        ],
        'mediawiki.special.search' => [
@@ -1894,6 +1894,10 @@ return [
                        'powersearch-togglenone',
                ],
        ],
+       'mediawiki.special.search.styles' => [
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.styles.css',
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.special.undelete' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.undelete.js',
        ],
@@ -1902,7 +1906,6 @@ return [
                        'thumbnail.html' => 'resources/src/mediawiki.special/templates/thumbnail.html',
                ],
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.upload.js',
-               'styles' => 'resources/src/mediawiki.special/mediawiki.special.upload.css',
                'messages' => [
                        'widthheight',
                        'size-bytes',
@@ -1915,6 +1918,7 @@ return [
                        'prefs-editing',
                ],
                'dependencies' => [
+                       'mediawiki.special.upload.styles',
                        'jquery.spinner',
                        'mediawiki.jqueryMsg',
                        'mediawiki.api',
@@ -1925,6 +1929,9 @@ return [
                        'user.options',
                ],
        ],
+       'mediawiki.special.upload.styles' => [
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.upload.styles.css',
+       ],
        'mediawiki.special.userlogin.common.styles' => [
                'styles' => [
                        'resources/src/mediawiki.special/mediawiki.special.userlogin.common.css',
index 835383e..95e92ae 100644 (file)
@@ -3,7 +3,6 @@
        visibility: hidden;
 }
 
-span.updatedmarker {
-       color: #000;
-       background-color: #0f0;
+.updatedmarker {
+       background-color: #b7f430;
 }
index d04e3a6..d387a2d 100644 (file)
@@ -249,6 +249,9 @@ div.thumbinner {
        padding: 3px !important;
        font-size: 94%;
        text-align: center;
+       /* new block formatting context,
+        * to clear background from floating content  */
+       overflow: hidden;
 }
 
 html .thumbimage {
@@ -261,8 +264,6 @@ html .thumbcaption {
        line-height: 1.4em;
        padding: 3px !important;
        font-size: 94%;
-       overflow: hidden;
-       word-wrap: break-word;
 }
 
 /* @noflip */
index c1b671b..7ccf59e 100644 (file)
@@ -90,6 +90,9 @@ div.thumbinner {
        background-color: #f9f9f9;
        font-size: 94%;
        text-align: center;
+       /* new block formatting context,
+        * to clear background from floating content  */
+       overflow: hidden;
 }
 
 html .thumbimage {
@@ -102,8 +105,6 @@ html .thumbcaption {
        padding: 3px;
        font-size: 94%;
        text-align: left;
-       overflow: hidden;
-       word-wrap: break-word;
 }
 
 div.magnify {
@@ -293,10 +294,6 @@ span.unpatrolled {
        color: #f00;
 }
 
-.updatedmarker {
-       background-color: #b7f430;
-}
-
 div.gallerybox {
        width: 150px;
 }
index 3dacf64..85bf9f6 100644 (file)
@@ -152,6 +152,9 @@ div.thumbinner {
        background-color: #f9f9f9;
        font-size: 94%;
        text-align: center;
+       /* new block formatting context,
+        * to clear background from floating content  */
+       overflow: hidden;
 }
 
 html .thumbimage {
@@ -163,8 +166,6 @@ html .thumbcaption {
        line-height: 1.4em;
        padding: 3px;
        font-size: 94%;
-       overflow: hidden;
-       word-wrap: break-word;
        /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
        text-align: left;
 }
index afad5c6..2704514 100644 (file)
Binary files a/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png and b/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png differ
index 4ccc943..c8b2645 100644 (file)
Binary files a/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png and b/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png differ
index 8b07721..4ca2096 100644 (file)
        clear: both;
 }
 
+textarea {
+       /* Support Firefox: Border rule required to override system appearance on Linux */
+       border: 1px solid #c0c0c0;
+}
+
 .editOptions {
        background-color: #f0f0f0;
        border: 1px solid #c0c0c0;
index 7aeafec..3d90307 100644 (file)
        *
        * @class mw.special.ApiSandbox
        */
-       mw.special.ApiSandbox = ApiSandbox = {
+       ApiSandbox = {
                /**
                 * Initialize the UI
                 *
 
        $( ApiSandbox.init );
 
+       module.exports = ApiSandbox;
+
 }( jQuery, mediaWiki, OO ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.js b/resources/src/mediawiki.special/mediawiki.special.js
deleted file mode 100644 (file)
index 630d162..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- * Namespace for mediawiki.special.* modules
- */
-
-/**
- * @class mw.special
- * @singleton
- */
-mediaWiki.special = {};
index d43b62b..bdd45bc 100644 (file)
@@ -34,6 +34,6 @@
 
        $( rc.init );
 
-       mw.special.recentchanges = rc;
+       module.exports = rc;
 
 }( mediaWiki, jQuery ) );
index 850957e..aad784e 100644 (file)
@@ -1,181 +1,9 @@
-/* Special:Search */
-
-/*
- * Fixes sister projects box moving down the extract
- * of the first result (bug #16886).
- * It only happens when the window is small and
- * This changes slightly the layout for big screens
- * where there was space for the extracts and the
- * sister projects and thus it showed like in any
- * other browser.
- *
- * This will only affect IE 7 and lower
- */
-.searchresult {
-       display: inline !ie;
-}
-.searchresults {
-       margin: 1em 0 1em .4em;
-}
-/* needs extra specificity to override `.mw-body p` selector */
-.mw-body p.mw-search-nonefound {
-       margin: 0;
-}
-.mw-search-interwiki-header {
-       font-weight: bold;
-}
-.mw-search-nonefound + .mw-search-interwiki-header {
-       margin-top: 0;
-}
-div.searchresult {
-       font-size: 95%;
-       width: 38em;
-}
-.mw-search-results {
-       margin-left: 0;
-       float: left;
-}
-.mw-search-results li {
-       padding-bottom: 1.2em;
-       list-style: none;
-       list-style-image: none;
-}
-.mw-search-results li a {
-       font-size: 108%;
-}
-.mw-search-result-data {
-       color: #008000;
-       font-size: 97%;
-}
-.mw-search-profile-tabs {
-       background-color: #f3f3f3;
-       margin-top: 1em;
-       border: 1px solid #c0c0c0;
-}
-.mw-search-profile-tabs div.search-types {
-       float: left;
-       padding-left: 0.25em;
-}
-.mw-search-profile-tabs div.search-types ul {
-       margin: 0;
-       padding: 0;
-       list-style: none;
-}
-.mw-search-profile-tabs div.search-types ul li {
-       float: left;
-       margin: 0;
-       padding: 0;
-}
-.mw-search-profile-tabs div.search-types ul li a {
-       display: block;
-       padding: 0.5em;
-}
-.mw-search-profile-tabs div.search-types ul li.current a {
-       color: #333;
-       cursor: default;
-}
-.mw-search-profile-tabs div.search-types ul li.current a:hover {
-       text-decoration: none;
-}
-#mw-search-top-table div.results-info {
-       float: right;
-       padding: 0.5em;
-       padding-right: 0.75em;
-       color: #666;
-       font-size: 95%;
-}
-
-fieldset#mw-searchoptions {
-       margin: 0;
-       padding: 0.5em 0.75em 0.75em 0.75em;
-       border: none;
-       background-color: #f9f9f9;
-       border: 1px solid #c0c0c0;
-       border-top-width: 0;
-}
-fieldset#mw-searchoptions legend {
-       display: none;
-}
-fieldset#mw-searchoptions h4 {
-       padding: 0;
-       margin: 0;
-       float: left;
-}
-fieldset#mw-searchoptions div#mw-search-togglebox {
+#mw-search-togglebox {
        float: right;
 }
-fieldset#mw-searchoptions div#mw-search-togglebox label {
+#mw-search-togglebox label {
        margin-right: 0.25em;
 }
-fieldset#mw-searchoptions div#mw-search-togglebox input {
+#mw-search-togglebox input {
        margin-left: 0.25em;
 }
-fieldset#mw-searchoptions table {
-       float: left;
-       margin-right: 3em;
-       border-collapse: collapse;
-}
-fieldset#mw-searchoptions table td {
-       padding: 0 1em 0 0;
-       white-space: nowrap;
-}
-fieldset#mw-searchoptions div.divider {
-       clear: both;
-       border-bottom: 1px solid #ddd;
-       padding-top: 0.5em;
-       margin-bottom: 0.5em;
-}
-td#mw-search-menu {
-       padding-left: 6em;
-       font-size: 85%;
-}
-div#mw-search-interwiki {
-       float: right;
-       width: 18em;
-       border: 1px solid #aaa;
-       margin-top: 2ex;
-}
-div#mw-search-interwiki li {
-       font-size: 95%;
-}
-.mw-search-interwiki-more {
-       float: right;
-       font-size: 90%;
-}
-div#mw-search-interwiki-caption {
-       text-align: center;
-       font-weight: bold;
-       font-size: 95%;
-}
-.mw-search-interwiki-project {
-       font-size: 97%;
-       text-align: left;
-       padding: 0.15em 0.15em 0.2em 0.2em;
-       background-color: #ececec;
-       border-top: 1px solid #bbb;
-}
-span.searchalttitle {
-       font-size: 95%;
-}
-div.searchdidyoumean {
-       font-size: 127%;
-       margin-top: 0.8em;
-       /* Note that this color won't affect the link, as desired. */
-       color: #c00;
-}
-div.searchdidyoumean em {
-       font-weight: bold;
-}
-.searchmatch {
-       font-weight: bold;
-}
-/* Advanced PowerSearch box */
-td#mw-search-togglebox {
-       text-align: right;
-}
-table#mw-search-powertable {
-       width: 100%;
-}
-form#powersearch {
-       clear: both;
-}
diff --git a/resources/src/mediawiki.special/mediawiki.special.search.styles.css b/resources/src/mediawiki.special/mediawiki.special.search.styles.css
new file mode 100644 (file)
index 0000000..e8fda84
--- /dev/null
@@ -0,0 +1,161 @@
+/* Special:Search */
+
+/*
+ * Fixes sister projects box moving down the extract
+ * of the first result (bug #16886).
+ * It only happens when the window is small and
+ * This changes slightly the layout for big screens
+ * where there was space for the extracts and the
+ * sister projects and thus it showed like in any
+ * other browser.
+ *
+ * This will only affect IE 7 and lower
+ */
+.searchresult {
+       display: inline !ie;
+}
+.searchresults {
+       margin: 1em 0 1em .4em;
+}
+/* needs extra specificity to override `.mw-body p` selector */
+.mw-body p.mw-search-nonefound {
+       margin: 0;
+}
+.mw-search-interwiki-header {
+       font-weight: bold;
+}
+.mw-search-nonefound + .mw-search-interwiki-header {
+       margin-top: 0;
+}
+div.searchresult {
+       font-size: 95%;
+       width: 38em;
+}
+.mw-search-results {
+       margin-left: 0;
+       float: left;
+}
+.mw-search-results li {
+       padding-bottom: 1.2em;
+       list-style: none;
+       list-style-image: none;
+}
+.mw-search-results li a {
+       font-size: 108%;
+}
+.mw-search-result-data {
+       color: #008000;
+       font-size: 97%;
+}
+.mw-search-profile-tabs {
+       background-color: #f3f3f3;
+       margin-top: 1em;
+       border: 1px solid #c0c0c0;
+}
+.mw-search-profile-tabs div.search-types {
+       float: left;
+       padding-left: 0.25em;
+}
+.mw-search-profile-tabs div.search-types ul {
+       margin: 0;
+       padding: 0;
+       list-style: none;
+}
+.mw-search-profile-tabs div.search-types ul li {
+       float: left;
+       margin: 0;
+       padding: 0;
+}
+.mw-search-profile-tabs div.search-types ul li a {
+       display: block;
+       padding: 0.5em;
+}
+.mw-search-profile-tabs div.search-types ul li.current a {
+       color: #333;
+       cursor: default;
+}
+.mw-search-profile-tabs div.search-types ul li.current a:hover {
+       text-decoration: none;
+}
+#mw-search-top-table div.results-info {
+       float: right;
+       padding: 0.5em;
+       padding-right: 0.75em;
+       color: #666;
+       font-size: 95%;
+}
+fieldset#mw-searchoptions {
+       margin: 0;
+       padding: 0.5em 0.75em 0.75em 0.75em;
+       border: none;
+       background-color: #f9f9f9;
+       border: 1px solid #c0c0c0;
+       border-top-width: 0;
+}
+fieldset#mw-searchoptions legend {
+       display: none;
+}
+fieldset#mw-searchoptions h4 {
+       padding: 0;
+       margin: 0;
+       float: left;
+}
+fieldset#mw-searchoptions table {
+       float: left;
+       margin-right: 3em;
+       border-collapse: collapse;
+}
+fieldset#mw-searchoptions table td {
+       padding: 0 1em 0 0;
+       white-space: nowrap;
+}
+fieldset#mw-searchoptions div.divider {
+       clear: both;
+       border-bottom: 1px solid #ddd;
+       padding-top: 0.5em;
+       margin-bottom: 0.5em;
+}
+td#mw-search-menu {
+       padding-left: 6em;
+       font-size: 85%;
+}
+div#mw-search-interwiki {
+       float: right;
+       width: 18em;
+       border: 1px solid #aaa;
+       margin-top: 2ex;
+}
+div#mw-search-interwiki li {
+       font-size: 95%;
+}
+.mw-search-interwiki-more {
+       float: right;
+       font-size: 90%;
+}
+div#mw-search-interwiki-caption {
+       text-align: center;
+       font-weight: bold;
+       font-size: 95%;
+}
+.mw-search-interwiki-project {
+       font-size: 97%;
+       text-align: left;
+       padding: 0.15em 0.15em 0.2em 0.2em;
+       background-color: #ececec;
+       border-top: 1px solid #bbb;
+}
+span.searchalttitle {
+       font-size: 95%;
+}
+div.searchdidyoumean {
+       font-size: 127%;
+       margin-top: 0.8em;
+       /* Note that this color won't affect the link, as desired. */
+       color: #c00;
+}
+div.searchdidyoumean em {
+       font-weight: bold;
+}
+.searchmatch {
+       font-weight: bold;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.upload.css b/resources/src/mediawiki.special/mediawiki.special.upload.css
deleted file mode 100644 (file)
index b916248..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/*!
- * Styling for Special:Upload
- */
-.mw-destfile-warning {
-       border: 1px solid #fde29b;
-       padding: .5em 1em;
-       margin-bottom: 1em;
-       color: #705000;
-       background-color: #fdf1d1;
-}
diff --git a/resources/src/mediawiki.special/mediawiki.special.upload.styles.css b/resources/src/mediawiki.special/mediawiki.special.upload.styles.css
new file mode 100644 (file)
index 0000000..b916248
--- /dev/null
@@ -0,0 +1,10 @@
+/*!
+ * Styling for Special:Upload
+ */
+.mw-destfile-warning {
+       border: 1px solid #fde29b;
+       padding: .5em 1em;
+       margin-bottom: 1em;
+       color: #705000;
+       background-color: #fdf1d1;
+}
index 16fec73..0f61d97 100644 (file)
 
                                                // Update license messages
                                                return msgPromise.then( function () {
-                                                       booklet.$ownWorkMessage
-                                                               .msg( 'upload-form-label-own-work-message-' + msgs )
-                                                               .find( 'a' ).attr( 'target', '_blank' );
-                                                       booklet.$notOwnWorkMessage
-                                                               .msg( 'upload-form-label-not-own-work-message-' + msgs )
-                                                               .find( 'a' ).attr( 'target', '_blank' );
-                                                       booklet.$notOwnWorkLocal
-                                                               .msg( 'upload-form-label-not-own-work-local-' + msgs )
-                                                               .find( 'a' ).attr( 'target', '_blank' );
+                                                       var $labels;
+                                                       booklet.$ownWorkMessage.msg( 'upload-form-label-own-work-message-' + msgs );
+                                                       booklet.$notOwnWorkMessage.msg( 'upload-form-label-not-own-work-message-' + msgs );
+                                                       booklet.$notOwnWorkLocal.msg( 'upload-form-label-not-own-work-local-' + msgs );
+
+                                                       $labels = $( [
+                                                               booklet.$ownWorkMessage[ 0 ],
+                                                               booklet.$notOwnWorkMessage[ 0 ],
+                                                               booklet.$notOwnWorkLocal[ 0 ]
+                                                       ] );
+
+                                                       // Improve the behavior of links inside these labels, which may point to important
+                                                       // things like licensing requirements or terms of use
+                                                       $labels.find( 'a' )
+                                                               .attr( 'target', '_blank' )
+                                                               .on( 'click', function ( e ) {
+                                                                       // OO.ui.FieldLayout#onLabelClick is trying to prevent default on all clicks,
+                                                                       // which causes the links to not be openable. Don't let it do that.
+                                                                       e.stopPropagation();
+                                                               } );
                                                } );
                                        } )
                                );
index 54620f4..3cca6eb 100644 (file)
@@ -95,6 +95,7 @@ a.mw-debug-panelabel:visited {
        height: 300px;
        overflow: scroll;
        display: none;
+       font-family: monospace;
        font-size: 11px;
        background-color: #e1eff2;
        box-sizing: border-box;
index ebb6d90..8b100a2 100644 (file)
@@ -46,6 +46,7 @@ $wgAutoloadClasses += [
        'ResourceLoaderTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'ResourceLoaderFileModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'TestUser' => "$testDir/phpunit/includes/TestUser.php",
+       'TestUserRegistry' => "$testDir/phpunit/includes/TestUserRegistry.php",
        'LessFileCompilationTest' => "$testDir/phpunit/LessFileCompilationTest.php",
 
        # tests/phpunit/includes
index 910e9ae..523953c 100644 (file)
@@ -2269,9 +2269,11 @@ Entities inside <pre>
 <nowiki> inside of #tag:pre
 !! wikitext
 {{#tag:pre|Foo <nowiki>&rarr;bar</nowiki>}}
-!! html
+!! html/php
 <pre>Foo &#8594;bar</pre>
 
+!! html/parsoid
+<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:pre","function":"#tag"},"params":{"1":{"wt":"Foo &lt;nowiki>&amp;rarr;bar&lt;/nowiki>"}},"i":0}}]}'>Foo <span typeof="mw:Entity">→</span>bar</pre>
 !! end
 
 !! test
@@ -2822,7 +2824,7 @@ parsoid
 !! wikitext
 {{echo|[{{fullurl:{{FULLPAGENAME}}|action=edit}} bar]}}
 !! html
-<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{fullurl:{{FULLPAGENAME}}|action=edit}} bar]"}},"i":0}}]}'>[Main Page bar]</p>
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{fullurl:{{FULLPAGENAME}}|action=edit}} bar]"}},"i":0}}]}'>[Main_Page bar]</p>
 !! end
 
 !! test
@@ -7489,7 +7491,7 @@ Example for such a section: == < ==
 <p><a href="#.3C">#&lt;</a><a href="#.3E">#&gt;</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main%20Page#%3C" title="Main Page">#&lt;</a><a rel="mw:WikiLink" href="./Main%20Page#%3E" title="Main Page">#></a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page#%3C" title="Main Page">#&lt;</a><a rel="mw:WikiLink" href="./Main_Page#%3E" title="Main Page">#></a></p>
 !! end
 
 !! test
@@ -9940,7 +9942,7 @@ Parsoid: Page property magic word with magic word contents
 !! wikitext
 {{DISPLAYTITLE:''{{PAGENAME}}''}}
 !! html/parsoid
-<meta property="mw:PageProp/displaytitle" content="Main Page" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"src":"{{DISPLAYTITLE:&#39;&#39;{{PAGENAME}}&#39;&#39;}}"}' data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[15,31,2,2]}&#39;>&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[17,29,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"PAGENAME\",\"function\":\"pagename\"},\"params\":{},\"i\":0}}]}&#39;>Main Page&lt;/span>&lt;/i>"}]]}'/>
+<meta property="mw:PageProp/displaytitle" content="Main_Page" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"src":"{{DISPLAYTITLE:&#39;&#39;{{PAGENAME}}&#39;&#39;}}"}' data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[15,31,2,2]}&#39;>&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[17,29,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"PAGENAME\",\"function\":\"pagename\"},\"params\":{},\"i\":0}}]}&#39;>Main_Page&lt;/span>&lt;/i>"}]]}'/>
 !! end
 
 !! test
@@ -13953,7 +13955,7 @@ Redirected image
 !! wikitext
 [[Image:Barfoo.jpg]]
 !! html/php
-<p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg" class="mw-redirect">File:Barfoo.jpg</a>
+<p><a href="/wiki/File:Barfoo.jpg" class="mw-redirect" title="File:Barfoo.jpg">File:Barfoo.jpg</a>
 </p>
 !! end
 
index 9672cdc..47d96e1 100644 (file)
@@ -127,6 +127,42 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                self::prepareServices( new GlobalVarConfig() );
        }
 
+       /**
+        * Convenience method for getting an immutable test user
+        *
+        * @since 1.28
+        *
+        * @param string[] $groups Groups the test user should be in.
+        * @return TestUser
+        */
+       public static function getTestUser( $groups = [] ) {
+               return TestUserRegistry::getImmutableTestUser( $groups );
+       }
+
+       /**
+        * Convenience method for getting a mutable test user
+        *
+        * @since 1.28
+        *
+        * @param string[] $groups Groups the test user should be added in.
+        * @return TestUser
+        */
+       public static function getMutableTestUser( $groups = [] ) {
+               return TestUserRegistry::getMutableTestUser( __CLASS__, $groups );
+       }
+
+       /**
+        * Convenience method for getting an immutable admin test user
+        *
+        * @since 1.28
+        *
+        * @param string[] $groups Groups the test user should be added to.
+        * @return TestUser
+        */
+       public static function getTestSysop() {
+               return self::getTestUser( [ 'sysop', 'bureaucrat' ] );
+       }
+
        /**
         * Prepare service configuration for unit testing.
         *
@@ -321,7 +357,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $needsResetDB = false;
 
-               if ( $this->needsDB() ) {
+               if ( !self::$dbSetup || $this->needsDB() ) {
                        // set up a DB connection for this test to use
 
                        self::$useTemporaryTables = !$this->getCliArg( 'use-normal-tables' );
@@ -883,7 +919,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        protected function insertPage( $pageName, $text = 'Sample page for unit test.' ) {
                $title = Title::newFromText( $pageName, 0 );
 
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $comment = __METHOD__ . ': Sample page for unit test.';
 
                // Avoid memory leak...?
@@ -934,36 +970,33 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                        # Insert 0 user to prevent FK violations
                        # Anonymous user
-                       $this->db->insert( 'user', [
-                               'user_id' => 0,
-                               'user_name' => 'Anonymous' ], __METHOD__, [ 'IGNORE' ] );
+                       if ( !$this->db->selectField( 'user', '1', [ 'user_id' => 0 ] ) ) {
+                               $this->db->insert( 'user', [
+                                       'user_id' => 0,
+                                       'user_name' => 'Anonymous' ], __METHOD__, [ 'IGNORE' ] );
+                       }
 
                        # Insert 0 page to prevent FK violations
                        # Blank page
-                       $this->db->insert( 'page', [
-                               'page_id' => 0,
-                               'page_namespace' => 0,
-                               'page_title' => ' ',
-                               'page_restrictions' => null,
-                               'page_is_redirect' => 0,
-                               'page_is_new' => 0,
-                               'page_random' => 0,
-                               'page_touched' => $this->db->timestamp(),
-                               'page_latest' => 0,
-                               'page_len' => 0 ], __METHOD__, [ 'IGNORE' ] );
+                       if ( !$this->db->selectField( 'page', '1', [ 'page_id' => 0 ] ) ) {
+                               $this->db->insert( 'page', [
+                                       'page_id' => 0,
+                                       'page_namespace' => 0,
+                                       'page_title' => ' ',
+                                       'page_restrictions' => null,
+                                       'page_is_redirect' => 0,
+                                       'page_is_new' => 0,
+                                       'page_random' => 0,
+                                       'page_touched' => $this->db->timestamp(),
+                                       'page_latest' => 0,
+                                       'page_len' => 0 ], __METHOD__, [ 'IGNORE' ] );
+                       }
                }
 
                User::resetIdByNameCache();
 
                // Make sysop user
-               $user = User::newFromName( 'UTSysop' );
-
-               if ( $user->idForName() == 0 ) {
-                       $user->addToDatabase();
-                       TestUser::setPasswordForUser( $user, 'UTSysopPassword' );
-                       $user->addGroup( 'sysop' );
-                       $user->addGroup( 'bureaucrat' );
-               }
+               $user = static::getTestSysop()->getUser();
 
                // Make 1 page with 1 revision
                $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
@@ -1187,6 +1220,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                TestingAccessWrapper::newFromClass( 'User' )
                                        ->getInProcessCache()
                                        ->clear();
+
+                               TestUserRegistry::clear();
                        }
 
                        $truncate = in_array( $db->getType(), [ 'oracle', 'mysql' ] );
index 1bf8729..b7f7880 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  */
@@ -34,35 +36,35 @@ class LinkerTest extends MediaWikiLangTestCase {
                        # ## ANONYMOUS USER ########################################
                        [
                                '<a href="/wiki/Special:Contributions/JohnDoe" '
-                                       . 'title="Special:Contributions/JohnDoe" '
-                                       . 'class="mw-userlink mw-anonuserlink">JohnDoe</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/JohnDoe">JohnDoe</a>',
                                0, 'JohnDoe', false,
                        ],
                        [
                                '<a href="/wiki/Special:Contributions/::1" '
-                                       . 'title="Special:Contributions/::1" '
-                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/::1">::1</a>',
                                0, '::1', false,
                                'Anonymous with pretty IPv6'
                        ],
                        [
                                '<a href="/wiki/Special:Contributions/0:0:0:0:0:0:0:1" '
-                                       . 'title="Special:Contributions/0:0:0:0:0:0:0:1" '
-                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/0:0:0:0:0:0:0:1">::1</a>',
                                0, '0:0:0:0:0:0:0:1', false,
                                'Anonymous with almost pretty IPv6'
                        ],
                        [
                                '<a href="/wiki/Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" '
-                                       . 'title="Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" '
-                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001">::1</a>',
                                0, '0000:0000:0000:0000:0000:0000:0000:0001', false,
                                'Anonymous with full IPv6'
                        ],
                        [
                                '<a href="/wiki/Special:Contributions/::1" '
-                                       . 'title="Special:Contributions/::1" '
-                                       . 'class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/::1">AlternativeUsername</a>',
                                0, '::1', 'AlternativeUsername',
                                'Anonymous with pretty IPv6 and an alternative username'
                        ],
@@ -70,15 +72,15 @@ class LinkerTest extends MediaWikiLangTestCase {
                        # IPV4
                        [
                                '<a href="/wiki/Special:Contributions/127.0.0.1" '
-                                       . 'title="Special:Contributions/127.0.0.1" '
-                                       . 'class="mw-userlink mw-anonuserlink">127.0.0.1</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/127.0.0.1">127.0.0.1</a>',
                                0, '127.0.0.1', false,
                                'Anonymous with IPv4'
                        ],
                        [
                                '<a href="/wiki/Special:Contributions/127.0.0.1" '
-                                       . 'title="Special:Contributions/127.0.0.1" '
-                                       . 'class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/127.0.0.1">AlternativeUsername</a>',
                                0, '127.0.0.1', 'AlternativeUsername',
                                'Anonymous with IPv4 and an alternative username'
                        ],
@@ -361,6 +363,7 @@ class LinkerTest extends MediaWikiLangTestCase {
        }
 
        /**
+        * @covers MediaWiki\Linker\LinkRenderer::runLegacyBeginHook
         * @dataProvider provideLinkBeginHook
         */
        public function testLinkBeginHook( $callback, $expected ) {
@@ -407,6 +410,7 @@ class LinkerTest extends MediaWikiLangTestCase {
        }
 
        /**
+        * @covers MediaWiki\Linker\LinkRenderer::buildAElement
         * @dataProvider provideLinkEndHook
         */
        public function testLinkEndHook( $callback, $expected ) {
@@ -420,4 +424,53 @@ class LinkerTest extends MediaWikiLangTestCase {
                $out = Linker::link( $title );
                $this->assertEquals( $expected, $out );
        }
+
+       /**
+        * @covers Linker::getLinkColour
+        */
+       public function testGetLinkColour() {
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+               $foobarTitle = Title::makeTitle( NS_MAIN, 'FooBar' );
+               $redirectTitle = Title::makeTitle( NS_MAIN, 'Redirect' );
+               $userTitle = Title::makeTitle( NS_USER, 'Someuser' );
+               $linkCache->addGoodLinkObj(
+                       1, // id
+                       $foobarTitle,
+                       10, // len
+                       0 // redir
+               );
+               $linkCache->addGoodLinkObj(
+                       2, // id
+                       $redirectTitle,
+                       10, // len
+                       1 // redir
+               );
+
+               $linkCache->addGoodLinkObj(
+                       3, // id
+                       $userTitle,
+                       10, // len
+                       0 // redir
+               );
+
+               $this->assertEquals(
+                       '',
+                       Linker::getLinkColour( $foobarTitle, 0 )
+               );
+
+               $this->assertEquals(
+                       'stub',
+                       Linker::getLinkColour( $foobarTitle, 20 )
+               );
+
+               $this->assertEquals(
+                       'mw-redirect',
+                       Linker::getLinkColour( $redirectTitle, 0 )
+               );
+
+               $this->assertEquals(
+                       '',
+                       Linker::getLinkColour( $userTitle, 20 )
+               );
+       }
 }
index 22f6fa6..f44ae32 100644 (file)
@@ -97,13 +97,12 @@ class MergeHistoryTest extends MediaWikiTestCase {
                );
 
                // Sysop with mergehistory permission
-               $sysop = User::newFromName( 'UTSysop' );
+               $sysop = static::getTestSysop()->getUser();
                $status = $mh->checkPermissions( $sysop, '' );
                $this->assertTrue( $status->isOK() );
 
                // Normal user
-               $notSysop = User::newFromName( 'UTNotSysop' );
-               $notSysop->addToDatabase();
+               $notSysop = static::getTestUser()->getUser();
                $status = $mh->checkPermissions( $notSysop, '' );
                $this->assertTrue( $status->hasMessage( 'mergehistory-fail-permission' ) );
        }
@@ -118,7 +117,8 @@ class MergeHistoryTest extends MediaWikiTestCase {
                        Title::newFromText( 'Merge2' )
                );
 
-               $mh->merge( User::newFromName( 'UTSysop' ) );
+               $sysop = static::getTestSysop()->getUser();
+               $mh->merge( $sysop );
                $this->assertEquals( $mh->getMergedRevisionCount(), 1 );
        }
 }
diff --git a/tests/phpunit/includes/TestUserRegistry.php b/tests/phpunit/includes/TestUserRegistry.php
new file mode 100644 (file)
index 0000000..4818b49
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+
+/**
+ * @since 1.28
+ */
+class TestUserRegistry {
+
+       /** @var TestUser[] (group key => TestUser) */
+       private static $testUsers = [];
+
+       /** @var int Count of users that have been generated */
+       private static $counter = 0;
+
+       /** @var int Random int, included in IDs */
+       private static $randInt;
+
+       public static function getNextId() {
+               if ( !self::$randInt ) {
+                       self::$randInt = mt_rand( 1, 0xFFFFFF );
+               }
+               return sprintf( '%06x.%03x', self::$randInt, ++self::$counter );
+       }
+
+       /**
+        * Get a TestUser object that the caller may modify.
+        *
+        * @since 1.28
+        *
+        * @param string $testName Caller's __CLASS__. Used to generate the
+        *  user's username.
+        * @param string[] $groups Groups the test user should be added to.
+        * @return TestUser
+        */
+       public static function getMutableTestUser( $testName, $groups = [] ) {
+               $id = self::getNextId();
+               $password = wfRandomString( 20 );
+               $testUser = new TestUser(
+                       "TestUser $testName $id",  // username
+                       "Name $id",                // real name
+                       "$id@mediawiki.test",      // e-mail
+                       $groups,                   // groups
+                       $password                  // password
+               );
+               $testUser->getUser()->clearInstanceCache();
+               return $testUser;
+       }
+
+       /**
+        * Get a TestUser object that the caller may not modify.
+        *
+        * Whenever possible, unit tests should use immutable users, because
+        * immutable users can be reused in multiple tests, which helps keep
+        * the unit tests fast.
+        *
+        * @since 1.28
+        *
+        * @param string[] $groups Groups the test user should be added to.
+        * @return TestUser
+        */
+       public static function getImmutableTestUser( $groups = [] ) {
+               $groups = array_unique( $groups );
+               sort( $groups );
+               $key = implode( ',', $groups );
+
+               $testUser = isset( self::$testUsers[$key] )
+                       ? self::$testUsers[$key]
+                       : false;
+
+               if ( !$testUser || !$testUser->getUser()->isLoggedIn() ) {
+                       $id = self::getNextId();
+                       // Hack! If this is the primary sysop account, make the username
+                       // be 'UTSysop', for back-compat, and for the sake of PHPUnit data
+                       // provider methods, which are executed before the test database
+                       // is set up. See T136348.
+                       if ( $groups === [ 'bureaucrat', 'sysop' ] ) {
+                               $username = 'UTSysop';
+                               $password = 'UTSysopPassword';
+                       } else {
+                               $username = "TestUser $id";
+                               $password = wfRandomString( 20 );
+                       }
+                       self::$testUsers[$key] = $testUser = new TestUser(
+                               $username,            // username
+                               "Name $id",           // real name
+                               "$id@mediawiki.test", // e-mail
+                               $groups,              // groups
+                               $password             // password
+                       );
+               }
+
+               $testUser->getUser()->clearInstanceCache();
+               return self::$testUsers[$key];
+       }
+
+       /**
+        * Clear the registry.
+        *
+        * TestUsers created by this class will not be deleted, but any handles
+        * to existing immutable TestUsers will be deleted, ensuring these users
+        * are not reused. We don't reset the counter or random string by design.
+        *
+        * @since 1.28
+        *
+        * @param string[] $groups Groups the test user should be added to.
+        * @return TestUser
+        */
+       public static function clear() {
+               self::$testUsers = [];
+       }
+}
index f1f9295..def9c5d 100644 (file)
@@ -21,14 +21,12 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               self::$users['ApiQueryWatchlistIntegrationTestUser']
-                       = new TestUser( 'ApiQueryWatchlistIntegrationTestUser' );
-               self::$users['ApiQueryWatchlistIntegrationTestUser2']
-                       = new TestUser( 'ApiQueryWatchlistIntegrationTestUser2' );
+               self::$users['ApiQueryWatchlistIntegrationTestUser'] = $this->getMutableTestUser();
+               self::$users['ApiQueryWatchlistIntegrationTestUser2'] = $this->getMutableTestUser();
                $this->doLogin( 'ApiQueryWatchlistIntegrationTestUser' );
        }
 
-       private function getTestUser() {
+       private function getLoggedInTestUser() {
                return self::$users['ApiQueryWatchlistIntegrationTestUser']->getUser();
        }
 
@@ -36,10 +34,6 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                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 );
@@ -244,7 +238,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        private function cleanTestUsersWatchlist() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $store = $this->getWatchedItemStore();
                $items = $store->getWatchedItemsForUser( $user );
                foreach ( $items as $item ) {
@@ -257,7 +251,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                // the user with the same user ID as user used here as the test user
                $this->cleanTestUsersWatchlist();
 
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -290,7 +284,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testIdsPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -311,7 +305,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testTitlePropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
@@ -351,7 +345,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testFlagsPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $normalEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $minorEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageM' );
                $botEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageB' );
@@ -412,7 +406,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testUserPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $userEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $anonEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageA' );
                $this->doPageEdit(
@@ -447,7 +441,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testUserIdPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $userEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $anonEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageA' );
                $this->doPageEdit(
@@ -484,7 +478,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testCommentPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -508,7 +502,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testParsedCommentPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -532,7 +526,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testTimestampPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -551,7 +545,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testSizesPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -585,7 +579,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                        'Create the page'
                );
                $store = $this->getWatchedItemStore();
-               $store->addWatch( $this->getTestUser(), $target );
+               $store->addWatch( $this->getLoggedInTestUser(), $target );
                $store->updateNotificationTimestamp(
                        $otherUser,
                        $target,
@@ -620,7 +614,8 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testPatrolPropParameter() {
-               $user = $this->getSysopTestUser();
+               $testUser = static::getTestSysop();
+               $user = $testUser->getUser();
                $this->setupPatrolledSpecificFixtures( $user );
 
                $result = $this->doListWatchlistRequest( [ 'wlprop' => 'patrol', ], $user );
@@ -639,7 +634,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
 
        private function createPageAndDeleteIt( LinkTarget $target ) {
                $this->doPageEdit(
-                       $this->getTestUser(),
+                       $this->getLoggedInTestUser(),
                        $target,
                        'Some Content',
                        'Create the page that will be deleted'
@@ -651,7 +646,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->createPageAndDeleteIt( $target );
 
-               $this->watchPages( $this->getTestUser(), [ $target ] );
+               $this->watchPages( $this->getLoggedInTestUser(), [ $target ] );
 
                $result = $this->doListWatchlistRequest( [ 'wlprop' => 'loginfo', ] );
 
@@ -671,7 +666,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testEmptyPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -694,7 +689,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testNamespaceParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
@@ -729,7 +724,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testUserParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $otherUser = $this->getNonLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
@@ -766,7 +761,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testExcludeUserParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $otherUser = $this->getNonLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
@@ -803,7 +798,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testShowMinorParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
                        $user,
@@ -837,7 +832,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testShowBotParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doBotPageEdit(
                        $user,
@@ -861,7 +856,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testShowAnonParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doAnonPageEdit(
                        $target,
@@ -890,7 +885,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testShowUnreadParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $otherUser = $this->getNonLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
@@ -948,7 +943,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testShowPatrolledParams() {
-               $user = $this->getSysopTestUser();
+               $user = static::getTestSysop()->getUser();
                $this->setupPatrolledSpecificFixtures( $user );
 
                $resultPatrolled = $this->doListWatchlistRequest( [
@@ -974,7 +969,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testNewAndEditTypeParameters() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
@@ -1025,7 +1020,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testLogTypeParameters() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->createPageAndDeleteIt( $subjectTarget );
@@ -1093,7 +1088,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testExternalTypeParameters() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
@@ -1129,7 +1124,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testCategorizeTypeParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $categoryTarget = new TitleValue( NS_CATEGORY, 'ApiQueryWatchlistIntegrationTestCategory' );
                $this->doPageEdits(
@@ -1180,7 +1175,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testLimitParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target1 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $target2 = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $target3 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage2' );
@@ -1249,7 +1244,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testAllRevParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
                        $user,
@@ -1299,7 +1294,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testDirParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
@@ -1355,7 +1350,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testStartEndParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -1390,7 +1385,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testContinueParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target1 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $target2 = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $target3 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage2' );
@@ -1456,7 +1451,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        public function testOwnerAndTokenParams() {
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
-                       $this->getTestUser(),
+                       $this->getLoggedInTestUser(),
                        $target,
                        'Some Content',
                        'Create the page'
@@ -1509,7 +1504,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testGeneratorWatchlistPropInfo_returnsWatchedPages() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -1541,7 +1536,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testGeneratorWatchlistPropRevisions_returnsWatchedItemsRevisions() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
                        $user,
index ff5640a..e90b46f 100644 (file)
@@ -8,11 +8,6 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         */
        protected $apiContext;
 
-       /**
-        * @var array
-        */
-       protected $tablesUsed = [ 'user', 'user_groups', 'user_properties' ];
-
        protected function setUp() {
                global $wgServer, $wgDisableAuthManager;
 
@@ -22,18 +17,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                ApiQueryInfo::resetTokenCache(); // tokens are invalid because we cleared the session
 
                self::$users = [
-                       'sysop' => new TestUser(
-                               'Apitestsysop',
-                               'Api Test Sysop',
-                               'api_test_sysop@example.com',
-                               [ 'sysop' ]
-                       ),
-                       'uploader' => new TestUser(
-                               'Apitestuser',
-                               'Api Test User',
-                               'api_test_user@example.com',
-                               []
-                       )
+                       'sysop' => static::getTestSysop(),
+                       'uploader' => static::getTestUser(),
                ];
 
                $this->setMwGlobals( [
@@ -162,15 +147,19 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                }
        }
 
-       protected function doLogin( $user = 'sysop' ) {
-               if ( !array_key_exists( $user, self::$users ) ) {
-                       throw new MWException( "Can not log in to undefined user $user" );
+       protected function doLogin( $testUser = 'sysop' ) {
+               if ( $testUser === null ) {
+                       $testUser = static::getTestSysop();
+               } elseif ( is_string( $testUser ) && array_key_exists( $testUser, self::$users ) ) {
+                       $testUser = self::$users[ $testUser ];
+               } elseif ( !$testUser instanceof TestUser ) {
+                       throw new MWException( "Can not log in to undefined user $testUser" );
                }
 
                $data = $this->doApiRequest( [
                        'action' => 'login',
-                       'lgname' => self::$users[$user]->username,
-                       'lgpassword' => self::$users[$user]->password ] );
+                       'lgname' => $testUser->username,
+                       'lgpassword' => $testUser->password ] );
 
                $token = $data[0]['login']['token'];
 
@@ -178,8 +167,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        [
                                'action' => 'login',
                                'lgtoken' => $token,
-                               'lgname' => self::$users[$user]->username,
-                               'lgpassword' => self::$users[$user]->password,
+                               'lgname' => $testUser->username,
+                               'lgpassword' => $testUser->password,
                        ],
                        $data[2]
                );
@@ -187,7 +176,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                if ( $data[0]['login']['result'] === 'Success' ) {
                        // DWIM
                        global $wgUser;
-                       $wgUser = self::$users[$user]->getUser();
+                       $wgUser = $testUser->getUser();
                        RequestContext::getMain()->setUser( $wgUser );
                }
 
index 377abe2..e681be0 100644 (file)
@@ -781,6 +781,12 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $userReq = new UsernameAuthenticationRequest;
                $userReq->username = 'UTDummy';
 
+               $req1->returnToUrl = 'http://localhost/';
+               $req2->returnToUrl = 'http://localhost/';
+               $req3->returnToUrl = 'http://localhost/';
+               $req3->username = 'UTDummy';
+               $userReq->returnToUrl = 'http://localhost/';
+
                // Passing one into beginAuthentication(), and an immediate FAIL
                $primary = $this->getMockForAbstractClass( AbstractPrimaryAuthenticationProvider::class );
                $this->primaryauthMocks = [ $primary ];
@@ -824,71 +830,29 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->assertSame( $req2, $ret->createRequest->createRequest );
                $this->assertEquals( [], $ret->createRequest->maybeLink );
 
-               // Pass into beginAccountCreation(), no createRequest, primary needs reqs
-               $primary = $this->getMockBuilder( AbstractPrimaryAuthenticationProvider::class )
-                       ->setMethods( [ 'testForAccountCreation' ] )
-                       ->getMockForAbstractClass();
+               // Pass into beginAccountCreation(), see that maybeLink and createRequest get copied
+               $primary = $this->getMockForAbstractClass( AbstractPrimaryAuthenticationProvider::class );
                $this->primaryauthMocks = [ $primary ];
                $this->initializeManager( true );
+               $createReq = new CreateFromLoginAuthenticationRequest( $req3, [ $req2 ] );
+               $createReq->returnToUrl = 'http://localhost/';
+               $createReq->username = 'UTDummy';
+               $res = AuthenticationResponse::newUI( [ $req1 ], wfMessage( 'foo' ) );
+               $primary->expects( $this->any() )->method( 'beginPrimaryAccountCreation' )
+                       ->with( $this->anything(), $this->anything(), [ $userReq, $createReq, $req3 ] )
+                       ->will( $this->returnValue( $res ) );
                $primary->expects( $this->any() )->method( 'accountCreationType' )
                        ->will( $this->returnValue( PrimaryAuthenticationProvider::TYPE_CREATE ) );
-               $primary->expects( $this->any() )->method( 'getAuthenticationRequests' )
-                       ->will( $this->returnValue( [ $req1 ] ) );
-               $primary->expects( $this->any() )->method( 'testForAccountCreation' )
-                       ->will( $this->returnValue( StatusValue::newFatal( 'fail' ) ) );
-               $createReq = new CreateFromLoginAuthenticationRequest(
-                       null, [ $req2->getUniqueId() => $req2 ]
-               );
                $this->logger->setCollect( true );
                $ret = $this->manager->beginAccountCreation(
                        $user, [ $userReq, $createReq ], 'http://localhost/'
                );
                $this->logger->setCollect( false );
                $this->assertSame( AuthenticationResponse::UI, $ret->status );
-               $this->assertCount( 4, $ret->neededRequests );
-               $this->assertSame( $req1, $ret->neededRequests[0] );
-               $this->assertInstanceOf( UsernameAuthenticationRequest::class, $ret->neededRequests[1] );
-               $this->assertInstanceOf( UserDataAuthenticationRequest::class, $ret->neededRequests[2] );
-               $this->assertInstanceOf( CreateFromLoginAuthenticationRequest::class, $ret->neededRequests[3] );
-               $this->assertSame( null, $ret->neededRequests[3]->createRequest );
-               $this->assertEquals( [], $ret->neededRequests[3]->maybeLink );
-
-               // Pass into beginAccountCreation(), with createRequest, primary needs reqs
-               $createReq = new CreateFromLoginAuthenticationRequest( $req2, [] );
-               $this->logger->setCollect( true );
-               $ret = $this->manager->beginAccountCreation(
-                       $user, [ $userReq, $createReq ], 'http://localhost/'
-               );
-               $this->logger->setCollect( false );
-               $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
-               $this->assertSame( 'fail', $ret->message->getKey() );
-
-               // Again, with a secondary needing reqs too
-               $secondary = $this->getMockBuilder( AbstractSecondaryAuthenticationProvider::class )
-                       ->getMockForAbstractClass();
-               $this->secondaryauthMocks = [ $secondary ];
-               $this->initializeManager( true );
-               $secondary->expects( $this->any() )->method( 'getAuthenticationRequests' )
-                       ->will( $this->returnValue( [ $req3 ] ) );
-               $createReq = new CreateFromLoginAuthenticationRequest( $req2, [] );
-               $this->logger->setCollect( true );
-               $ret = $this->manager->beginAccountCreation(
-                       $user, [ $userReq, $createReq ], 'http://localhost/'
-               );
-               $this->logger->setCollect( false );
-               $this->assertSame( AuthenticationResponse::UI, $ret->status );
-               $this->assertCount( 4, $ret->neededRequests );
-               $this->assertSame( $req3, $ret->neededRequests[0] );
-               $this->assertInstanceOf( UsernameAuthenticationRequest::class, $ret->neededRequests[1] );
-               $this->assertInstanceOf( UserDataAuthenticationRequest::class, $ret->neededRequests[2] );
-               $this->assertInstanceOf( CreateFromLoginAuthenticationRequest::class, $ret->neededRequests[3] );
-               $this->assertSame( $req2, $ret->neededRequests[3]->createRequest );
-               $this->assertEquals( [], $ret->neededRequests[3]->maybeLink );
-               $this->logger->setCollect( true );
-               $ret = $this->manager->continueAccountCreation( $ret->neededRequests );
-               $this->logger->setCollect( false );
-               $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
-               $this->assertSame( 'fail', $ret->message->getKey() );
+               $state = $this->request->getSession()->getSecret( 'AuthManager::accountCreationState' );
+               $this->assertNotNull( $state );
+               $this->assertEquals( [ $userReq, $createReq, $req3 ], $state['reqs'] );
+               $this->assertEquals( [ $req2 ], $state['maybeLink'] );
        }
 
        /**
index b676d69..44f2743 100644 (file)
@@ -461,14 +461,19 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         * @param StatusValue $expect
         */
        public function testProviderAllowsAuthenticationDataChange( $type, $allow, $expect ) {
+               $domains = $type instanceof PasswordDomainAuthenticationRequest ? [ 'foo', 'bar' ] : [];
                $plugin = $this->getMock( 'AuthPlugin' );
-               $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
+               $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( $domains );
                $plugin->expects( $allow === null ? $this->never() : $this->once() )
                        ->method( 'allowPasswordChange' )->will( $this->returnValue( $allow ) );
+               $plugin->expects( $this->any() )->method( 'validDomain' )
+                       ->willReturnCallback( function ( $d ) use ( $domains ) {
+                               return in_array( $d, $domains, true );
+                       } );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
 
-               if ( $type === PasswordAuthenticationRequest::class ) {
-                       $req = new $type();
+               if ( is_object( $type ) ) {
+                       $req = $type;
                } else {
                        $req = $this->getMock( $type );
                }
@@ -480,14 +485,28 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public static function provideProviderAllowsAuthenticationDataChange() {
+               $domains = [ 'foo', 'bar' ];
+               $reqNoDomain = new PasswordDomainAuthenticationRequest( $domains );
+               $reqValidDomain = new PasswordDomainAuthenticationRequest( $domains );
+               $reqValidDomain->domain = 'foo';
+               $reqInvalidDomain = new PasswordDomainAuthenticationRequest( $domains );
+               $reqInvalidDomain->domain = 'invalid';
+
                return [
                        [ AuthenticationRequest::class, null, \StatusValue::newGood( 'ignored' ) ],
-                       [ PasswordAuthenticationRequest::class, true, \StatusValue::newGood() ],
+                       [ new PasswordAuthenticationRequest, true, \StatusValue::newGood() ],
                        [
-                               PasswordAuthenticationRequest::class,
+                               new PasswordAuthenticationRequest,
                                false,
                                \StatusValue::newFatal( 'authmanager-authplugin-setpass-denied' )
                        ],
+                       [ $reqNoDomain, true, \StatusValue::newGood( 'ignored' ) ],
+                       [ $reqValidDomain, true, \StatusValue::newGood() ],
+                       [
+                               $reqInvalidDomain,
+                               true,
+                               \StatusValue::newFatal( 'authmanager-authplugin-setpass-bad-domain' )
+                       ],
                ];
        }
 
index 84a0ea6..cac031c 100644 (file)
@@ -243,14 +243,6 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
 
                $req1->required = AuthenticationRequest::PRIMARY_REQUIRED;
 
-               $fields = AuthenticationRequest::mergeFieldInfo( [ $req1 ] );
-               $expect = $req1->getFieldInfo();
-               foreach ( $expect as $name => &$options ) {
-                       $options['optional'] = true;
-               }
-               unset( $options );
-               $this->assertEquals( $expect, $fields );
-
                $fields = AuthenticationRequest::mergeFieldInfo( [ $req1, $req2 ] );
                $expect += $req2->getFieldInfo();
                $expect['string1']['optional'] = false;
@@ -258,6 +250,17 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
                $expect['select']['optional'] = false;
                $expect['select']['options']['bar'] = $msg;
                $this->assertEquals( $expect, $fields );
+
+               $req2->required = AuthenticationRequest::PRIMARY_REQUIRED;
+
+               $fields = AuthenticationRequest::mergeFieldInfo( [ $req1, $req2 ] );
+               $expect = $req1->getFieldInfo() + $req2->getFieldInfo();
+               $expect['string1']['optional'] = false;
+               $expect['string2']['optional'] = true;
+               $expect['string3']['optional'] = true;
+               $expect['select']['optional'] = false;
+               $expect['select']['options']['bar'] = $msg;
+               $this->assertEquals( $expect, $fields );
        }
 
        /**
index 09d046c..d254e81 100644 (file)
@@ -128,12 +128,27 @@ class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
        }
 
        public function testBeginLinkAttempt() {
+               $badReq = $this->getMockBuilder( AuthenticationRequest::class )
+                       ->setMethods( [ 'getUniqueId' ] )
+                       ->getMockForAbstractClass();
+               $badReq->expects( $this->any() )->method( 'getUniqueId' )
+                       ->will( $this->returnValue( "BadReq" ) );
+
                $user = \User::newFromName( 'UTSysop' );
                $provider = \TestingAccessWrapper::newFromObject(
                        new ConfirmLinkSecondaryAuthenticationProvider
                );
                $request = new \FauxRequest();
-               $manager = new AuthManager( $request, \RequestContext::getMain()->getConfig() );
+               $manager = $this->getMockBuilder( AuthManager::class )
+                       ->setMethods( [ 'allowsAuthenticationDataChange' ] )
+                       ->setConstructorArgs( [ $request, \RequestContext::getMain()->getConfig() ] )
+                       ->getMock();
+               $manager->expects( $this->any() )->method( 'allowsAuthenticationDataChange' )
+                       ->will( $this->returnCallback( function ( $req ) {
+                               return $req->getUniqueId() !== 'BadReq'
+                                       ? \StatusValue::newGood()
+                                       : \StatusValue::newFatal( 'no' );
+                       } ) );
                $provider->setManager( $manager );
 
                $this->assertEquals(
@@ -151,7 +166,7 @@ class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                $reqs = $this->getLinkRequests();
                $request->getSession()->setSecret( 'state', [
-                       'maybeLink' => $reqs
+                       'maybeLink' => $reqs + [ 'BadReq' => $badReq ]
                ] );
                $res = $provider->beginLinkAttempt( $user, 'state' );
                $this->assertInstanceOf( AuthenticationResponse::class, $res );
index fb0613d..d166caa 100644 (file)
@@ -23,4 +23,35 @@ class CreateFromLoginAuthenticationRequestTest extends AuthenticationRequestTest
                        ],
                ];
        }
+
+       /**
+        * @dataProvider provideState
+        */
+       public function testState(
+               $createReq, $maybeLink, $username, $loginState, $createState, $createPrimaryState
+       ) {
+               $req = new CreateFromLoginAuthenticationRequest( $createReq, $maybeLink );
+               $this->assertSame( $username, $req->username );
+               $this->assertSame( $loginState, $req->hasStateForAction( AuthManager::ACTION_LOGIN ) );
+               $this->assertSame( $createState, $req->hasStateForAction( AuthManager::ACTION_CREATE ) );
+               $this->assertFalse( $req->hasStateForAction( AuthManager::ACTION_LINK ) );
+               $this->assertFalse( $req->hasPrimaryStateForAction( AuthManager::ACTION_LOGIN ) );
+               $this->assertSame( $createPrimaryState,
+                       $req->hasPrimaryStateForAction( AuthManager::ACTION_CREATE ) );
+       }
+
+       public static function provideState() {
+               $req1 = new UsernameAuthenticationRequest;
+               $req2 = new UsernameAuthenticationRequest;
+               $req2->username = 'Bob';
+
+               return [
+                       'Nothing' => [ null, [], null, false, false, false ],
+                       'Link, no create' => [ null, [ $req2 ], null, true, true, false ],
+                       'No link, create but no name' => [ $req1, [], null, false, true, true ],
+                       'Link and create but no name' => [ $req1, [ $req2 ], null, true, true, true ],
+                       'No link, create with name' => [ $req2, [], 'Bob', false, true, true ],
+                       'Link and create with name' => [ $req2, [ $req2 ], 'Bob', true, true, true ],
+               ];
+       }
 }
index fa68dee..713c27e 100644 (file)
@@ -62,6 +62,10 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
        }
 
        public function testBasics() {
+               $user = $this->getMutableTestUser()->getUser();
+               $userName = $user->getName();
+               $lowerInitialUserName = mb_strtolower( $userName[0] ) . substr( $userName, 1 );
+
                $provider = new LocalPasswordPrimaryAuthenticationProvider();
 
                $this->assertSame(
@@ -69,8 +73,8 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                        $provider->accountCreationType()
                );
 
-               $this->assertTrue( $provider->testUserExists( 'UTSysop' ) );
-               $this->assertTrue( $provider->testUserExists( 'uTSysop' ) );
+               $this->assertTrue( $provider->testUserExists( $userName ) );
+               $this->assertTrue( $provider->testUserExists( $lowerInitialUserName ) );
                $this->assertFalse( $provider->testUserExists( 'DoesNotExist' ) );
                $this->assertFalse( $provider->testUserExists( '<invalid>' ) );
 
@@ -81,7 +85,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                        $provider->accountCreationType()
                );
 
-               $this->assertTrue( $provider->testUserExists( 'UTSysop' ) );
+               $this->assertTrue( $provider->testUserExists( $userName ) );
                $this->assertFalse( $provider->testUserExists( 'DoesNotExist' ) );
 
                $req = new PasswordAuthenticationRequest;
@@ -91,12 +95,9 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
        }
 
        public function testTestUserCanAuthenticate() {
+               $user = $this->getMutableTestUser()->getUser();
+               $userName = $user->getName();
                $dbw = wfGetDB( DB_MASTER );
-               $oldHash = $dbw->selectField( 'user', 'user_password', [ 'user_name' => 'UTSysop' ] );
-               $cb = new \ScopedCallback( function () use ( $dbw, $oldHash ) {
-                       $dbw->update( 'user', [ 'user_password' => $oldHash ], [ 'user_name' => 'UTSysop' ] );
-               } );
-               $id = \User::idFromName( 'UTSysop' );
 
                $provider = $this->getProvider();
 
@@ -104,23 +105,24 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                $this->assertFalse( $provider->testUserCanAuthenticate( 'DoesNotExist' ) );
 
-               $this->assertTrue( $provider->testUserCanAuthenticate( 'UTSysop' ) );
-               $this->assertTrue( $provider->testUserCanAuthenticate( 'uTSysop' ) );
+               $this->assertTrue( $provider->testUserCanAuthenticate( $userName ) );
+               $lowerInitialUserName = mb_strtolower( $userName[0] ) . substr( $userName, 1 );
+               $this->assertTrue( $provider->testUserCanAuthenticate( $lowerInitialUserName ) );
 
                $dbw->update(
                        'user',
                        [ 'user_password' => \PasswordFactory::newInvalidPassword()->toString() ],
-                       [ 'user_name' => 'UTSysop' ]
+                       [ 'user_name' => $userName ]
                );
-               $this->assertFalse( $provider->testUserCanAuthenticate( 'UTSysop' ) );
+               $this->assertFalse( $provider->testUserCanAuthenticate( $userName ) );
 
                // Really old format
                $dbw->update(
                        'user',
                        [ 'user_password' => '0123456789abcdef0123456789abcdef' ],
-                       [ 'user_name' => 'UTSysop' ]
+                       [ 'user_name' => $userName ]
                );
-               $this->assertTrue( $provider->testUserCanAuthenticate( 'UTSysop' ) );
+               $this->assertTrue( $provider->testUserCanAuthenticate( $userName ) );
        }
 
        public function testSetPasswordResetFlag() {
@@ -139,22 +141,24 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $provider->setManager( $this->manager );
                $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
 
+               $user = $this->getMutableTestUser()->getUser();
+               $userName = $user->getName();
                $dbw = wfGetDB( DB_MASTER );
                $row = $dbw->selectRow(
                        'user',
                        '*',
-                       [ 'user_name' => 'UTSysop' ],
+                       [ 'user_name' => $userName ],
                        __METHOD__
                );
 
                $this->manager->removeAuthenticationSessionData( null );
                $row->user_password_expires = wfTimestamp( TS_MW, time() + 200 );
-               $providerPriv->setPasswordResetFlag( 'UTSysop', \Status::newGood(), $row );
+               $providerPriv->setPasswordResetFlag( $userName, \Status::newGood(), $row );
                $this->assertNull( $this->manager->getAuthenticationSessionData( 'reset-pass' ) );
 
                $this->manager->removeAuthenticationSessionData( null );
                $row->user_password_expires = wfTimestamp( TS_MW, time() - 200 );
-               $providerPriv->setPasswordResetFlag( 'UTSysop', \Status::newGood(), $row );
+               $providerPriv->setPasswordResetFlag( $userName, \Status::newGood(), $row );
                $ret = $this->manager->getAuthenticationSessionData( 'reset-pass' );
                $this->assertNotNull( $ret );
                $this->assertSame( 'resetpass-expired', $ret->msg->getKey() );
@@ -162,7 +166,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                $this->manager->removeAuthenticationSessionData( null );
                $row->user_password_expires = wfTimestamp( TS_MW, time() - 1 );
-               $providerPriv->setPasswordResetFlag( 'UTSysop', \Status::newGood(), $row );
+               $providerPriv->setPasswordResetFlag( $userName, \Status::newGood(), $row );
                $ret = $this->manager->getAuthenticationSessionData( 'reset-pass' );
                $this->assertNotNull( $ret );
                $this->assertSame( 'resetpass-expired-soft', $ret->msg->getKey() );
@@ -172,7 +176,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $row->user_password_expires = null;
                $status = \Status::newGood();
                $status->error( 'testing' );
-               $providerPriv->setPasswordResetFlag( 'UTSysop', $status, $row );
+               $providerPriv->setPasswordResetFlag( $userName, $status, $row );
                $ret = $this->manager->getAuthenticationSessionData( 'reset-pass' );
                $this->assertNotNull( $ret );
                $this->assertSame( 'resetpass-validity-soft', $ret->msg->getKey() );
@@ -180,12 +184,11 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
        }
 
        public function testAuthentication() {
+               $testUser = $this->getMutableTestUser();
+               $userName = $testUser->getUser()->getName();
+
                $dbw = wfGetDB( DB_MASTER );
-               $oldHash = $dbw->selectField( 'user', 'user_password', [ 'user_name' => 'UTSysop' ] );
-               $cb = new \ScopedCallback( function () use ( $dbw, $oldHash ) {
-                       $dbw->update( 'user', [ 'user_password' => $oldHash ], [ 'user_name' => 'UTSysop' ] );
-               } );
-               $id = \User::idFromName( 'UTSysop' );
+               $id = \User::idFromName( $userName );
 
                $req = new PasswordAuthenticationRequest();
                $req->action = AuthManager::ACTION_LOGIN;
@@ -230,8 +233,8 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                );
 
                // Validation failure
-               $req->username = 'UTSysop';
-               $req->password = 'UTSysopPassword';
+               $req->username = $userName;
+               $req->password = $testUser->getPassword();
                $this->validity = \Status::newFatal( 'arbitrary-failure' );
                $ret = $provider->beginPrimaryAuthentication( $reqs );
                $this->assertEquals(
@@ -247,7 +250,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $this->manager->removeAuthenticationSessionData( null );
                $this->validity = \Status::newGood();
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
                $this->assertNull( $this->manager->getAuthenticationSessionData( 'reset-pass' ) );
@@ -255,19 +258,19 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                // Successful auth after normalizing name
                $this->manager->removeAuthenticationSessionData( null );
                $this->validity = \Status::newGood();
-               $req->username = 'uTSysop';
+               $req->username = mb_strtolower( $userName[0] ) . substr( $userName, 1 );
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
                $this->assertNull( $this->manager->getAuthenticationSessionData( 'reset-pass' ) );
-               $req->username = 'UTSysop';
+               $req->username = $userName;
 
                // Successful auth with reset
                $this->manager->removeAuthenticationSessionData( null );
                $this->validity->error( 'arbitrary-warning' );
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
                $this->assertNotNull( $this->manager->getAuthenticationSessionData( 'reset-pass' ) );
@@ -287,7 +290,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                // Correct handling of legacy encodings
                $password = ':B:salt:' . md5( 'salt-' . md5( "\xe1\xe9\xed\xf3\xfa" ) );
-               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => 'UTSysop' ] );
+               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => $userName ] );
                $req->password = 'áéíóú';
                $ret = $provider->beginPrimaryAuthentication( $reqs );
                $this->assertEquals(
@@ -301,7 +304,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                $this->config->set( 'LegacyEncoding', true );
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 
@@ -319,19 +322,19 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                // Correct handling of really old password hashes
                $this->config->set( 'PasswordSalt', false );
                $password = md5( 'FooBar' );
-               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => 'UTSysop' ] );
+               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => $userName ] );
                $req->password = 'FooBar';
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 
                $this->config->set( 'PasswordSalt', true );
                $password = md5( "$id-" . md5( 'FooBar' ) );
-               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => 'UTSysop' ] );
+               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => $userName ] );
                $req->password = 'FooBar';
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 
@@ -407,29 +410,24 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
        /**
         * @dataProvider provideProviderChangeAuthenticationData
-        * @param string $user
+        * @param callable|bool $usernameTransform
         * @param string $type
         * @param bool $loginOnly
         * @param bool $changed
         */
-       public function testProviderChangeAuthenticationData( $user, $type, $loginOnly, $changed ) {
+       public function testProviderChangeAuthenticationData(
+                       $usernameTransform, $type, $loginOnly, $changed ) {
+               $testUser = $this->getMutableTestUser();
+               $user = $testUser->getUser()->getName();
+               if ( is_callable( $usernameTransform ) ) {
+                       $user = call_user_func( $usernameTransform, $user );
+               }
                $cuser = ucfirst( $user );
-               $oldpass = 'UTSysopPassword';
+               $oldpass = $testUser->getPassword();
                $newpass = 'NewPassword';
 
                $dbw = wfGetDB( DB_MASTER );
-               $oldHash = $dbw->selectField( 'user', 'user_password', [ 'user_name' => $cuser ] );
                $oldExpiry = $dbw->selectField( 'user', 'user_password_expires', [ 'user_name' => $cuser ] );
-               $cb = new \ScopedCallback( function () use ( $dbw, $cuser, $oldHash, $oldExpiry ) {
-                       $dbw->update(
-                               'user',
-                               [
-                                       'user_password' => $oldHash,
-                                       'user_password_expires' => $oldExpiry,
-                               ],
-                               [ 'user_name' => $cuser ]
-                       );
-               } );
 
                $this->mergeMwGlobalArrayValue( 'wgHooks', [
                        'ResetPasswordExpiration' => [ function ( $user, &$expires ) {
@@ -525,12 +523,12 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
        public static function provideProviderChangeAuthenticationData() {
                return [
-                       [ 'UTSysop', AuthenticationRequest::class, false, false ],
-                       [ 'UTSysop', PasswordAuthenticationRequest::class, false, true ],
-                       [ 'UTSysop', AuthenticationRequest::class, true, false ],
-                       [ 'UTSysop', PasswordAuthenticationRequest::class, true, true ],
-                       [ 'uTSysop', PasswordAuthenticationRequest::class, false, true ],
-                       [ 'uTSysop', PasswordAuthenticationRequest::class, true, true ],
+                       [ false, AuthenticationRequest::class, false, false ],
+                       [ false, PasswordAuthenticationRequest::class, false, true ],
+                       [ false, AuthenticationRequest::class, true, false ],
+                       [ false, PasswordAuthenticationRequest::class, true, true ],
+                       [ 'ucfirst', PasswordAuthenticationRequest::class, false, true ],
+                       [ 'ucfirst', PasswordAuthenticationRequest::class, true, true ],
                ];
        }
 
@@ -640,10 +638,6 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                // We have to cheat a bit to avoid having to add a new user to
                // the database to test the actual setting of the password works right
                $dbw = wfGetDB( DB_MASTER );
-               $oldHash = $dbw->selectField( 'user', 'user_password', [ 'user_name' => $user ] );
-               $cb = new \ScopedCallback( function () use ( $dbw, $user, $oldHash ) {
-                       $dbw->update( 'user', [ 'user_password' => $oldHash ], [ 'user_name' => $user ] );
-               } );
 
                $user = \User::newFromName( 'UTSysop' );
                $req->username = $user->getName();
index e329f8d..9c723c0 100644 (file)
@@ -6,36 +6,30 @@
  */
 class GenderCacheTest extends MediaWikiLangTestCase {
 
+       /** @var string[] User key => username */
+       private static $nameMap;
+
        function addDBDataOnce() {
                // ensure the correct default gender
                $this->mergeMwGlobalArrayValue( 'wgDefaultUserOptions', [ 'gender' => 'unknown' ] );
 
-               $user = User::newFromName( 'UTMale' );
-               if ( $user->getId() == 0 ) {
-                       $user->addToDatabase();
-                       TestUser::setPasswordForUser( $user, 'UTMalePassword' );
-               }
-               // ensure the right gender
-               $user->setOption( 'gender', 'male' );
-               $user->saveSettings();
+               $male = $this->getMutableTestUser()->getUser();
+               $male->setOption( 'gender', 'male' );
+               $male->saveSettings();
+
+               $female = $this->getMutableTestUser()->getUser();
+               $female->setOption( 'gender', 'female' );
+               $female->saveSettings();
 
-               $user = User::newFromName( 'UTFemale' );
-               if ( $user->getId() == 0 ) {
-                       $user->addToDatabase();
-                       TestUser::setPasswordForUser( $user, 'UTFemalePassword' );
-               }
-               // ensure the right gender
-               $user->setOption( 'gender', 'female' );
-               $user->saveSettings();
+               $default = $this->getMutableTestUser()->getUser();
+               $default->setOption( 'gender', null );
+               $default->saveSettings();
 
-               $user = User::newFromName( 'UTDefaultGender' );
-               if ( $user->getId() == 0 ) {
-                       $user->addToDatabase();
-                       TestUser::setPasswordForUser( $user, 'UTDefaultGenderPassword' );
-               }
-               // ensure the default gender
-               $user->setOption( 'gender', null );
-               $user->saveSettings();
+               self::$nameMap = [
+                       'UTMale'          => $male->getName(),
+                       'UTFemale'        => $female->getName(),
+                       'UTDefaultGender' => $default->getName()
+               ];
        }
 
        /**
@@ -44,8 +38,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * @dataProvider provideUserGenders
         * @covers GenderCache::getGenderOf
         */
-       public function testUserName( $username, $expectedGender ) {
+       public function testUserName( $userKey, $expectedGender ) {
                $genderCache = GenderCache::singleton();
+               $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
                $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
        }
@@ -56,10 +51,10 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * @dataProvider provideUserGenders
         * @covers GenderCache::getGenderOf
         */
-       public function testUserObjects( $username, $expectedGender ) {
+       public function testUserObjects( $userKey, $expectedGender ) {
+               $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
                $genderCache = GenderCache::singleton();
-               $user = User::newFromName( $username );
-               $gender = $genderCache->getGenderOf( $user );
+               $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
        }
 
@@ -79,22 +74,13 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * test strip of subpages to avoid unnecessary queries
         * against the never existing username
         *
-        * @dataProvider provideStripSubpages
+        * @dataProvider provideUserGenders
         * @covers GenderCache::getGenderOf
         */
-       public function testStripSubpages( $pageWithSubpage, $expectedGender ) {
+       public function testStripSubpages( $userKey, $expectedGender ) {
+               $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
                $genderCache = GenderCache::singleton();
-               $gender = $genderCache->getGenderOf( $pageWithSubpage );
+               $gender = $genderCache->getGenderOf( "$username/subpage" );
                $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
        }
-
-       public static function provideStripSubpages() {
-               return [
-                       [ 'UTMale/subpage', 'male' ],
-                       [ 'UTFemale/subpage', 'female' ],
-                       [ 'UTDefaultGender/subpage', 'unknown' ],
-                       [ 'UTNotExist/subpage', 'unknown' ],
-                       [ '127.0.0.1/subpage', 'unknown' ],
-               ];
-       }
 }
index 1d86fb4..e44de09 100644 (file)
@@ -29,6 +29,11 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
         */
        private static $pageRev = null;
 
+       /**
+        * @var User
+        */
+       private static $revUser = null;
+
        /**
         * @var string
         */
@@ -54,6 +59,7 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
 
                $page = WikiPage::factory( $title );
                self::$pageRev = $page->getRevision();
+               self::$revUser = User::newFromId( self::$pageRev->getUser( Revision::RAW ) );
        }
 
        private function newChange( Revision $revision = null ) {
@@ -114,7 +120,7 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
 
                $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
                $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
-               $this->assertEquals( 'UTSysop', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( self::$revUser->getName(), self::$lastNotifyArgs[2]->getName() );
                $this->assertEquals( '(recentchanges-page-added-to-category: ' . self::$pageName . ')',
                        self::$lastNotifyArgs[3] );
                $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
@@ -135,7 +141,7 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
 
                $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
                $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
-               $this->assertEquals( 'UTSysop', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( self::$revUser->getName(), self::$lastNotifyArgs[2]->getName() );
                $this->assertEquals( '(recentchanges-page-removed-from-category: ' . self::$pageName . ')',
                        self::$lastNotifyArgs[3] );
                $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
index b8be8d4..308e6de 100644 (file)
@@ -121,7 +121,7 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
         * @return RecentChange
         */
        private function getEditChange( $timestamp ) {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
                $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
                        $user, 'Cat', $timestamp, 5, 191, 190, 0, 0
                );
@@ -139,7 +139,7 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                $wikiPage = new WikiPage( Title::newFromText( 'Category:Foo' ) );
                $wikiPage->doEditContent( new WikitextContent( 'Some random text' ), 'category page created' );
 
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
                $recentChange = $this->testRecentChangesHelper->makeCategorizationRecentChange(
                        $user, 'Category:Foo', $wikiPage->getId(), $thisId, $lastId, $timestamp
                );
@@ -147,19 +147,6 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                return $recentChange;
        }
 
-       /**
-        * @return User
-        */
-       private function getTestUser() {
-               $user = User::newFromName( 'TestRecentChangesUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               return $user;
-       }
-
        private function createCategorizationLine( $recentChange ) {
                $enhancedChangesList = $this->newEnhancedChangesList();
                $cacheEntry = $this->testRecentChangesHelper->getCacheEntry( $recentChange );
index bc70a13..51cfadc 100644 (file)
@@ -150,7 +150,7 @@ class OldChangesListTest extends MediaWikiLangTestCase {
        }
 
        private function getNewBotEditChange() {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
 
                $recentChange = $this->testRecentChangesHelper->makeNewBotEditRecentChange(
                        $user, 'Abc', '20131103212153', 5, 191, 190, 0, 0
@@ -160,7 +160,7 @@ class OldChangesListTest extends MediaWikiLangTestCase {
        }
 
        private function getLogChange( $logType, $logAction ) {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
 
                $recentChange = $this->testRecentChangesHelper->makeLogRecentChange(
                        $logType, $logAction, $user, 'Abc', '20131103212153', 0, 0
@@ -170,7 +170,7 @@ class OldChangesListTest extends MediaWikiLangTestCase {
        }
 
        private function getEditChange() {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
                $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
                        $user, 'Cat', '20131103212153', 5, 191, 190, 0, 0
                );
@@ -183,18 +183,8 @@ class OldChangesListTest extends MediaWikiLangTestCase {
                return new OldChangesList( $context );
        }
 
-       private function getTestUser() {
-               $user = User::newFromName( 'TestRecentChangesUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               return $user;
-       }
-
        private function getContext() {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
                $context = $this->testRecentChangesHelper->getTestContext( $user );
                $context->setLanguage( 'qqx' );
 
index 602340b..16f210b 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
+
 /**
  * @covers RCCacheEntryFactory
  *
@@ -14,6 +17,11 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
         */
        private $testRecentChangesHelper;
 
+       /**
+        * @var LinkRenderer;
+        */
+       private $linkRenderer;
+
        public function __construct( $name = null, array $data = [], $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
@@ -26,133 +34,113 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                $this->setMwGlobals( [
                        'wgArticlePath' => '/wiki/$1'
                ] );
+
+               $this->linkRenderer = new LinkRenderer(
+                       MediaWikiServices::getInstance()->getTitleFormatter()
+               );
        }
 
-       /**
-        * @dataProvider editChangeProvider
-        */
-       public function testNewFromRecentChange( $expected, $context, $messages,
-               $recentChange, $watched
-       ) {
-               $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
-               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+       public function testNewFromRecentChange() {
+               $user = $this->getMutableTestUser()->getUser();
+               $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
+                       $user,
+                       'Xyz',
+                       5, // curid
+                       191, // thisid
+                       190, // lastid
+                       '20131103212153',
+                       0, // counter
+                       0 // number of watching users
+               );
+               $cacheEntryFactory = new RCCacheEntryFactory(
+                       $this->getContext(),
+                       $this->getMessages(),
+                       $this->linkRenderer
+               );
+               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
                $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
 
-               $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
-               $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals(
-                       $expected['numberofWatchingusers'], $cacheEntry->numberofWatchingusers,
-                       'watching users'
-               );
-               $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+               $this->assertEquals( false, $cacheEntry->watched, 'watched' );
+               $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
+               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
-               $this->assertUserLinks( 'TestRecentChangesUser', $cacheEntry );
+               $this->assertUserLinks( $user->getName(), $cacheEntry );
                $this->assertTitleLink( 'Xyz', $cacheEntry );
 
-               $this->assertQueryLink( 'cur', $expected['cur'], $cacheEntry->curlink, 'cur link' );
-               $this->assertQueryLink( 'prev', $expected['diff'], $cacheEntry->lastlink, 'prev link' );
-               $this->assertQueryLink( 'diff', $expected['diff'], $cacheEntry->difflink, 'diff link' );
+               $diff = [ 'curid' => 5, 'diff' => 191, 'oldid' => 190 ];
+               $cur = [ 'curid' => 5, 'diff' => 0, 'oldid' => 191 ];
+               $this->assertQueryLink( 'cur', $cur, $cacheEntry->curlink, 'cur link' );
+               $this->assertQueryLink( 'prev', $diff, $cacheEntry->lastlink, 'prev link' );
+               $this->assertQueryLink( 'diff', $diff, $cacheEntry->difflink, 'diff link' );
        }
 
-       public function editChangeProvider() {
-               return [
-                       [
-                               [
-                                       'title' => 'Xyz',
-                                       'user' => 'TestRecentChangesUser',
-                                       'diff' => [ 'curid' => 5, 'diff' => 191, 'oldid' => 190 ],
-                                       'cur' => [ 'curid' => 5, 'diff' => 0, 'oldid' => 191 ],
-                                       'timestamp' => '21:21',
-                                       'numberofWatchingusers' => 0,
-                                       'unpatrolled' => false
-                               ],
-                               $this->getContext(),
-                               $this->getMessages(),
-                               $this->testRecentChangesHelper->makeEditRecentChange(
-                                       $this->getTestUser(),
-                                       'Xyz',
-                                       5, // curid
-                                       191, // thisid
-                                       190, // lastid
-                                       '20131103212153',
-                                       0, // counter
-                                       0 // number of watching users
-                               ),
-                               false
-                       ]
+       public function testNewForDeleteChange() {
+               $expected = [
+                       'title' => 'Abc',
+                       'user' => 'TestRecentChangesUser',
+                       'timestamp' => '21:21',
+                       'numberofWatchingusers' => 0,
+                       'unpatrolled' => false
                ];
-       }
-
-       /**
-        * @dataProvider deleteChangeProvider
-        */
-       public function testNewForDeleteChange( $expected, $context, $messages, $recentChange, $watched ) {
-               $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
-               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+               $user = $this->getMutableTestUser()->getUser();
+               $recentChange = $this->testRecentChangesHelper->makeLogRecentChange(
+                       'delete',
+                       'delete',
+                       $user,
+                       'Abc',
+                       '20131103212153',
+                       0, // counter
+                       0 // number of watching users
+               );
+               $cacheEntryFactory = new RCCacheEntryFactory(
+                       $this->getContext(),
+                       $this->getMessages(),
+                       $this->linkRenderer
+               );
+               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
                $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
 
-               $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
-               $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals(
-                       $expected['numberofWatchingusers'],
-                       $cacheEntry->numberofWatchingusers, 'watching users'
-               );
-               $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+               $this->assertEquals( false, $cacheEntry->watched, 'watched' );
+               $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
+               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertDeleteLogLink( $cacheEntry );
-               $this->assertUserLinks( 'TestRecentChangesUser', $cacheEntry );
+               $this->assertUserLinks( $user->getName(), $cacheEntry );
 
                $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
                $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
                $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
        }
 
-       public function deleteChangeProvider() {
-               return [
-                       [
-                               [
-                                       'title' => 'Abc',
-                                       'user' => 'TestRecentChangesUser',
-                                       'timestamp' => '21:21',
-                                       'numberofWatchingusers' => 0,
-                                       'unpatrolled' => false
-                               ],
-                               $this->getContext(),
-                               $this->getMessages(),
-                               $this->testRecentChangesHelper->makeLogRecentChange(
-                                       'delete',
-                                       'delete',
-                                       $this->getTestUser(),
-                                       'Abc',
-                                       '20131103212153',
-                                       0, // counter
-                                       0 // number of watching users
-                               ),
-                               false
-                       ]
-               ];
-       }
-
-       /**
-        * @dataProvider revUserDeleteProvider
-        */
-       public function testNewForRevUserDeleteChange( $expected, $context, $messages,
-               $recentChange, $watched
-       ) {
-               $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
-               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+       public function testNewForRevUserDeleteChange() {
+               $user = $this->getMutableTestUser()->getUser();
+               $recentChange = $this->testRecentChangesHelper->makeDeletedEditRecentChange(
+                       $user,
+                       'Zzz',
+                       '20131103212153',
+                       191, // thisid
+                       190, // lastid
+                       '20131103212153',
+                       0, // counter
+                       0 // number of watching users
+               );
+               $cacheEntryFactory = new RCCacheEntryFactory(
+                       $this->getContext(),
+                       $this->getMessages(),
+                       $this->linkRenderer
+               );
+               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
                $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
 
-               $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
-               $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals(
-                       $expected['numberofWatchingusers'],
-                       $cacheEntry->numberofWatchingusers, 'watching users'
-               );
-               $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+               $this->assertEquals( false, $cacheEntry->watched, 'watched' );
+               $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
+               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertRevDel( $cacheEntry );
                $this->assertTitleLink( 'Zzz', $cacheEntry );
@@ -162,35 +150,6 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
        }
 
-       public function revUserDeleteProvider() {
-               return [
-                       [
-                               [
-                                       'title' => 'Zzz',
-                                       'user' => 'TestRecentChangesUser',
-                                       'diff' => '',
-                                       'cur' => '',
-                                       'timestamp' => '21:21',
-                                       'numberofWatchingusers' => 0,
-                                       'unpatrolled' => false
-                               ],
-                               $this->getContext(),
-                               $this->getMessages(),
-                               $this->testRecentChangesHelper->makeDeletedEditRecentChange(
-                                       $this->getTestUser(),
-                                       'Zzz',
-                                       '20131103212153',
-                                       191, // thisid
-                                       190, // lastid
-                                       '20131103212153',
-                                       0, // counter
-                                       0 // number of watching users
-                               ),
-                               false
-                       ]
-               ];
-       }
-
        private function assertUserLinks( $user, $cacheEntry ) {
                $this->assertTag(
                        [
@@ -308,18 +267,8 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                ];
        }
 
-       private function getTestUser() {
-               $user = User::newFromName( 'TestRecentChangesUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               return $user;
-       }
-
        private function getContext() {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
                $context = $this->testRecentChangesHelper->getTestContext( $user );
 
                $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
index faa1dcc..cac3d43 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Helper for generating test recent changes entries.
@@ -100,7 +102,10 @@ class TestRecentChangesHelper {
        public function getCacheEntry( $recentChange ) {
                $rcCacheFactory = new RCCacheEntryFactory(
                        new RequestContext(),
-                       [ 'diff' => 'diff', 'cur' => 'cur', 'last' => 'last' ]
+                       [ 'diff' => 'diff', 'cur' => 'cur', 'last' => 'last' ],
+                       new LinkRenderer(
+                               MediaWikiServices::getInstance()->getTitleFormatter()
+                       )
                );
                return $rcCacheFactory->newFromRecentChange( $recentChange, false );
        }
index bd3103b..ed28b79 100644 (file)
@@ -5,7 +5,7 @@ use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\MediaWikiServices;
 
 /**
- * @covers LinkRendererFactory
+ * @covers MediaWiki\Linker\LinkRendererFactory
  */
 class LinkRendererFactoryTest extends MediaWikiLangTestCase {
 
@@ -21,11 +21,6 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase {
 
        public static function provideCreateFromLegacyOptions() {
                return [
-                       [
-                               [ 'noclasses' ],
-                               'getNoClasses',
-                               true
-                       ],
                        [
                                [ 'forcearticlepath' ],
                                'getForceArticlePath',
index a74db20..b78592b 100644 (file)
@@ -4,7 +4,7 @@ use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
 
 /**
- * @covers LinkRenderer
+ * @covers MediaWiki\Linker\LinkRenderer
  */
 class LinkRendererTest extends MediaWikiLangTestCase {
 
index d4b1587..9bc41c0 100644 (file)
@@ -67,7 +67,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $passwordFactory->init( \RequestContext::getMain()->getConfig() );
                $passwordHash = $passwordFactory->newFromPlaintext( 'foobaz' );
 
-               $userId = \CentralIdLookup::factory( 'local' )->centralIdFromName( 'UTSysop' );
+               $sysop = static::getTestSysop()->getUser();
+               $userId = \CentralIdLookup::factory( 'local' )->centralIdFromName( $sysop->getName() );
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete(
@@ -182,7 +183,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
 
        public function testNewSessionInfoForRequest() {
                $provider = $this->getProvider();
-               $user = \User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '127.0.0.1' ) );
@@ -209,7 +210,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $provider = $this->getProvider();
                $provider->setLogger( $logger );
 
-               $user = \User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '127.0.0.1' ) );
index 9600184..b35b685 100644 (file)
@@ -165,7 +165,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $provider->setConfig( $this->getConfig() );
                $provider->setManager( new SessionManager() );
 
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $id = $user->getId();
                $name = $user->getName();
                $token = $user->getToken( true );
@@ -390,7 +390,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
 
                $sessionId = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
                $store = new TestBagOStuff();
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $anon = new User;
 
                $backend = new SessionBackend(
@@ -475,7 +475,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $provider->setManager( SessionManager::singleton() );
 
                $sessionId = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $this->assertFalse( $user->requiresHTTPS(), 'sanity check' );
 
                $backend = new SessionBackend(
@@ -577,7 +577,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
 
                $sessionId = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
                $store = new TestBagOStuff();
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $anon = new User;
 
                $backend = new SessionBackend(
index 0b5f4c2..a3d5de7 100644 (file)
@@ -360,7 +360,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testSetUser() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
 
                $this->provider = $this->getMock( 'DummySessionProvider', [ 'canChangeUser' ] );
                $this->provider->expects( $this->any() )->method( 'canChangeUser' )
@@ -484,7 +484,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testSave() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $this->store = new TestBagOStuff();
                $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ];
 
@@ -733,7 +733,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testRenew() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $this->store = new TestBagOStuff();
                $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ];
 
@@ -829,7 +829,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                        $handler->enable = true;
                }
 
-               $backend = $this->getBackend( User::newFromName( 'UTSysop' ) );
+               $backend = $this->getBackend( static::getTestSysop()->getUser() );
                \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = true;
 
                $resetSingleton = TestUtils::setSessionManagerSingleton( $this->manager );
index e55a3a4..4d914e4 100644 (file)
@@ -164,6 +164,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        // getGenderCache() provides a mock that considers first
                        // names ending in "a" to be female.
                        [ NS_USER, 'Lisa_Müller', '', 'de', 'Benutzerin:Lisa Müller' ],
+                       [ 1000000, 'Invalid_namespace', '', 'en', ':Invalid namespace' ],
                ];
        }
 
index 629c6e5..1ef5082 100644 (file)
@@ -7,6 +7,13 @@ use MediaWiki\Session\SessionManager;
  * @group Database
  */
 class BotPasswordTest extends MediaWikiTestCase {
+
+       /** @var TestUser */
+       private $testUser;
+
+       /** @var string */
+       private $testUserName;
+
        protected function setUp() {
                parent::setUp();
 
@@ -20,11 +27,14 @@ class BotPasswordTest extends MediaWikiTestCase {
                        'wgUserrightsInterwikiDelimiter' => '@',
                ] );
 
+               $this->testUser = $this->getMutableTestUser();
+               $this->testUserName = $this->testUser->getUser()->getName();
+
                $mock1 = $this->getMockForAbstractClass( 'CentralIdLookup' );
                $mock1->expects( $this->any() )->method( 'isAttached' )
                        ->will( $this->returnValue( true ) );
                $mock1->expects( $this->any() )->method( 'lookupUserNames' )
-                       ->will( $this->returnValue( [ 'UTSysop' => 42, 'UTDummy' => 43, 'UTInvalid' => 0 ] ) );
+                       ->will( $this->returnValue( [ $this->testUserName => 42, 'UTDummy' => 43, 'UTInvalid' => 0 ] ) );
                $mock1->expects( $this->never() )->method( 'lookupCentralIds' );
 
                $mock2 = $this->getMockForAbstractClass( 'CentralIdLookup' );
@@ -82,7 +92,7 @@ class BotPasswordTest extends MediaWikiTestCase {
        }
 
        public function testBasics() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = $this->testUser->getUser();
                $bp = BotPassword::newFromUser( $user, 'BotPassword' );
                $this->assertInstanceOf( 'BotPassword', $bp );
                $this->assertTrue( $bp->isSaved() );
@@ -107,7 +117,7 @@ class BotPasswordTest extends MediaWikiTestCase {
        }
 
        public function testUnsaved() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = $this->testUser->getUser();
                $bp = BotPassword::newUnsaved( [
                        'user' => $user,
                        'appId' => 'DoesNotExist'
@@ -132,7 +142,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertEquals( '{"IPAddresses":["127.0.0.0/8"]}', $bp->getRestrictions()->toJson() );
                $this->assertSame( [ 'test' ], $bp->getGrants() );
 
-               $user = User::newFromName( 'UTSysop' );
+               $user = $this->testUser->getUser();
                $bp = BotPassword::newUnsaved( [
                        'centralId' => 45,
                        'appId' => 'DoesNotExist'
@@ -142,7 +152,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertSame( 45, $bp->getUserCentralId() );
                $this->assertSame( 'DoesNotExist', $bp->getAppId() );
 
-               $user = User::newFromName( 'UTSysop' );
+               $user = $this->testUser->getUser();
                $bp = BotPassword::newUnsaved( [
                        'user' => $user,
                        'appId' => 'BotPassword'
@@ -159,7 +169,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        'appId' => str_repeat( 'X', BotPassword::APPID_MAXLENGTH + 1 ),
                ] ) );
                $this->assertNull( BotPassword::newUnsaved( [
-                       'user' => 'UTSysop',
+                       'user' => $this->testUserName,
                        'appId' => 'Ok',
                ] ) );
                $this->assertNull( BotPassword::newUnsaved( [
@@ -200,7 +210,7 @@ class BotPasswordTest extends MediaWikiTestCase {
 
                $this->assertNotInstanceOf( 'InvalidPassword', $bp1->getPassword(), 'sanity check' );
                $this->assertNotInstanceOf( 'InvalidPassword', $bp2->getPassword(), 'sanity check' );
-               BotPassword::invalidateAllPasswordsForUser( 'UTSysop' );
+               BotPassword::invalidateAllPasswordsForUser( $this->testUserName );
                $this->assertInstanceOf( 'InvalidPassword', $bp1->getPassword() );
                $this->assertNotInstanceOf( 'InvalidPassword', $bp2->getPassword() );
 
@@ -212,7 +222,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertNotNull( BotPassword::newFromCentralId( 42, 'BotPassword' ), 'sanity check' );
                $this->assertNotNull( BotPassword::newFromCentralId( 43, 'BotPassword' ), 'sanity check' );
 
-               BotPassword::removeAllPasswordsForUser( 'UTSysop' );
+               BotPassword::removeAllPasswordsForUser( $this->testUserName );
 
                $this->assertNull( BotPassword::newFromCentralId( 42, 'BotPassword' ) );
                $this->assertNotNull( BotPassword::newFromCentralId( 43, 'BotPassword' ) );
@@ -221,7 +231,7 @@ class BotPasswordTest extends MediaWikiTestCase {
        public function testLogin() {
                // Test failure when bot passwords aren't enabled
                $this->setMwGlobals( 'wgEnableBotPasswords', false );
-               $status = BotPassword::login( 'UTSysop@BotPassword', 'foobaz', new FauxRequest );
+               $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', new FauxRequest );
                $this->assertEquals( Status::newFatal( 'botpasswords-disabled' ), $status );
                $this->setMwGlobals( 'wgEnableBotPasswords', true );
 
@@ -235,7 +245,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        $manager->getProvider( MediaWiki\Session\BotPasswordSessionProvider::class ),
                        'sanity check'
                );
-               $status = BotPassword::login( 'UTSysop@BotPassword', 'foobaz', new FauxRequest );
+               $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', new FauxRequest );
                $this->assertEquals( Status::newFatal( 'botpasswords-no-provider' ), $status );
                ScopedCallback::consume( $reset );
 
@@ -257,7 +267,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                $reset = MediaWiki\Session\TestUtils::setSessionManagerSingleton( $manager );
 
                // No "@"-thing in the username
-               $status = BotPassword::login( 'UTSysop', 'foobaz', new FauxRequest );
+               $status = BotPassword::login( $this->testUserName, 'foobaz', new FauxRequest );
                $this->assertEquals( Status::newFatal( 'botpasswords-invalid-name', '@' ), $status );
 
                // No base user
@@ -265,9 +275,9 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertEquals( Status::newFatal( 'nosuchuser', 'UTDummy' ), $status );
 
                // No bot password
-               $status = BotPassword::login( 'UTSysop@DoesNotExist', 'foobaz', new FauxRequest );
+               $status = BotPassword::login( "{$this->testUserName}@DoesNotExist", 'foobaz', new FauxRequest );
                $this->assertEquals(
-                       Status::newFatal( 'botpasswords-not-exist', 'UTSysop', 'DoesNotExist' ),
+                       Status::newFatal( 'botpasswords-not-exist', $this->testUserName, 'DoesNotExist' ),
                        $status
                );
 
@@ -275,11 +285,12 @@ class BotPasswordTest extends MediaWikiTestCase {
                $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '10.0.0.1' ) );
-               $status = BotPassword::login( 'UTSysop@BotPassword', 'foobaz', $request );
+               $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', $request );
                $this->assertEquals( Status::newFatal( 'botpasswords-restriction-failed' ), $status );
 
                // Wrong password
-               $status = BotPassword::login( 'UTSysop@BotPassword', 'UTSysopPassword', new FauxRequest );
+               $status = BotPassword::login(
+                       "{$this->testUserName}@BotPassword", $this->testUser->password, new FauxRequest );
                $this->assertEquals( Status::newFatal( 'wrongpassword' ), $status );
 
                // Success!
@@ -289,7 +300,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        $request->getSession()->getProvider(),
                        'sanity check'
                );
-               $status = BotPassword::login( 'UTSysop@BotPassword', 'foobaz', $request );
+               $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', $request );
                $this->assertInstanceOf( 'Status', $status );
                $this->assertTrue( $status->isGood() );
                $session = $status->getValue();
index 1786261..feac641 100644 (file)
@@ -45,7 +45,7 @@ class CentralIdLookupTest extends MediaWikiTestCase {
                        $this->getMockForAbstractClass( 'CentralIdLookup' )
                );
 
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $this->assertSame( $user, $mock->checkAudience( $user ) );
 
                $user = $mock->checkAudience( CentralIdLookup::AUDIENCE_PUBLIC );
index c86fb6c..c91d8e0 100644 (file)
@@ -18,18 +18,14 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
        public function addDBData() {
                for ( $i = 1; $i <= 4; $i++ ) {
-                       $user = User::newFromName( "UTLocalIdLookup$i" );
-                       if ( $user->getId() == 0 ) {
-                               $user->addToDatabase();
-                       }
-                       $this->localUsers["UTLocalIdLookup$i"] = $user->getId();
+                       $this->localUsers[] = $this->getMutableTestUser()->getUser();
                }
 
-               User::newFromName( 'UTLocalIdLookup1' )->addGroup( 'local-id-lookup-test' );
+               $sysop = static::getTestSysop()->getUser();
 
                $block = new Block( [
-                       'address' => 'UTLocalIdLookup3',
-                       'by' => User::idFromName( 'UTSysop' ),
+                       'address' => $this->localUsers[2]->getName(),
+                       'by' => $sysop->getId(),
                        'reason' => __METHOD__,
                        'expiry' => '1 day',
                        'hideName' => false,
@@ -37,8 +33,8 @@ class LocalIdLookupTest extends MediaWikiTestCase {
                $block->insert();
 
                $block = new Block( [
-                       'address' => 'UTLocalIdLookup4',
-                       'by' => User::idFromName( 'UTSysop' ),
+                       'address' => $this->localUsers[3]->getName(),
+                       'by' => $sysop->getId(),
                        'reason' => __METHOD__,
                        'expiry' => '1 day',
                        'hideName' => true,
@@ -46,9 +42,14 @@ class LocalIdLookupTest extends MediaWikiTestCase {
                $block->insert();
        }
 
+       public function getLookupUser() {
+               return static::getTestUser( [ 'local-id-lookup-test' ] )->getUser();
+       }
+
        public function testLookupCentralIds() {
                $lookup = new LocalIdLookup();
-               $user1 = User::newFromName( 'UTLocalIdLookup1' );
+
+               $user1 = $this->getLookupUser();
                $user2 = User::newFromName( 'UTLocalIdLookup2' );
 
                $this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
@@ -56,12 +57,15 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
                $this->assertSame( [], $lookup->lookupCentralIds( [] ) );
 
-               $expect = array_flip( $this->localUsers );
-               $expect[123] = 'X';
+               $expect = [];
+               foreach ( $this->localUsers as $localUser ) {
+                       $expect[$localUser->getId()] = $localUser->getName();
+               }
+               $expect[12345] = 'X';
                ksort( $expect );
 
                $expect2 = $expect;
-               $expect2[$this->localUsers['UTLocalIdLookup4']] = '';
+               $expect2[$this->localUsers[3]->getId()] = '';
 
                $arg = array_fill_keys( array_keys( $expect ), 'X' );
 
@@ -73,7 +77,7 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
        public function testLookupUserNames() {
                $lookup = new LocalIdLookup();
-               $user1 = User::newFromName( 'UTLocalIdLookup1' );
+               $user1 = $this->getLookupUser();
                $user2 = User::newFromName( 'UTLocalIdLookup2' );
 
                $this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
@@ -81,12 +85,15 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
                $this->assertSame( [], $lookup->lookupUserNames( [] ) );
 
-               $expect = $this->localUsers;
+               $expect = [];
+               foreach ( $this->localUsers as $localUser ) {
+                       $expect[$localUser->getName()] = $localUser->getId();
+               }
                $expect['UTDoesNotExist'] = 'X';
                ksort( $expect );
 
                $expect2 = $expect;
-               $expect2['UTLocalIdLookup4'] = 'X';
+               $expect2[$this->localUsers[3]->getName()] = 'X';
 
                $arg = array_fill_keys( array_keys( $expect ), 'X' );
 
@@ -98,7 +105,7 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
        public function testIsAttached() {
                $lookup = new LocalIdLookup();
-               $user1 = User::newFromName( 'UTLocalIdLookup1' );
+               $user1 = $this->getLookupUser();
                $user2 = User::newFromName( 'DoesNotExist' );
 
                $this->assertTrue( $lookup->isAttached( $user1 ) );
@@ -130,7 +137,7 @@ class LocalIdLookupTest extends MediaWikiTestCase {
                $lookup = new LocalIdLookup();
                $this->assertSame(
                        $sharedDB && $sharedTable && $localDBSet,
-                       $lookup->isAttached( User::newFromName( 'UTLocalIdLookup1' ), 'shared' )
+                       $lookup->isAttached( $this->getLookupUser(), 'shared' )
                );
        }
 
index c9b6929..801ab91 100644 (file)
@@ -213,11 +213,7 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::getEditCount
         */
        public function testEditCount() {
-               $user = User::newFromName( 'UnitTestUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
+               $user = $this->getMutableTestUser()->getUser();
 
                // let the user have a few (3) edits
                $page = WikiPage::factory( Title::newFromText( 'Help:UserTest_EditCount' ) );
@@ -249,17 +245,13 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::getOption
         */
        public function testOptions() {
-               $user = User::newFromName( 'UnitTestUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
+               $user = $this->getMutableTestUser()->getUser();
 
                $user->setOption( 'userjs-someoption', 'test' );
                $user->setOption( 'cols', 200 );
                $user->saveSettings();
 
-               $user = User::newFromName( 'UnitTestUser' );
+               $user = User::newFromName( $user->getName() );
                $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
                $this->assertEquals( 200, $user->getOption( 'cols' ) );
        }
@@ -298,7 +290,7 @@ class UserTest extends MediaWikiTestCase {
                                                'MinimalPasswordLength' => 6,
                                                'PasswordCannotMatchUsername' => true,
                                                'PasswordCannotMatchBlacklist' => true,
-                                               'MaximalPasswordLength' => 30,
+                                               'MaximalPasswordLength' => 40,
                                        ],
                                ],
                                'checks' => [
@@ -311,7 +303,8 @@ class UserTest extends MediaWikiTestCase {
                        ],
                ] );
 
-               $user = User::newFromName( 'Useruser' );
+               $user = static::getTestUser()->getUser();
+
                // Sanity
                $this->assertTrue( $user->isValidPassword( 'Password1234' ) );
 
@@ -322,18 +315,19 @@ class UserTest extends MediaWikiTestCase {
                $this->assertEquals( 'passwordtooshort', $user->getPasswordValidity( 'a' ) );
 
                // Maximum length
-               $longPass = str_repeat( 'a', 31 );
+               $longPass = str_repeat( 'a', 41 );
                $this->assertFalse( $user->isValidPassword( $longPass ) );
                $this->assertFalse( $user->checkPasswordValidity( $longPass )->isGood() );
                $this->assertFalse( $user->checkPasswordValidity( $longPass )->isOK() );
                $this->assertEquals( 'passwordtoolong', $user->getPasswordValidity( $longPass ) );
 
                // Matches username
-               $this->assertFalse( $user->checkPasswordValidity( 'Useruser' )->isGood() );
-               $this->assertTrue( $user->checkPasswordValidity( 'Useruser' )->isOK() );
-               $this->assertEquals( 'password-name-match', $user->getPasswordValidity( 'Useruser' ) );
+               $this->assertFalse( $user->checkPasswordValidity( $user->getName() )->isGood() );
+               $this->assertTrue( $user->checkPasswordValidity( $user->getName() )->isOK() );
+               $this->assertEquals( 'password-name-match', $user->getPasswordValidity( $user->getName() ) );
 
                // On the forbidden list
+               $user = User::newFromName( 'Useruser' );
                $this->assertFalse( $user->checkPasswordValidity( 'Passpass' )->isGood() );
                $this->assertEquals( 'password-login-forbidden', $user->getPasswordValidity( 'Passpass' ) );
        }
@@ -389,29 +383,23 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::equals
         */
        public function testEquals() {
-               $first = User::newFromName( 'EqualUser' );
-               $second = User::newFromName( 'EqualUser' );
+               $first = $this->getMutableTestUser()->getUser();
+               $second = User::newFromName( $first->getName() );
 
                $this->assertTrue( $first->equals( $first ) );
                $this->assertTrue( $first->equals( $second ) );
                $this->assertTrue( $second->equals( $first ) );
 
-               $third = User::newFromName( '0' );
-               $fourth = User::newFromName( '000' );
+               $third = $this->getMutableTestUser()->getUser();
+               $fourth = $this->getMutableTestUser()->getUser();
 
                $this->assertFalse( $third->equals( $fourth ) );
                $this->assertFalse( $fourth->equals( $third ) );
 
                // Test users loaded from db with id
-               $user = User::newFromName( 'EqualUnitTestUser' );
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               $id = $user->getId();
-
-               $fifth = User::newFromId( $id );
-               $sixth = User::newFromName( 'EqualUnitTestUser' );
+               $user = $this->getMutableTestUser()->getUser();
+               $fifth = User::newFromId( $user->getId() );
+               $sixth = User::newFromName( $user->getName() );
                $this->assertTrue( $fifth->equals( $sixth ) );
        }
 
@@ -419,7 +407,7 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::getId
         */
        public function testGetId() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestUser()->getUser();
                $this->assertTrue( $user->getId() > 0 );
 
        }
@@ -429,7 +417,7 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::isAnon
         */
        public function testLoggedIn() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = $this->getMutableTestUser()->getUser();
                $this->assertTrue( $user->isLoggedIn() );
                $this->assertFalse( $user->isAnon() );
 
@@ -447,7 +435,8 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::checkAndSetTouched
         */
        public function testCheckAndSetTouched() {
-               $user = TestingAccessWrapper::newFromObject( User::newFromName( 'UTSysop' ) );
+               $user = $this->getMutableTestUser()->getUser();
+               $user = TestingAccessWrapper::newFromObject( $user );
                $this->assertTrue( $user->isLoggedIn() );
 
                $touched = $user->getDBTouched();
index d13da60..baaa66b 100755 (executable)
@@ -75,7 +75,7 @@ class PHPUnitMaintClass extends Maintenance {
                global $wgLanguageConverterCacheType, $wgUseDatabaseMessages;
                global $wgLocaltimezone, $wgLocalisationCacheConf;
                global $wgDevelopmentWarnings;
-               global $wgSessionProviders;
+               global $wgSessionProviders, $wgSessionPbkdf2Iterations;
                global $wgJobTypeConf;
                global $wgAuthManagerConfig, $wgAuth, $wgDisableAuthManager;
 
@@ -125,6 +125,9 @@ class PHPUnitMaintClass extends Maintenance {
                        ],
                ];
 
+               // Single-iteration PBKDF2 session secret derivation, for speed.
+               $wgSessionPbkdf2Iterations = 1;
+
                // Generic AuthManager configuration for testing
                $wgAuthManagerConfig = [
                        'preauth' => [],
index ee854ae..edc2716 100644 (file)
@@ -4,7 +4,8 @@
        // TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
 
        QUnit.test( '"all" namespace disable checkboxes', 8, function ( assert ) {
-               var selectHtml, $env, $options;
+               var selectHtml, $env, $options,
+                       rc = require( 'mediawiki.special.recentchanges' );
 
                // from Special:Recentchanges
                selectHtml = '<select id="namespace" name="namespace" class="namespaceselector">'
@@ -32,7 +33,7 @@
                assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
 
                // Initiate the recentchanges module
-               mw.special.recentchanges.init();
+               rc.init();
 
                // By default
                assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );