Merge "resourceloader: Remove redundant var-freeing in addScript()"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 13 Mar 2019 18:11:21 +0000 (18:11 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 13 Mar 2019 18:11:21 +0000 (18:11 +0000)
116 files changed:
.phpcs.xml
INSTALL
RELEASE-NOTES-1.33
autoload.php
docs/hooks.txt
includes/Block.php
includes/DefaultSettings.php
includes/EditPage.php
includes/Linker.php
includes/OutputPage.php
includes/ProtectionForm.php
includes/Revision/RevisionStore.php
includes/Revision/RevisionStoreCacheRecord.php [new file with mode: 0644]
includes/WebRequest.php
includes/actions/HistoryAction.php
includes/actions/pagers/HistoryPager.php [new file with mode: 0644]
includes/api/ApiMain.php
includes/auth/AbstractPasswordPrimaryAuthenticationProvider.php
includes/auth/LocalPasswordPrimaryAuthenticationProvider.php
includes/content/ContentHandler.php
includes/db/DatabaseOracle.php
includes/diff/DiffEngine.php
includes/diff/RangeDifference.php [new file with mode: 0644]
includes/filerepo/file/ForeignAPIFile.php
includes/htmlform/fields/HTMLTitleTextField.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/SqliteInstaller.php
includes/installer/i18n/bg.json
includes/jobqueue/JobQueueDB.php
includes/jobqueue/jobs/CategoryMembershipChangeJob.php
includes/jobqueue/utils/PurgeJobUtils.php
includes/libs/filebackend/FileBackend.php
includes/libs/objectcache/BagOStuff.php
includes/libs/rdbms/database/DatabaseMysqli.php
includes/logging/LogEntry.php
includes/media/DjVuImage.php
includes/media/SVGMetadataExtractor.php
includes/pager/TablePager.php
includes/parser/BlockLevelPass.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/password/UserPasswordPolicy.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/session/CookieSessionProvider.php
includes/session/ImmutableSessionProviderWithCookie.php
includes/session/PHPSessionHandler.php
includes/session/SessionBackend.php
includes/session/SessionInfo.php
includes/session/Token.php
includes/session/UserInfo.php
includes/user/User.php
languages/Language.php
languages/i18n/ar.json
languages/i18n/az.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/ca.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/exif/fy.json
languages/i18n/fa.json
languages/i18n/fy.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/io.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/pl.json
languages/i18n/qqq.json
languages/i18n/sah.json
languages/i18n/sh.json
languages/i18n/sl.json
languages/i18n/tcy.json
languages/i18n/th.json
languages/i18n/uk.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/formatInstallDoc.php
maintenance/preprocessDump.php
mw-config/index.php
resources/Resources.php
resources/src/mediawiki.cookie.js [deleted file]
resources/src/mediawiki.cookie/index.js [new file with mode: 0644]
resources/src/mediawiki.pager.tablePager/TablePager.less
resources/src/mediawiki.widgets/mw.widgets.NamespacesMenuOptionWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.NamespacesMultiselectWidget.js
tests/common/TestsAutoLoader.php
tests/parser/ParserTestRunner.php
tests/parser/parserTests.txt
tests/phan/config.php
tests/phpunit/includes/Revision/RevisionStoreCacheRecordTest.php [new file with mode: 0644]
tests/phpunit/includes/Revision/RevisionStoreDbTestBase.php
tests/phpunit/includes/Revision/RevisionStoreTest.php
tests/phpunit/includes/auth/AbstractPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/password/UserPasswordPolicyTest.php
tests/phpunit/includes/session/TestUtils.php
tests/phpunit/structure/PasswordPolicyStructureTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js

index 171cfaf..f4d6177 100644 (file)
                        Whitelist existing violations, but enable the sniff to prevent
                        any new occurrences.
                -->
-               <exclude-pattern>*/includes/actions/HistoryAction\.php</exclude-pattern>
                <exclude-pattern>*/includes/api/ApiErrorFormatter\.php</exclude-pattern>
                <exclude-pattern>*/includes/api/ApiImport\.php</exclude-pattern>
                <exclude-pattern>*/includes/api/ApiMessage\.php</exclude-pattern>
                <exclude-pattern>*/includes/api/ApiRsd\.php</exclude-pattern>
                <exclude-pattern>*/includes/compat/XMPReader\.php</exclude-pattern>
                <exclude-pattern>*/includes/diff/DairikiDiff\.php</exclude-pattern>
-               <exclude-pattern>*/includes/diff/DiffEngine\.php</exclude-pattern>
                <exclude-pattern>*/includes/Feed\.php</exclude-pattern>
                <exclude-pattern>*/includes/filerepo/file/LocalFile\.php</exclude-pattern>
                <exclude-pattern>*/includes/gallery/PackedOverlayImageGallery\.php</exclude-pattern>
diff --git a/INSTALL b/INSTALL
index b6364e1..f31f753 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -10,7 +10,7 @@ Required software:
 * A SQL server, the following types are supported
 ** MySQL 5.5.8 or higher
 ** PostgreSQL 9.2 or higher
-** SQLite 3.3.7 or higher
+** SQLite 3.8.0 or higher
 ** Oracle 9.0.1 or higher
 ** Microsoft SQL Server 2005 (9.00.1399)
 
index 0180763..694dc46 100644 (file)
@@ -11,8 +11,6 @@ production.
 * $wgEnablePartialBlocks – This enables the Partial Blocks feature, which gives
   accounts with block permissions the ability to block users, IPs, and IP ranges
   from editing specific pages, while allowing them to edit the rest of the wiki.
-* $wgMediaInTargetLanguage – whether multilingual images should be dispalyed in
-  the current parse language where available.
 
 ==== Changed configuration ====
 * Some external link searches will not work correctly until update.php (or
@@ -61,6 +59,8 @@ production.
   (requires PHP 7.2+) and GPU hacking (7.3+).
 * Special:CreateAccount now warns the user if their chosen username has to be
   normalized.
+* (T205040) Multilingual images are now be displayed in the current parse
+  language where available.
 
 === External library changes in 1.33 ===
 
@@ -285,6 +285,8 @@ because of Phabricator reports.
 * Language::markNoConversion, deprecated in 1.32, has been removed. Use
   LanguageConverter::markNoConversion instead.
 * BagOStuff::modifySimpleRelayEvent() method has been removed.
+* ParserOutput::getLegacyOptions, deprecated in 1.30, has been removed.
+  Use ParserOutput::allCacheVaryingOptions instead.
 
 === Deprecations in 1.33 ===
 * The configuration option $wgUseESI has been deprecated, and is expected
@@ -364,7 +366,7 @@ The supported versions are:
 
 * MySQL 5.5.8 or later
 * PostgreSQL 9.2 or later
-* SQLite 3.3.7 or later
+* SQLite 3.8.0 or later
 * Oracle 9.0.1 or later
 * Microsoft SQL Server 2005 (9.00.1399)
 
index 403b610..9dad6f2 100644 (file)
@@ -630,7 +630,7 @@ $wgAutoloadLocalClasses = [
        'HistoryBlob' => __DIR__ . '/includes/HistoryBlob.php',
        'HistoryBlobCurStub' => __DIR__ . '/includes/HistoryBlob.php',
        'HistoryBlobStub' => __DIR__ . '/includes/HistoryBlob.php',
-       'HistoryPager' => __DIR__ . '/includes/actions/HistoryAction.php',
+       'HistoryPager' => __DIR__ . '/includes/actions/pagers/HistoryPager.php',
        'Hooks' => __DIR__ . '/includes/Hooks.php',
        'Html' => __DIR__ . '/includes/Html.php',
        'HtmlArmor' => __DIR__ . '/includes/libs/HtmlArmor.php',
@@ -1186,7 +1186,7 @@ $wgAutoloadLocalClasses = [
        'RSSFeed' => __DIR__ . '/includes/Feed.php',
        'RandomPage' => __DIR__ . '/includes/specials/SpecialRandompage.php',
        'RangeChronologicalPager' => __DIR__ . '/includes/pager/RangeChronologicalPager.php',
-       'RangeDifference' => __DIR__ . '/includes/diff/DiffEngine.php',
+       'RangeDifference' => __DIR__ . '/includes/diff/RangeDifference.php',
        'RawAction' => __DIR__ . '/includes/actions/RawAction.php',
        'RawMessage' => __DIR__ . '/includes/RawMessage.php',
        'ReadOnlyError' => __DIR__ . '/includes/exception/ReadOnlyError.php',
index ae4a4dc..9e6ed10 100644 (file)
@@ -2431,10 +2431,12 @@ $flags: Flags passed to WikiPage::doEditContent()
 $revision: New Revision of the article
 
 'PageContentLanguage': Allows changing the language in which the content of a
-page is written. Defaults to the wiki content language ($wgContLang).
+page is written. Defaults to the wiki content language.
 $title: Title object
-&$pageLang: the page content language (either an object or a language code)
-$wgLang: the user language
+&$pageLang: the page content language. Input can be anything (under control of
+  hook subscribers), but hooks should return Language objects. Language code
+  strings are deprecated.
+$userLang: the user language (Language or StubUserLang object)
 
 'PageContentSave': Before an article is saved.
 $wikiPage: the WikiPage (object) being saved
index 6abc83a..65408f6 100644 (file)
@@ -1294,10 +1294,10 @@ class Block {
         */
        public function getRedactedName() {
                if ( $this->mAuto ) {
-                       return Html::rawElement(
+                       return Html::element(
                                'span',
                                [ 'class' => 'mw-autoblockid' ],
-                               wfMessage( 'autoblockid', $this->mId )
+                               wfMessage( 'autoblockid', $this->mId )->text()
                        );
                } else {
                        return htmlspecialchars( $this->getTarget() );
index 7d0f108..4ec82ed 100644 (file)
@@ -4445,6 +4445,11 @@ $wgCentralIdLookupProvider = 'local';
  * - value: (number, boolean or null) the value to pass to the callback
  * - forceChange: (bool, default false) if the password is invalid, do
  *   not let the user log in without changing the password
+ * - suggestChangeOnLogin: (bool, default false) if true and the password is
+ *   invalid, suggest a password change if logging in. If all the failing policies
+ *   that apply to the user have this set to false, the password change
+ *   screen will not be shown. 'forceChange' takes precedence over
+ *   'suggestChangeOnLogin' if they are both present.
  * As a shorthand for [ 'value' => <value> ], simply <value> can be written.
  * When multiple password policies are defined for a user, the settings
  * arrays are merged, and for fields which are set in both arrays, the
@@ -4514,10 +4519,10 @@ $wgPasswordPolicy = [
                        'PasswordNotInLargeBlacklist' => true,
                ],
                'default' => [
-                       'MinimalPasswordLength' => 1,
-                       'PasswordCannotMatchUsername' => true,
-                       'PasswordCannotMatchBlacklist' => true,
-                       'MaximalPasswordLength' => 4096,
+                       'MinimalPasswordLength' => [ 'value' => 1, 'suggestChangeOnLogin' => true ],
+                       'PasswordCannotMatchUsername' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
+                       'PasswordCannotMatchBlacklist' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
+                       'MaximalPasswordLength' => [ 'value' => 4096, 'suggestChangeOnLogin' => true ],
                ],
        ],
        'checks' => [
index 2048b87..41238df 100644 (file)
@@ -1667,11 +1667,10 @@ class EditPage {
                        case self::AS_SUCCESS_NEW_ARTICLE:
                                $query = $resultDetails['redirect'] ? 'redirect=no' : '';
                                if ( $extraQueryRedirect ) {
-                                       if ( $query === '' ) {
-                                               $query = $extraQueryRedirect;
-                                       } else {
-                                               $query .= '&' . $extraQueryRedirect;
+                                       if ( $query !== '' ) {
+                                               $query .= '&';
                                        }
+                                       $query .= $extraQueryRedirect;
                                }
                                $anchor = $resultDetails['sectionanchor'] ?? '';
                                $out->redirect( $this->mTitle->getFullURL( $query ) . $anchor );
@@ -1688,18 +1687,16 @@ class EditPage {
                                );
 
                                if ( $resultDetails['redirect'] ) {
-                                       if ( $extraQuery == '' ) {
-                                               $extraQuery = 'redirect=no';
-                                       } else {
-                                               $extraQuery = 'redirect=no&' . $extraQuery;
+                                       if ( $extraQuery !== '' ) {
+                                               $extraQuery = '&' . $extraQuery;
                                        }
+                                       $extraQuery = 'redirect=no' . $extraQuery;
                                }
                                if ( $extraQueryRedirect ) {
-                                       if ( $extraQuery === '' ) {
-                                               $extraQuery = $extraQueryRedirect;
-                                       } else {
-                                               $extraQuery .= '&' . $extraQueryRedirect;
+                                       if ( $extraQuery !== '' ) {
+                                               $extraQuery .= '&';
                                        }
+                                       $extraQuery .= $extraQueryRedirect;
                                }
 
                                $out->redirect( $this->mTitle->getFullURL( $extraQuery ) . $sectionanchor );
index 2c7f44c..3e50ac6 100644 (file)
@@ -1607,9 +1607,8 @@ class Linker {
         * @return string Full html of the TOC
         */
        public static function tocList( $toc, $lang = null ) {
-               global $wgLang;
-               $lang = $lang ?? $wgLang;
-               if ( !is_object( $lang ) ) {
+               $lang = $lang ?? RequestContext::getMain()->getLanguage();
+               if ( !$lang instanceof Language ) {
                        wfDeprecated( __METHOD__ . ' with type other than Language for $lang', '1.33' );
                        $lang = wfGetLangObj( $lang );
                }
index 9b7d9a0..732e363 100644 (file)
@@ -1614,7 +1614,7 @@ class OutputPage extends ContextSource {
                }
 
                if ( !$this->mParserOptions ) {
-                       if ( !$this->getContext()->getUser()->isSafeToLoad() ) {
+                       if ( !$this->getUser()->isSafeToLoad() ) {
                                // $wgUser isn't unstubbable yet, so don't try to get a
                                // ParserOptions for it. And don't cache this ParserOptions
                                // either.
index 6ce7ef4..0e18e46 100644 (file)
@@ -622,10 +622,10 @@ class ProtectionForm {
        /**
         * Show protection long extracts for this page
         *
-        * @param OutputPage &$out
+        * @param OutputPage $out
         * @private
         */
-       function showLogExtract( &$out ) {
+       function showLogExtract( OutputPage $out ) {
                # Show relevant lines from the protection log:
                $protectLogPage = new LogPage( 'protect' );
                $out->addHTML( Xml::element( 'h2', null, $protectLogPage->getName()->text() ) );
index ee6bf67..632bd31 100644 (file)
@@ -1760,10 +1760,16 @@ class RevisionStore
         * @param object $row
         * @param int $queryFlags
         * @param Title|null $title
-        *
+        * @param bool $fromCache if true, the returned RevisionRecord will ensure that no stale
+        *   data is returned from getters, by querying the database as needed
         * @return RevisionRecord
         */
-       public function newRevisionFromRow( $row, $queryFlags = 0, Title $title = null ) {
+       public function newRevisionFromRow(
+               $row,
+               $queryFlags = 0,
+               Title $title = null,
+               $fromCache = false
+       ) {
                Assert::parameterType( 'object', $row, '$row' );
 
                if ( !$title ) {
@@ -1797,7 +1803,23 @@ class RevisionStore
 
                $slots = $this->newRevisionSlots( $row->rev_id, $row, $queryFlags, $title );
 
-               return new RevisionStoreRecord( $title, $user, $comment, $row, $slots, $this->wikiId );
+               // If this is a cached row, instantiate a cache-aware revision class to avoid stale data.
+               if ( $fromCache ) {
+                       $rev = new RevisionStoreCacheRecord(
+                               function ( $revId ) use ( $queryFlags ) {
+                                       $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
+                                       return $this->fetchRevisionRowFromConds(
+                                               $db,
+                                               [ 'rev_id' => intval( $revId ) ]
+                                       );
+                               },
+                               $title, $user, $comment, $row, $slots, $this->wikiId
+                       );
+               } else {
+                       $rev = new RevisionStoreRecord(
+                               $title, $user, $comment, $row, $slots, $this->wikiId );
+               }
+               return $rev;
        }
 
        /**
@@ -2773,27 +2795,29 @@ class RevisionStore
                        return false;
                }
 
+               // Load the row from cache if possible.  If not possible, populate the cache.
+               // As a minor optimization, remember if this was a cache hit or miss.
+               // We can sometimes avoid a database query later if this is a cache miss.
+               $fromCache = true;
                $row = $this->cache->getWithSetCallback(
                        // Page/rev IDs passed in from DB to reflect history merges
                        $this->getRevisionRowCacheKey( $db, $pageId, $revId ),
                        WANObjectCache::TTL_WEEK,
-                       function ( $curValue, &$ttl, array &$setOpts ) use ( $db, $pageId, $revId ) {
+                       function ( $curValue, &$ttl, array &$setOpts ) use (
+                               $db, $pageId, $revId, &$fromCache
+                       ) {
                                $setOpts += Database::getCacheSetOptions( $db );
-
-                               $conds = [
-                                       'rev_page' => intval( $pageId ),
-                                       'page_id' => intval( $pageId ),
-                                       'rev_id' => intval( $revId ),
-                               ];
-
-                               $row = $this->fetchRevisionRowFromConds( $db, $conds );
-                               return $row ?: false; // don't cache negatives
+                               $row = $this->fetchRevisionRowFromConds( $db, [ 'rev_id' => intval( $revId ) ] );
+                               if ( $row ) {
+                                       $fromCache = false;
+                               }
+                               return $row; // don't cache negatives
                        }
                );
 
-               // Reflect revision deletion and user renames
+               // Reflect revision deletion and user renames.
                if ( $row ) {
-                       return $this->newRevisionFromRow( $row, 0, $title );
+                       return $this->newRevisionFromRow( $row, 0, $title, $fromCache );
                } else {
                        return false;
                }
diff --git a/includes/Revision/RevisionStoreCacheRecord.php b/includes/Revision/RevisionStoreCacheRecord.php
new file mode 100644 (file)
index 0000000..ef5f10e
--- /dev/null
@@ -0,0 +1,137 @@
+<?php
+/**
+ * A RevisionStoreRecord loaded from the cache.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Revision;
+
+use MediaWiki\User\UserIdentity;
+use MediaWiki\User\UserIdentityValue;
+use CommentStoreComment;
+use InvalidArgumentException;
+use Title;
+use User;
+
+/**
+ * A cached RevisionStoreRecord.  Ensures that changes performed "behind the back"
+ * of the cache do not cause the revision record to deliver stale data.
+ *
+ * @since 1.33
+ */
+class RevisionStoreCacheRecord extends RevisionStoreRecord {
+
+       /**
+        * @var callable
+        */
+       private $mCallback;
+
+       /**
+        * @note Avoid calling this constructor directly. Use the appropriate methods
+        * in RevisionStore instead.
+        *
+        * @param callable $callback Callback for loading data.  Signature: function ( $id ): object
+        * @param Title $title The title of the page this Revision is associated with.
+        * @param UserIdentity $user
+        * @param CommentStoreComment $comment
+        * @param object $row A row from the revision table. Use RevisionStore::getQueryInfo() to build
+        *        a query that yields the required fields.
+        * @param RevisionSlots $slots The slots of this revision.
+        * @param bool|string $wikiId the wiki ID of the site this Revision belongs to,
+        *        or false for the local site.
+        */
+       function __construct(
+               $callback,
+               Title $title,
+               UserIdentity $user,
+               CommentStoreComment $comment,
+               $row,
+               RevisionSlots $slots,
+               $wikiId = false
+       ) {
+               parent::__construct( $title, $user, $comment, $row, $slots, $wikiId );
+               $this->mCallback = $callback;
+       }
+
+       /**
+        * Overridden to ensure that we return a fresh value and not a cached one.
+        *
+        * @return int
+        */
+       public function getVisibility() {
+               if ( $this->mCallback ) {
+                       $this->loadFreshRow();
+               }
+               return parent::getVisibility();
+       }
+
+       /**
+        * Overridden to ensure that we return a fresh value and not a cached one.
+        *
+        * @param int $audience
+        * @param User|null $user
+        *
+        * @return UserIdentity The identity of the revision author, null if access is forbidden.
+        */
+       public function getUser( $audience = self::FOR_PUBLIC, User $user = null ) {
+               if ( $this->mCallback ) {
+                       $this->loadFreshRow();
+               }
+               return parent::getUser( $audience, $user );
+       }
+
+       /**
+        * Load a fresh row from the database to ensure we return updated information
+
+        * @throws RevisionAccessException if the row could not be loaded
+        */
+       private function loadFreshRow() {
+               $freshRow = call_user_func( $this->mCallback, $this->mId );
+
+               // Set to null to ensure we do not make unnecessary queries for subsequent getter calls,
+               // and to allow the closure to be freed.
+               $this->mCallback = null;
+
+               if ( $freshRow ) {
+                       $this->mDeleted = intval( $freshRow->rev_deleted );
+
+                       try {
+                               $this->mUser = User::newFromAnyId(
+                                       $freshRow->rev_user ?? null,
+                                       $freshRow->rev_user_text ?? null,
+                                       $freshRow->rev_actor ?? null
+                               );
+                       } catch ( InvalidArgumentException $ex ) {
+                               wfWarn(
+                                       __METHOD__
+                                       . ': '
+                                       . $this->mTitle->getPrefixedDBkey()
+                                       . ': '
+                                       . $ex->getMessage()
+                               );
+                               $this->mUser = new UserIdentityValue( 0, 'Unknown user', 0 );
+                       }
+               } else {
+                       throw new RevisionAccessException(
+                               'Unable to load fresh row for rev_id: ' . $this->mId
+                       );
+               }
+       }
+
+}
index ed10615..e5cdda6 100644 (file)
@@ -1309,7 +1309,7 @@ HTML;
         *
         * This means that the client is not requesting any state changes and that database writes
         * are not inherently required. Ideally, no visible updates would happen at all. If they
-        * must, then they should not be publically attributed to the end user.
+        * must, then they should not be publicly attributed to the end user.
         *
         * In more detail:
         *   - Cache populations and refreshes MAY occur.
index 39bc830..fbf43e0 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * Page history
  *
- * Split off from Article.php and Skin.php, 2003-12-22
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -382,607 +380,3 @@ class HistoryAction extends FormlessAction {
                );
        }
 }
-
-/**
- * @ingroup Pager
- * @ingroup Actions
- */
-class HistoryPager extends ReverseChronologicalPager {
-       /**
-        * @var bool|stdClass
-        */
-       public $lastRow = false;
-
-       public $counter, $historyPage, $buttons, $conds;
-
-       protected $oldIdChecked;
-
-       protected $preventClickjacking = false;
-       /**
-        * @var array
-        */
-       protected $parentLens;
-
-       /** @var bool Whether to show the tag editing UI */
-       protected $showTagEditUI;
-
-       /** @var string */
-       private $tagFilter;
-
-       /**
-        * @param HistoryAction $historyPage
-        * @param string $year
-        * @param string $month
-        * @param string $tagFilter
-        * @param array $conds
-        */
-       public function __construct(
-               HistoryAction $historyPage,
-               $year = '',
-               $month = '',
-               $tagFilter = '',
-               array $conds = []
-       ) {
-               parent::__construct( $historyPage->getContext() );
-               $this->historyPage = $historyPage;
-               $this->tagFilter = $tagFilter;
-               $this->getDateCond( $year, $month );
-               $this->conds = $conds;
-               $this->showTagEditUI = ChangeTags::showTagEditingUI( $this->getUser() );
-       }
-
-       // For hook compatibility...
-       function getArticle() {
-               return $this->historyPage->getArticle();
-       }
-
-       function getSqlComment() {
-               if ( $this->conds ) {
-                       return 'history page filtered'; // potentially slow, see CR r58153
-               } else {
-                       return 'history page unfiltered';
-               }
-       }
-
-       function getQueryInfo() {
-               $revQuery = Revision::getQueryInfo( [ 'user' ] );
-               $queryInfo = [
-                       'tables' => $revQuery['tables'],
-                       'fields' => $revQuery['fields'],
-                       'conds' => array_merge(
-                               [ 'rev_page' => $this->getWikiPage()->getId() ],
-                               $this->conds ),
-                       'options' => [ 'USE INDEX' => [ 'revision' => 'page_timestamp' ] ],
-                       'join_conds' => $revQuery['joins'],
-               ];
-               ChangeTags::modifyDisplayQuery(
-                       $queryInfo['tables'],
-                       $queryInfo['fields'],
-                       $queryInfo['conds'],
-                       $queryInfo['join_conds'],
-                       $queryInfo['options'],
-                       $this->tagFilter
-               );
-
-               // Avoid PHP 7.1 warning of passing $this by reference
-               $historyPager = $this;
-               Hooks::run( 'PageHistoryPager::getQueryInfo', [ &$historyPager, &$queryInfo ] );
-
-               return $queryInfo;
-       }
-
-       function getIndexField() {
-               return 'rev_timestamp';
-       }
-
-       /**
-        * @param stdClass $row
-        * @return string
-        */
-       function formatRow( $row ) {
-               if ( $this->lastRow ) {
-                       $latest = ( $this->counter == 1 && $this->mIsFirst );
-                       $firstInList = $this->counter == 1;
-                       $this->counter++;
-
-                       $notifTimestamp = $this->getConfig()->get( 'ShowUpdatedMarker' )
-                               ? $this->getTitle()->getNotificationTimestamp( $this->getUser() )
-                               : false;
-
-                       $s = $this->historyLine(
-                               $this->lastRow, $row, $notifTimestamp, $latest, $firstInList );
-               } else {
-                       $s = '';
-               }
-               $this->lastRow = $row;
-
-               return $s;
-       }
-
-       protected function doBatchLookups() {
-               if ( !Hooks::run( 'PageHistoryPager::doBatchLookups', [ $this, $this->mResult ] ) ) {
-                       return;
-               }
-
-               # Do a link batch query
-               $this->mResult->seek( 0 );
-               $batch = new LinkBatch();
-               $revIds = [];
-               foreach ( $this->mResult as $row ) {
-                       if ( $row->rev_parent_id ) {
-                               $revIds[] = $row->rev_parent_id;
-                       }
-                       if ( $row->user_name !== null ) {
-                               $batch->add( NS_USER, $row->user_name );
-                               $batch->add( NS_USER_TALK, $row->user_name );
-                       } else { # for anons or usernames of imported revisions
-                               $batch->add( NS_USER, $row->rev_user_text );
-                               $batch->add( NS_USER_TALK, $row->rev_user_text );
-                       }
-               }
-               $this->parentLens = Revision::getParentLengths( $this->mDb, $revIds );
-               $batch->execute();
-               $this->mResult->seek( 0 );
-       }
-
-       /**
-        * Creates begin of history list with a submit button
-        *
-        * @return string HTML output
-        */
-       protected function getStartBody() {
-               $this->lastRow = false;
-               $this->counter = 1;
-               $this->oldIdChecked = 0;
-
-               $this->getOutput()->wrapWikiMsg( "<div class='mw-history-legend'>\n$1\n</div>", 'histlegend' );
-               $s = Html::openElement( 'form', [ 'action' => wfScript(),
-                       'id' => 'mw-history-compare' ] ) . "\n";
-               $s .= Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n";
-               $s .= Html::hidden( 'action', 'historysubmit' ) . "\n";
-               $s .= Html::hidden( 'type', 'revision' ) . "\n";
-
-               // Button container stored in $this->buttons for re-use in getEndBody()
-               $this->buttons = '<div>';
-               $className = 'historysubmit mw-history-compareselectedversions-button';
-               $attrs = [ 'class' => $className ]
-                       + Linker::tooltipAndAccesskeyAttribs( 'compareselectedversions' );
-               $this->buttons .= $this->submitButton( $this->msg( 'compareselectedversions' )->text(),
-                       $attrs
-               ) . "\n";
-
-               $user = $this->getUser();
-               $actionButtons = '';
-               if ( $user->isAllowed( 'deleterevision' ) ) {
-                       $actionButtons .= $this->getRevisionButton( 'revisiondelete', 'showhideselectedversions' );
-               }
-               if ( $this->showTagEditUI ) {
-                       $actionButtons .= $this->getRevisionButton( 'editchangetags', 'history-edit-tags' );
-               }
-               if ( $actionButtons ) {
-                       $this->buttons .= Xml::tags( 'div', [ 'class' =>
-                               'mw-history-revisionactions' ], $actionButtons );
-               }
-
-               if ( $user->isAllowed( 'deleterevision' ) || $this->showTagEditUI ) {
-                       $this->buttons .= ( new ListToggle( $this->getOutput() ) )->getHTML();
-               }
-
-               $this->buttons .= '</div>';
-
-               $s .= $this->buttons;
-               $s .= '<ul id="pagehistory">' . "\n";
-
-               return $s;
-       }
-
-       private function getRevisionButton( $name, $msg ) {
-               $this->preventClickjacking();
-               # Note T22966, <button> is non-standard in IE<8
-               $element = Html::element(
-                       'button',
-                       [
-                               'type' => 'submit',
-                               'name' => $name,
-                               'value' => '1',
-                               'class' => "historysubmit mw-history-$name-button",
-                       ],
-                       $this->msg( $msg )->text()
-               ) . "\n";
-               return $element;
-       }
-
-       protected function getEndBody() {
-               if ( $this->lastRow ) {
-                       $latest = $this->counter == 1 && $this->mIsFirst;
-                       $firstInList = $this->counter == 1;
-                       if ( $this->mIsBackwards ) {
-                               # Next row is unknown, but for UI reasons, probably exists if an offset has been specified
-                               if ( $this->mOffset == '' ) {
-                                       $next = null;
-                               } else {
-                                       $next = 'unknown';
-                               }
-                       } else {
-                               # The next row is the past-the-end row
-                               $next = $this->mPastTheEndRow;
-                       }
-                       $this->counter++;
-
-                       $notifTimestamp = $this->getConfig()->get( 'ShowUpdatedMarker' )
-                               ? $this->getTitle()->getNotificationTimestamp( $this->getUser() )
-                               : false;
-
-                       $s = $this->historyLine(
-                               $this->lastRow, $next, $notifTimestamp, $latest, $firstInList );
-               } else {
-                       $s = '';
-               }
-               $s .= "</ul>\n";
-               # Add second buttons only if there is more than one rev
-               if ( $this->getNumRows() > 2 ) {
-                       $s .= $this->buttons;
-               }
-               $s .= '</form>';
-
-               return $s;
-       }
-
-       /**
-        * Creates a submit button
-        *
-        * @param string $message Text of the submit button, will be escaped
-        * @param array $attributes
-        * @return string HTML output for the submit button
-        */
-       function submitButton( $message, $attributes = [] ) {
-               # Disable submit button if history has 1 revision only
-               if ( $this->getNumRows() > 1 ) {
-                       return Html::submitButton( $message, $attributes );
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * Returns a row from the history printout.
-        *
-        * @todo document some more, and maybe clean up the code (some params redundant?)
-        *
-        * @param stdClass $row The database row corresponding to the previous line.
-        * @param mixed $next The database row corresponding to the next line
-        *   (chronologically previous)
-        * @param bool|string $notificationtimestamp
-        * @param bool $latest Whether this row corresponds to the page's latest revision.
-        * @param bool $firstInList Whether this row corresponds to the first
-        *   displayed on this history page.
-        * @return string HTML output for the row
-        */
-       function historyLine( $row, $next, $notificationtimestamp = false,
-               $latest = false, $firstInList = false ) {
-               $rev = new Revision( $row, 0, $this->getTitle() );
-
-               if ( is_object( $next ) ) {
-                       $prevRev = new Revision( $next, 0, $this->getTitle() );
-               } else {
-                       $prevRev = null;
-               }
-
-               $curlink = $this->curLink( $rev, $latest );
-               $lastlink = $this->lastLink( $rev, $next );
-               $curLastlinks = $curlink . $this->historyPage->message['pipe-separator'] . $lastlink;
-               $histLinks = Html::rawElement(
-                       'span',
-                       [ 'class' => 'mw-history-histlinks' ],
-                       $this->msg( 'parentheses' )->rawParams( $curLastlinks )->escaped()
-               );
-
-               $diffButtons = $this->diffButtons( $rev, $firstInList );
-               $s = $histLinks . $diffButtons;
-
-               $link = $this->revLink( $rev );
-               $classes = [];
-
-               $del = '';
-               $user = $this->getUser();
-               $canRevDelete = $user->isAllowed( 'deleterevision' );
-               // Show checkboxes for each revision, to allow for revision deletion and
-               // change tags
-               if ( $canRevDelete || $this->showTagEditUI ) {
-                       $this->preventClickjacking();
-                       // If revision was hidden from sysops and we don't need the checkbox
-                       // for anything else, disable it
-                       if ( !$this->showTagEditUI && !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
-                               $del = Xml::check( 'deleterevisions', false, [ 'disabled' => 'disabled' ] );
-                       // Otherwise, enable the checkbox...
-                       } else {
-                               $del = Xml::check( 'showhiderevisions', false,
-                                       [ 'name' => 'ids[' . $rev->getId() . ']' ] );
-                       }
-               // User can only view deleted revisions...
-               } elseif ( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) {
-                       // If revision was hidden from sysops, disable the link
-                       if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
-                               $del = Linker::revDeleteLinkDisabled( false );
-                       // Otherwise, show the link...
-                       } else {
-                               $query = [ 'type' => 'revision',
-                                       'target' => $this->getTitle()->getPrefixedDBkey(), 'ids' => $rev->getId() ];
-                               $del .= Linker::revDeleteLink( $query,
-                                       $rev->isDeleted( Revision::DELETED_RESTRICTED ), false );
-                       }
-               }
-               if ( $del ) {
-                       $s .= " $del ";
-               }
-
-               $lang = $this->getLanguage();
-               $dirmark = $lang->getDirMark();
-
-               $s .= " $link";
-               $s .= $dirmark;
-               $s .= " <span class='history-user'>" .
-                       Linker::revUserTools( $rev, true ) . "</span>";
-               $s .= $dirmark;
-
-               if ( $rev->isMinor() ) {
-                       $s .= ' ' . ChangesList::flag( 'minor', $this->getContext() );
-               }
-
-               # Sometimes rev_len isn't populated
-               if ( $rev->getSize() !== null ) {
-                       # Size is always public data
-                       $prevSize = $this->parentLens[$row->rev_parent_id] ?? 0;
-                       $sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
-                       $fSize = Linker::formatRevisionSize( $rev->getSize() );
-                       $s .= ' <span class="mw-changeslist-separator">. .</span> ' . "$fSize $sDiff";
-               }
-
-               # Text following the character difference is added just before running hooks
-               $s2 = Linker::revComment( $rev, false, true );
-
-               if ( $notificationtimestamp && ( $row->rev_timestamp >= $notificationtimestamp ) ) {
-                       $s2 .= ' <span class="updatedmarker">' . $this->msg( 'updatedmarker' )->escaped() . '</span>';
-                       $classes[] = 'mw-history-line-updated';
-               }
-
-               $tools = [];
-
-               # Rollback and undo links
-               if ( $prevRev && $this->getTitle()->quickUserCan( 'edit', $user ) ) {
-                       if ( $latest && $this->getTitle()->quickUserCan( 'rollback', $user ) ) {
-                               // Get a rollback link without the brackets
-                               $rollbackLink = Linker::generateRollback(
-                                       $rev,
-                                       $this->getContext(),
-                                       [ 'verify', 'noBrackets' ]
-                               );
-                               if ( $rollbackLink ) {
-                                       $this->preventClickjacking();
-                                       $tools[] = $rollbackLink;
-                               }
-                       }
-
-                       if ( !$rev->isDeleted( Revision::DELETED_TEXT )
-                               && !$prevRev->isDeleted( Revision::DELETED_TEXT )
-                       ) {
-                               # Create undo tooltip for the first (=latest) line only
-                               $undoTooltip = $latest
-                                       ? [ 'title' => $this->msg( 'tooltip-undo' )->text() ]
-                                       : [];
-                               $undolink = MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
-                                       $this->getTitle(),
-                                       $this->msg( 'editundo' )->text(),
-                                       $undoTooltip,
-                                       [
-                                               'action' => 'edit',
-                                               'undoafter' => $prevRev->getId(),
-                                               'undo' => $rev->getId()
-                                       ]
-                               );
-                               $tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
-                       }
-               }
-               // Allow extension to add their own links here
-               Hooks::run( 'HistoryRevisionTools', [ $rev, &$tools, $prevRev, $user ] );
-
-               if ( $tools ) {
-                       $s2 .= ' ' . $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
-               }
-
-               # Tags
-               list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow(
-                       $row->ts_tags,
-                       'history',
-                       $this->getContext()
-               );
-               $classes = array_merge( $classes, $newClasses );
-               if ( $tagSummary !== '' ) {
-                       $s2 .= " $tagSummary";
-               }
-
-               # Include separator between character difference and following text
-               if ( $s2 !== '' ) {
-                       $s .= ' <span class="mw-changeslist-separator">. .</span> ' . $s2;
-               }
-
-               $attribs = [ 'data-mw-revid' => $rev->getId() ];
-
-               Hooks::run( 'PageHistoryLineEnding', [ $this, &$row, &$s, &$classes, &$attribs ] );
-               $attribs = array_filter( $attribs,
-                       [ Sanitizer::class, 'isReservedDataAttribute' ],
-                       ARRAY_FILTER_USE_KEY
-               );
-
-               if ( $classes ) {
-                       $attribs['class'] = implode( ' ', $classes );
-               }
-
-               return Xml::tags( 'li', $attribs, $s ) . "\n";
-       }
-
-       /**
-        * Create a link to view this revision of the page
-        *
-        * @param Revision $rev
-        * @return string
-        */
-       function revLink( $rev ) {
-               $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $this->getUser() );
-               if ( $rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
-                       $link = MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
-                               $this->getTitle(),
-                               $date,
-                               [ 'class' => 'mw-changeslist-date' ],
-                               [ 'oldid' => $rev->getId() ]
-                       );
-               } else {
-                       $link = htmlspecialchars( $date );
-               }
-               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-                       $link = "<span class=\"history-deleted\">$link</span>";
-               }
-
-               return $link;
-       }
-
-       /**
-        * Create a diff-to-current link for this revision for this page
-        *
-        * @param Revision $rev
-        * @param bool $latest This is the latest revision of the page?
-        * @return string
-        */
-       function curLink( $rev, $latest ) {
-               $cur = $this->historyPage->message['cur'];
-               if ( $latest || !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
-                       return $cur;
-               } else {
-                       return MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
-                               $this->getTitle(),
-                               new HtmlArmor( $cur ),
-                               [],
-                               [
-                                       'diff' => $this->getWikiPage()->getLatest(),
-                                       'oldid' => $rev->getId()
-                               ]
-                       );
-               }
-       }
-
-       /**
-        * Create a diff-to-previous link for this revision for this page.
-        *
-        * @param Revision $prevRev The revision being displayed
-        * @param stdClass|string|null $next The next revision in list (that is
-        *        the previous one in chronological order).
-        *        May either be a row, "unknown" or null.
-        * @return string
-        */
-       function lastLink( $prevRev, $next ) {
-               $last = $this->historyPage->message['last'];
-
-               if ( $next === null ) {
-                       # Probably no next row
-                       return $last;
-               }
-
-               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
-               if ( $next === 'unknown' ) {
-                       # Next row probably exists but is unknown, use an oldid=prev link
-                       return $linkRenderer->makeKnownLink(
-                               $this->getTitle(),
-                               new HtmlArmor( $last ),
-                               [],
-                               [
-                                       'diff' => $prevRev->getId(),
-                                       'oldid' => 'prev'
-                               ]
-                       );
-               }
-
-               $nextRev = new Revision( $next );
-
-               if ( !$prevRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
-                       || !$nextRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
-               ) {
-                       return $last;
-               }
-
-               return $linkRenderer->makeKnownLink(
-                       $this->getTitle(),
-                       new HtmlArmor( $last ),
-                       [],
-                       [
-                               'diff' => $prevRev->getId(),
-                               'oldid' => $next->rev_id
-                       ]
-               );
-       }
-
-       /**
-        * Create radio buttons for page history
-        *
-        * @param Revision $rev
-        * @param bool $firstInList Is this version the first one?
-        *
-        * @return string HTML output for the radio buttons
-        */
-       function diffButtons( $rev, $firstInList ) {
-               if ( $this->getNumRows() > 1 ) {
-                       $id = $rev->getId();
-                       $radio = [ 'type' => 'radio', 'value' => $id ];
-                       /** @todo Move title texts to javascript */
-                       if ( $firstInList ) {
-                               $first = Xml::element( 'input',
-                                       array_merge( $radio, [
-                                               'style' => 'visibility:hidden',
-                                               'name' => 'oldid',
-                                               'id' => 'mw-oldid-null' ] )
-                               );
-                               $checkmark = [ 'checked' => 'checked' ];
-                       } else {
-                               # Check visibility of old revisions
-                               if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
-                                       $radio['disabled'] = 'disabled';
-                                       $checkmark = []; // We will check the next possible one
-                               } elseif ( !$this->oldIdChecked ) {
-                                       $checkmark = [ 'checked' => 'checked' ];
-                                       $this->oldIdChecked = $id;
-                               } else {
-                                       $checkmark = [];
-                               }
-                               $first = Xml::element( 'input',
-                                       array_merge( $radio, $checkmark, [
-                                               'name' => 'oldid',
-                                               'id' => "mw-oldid-$id" ] ) );
-                               $checkmark = [];
-                       }
-                       $second = Xml::element( 'input',
-                               array_merge( $radio, $checkmark, [
-                                       'name' => 'diff',
-                                       'id' => "mw-diff-$id" ] ) );
-
-                       return $first . $second;
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * This is called if a write operation is possible from the generated HTML
-        * @param bool $enable
-        */
-       function preventClickjacking( $enable = true ) {
-               $this->preventClickjacking = $enable;
-       }
-
-       /**
-        * Get the "prevent clickjacking" flag
-        * @return bool
-        */
-       function getPreventClickjacking() {
-               return $this->preventClickjacking;
-       }
-
-}
diff --git a/includes/actions/pagers/HistoryPager.php b/includes/actions/pagers/HistoryPager.php
new file mode 100644 (file)
index 0000000..a59597f
--- /dev/null
@@ -0,0 +1,628 @@
+<?php
+/**
+ * Page history pager
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Actions
+ */
+
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @ingroup Pager
+ * @ingroup Actions
+ */
+class HistoryPager extends ReverseChronologicalPager {
+       /**
+        * @var bool|stdClass
+        */
+       public $lastRow = false;
+
+       public $counter, $historyPage, $buttons, $conds;
+
+       protected $oldIdChecked;
+
+       protected $preventClickjacking = false;
+       /**
+        * @var array
+        */
+       protected $parentLens;
+
+       /** @var bool Whether to show the tag editing UI */
+       protected $showTagEditUI;
+
+       /** @var string */
+       private $tagFilter;
+
+       /**
+        * @param HistoryAction $historyPage
+        * @param string $year
+        * @param string $month
+        * @param string $tagFilter
+        * @param array $conds
+        */
+       public function __construct(
+               HistoryAction $historyPage,
+               $year = '',
+               $month = '',
+               $tagFilter = '',
+               array $conds = []
+       ) {
+               parent::__construct( $historyPage->getContext() );
+               $this->historyPage = $historyPage;
+               $this->tagFilter = $tagFilter;
+               $this->getDateCond( $year, $month );
+               $this->conds = $conds;
+               $this->showTagEditUI = ChangeTags::showTagEditingUI( $this->getUser() );
+       }
+
+       // For hook compatibility...
+       function getArticle() {
+               return $this->historyPage->getArticle();
+       }
+
+       function getSqlComment() {
+               if ( $this->conds ) {
+                       return 'history page filtered'; // potentially slow, see CR r58153
+               } else {
+                       return 'history page unfiltered';
+               }
+       }
+
+       function getQueryInfo() {
+               $revQuery = Revision::getQueryInfo( [ 'user' ] );
+               $queryInfo = [
+                       'tables' => $revQuery['tables'],
+                       'fields' => $revQuery['fields'],
+                       'conds' => array_merge(
+                               [ 'rev_page' => $this->getWikiPage()->getId() ],
+                               $this->conds ),
+                       'options' => [ 'USE INDEX' => [ 'revision' => 'page_timestamp' ] ],
+                       'join_conds' => $revQuery['joins'],
+               ];
+               ChangeTags::modifyDisplayQuery(
+                       $queryInfo['tables'],
+                       $queryInfo['fields'],
+                       $queryInfo['conds'],
+                       $queryInfo['join_conds'],
+                       $queryInfo['options'],
+                       $this->tagFilter
+               );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $historyPager = $this;
+               Hooks::run( 'PageHistoryPager::getQueryInfo', [ &$historyPager, &$queryInfo ] );
+
+               return $queryInfo;
+       }
+
+       function getIndexField() {
+               return 'rev_timestamp';
+       }
+
+       /**
+        * @param stdClass $row
+        * @return string
+        */
+       function formatRow( $row ) {
+               if ( $this->lastRow ) {
+                       $latest = ( $this->counter == 1 && $this->mIsFirst );
+                       $firstInList = $this->counter == 1;
+                       $this->counter++;
+
+                       $notifTimestamp = $this->getConfig()->get( 'ShowUpdatedMarker' )
+                               ? $this->getTitle()->getNotificationTimestamp( $this->getUser() )
+                               : false;
+
+                       $s = $this->historyLine(
+                               $this->lastRow, $row, $notifTimestamp, $latest, $firstInList );
+               } else {
+                       $s = '';
+               }
+               $this->lastRow = $row;
+
+               return $s;
+       }
+
+       protected function doBatchLookups() {
+               if ( !Hooks::run( 'PageHistoryPager::doBatchLookups', [ $this, $this->mResult ] ) ) {
+                       return;
+               }
+
+               # Do a link batch query
+               $this->mResult->seek( 0 );
+               $batch = new LinkBatch();
+               $revIds = [];
+               foreach ( $this->mResult as $row ) {
+                       if ( $row->rev_parent_id ) {
+                               $revIds[] = $row->rev_parent_id;
+                       }
+                       if ( $row->user_name !== null ) {
+                               $batch->add( NS_USER, $row->user_name );
+                               $batch->add( NS_USER_TALK, $row->user_name );
+                       } else { # for anons or usernames of imported revisions
+                               $batch->add( NS_USER, $row->rev_user_text );
+                               $batch->add( NS_USER_TALK, $row->rev_user_text );
+                       }
+               }
+               $this->parentLens = Revision::getParentLengths( $this->mDb, $revIds );
+               $batch->execute();
+               $this->mResult->seek( 0 );
+       }
+
+       /**
+        * Creates begin of history list with a submit button
+        *
+        * @return string HTML output
+        */
+       protected function getStartBody() {
+               $this->lastRow = false;
+               $this->counter = 1;
+               $this->oldIdChecked = 0;
+
+               $this->getOutput()->wrapWikiMsg( "<div class='mw-history-legend'>\n$1\n</div>", 'histlegend' );
+               $s = Html::openElement( 'form', [ 'action' => wfScript(),
+                       'id' => 'mw-history-compare' ] ) . "\n";
+               $s .= Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n";
+               $s .= Html::hidden( 'action', 'historysubmit' ) . "\n";
+               $s .= Html::hidden( 'type', 'revision' ) . "\n";
+
+               // Button container stored in $this->buttons for re-use in getEndBody()
+               $this->buttons = '<div>';
+               $className = 'historysubmit mw-history-compareselectedversions-button';
+               $attrs = [ 'class' => $className ]
+                       + Linker::tooltipAndAccesskeyAttribs( 'compareselectedversions' );
+               $this->buttons .= $this->submitButton( $this->msg( 'compareselectedversions' )->text(),
+                       $attrs
+               ) . "\n";
+
+               $user = $this->getUser();
+               $actionButtons = '';
+               if ( $user->isAllowed( 'deleterevision' ) ) {
+                       $actionButtons .= $this->getRevisionButton( 'revisiondelete', 'showhideselectedversions' );
+               }
+               if ( $this->showTagEditUI ) {
+                       $actionButtons .= $this->getRevisionButton( 'editchangetags', 'history-edit-tags' );
+               }
+               if ( $actionButtons ) {
+                       $this->buttons .= Xml::tags( 'div', [ 'class' =>
+                               'mw-history-revisionactions' ], $actionButtons );
+               }
+
+               if ( $user->isAllowed( 'deleterevision' ) || $this->showTagEditUI ) {
+                       $this->buttons .= ( new ListToggle( $this->getOutput() ) )->getHTML();
+               }
+
+               $this->buttons .= '</div>';
+
+               $s .= $this->buttons;
+               $s .= '<ul id="pagehistory">' . "\n";
+
+               return $s;
+       }
+
+       private function getRevisionButton( $name, $msg ) {
+               $this->preventClickjacking();
+               # Note T22966, <button> is non-standard in IE<8
+               $element = Html::element(
+                       'button',
+                       [
+                               'type' => 'submit',
+                               'name' => $name,
+                               'value' => '1',
+                               'class' => "historysubmit mw-history-$name-button",
+                       ],
+                       $this->msg( $msg )->text()
+               ) . "\n";
+               return $element;
+       }
+
+       protected function getEndBody() {
+               if ( $this->lastRow ) {
+                       $latest = $this->counter == 1 && $this->mIsFirst;
+                       $firstInList = $this->counter == 1;
+                       if ( $this->mIsBackwards ) {
+                               # Next row is unknown, but for UI reasons, probably exists if an offset has been specified
+                               if ( $this->mOffset == '' ) {
+                                       $next = null;
+                               } else {
+                                       $next = 'unknown';
+                               }
+                       } else {
+                               # The next row is the past-the-end row
+                               $next = $this->mPastTheEndRow;
+                       }
+                       $this->counter++;
+
+                       $notifTimestamp = $this->getConfig()->get( 'ShowUpdatedMarker' )
+                               ? $this->getTitle()->getNotificationTimestamp( $this->getUser() )
+                               : false;
+
+                       $s = $this->historyLine(
+                               $this->lastRow, $next, $notifTimestamp, $latest, $firstInList );
+               } else {
+                       $s = '';
+               }
+               $s .= "</ul>\n";
+               # Add second buttons only if there is more than one rev
+               if ( $this->getNumRows() > 2 ) {
+                       $s .= $this->buttons;
+               }
+               $s .= '</form>';
+
+               return $s;
+       }
+
+       /**
+        * Creates a submit button
+        *
+        * @param string $message Text of the submit button, will be escaped
+        * @param array $attributes
+        * @return string HTML output for the submit button
+        */
+       function submitButton( $message, $attributes = [] ) {
+               # Disable submit button if history has 1 revision only
+               if ( $this->getNumRows() > 1 ) {
+                       return Html::submitButton( $message, $attributes );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * Returns a row from the history printout.
+        *
+        * @todo document some more, and maybe clean up the code (some params redundant?)
+        *
+        * @param stdClass $row The database row corresponding to the previous line.
+        * @param mixed $next The database row corresponding to the next line
+        *   (chronologically previous)
+        * @param bool|string $notificationtimestamp
+        * @param bool $latest Whether this row corresponds to the page's latest revision.
+        * @param bool $firstInList Whether this row corresponds to the first
+        *   displayed on this history page.
+        * @return string HTML output for the row
+        */
+       function historyLine( $row, $next, $notificationtimestamp = false,
+               $latest = false, $firstInList = false ) {
+               $rev = new Revision( $row, 0, $this->getTitle() );
+
+               if ( is_object( $next ) ) {
+                       $prevRev = new Revision( $next, 0, $this->getTitle() );
+               } else {
+                       $prevRev = null;
+               }
+
+               $curlink = $this->curLink( $rev, $latest );
+               $lastlink = $this->lastLink( $rev, $next );
+               $curLastlinks = $curlink . $this->historyPage->message['pipe-separator'] . $lastlink;
+               $histLinks = Html::rawElement(
+                       'span',
+                       [ 'class' => 'mw-history-histlinks' ],
+                       $this->msg( 'parentheses' )->rawParams( $curLastlinks )->escaped()
+               );
+
+               $diffButtons = $this->diffButtons( $rev, $firstInList );
+               $s = $histLinks . $diffButtons;
+
+               $link = $this->revLink( $rev );
+               $classes = [];
+
+               $del = '';
+               $user = $this->getUser();
+               $canRevDelete = $user->isAllowed( 'deleterevision' );
+               // Show checkboxes for each revision, to allow for revision deletion and
+               // change tags
+               if ( $canRevDelete || $this->showTagEditUI ) {
+                       $this->preventClickjacking();
+                       // If revision was hidden from sysops and we don't need the checkbox
+                       // for anything else, disable it
+                       if ( !$this->showTagEditUI && !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
+                               $del = Xml::check( 'deleterevisions', false, [ 'disabled' => 'disabled' ] );
+                       // Otherwise, enable the checkbox...
+                       } else {
+                               $del = Xml::check( 'showhiderevisions', false,
+                                       [ 'name' => 'ids[' . $rev->getId() . ']' ] );
+                       }
+               // User can only view deleted revisions...
+               } elseif ( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) {
+                       // If revision was hidden from sysops, disable the link
+                       if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
+                               $del = Linker::revDeleteLinkDisabled( false );
+                       // Otherwise, show the link...
+                       } else {
+                               $query = [ 'type' => 'revision',
+                                       'target' => $this->getTitle()->getPrefixedDBkey(), 'ids' => $rev->getId() ];
+                               $del .= Linker::revDeleteLink( $query,
+                                       $rev->isDeleted( Revision::DELETED_RESTRICTED ), false );
+                       }
+               }
+               if ( $del ) {
+                       $s .= " $del ";
+               }
+
+               $lang = $this->getLanguage();
+               $dirmark = $lang->getDirMark();
+
+               $s .= " $link";
+               $s .= $dirmark;
+               $s .= " <span class='history-user'>" .
+                       Linker::revUserTools( $rev, true ) . "</span>";
+               $s .= $dirmark;
+
+               if ( $rev->isMinor() ) {
+                       $s .= ' ' . ChangesList::flag( 'minor', $this->getContext() );
+               }
+
+               # Sometimes rev_len isn't populated
+               if ( $rev->getSize() !== null ) {
+                       # Size is always public data
+                       $prevSize = $this->parentLens[$row->rev_parent_id] ?? 0;
+                       $sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
+                       $fSize = Linker::formatRevisionSize( $rev->getSize() );
+                       $s .= ' <span class="mw-changeslist-separator">. .</span> ' . "$fSize $sDiff";
+               }
+
+               # Text following the character difference is added just before running hooks
+               $s2 = Linker::revComment( $rev, false, true );
+
+               if ( $notificationtimestamp && ( $row->rev_timestamp >= $notificationtimestamp ) ) {
+                       $s2 .= ' <span class="updatedmarker">' . $this->msg( 'updatedmarker' )->escaped() . '</span>';
+                       $classes[] = 'mw-history-line-updated';
+               }
+
+               $tools = [];
+
+               # Rollback and undo links
+               if ( $prevRev && $this->getTitle()->quickUserCan( 'edit', $user ) ) {
+                       if ( $latest && $this->getTitle()->quickUserCan( 'rollback', $user ) ) {
+                               // Get a rollback link without the brackets
+                               $rollbackLink = Linker::generateRollback(
+                                       $rev,
+                                       $this->getContext(),
+                                       [ 'verify', 'noBrackets' ]
+                               );
+                               if ( $rollbackLink ) {
+                                       $this->preventClickjacking();
+                                       $tools[] = $rollbackLink;
+                               }
+                       }
+
+                       if ( !$rev->isDeleted( Revision::DELETED_TEXT )
+                               && !$prevRev->isDeleted( Revision::DELETED_TEXT )
+                       ) {
+                               # Create undo tooltip for the first (=latest) line only
+                               $undoTooltip = $latest
+                                       ? [ 'title' => $this->msg( 'tooltip-undo' )->text() ]
+                                       : [];
+                               $undolink = MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
+                                       $this->getTitle(),
+                                       $this->msg( 'editundo' )->text(),
+                                       $undoTooltip,
+                                       [
+                                               'action' => 'edit',
+                                               'undoafter' => $prevRev->getId(),
+                                               'undo' => $rev->getId()
+                                       ]
+                               );
+                               $tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
+                       }
+               }
+               // Allow extension to add their own links here
+               Hooks::run( 'HistoryRevisionTools', [ $rev, &$tools, $prevRev, $user ] );
+
+               if ( $tools ) {
+                       $s2 .= ' ' . $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
+               }
+
+               # Tags
+               list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow(
+                       $row->ts_tags,
+                       'history',
+                       $this->getContext()
+               );
+               $classes = array_merge( $classes, $newClasses );
+               if ( $tagSummary !== '' ) {
+                       $s2 .= " $tagSummary";
+               }
+
+               # Include separator between character difference and following text
+               if ( $s2 !== '' ) {
+                       $s .= ' <span class="mw-changeslist-separator">. .</span> ' . $s2;
+               }
+
+               $attribs = [ 'data-mw-revid' => $rev->getId() ];
+
+               Hooks::run( 'PageHistoryLineEnding', [ $this, &$row, &$s, &$classes, &$attribs ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
+
+               if ( $classes ) {
+                       $attribs['class'] = implode( ' ', $classes );
+               }
+
+               return Xml::tags( 'li', $attribs, $s ) . "\n";
+       }
+
+       /**
+        * Create a link to view this revision of the page
+        *
+        * @param Revision $rev
+        * @return string
+        */
+       function revLink( $rev ) {
+               $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $this->getUser() );
+               if ( $rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+                       $link = MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
+                               $this->getTitle(),
+                               $date,
+                               [ 'class' => 'mw-changeslist-date' ],
+                               [ 'oldid' => $rev->getId() ]
+                       );
+               } else {
+                       $link = htmlspecialchars( $date );
+               }
+               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       $link = "<span class=\"history-deleted\">$link</span>";
+               }
+
+               return $link;
+       }
+
+       /**
+        * Create a diff-to-current link for this revision for this page
+        *
+        * @param Revision $rev
+        * @param bool $latest This is the latest revision of the page?
+        * @return string
+        */
+       function curLink( $rev, $latest ) {
+               $cur = $this->historyPage->message['cur'];
+               if ( $latest || !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+                       return $cur;
+               } else {
+                       return MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
+                               $this->getTitle(),
+                               new HtmlArmor( $cur ),
+                               [],
+                               [
+                                       'diff' => $this->getWikiPage()->getLatest(),
+                                       'oldid' => $rev->getId()
+                               ]
+                       );
+               }
+       }
+
+       /**
+        * Create a diff-to-previous link for this revision for this page.
+        *
+        * @param Revision $prevRev The revision being displayed
+        * @param stdClass|string|null $next The next revision in list (that is
+        *        the previous one in chronological order).
+        *        May either be a row, "unknown" or null.
+        * @return string
+        */
+       function lastLink( $prevRev, $next ) {
+               $last = $this->historyPage->message['last'];
+
+               if ( $next === null ) {
+                       # Probably no next row
+                       return $last;
+               }
+
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+               if ( $next === 'unknown' ) {
+                       # Next row probably exists but is unknown, use an oldid=prev link
+                       return $linkRenderer->makeKnownLink(
+                               $this->getTitle(),
+                               new HtmlArmor( $last ),
+                               [],
+                               [
+                                       'diff' => $prevRev->getId(),
+                                       'oldid' => 'prev'
+                               ]
+                       );
+               }
+
+               $nextRev = new Revision( $next );
+
+               if ( !$prevRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
+                       || !$nextRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
+               ) {
+                       return $last;
+               }
+
+               return $linkRenderer->makeKnownLink(
+                       $this->getTitle(),
+                       new HtmlArmor( $last ),
+                       [],
+                       [
+                               'diff' => $prevRev->getId(),
+                               'oldid' => $next->rev_id
+                       ]
+               );
+       }
+
+       /**
+        * Create radio buttons for page history
+        *
+        * @param Revision $rev
+        * @param bool $firstInList Is this version the first one?
+        *
+        * @return string HTML output for the radio buttons
+        */
+       function diffButtons( $rev, $firstInList ) {
+               if ( $this->getNumRows() > 1 ) {
+                       $id = $rev->getId();
+                       $radio = [ 'type' => 'radio', 'value' => $id ];
+                       /** @todo Move title texts to javascript */
+                       if ( $firstInList ) {
+                               $first = Xml::element( 'input',
+                                       array_merge( $radio, [
+                                               'style' => 'visibility:hidden',
+                                               'name' => 'oldid',
+                                               'id' => 'mw-oldid-null' ] )
+                               );
+                               $checkmark = [ 'checked' => 'checked' ];
+                       } else {
+                               # Check visibility of old revisions
+                               if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+                                       $radio['disabled'] = 'disabled';
+                                       $checkmark = []; // We will check the next possible one
+                               } elseif ( !$this->oldIdChecked ) {
+                                       $checkmark = [ 'checked' => 'checked' ];
+                                       $this->oldIdChecked = $id;
+                               } else {
+                                       $checkmark = [];
+                               }
+                               $first = Xml::element( 'input',
+                                       array_merge( $radio, $checkmark, [
+                                               'name' => 'oldid',
+                                               'id' => "mw-oldid-$id" ] ) );
+                               $checkmark = [];
+                       }
+                       $second = Xml::element( 'input',
+                               array_merge( $radio, $checkmark, [
+                                       'name' => 'diff',
+                                       'id' => "mw-diff-$id" ] ) );
+
+                       return $first . $second;
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * This is called if a write operation is possible from the generated HTML
+        * @param bool $enable
+        */
+       function preventClickjacking( $enable = true ) {
+               $this->preventClickjacking = $enable;
+       }
+
+       /**
+        * Get the "prevent clickjacking" flag
+        * @return bool
+        */
+       function getPreventClickjacking() {
+               return $this->preventClickjacking;
+       }
+
+}
index a233368..295d5d0 100644 (file)
@@ -1643,33 +1643,29 @@ class ApiMain extends ApiBase {
                $logCtx = [
                        '$schema' => '/mediawiki/api/request/0.0.1',
                        'meta' => [
+                               'request_id' => WebRequest::getRequestId(),
                                'id' => UIDGenerator::newUUIDv1(),
-                               'dt' => gmdate( 'c' ),
+                               'dt' => wfTimestamp( TS_ISO_8601 ),
                                'domain' => $this->getConfig()->get( 'ServerName' ),
                                'stream' => 'mediawiki.api-request'
                        ],
                        'http' => [
                                'method' => $request->getMethod(),
-                               'client_ip' => $request->getIP(),
-                               'request_headers' => []
+                               'client_ip' => $request->getIP()
                        ],
                        'database' => wfWikiID(),
                        'backend_time_ms' => (int)round( $time * 1000 ),
-                       'params' => []
                ];
 
                // If set, these headers will be logged in http.request_headers.
-               // A http.request_headers entry should not be set if the header was not provided.
-               if ( $request->getHeader( 'User-agent' ) ) {
-                       $logCtx['http']['request_headers']['user-agent'] = $request->getHeader( 'User-agent' );
-               }
-               if ( $request->getHeader( 'Api-user-agent' ) ) {
-                       $logCtx['http']['request_headers']['api-user-agent'] = $request->getHeader( 'Api-user-agent' );
+               $httpRequestHeadersToLog = [ 'accept-language', 'referer', 'user-agent' ];
+               foreach ( $httpRequestHeadersToLog as $header ) {
+                       if ( $request->getHeader( $header ) ) {
+                               // Set the header in http.request_headers
+                               $logCtx['http']['request_headers'][$header] = $request->getHeader( $header );
+                       }
                }
 
-               $logCtx['meta']['request_id'] =
-                       $logCtx['http']['request_headers']['x-request-id'] = WebRequest::getRequestId();
-
                if ( $e ) {
                        $logCtx['api_error_codes'] = [];
                        foreach ( $this->errorMessagesFromException( $e ) as $msg ) {
index b6fedcd..cd9eac4 100644 (file)
@@ -122,10 +122,13 @@ abstract class AbstractPasswordPrimaryAuthenticationProvider
 
                if ( !$reset && $this->config->get( 'InvalidPasswordReset' ) && !$status->isGood() ) {
                        $hard = $status->getValue()['forceChange'] ?? false;
-                       $reset = (object)[
-                               'msg' => $status->getMessage( $hard ? 'resetpass-validity' : 'resetpass-validity-soft' ),
-                               'hard' => $hard,
-                       ];
+
+                       if ( $hard || !empty( $status->getValue()['suggestChangeOnLogin'] ) ) {
+                               $reset = (object)[
+                                       'msg' => $status->getMessage( $hard ? 'resetpass-validity' : 'resetpass-validity-soft' ),
+                                       'hard' => $hard,
+                               ];
+                       }
                }
 
                if ( $reset ) {
index e9adb7e..047a811 100644 (file)
@@ -46,6 +46,13 @@ class LocalPasswordPrimaryAuthenticationProvider
                $this->loginOnly = !empty( $params['loginOnly'] );
        }
 
+       /**
+        * Check if the password has expired and needs a reset
+        *
+        * @param string $username
+        * @param \stdClass $row A row from the user table
+        * @return \stdClass|null
+        */
        protected function getPasswordResetData( $username, $row ) {
                $now = wfTimestamp();
                $expiration = wfTimestampOrNull( TS_UNIX, $row->user_password_expires );
index 49e3132..decbb0c 100644 (file)
@@ -667,7 +667,7 @@ abstract class ContentHandler {
         * This default implementation just returns the content language (except for pages
         * in the MediaWiki namespace)
         *
-        * Note that the pages language is not cacheable, since it may in some
+        * Note that the page's language is not cacheable, since it may in some
         * cases depend on user settings.
         *
         * Also note that the page language may or may not depend on the actual content of the page,
@@ -684,7 +684,7 @@ abstract class ContentHandler {
                global $wgLang;
                $pageLang = MediaWikiServices::getInstance()->getContentLanguage();
 
-               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+               if ( $title->inNamespace( NS_MEDIAWIKI ) ) {
                        // Parse mediawiki messages with correct target language
                        list( /* $unused */, $lang ) = MessageCache::singleton()->figureMessage( $title->getText() );
                        $pageLang = Language::factory( $lang );
index 9cf924f..bb2d3f7 100644 (file)
@@ -565,7 +565,8 @@ class DatabaseOracle extends Database {
                // count-alias subselect fields to avoid abigious definition errors
                $i = 0;
                foreach ( $varMap as &$val ) {
-                       $val .= ' field' . ( $i++ );
+                       $val .= ' field' . $i;
+                       $i++;
                }
 
                $selectSql = $this->selectSQLText(
index 142c51d..edf8444 100644 (file)
@@ -805,40 +805,3 @@ class DiffEngine {
        }
 
 }
-
-/**
- * Alternative representation of a set of changes, by the index
- * ranges that are changed.
- *
- * @ingroup DifferenceEngine
- */
-class RangeDifference {
-
-       /** @var int */
-       public $leftstart;
-
-       /** @var int */
-       public $leftend;
-
-       /** @var int */
-       public $leftlength;
-
-       /** @var int */
-       public $rightstart;
-
-       /** @var int */
-       public $rightend;
-
-       /** @var int */
-       public $rightlength;
-
-       function __construct( $leftstart, $leftend, $rightstart, $rightend ) {
-               $this->leftstart = $leftstart;
-               $this->leftend = $leftend;
-               $this->leftlength = $leftend - $leftstart;
-               $this->rightstart = $rightstart;
-               $this->rightend = $rightend;
-               $this->rightlength = $rightend - $rightstart;
-       }
-
-}
diff --git a/includes/diff/RangeDifference.php b/includes/diff/RangeDifference.php
new file mode 100644 (file)
index 0000000..e625514
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/**
+ * New version of the difference engine
+ *
+ * Copyright © 2008 Guy Van den Broeck <guy@guyvdb.eu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup DifferenceEngine
+ */
+
+/**
+ * Alternative representation of a set of changes, by the index
+ * ranges that are changed.
+ *
+ * @ingroup DifferenceEngine
+ */
+class RangeDifference {
+
+       /** @var int */
+       public $leftstart;
+
+       /** @var int */
+       public $leftend;
+
+       /** @var int */
+       public $leftlength;
+
+       /** @var int */
+       public $rightstart;
+
+       /** @var int */
+       public $rightend;
+
+       /** @var int */
+       public $rightlength;
+
+       function __construct( $leftstart, $leftend, $rightstart, $rightend ) {
+               $this->leftstart = $leftstart;
+               $this->leftend = $leftend;
+               $this->leftlength = $leftend - $leftstart;
+               $this->rightstart = $rightstart;
+               $this->rightend = $rightend;
+               $this->rightlength = $rightend - $rightstart;
+       }
+
+}
index 8e0242d..c49810c 100644 (file)
@@ -318,16 +318,15 @@ class ForeignAPIFile extends File {
         * @return null|string
         */
        function getThumbPath( $suffix = '' ) {
-               if ( $this->repo->canCacheThumbs() ) {
-                       $path = $this->repo->getZonePath( 'thumb' ) . '/' . $this->getHashPath();
-                       if ( $suffix ) {
-                               $path .= $suffix . '/';
-                       }
-
-                       return $path;
-               } else {
+               if ( !$this->repo->canCacheThumbs() ) {
                        return null;
                }
+
+               $path = $this->repo->getZonePath( 'thumb' ) . '/' . $this->getHashPath();
+               if ( $suffix ) {
+                       $path .= $suffix . '/';
+               }
+               return $path;
        }
 
        /**
index dd9f793..1eda33c 100644 (file)
@@ -66,7 +66,7 @@ class HTMLTitleTextField extends HTMLTextField {
                if ( $this->mParams['namespace'] !== false &&
                        !$title->inNamespace( $this->mParams['namespace'] )
                ) {
-                       return $this->msg( 'htmlform-title-badnamespace', $this->mParams['namespace'], $text );
+                       return $this->msg( 'htmlform-title-badnamespace', $text, $this->mParams['namespace'] );
                }
 
                if ( $this->mParams['creatable'] && !$title->canExist() ) {
index bc3fe29..0bc0a83 100644 (file)
@@ -866,8 +866,7 @@ abstract class Installer {
                }
 
                if ( !$caches ) {
-                       $key = 'config-no-cache-apcu';
-                       $this->showMessage( $key );
+                       $this->showMessage( 'config-no-cache-apcu' );
                }
 
                $this->setVar( '_Caches', $caches );
@@ -1633,8 +1632,7 @@ abstract class Installer {
        }
 
        /**
-        * Generate a secret value for variables using our CryptRand generator.
-        * Produce a warning if the random source was insecure.
+        * Generate a secret value for variables using a secure generator.
         *
         * @param array $keys
         * @return Status
index 6d70338..a2179c6 100644 (file)
@@ -390,7 +390,7 @@ ${serverSetting}
 
 ## Set \$wgCacheDirectory to a writable directory on the web server
 ## to make your wiki go slightly faster. The directory should not
-## be publically accessible from the web.
+## be publicly accessible from the web.
 #\$wgCacheDirectory = \"\$IP/cache\";
 
 # Site language code, should be one of the list in ./languages/data/Names.php
index aa95438..a8abba9 100644 (file)
@@ -33,7 +33,7 @@ use Wikimedia\Rdbms\DBConnectionError;
  */
 class SqliteInstaller extends DatabaseInstaller {
 
-       public static $minimumVersion = '3.3.7';
+       public static $minimumVersion = '3.8.0';
        protected static $notMiniumumVerisonMessage = 'config-outdated-sqlite';
 
        /**
index 7fb9851..4e9ae3b 100644 (file)
@@ -28,7 +28,7 @@
        "config-wiki-language": "Език на уикито:",
        "config-wiki-language-help": "Избор на език, на който ще е основното съдържание на уикито.",
        "config-back": "← Връщане",
-       "config-continue": "Ð\9fÑ\80одÑ\8aлжаване →",
+       "config-continue": "Ð\9dапÑ\80ед →",
        "config-page-language": "Език",
        "config-page-welcome": "Добре дошли в МедияУики!",
        "config-page-dbconnect": "Свързване с базата от данни",
@@ -68,7 +68,7 @@
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] е инсталиран",
        "config-no-cache-apcu": "<strong>Внимание:</strong> [https://secure.php.net/apcu APCu] и [https://www.iis.net/downloads/microsoft/wincache-extension WinCache] не могат да бъдат открити.\nКеширането на обекти не е активирано.",
        "config-mod-security": "<strong>Предупреждение:</strong> [https://modsecurity.org/ mod_security]/mod_security2 е включено на вашия уеб сървър. Много от обичайните му конфигурации пораждат проблеми с МедияУики и друг софтуер, който позволява публикуване на произволно съдържание.\nАко е възможно, моля изключете го. В противен случай се обърнете към [https://modsecurity.org/documentation/ документацията на mod_security] или се свържете с поддръжката на хостинга си, ако се сблъскате със случайни грешки.",
-       "config-diff3-bad": "Ð\9dе Ðµ Ð½Ð°Ð¼ÐµÑ\80ен Ñ\81Ñ\80авниÑ\82елÑ\8fÑ\82 Ð·Ð° Ñ\82екÑ\81Ñ\82 Ð\93Ð\9dУ Ñ\80азл3 (GNU diff3). Ð\97аÑ\81ега Ñ\82ова Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð³Ð¾ Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аÑ\82е, Ð½Ð¾ Ð·Ð°Ñ\82ова ÐºÐ¾Ð½Ñ\84ликÑ\82иÑ\82е Ð½Ð° Ñ\80едакÑ\86ииÑ\82е Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð·Ð°Ñ\87еÑ\81Ñ\82аÑ\82.",
+       "config-diff3-bad": "Ð\98нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\8aÑ\82 Ð·Ð° Ñ\81Ñ\80авнÑ\8fване Ð½Ð° Ñ\82екÑ\81Ñ\82 GNU diff3 Ð½Ðµ Ð±ÐµÑ\88е Ð½Ð°Ð¼ÐµÑ\80ен. Ð\9cожеÑ\82е Ð´Ð° Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аÑ\82е Ñ\82ова Ð·Ð° Ñ\81ега, Ð½Ð¾ ÐºÐ¾Ð½Ñ\84ликÑ\82иÑ\82е Ð¿Ñ\80и Ñ\80едакÑ\82иÑ\80ане Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aдаÑ\82 Ð¿Ð¾-Ñ\87еÑ\81Ñ\82и.",
        "config-git": "Налична е системата за контрол на версиите Git: <code>$1</code>.",
        "config-git-bad": "Не е намерен софтуер за контрол на версиите Git.",
        "config-imagemagick": "Открит е ImageMagick: <code>$1</code>.\nПреоразмеряването на картинки ще бъде включено ако качването на файлове бъде разрешено.",
@@ -87,7 +87,7 @@
        "config-db-host": "Сървър на базата от данни:",
        "config-db-host-help": "Ако базата от данни е на друг сървър, в кутията се въвежда името на хоста или IP адреса.\n\nАко се използва споделен уеб хостинг, доставчикът на услугата би трябвало да е предоставил в документацията си коректния хост.\n\nАко инсталацията протича на Windows-сървър и се използва MySQL, използването на \"localhost\" може да е неприемливо. В такива случаи се използва \"127.0.0.1\" за локален IP адрес.\n\nПри използване на PostgreSQL, това поле се оставя празно, за свързване чрез Unix socket.",
        "config-db-host-oracle": "TNS на базата от данни:",
-       "config-db-host-oracle-help": "Ð\92Ñ\8aведеÑ\82е Ð²Ð°Ð»Ð¸Ð´Ð½Ð¾ [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]. Ð\9dа Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\8fÑ\82а Ñ\82Ñ\80Ñ\8fбва Ð´Ð° Ð±Ñ\8aде Ð²Ð¸Ð´Ð¸Ð¼ Ñ\84айлÑ\8aÑ\82 tnsnames.ora.<br />Ако използвате клиентска библиотека версия 10g или по-нова можете да използвате метода [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
+       "config-db-host-oracle-help": "Ð\92Ñ\8aведеÑ\82е Ð²Ð°Ð»Ð¸Ð´Ð½Ð¾ [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]. Ð¤Ð°Ð¹Ð»Ñ\8aÑ\82 tnsnames.ora Ñ\82Ñ\80Ñ\8fбва Ð´Ð° Ð±Ñ\8aде Ð²Ð¸Ð´Ð¸Ð¼ Ð·Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86иÑ\8fÑ\82а.<br />Ако използвате клиентска библиотека версия 10g или по-нова можете да използвате метода [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Идентифициране на това уики",
        "config-db-name": "Име на базата от данни (без тирета):",
        "config-db-name-help": "Избира се име, което да идентифицира уикито.\nТо не трябва да съдържа интервали.\n\nАко се използва споделен хостинг, доставчикът на услугата би трябвало да е предоставил или име на базата от данни, която да бъде използвана, или да позволява създаването на бази от данни чрез контролния панел.",
index 65c27d8..495be73 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 use Wikimedia\Rdbms\IDatabase;
-use Wikimedia\Rdbms\DBConnRef;
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\DBConnectionError;
 use Wikimedia\Rdbms\DBError;
 use MediaWiki\MediaWikiServices;
@@ -40,12 +40,17 @@ class JobQueueDB extends JobQueue {
 
        /** @var WANObjectCache */
        protected $cache;
+       /** @var IDatabase|DBError|null */
+       protected $conn;
 
-       /** @var bool|string Name of an external DB cluster. False if not set */
-       protected $cluster = false;
+       /** @var array|null Server configuration array */
+       protected $server;
+       /** @var string|null Name of an external DB cluster or null for the local DB cluster */
+       protected $cluster;
 
        /**
         * Additional parameters include:
+        *   - server  : Server configuration array for Database::factory. Overrides "cluster".
         *   - cluster : The name of an external cluster registered via LBFactory.
         *               If not specified, the primary DB cluster for the wiki will be used.
         *               This can be overridden with a custom cluster so that DB handles will
@@ -55,7 +60,12 @@ class JobQueueDB extends JobQueue {
        protected function __construct( array $params ) {
                parent::__construct( $params );
 
-               $this->cluster = $params['cluster'] ?? false;
+               if ( isset( $params['server'] ) ) {
+                       $this->server = $params['server'];
+               } elseif ( isset( $params['cluster'] ) && is_string( $params['cluster'] ) ) {
+                       $this->cluster = $params['cluster'];
+               }
+
                $this->cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
        }
 
@@ -542,9 +552,15 @@ class JobQueueDB extends JobQueue {
         * @return void
         */
        protected function doWaitForBackups() {
+               if ( $this->server ) {
+                       return; // not using LBFactory instance
+               }
+
                $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
-               $lbFactory->waitForReplication(
-                       [ 'domain' => $this->domain, 'cluster' => $this->cluster ] );
+               $lbFactory->waitForReplication( [
+                       'domain' => $this->domain,
+                       'cluster' => is_string( $this->cluster ) ? $this->cluster : false
+               ] );
        }
 
        /**
@@ -599,7 +615,11 @@ class JobQueueDB extends JobQueue {
        }
 
        public function getCoalesceLocationInternal() {
-               return $this->cluster
+               if ( $this->server ) {
+                       return null; // not using the LBFactory instance
+               }
+
+               return is_string( $this->cluster )
                        ? "DBCluster:{$this->cluster}:{$this->domain}"
                        : "LBFactory:{$this->domain}";
        }
@@ -744,7 +764,7 @@ class JobQueueDB extends JobQueue {
 
        /**
         * @throws JobQueueConnectionError
-        * @return DBConnRef
+        * @return IDatabase
         */
        protected function getReplicaDB() {
                try {
@@ -756,7 +776,7 @@ class JobQueueDB extends JobQueue {
 
        /**
         * @throws JobQueueConnectionError
-        * @return DBConnRef
+        * @return IDatabase
         */
        protected function getMasterDB() {
                try {
@@ -768,20 +788,37 @@ class JobQueueDB extends JobQueue {
 
        /**
         * @param int $index (DB_REPLICA/DB_MASTER)
-        * @return DBConnRef
+        * @return IDatabase
         */
        protected function getDB( $index ) {
-               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
-               $lb = ( $this->cluster !== false )
-                       ? $lbFactory->getExternalLB( $this->cluster )
-                       : $lbFactory->getMainLB( $this->domain );
-
-               return ( $lb->getServerType( $lb->getWriterIndex() ) !== 'sqlite' )
-                       // Keep a separate connection to avoid contention and deadlocks;
-                       // However, SQLite has the opposite behavior due to DB-level locking.
-                       ? $lb->getConnectionRef( $index, [], $this->domain, $lb::CONN_TRX_AUTOCOMMIT )
-                       // Jobs insertion will be defered until the PRESEND stage to reduce contention.
-                       : $lb->getConnectionRef( $index, [], $this->domain );
+               if ( $this->server ) {
+                       if ( $this->conn instanceof IDatabase ) {
+                               return $this->conn;
+                       } elseif ( $this->conn instanceof DBError ) {
+                               throw $this->conn;
+                       }
+
+                       try {
+                               $this->conn = Database::factory( $this->server['type'], $this->server );
+                       } catch ( DBError $e ) {
+                               $this->conn = $e;
+                               throw $e;
+                       }
+
+                       return $this->conn;
+               } else {
+                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                       $lb = is_string( $this->cluster )
+                               ? $lbFactory->getExternalLB( $this->cluster )
+                               : $lbFactory->getMainLB( $this->domain );
+
+                       return ( $lb->getServerType( $lb->getWriterIndex() ) !== 'sqlite' )
+                               // Keep a separate connection to avoid contention and deadlocks;
+                               // However, SQLite has the opposite behavior due to DB-level locking.
+                               ? $lb->getConnectionRef( $index, [], $this->domain, $lb::CONN_TRX_AUTOCOMMIT )
+                               // Jobs insertion will be defered until the PRESEND stage to reduce contention.
+                               : $lb->getConnectionRef( $index, [], $this->domain );
+               }
        }
 
        /**
index b64c87a..3aedc38 100644 (file)
@@ -195,7 +195,7 @@ class CategoryMembershipChangeJob extends Job {
                // Get the prior revision (the same for null edits)
                if ( $newRev->getParentId() ) {
                        $oldRev = Revision::newFromId( $newRev->getParentId(), Revision::READ_LATEST );
-                       if ( !$oldRev->getContent() ) {
+                       if ( !$oldRev || !$oldRev->getContent() ) {
                                return; // deleted?
                        }
                } else {
index ef364b5..1e40eb4 100644 (file)
@@ -65,7 +65,8 @@ class PurgeJobUtils {
 
                                $batchSize = $services->getMainConfig()->get( 'UpdateRowsPerQuery' );
                                $ticket = $lbFactory->getEmptyTransactionTicket( $fname );
-                               foreach ( array_chunk( $ids, $batchSize ) as $idBatch ) {
+                               $idBatches = array_chunk( $ids, $batchSize );
+                               foreach ( $idBatches as $idBatch ) {
                                        $dbw->update(
                                                'page',
                                                [ 'page_touched' => $now ],
@@ -75,7 +76,9 @@ class PurgeJobUtils {
                                                ],
                                                $fname
                                        );
-                                       $lbFactory->commitAndWaitForReplication( $fname, $ticket );
+                                       if ( count( $idBatches ) > 1 ) {
+                                               $lbFactory->commitAndWaitForReplication( $fname, $ticket );
+                                       }
                                }
                        }
                ) );
index 06a155a..a80b6d0 100644 (file)
@@ -831,7 +831,7 @@ abstract class FileBackend implements LoggerAwareInterface {
         * files whereas key/value store backends might revoke container
         * access to the storage user representing end-users in web requests.
         *
-        * This is not guaranteed to actually make files or listings publically hidden.
+        * This is not guaranteed to actually make files or listings publicly hidden.
         * Additional server configuration may be needed to achieve the desired effect.
         *
         * @param array $params Parameters include:
@@ -864,7 +864,7 @@ abstract class FileBackend implements LoggerAwareInterface {
         * access to the storage user representing end-users in web requests.
         * This essentially can undo the result of secure() calls.
         *
-        * This is not guaranteed to actually make files or listings publically viewable.
+        * This is not guaranteed to actually make files or listings publicly viewable.
         * Additional server configuration may be needed to achieve the desired effect.
         *
         * @param array $params Parameters include:
index 9fa3232..bace22b 100644 (file)
@@ -787,8 +787,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        public function makeKeyInternal( $keyspace, $args ) {
                $key = $keyspace;
                foreach ( $args as $arg ) {
-                       $arg = str_replace( ':', '%3A', $arg );
-                       $key .= ':' . $arg;
+                       $key .= ':' . str_replace( ':', '%3A', $arg );
                }
                return strtr( $key, ' ', '_' );
        }
index d0bd1b3..1c4ed56 100644 (file)
@@ -139,11 +139,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        protected function mysqlSetCharset( $charset ) {
                $conn = $this->getBindingHandle();
 
-               if ( method_exists( $conn, 'set_charset' ) ) {
-                       return $conn->set_charset( $charset );
-               } else {
-                       return $this->query( 'SET NAMES ' . $charset, __METHOD__ );
-               }
+               return $conn->set_charset( $charset );
        }
 
        /**
index c35bd99..a154f64 100644 (file)
@@ -28,6 +28,8 @@
  * @since 1.19
  */
 
+use MediaWiki\Linker\LinkTarget;
+use MediaWiki\User\UserIdentity;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -527,20 +529,20 @@ class ManualLogEntry extends LogEntryBase {
         * Set the user that performed the action being logged.
         *
         * @since 1.19
-        * @param User $performer
+        * @param UserIdentity $performer
         */
-       public function setPerformer( User $performer ) {
-               $this->performer = $performer;
+       public function setPerformer( UserIdentity $performer ) {
+               $this->performer = User::newFromIdentity( $performer );
        }
 
        /**
         * Set the title of the object changed.
         *
         * @since 1.19
-        * @param Title $target
+        * @param LinkTarget $target
         */
-       public function setTarget( Title $target ) {
-               $this->target = $target;
+       public function setTarget( LinkTarget $target ) {
+               $this->target = Title::newFromLinkTarget( $target );
        }
 
        /**
@@ -783,6 +785,12 @@ class ManualLogEntry extends LogEntryBase {
                                                // save RC, passing tags so they are applied there
                                                $rc->addTags( $this->getTags() );
                                                $rc->save( $rc::SEND_NONE );
+                                       } else {
+                                               $tags = $this->getTags();
+                                               if ( $tags ) {
+                                                       $revId = $this->getAssociatedRevId(); // Use null if $revId is 0
+                                                       ChangeTags::addTags( $tags, null, $revId > 0 ? $revId : null, $newId );
+                                               }
                                        }
 
                                        if ( $to === 'udp' || $to === 'rcandudp' ) {
index 04ddda2..d059cd8 100644 (file)
@@ -286,7 +286,8 @@ EOR;
                                $txt = preg_replace_callback( $reg, [ $this, 'pageTextCallback' ], $txt );
                                $txt = "<DjVuTxt>\n<HEAD></HEAD>\n<BODY>\n" . $txt . "</BODY>\n</DjVuTxt>\n";
                                $xml = preg_replace( "/<DjVuXML>/", "<mw-djvu><DjVuXML>", $xml, 1 ) .
-                                       $txt . '</mw-djvu>';
+                                       $txt .
+                                       '</mw-djvu>';
                        }
                }
 
index f8b0c3c..bc5eb09 100644 (file)
@@ -226,13 +226,8 @@ class SVGReader {
                        return;
                }
                // @todo Find and store type of xml snippet. metadata['metadataType'] = "rdf"
-               if ( method_exists( $this->reader, 'readInnerXML' ) ) {
-                       $this->metadata[$metafield] = trim( $this->reader->readInnerXml() );
-               } else {
-                       throw new MWException( "The PHP XMLReader extension does not come " .
-                               "with readInnerXML() method. Your libxml is probably out of " .
-                               "date (need 2.6.20 or later)." );
-               }
+               $this->metadata[$metafield] = trim( $this->reader->readInnerXml() );
+
                $this->reader->next();
        }
 
index f6445f5..71b1ad7 100644 (file)
@@ -132,12 +132,12 @@ abstract class TablePager extends IndexPager {
                                        // We don't actually know in which direction other fields will be sorted by default…
                                        if ( $this->mDefaultDirection == IndexPager::DIR_DESCENDING ) {
                                                $linkType = 'asc';
-                                               $class = "$sortClass TablePager_sort-descending";
+                                               $class = "$sortClass mw-datatable-is-sorted mw-datatable-is-descending";
                                                $query['asc'] = '1';
                                                $query['desc'] = '';
                                        } else {
                                                $linkType = 'desc';
-                                               $class = "$sortClass TablePager_sort-ascending";
+                                               $class = "$sortClass mw-datatable-is-sorted mw-datatable-is-ascending";
                                                $query['asc'] = '';
                                                $query['desc'] = '1';
                                        }
index a69b3d2..288a527 100644 (file)
@@ -357,7 +357,6 @@ class BlockLevelPass {
                                                if ( $pendingPTag ) {
                                                        $output .= $this->closeParagraph();
                                                        $pendingPTag = false;
-                                                       $this->lastSection = '';
                                                }
                                        } else {
                                                # paragraph
@@ -369,7 +368,6 @@ class BlockLevelPass {
                                                        } else {
                                                                if ( $this->lastSection !== 'p' ) {
                                                                        $output .= $this->closeParagraph();
-                                                                       $this->lastSection = '';
                                                                        $pendingPTag = '<p>';
                                                                } else {
                                                                        $pendingPTag = '</p><p>';
index 04d3c85..546152f 100644 (file)
@@ -5282,8 +5282,6 @@ class Parser {
                #  * bottom
                #  * text-bottom
 
-               global $wgMediaInTargetLanguage;
-
                # Protect LanguageConverter markup when splitting into parts
                $parts = StringUtils::delimiterExplode(
                        '-{', '}-', '|', $options, true /* allow nesting */
@@ -5444,9 +5442,7 @@ class Parser {
                        # Use the "caption" for the tooltip text
                        $params['frame']['title'] = $this->stripAltText( $caption, $holders );
                }
-               if ( $wgMediaInTargetLanguage ) {
-                       $params['handler']['targetlang'] = $this->getTargetLanguage()->getCode();
-               }
+               $params['handler']['targetlang'] = $this->getTargetLanguage()->getCode();
 
                Hooks::run( 'ParserMakeImageParams', [ $title, $file, &$params, $this ] );
 
index a69e805..bdca848 100644 (file)
@@ -1261,25 +1261,6 @@ class ParserOptions {
                }
        }
 
-       /**
-        * Returns the full array of options that would have been used by
-        * in 1.16.
-        * Used to get the old parser cache entries when available.
-        * @deprecated since 1.30. You probably want self::allCacheVaryingOptions() instead.
-        * @return string[]
-        */
-       public static function legacyOptions() {
-               wfDeprecated( __METHOD__, '1.30' );
-               return [
-                       'stubthreshold',
-                       'numberheadings',
-                       'userlang',
-                       'thumbsize',
-                       'editsection',
-                       'printable'
-               ];
-       }
-
        /**
         * Return all option keys that vary the options hash
         * @since 1.30
index c61c795..79a5539 100644 (file)
@@ -71,6 +71,7 @@ class UserPasswordPolicy {
         *   indicate the user shouldn't be allowed to login. The status value will be an array,
         *   potentially with the following keys:
         *   - forceChange: do not allow the user to login without changing the password if invalid.
+        *   - suggestChangeOnLogin: prompt for a password change on login if the password is invalid.
         */
        public function checkUserPassword( User $user, $password ) {
                $effectivePolicy = $this->getPoliciesForUser( $user );
@@ -93,6 +94,7 @@ class UserPasswordPolicy {
         *   indicate the user shouldn't be allowed to login. The status value will be an array,
         *   potentially with the following keys:
         *   - forceChange: do not allow the user to login without changing the password if invalid.
+        *   - suggestChangeOnLogin: prompt for a password change on login if the password is invalid.
         */
        public function checkUserPasswordForGroups( User $user, $password, array $groups ) {
                $effectivePolicy = self::getPoliciesForGroups(
@@ -118,6 +120,7 @@ class UserPasswordPolicy {
        private function checkPolicies( User $user, $password, $policies, $policyCheckFunctions ) {
                $status = Status::newGood( [] );
                $forceChange = false;
+               $suggestChangeOnLogin = false;
                foreach ( $policies as $policy => $settings ) {
                        if ( !isset( $policyCheckFunctions[$policy] ) ) {
                                throw new DomainException( "Invalid password policy config. No check defined for '$policy'." );
@@ -137,14 +140,27 @@ class UserPasswordPolicy {
                                $user,
                                $password
                        );
-                       if ( !$policyStatus->isGood() && !empty( $settings['forceChange'] ) ) {
-                               $forceChange = true;
+
+                       if ( !$policyStatus->isGood() ) {
+                               if ( !empty( $settings['forceChange'] ) ) {
+                                       $forceChange = true;
+                               }
+
+                               if ( !empty( $settings['suggestChangeOnLogin'] ) ) {
+                                       $suggestChangeOnLogin = true;
+                               }
                        }
                        $status->merge( $policyStatus );
                }
-               if ( $status->isOK() && $forceChange ) {
-                       $status->value['forceChange'] = true;
+
+               if ( $status->isOK() ) {
+                       if ( $forceChange ) {
+                               $status->value['forceChange'] = true;
+                       } elseif ( $suggestChangeOnLogin ) {
+                               $status->value['suggestChangeOnLogin'] = true;
+                       }
                }
+
                return $status;
        }
 
index 2848871..9be5de3 100644 (file)
@@ -198,10 +198,11 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *         ],
         *         // Scripts to include in debug contexts
         *         'debugScripts' => [file path string or array of file path strings],
-        *         // For package modules: files to make available for internal require() use
-        *         // 'type' is optional, and will be inferred from the file name extension if omitted
-        *         // 'config' can only be used when 'type' is 'data'; vars are resolved with Config::get()
-        *         // If 'packageFiles' is set, 'scripts' cannot also be set
+        *         // For package modules: files to be made available for internal require() do not
+        *         // need to have 'type' defined; it will be inferred from the file name extension
+        *         // if omitted. 'config' can only be used when 'type' is 'data'; the variables are
+        *         // resolved with Config::get(). The first entry in 'packageFiles' is always the
+        *         // module entry point. If 'packageFiles' is set, 'scripts' cannot also be set.
         *         'packageFiles' => [
         *             [file path string], // or:
         *             [ 'name' => [file name], 'file' => [file path], 'type' => 'script'|'data' ], // or:
index aaa522a..6ad00ea 100644 (file)
@@ -35,7 +35,10 @@ use WebRequest;
  */
 class CookieSessionProvider extends SessionProvider {
 
+       /** @var mixed[] */
        protected $params = [];
+
+       /** @var mixed[] */
        protected $cookieOptions = [];
 
        /**
index 200b913..149bb80 100644 (file)
@@ -41,6 +41,7 @@ abstract class ImmutableSessionProviderWithCookie extends SessionProvider {
 
        /** @var string|null */
        protected $sessionCookieName = null;
+       /** @var mixed[] */
        protected $sessionCookieOptions = [];
 
        /**
index 157cc52..f14e0eb 100644 (file)
@@ -37,6 +37,8 @@ class PHPSessionHandler implements \SessionHandlerInterface {
 
        /** @var bool Whether PHP session handling is enabled */
        protected $enable = false;
+
+       /** @var bool */
        protected $warn = true;
 
        /** @var SessionManager|null */
index f3bfb2b..7956e9f 100644 (file)
@@ -50,15 +50,25 @@ final class SessionBackend {
        /** @var SessionId */
        private $id;
 
+       /** @var bool */
        private $persist = false;
+
+       /** @var bool */
        private $remember = false;
+
+       /** @var bool */
        private $forceHTTPS = false;
 
        /** @var array|null */
        private $data = null;
 
+       /** @var bool */
        private $forcePersist = false;
+
+       /** @var bool */
        private $metaDirty = false;
+
+       /** @var bool */
        private $dataDirty = false;
 
        /** @var string Used to detect subarray modifications */
@@ -76,6 +86,7 @@ final class SessionBackend {
        /** @var User */
        private $user;
 
+       /** @var int */
        private $curIndex = 0;
 
        /** @var WebRequest[] Session requests */
@@ -87,13 +98,21 @@ final class SessionBackend {
        /** @var array|null provider-specified metadata */
        private $providerMetadata = null;
 
+       /** @var int */
        private $expires = 0;
+
+       /** @var int */
        private $loggedOut = 0;
+
+       /** @var int */
        private $delaySave = 0;
 
+       /** @var bool */
        private $usePhpSessionHandling = true;
+       /** @var bool */
        private $checkPHPSessionRecursionGuard = false;
 
+       /** @var bool */
        private $shutdown = false;
 
        /**
index 577e03a..a7bbcce 100644 (file)
@@ -50,10 +50,19 @@ class SessionInfo {
        /** @var UserInfo|null */
        private $userInfo = null;
 
+       /** @var bool */
        private $persisted = false;
+
+       /** @var bool */
        private $remembered = false;
+
+       /** @var bool */
        private $forceHTTPS = false;
+
+       /** @var bool */
        private $idIsSafe = false;
+
+       /** @var bool */
        private $forceUse = false;
 
        /** @var array|null */
index 14d239d..5165506 100644 (file)
@@ -34,8 +34,13 @@ class Token {
         * editing from certain broken proxies. */
        const SUFFIX = '+\\';
 
+       /** @var string */
        private $secret = '';
+
+       /** @var string */
        private $salt = '';
+
+       /** @var bool */
        private $new = false;
 
        /**
index c01b9ec..f5145a3 100644 (file)
@@ -49,6 +49,7 @@ use User;
  * @since 1.27
  */
 final class UserInfo {
+       /** @var bool */
        private $verified = false;
 
        /** @var User|null */
index f84a6ff..d6de0aa 100644 (file)
@@ -1191,6 +1191,8 @@ class User implements IDBAccessObject, UserIdentity {
         * - forceChange (bool): if set to true, the user should not be
         *   allowed to log with this password unless they change it during
         *   the login process (see ResetPasswordSecondaryAuthenticationProvider).
+        * - suggestChangeOnLogin (bool): if set to true, the user should be prompted for
+        *   a password change on login.
         *
         * @param string $password Desired password
         * @return Status
index bbf2576..5d5f980 100644 (file)
@@ -3593,14 +3593,12 @@ class Language {
                                $length -= $ellipsisLength;
                                $string = $getSubstring( $string, 0, $length ); // xyz...
                                $string = $this->removeBadCharLast( $string );
-                               $string = rtrim( $string );
-                               $string = $string . $ellipsis;
+                               $string = rtrim( $string ) . $ellipsis;
                        } else {
                                $length += $ellipsisLength;
                                $string = $getSubstring( $string, $length ); // ...xyz
                                $string = $this->removeBadCharFirst( $string );
-                               $string = ltrim( $string );
-                               $string = $ellipsis . $string;
+                               $string = $ellipsis . ltrim( $string );
                        }
                }
 
index 01a6719..fd39ef1 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|السابق|ال$1 السابقة}}",
        "whatlinkshere-next": "{{PLURAL:$1|التالية|ال$1 التالية}}",
        "whatlinkshere-links": "وصلات",
-       "whatlinkshere-hideredirs": "$1 تحويلات",
+       "whatlinkshere-hideredirs": "$1 Ø§Ù\84تحÙ\88Ù\8aÙ\84ات",
        "whatlinkshere-hidetrans": "$1 تضمينات",
        "whatlinkshere-hidelinks": "$1 وصلات",
        "whatlinkshere-hideimages": "$1 وصلات الملفات",
index 96a71ea..6805dfc 100644 (file)
@@ -50,6 +50,8 @@
        "tog-watchdefault": "Redaktə etdiyim səhifələri və faylları izlədiyim səhifələrə əlavə et",
        "tog-watchmoves": "Adlarını dəyişdiyim səhifələri və faylları izlədiyim səhifələrə əlavə et",
        "tog-watchdeletion": "Sildiyim səhifələri və faylları izlədiyim səhifələrə əlavə et",
+       "tog-watchuploads": "İzləmə siyahısına yüklədiyim yeni faylları əlavə edin",
+       "tog-watchrollback": "İzləmə siyahıma rollback etdiyim səhifələri əlavə edin",
        "tog-minordefault": "Standart olaraq bütün redaktələri kiçik redaktə kimi nişanla",
        "tog-previewontop": "Sınaq göstərişini redaktə pəncərəsindən əvvəl göstər",
        "tog-previewonfirst": "İlkin redaktədə sınaq göstərişi",
@@ -67,7 +69,7 @@
        "tog-watchlisthideminor": "İzləmə səhifəmdə kiçik redaktələri gizlət",
        "tog-watchlisthideliu": "Qeydiyyatlı istifadəçilərin redaktələrini izləmə siyahısında gizlət",
        "tog-watchlistreloadautomatically": "Hər dəfə filtr dəyişəndə, izləmə siyahısını avtomatik yenilə (JavaScript tələb olunur)",
-       "tog-watchlistunwatchlinks": "İzləmə siyahısındakı səhifələrə birbaşa izləmə/izlə keçidləri əlavə et (JavaScript tələb olunur)",
+       "tog-watchlistunwatchlinks": "İzləmə siyahısındakı səhifələrə birbaşa izləmə/izlə keçidləri ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) əlavə et (JavaScript tələb olunur)",
        "tog-watchlisthideanons": "Qeydiyyatdan keçməmiş istifadəçilərin redaktələrini izləmə siyahısında gizlət",
        "tog-watchlisthidepatrolled": "Yoxlanılmış redaktələri izləmə siyahısında gizlət",
        "tog-watchlisthidecategorization": "Səhifələrin kateqoriyalaşdırmasını gizlət",
        "returnto": "$1 səhifəsinə qayıt.",
        "tagline": "{{SITENAME}} saytından",
        "help": "Kömək",
+       "help-mediawiki": "MediaWiki haqqında kömək",
        "search": "Axtar",
+       "search-ignored-headings": "#<!-- bu xəttə əl vurmayın --> <pre>\n# Axtarışa görə başlıqlara məhəl qoyulmayacaq.\n# Bununla bağlı dəyişiklik başlıqlı səhifənin indeksli olduğu anda qüvvəyə minir.\n# Boş redaktə edərək səhifəni yenidən indeksləşdirə bilərsiniz.\n# Sintaksis belədir:\n# *Hər şey \"#\" simvolundan xəttin sonuna qədər bir şərhdir.\n# *Hər bir boş olmayan sətir, işin və hər şeyin dəqiq başlığıdır.\nİstinadlar\nXarici keçidlər\nHəmçinin bax\n#</pre> <!-- bu xəttə əl vurmayın -->",
        "searchbutton": "Axtar",
        "go": "Keç",
        "searcharticle": "Keç",
        "history": "Səhifənin tarixçəsi",
        "history_short": "Tarixçə",
+       "history_small": "tarixçə",
        "updatedmarker": "son dəfə mən nəzərdən keçirəndən sonra yenilənib",
        "printableversion": "Çap variantı",
        "permalink": "Daimi bağlantı",
        "toolbox": "Alətlər",
        "tool-link-userrights": "{{GENDER:$1|İstifadəçi}} qruplarını dəyişdir",
        "tool-link-userrights-readonly": "{{GENDER:$1|İstifadəçi}} qruplarına bax",
+       "tool-link-emailuser": "Bu {{GENDER:$1|istifadəçiyə}} e-poçt göndər",
        "imagepage": "Fayl səhifəsini göstər",
        "mediawikipage": "Mesaj səhifəsini göstər",
        "templatepage": "Şablon səhifəsini göstər",
        "pool-timeout": "Blokun gözləmə müddəti bitdi",
        "pool-queuefull": "Çıxarış səhifəsi doludur",
        "pool-errorunknown": "naməlum xəta",
+       "pool-servererror": "Hovuz sayğaç xidməti mövcud deyil ($1).",
        "poolcounter-usage-error": "İstifadədə xəta: $1",
        "aboutsite": "{{SITENAME}} haqqında",
        "aboutpage": "Project:İzah",
        "passwordreset-emailtext-ip": "Kimsə, (ehtimal ki siz özünüz, $1 IP adresindən) {{SITENAME}} ($4) layihəsindəki hesabınızın \nparolunun yenilənməsini istəyib. Aşağıdakı istifadəçi {{PLURAL:$3|hesabı|hesabları}} bu e-poçt adresinə bağlıdır:\n\n$2\n\nBu müvəqqəti {{PLURAL:$3|parol|parollar}} {{PLURAL:$5|bir gün|$5 gün}} qüvvədə olacaqdır.\nSiz müvəqqəti parolla daxil olub yeni bir parol seçməlisiniz. Əgər parolun dəyişdirilməsini siz istəməmisinizsə və ya parolunuzu xatırladınızsa və artıq onu dəyişmək istəmirsinizsə, bu məktuba əhəmiyyət verməyərək köhnə parolunuzu istifadə etməyə davam edə bilərsiniz.",
        "passwordreset-emailelement": "İstifadəçi adı: \n$1\n\nMüvəqqəti parol: \n$2",
        "passwordreset-emailsentemail": "Əgər bu imeyl sizin istifadəçi hesabınıza bağlıdırsa, o halda parol sıfırlama məktubu ora göndəriləcək.",
+       "passwordreset-invalidemail": "Səhv e-poçt",
        "changeemail": "E-məktub ünvanını dəyiş və ya sil",
        "changeemail-oldemail": "Hazırkı e-poçt ünvanı:",
        "changeemail-newemail": "Yeni e-poçt ünvanı:",
        "minoredit": "Kiçik redaktə",
        "watchthis": "Bu səhifəni izlə",
        "savearticle": "Səhifəni dərc et",
+       "savechanges": "Dəyişiklikləri yadda saxla",
        "publishpage": "Səhifəni yayımla",
        "publishchanges": "Dəyişiklikləri yayımla",
+       "savearticle-start": "Səhifəni dərc et...",
+       "savechanges-start": "Dəyişiklikləri yadda saxla...",
        "preview": "Sınaq görüntüsü",
        "showpreview": "Sınaq göstərişi",
        "showdiff": "Dəyişiklikləri göstər",
        "postedit-confirmation-saved": "Redaktəniz qeyd edildi.",
        "edit-already-exists": "Yeni səhifəni yaratmaq mümkün deyil.\nBelə ki, bu adda səhifə artıq mövcuddur.",
        "content-not-allowed-here": "\"$1\" tərkibi [[:$2]] səhifəsi üçün icazə verilmir.",
+       "slot-name-main": "Əsas",
        "content-model-wikitext": "vikimətn",
        "content-model-text": "adi mətn",
        "content-model-javascript": "JavaScript",
        "diff-multi-manyusers": "({{PLURAL:$2|Bir istifadəçi|$2 istifadəçi}} tərəfindən edilən {{PLURAL:$1|bir ara redaktə|$1 ara redaktə}} göstərilmir)",
        "difference-missing-revision": "Səhifənin {{PLURAL:$2|$2 versiyasının}} müqayisəsi tapılmadı ($1).\nBu xəta adətən, köhnəlmiş səhifələrin müqayisə versiyalarından keçid edildikdə baş verir.\nDaha ətraflı məlumat üçün [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silmə qeydlərinə] baxın.",
        "searchresults": "Axtarış nəticələri",
+       "search-filter-title-prefix-reset": "Bütün səhifələrdə axtar",
        "searchresults-title": "''$1'' üçün axtarış nəticələri",
        "titlematches": "Səhifə adı eynidir",
        "textmatches": "Mətn eynidir",
        "search-interwiki-caption": "Qonşu layihələrdəki nəticələr",
        "search-interwiki-default": "$1 nəticələri:",
        "search-interwiki-more": "(yenə)",
+       "search-interwiki-more-results": "daha çox nəticə",
        "search-relatedarticle": "əlaqədar",
        "searchrelated": "əlaqəli",
        "searchall": "bütün",
        "username": "{{GENDER:$1|İstifadəçi adı}}:",
        "prefs-memberingroups": "{{GENDER:$2|Üzv}} olduğu {{PLURAL:$1|qrup}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 ($2 qədər)",
        "prefs-registration": "Qeydiyyat vaxtı:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Əsl adınız:",
        "rcfilters-other-review-tools": "Digər yoxlama alətləri",
        "rcfilters-group-results-by-page": "Dəyişiklikləri səhifələrə görə qruplaşdır",
        "rcfilters-activefilters": "Aktiv filtrlər",
+       "rcfilters-activefilters-hide": "Gizlət",
+       "rcfilters-activefilters-show": "Göstər",
        "rcfilters-advancedfilters": "Geniş filtr",
        "rcfilters-limit-title": "Göstərilməli dəyişikliklər",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|redaktə|redaktə}}, $2",
        "deadendpages": "Keçid verməyən səhifələr",
        "deadendpagestext": "Aşağıdakı səhifələrdən bu Vikipediyadakı digər səhifələrə heç bir keçid yoxdur.",
        "protectedpages": "Mühafizəli səhifələr",
+       "protectedpages-filters": "Filtrlər:",
        "protectedpages-indef": "Yalnız müddətsiz mühafizələr",
        "protectedpages-cascade": "Yalnız kaskad mühafizələr",
        "protectedpagesempty": "Hal-hazırda bu parametrə uyğun heç bir mühafizəli səhifə yoxdur",
        "pager-newer-n": "{{PLURAL:$1|1 daha yeni|$1 daha yeni}}",
        "pager-older-n": "{{PLURAL:$1|1 daha köhnə|$1 daha köhnə}}",
        "suppress": "Gizlət",
+       "apisandbox-helpurls": "Kömək linkləri",
+       "apisandbox-add-multi": "Əlavə et",
        "apisandbox-results": "Nəticələr",
+       "apisandbox-multivalue-all-namespaces": "$1 (Bütün ad fəzaları)",
        "booksources": "Kitab mənbələri",
        "booksources-search-legend": "Kitab mənbələri axtar",
        "booksources-isbn": "ISBN:",
        "listgrouprights-addgroup-self-all": "Bütün qrupları öz hesabına əlavə edə bilər",
        "listgrouprights-removegroup-self-all": "Bütün qrupları öz hesabından çıxara bilər",
        "listgrouprights-namespaceprotection-namespace": "Adlar fəzası",
+       "listgrants-rights": "Hüquqlar",
+       "trackingcategories-name": "Mesaj adı",
        "restricted-displaytitle-ignored": "İmtina edilmiş görüntü başlıqlarına malik səhifələr",
        "mailnologin": "Ünvan yoxdur",
        "emailuser": "İstifadəçiyə e-məktub göndər",
        "emailuser-title-target": "Bu {{GENDER:$1|istifadəçiyə}} e-məktub göndər",
+       "emailuser-title-notarget": "İstifadəçi e-maili",
        "defemailsubject": "\"$1\" adlı istifadəçidən {{SITENAME}} e-məktubu",
        "usermaildisabled": "İstifadəçi e-maili işləmir",
        "noemailtitle": "E-məktub ünvanı yoxdur",
        "watchlist-submit": "Göstər",
        "wlshowhideminor": "kiçik redaktələr",
        "wlshowhidebots": "botlar",
+       "wlshowhideliu": "qeydiyyatdan keçmiş istifadəçilər",
+       "wlshowhideanons": "anonim istifadəçilər",
        "wlshowhidemine": "mənimn redaktələrim",
        "watchlist-options": "İzləmə siyahısının nizamlamaları",
        "watching": "İzlənilir...",
        "ipb-disableusertalk": "Bu istifadəçi bloklu olarkən öz müzakirə səhifəsində redaktə etməsinə qadağa qoy",
        "ipb-change-block": "Bu səbəblərlə istifadəçini yenidən blokla",
        "ipb-confirm": "Bloku təsdiqlə",
+       "ipb-pages-label": "Səhifələr",
+       "ipb-namespaces-label": "Adlar fəzası",
        "badipaddress": "Səhv IP",
        "blockipsuccesssub": "Bloklandı",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] bloklanıb.<br />\nBlokları yoxlamaq üçün [[Special:BlockList|bloklama siyahısına]] baxın.",
        "ipb-blocklist": "Mövcud blokları göstər",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} istifadəçi hesabının fəaliyyətləri",
        "block-expiry": "Bitmə müddəti:",
+       "block-reason": "Səbəb:",
        "unblockip": "İstifadəçinin blokunu götür",
        "unblockiptext": "Əvvəlcədən bloklanmış bir IP ünvanına və ya istifadəçi adına yazma geri vermek için aşağıdakı formadan istifadə edin.",
        "ipusubmit": "Bu bloku götür",
        "createaccountblock": "Yeni hesab yaratma bloklanıb",
        "emailblock": "E-mail bloklanıb",
        "blocklist-nousertalk": "Müzakirə səhifəsini redaktə edə bilməz.",
+       "blocklist-editing-page": "aəhifələr",
+       "blocklist-editing-ns": "adlar fəzası",
        "ipblocklist-empty": "Blok siyahısı boşdur.",
        "ipblocklist-no-results": "Tələb olunan IP ünvanı və ya istifadəçi bloklanmadı.",
        "blocklink": "blokla",
        "thumbnail_image-missing": "Belə görünür ki, $1 faylı yoxdur",
        "import": "Səhifələri idxal et",
        "importinterwiki": "Başqa vikidən idxal et",
+       "import-interwiki-sourcepage": "Mənbə səhifəsi:",
        "import-interwiki-history": "Səhifənin dəyişmə tarixçələrinin hamısını köçür",
        "import-interwiki-templates": "Bütün şablonlarla birlikdə",
        "import-interwiki-submit": "İdxal",
        "pageinfo-contentpage-yes": "Bəli",
        "pageinfo-protect-cascading": "Kaskad mühafizə burada qoşulub",
        "pageinfo-protect-cascading-yes": "Bəli",
+       "pageinfo-category-info": "Kateqoriya məlumatı",
        "pageinfo-category-pages": "Səhifələrin sayı",
        "pageinfo-category-subcats": "Altkateqoriyaların sayı",
        "pageinfo-category-files": "Faylların sayı",
        "hours": "{{PLURAL:$1|$1 saat|$1 saat}}",
        "days": "{{PLURAL:$1|$1 gün|$1 gün}}",
        "ago": "$1 əvvəl",
+       "monday-at": "Bazar ertəsi $1",
        "bad_image_list": "Format bu şəkildə olmalıdır:\n\nYalnız siyahı bəndləri (* işarəsi ilə başlayan sətirlər) nəzərə alınır.\nSətirdəki ilk keçid, əlavə olunması qadağan olunmuş şəkilə keçid olmalıdır.\nHəmin sətirdəki növbəti keçidlər istisna hesab olunur. Məsələn, fayl məqalədə sətrin içində görünə bilər.",
        "variantname-zh-hans": "hans",
        "variantname-zh-hant": "hant",
        "confirm-purge-top": "Bu səhifə keşdən (cache) silinsin?",
        "confirm-watch-button": "OK",
        "confirm-unwatch-button": "OK",
+       "confirm-rollback-button": "TAMAM",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← əvvəlki səhifə",
        "imgmultipagenext": "sonrakı səhifə →",
        "imgmultigo": "Seç!",
        "imgmultigoto": "$1 səhifəyə get",
+       "img-lang-go": "Get",
        "ascending_abbrev": "artma sırasına görə",
        "descending_abbrev": "azalma sırasına görə",
        "table_pager_next": "Sonrakı səhifə",
        "watchlistedit-raw-done": "İzləmə səhifələriniz qeyd olundu.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 başlıq}} əlavə edildi:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 başlıq}} çıxarıldı:",
+       "watchlistedit-clear-titles": "Başlıqlar:",
        "watchlisttools-clear": "İzləmə siyahısını təmizlə",
        "watchlisttools-view": "Siyahıdakı səhifələrdə edilən dəyişikliklər",
        "watchlisttools-edit": "İzlədiyim səhifələri göstər və redaktə et",
        "watchlisttools-raw": "Adi mətn kimi redaktə et",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|müzakirə]])",
+       "timezone-local": "Lokal",
        "duplicate-defaultsort": "<strong>Diqqət:</strong> Susmaya görə \"$2\" çeşidləmə açarı susmaya görə əvvəlki \"$1\" çeşidləmə açarını inkar edir.",
        "version": "Versiya",
        "version-extensions": "NIzamlanmış genişlənmələr",
        "version-specialpages": "Xüsusi səhifələr",
        "version-parserhooks": "Parser hooks",
        "version-variables": "Dəyişkənlər",
+       "version-editors": "Redaktorlar",
        "version-antispam": "Spam önləmə",
        "version-other": "Digər",
        "version-hooks": "Çəngəllər",
        "version-hook-name": "Çəngəlin adı",
        "version-hook-subscribedby": "Abunə olan",
        "version-version": "($1)",
+       "version-no-ext-name": "[adsız]",
        "version-license": "MediaViki lisenziyası",
        "version-ext-license": "Lisenziya",
        "version-ext-colheader-version": "Versiya",
        "version-software-version": "Versiya",
        "version-entrypoints-header-url": "URL",
        "version-libraries-library": "Kitabxana",
+       "version-libraries-version": "Versiya",
+       "version-libraries-license": "Lisenziya",
        "version-libraries-authors": "Müəlliflər",
        "redirect-submit": "Keç",
        "redirect-lookup": "Bax",
        "htmlform-no": "Xeyr",
        "htmlform-yes": "Bəli",
        "htmlform-cloner-create": "Əlavə et",
+       "htmlform-date-placeholder": "İL-AY-GÜN",
        "logentry-delete-delete": "$1 $3 səhifəsini {{GENDER:$2|sildi}}",
        "logentry-suppress-delete": "$1 $3 səhifəsini {{GENDER:$2|gizlətdi}}",
        "revdelete-content-hid": "gizli mətn",
        "logentry-newusers-autocreate": "$1 istifadəçi hesabı avtomatik yaradıldı",
        "logentry-upload-upload": "$1 $3 faylını {{GENDER:$2|yüklədi}}.",
        "rightsnone": "(yoxdur)",
+       "feedback-back": "Əvvəlki",
        "feedback-bugnew": "Mən yoxladım. Yeni xəta barədə xəbər ver",
        "feedback-cancel": "İmtina",
        "feedback-close": "Oldu",
        "feedback-error2": "Xəta: Redaktə qeydə alınmadı",
        "feedback-message": "Mesaj:",
        "feedback-subject": "Mövzu:",
+       "feedback-submit": "Təsdiq et",
        "feedback-thanks-title": "Təşəkkür!",
        "searchsuggest-search": "{{grammar:prepositional|{{SITENAME}}}} axtar",
        "api-error-unknown-warning": "Naməlum xəbərdarlıq: \"$1\".",
        "limitreport-postexpandincludesize-value": "$1/$2 bayt",
        "expand_templates_output": "Nəticə",
        "expand_templates_ok": "OK",
+       "expand_templates_preview": "Sınaq görüntüsü",
        "pagelang-name": "Səhifə",
        "pagelang-language": "Dil",
+       "pagelang-select-lang": "Dili seçin",
+       "pagelang-reason": "Səbəb",
+       "pagelang-submit": "Təsdiq et",
+       "mediastatistics": "Media statistikası",
        "mediastatistics-nbytes": "$1 bayt ($2; $3%)",
+       "mediastatistics-table-count": "Faylların sayı",
        "mediastatistics-header-unknown": "Naməlum",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Videolar",
        "mediastatistics-header-office": "Ofis",
        "mediastatistics-header-text": "Mətn",
+       "mediastatistics-header-total": "Bütün fayllar",
        "special-characters-group-latin": "Latın",
        "special-characters-group-latinextended": "Latın genişləndirilmiş",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-no-date": "Tarix seçilməyib",
        "mw-widgets-usersmultiselect-placeholder": "Əlavə et...",
+       "mw-widgets-titlesmultiselect-placeholder": "Əlavə et...",
        "date-range-from": "Tarixindən:",
-       "date-range-to": "Tarixədək:"
+       "date-range-to": "Tarixədək:",
+       "log-action-filter-all": "Hamısı",
+       "log-action-filter-block-block": "Bloklama",
+       "log-action-filter-upload-upload": "Yeni yükləmə"
 }
index d71c3ad..979e34d 100644 (file)
        "uploadstash-thumbnail": "паказаць мініяцюру",
        "uploadstash-file-not-found-no-local-path": "Не знойдзена лакальнага шляху да отмасштабированному файлу.",
        "uploadstash-file-not-found-no-object": "Не атрымалася стварыць аб’ект лакальнага файла для мініяцюры.",
-       "uploadstash-file-not-found-missing-content-type": "Ð\9eÑ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 загаловак content-type.",
+       "uploadstash-file-not-found-missing-content-type": "Ð\90дÑ\81Ñ\83Ñ\82нÑ\96Ñ\87ае загаловак content-type.",
        "uploadstash-file-not-found-not-exists": "Шлях не знойдзены, альбо файл незразумелы.",
        "uploadstash-no-extension": "Пустое расшырэнне.",
        "invalid-chunk-offset": "Недапушчальнае зрушэнне фрагмента",
index a641d85..ac164d1 100644 (file)
        "content-json-empty-object": "Празен обект",
        "content-json-empty-array": "Празен масив",
        "deprecated-self-close-category": "Страници, използващи невалидни самозатварящи се HTML тагове",
-       "deprecated-self-close-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ñ\81Ñ\8aдÑ\8aÑ\80жа Ð½ÐµÐ²Ð°Ð»Ð¸Ð´Ð½Ð¸ Ñ\81амозаÑ\82ваÑ\80Ñ\8fÑ\89и Ñ\81е HTML Ñ\82агове, ÐºÐ°Ñ\82о <code>&lt;b/></code> Ð¸Ð»Ð¸ <code>&lt;span/></code>. Ð\9fоведениеÑ\82о Ð¸Ð¼ Ñ\81коÑ\80о Ñ\89е Ñ\81е Ð¿Ñ\80омени, Ð·Ð° Ð´Ð° Ñ\81Ñ\8aоÑ\82веÑ\82Ñ\81Ñ\82ва Ð½Ð° Ð¸Ð·Ð¸Ñ\81кваниÑ\8fÑ\82а Ð½Ð° HTML5, Ð° Ñ\83поÑ\82Ñ\80еба Ð¸Ð¼ Ð² Ñ\83икиÑ\82екÑ\81Ñ\82а Ð¾Ñ\82пада.",
+       "deprecated-self-close-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ñ\81Ñ\8aдÑ\8aÑ\80жа Ð½ÐµÐ²Ð°Ð»Ð¸Ð´Ð½Ð¸ Ñ\81амозаÑ\82ваÑ\80Ñ\8fÑ\89и Ñ\81е HTML Ñ\82агове, ÐºÐ°Ñ\82о <code>&lt;b/></code> Ð¸Ð»Ð¸ <code>&lt;span/></code>. Ð\9fоведениеÑ\82о Ð¸Ð¼ Ñ\81коÑ\80о Ñ\89е Ñ\81е Ð¿Ñ\80омени, Ð·Ð° Ð´Ð° Ñ\81Ñ\8aоÑ\82веÑ\82Ñ\81Ñ\82ва Ð½Ð° Ð¸Ð·Ð¸Ñ\81кваниÑ\8fÑ\82а Ð½Ð° HTML5, Ð° Ñ\83поÑ\82Ñ\80еба Ð¸Ð¼ Ð² Ñ\83икиÑ\82екÑ\81Ñ\82а Ðµ Ð½ÐµÐ¿Ñ\80епоÑ\80Ñ\8aÑ\87иÑ\82елна.",
        "duplicate-args-category": "Страници, които използват повтарящи се аргументи в извикванията на шаблона",
        "duplicate-args-category-desc": "Страницата съдържа шаблонни извиквания, които използват повтарящи се аргументи, като например <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Внимание:</strong> Тази страница прави твърде много ресурсоемки извиквания на анализиращи функции.\n\nВ момента има {{PLURAL:$1|$1 обръщение|$1 обръщения}} към такива функции, а трябва да {{PLURAL:$1|е|са}} по-малко от $2.",
        "rcfilters-filter-watchlistactivity-seen-description": "Промени по страници, които сте посетили откакто са настъпили промените.",
        "rcfilters-filtergroup-changetype": "Вид на промяната",
        "rcfilters-filter-pageedits-label": "Редакции на страници",
-       "rcfilters-filter-pageedits-description": "Редакции на съдържанието, беседи, описания на категории...",
+       "rcfilters-filter-pageedits-description": "Редакции на съдържанието, беседите, описанията на категориите…",
        "rcfilters-filter-newpages-label": "Създавания на страници",
        "rcfilters-filter-newpages-description": "Редакции, чрез които се създават нови страници.",
        "rcfilters-filter-categorization-label": "Промяна на категории",
        "apisandbox-dynamic-parameters-add-label": "Добавяне на параметър:",
        "apisandbox-dynamic-parameters-add-placeholder": "Име на параметъра",
        "apisandbox-dynamic-error-exists": "Параметър с име „$1“ вече съществува.",
-       "apisandbox-deprecated-parameters": "Ð\9eÑ\81Ñ\82аÑ\80ели параметри",
+       "apisandbox-deprecated-parameters": "Ð\9dепÑ\80епоÑ\80Ñ\8aÑ\87иÑ\82елни параметри",
        "apisandbox-fetch-token": "Автоматично попълване на маркера",
        "apisandbox-add-multi": "Добавяне",
        "apisandbox-submit-invalid-fields-title": "Някои полета са невалидни",
        "trackingcategories-name": "Име на съобщението",
        "trackingcategories-desc": "Критерий за включване на категория",
        "restricted-displaytitle-ignored": "Страници с игнорирани заглавия за показване",
-       "restricted-displaytitle-ignored-desc": "Страницата съдържа игнориран <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, защото той не съвпада с текущото заглавие на страницата.",
+       "restricted-displaytitle-ignored-desc": "Страницата съдържа игнориран <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, защото той не съвпада с действителното заглавие на страницата.",
        "expensive-parserfunction-category-desc": "Страницата използва твърде много ресурсоемки анализиращи функции (като <code>#ifexist</code>). Вижте [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ñ\81Ñ\8aдÑ\8aÑ\80жа Ð¿Ð¾Ð²Ñ\80едена Ð¿Ñ\80епÑ\80аÑ\82ка Ð·Ð° файл (препратка за поставяне на файл, когато такъв не съществува).",
+       "broken-file-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ñ\81Ñ\8aдÑ\8aÑ\80жа Ð¿Ð¾Ð²Ñ\80едена Ð¿Ñ\80епÑ\80аÑ\82ка ÐºÑ\8aм файл (препратка за поставяне на файл, когато такъв не съществува).",
        "trackingcategories-nodesc": "Няма налично описание.",
        "trackingcategories-disabled": "Категорията е деактивирана",
        "mailnologin": "Няма електронна поща",
index b8070a7..20fb349 100644 (file)
        "movepagetext": "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।\nপুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।\nযেসমস্ত পুনর্নির্দেশনা পুরনো শিরোনামটির দিকে নির্দেশ করছিল, সেগুলি স্বয়ংক্রিয়ভাবে হালনাগাদ করতে পারবেন।\nযদি তা না চান, তবে [[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।\nসংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।\n\nলক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে <strong>না</strong>, যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে।\nঅর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।\n\n<strong>টীকা:</strong>\nকোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে; অগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
        "movepagetext-noredirectfixer": "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।\nপুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।\n[[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।\nসংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।\n\nলক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে <strong>না</strong>, যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে। \nঅর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।\n\n<strong>টীকা:</strong>\nকোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে;\nঅগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
        "movepagetalktext": "আপনি যদি এই বাক্সে টিক দেন, তাহলে পাতাটির সাথে সংশ্লিষ্ট আলোচনা পাতাটিও স্বয়ংক্রিয়ভাবে নতুন শিরোনামে সরানো হবে যদি না নতুন শিরোনামটির অধীনে ইতিমধ্যেই একটি বিদ্যমান থাকে।\n\nএসব ক্ষেত্রে আপনি চাইলে নিজের হাতে পাতাটিকে সরাতে বা একত্রীকরণ করতে পারেন।",
-       "moveuserpage-warning": "'''সতর্কতা:''' আপনি একটি ব্যবহারকারী পাতা স্থানান্তর করছেন। অনুগ্রহ করে লক্ষ্য করুন যে এর মাধ্যমে কেবলমাত্র পাতাটি স্থানান্তর হবে, কিন্তু পাতার নাম পরিবর্তন হবে ''না''।",
+       "moveuserpage-warning": "<strong>সতর্কতা:</strong> আপনি একটি ব্যবহারকারী পাতা স্থানান্তর করছেন। অনুগ্রহ করে লক্ষ্য করুন যে এর মাধ্যমে কেবলমাত্র পাতাটি স্থানান্তর হবে, কিন্তু ব্যবহারকারীর নাম পরিবর্তন হবে <em>না</em>।",
        "movecategorypage-warning": "<strong>সতর্কীকরণ:</strong> আপনি একটি বিষয়শ্রেণীর পাতা স্থানান্তর করতে চলেছেন। দয়া করে মনে রাখবেন যে এতে শুধুমাত্র পাতাটি স্থানান্তরিত হবে এবং পুরাতন বিষয়শ্রেণীতে থাকা কোন পাতা নতুনটিতে পুনঃশ্রেণীকরণ করা হবে <em>না</em>।",
        "movenologintext": "কোন পাতা সরিয়ে ফেলতে চাইলে আপনাকে অবশ্যই একজন নিবন্ধিত ব্যবহারকারী হতে হবে ও অ্যাকাউন্টে [[Special:UserLogin|প্রবেশ]] করতে হবে।",
        "movenotallowed": "আপনার {{SITENAME}}-তে পাতা স্থানান্তরের অনুমতি নেই।",
index 319cf89..86bce96 100644 (file)
        "badretype": "Les contrasenyes que heu introduït no coincideixen.",
        "usernameinprogress": "La creació d'un compte per a aquest usuari ja està en curs. Espereu.",
        "userexists": "El nom que heu entrat ja és en ús.\nEscolliu-ne un de diferent.",
+       "createacct-normalization": "El vostre nom d'usuari s'ajustarà a «$2» per restriccions tècniques.",
        "loginerror": "Error d'inici de sessió",
        "createacct-error": "Error de creació de compte",
        "createaccounterror": "No s'ha pogut crear el compte: $1",
index 0d381d4..e50786f 100644 (file)
        "badretype": "Vámi napsaná hesla nesouhlasí.",
        "usernameinprogress": "Vytváření účtu tohoto uživatele již probíhá. Čekejte prosím.",
        "userexists": "Zadané uživatelské jméno se již používá.\nZvolte si prosím jiné jméno.",
+       "createacct-normalization": "Vaše uživatelské jméno bude z technických důvodů upraveno na „$2“.",
        "loginerror": "Chyba při přihlašování",
        "createacct-error": "Chyba při zakládání účtu",
        "createaccounterror": "Nepodařilo se vytvořit uživatelský účet: $1",
        "passwordpolicies-policy-maximalpasswordlength": "Heslo musí být kratší než {{PLURAL:$1|$1 znak|$1 znaky|$1 znaků}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Heslo nesmí být {{PLURAL:$1|dané oblíbené heslo|v seznamu $1 oblíbených hesel}}",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Heslo nesmí být v seznamu 100 000 nejčastěji používaných hesel.",
+       "passwordpolicies-policyflag-forcechange": "nutné změnit při přihlášení",
        "easydeflate-invaliddeflate": "Poskytnutý obsah nebyl správně zkomprimován",
        "unprotected-js": "Z bezpečnostních důvodů nelze načítat JavaScript z nechráněných stran. Vyrábějte prosím JavaScriptové skripty jen ve jmenném prostoru MediaWiki: nebo jako uživatelskou podstránku"
 }
index 32af66e..5b922a2 100644 (file)
        "nstab-template": "Skabelon",
        "nstab-help": "Hjælpeside",
        "nstab-category": "Kategori",
-       "mainpage-nstab": "Fovedside",
+       "mainpage-nstab": "Forside",
        "nosuchaction": "Funktionen findes ikke",
        "nosuchactiontext": "Handlingen som er angivet i URL'en er ugyldig.\nDu har måske skrevet URL'en forkert eller fulgt et ukorrekt link.\nDet kan også skyldes en fejl i softwaren, som bruges af {{SITENAME}}.",
        "nosuchspecialpage": "En sådan specialside findes ikke",
index d9b9287..087d7c5 100644 (file)
        "policy-url": "Project:Terzê hereketi",
        "portal": "Portalê cemati",
        "portal-url": "Project:Portalê cemati",
-       "privacy": "Politikay nımıtışi",
+       "privacy": "Politikaya dızdêni",
        "privacypage": "Project:Xısusiyetê nımıtışi",
        "badaccess": "Xeta mısadey",
        "badaccess-group0": "Heqa şıma çıniya, karo ke şıma waşt, bıkerê.",
        "searchmenu-new": "<strong>Ena wiki de perra \"[[:$1]]\" vıraze!</strong> {{PLURAL:$2|0=|Sewbina pela ke şıma geyrayê cı aye bıvênê.|Yew zi peyniyanê cıgeyrayışê xo bıvênê.}}",
        "searchprofile-articles": "Pelê zerreki",
        "searchprofile-images": "Multimedya",
-       "searchprofile-everything": "Pêro çi",
-       "searchprofile-advanced": "Herayen",
+       "searchprofile-everything": "Her çi",
+       "searchprofile-advanced": "Hirayên",
        "searchprofile-articles-tooltip": "$1 de cı geyre",
        "searchprofile-images-tooltip": "Dosya cı geyre",
        "searchprofile-everything-tooltip": "Tedeesteyan hemine cı geyre (pelanê werênayışi zi tey)",
-       "searchprofile-advanced-tooltip": "Cayê namanê xısusiyan de cı geyre",
+       "searchprofile-advanced-tooltip": "Cayê nameyanê xısusiyan de cı geyre",
        "search-result-size": "$1 ({{PLURAL:$2|1 çeku|$2 çekuy}})",
        "search-result-category-size": "{{PLURAL:$1|1 eza|$1 ezayi}} ({{PLURAL:$2|1 kategoriya bınêne|$2 kategoriyê bınêni}}, {{PLURAL:$3|1 dosya|$3 dosyeyi}})",
        "search-redirect": "($1 ra kırışiyaya)",
index a5fe903..160b2c2 100644 (file)
        "undo-failure": "Η επεξεργασία δεν μπορούσε να αναστραφεί λόγω αντικρουόμενων ενδιάμεσων επεξεργασιών.",
        "undo-norev": "Η ανάκληση αυτής της επεξεργασίας δεν ηταν δυνατό να πραγματοποιηθεί επειδή δεν υπάρχει ή επειδή έχει διαγραφεί.",
        "undo-nochange": "Η επεξεργασία φαίνεται να έχει ήδη αναιρεθεί.",
-       "undo-summary": "Αναίρεση αναθεώρησης $1 υπό τον/την [[Special:Contribs/$2|$2]] ([[User talk:$2|Συζήτηση]])",
+       "undo-summary": "Αναίρεση αναθεώρησης $1 από {{GENDER:$2|τον|την}} [[Special:Contribs/$2|$2]] ([[User talk:$2|Συζήτηση]])",
        "undo-summary-username-hidden": "Αναίρεση αναθεώρησης $1 από ένα κρυμμένο χρήστη",
        "cantcreateaccount-text": "Η δημιουργία λογαριασμού από αυτή τη διεύθυνση IP ('''$1''') έχει αποτραπεί από τον [[User:$3|$3]].\n\nΟ λόγος που δόθηκε από τον $3 είναι ''$2''",
        "cantcreateaccount-range-text": "Η δημιουργία λογαριασμού από διευθύνσεις IP στην περιοχή  <strong>$1</strong>, που περιλαμβάνει τη δική σας διεύθυνση IP (<strong>$4</strong>), έχει αποκλειστεί από τον [[User:$3|$3]].\n\nΗ αιτιολογία που δόθηκε από τον $3 είναι \"$2\"",
index d2d77f9..82fc7f6 100644 (file)
        "passwordpolicies-policy-passwordcannotbepopular": "Password cannot be {{PLURAL:$1|the popular password|in the list of $1 popular passwords}}",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Password cannot be in the list of 100,000 most commonly used passwords.",
        "passwordpolicies-policyflag-forcechange": "must change on login",
+       "passwordpolicies-policyflag-suggestchangeonlogin": "suggest change on login",
        "easydeflate-invaliddeflate": "Content provided is not properly deflated",
        "unprotected-js": "For security reasons JavaScript cannot be loaded from unprotected pages. Please only create javascript in the MediaWiki: namespace or as a User subpage"
 }
index 10c65e5..25755e5 100644 (file)
                        "Laura Ospina",
                        "Pipino-pumuki",
                        "Carlosmg.dg",
-                       "Mynor Archila"
+                       "Mynor Archila",
+                       "Jorge Ubilla"
                ]
        },
        "tog-underline": "Enlaces a subrayar:",
        "edit-gone-missing": "No se ha podido actualizar la página.\nParece haber sido borrada.",
        "edit-conflict": "Conflicto de edición.",
        "edit-no-change": "Se ignoró tu edición porque no se hizo ningún cambio en el texto.",
-       "edit-slots-cannot-add": "{{PLURAL:$1|La siguiente ranura no es soportada|Las siguientes ranuras no son soportadas}} aquí:",
+       "edit-slots-cannot-add": "{{PLURAL:$1|La siguiente ranura no es soportada|Las siguientes ranuras no son soportadas}} aquí: $2.",
        "edit-slots-missing": "{{PLURAL:$1|Falta el siguiente espacio|Faltan los siguientes espacios}}: $2",
        "postedit-confirmation-created": "Se ha creado la página.",
        "postedit-confirmation-restored": "Se ha restaurado la página.",
        "anoncontribs": "Contribuciones",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "La cuenta de usuario «$1» no está registrada.",
+       "negative-namespace-not-supported": "Los espacios de nombres con valores negativos no están permitidos",
        "nocontribs": "No se encontraron cambios que cumplieran estos criterios.",
        "uctop": "última",
        "month": "Desde el mes (y anteriores):",
        "ipb-confirm": "Confirmar bloqueo",
        "ipb-sitewide": "En todo el sitio",
        "ipb-partial": "Parcial",
+       "ipb-sitewide-help": "Todas las páginas en la Wiki y todas las acciones de contribución.",
        "ipb-pages-label": "Páginas",
        "ipb-namespaces-label": "Espacios de nombres",
        "badipaddress": "La dirección IP no tiene el formato correcto.",
index a3ce398..40f962a 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Kening Aldgilles",
                        "Robin van der Vliet",
-                       "Snakesteuben"
+                       "Snakesteuben",
+                       "PiefPafPier"
                ]
        },
        "exif-imagewidth": "Breedte",
@@ -24,7 +25,7 @@
        "exif-pixelxdimension": "Ofbyldingsbreedte",
        "exif-pixelydimension": "Ofbyldingshichte",
        "exif-usercomment": "Opmerkings",
-       "exif-relatedsoundfile": "Besibbe audiotriem",
+       "exif-relatedsoundfile": "Besibbe audiobestân",
        "exif-datetimeoriginal": "Tiidstip gegevensoanmaak",
        "exif-datetimedigitized": "Tiidstip digitalisearring",
        "exif-subsectime": "Datum tijd subsekonden",
@@ -37,7 +38,7 @@
        "exif-lightsource": "Ljochtboarne",
        "exif-flash": "Flits",
        "exif-focallength-format": "$1 mm",
-       "exif-filesource": "Triemboarne",
+       "exif-filesource": "Bestânsboarne",
        "exif-whitebalance": "Wytbalâns",
        "exif-contrast": "Kontrast",
        "exif-saturation": "Sêding",
index da32d54..9086e42 100644 (file)
        "botpasswords-invalid-name": "نام کاربری مشخص شده دارای جداکنندهٔ گذرواژهٔ رباتی نیست («$1»).",
        "botpasswords-not-exist": "کاربر «$1» گذرواژهٔ رباتی نام‌دهی شدهٔ «$2» ندارد.",
        "botpasswords-needs-reset": "گذرواژهٔ رباتی برای ربات «$2» و {{GENDER:$1|کاربر}} «$1» باید از نو تنظیم شود.",
+       "botpasswords-locked": "حساب شما قفل شده است و با گذرواژه رباتی نمی‌توانید وارد شوید",
        "resetpass_forbidden": "نمی‌توان گذرواژه‌ها را تغییر داد",
        "resetpass_forbidden-reason": "نمی‌توانید گذرواژه‌ها را تغییر داد: $1",
        "resetpass-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "resetpass-abort-generic": "تغییر گذرواژه به دست یکی از افزونه‌ها لغو شده است.",
        "resetpass-expired": "رمز عبور شما منقضی شده‌است. لطفاً برای ورود رمز عبور جدیدی را تنظیم کنید.",
        "resetpass-expired-soft": "رمز عبور شما منقضی شده‌است و نیاز به تغییر دارد. لطفاً اکنون رمز عبور جدیدی را انتخاب کنید، یا برای تغییر آن در آینده، دکمهٔ «{{int:authprovider-resetpass-skip-label}}» را کلیک کنید.",
+       "resetpass-validity": "لطفا برای ورود گذرواژه جدیدی را انتخاب کنید",
        "resetpass-validity-soft": "گذرواهٔ شما صحیح نیست: $1\n\nلطفاً یک گذرواژهٔ تازه الآن انتخاب کنید یا بر «{{int:authprovider-resetpass-skip-label}}» کلیک کنید که دوباره آن را بعداً تغییر دهید.",
        "passwordreset": "بازنشانی گذرواژه",
        "passwordreset-text-one": "برای بازنشانی گذرواژه‌تان این فرم را کامل کنید.",
index 3364e87..d1092fa 100644 (file)
        "talk": "Oerlis",
        "views": "Werjeften",
        "toolbox": "Ark",
-       "imagepage": "Besjoch triemside",
+       "imagepage": "Besjoch bestânsside",
        "mediawikipage": "Berjochtside sjen litte",
        "templatepage": "Berjochtside lêze",
        "viewhelppage": "Helpside sjen litte",
        "aboutpage": "Project:Ynfo",
        "copyright": "Ynhâld is beskikber ûnder de $1.",
        "copyrightpage": "{{ns:project}}:Auteursrjocht",
-       "currentevents": "Hjoeddeis",
+       "currentevents": "Rinnende saken",
        "currentevents-url": "Project:Rinnende saken",
        "disclaimers": "Foarbehâld",
        "disclaimerpage": "Project:Algemien foarbehâld",
        "editold": "bewurkje",
        "viewsourceold": "boarnetekst besjen",
        "editlink": "bewurkje",
-       "viewsourcelink": "boarnetekst besjen",
+       "viewsourcelink": "besjoch de boarne",
        "editsectionhint": "Dielside bewurkje: $1",
        "toc": "Ynhâld",
        "showtoc": "sjen litte",
        "perfcachedts": "De neikommende gegevens komme út de bewarre ynformaasje, dizze is it lêst fernijd op $1. In maksimum fan {{PLURAL:$4|ien resultaat is|$4 resultaten binne}} beskikber yn de cache.",
        "querypage-no-updates": "Dizze side kin net bywurke wurde. Dizze gegevens wurde net ferfarske.",
        "viewsource": "Besjoch de boarne",
+       "viewsource-title": "Besjoch de boarne foar $1",
        "actionthrottled": "Hanneling opkeard",
        "actionthrottledtext": "As maatregel tsjin spam is it tal kearen per tiidsienheid beheind dat jo dizze hanneling ferrjochtsje kinne. Jo binne oer de limyt. Besykje it in tal minuten letter wer.",
        "protectedpagetext": "Dizze side is befeilige. Bewurkjen is net mooglik.",
        "nowiki_sample": "Foechje hjir platte tekst yn",
        "nowiki_tip": "Negearje it wiki formaat",
        "image_sample": "Foarbyld.jpg",
-       "image_tip": "Mediatriem",
+       "image_tip": "Mediabestân",
        "media_tip": "Link nei bestân",
        "sig_tip": "Jo hântekening mei dei en oere",
        "hr_tip": "Horizontale line (mei ferdrach brûke)",
        "userinvalidconfigtitle": "<strong>Warskôging:</strong> der is gjin skin \"$1\".\nTink derom: jo eigen .css- en .js-siden begjinne mei in lytse letter, bygelyks {{ns:user}}:Namme/vector.css ynsté fan {{ns:user}}:Namme/Vector.css.",
        "updated": "(Bewurke)",
        "note": "<strong>Opmerking:</strong>",
-       "previewnote": "<strong>Tink der om dat dizze side noch net fêstlein is!</strong>",
+       "previewnote": "<strong>Tink der om dat dit allinnich in foarfertoaning is!</strong>\nJo feroarings binne noch net fêstlein!",
        "previewconflict": "Dizze side belanget allinich it earste bewurkingsfjild oan.",
        "session_fail_preview": "<strong>Jo bewurking is net ferwurke, om't de sessygegevens ferlern gien binne.</strong>\nBesykje it nochris. As it dan noch net slagget, [[Special:UserLogout|meld jo dan ôf]] en wer oan.",
        "session_fail_preview_html": "<strong>Jo bewurking is net ferwurke, om't sesjegegevens ferlern gien binne.</strong>\n\n<em>Om't yn {{SITENAME}} rûge HTML ynskeakele is, is in foarfertoaning net mûglik as beskerming tsjin oanfallen mei JavaScript.</em>\n\n<strong>As dit in legitime bewurking is, besykje it dan fannijs.</strong>\nAs it dan  noch net slagget, [[Special:UserLogout|meld jo dan ôf]] en wer oan.",
        "copyrightwarning": "Tink derom dat alle bydragen oan {{SITENAME}} beskôge wurde frijjûn te wêzen ûnder de $2 (sjoch $1 foar bysûnderheden). As jo net wolle dat jo tekst troch oaren neffens eigen goedfinen bewurke en ferspraat wurde kin, kies dan net foar 'Side Bewarje'.</br>\nHjirby sizze jo tagelyk ta, dat jo dizze tekst sels skreaun hawwe, of oernommen hawwe út in frije, iepenbiere boarne.</br/>\n'''BRûK GJIN MATERIAAL DAT BESKERME WURDT TROCH AUTERURSRJOCHT, OF JO MOATTE DêR TASTIMMING TA HAWWE!</STRONG>",
        "copyrightwarning2": "Al jo bydragen oan {{SITENAME}} kinne bewurke, feroare of fuorthelle wurde troch oare brûkers.\nAs jo net wolle dat jo teksten yngeand oanpast wurde troch oaren, set se hjir dan net.<br />\nJo sizze ek ta dat jo de oarspronklike auteur binne fan dit materiaal, of dat jo it kopiearre hawwe út in boarne yn it publike domein, of in soartgelikense frije boarne (sjuch $1 foar details).\n'''BRUK GJIN MATERIAAL DAT BESKERME WURDT TROCH AUTEURSRJOCHT, OF JO MOATTE DER TASTIMMING FOAR HAWWE!'''",
        "longpageerror": "<strong>Flater: de tekst dy't jo tafoege hawwe is {{PLURAL:$1|ien kilobyte|$1 kilobytes}} grut, wat grutter is as it maksimum fan {{PLURAL:$2|ien kilobyte|$2 kilobytes}}.</strong>\nBewarjen is net mûglik.'''",
-       "readonlywarning": "<strong>Warskôging: De databank is ôfsletten foar ûnderhâld, dus jo kinne jo bewurkings no net fêstlizze. Bewarje de tekst foar lettere pleatsing yn in teksttriem.</strong>\n\nIn  behearder hat de database blokkearre om de folgjende reden: $1",
+       "readonlywarning": "<strong>Warskôging: De databank is skoattele foar ûnderhâld, dat jo kinne jo bewurkings op dit stuit net fêstlizze.</strong>\nJo soene jo tekst knippe en plakke kinne nei in tekstbestân, en bewarje foar letter.\n\nDe systeembehearder dy't it skoattele hat joech dizze taljochting: $1",
        "protectedpagewarning": "<strong>Warskôging: Dizze side is beskerme, dat gewoane brûkers dy net bewurkje kinne.</strong>",
        "semiprotectedpagewarning": "<strong>Opmerking:</strong> Dizze side is befeilige en kin allinne troch registrearre brûkers bewurke wurde.",
        "cascadeprotectedwarning": "<strong>Warskôging:</strong> Dizze side is skoattele sadat allinnich behearders de side wizigje kinne, om't der in ûnderdiel útmakket fan de neikommende {{PLURAL:$1|side|siden}}, dy't skoattele binne mei de \"ûnderlizzende siden\" opsje ynskeakele:",
        "mergehistory": "Skiednis fan kombinearjen",
        "mergehistory-header": "Troch dizze side kinne jo ferzjes fan 'e skiednis fan in boarneside nei in nijere side gearfoegje.\nSoargje dat jo mei dizze feroaring it skiednisferrin fan de side net oantaaste.",
        "mergehistory-box": "Ferzjes fan twa siden kombinearje:",
-       "mergehistory-from": "Triemnamme boarne:",
+       "mergehistory-from": "Bestânsnamme boarne:",
        "mergehistory-into": "Bestimmingside:",
        "mergehistory-list": "Gearfoegbere bewurkingsskiednis",
        "mergehistory-merge": "De folgjende ferzjes fan [[:$1]] kinne gearfoege wurde nei [[:$2]].\nBrûk de kolom mei de karrûntsjes om allinne de ferzjes makke op en foar de oanjûne tiid gear te foegjen.\nTink derom it brûken fan de navigaasjeferwizings dy kolom op'e nij ynstelt.",
        "lineno": "Rigel $1:",
        "compareselectedversions": "Ferlykje selektearre ferzjes",
        "showhideselectedversions": "Oantikke ferzjes wol/net sjen litte",
-       "editundo": "werom sette",
+       "editundo": "weromsette",
        "diff-empty": "(Gjin ferskil)",
-       "searchresults": "Sykresultaat",
+       "searchresults": "Sykresultaten",
        "searchresults-title": "Sykresultaten foar \"$1\"",
        "titlematches": "Titels",
        "textmatches": "Siden",
        "next-page": "folgjende side",
        "prevn-title": "{{PLURAL:$1|Foarich risseltaat|Foarige $1 risseltaten}}",
        "nextn-title": "{{PLURAL:$1|Folgjend risseltaat|Folgjende $1 risseltaat}}",
+       "shown-title": "Lit $1 {{PLURAL:$1|resultaat|resultaten}} de side sjen",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) besjen.",
        "searchmenu-exists": "<strong>Der is in side mei namme \"[[:$1]]\" yn dizze wiki</strong>",
-       "searchmenu-new": "<strong>Meitsje de side \"[[:$1]]\" yn dizze wiki!</strong>",
+       "searchmenu-new": "<strong>Meitsje de side \"[[:$1]]\" op dizze wiki!</strong> {{PLURAL:$2|0=|Sjoch ek de side fûn mei jo sykopdracht.|Sjoch ek de sykresultaten dy't fûn binne.}}",
        "searchprofile-articles": "Ynhâldlike siden",
        "searchprofile-images": "Multymedia",
        "searchprofile-everything": "Alles",
        "right-markbotedits": "Tebekdraaide bewurkings markearje as botbewurkings",
        "right-noratelimit": "Hat gjin tiidsôfhinklike beheinings",
        "right-import": "Siden út oare wiki's ymportearje",
-       "right-importupload": "Ymportearjen siden fan in triemoanbied",
+       "right-importupload": "Ymportearje siden út opladen bestân",
        "right-patrol": "Bewurkings as kontrolearre markearje",
        "right-autopatrol": "Bewurkings wurde automatysk as kontrolearre markearre",
        "right-patrolmarks": "Kontroletekens yn resinte feroarings besjen",
        "rcshowhidemine-show": "werjaan",
        "rcshowhidemine-hide": "ferbergje",
        "rclinks": "Jou $1 nije feroarings yn de lêste $2 dagen",
-       "diff": "ferskil",
-       "hist": "skiednis",
+       "diff": "fersk.",
+       "hist": "skied.",
        "hide": "gjin",
        "show": "al",
        "minoreditletter": "T",
        "upload_directory_read_only": "De webserver kin net skriuwe yn de oanbiedpad ($1).",
        "uploaderror": "Oanbiedfout",
        "uploadtext": "Om in nije bestannen oan te bieden, brûke jo de ûndersteande formulier. Earder oanbeane bestannen, kinne jo fine op de [[Special:FileList|list fan oanbeane ôfbylden]].\nWat oanbean en wat wiske wurdt, wurdt delskreaun yn it [[Special:Log/upload|lochboek]].\n\nOm it bestân yn in side op te nimmen, meitsje jo dêr sa'n keppeling:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:jo_foto.jpg]]</nowiki></code>''', foar grutte ferzje,\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:jo_logo.png|omskriuwing]]</nowiki></code>''' foar 200 in piksel ferzje, mei 'alternative tekst' as beskriuwing, of\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:jo_lûd.ogg]]</nowiki></code>''', foar direkt keppeling nei it bestân (sûnder byld).",
-       "upload-permitted": "Talitten triemtypen: $1.",
-       "upload-preferred": "Oanwiisde triemtypen: $1.",
-       "upload-prohibited": "Ferbeane triemtypen: $1.",
+       "upload-permitted": "Talitten bestânstypen: $1.",
+       "upload-preferred": "Oanwiisde bestânstypen: $1.",
+       "upload-prohibited": "Ferbeane bestânstypen: $1.",
        "uploadlogpage": "Oanbiedloch",
        "uploadlogpagetext": "List fan de lêst oanbeane bestannen. (Tiid oanjûn as UTC).",
-       "filename": "Triemnamme",
+       "filename": "Bestânsnamme",
        "filedesc": "Omskriuwing",
        "fileuploadsummary": "Gearfetting:",
-       "filereuploadsummary": "Triemferoarings:",
+       "filereuploadsummary": "Bestânsferoarings:",
        "filestatus": "Auteursrjochtensituaasje:",
        "filesource": "Boarne:",
        "ignorewarning": "Negearje de warskôging en lis bestân dochs fêst.",
        "ignorewarnings": "Negearje warskôgings",
-       "minlength1": "Triemnammen moatte minstens út ien teken bestean.",
+       "minlength1": "Bestânsnammen moatte minstens út ien teken bestean.",
        "illegalfilename": "De bestânsnamme \"$1\" befettet ûnjildige tekens.\nJou it bestân in oare namme en besykje him dan op 'e nij heech te laden.",
        "badfilename": "De ôfbyldnamme is feroare nei \"$1\".",
        "filetype-badmime": "Bestannen fan it MIME type \"$1\" meie net heechladen wurde.",
        "filepageexists": "De beskriuwingsside foar dit bestân bestiet al op <strong>[[:$1]]</strong>, mar der bestiet gjin bestân mei dizze namme.\nDe gearfetting dy't jo opjûn hawwe sil net op 'e beskriuwingsside ferskine.\nBewurkje de side mei de hân om de beskriuwing dêr wer te jaan.",
        "fileexists-extension": "In bestân mei deselde namme bestiet al: [[$2|thumb]]\n* Namme fan it heechladen bestân: <strong>[[:$1]]</strong>\n* Namme fan it besteande bestân: <strong>[[:$2]]</strong>\nKies in oare namme.",
        "fileexists-thumbnail-yes": "It bestân liket in ferlytse ferzje te wêzen ''(miniatuerôfbylding)''. [[$1|thumb]]\nKontrolearje it bestân <strong>[[:$1]]</strong>.\nAs it kontrolearre bestân deselde ôfbylding fan deselde grutte is, dan hoecht net in ekstra miniatuerôfbylding oanbean te wurden.",
-       "file-thumbnail-no": "De triemnamme begjint mei <strong>$1</strong>.\nIt liket in ferlytse ôfbylding te wêzen ''(miniatuerôfbylding)''.\nAs jo dy ôfbylding yn folsleine resolúsje hawwe, bied him dan oan.\nFeroarje oars de triemnamme.",
+       "file-thumbnail-no": "De bestânsnamme begjint mei <strong>$1</strong>.\nIt liket in ferlytse ôfbylding te wêzen ''(miniatuerôfbylding)''.\nAs jo dy ôfbylding yn folsleine resolúsje hawwe, bied him dan oan.\nFeroarje oars de bestânsnamme.",
        "fileexists-forbidden": "Der bestiet al in bestân mei dizze namme.\nBied jo bestân ûnder in oare namme oan.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Der bestiet al in bestân mei dizze namme by de dielde bestannen.\nAs jo it bestân dochs noch oanbiede wolle, gean dan werom en kies in oare namme.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Dit bestân is idintyk oan {{PLURAL:$1|it folgjende bestân|de folgjende bestannen}}:",
        "savefile": "Lis bestân fêst",
        "uploaddisabled": "Sorry, op dizze tsjinner kin net oanbean wurde.",
        "uploaddisabledtext": "It oanbieden fan bestannen is útskeakele.",
-       "php-uploaddisabledtext": "PHP-triemuploads binne útskeakele.\nKontrolearje de ynstelling \"file_uploads\".",
+       "php-uploaddisabledtext": "PHP-bestânsuploads binne útskeakele.\nKontrolearje de ynstelling \"file_uploads\".",
        "uploadscripted": "Dit bestân befettet HTML- of scriptkoade dy't ferkeard troch jo browser werjûn wurde kin.",
        "uploadvirus": "It bestân befettet in firus! Details: $1",
-       "upload-source": "Boarnetriem",
-       "sourcefilename": "Triemnamme boarne:",
+       "upload-source": "Boarnebestân",
+       "sourcefilename": "Bestânsnamme boarne:",
        "sourceurl": "Boarne-URL:",
-       "destfilename": "Triemnamme om op te slaan:",
-       "upload-maxfilesize": "Maksimale triemgrutte: $1",
-       "upload-description": "Triembeskriuwing",
+       "destfilename": "Bestânsnamme om op te slaan:",
+       "upload-maxfilesize": "Maksimale bestânsgrutte: $1",
+       "upload-description": "Bestânsbeskriuwing",
        "upload-options": "Uploadynstellingen",
        "watchthisupload": "Folgje dit bestân",
        "filewasdeleted": "Der is earder in bestân mei dizze namme fuorthelle.\nRieplachtsje it $1 foar't jo him op'e nij tafoegje.",
-       "filename-bad-prefix": "De namme fan it bestân dat't jo oanbiede begjint mei '''\"$1\"''', dit wiist op in namme dy't automatysk troch in digitale kamera oanmakke wurdt. Feroarje de namme as jo wolle yn ien dy't in omskriuwing jout fan it bestân.",
-       "filename-prefix-blacklist": " #<!-- lit dizze line exakt sa't er is --> <pre>\n# Syntax is as folget:\n#   * Alles fan in \"#\"-teken oan't de ein fan de line is in kommintaar\n#   * Elke net blanke line is a foarheaksel foar triemnammen sa't dy automatysk jûn wurde troch digitale kamera's\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # guon mobile tillefoanen\nIMG # algemien\nJD # Jenoptik\nMGP # Pentax\nPICT # ferskaat\n #</pre> <!-- lit dizze line exakt sa't er is -->",
+       "filename-bad-prefix": "De namme fan it bestân dat jo oanbiede begjint mei '''\"$1\"''', dit wiist op in namme dy't automatysk troch in digitale kamera oanmakke wurdt. Feroarje de namme as jo wolle yn ien dy't in omskriuwing jout fan it bestân.",
+       "filename-prefix-blacklist": " #<!-- lit dizze line exakt sa't er is --> <pre>\n# Syntax is as folget:\n#   * Alles fan in \"#\"-teken oan't de ein fan de line is in kommintaar\n#   * Elke net blanke line is a foarheaksel foar bestânsnammen sa't dy automatysk jûn wurde troch digitale kamera's\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # guon mobile tillefoanen\nIMG # algemien\nJD # Jenoptik\nMGP # Pentax\nPICT # ferskaat\n #</pre> <!-- lit dizze line exakt sa't er is -->",
        "upload-proto-error": "Ferkeard protokol",
        "upload-proto-error-text": "Oanbieden mei dizze metoade freget URL's dy't begjinne mei <code>http://</code> of <code>ftp://</code>.",
        "upload-file-error": "Ynterne fout",
        "listfiles-summary": "Op dizze spesjale side binne alle tafoege bestannen te besjen.\nStandert wurde de lêst tafoege bestannen boppe oan de list werjûn.\nKlikken op in kolomkop feroaret de sortearring.",
        "listfiles_search_for": "Sykje nei bestân:",
        "imgfile": "bestân",
-       "listfiles": "Triemlist",
+       "listfiles": "Bestânslist",
        "listfiles_thumb": "Miniatuerôfbylding",
        "listfiles_date": "Datum",
        "listfiles_name": "Namme",
        "filehist-revert": "werom sette",
        "filehist-current": "lêste",
        "filehist-datetime": "Tiid",
-       "filehist-thumb": "Miniatuerôfbylding",
-       "filehist-thumbtext": "Miniatuerôfbylding foar ferzje fan $1 ôf",
+       "filehist-thumb": "Miniatuer",
+       "filehist-thumbtext": "Miniatuer foar de ferzje sûnt $1",
        "filehist-nothumb": "Gjin miniatuerôfbylding",
        "filehist-user": "Meidogger",
        "filehist-dimensions": "Ofmjittings",
-       "filehist-filesize": "Triemgrutte",
+       "filehist-filesize": "Bestânsgrutte",
        "filehist-comment": "Opmerkings",
-       "imagelinks": "Ofbyldkeppelings",
+       "imagelinks": "Bestânsgebrûk",
        "linkstoimage": "Dizze {{PLURAL:$1|side is|$1 siden binne}} keppele oan it ôfbyld:",
        "linkstoimage-more": "Der {{PLURAL:$2|is|binne}} mear as $1 {{PLURAL:$1|ferwizing|ferwizings}} nei dit bestân.\nDe folgjende list jout allinne de earste {{PLURAL:$1|ferwizing|$1 ferwizings}} nei dit bestân wer.\nDer is ek in [[Special:WhatLinksHere/$2|folsleine list]].",
        "nolinkstoimage": "Der binne gjin siden oan dit ôfbyld keppele.",
        "morelinkstoimage": "[[Special:WhatLinksHere/$1|Mear ferwizings]] nei dit bestân besjen.",
-       "duplicatesoffile": "{{PLURAL:$1|De folgjende bestân is|De folgjende $1 bestannen binne}} idintyk oan dit bestân:",
+       "duplicatesoffile": "{{PLURAL:$1|It folgjende bestân is|De folgjende $1 bestannen binne}} idintyk oan dit bestân:",
        "sharedupload": "Dit bestân is in dielde oanbieding en kin ek troch oare projekten brûkt wurde.",
        "filepage-nofile": "Der bestiet gjin bestân mei sa'n namme.",
        "filepage-nofile-link": "Der bestiet gjin bestân mei sa'n namme [bied $1 oan].",
        "filedelete-nofile-old": "Der is gjin opsleine ferzje fan '''$1''' mei de oanjûne eigenskippen.",
        "filedelete-otherreason": "Oare/eventuele reden:",
        "filedelete-reason-otherlist": "Oare reden",
-       "filedelete-reason-dropdown": "*Faak foarkommende redenen foar fuortheljen\n** Skeinen fan auteursrjochten\n** Duplikaattriem",
+       "filedelete-reason-dropdown": "*Faak foarkommende redenen foar fuortheljen\n** Skeinen fan auteursrjochten\n** Duplikaatbestân",
        "filedelete-edit-reasonlist": "Redenen foar fuortheljen bewurkje",
        "mimesearch": "Sykje op MIME-type",
        "mimesearch-summary": "Dizze side makket it filterjen mûglik fan bestannen foar it MIME-type.\nYnfier: contenttype/subtype, bygelyks <code>image/jpeg</code>.",
        "allpagesbadtitle": "De opjûne sidenamme is ûnjildich of hat in yntertaal- of ynterwikifoarheaksel.\nMûglik befettet de namme karakters dy't net brûkt wurde meie yn sidenammen.",
        "allpages-bad-ns": "{{SITENAME}} hat gjin nammerûmte \"$1\".",
        "categories": "Kategoryen",
-       "categoriespagetext": "De folgjende kategoriyen befetsje siden of mediatriemmen.\n[[Special:UnusedCategories|Net brûkte kategoryen]] wurde hjir net werjûn.\nSjuch ek [[Special:WantedCategories|net-besteande kategoryen mei ferwizings]].",
+       "categoriespagetext": "De folgjende {{PLURAL:$1|kategory bestiet|kategoryen bestean}} op 'e wiki, en {{PLURAL:$1|is|binne}} al of net brûkt.\nSjoch ek [[Special:WantedCategories|Net-besteande kategoryen mei ferwizings]].",
        "categoriesfrom": "Kategoryen werjaan fan .. ôf:",
        "deletedcontributions": "Wiske meidogger bydragen",
        "deletedcontributions-title": "Wiske meidogger bydragen",
        "nolinkshere-ns": "Gjin siden yn de keazen nammeromte keppelje nei '''$2'''.",
        "isredirect": "synonym",
        "istemplate": "opnaam",
-       "isimage": "triemkeppeling",
+       "isimage": "bestânskeppeling",
        "whatlinkshere-prev": "{{PLURAL:$1|foarige|foarige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|folgjende|folgjende $1}}",
        "whatlinkshere-links": "← keppelings",
        "import-interwiki-sourcewiki": "Boarnewiki:",
        "import-interwiki-sourcepage": "Boarneside:",
        "import-interwiki-submit": "Ymportearje",
-       "import-upload-filename": "Triemnamme:",
+       "import-upload-filename": "Bestânsnamme:",
        "import-comment": "Oanmerking:",
        "importstart": "Siden oan it ymportearjen ...",
        "import-revision-count": "$1 {{PLURAL:$1|ferzje|ferzjes}}",
        "importnopages": "Gjin siden te ymportearjen.",
        "importfailed": "Ymport fout: <nowiki>$1</nowiki>",
        "importunknownsource": "Unbekende ymportboarnetype",
-       "importcantopen": "De ymporttriem koe net iepenen wurde.",
+       "importcantopen": "It ymportbestân koe net iepene wurde.",
        "importbadinterwiki": "Ferkearde ynterwikiferwizing",
        "importsuccess": "Ymport slagge!",
-       "importnofile": "Gjin ymporttriem is oanbeane.",
+       "importnofile": "Gjin ymportbestân is oanbean.",
        "import-noarticle": "Gjin side te ymportearjen!",
        "import-nonewrevisions": "Alle ferzjes wurde al ymportearre.",
        "xml-error-string": "$1 op regel $2, kolom $3 (byte $4): $5",
        "tooltip-pt-logout": "Ofmelde",
        "tooltip-pt-createaccount": "Jo wurde fan herten útnûge in akkount oan te meitsjen en jo oan te melden, mar it hoecht net.",
        "tooltip-ca-talk": "Oerlis oer dizze side",
-       "tooltip-ca-edit": "Bewurkje dizze side",
+       "tooltip-ca-edit": "Dizze side bewurkje",
        "tooltip-ca-addsection": "In opmerking tafoegje oan de oerlis-side.",
        "tooltip-ca-viewsource": "Dizze side is befeilige, mar jo kinne de boarne wol besjen.",
-       "tooltip-ca-history": "Eardere ferzjes fan dizze side.",
+       "tooltip-ca-history": "Eardere ferzjes fan dizze side",
        "tooltip-ca-protect": "Dizze side befeiligje",
        "tooltip-ca-delete": "Dizze side weidwaan",
        "tooltip-ca-undelete": "Fuorthelle bewurkings fan dizze side weromsette",
        "tooltip-ca-move": "Dizze side ferskowe",
-       "tooltip-ca-watch": "Dizze side oan myn folchside tafoegje",
-       "tooltip-ca-unwatch": "Dizze side fan myn folchlist ôfhelje",
+       "tooltip-ca-watch": "Dizze side oan jo folchlist taheakje",
+       "tooltip-ca-unwatch": "Dizze side fan jo folchlist ôfhelje",
        "tooltip-search": "{{SITENAME}} trochsykje",
        "tooltip-search-go": "Gean nei de side mei dizze namme at dy bestiet",
        "tooltip-search-fulltext": "De siden foar dizze tekst sykje",
        "tooltip-n-mainpage": "Gean nei de haadside",
        "tooltip-n-mainpage-description": "Nei de haadside gean",
        "tooltip-n-portal": "Oer it projekt: wat jo dwaan kinne, wêr jo dingen fine",
-       "tooltip-n-currentevents": "Eftergrûnynformaasje oer rinnende saken.",
+       "tooltip-n-currentevents": "Eftergrûnynformaasje oer rinnende saken",
        "tooltip-n-recentchanges": "List fan de lêste feroarings oan 'e wiki",
        "tooltip-n-randompage": "Gean nei likefolle hokfoar side",
        "tooltip-n-help": "It plak om eat út te fiskjen",
        "tooltip-t-whatlinkshere": "List fan alle siden dy't nei dizze side ferwize",
+       "tooltip-t-recentchangeslinked": "De lêste feroarings yn siden dêr't dizze side nei ferwiisd",
        "tooltip-feed-rss": "RSS-feed foar dizze side",
        "tooltip-feed-atom": "Atom-feed foar dizze side",
        "tooltip-t-contributions": "Bydragen fan dizze brûker",
        "tooltip-t-upload": "Bestannen oplade",
        "tooltip-t-specialpages": "List fan alle spesjale siden",
        "tooltip-t-print": "Ofdrukferzje fan dizze side",
+       "tooltip-t-permalink": "Bliuwende keppeling nei dizze ferzje fan 'e side",
+       "tooltip-ca-nstab-main": "Ynhâldlike side sjen litte",
        "tooltip-ca-nstab-user": "Brûkersside sjen litte",
-       "tooltip-ca-nstab-special": "Dit is in spesjale side; jo kinne de side sels net feroarje",
+       "tooltip-ca-nstab-special": "Dit is in spesjale side, dy't net bewurke wurde kin",
        "tooltip-ca-nstab-project": "Projektside sjen litte",
-       "tooltip-ca-nstab-image": "De triemside sjen litte",
+       "tooltip-ca-nstab-image": "De bestânsside sjen litte",
        "tooltip-ca-nstab-mediawiki": "Systeemberjocht sjen litte",
        "tooltip-ca-nstab-template": "Sjabloan sjen litte",
        "tooltip-ca-nstab-help": "Helpside sjen litte",
        "thumbsize": "Mjitte fan miniatueren:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|side|siden}}",
-       "file-info": "triemgrutte: $1, MIME-type: $2",
-       "file-info-size": "$1 × $2 pixels, triemgrutte: $3, MIME-type: $4",
-       "file-info-size-pages": "$1 × $2 pixels, triemgrutte: $3, MIME-type: $4, $5 {{PLURAL:$5|side|siden}}",
+       "file-info": "bestânsgrutte: $1, MIME-type: $2",
+       "file-info-size": "$1 × $2 pixels, bestânsgrutte: $3, MIME-type: $4",
+       "file-info-size-pages": "$1 × $2 pixels, bestânsgrutte: $3, MIME-type: $4, $5 {{PLURAL:$5|side|siden}}",
        "file-nohires": "Gjin hegere resolúsje beskikber.",
        "svg-long-desc": "SVG-bestân, nominaal $1 × $2 pixels, bestânsgrutte: $3",
        "show-big-image": "Oarspronklik bestân",
        "metadata-help": "Dit bestân befettet oanfoljende ynformaasje, dy't troch in fotokamera, scanner of fotobewurkingsprogramma tafoege wêze kin. As it bestân oanpast is, komme de details mûglik net folslein oerien mei de feroare ôfbylding.",
        "metadata-expand": "Utwreide details sjen litte",
        "metadata-collapse": "Ferskûlje útwreide details",
-       "metadata-fields": "De ôfbyldingsmetadatafjilden yn dit berjocht steane op in ôfbyldingsside as de metadatatabel ynklapt is.\nOare fjilden wurde ferburgen.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "De oanjûne ôfbyldingsmetadatafjilden yn dit berjocht, sille op 'e ôfbyldingsside werjûn wurde, at de metadatatabel ynklapt is.\nOare sille standert ferburgen wurde.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "metadata-langitem-default": "$1",
        "namespacesall": "alle",
        "monthsall": "alle",
        "redirect-user": "Meidogger-ID",
        "redirect-page": "Sidenûmer",
        "redirect-revision": "Sideferzje",
-       "redirect-file": "Triemnamme",
+       "redirect-file": "Bestânsnamme",
        "redirect-not-exists": "Wearde net fûn",
        "fileduplicatesearch": "Sykje op duplikaten",
-       "fileduplicatesearch-filename": "Triemnamme:",
+       "fileduplicatesearch-filename": "Bestânsnamme:",
        "fileduplicatesearch-submit": "Sykje",
-       "fileduplicatesearch-info": "$1 × $2 pixel<br />Triemgrutte: $3<br />MIME-type: $4",
+       "fileduplicatesearch-info": "$1 × $2 pixel<br />Bestânsgrutte: $3<br />MIME-type: $4",
        "fileduplicatesearch-result-1": "It bestân \"$1\" hat gjin duplikaten.",
        "fileduplicatesearch-result-n": "It bestân \"$1\" hat {{PLURAL:$2|1 duplikaat|$2 duplikaten}}.",
        "specialpages": "Bysûndere siden",
        "specialpages-group-other": "Oare bysûndere siden",
        "specialpages-group-login": "Oanmelde / registrearje",
        "specialpages-group-changes": "Koartlyn feroare en lochs",
-       "specialpages-group-media": "Oanbieden en oare triemsiden",
+       "specialpages-group-media": "Oanbieden en oare bestânssiden",
        "specialpages-group-users": "Meidoggers en rjochten",
        "specialpages-group-highuse": "Siden dy't in protte brûkt wurde",
        "specialpages-group-pages": "Sidelisten",
        "specialpages-group-spam": "Spamhelpmiddels",
        "blankpage": "Side is leech",
        "intentionallyblankpage": "Dizze side is bewust leech lizzen en wurdt brûkt foar benchmarks, ensfh.",
-       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Label|Labels}}]]: $2",
+       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Lebel|Lebels}}]]: $2",
        "tags-source-header": "Boarne",
        "tags-active-header": "Aktyf?",
        "tags-actions-header": "Aksjes",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Fideo's",
        "mediastatistics-header-multimedia": "Ynteraktive media",
-       "mediastatistics-header-office": "Kantoartriemmen",
-       "mediastatistics-header-text": "Tekstriemmen",
+       "mediastatistics-header-office": "Kantoarbestannen",
+       "mediastatistics-header-text": "Tekstbestannen",
        "mediastatistics-header-executable": "Utfierbere bestannen",
        "mediastatistics-header-archive": "Komprimearre bestannen",
        "json-error-syntax": "Syntaksisflater",
index 75b4c20..5679c40 100644 (file)
@@ -64,8 +64,8 @@
        "tog-uselivepreview": "પૃષ્ઠ ફરીથી લોડ કર્યા વગર પૂર્વાવલોકનો બતાવો",
        "tog-forceeditsummary": "કોરો 'ફેરફાર સારાંશ' ઉમેરતા પહેલા મને ચેતવો",
        "tog-watchlisthideown": "'મારી ધ્યાનસુચી'માં મે કરેલા ફેરફારો છુપાવો",
-       "tog-watchlisthidebots": "ધ્યાનસુચીમાં બોટ દ્વારા થયેલા ફેરફાર સંતાડો.",
-       "tog-watchlisthideminor": "'મારી ધ્યાનસુચી'માં નાનાં ફેરફારો છુપાવો",
+       "tog-watchlisthidebots": "ધ્યાનસુચીમાં બોટ દ્વારા થયેલા ફેરફાર સંતાડો",
+       "tog-watchlisthideminor": "ધ્યાનસુચીમાં નાનાં ફેરફારો છુપાવો",
        "tog-watchlisthideliu": "લોગ થયેલા સભ્ય દ્વારા કરવામાં આવેલ ફેરફાર ધ્યાનસુચીમાં છુપાવો.",
        "tog-watchlistreloadautomatically": "જ્યારેપણ ફિલ્ટર બદલાઈ જાય ત્યારે આપમેળે જોવાની સૂચિ ફરીથી લોડ કરો (JavaScript આવશ્યક છે)",
        "tog-watchlistunwatchlinks": "દૃશ્યયાદી પ્રવેશોમાં સીધી નિષ્ક્રિય/દૃશ્ય લિંક્સ ઉમેરો (ટૉગલ કાર્યક્ષમતા માટે આવશ્યક JavaScript)",
        "formerror": "ત્રુટિ: પત્રક રજૂ થયું નહીં",
        "badarticleerror": "આ ક્રિયા આ પાના ઉપર કરવી શક્ય નથી.",
        "cannotdelete": "ફાઇલ કે પાનું \"$1\" હટાવી શકાયું નથી.\nશક્ય છે કે અન્ય કોઈએ પહેલેથી હટાવી દીધું હોય.",
-       "cannotdelete-title": "\"$1\" àªªàª¾àª¨à«\81àª\82 àª\95ાઢà«\80 àª¶àª\95તા નથી",
+       "cannotdelete-title": "\"$1\" àªªàª¾àª¨à«\81àª\82 àª¦à«\82ર àª\95રà«\80 àª¶àª\95ાતà«\81àª\82 નથી",
        "delete-hook-aborted": "દૂર કરવાનું હૂક વડે રોકી રાખવામાં આવ્યું.\nતે કોઇ કારણ આપતું નથી.",
        "no-null-revision": "પૃષ્ઠ \"$1\" માટે નવો નલ પુનરાવર્તન બનાવી શક્યું નથી",
        "badtitle": "ખરાબ શિર્ષક",
        "createacct-benefit-body2": "{{PLURAL:$1|પાનું|પાનાં}}",
        "createacct-benefit-body3": "તાજેતરના {{PLURAL:$1|યોગદાનકર્તા|યોગદાનકર્તાઓ}}",
        "badretype": "તમે દાખલ કરેલ ગુપ્તસંજ્ઞા મળતી આવતી નથી.",
-       "userexists": "દાખલ કરેલું સભ્યનામ વપરાશમાં છે.</br>\nકૃપયા અન્ય નામ પસંદ કરો.",
+       "userexists": "દાખલ કરેલું સભ્યનામ વપરાશમાં છે.\nકૃપયા અન્ય નામ પસંદ કરો.",
        "loginerror": "પ્રવેશ ત્રુટિ",
        "createacct-error": "ખાતું બનાવવામાં ક્ષતિ આવી",
        "createaccounterror": "ખાતું ખોલી શકાયું નથી: $1",
        "nocookiesfornew": "સભ્ય ખાતાની પુષ્ટિ નથી થઇ, અમે તેના સ્ત્રોતની પુષ્ટિ ન કરી શક્યા.\nખાત્રી કરો કે તમે કુકીઝ સક્રીય કરી છે, અને પાનું ફરીથી ચડાવો",
        "noname": "તમે પ્રમાણભૂત સભ્યનામ જણાવેલ નથી.",
        "loginsuccesstitle": "પ્રવેશીત",
-       "loginsuccess": "'''તમે હવે {{SITENAME}}માં \"$1\" તરીકે પ્રવેશી ચુક્યા છો.'''",
+       "loginsuccess": "<strong>તમે હવે {{SITENAME}}માં \"$1\" તરીકે પ્રવેશી ચુક્યા છો.</strong>",
        "nosuchuser": "\"$1\" નામ ધરાવતો કોઇ સભ્ય અસ્તિત્વમાં નથી.\n\nસભ્યનામો અક્ષરસંવેદી (કેસ સેન્સિટીવ) હોય છે.\n\nકૃપા કરી સ્પેલીંગ/જોડણી ચકાસો અથવા [[Special:CreateAccount|નવું ખાતુ ખોલો]].",
-       "nosuchusershort": "\"$1\" નામનો કોઇ સભ્ય નથીતમારી જોડણી તપાસો.",
-       "nouserspecified": "તમારે સભ્ય નામ દર્શાવવાની જરૂર છે.",
-       "login-userblocked": "àª\86 àª¯à«\81àª\9dર àªªà«\8dરતિબàª\82ધિત àª\9bà«\87. àªªà«\8dરવà«\87શ àªµàª°à«\8dàª\9cà«\80ત.",
-       "wrongpassword": "ખોટું સભ્યનામ અથવા ગુપ્ત સંજ્ઞા (પાસવર્ડ‌) દાખલ કરે છે.\nફરીથી પ્રયત્ન કરો.",
+       "nosuchusershort": "\"$1\" નામનો કોઇ સભ્ય નથી.\nતમારી જોડણી તપાસો.",
+       "nouserspecified": "તમારે સભ્યનામ દર્શાવવાની જરૂર છે.",
+       "login-userblocked": "àª\86 àª¸àª­à«\8dય àªªà«\8dરતિબàª\82ધિત àª\9bà«\87. àªªà«\8dરવà«\87શ àªµàª°à«\8dàª\9cà«\80ત àª\9bà«\87.",
+       "wrongpassword": "ખોટું સભ્યનામ અથવા ગુપ્ત સંજ્ઞા (પાસવર્ડ‌) દાખલ કરે છે.\nફરીથી પ્રયત્ન કરો.",
        "wrongpasswordempty": "તમે ગુપ્ત સંજ્ઞા લખવાનું ભુલી ગયા લાગો છો.\nફરીથી પ્રયત્ન કરો.",
-       "passwordtooshort": "ગુપ્ત સંજ્ઞામાં ઓછામાં {{PLURAL:$1|ઓછો એક અક્ષર હોવો |ઓછા $1 અક્ષર હોવા}} જોઇએ.",
+       "passwordtooshort": "ગુપ્ત સંજ્ઞામાં ઓછામાં {{PLURAL:$1|ઓછો એક અક્ષર હોવો|ઓછા $1 અક્ષર હોવા}} જોઇએ.",
        "passwordtoolong": "ગુપ્ત સંજ્ઞા (પાસવર્ડ) {{PLURAL:$1|1 અક્ષર|$1 અક્ષરો}} કરતા લાંબો રાખી શકાતો નથી.",
        "password-name-match": "તમારી ગુપ્તસંજ્ઞા તમારા સભ્યનામ કરતાં અલગ જ હોવી જોઇએ.",
        "password-login-forbidden": "આ સભ્યનામ અને ગુપ્તસંજ્ઞા વાપરવા પર પ્રતિબંધ છે.",
        "passwordsent": "\"$1\" ની નવી ગુપ્તસંજ્ઞા (પાસવર્ડ) આપના ઇમેઇલ પર મોકલવામાં આવ્યો છે.\nકૃપા કરી તે મળ્યા બાદ ફરી લોગ ઇન કરો.",
        "blocked-mailpassword": "ફેરફાર કરવા માટે તમારું IP એડ્રેસ સ્થગિત કરી દેવાયું છે, તેથી દૂરુપયોગ ટાળવા માટે તમને આ IP એડ્રેસ પરથી ગુપ્તસંજ્ઞા ફરી મેળવવાની છૂટ નથી.",
        "eauthentsent": "પુષ્ટિ કરવા માટે નિશ્ચિત થયેલા સરનામાં પર ઇમેલ મોકલવામાં આવ્યો છે.\nએ જ સરનામે બીજો ઇમેલ થતાં પહેલાં તમારે ઇમેલમાં લખેલી સૂચનાઓ પ્રમાણે કરવું પડશે જેથી એ પુષ્ટિ થઇ શકે કે આપેલું સરનામું તમારું છે.",
-       "throttled-mailpassword": "ગુપ્ત સંજ્ઞા યાદ અપાવતી ઇમેઇલ છેલ્લા {{PLURAL:$1|કલાકમાં|$1 કલાકોમાં}} મોકલેલી છે.\nદૂરુપયોગ રોકવા માટે, {{PLURAL:$1|કલાકમાં|$1 કલાકોમાં}} ફક્ત એક જ આવી મેઇલ કરવામાં આવે છે.",
+       "throttled-mailpassword": "ગુપ્ત સંજ્ઞા યાદ અપાવતી ઇમેઇલ છેલ્લા {{PLURAL:$1|કલાક|$1 કલાકો}}માં મોકલેલી છે.\nદૂરુપયોગ રોકવા માટે, {{PLURAL:$1|કલાક|$1 કલાકો}}માં ફક્ત એક જ આવી મેઇલ કરવામાં આવે છે.",
        "mailerror": "મેઇલ મોકલવામાં ત્રુટિ: $1",
        "acct_creation_throttle_hit": "આ વિકિના મુલાકાતીઓએ તમારું IP વાપરીને પાછલા $2માં {{PLURAL:$1|1 ખાતું |$1 ખાતા}} ખોલ્યાં છે, જે પરવાનગીની મહત્તમ સંખ્યા છે. આને પરિણામે મુલાકાતી આ ક્ષણેવધુ ખાતા નહીં ખોલી શકે.",
        "emailauthenticated": "તમારૂં ઇ-મેઇલ સરનામું $2 ના $3 સમયે પ્રમાણિત કરેલું છે.",
        "ignorewarnings": "કોઇ પણ ચેતવણી અવગણો",
        "minlength1": "ફાઇલ નામની લંબાઇ કમ સે કમ એક અક્ષર જેટલી તો હોવી જ જોઇએ.",
        "illegalfilename": "ફાઇલનામ \"$1\" એવા ચિન્હો ધરાવે છે જેનો પ્રયોગ શીર્ષકોમાં વર્જિત  છે.\nકૃપયા ફાઇઅલ નું નામ બદલીને ફરી ચઢાવો.",
-       "filename-toolong": "ફાઈલ નામો 240 બાઇટ્સ કરતાં લાંબા હોઈ શકે નહિં.",
+       "filename-toolong": "ફાઈલનામો ૨૪૦ બાઇટ્સ કરતાં લાંબા હોઈ શકે નહીં.",
        "badfilename": "ફાઇલ નામ  \"$1\" નામે બદલાયું છે.",
        "filetype-mime-mismatch": "ફાઇલ પ્રકાર \".$1\"  શોધાયેલ MIME પ્રકારની ફાઇલ ($2) સાથે મેળ ખાતો નથી.",
        "filetype-badmime": "MIME પ્રકારની \"$1\"  ફાઇલ ચડાવવાની પરવાનગી નથી",
        "ipbreason-dropdown": "*સામાન્ય પ્રતિબંધ કારણો\n** ખોટી માહિતી ઉમેરાઈ  \n** પાનામાંથી માહિતી ભૂંસી નાંખી\n** અનાવશ્યક બાહ્ય કડીઓ ઉમેરી \n** પાનામાં મૂર્ખામીભરી/અર્થહીન માહિતી ઉમેરી\n** ત્રાસદાયક વર્તન \n** ઘણા ખાતાઓ અને દુરુપયોગ\n** અસ્વીકાર્ય સભ્ય નામ\n** આત્યંતિક ભાંગફોડ",
        "ipb-hardblock": "આ IP સરનામાં પરથી લોગ-ઈન થયેલા સભ્યોને ફેરફાર કરતા અટકાવો.",
        "ipbcreateaccount": "ખાતા ખોલવા પર પ્રતિબંધ",
-       "ipbemailban": "સભà«\8dયના àª\87-મà«\87લ àª®à«\8bàª\95લવા àªªàª° àªªà«\8dરતિબàª\82ધ àª®à«\82àª\95à«\8b",
+       "ipbemailban": "àª\87મà«\87લ àª®à«\8bàª\95લાàª\87 àª°àª¹à«\8dયà«\8b àª\9bà«\87",
        "ipbenableautoblock": "આ સભ્ય દ્વારા વપરાયેલ  IP સરનામા પર અને તત-પશ્ચ્યાત વપરાયેલ IP સરનામા ને સ્વયંચાલિત રીતે રોક લગાવો",
        "ipbsubmit": "આ સભ્ય પર પ્રતિબંધ મૂકો",
        "ipbother": "અન્ય સમય:",
        "anonymous": "{{SITENAME}} ના અ‍જ્ઞાત {{PLURAL:$1|સભ્ય|સભ્યો}}",
        "siteuser": "{{SITENAME}} સભ્ય $1",
        "anonuser": "{{SITENAME}} અજ્ઞાત સભ્ય  $1",
-       "lastmodifiedatby": "આ પાનામાં છેલ્લે  $3 દ્વારા $1 તારીખે $2 વાગ્યે ફેરફાર થયો",
+       "lastmodifiedatby": "આ પાનામાં છેલ્લે $3 દ્વારા $1 તારીખે $2 વાગે ફેરફાર થયો હતો.",
        "othercontribs": "$1 ના કાર્ય પર આધારિત",
        "others": "અન્યો",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|સભ્ય|સભ્યો}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|સભ્ય}}|સભ્યો}} $1",
        "anonusers": "{{SITENAME}} અજ્ઞાત {{PLURAL:$2|સભ્ય|સભ્યો}} $1",
        "creditspage": "પાનાના ઋણ સ્વીકાર",
        "nocredits": "આ પાના માટે કોઇ પણ ઋણસ્વીકાર મોજુદ નથી",
index 48012c5..ff3029f 100644 (file)
        "ipb-confirm": "אישור החסימה",
        "ipb-sitewide": "כל האתר",
        "ipb-partial": "חלקית",
+       "ipb-sitewide-help": "כל דף בוויקי וכל פעולות התרומה האחרות.",
        "ipb-partial-help": "עמודים או מרחבי שם מסוימים.",
        "ipb-pages-label": "דפים",
        "ipb-namespaces-label": "מרחבי שם",
index 697201e..c585e50 100644 (file)
        "history": "Povijest stranice",
        "history_short": "Stare izmjene",
        "history_small": "povijest",
-       "updatedmarker": "obnovljeno od posljednjeg posjeta",
+       "updatedmarker": "Obnovljeno od posljednjeg posjeta",
        "printableversion": "Inačica za ispis",
        "permalink": "Trajna poveznica",
        "print": "Ispiši",
index e05382e..b26e122 100644 (file)
        "badretype": "Le duo contrasignos que tu scribeva non es identic.",
        "usernameinprogress": "Le creation de un conto con iste nomine de usator es jam in curso.\nPer favor, attende.",
        "userexists": "Iste nomine de usator es jam in uso.\nSelige un altere nomine.",
+       "createacct-normalization": "Tu nomine de usator essera adjustate a \"$2\" a causa de restrictiones technic.",
        "loginerror": "Error in le apertura del session",
        "createacct-error": "Error de creation de conto",
        "createaccounterror": "Non poteva crear le conto: $1",
        "ipb-confirm": "Confirmar blocada",
        "ipb-sitewide": "Sur tote le sito",
        "ipb-partial": "Partial",
+       "ipb-sitewide-help": "Cata pagina del wiki e tote le altere actiones de contribution.",
+       "ipb-partial-help": "Paginas o spatios de nomines specific.",
        "ipb-pages-label": "Paginas",
        "ipb-namespaces-label": "Spatios de nomines",
        "badipaddress": "Adresse IP mal formate.",
index 1002dfd..7ad95e2 100644 (file)
@@ -61,7 +61,8 @@
                        "Dodolzk",
                        "Fitoschido",
                        "Palladin911",
-                       "Bagas Chrisara"
+                       "Bagas Chrisara",
+                       "Pebaryan"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
@@ -96,7 +97,7 @@
        "tog-watchlisthidebots": "Sembunyikan suntingan bot di daftar pantauan",
        "tog-watchlisthideminor": "Sembunyikan suntingan kecil di daftar pantauan",
        "tog-watchlisthideliu": "Sembunyikan suntingan pengguna masuk log di daftar pantauan",
-       "tog-watchlistreloadautomatically": "Muat ulang daftar pantauan secara otomatis ketika sebuah tapis berubah (JavaScript diperlukan)",
+       "tog-watchlistreloadautomatically": "Muat ulang daftar pantauan secara otomatis ketika sebuah filter berubah (JavaScript diperlukan)",
        "tog-watchlistunwatchlinks": "Tambahkan penanda pantau/hapus pantauan ke halaman yang dipantau yang berubah (JavaScript diperlukan untuk mengganti fungsi ini)",
        "tog-watchlisthideanons": "Sembunyikan suntingan pengguna anonim di daftar pantauan",
        "tog-watchlisthidepatrolled": "Sembunyikan suntingan terpatroli di daftar pantauan",
        "ipb-confirm": "Konfirmasi blokir",
        "ipb-sitewide": "Keseluruhan situs",
        "ipb-partial": "Parsial",
+       "ipb-partial-help": "Halaman atau ruangnama khusus.",
        "ipb-pages-label": "Halaman",
        "ipb-namespaces-label": "Ruang nama",
        "badipaddress": "Format alamat IP atau nama pengguna salah.",
        "redirect-file": "Nama berkas",
        "redirect-logid": "ID log",
        "redirect-not-exists": "Nilai tidak ditemukan",
+       "redirect-not-numeric": "Nilai bukan numerik",
        "fileduplicatesearch": "Pencarian berkas duplikat",
        "fileduplicatesearch-summary": "Pencarian duplikat berkas berdasarkan nilai hash-nya.",
        "fileduplicatesearch-filename": "Nama berkas:",
index d4b363b..70ed457 100644 (file)
        "content-json-empty-array": "vakua tabelo",
        "deprecated-self-close-category": "Pagini qui uzas nevalida etiketi HTML por klozajo",
        "duplicate-args-category": "Pagini kun argumenti duopligita che shabloni",
+       "language-converter-depth-warning": "La limito di profundeso dil linguo-konvertilo superiresis ($1)",
+       "node-count-exceeded-warning": "La pagino superiras la maxima nombro di nodi permisebla",
        "parser-unstrip-loop-warning": "Renkontresis nefinita procedo ('loop') en la funciono \"Unstrip\"",
        "undo-success": "La redakto ne povas desfacesar.\nVerifikez adinfre per komparo inter la du versioni se to esas fakte quon vu deziras facar; pose 'salvez' la modifiki por kompletigar la redakto.",
        "undo-failure": "Ne povis nuligar la redakto pro konflikti kun intermeza redakti.",
        "uploaddisabled": "Pardonez, la adkargo esas desaktiva.",
        "uploaddisabledtext": "Ne permisesas sendar arkivi.",
        "upload-maxfilesize": "Maxima grandeso dil arkivo: $1",
+       "upload-description": "Deskripto dil arkivo",
        "watchthisupload": "Surveyar ica arkivo",
        "filewasdeleted": "Altr arkivo kun ca sama nomo sendesis antee, e pose efacesis.\nAnte probar risendar ol, vu mustas ante verifikar $1.",
        "upload-file-error": "Interna eroro",
        "version-parser-function-hooks": "Funcioni \"hooks\" dil sintaxal analizilo (parser)",
        "version-version": "($1)",
        "version-license": "MediaWiki Licenco",
+       "version-ext-colheader-description": "Deskripto",
        "version-software-product": "Produkturo",
        "version-software-version": "Versiono",
+       "version-libraries-description": "Deskripto",
        "redirect": "Redirekti segun arkivo, uzanto, pagino, revizo-numero, o protokolo (log ID)",
        "redirect-summary": "Ica pagino specala ridirektas a: arkivo (se indikesas lua nomo); pagino (se indikesas l'identifiko di la revizo o di la pagino), ad uzanto-pagino (se indikesas la nomo dil uzanto), o protokolo-eniro ('log entry', se indikesas l'identifikilo dil 'log'). Exempli pli l'uzo: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], o [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Irez",
        "tags-create-submit": "Krear",
        "tags-create-no-name": "Mu mustas specifikar nomo por l'etiketo.",
        "tags-create-warnings-above": "La sequanta {{PLURAL:$2|avizo|avizi}} renkontresis, probante kreir l'etiketo \"$1\":",
+       "tags-delete-explanation-active": "<strong>L'etiketo \"$1\" duras esar aktiva, e duros uzesor future.</strong> Por preventar to, irez a la loko/loki ube ol povos aplikesar, e impedez to ibe.",
        "tags-delete-reason": "Motivo:",
        "tags-delete-not-found": "L'etiketo \"$1\" ne existas.",
-       "tags-delete-too-many-uses": "L'etiketo \"$1\" uzesas en plua kam $2 {{PLURAL:$2|revizo|revizi}}, do ol ne povas eskartesar.",
-       "tags-delete-warnings-after-delete": "L'etiketo \"$1\" efacesis, ma la sequanta {{PLURAL:$2|avizo|avizi}} renkontresis:",
+       "tags-delete-too-many-uses": "L'etiketo \"$1\" uzesas en plu kam $2 {{PLURAL:$2|revizo|revizi}}, do ol ne povas eskartesar.",
+       "tags-delete-warnings-after-delete": "L'etiketo \"$1\" efacesis, ma la sequanta {{PLURAL:$2|avizo|avizi}} trovesis:",
        "tags-activate-reason": "Motivo:",
        "tags-activate-not-found": "L'etiketo \"$1\" ne existas.",
        "tags-deactivate-reason": "Motivo:",
        "log-action-filter-delete": "Tipo di efacado:",
        "log-action-filter-all": "Omno",
        "log-action-filter-contentmodel-change": "Modifiko di la kontenajo di ula modelo",
-       "log-action-filter-suppress-reblock": "User suppression by reblock"
+       "log-action-filter-suppress-reblock": "User suppression by reblock",
+       "authprovider-resetpass-skip-label": "Preterpasar"
 }
index 5e02dc4..6eac855 100644 (file)
        "move-watch": "Aggiungi la pagina agli osservati speciali",
        "movepagebtn": "Sposta la pagina",
        "pagemovedsub": "Spostamento effettuato con successo",
+       "cannotmove": "La pagina non può essere spostata {{PLURAL:$1|per la seguente ragione|per le seguenti ragioni}}:",
        "movepage-moved": "'''\"$1\" è stata spostata a \"$2\"'''",
        "movepage-moved-redirect": "È stato creato un redirect.",
        "movepage-moved-noredirect": "La creazione di un redirect è stata soppressa.",
index a1bd8de..21561fb 100644 (file)
        "grant-uploadfile": "新しいファイルをアップロード",
        "grant-basic": "基礎的な権限",
        "grant-viewdeleted": "削除されたファイルとページを閲覧",
-       "grant-viewmywatchlist": "自身のウォッチリストを閲覧",
+       "grant-viewmywatchlist": "あなたのウォッチリストを閲覧",
        "grant-viewrestrictedlogs": "制限されたログを表示する",
        "newuserlogpage": "アカウント作成記録",
        "newuserlogpagetext": "以下はアカウント作成の記録です。",
        "action-createpage": "このページの作成",
        "action-createtalk": "この議論ページの作成",
        "action-createaccount": "この利用者アカウントの作成",
-       "action-autocreateaccount": "ã\81\93ã\81®å¤\96é\83¨å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92è\87ªå\8b\95ç\9a\84ã\81«作成",
+       "action-autocreateaccount": "ã\81\93ã\81®å¤\96é\83¨å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è\87ªå\8b\95作成",
        "action-history": "このページの履歴の閲覧",
        "action-minoredit": "細部の編集の印を付ける",
        "action-move": "このページの移動",
        "action-userrights-interwiki": "他のウィキの利用者の利用者権限変更",
        "action-siteadmin": "データベースのロックまたはロック解除",
        "action-sendemail": "メールの送信",
-       "action-editmyoptions": "自分の個人設定の編集",
-       "action-editmywatchlist": "自のウォッチリストの編集",
-       "action-viewmywatchlist": "自のウォッチリストの閲覧",
+       "action-editmyoptions": "自分の個人設定の編集",
+       "action-editmywatchlist": "自のウォッチリストの編集",
+       "action-viewmywatchlist": "自のウォッチリストの閲覧",
        "action-viewmyprivateinfo": "自分の非公開情報の閲覧",
        "action-editmyprivateinfo": "自分の非公開情報の編集",
        "action-editcontentmodel": "ページのコンテンツモデルの編集",
index a7cc929..1790630 100644 (file)
        "rev-delundel": "ჩვენება/დამალვა",
        "rev-showdeleted": "ჩვენება",
        "revisiondelete": "ცვლილებების წაშლა/დაბრუნება",
-       "revdelete-nooldid-title": "á\83¡á\83\90á\83\9bá\83\98á\83\96á\83\9cá\83\9d ვერსია არ არის მითითებული",
-       "revdelete-nooldid-text": "á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83  á\83\93á\83\90á\83\92á\83\98á\83\9cá\83\98á\83¨á\83\9cá\83\98á\83\90á\83\97 á\83¡á\83\90á\83\9bá\83\98á\83\96á\83\9cá\83\9d ვერსია (ვერსიები) ამ ფუნქციის გასახორციებლად.",
+       "revdelete-nooldid-title": "á\83¡á\83\90á\83\9bá\83\98á\83\96á\83\9cá\83\94 ვერსია არ არის მითითებული",
+       "revdelete-nooldid-text": "á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83  á\83\93á\83\90á\83\92á\83\98á\83\9cá\83\98á\83¨á\83\9cá\83\98á\83\90á\83\97 á\83¡á\83\90á\83\9bá\83\98á\83\96á\83\9cá\83\94 ვერსია (ვერსიები) ამ ფუნქციის გასახორციებლად.",
        "revdelete-no-file": "მოთხოვნილი ფაილი არ არსებობს.",
        "revdelete-show-file-confirm": "დარწმუნებული ხართ, რომ გსურთ ამ ფაილის წაშლილი ვერსიის ნახვა, „<nowiki>$1</nowiki>“ $2, $3-დან ?",
        "revdelete-show-file-submit": "ჰო",
        "notargettitle": "სამიზნე არაა",
        "notargettext": "თქვენ არ მიუთითეთ სამიზნე გვერდი ან მომხმარებელი\nამ ფუნქციის შესასრულებლად.",
        "nopagetitle": "ამგვარი სამიზნე გვერდი არ არსებობს",
-       "nopagetext": "á\83\9bá\83\9dá\83ªá\83\94á\83\9bá\83£á\83\9aá\83\98 á\83¡á\83\90á\83\9bá\83\98á\83\96á\83\9cá\83\9d გვერდი არ არის მიითებული.",
+       "nopagetext": "á\83\9bá\83\9dá\83ªá\83\94á\83\9bá\83£á\83\9aá\83\98 á\83¡á\83\90á\83\9bá\83\98á\83\96á\83\9cá\83\94 გვერდი არ არის მიითებული.",
        "pager-newer-n": "{{PLURAL:$1|უახლესი 1|უახლესი $1}}",
        "pager-older-n": "{{PLURAL:$1|უფრო ძველი 1|უფრო ძველი $1}}",
        "suppress": "ჩახშობა",
index 14ccd51..fd43962 100644 (file)
        "filehist-comment": "Bemierkung",
        "imagelinks": "Benotze vu Fichieren",
        "linkstoimage": "Dës {{PLURAL:$1|Säit benotzt|Säite benotzen}} dëse Fichier:",
-       "linkstoimage-more": "Méi wéi {{PLURAL:$1|eng Säit ass|$1 Säite si}} mat dësem Fichier verlinkt.\nDës Lëscht weist nëmmen {{PLURAL:$1|den éischte Link|déi éischt $1 Linken}} op dëse Fichier.\nEng [[Special:WhatLinksHere/$2|komplett Lëscht]] ass disponibel.",
+       "linkstoimage-more": "Méi wéi {{PLURAL:$1|eng Säit|$1 Säite}} benotzen dëse Fichier.\nDës Lëscht weist {{PLURAL:$1|déi éischte Säit|déi éischt $1 Säiten}} déi nëmmen dëse Fichier benotzen.\nEng [[Special:WhatLinksHere/$2|komplett Lëscht]] ass disponibel.",
        "nolinkstoimage": "Et gëtt keng Säiten déi dëse Fichier benotzen.",
        "morelinkstoimage": "Weis [[Special:WhatLinksHere/$1|méi Linken]] op dëse Fichier.",
        "linkstoimage-redirect": "$1 (Fichier-Viruleedung) $2",
        "ipb-change-block": "De Benotzer mat dese Parameteren nees spären",
        "ipb-confirm": "Spär confirméieren",
        "ipb-partial": "Partiell",
+       "ipb-partial-help": "Spezifesch Säiten oder Nimmräim.",
        "ipb-pages-label": "Säiten",
        "ipb-namespaces-label": "Nummraim",
        "badipaddress": "D'IP-Adress huet dat falscht Format.",
index 7fe991a..0d3c4ff 100644 (file)
        "category_header": "بٱلگٱیا مؽن دٱسٱ \"$1\"",
        "subcategories": "زؽر دٱسٱیا",
        "category-media-header": "ڤارسگٱر د دٱسٱ \"$1\"",
-       "category-empty": "ای دٱسٱ د راستٱکی د ڤٱرگرتٱ هیچ بٱلگٱ یا ڤارسگٱری نی",
+       "category-empty": "اؽ دٱسٱ د راستٱکی د ڤٱرگرتٱ هیچ بٱلگٱ یا ڤارسگٱری نؽ",
        "hidden-categories": "{{PLURAL:$1|دٱسٱ قایم بیٱ|دٱسٱیا قایم بیٱ}}",
        "hidden-category-category": "دأسە یا قام بییە",
        "category-subcat-count": "{{PLURAL:$2|اؽ دٱسٱ فقٱت زؽر دٱسٱیا دماگر هان دش.اؽ دٱسٱ {{PLURAL:$1|زؽردٱسٱ|$1 زؽردٱسٱیا}} ٱ , ڤ دٱر د $2 کولٛ.}}",
        "category-file-count-limited": " {{PLURAL:$1|[جانیا هی|1$جانیایا هین}} نئهایی هان د دأسە ئیسئنی.",
        "listingcontinuesabbrev": "دومالٱ",
        "index-category": "بألگە یا سیاە دار",
-       "noindex-category": "بÙ\84Ú¯Ù±Û\8cا Ø¨Û\8c Ø³Û\8cائٱ",
+       "noindex-category": "بٱÙ\84Ú¯Ù±Û\8cا Ø¨Ø½ Ø³Ø½Ø§Ù\87ٱ",
        "broken-file-category": "بٱلگٱیایی کاْ هوم پاٛڤٱن جانؽایا اْشگس ناْ دارٱن",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "دٱربارٱ",
        "view-foreign": "د $1 ناْ بونؽت",
        "edit": "ڤیرایش",
        "edit-local": "توضی ڤولات نئشینی نە ڤیرایئشت بأکیت",
-       "create": "راس Ù\83ئردئن",
+       "create": "دÛ\8fرس Ú©Ø±Ø¯ن",
        "create-local": "یاٛ تۉزی ڤلات نشینی اْزاف بٱکؽت",
-       "delete": "پاکسا Ú©Ø¦Ø±Ø¯Ø¦ن",
+       "delete": "پاکسا Ú©Ø±Ø¯ن",
        "undelete_short": "ناپاکسا کئردئن {{PLURAL:$1|یئ گئل ڤیرایئشت|$1 ڤیرایئشتیا}}",
        "viewdeleted_short": "{{PLURAL:$1|}}سئیل بأکیت{{[PLURAL:$1|یئ گئل ڤیرایئشت پاکسا بییە|$1ڤیرایئشتیا پاکسا بیینە}}",
        "protect": "پأر و پیم بأکیت",
        "currentevents": "روخ ڤنؽا ایسنی",
        "currentevents-url": "Project:روخ ڤنؽا ایسنی",
        "disclaimers": "تیٱپۊشکاریٛا",
-       "disclaimerpage": "پرۉژٱ: تیٱپوشی کردن همٱگیر",
+       "disclaimerpage": "پروژٱ: تیٱپۊشی کردن همٱگیر",
        "edithelp": "هومياری سی ڤیرایش",
        "helppage-top-gethelp": "هومياری",
        "mainpage": "سرآسونٱ",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "د نۊ زنٱ بیٱ د\"$1\"",
-       "youhavenewmessages": "{{PLURAL:$3|Ø´Ù\88Ù\85ا Ø¯Ø§Ø±Û\8cت}} $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Ø´Ù\88Ù\85ا}} $1 Ø¯ {{PLURAL:$3|کارÛ\8cار Ù\87Ù±Ù\86Û\8c|$3 Ú©Ø§Ø±Û\8cارÛ\8cا}}دارÛ\8cت($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Ø´Ù\85ا Ø¯Ø§Ø±Ø½ت}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Ø´Ù\85ا}} $1 Ø¯ {{PLURAL:$3|کارÛ\8cار Ù\87Ù\86Û\8c|$3 Ú©Ø§Ø±Û\8cارؽا}}دارؽت($2).",
        "youhavenewmessagesmanyusers": "شوما د $1 فئرە کاریار داریت($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|Û\8cئ Ú¯Ø¦Ù\84 Ù¾Ø¦Û\8cغÙ\88Ù\85 ØªØ§Ø²Û\95|999=پئÛ\8cغÙ\88Ù\85Û\8cا ØªØ§Ø²Û\95}}",
-       "newmessagesdifflinkplural": "آخئر {{PLURAL:$1|Ø¢Ù\84ئشت|Ø¢Ù\84ئشتÛ\8cا}}",
+       "newmessageslinkplural": "{{PLURAL:$1|Û\8cاÙ\9b Ù¾Ø§Ù\9bغÙ\88Ù\85 ØªØ§Ø²Ù±|999=پاÙ\9bغÙ\88Ù\85ؽا ØªØ§Ø²Ù±}}",
+       "newmessagesdifflinkplural": "آخر {{PLURAL:$1|Ø¢Ù\84شت|Ø¢Ù\84شتؽا}}",
        "youhavenewmessagesmulti": "شوما یئ گئل پئیغوم تازە د $1 داریت",
        "editsection": "آلشدکاری",
        "editold": "ڤیرایش",
-       "viewsourceold": "سئÛ\8cÙ\84 Ø¯ Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 Ø¨Ø£Ú©Û\8cت",
+       "viewsourceold": "ساÙ\9bÙ\84Ù\9b Ø¯ Ø³Ø±Ú\86Ø´Ù\85Ù± Ø¨Ù±Ú©Ø½ت",
        "editlink": "ڤیرایش",
        "viewsourcelink": "ساٛلٛ د سرچشمٱ بٱکؽت",
        "editsectionhint": "ڤیرایش یاٛ بٱئرجا:$1",
        "nstab-special": "بٱلگٱیا ڤیژٱ",
        "nstab-project": "بٱلگٱ پرۉژٱ",
        "nstab-image": "جانؽا",
-       "nstab-mediawiki": "پئÛ\8cغÙ\88Ù\99م",
+       "nstab-mediawiki": "پاÙ\9bغÙ\88م",
        "nstab-template": "چۊٱ",
        "nstab-help": "بألگە هومیاری",
        "nstab-category": "دٱسٱ",
        "minoredit": "یٱ یاٛ ڤیرایش کوچکٱ",
        "watchthis": "دیئن اؽ بٱلگٱ",
        "savearticle": "آمادٱ کردن بٱلگٱ",
-       "preview": "Ù¾Ù\8aØ´ Ø³Ø¦Ù\8aÙ\84",
+       "preview": "Ù¾Ù\8aØ´ Ø³Ø§Ù\9bÙ\84Ù\9b",
        "showpreview": "نشوݩ داٛئن پیش ساٛلٛ",
        "showdiff": "نشوݩ داٛین آلشتکاریا",
        "blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"$1\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
        "subject-preview": "داسوٙن/پیش سئیل سأرخأط:",
        "previewerrortext": "یئ گئل خأطا د گاتی کئ شوما میهاستیت یئ گئل پیش سئل د آلئشتیاتوٙ داشتوٙین پیش ئوٙماە.",
        "blockedtitle": "کاریار نئهاگئری بی",
-       "blockedtext": "<strong>Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø´Ù\85ا Û\8cا ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ø¢Û\8c Ù¾Û\8c Ø´Ù\85ا Ù\86Ù\87اگرÛ\8c Ø¨Û\8cÙ±.</strong>\n\n\n$1 Ú¤Ù\86Ù± Ù\86Ù\87اگرÛ\8c Ú©Ø±Ø¯Ù±.\nدÙ\84Ù\9bÛ\8cÙ\84Ù\9bØ´ Ù\87ا Ø¯ Ø§Û\8cÚ\86اÙ\92<em>$2</em>.\n\nشرÛ\8a Ø¯ Ù\86Ù\87اگرÛ\8c:$8\nآخر Ù\86Ù\87اگرÛ\8c:$6\nکارÛ\8cارÛ\8c Ú©Ø§Ù\92 Ù\87ا Ú¤Ù±Ø±ØªÛ\8cÙ± Û\89 Ù\86Ù\87اگرÛ\8c Ø¨Û\8cÙ±:$7\n\nØ´Ù\85ا Ù\85ؽ ØªÙ\88Ù\86ؽت Ú¤Ø§ $1 Û\8cا [[{{MediaWiki:Grouppage-sysop}}|سردÛ\8cÚ¤Ù\88Ù\86کار]] Ù\87Ù\86Û\8c Ù¾Ø§Ù\9bÚ¤Ù±Ù\86 Ø¨Ø§Ù\9bÛ\8cرؽت Û\89 Ø³Û\8c Ù\86Ù\87اگرÛ\8c Ú¤Ø§ Ú¤Ù± Ú\86Ù±Ú© Ú\86Ù\86Ù± Ú©Ø§Ø±Û\8c Ø¨Ù±Ú©Ø½Øª.\nÙ±Ù\84ڤٱت Ø¯ Ú¤Û\8cر Ø¯Ø§Ø´ØªÛ\8aؽت Ú©Ø§Ù\92 Ø´Ù\85ا Ù\86Ù\85ؽ ØªÙ\88Ù\86ؽت Ú\86Û\8cا Ù±Ù\86جÙ\88Ù\85 Ù\86اÙ\85Ù± Ú©Ù\84Ù\9b Ú©Ø±Ø¯Ù\86 Ø³Û\8c Ø§Ø½ Ú©Ø§Ø±Û\8cار Ù\86اÙ\92 Ú¤ Ú©Ø§Ø± Ø¨Ø§Ù\9bÛ\8cرؽتØ\8c Ù\85ٱر Û\8cÙ± Ú©Ø§Ù\92 Û\8cاÙ\9b ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85 Ù\86اÙ\85Ù± Ù\86ازار Ù\86Ù± [[Special:Preferences|تٱرجÛ\8cÛ\8cات Ú©Ø§Ø±Û\8cارÛ\8c]] Ø®Ù\88تÙ\88 Ø¯Ø½Ø§Ø±Û\8c Ú©Ø±Ø¯Û\8aؽت Û\89 ØªÙ\88Ù\86سÛ\8aؽت Ú¤Ù±Ù\86اÙ\92 Ú¤ Ú©Ø§Ø± Ø¨Ø§Ù\9bÛ\8cرؽت .\nتÛ\8cرÙ\86Ø´Ù\88Ý© Ø¢Û\8c Ù¾Û\8c Ø§Û\8cسÙ\86Û\8c Ø´Ù\85ا $3 Ù±Ø\8c Û\89 Ù\86Ù\88Ù\85 Ø¯Ø½Ø§Ø±Ú©Ù\88Ý© Ù\86Ù\87اگری #$5 ٱ.\nلوتف بٱکؽت همٱ چیاناْ د هٱر هاستاٛیؽ کاْ دارؽت بۉؽت.",
+       "blockedtext": "<strong>Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø´Ù\85ا Û\8cا ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ø¢Û\8c Ù¾Û\8c Ø´Ù\85ا Ù\86Ù\88ئاگÛ\8cرÛ\8c Ø¨Û\8cÙ±.</strong>\n\n\n$1 Ú¤Ù\86Ù± Ù\86Ù\88ئاگÛ\8cرÛ\8c Ú©Ø±Ø¯Ù±.\nدÙ\84Ù\9bÛ\8cÙ\84Ù\9bØ´ Ù\87ا Ø¯ Ø§Û\8cÚ\86اÙ\92<em>$2</em>.\n\nشرÛ\8a Ø¯ Ù\86Ù\88ئاگÛ\8cرÛ\8c:$8\nآخر Ù\86Ù\88ئاگÛ\8cرÛ\8c:$6\nکارÛ\8cارÛ\8c Ú©Ø§Ù\92 Ù\87ا Ú¤Ù±Ø±ØªÛ\8cÙ± Û\89 Ù\86Ù\88ئاگÛ\8cرÛ\8c Ø¨Û\8cÙ±:$7\n\nØ´Ù\85ا Ù\85ؽ ØªÙ\88Ù\86ؽت Ú¤Ø§ $1 Û\8cا [[{{MediaWiki:Grouppage-sysop}}|سٱردÛ\8cÚ¤Ù\88Ù\86کار]] Ù\87Ù\86Û\8c Ù¾Ø§Ù\9bÚ¤Ù±Ù\86 Ø¨Ø§Ù\9bÛ\8cرؽت Û\89 Ø³Û\8c Ù\86Ù\88ئاگÛ\8cرÛ\8c Ú¤Ø§ Ú¤Ù± Ú\86Ù±Ú© Ú\86Ù\86Ù± Ú©Ø§Ø±Û\8c Ø¨Ù±Ú©Ø½Øª.\nÙ±Ù\84ڤٱت Ø¯ Ú¤Û\8cر Ø¯Ø§Ø´ØªÛ\8aؽت Ú©Ø§Ù\92 Ø´Ù\85ا Ù\86Ù\85ؽ ØªÙ\88Ù\86ؽت Ú\86Û\8cا Ù±Ù\86جÙ\88Ù\85 Ù\86اÙ\85Ù± Ú©Ù\84Ù\9b Ú©Ø±Ø¯Ù\86 Ø³Û\8c Ø§Ø½ Ú©Ø§Ø±Û\8cار Ù\86اÙ\92 Ú¤ Ú©Ø§Ø± Ø¨Ø§Ù\9bÛ\8cرؽتØ\8c Ù\85ٱر Û\8cÙ± Ú©Ø§Ù\92 Û\8cاÙ\9b ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85 Ù\86اÙ\85Ù± Ù\86ازار Ù\86Ù± [[Special:Preferences|تٱرجÛ\8cÛ\8cات Ú©Ø§Ø±Û\8cارÛ\8c]] Ø®Ù\88تÙ\88 Ø¯Ø½Ø§Ø±Û\8c Ú©Ø±Ø¯Û\8aؽت Û\89 ØªÙ\88Ù\86سÛ\8aؽت Ú¤Ù±Ù\86اÙ\92 Ú¤ Ú©Ø§Ø± Ø¨Ø§Ù\9bÛ\8cرؽت .\nتÛ\8cرÙ\86Ø´Ù\88Ý© Ø¢Û\8c Ù¾Û\8c Ø§Û\8cسÙ\86Û\8c Ø´Ù\85ا $3 Ù±Ø\8c Û\89 Ù\86Ù\88Ù\85 Ø¯Ø½Ø§Ø±Ú©Ù\88Ý© Ù\86Ù\88ئاگÛ\8cری #$5 ٱ.\nلوتف بٱکؽت همٱ چیاناْ د هٱر هاستاٛیؽ کاْ دارؽت بۉؽت.",
        "autoblockedtext": "<strong>نوم کاریاری شوما یا تیرنئشوٙن آی پی شوما سی یە کئ یئ گئل کاریاری هأنی ڤئ نە ڤئ کار گئرئتە خودأنجومأن ڤئ دأس $1 نئهاگئری بییە.</strong>\n\n\n$1 ڤئنە نئهاگئری کئردە.\nدألیلئش ها د ئیچئ\n<em>$2</em>.\n\nشوروٙ د نئهاگئری:$8\nآخئر نئهاگئری:$6\nکاریاری کئ ها ڤأرتیە و نئهاگئری بییە:$7\n\nشوما می توٙنیت ڤا $1 یا [[{{MediaWiki:Grouppage-sysop}}|سأردیڤوٙنکار]] هأنی پئیڤأند بئیریت و سی نئهاگئری ڤا ڤئ چأک چئنە کاری بأکیت.\nألڤأت د ڤیر داشتوٙئیت کئ شوما نئمی توٙنیت خوصۉصیأت أنجومانامە کئل کئردئن سی ئی کاریار نە ڤئ کار بئیریت، مأر یە کئ یئ گئل تیرنئشوٙن أنجومانامە نازار نە [[Special:Preferences|تأرجیحات کاریاری]] خوتوٙ دیاری کئردئوٙیت و توٙنئستوٙیت ڤئ نە ڤئ کار بئیریت .\nتیرنئشوٙن آی پی ئیسئنی شوما $3ە، و نوم دیارکون نئهاگئری #$5 ە.\nلوطف بأکیت هأمە چیانە د هأر حاستە یی کئ داریت بوٙئیت.",
        "blockednoreason": "هیچ دألیلی گوتە نأبییە",
        "whitelistedittext": "$1 لوطف بأکیت بألگە یا نە ڤیرایئشت کاری بأکیت.",
        "userpage-userdoesnotexist": "حئساڤ کاریاری \"$1\" ثأڤت نأم نأبییە.\nأر میھایت ئی بألگە نئ بأسازیت یا ڤیرایئشت کاری بأکیت یئ گئل ڤارئسی أنجوم بئیتوٙ.",
        "userpage-userdoesnotexist-view": "هساو کاریاری \"$1\" سٱبت ناٛییٱ.",
        "blocked-notice-logextract": "ئی کاریار د ئیسئنی نئھاگئری بییە.\nآخئری پئرئستنوٙمە نئھاگئری ڤامین یاریا د ھار سی سأرچئشمە آمادە کاری بییە:",
-       "clearyourcache": "<strong>Ú¤ Ú¤Û\8cر Ø¯Ø§Ø´ØªÛ\8aؽت:</strong> Ù\86Ù\88ئا Ø¢Ù\85اÛ\8cÙ± Ú©Ø§Ø±Û\8cØ\8cگاسؽ Ø´Ù\85ا Ù\85ٱجبÛ\8aر Ø¯ Ú¤ Ú©Ø§Ø± Ú¤Ù±Ù\86Ù\86 Ú¤Û\8cرگٱ Ù\82اÛ\8cÙ\85 Ø¨Û\8cÙ± Ø¯Ù\88ئارتٱ Ù\86Û\8cÛ\8cٱر Ø®Ù\88تÙ\88Ý© Ø³Û\8c Ø¯Û\8cÛ\8cÙ\86 Ø§Ø½ Ø¢Ù\84شتکارÛ\8c Ø¨Û\8aÛ\8cؽت.\n* <strong>Ù\81اÛ\8cرÙ\81اکس/ Ø³Ù±Ù\81ٱرÛ\8c:</strong> Ø¨Ù±Ù¾Û\8aرÙ\86ؽت Ø±Û\8c<em>Ø´Û\8cÙ\81ت</em> Ø§Û\8aساÙ\92 Ú©Ø§Ù\92 Ø½ Ù¾Û\8aرÙ\86ؽت <em> Ú¤Ù± Ø¯ Ù\86Û\8a Ø³Ú¤Ø§Ø± Ù\85Û\8aئٱ </em>Û\8cا Ú¾Ù\86Û\8c Ø±Û\8c <em>Ctrl-F5</em> Ø¨Ù±Ù¾Û\8aرÙ\86ؽت Û\8cا<em>Ctrl-R</em> (<em>â\8c\98-R</em> Ø¯ Ø³Ø§Ù\85Ù\88Ù\99Ù\86Û\95 Ù\85Ø£Ú©)\n* <strong>Ú¯Û\8aÚ¯Ù\84 Ú©Ø±Ù\88Ù\85:</ strong>بٱپÛ\8aرÙ\86ؽت Ø±Û\8c <em>Ctrl-Shift-R</em> (<em>â\8c\98-Shift-R</em> Û\8cا Ø¯ Ø³Ø§Ù\85Ù\88Ù\86Ù±)\n* <strong>اÛ\8cÙ\86ترÙ\86ت Ø§Ù\92کسپÙ\84Ù\88رر:</strong> <em>Ctrl</em> Ù\86اÙ\92 Ú¤Ø§Ø¯Ø§Ø±Ø½Øª Ø§Û\8aساÙ\92 Ú©Ø§Ù\92 Ù\85ؽپÛ\8aÙ\86ؽت <em>رÛ\8c Ú©Ù\84Ù\9bÛ\8cÙ\84Ù\9b Ø±Ù\81رش</em>Ø\8cÛ\8cا Ú¤Ø§Ø¯Ø§Ø´ØªÛ\8cتٱ<em>Ctrl-F5</em>\n* <strong>اÙ\88پرا:</strong> Ú¤Û\8cرگٱ Ù\82اÛ\8cÙ\85 Ø¨Û\8cÛ\8cÙ± Ø¯ <em>أڤزارؽاâ\86\92 Ø¢Ù\88Ù\84ٱڤؽٱتؽاÙ\86اÙ\92 Ù¾Ø§Ú©Ø³Ø§ Ø¨Ù±Ú©Ø½Øªت</em>",
+       "clearyourcache": "<strong>Ú¤ Ú¤Û\8cر Ø¯Ø§Ø´ØªÛ\8aئؽت:</strong> Ù\86Ù\88ئا Ø¢Ù\85اÛ\8cÙ± Ú©Ø§Ø±Û\8cØ\8cگاسؽ Ø´Ù\85ا Ù\85ٱجبÛ\8aر Ø¯ Ú¤ Ú©Ø§Ø± Ú¤Ù±Ù\86Ù\86 Ú¤Û\8cرگٱ Ù\82اÛ\8cÙ\85 Ø¨Û\8cÙ± Ø¯Ù\88ئارتٱ Ù\86Û\8cÛ\8cٱر Ø®Ù\88تÙ\88Ý© Ø³Û\8c Ø¯Û\8cئÙ\86 Ø§Ø½ Ø¢Ù\84شتکارÛ\8c Ø¨Û\8aÛ\8cؽت.\n* <strong>Ù\81اÛ\8cرÙ\81اکس/ Ø³Ù±Ù\81ٱرÛ\8c:</strong> Ø¨Ù±Ù¾Û\8aرÙ\86ؽت Ø±Û\8c<em>Ø´Û\8cÙ\81ت</em> Ø§Û\8aساÙ\92 Ú©Ø§Ù\92 Ø½ Ù¾Û\8aرÙ\86ؽت <em> Ú¤Ù± Ø¯ Ù\86Û\8a Ø³Ú¤Ø§Ø± Ù\85Û\8aئٱ </em>Û\8cا Ú¾Ù\86Û\8c Ø±Û\8c <em>Ctrl-F5</em> Ø¨Ù±Ù¾Û\8aرÙ\86ؽت Û\8cا<em>Ctrl-R</em> (<em>â\8c\98-R</em> Ø¯ Ø³Ø§Ù\85Ù\88Ù\86Ù± Ù\85Ù±Ú©)\n* <strong>Ú¯Û\8aÚ¯Ù\84 Ú©Ø±Ù\88Ù\85:</ strong>بٱپÛ\8aرÙ\86ؽت Ø±Û\8c <em>Ctrl-Shift-R</em> (<em>â\8c\98-Shift-R</em> Û\8cا Ø¯ Ø³Ø§Ù\85Ù\88Ù\86Ù±)\n* <strong>اÛ\8cÙ\86ترÙ\86ت Ø§Ù\92کسپÙ\84Ù\88رر:</strong> <em>Ctrl</em> Ù\86اÙ\92 Ú¤Ø§Ø¯Ø§Ø±Ø½Øª Ø§Û\8aساÙ\92 Ú©Ø§Ù\92 Ù\85ؽپÛ\8aÙ\86ؽت <em>رÛ\8c Ú©Ù\84Ù\9bÛ\8cÙ\84Ù\9b Ø±Ù\81رش</em>Ø\8cÛ\8cا Ú¤Ø§Ø¯Ø§Ø´ØªÛ\8cتٱ<em>Ctrl-F5</em>\n* <strong>اÙ\88پرا:</strong> Ú¤Û\8cرگٱ Ù\82اÛ\8cÙ\85 Ø¨Û\8cÙ± Ø¯ <em>أڤزارؽاâ\86\92 Ø¢Ù\88Ù\84ٱڤؽٱتؽاÙ\86اÙ\92 Ù¾Ø§Ú©Ø³Ø§ Ø¨Ù±Ú©Ø½ت</em>",
        "usercssyoucanpreview": "<strong>چی ڤأرتیە گئر:</strong>  دوگمە\"{{int:showpreview}}\" سی ئزماشت کاری سی ئس ئس تازە دئما ئمایە کاری ڤئ کار بئیریت.",
        "userjsyoucanpreview": "<strong>چی ڤأرتیە گئر:</strong>  دوگمە\"{{int:showpreview}}\" سی ئزماشت کاری جاڤا ئسکئریپت تازە دئما ئمایە کاری ڤئ کار بئیریت.",
        "usercsspreview": "<strong>د ڤیر داشتوٙئیت کئ شوما فأقأط می توٙنیت سی ئس ئس کاریاری توٙنە پیش سئیل بأکیت. ڤئ ئیسئنی ئمایە نأبییە!</strong>",
        "userinvalidconfigtitle": "<strong>زئنار:</strong> پوٙسە \"$1\" نیئش.\nسی ئس ئس جاڤأنە و بألگە یا جاڤا ئسکئریپت سأربألگ ڤا حأرفیا کوچئک نە ڤئ کار گئرئتە، ھأمچئنی {{ns:کاریار}}:فو/ڤئکتور.سی ئس ئس چی د ری ڤئ ری {{ns:کاریار}}:فو/ڤئکتور. سی ئس ئسە.",
        "updated": "(ڤئ هئنگوم سازی بییە)",
        "note": "'''نیسأنئن:'''",
-       "previewnote": "فأقأط ئی پیش سئیل د ڤیرتوٙ با.\nآلئشت کاریاتوٙ ھأنی ئمایە نأبینە",
-       "continue-editing": "رو د راساگە ڤیرایئشت کاری",
+       "previewnote": "فقٱت اؽ پیش ساٛلٛ ڤ ڤیرتو با.\nآلشت کاریاتو ھنی آمایٱ ناٛیٱ",
+       "continue-editing": "رۉ د راساگٱ ڤیرایش کاری",
        "previewconflict": "ڤئرگأشت پیش سئیل د نیسئسە د راساگە ڤارو ڤیرایئشت کاری چی شئکل دیار بییئن بوٙەأر شوما  ڤئ نە سی ئمایە کئردئن ئنتئخاڤ بأکیت.",
        "session_fail_preview": "<strong>د بأخت گأن سی یە کئ رئسینە یا نئشأسجا نە د دأس دأئیمە نئمی توٙنیم کار پأردازئشت ڤیرایئشت کاری شومانە أنجوم بئمینوٙ.</strong>\nلوطف بأکیت یئ گئل ھأنی تئلاش بأکیت.\nأر ھأنی ڤئ دوروس کار نأکئرد،[[Special:UserLogout|ئوٙمائن ڤئ دأر]] نە ئزمایئشت بأکیت و د نۊ بیائیت ڤامین.",
        "session_fail_preview_html": "<strong>د بأخت گأن سی یە کئ رئسینە یا نئشأسجا نە د دأس دأئیمە نئمی توٙنیم کار پأردازئشت ڤیرایئشت کاری شومانە أنجوم بئمینوٙ.</strong>\n\n\n<em>سی یە کئ {{SITENAME}} یئ گئل رأگ ئچ تی ئم ئل کونئشتکار بییە دارە، پیش سئیل سی یە کئ د دأس چول کاریا جاڤا ئسکئریپت لیز داشتوٙە نئھوٙ بییە..</em>\n\nلوطف بأکیت یئ گئل ھأنی تئلاش بأکیت.\nأر ھأنی ڤئ دوروس کار نأکئرد،[[Special:UserLogout|ئوٙمائن ڤئ دأر]] نە ئزمایئشت بأکیت و د نۊ بیائیت ڤامین.",
        "nocreate-loggedin": "شوما صئلا راس کئردئن بألگە تازە نە ناریت.",
        "sectioneditnotsupported-title": "شوما صئلا ڤیرایئشت کاری بأرجایا نە ناریت.",
        "sectioneditnotsupported-text": "ڤیرایئشت بأرجایی د ئی بألگە نیئش.",
-       "permissionserrors": "خأطا صئلا دأئن",
+       "permissionserrors": "خٱتا سلا داٛئن",
        "permissionserrorstext": "شوما حأق ناریت ڤئنە أنجوم بئیت، سی{{PLURAL:$1|دألیل|دألیلیا}} نئھایی:",
        "permissionserrorstext-withaction": "شما سی $2 سلا \nنھاگری نارؽت {{PLURAL:$1|دلٛیلٛ|دلٛیلٛؽا}}:",
-       "recreate-moveddeleted-warn": "'''د ڤیرئتوٙ با:شوما بألگە یی کئ ھا ڤادئما و پاکسا بییە د نۊ راس کئردیتە.'''\nبایأد د ڤیرئتوٙ با کئ آیا ھأنی نئھاگئری ڤیرایئشت ئی بألگە خوٙأ.\nپاکسا کاری و جا ڤئ جا کاری ئی بألگە سی حال و بال آسایئشت شوما آمادە بییە:",
+       "recreate-moveddeleted-warn": "'''ڤ ڤیرتو با:شما بٱلگاٛیی کاْ ھا ڤادما ۉ پاکسا بیٱ د نۊ دۏرس کردؽتٱ.'''\nبایٱد د ڤیرتو با کاْ آیا ھنی نوئاگیری ڤیرایش اؽ بٱلگٱ خۊئٱ.\nپاکسا کاری ۉ جا ڤ جا کاری اؽ بٱلگٱ سی هال ۉ بال پٱلٛٱمار شما آمادٱ بیٱ:",
        "moveddeleted-notice": "اؽ بٱلگٱ پاکسا بیٱ.\nپاکسا کاری ۉ جا ڤ جا کاری اؽ بٱلگٱ سی هال ۉ بال پٱلٛٱمار شما آمادٱ بیٱ.",
        "log-fulllog": "دیئن هأمە پئهئرستنوٙمە یا",
        "edit-hook-aborted": "ڤیرایئشت ڤا قولاڤ نئھاگئری بییە.\nھیچ توضیی سیش نی.",
        "editwarning-warning": "أر ئی بألگە نئ ڤئل بأکیت ھأر آلئشتی کئ أنجوم دأئیتە پاک بوٙە.\nأر شوما ھائیت ڤامین، شوما می توٙنیت ب زئنار نە د \"{{int:prefs-editing}}\" کئ ھا د بأرجا چیا نازار شوما ناکونئشتگأر بأکیت.",
        "editpage-notsupportedcontentformat-title": "شئکل مینوٙنە حامینداری نأبییە",
        "editpage-notsupportedcontentformat-text": "حال و بال مینوٙنە $1 د مودئل مینوٙنە $2 حامینداری نأبوٙە.",
-       "content-model-wikitext": "Ú¤Û\8cÚ©Û\8c Ù\86Û\8cسئسÛ\95",
+       "content-model-wikitext": "Ú¤Û\8cÚ©Û\8c Ù\86Û\8cسسٱ",
        "content-model-text": "نیسئسە سادە",
        "content-model-javascript": "جاڤا ئسکئریپت",
        "content-model-css": "سی اس اس",
        "unstrip-depth-warning": "د بیشترونه د سرچشمه رئتن د دستور Unstrip واروتر رئتیته($1)",
        "converter-manual-rule-error": "خطا د قانون والرشتن دسی زون",
        "undo-success": "نبوئه ویرایشت نه انجومشیو بکیت.\nلطفا ای فرخی که ها د هار نه وارسی بکیت تا یه کاریه که میهات انجوم بئیت، و اوسه آلشتیا هار نه اماییه بکیت سی یه که خمثی کردن ویرایشت نه انجوم بئیت.",
-       "undo-failure": "سی ری به ری بیئن ای ویرایشت وا ویرایشتیا مینجایی، نبوئه ای ویرایشت نه خومثی بکیت.",
+       "undo-failure": "سی ری ڤ ری بیئن اؽ ڤیرایش ڤا ڤیرایشؽا مؽنجایی، نمۊئٱ اؽ ڤیرایش ناْ خونسا بٱکؽت.",
        "undo-norev": "نبوئه ای ویرایشت نه خومثی بکیت سی یه که یا وجود ناره یا پاکسا بیه.",
        "undo-nochange": "وه نظر میا که ای ویرایشت د ایسنیا خومثی بیه.",
        "undo-summary": "خومثی بیئن وانئری وا $1 [[Special:Contributions/$2|$2]] ([[User talk:$2|چک چنه]])",
        "histlast": "ایسنی تریݩ",
        "historysize": "({{PLURAL:$1|1 بایت|$1 بایتیا}})",
        "historyempty": "(حالی)",
-       "history-feed-title": "ڤیرگار دوڤارٱ دیاٛن",
-       "history-feed-description": "دوڤارٱ دیاٛن ڤیرگار سی بلگٱ د ڤیکی",
+       "history-feed-title": "ڤیرگار دوئارٱ دیئن",
+       "history-feed-description": "دوئارٱ دیئن ڤیرگار سی بٱلگٱ د ڤیکی",
        "history-feed-item-nocomment": "$1 د\n$2",
        "history-feed-empty": "بلگه حاسته بیه وجود ناره.\nشایت وه د ویکی پاکسا بیه، یا نومش آلشت بیه.\nسی بلگیا مرتوط تازه [[ویجه:پی جوری|پی جوری د ویکی]] کوششت بکید.",
        "history-edit-tags": "ڤیرایئشت کاری ڤانئیأریا گولئ ڤورچی بییە",
        "mergehistory-same-destination": "سرچشمه و بلگه یا مقصد نبوئه یکی بوئن",
        "mergehistory-reason": "دأليل:",
        "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
-       "mergelog": "سریک سازی پهرستنومه",
+       "mergelog": "سٱریٱک سازی پهرستنومٱ",
        "revertmerge": "بی لوئه",
        "mergelogpagetext": "شما د هار نوم گه آخرین چیا وه یک شیوسن ویرگار یه بلگه نه د بلگه تر میئنیت.",
        "history-title": "دوئارٱ دیئن ڤیرگار $1",
        "compareselectedversions": "دوئارٱ دی ینؽایؽ کاْ اْنتخاو بینٱ ناْ موقایسٱ بٱکؽت",
        "showhideselectedversions": "شلک دیئن وانیریا انتخاو بیه نه آلشت بکید",
        "editundo": "ناٱنجومگر کردن",
-       "diff-empty": "(بی فرق)",
+       "diff-empty": "(بؽ فٱرق)",
        "diff-multi-sameuser": "({{PLURAL:$1|یاٛ نۏسخٱ مؽنجایی|$1 نۏسخٱیا مؽنجایی}} ڤ دٱس{{PLURAL:$2|کاریارؽ تر|$2 کاریارؽا}} نشوݩ داٛئٱ ناٛیٱ)",
-       "diff-multi-otherusers": "({{PLURAL:$1|یه گل نسقه مینجایی|$1 نسقه یا مینجایی}} وه دس{{PLURAL:$2|کاریاری تر|$2 کاریاریا}} نشو دئه نبیه)",
+       "diff-multi-otherusers": "({{PLURAL:$1|یاٛ نۏسخٱ مؽنجایی|$1 نۏسخٱیا مؽنجایی}} ڤ دٱس{{PLURAL:$2|کاریاری تر|$2 کاریارؽا}} نشوݩ داٛئٱ ناٛیٱ)",
        "diff-multi-manyusers": "({{PLURAL:$1|یه گل وانیری مینجاگرته|$1وانیریا مینجا گرته}} بیشتر د $2 {{PLURAL:$2|کاریار|کاریاریا}} نشو دئه نبیه)",
        "difference-missing-revision": "{{PLURAL:$2|یه گل ویرایشت|$2 ویرایشت}} د فرق مینجا($1) {{PLURAL:$2|پیدا نبی|پیدا نبینه}}.\n\nشایت بانی جاونه وه وا یه گل ویرگار وه هنگوم نبیه که د یه گل بلگه پاکسا بیه هوم پیوند بیه بوئه.\nشایت جزئیات د   [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]  پیدا بوئن.",
        "searchresults": "نتيجٱیا پاٛ جۊری",
        "nextn": "نوئایی {{PLURAL:$1|$1}}",
        "prev-page": "بلگه دمايی",
        "next-page": "بلگه نهایی",
-       "prevn-title": "پيشتر $1 {{PLURAL:$1|نتيجه|نتيجيا}}",
+       "prevn-title": "زیتر $1 {{PLURAL:$1|نٱتیجٱ|نٱتيجٱيا}}",
        "nextn-title": "دمایی $1 {{PLURAL:$1|نتيجٱ|نتيجيا}}",
        "shown-title": "نشوݩ داٛین $1 {{PLURAL:$1|نتیجٱ|نتیجٱیا}} سی هار بٱلگٱ",
        "viewprevnext": "ديین ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-everything-tooltip": "همٱ مؽنونٱیا ناْ پۊ جۊری كو (شاملاْ بٱلگٱيا چٱک چنٱ)",
        "searchprofile-advanced-tooltip": "نوم جايا نوم دؽار بٱگٱرد",
        "search-result-size": "$1 ({{PLURAL:$2|1 کلٱمٱ|$2 کلٱمٱیا}})",
-       "search-result-category-size": "{{PLURAL:$1|1 ٱندوم|$1 ٱندومؽا}} ({{PLURAL:$2|1 زؽردٱسٱ|$2 زؽردٱسٱیا}}، {{PLURAL:$3|1 جانیا|$3 جانیایا}}",
+       "search-result-category-size": "{{PLURAL:$1|1 ٱندوم|$1 ٱندومؽا}} ({{PLURAL:$2|1 زؽردٱسٱ|$2 زؽردٱسٱیا}}، {{PLURAL:$3|1 جانؽا|$3 جانؽایا}}",
        "search-redirect": "(ڤرگٱشتن سی $1)",
        "search-section": "(بٱئرجا $1)",
        "search-category": "(دسه $1)",
-       "search-file-match": "(یٱکی کردن مینونٱ جانؽا)",
+       "search-file-match": "(یٱکؽ کردن مؽنونٱ جانؽا)",
        "search-suggest": "مٱنزۊرت يٱ بی:$1",
        "search-rewritten": "نئشوٙ دأئن نأتیجە یا سی $1. سی نئموٙنە بأگأردیت سی $2.",
        "search-interwiki-caption": "پروجه یا خوئر",
        "group": "جأرغە",
        "group-user": "کاریاریا",
        "group-autoconfirmed": "کاریاریا خود پوشت راس بییە",
-       "group-bot": "بوتیا",
-       "group-sysop": "سأردیڤوٙنکاریا",
+       "group-bot": "بوتؽا",
+       "group-sysop": "سٱردیڤونکارؽا",
        "group-bureaucrat": "بوروکراتیا",
        "group-suppress": "تیە پایا",
        "group-all": "(هأمە)",
        "group-suppress-member": "{{GENDER:$1|تیە پا}}",
        "grouppage-user": "{{ns:project}}:کاریاریا",
        "grouppage-autoconfirmed": "{{ns:project}}:کاریار خودأنجومکار",
-       "grouppage-bot": "{{ns:project}}:بÙ\88ت Û\8cا",
-       "grouppage-sysop": "{{ns:project}}:دÛ\8cÚ¤Ù\88Ù\99Ù\86دارÛ\8cا",
+       "grouppage-bot": "{{ns:project}}:رباتâ\80\8cÙ\87ا",
+       "grouppage-sysop": "{{ns:project}}:دÛ\8cÚ¤Ù\88Ù\86دارؽا",
        "grouppage-bureaucrat": "{{ns:project}}:دیڤوٙنداریا",
        "grouppage-suppress": "{{ns:project}}:تیە پا",
        "right-read": "حأنئن بألگە یا",
        "right-changetags": "Add and remove arbitrary [[Special:Tags|tags]] on individual revisions and log entries",
        "newuserlogpage": "دۏرس بیٱ ڤا کاریار",
        "newuserlogpagetext": "یه پهرستنومه راس بیئن کاریاره",
-       "rightslog": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù\87 Ø­Ù\82Ù\88ق کاریار",
+       "rightslog": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù± Ù\87Ù\88Ù\82Û\8aق کاریار",
        "rightslogtext": "یه پهرستنومه آلشتیا حقوق کاریاره.",
        "action-read": "ای بلگه نه بحو",
        "action-edit": "اؽ بٱلگٱ ناْ ڤيرايش بٱكیت",
        "action-createpage": "راس کردن بلگیا",
        "action-createtalk": "بلگه یا چک چنه نه راس بکید",
-       "action-createaccount": "حساو ای کاریار نه راس بکید",
+       "action-createaccount": "هساو اؽ کاریار ناْ دۏرس بٱکؽت",
        "action-history": "ویرگار ای بلگه نه بوینیت",
        "action-minoredit": "ای ویرایشت نه چی یه حیرده ویرایشت نشو بیئت",
        "action-move": "لی بلگه جا وه جا کو",
        "rcshowhideanons": "کاریار نادؽار $1",
        "rcshowhideanons-show": "نشوݩ داٛئن",
        "rcshowhideanons-hide": "قایم کردن",
-       "rcshowhidepatr": "$1 ویرایشتیا تیه پرس بیه",
+       "rcshowhidepatr": "$1 ڤیرایشیا تیٱ پرس بیٱ",
        "rcshowhidepatr-show": "نئشوٙ دأئن",
        "rcshowhidepatr-hide": "قام کئردئن",
        "rcshowhidemine": "ڤیرایشؽا ماْ $1",
        "rc-enhanced-hide": "جزياته قام كو",
        "rc-old-title": "ذاتا چی \"$1\" راس بیه",
        "recentchangeslinked": "آلشتؽا تاٛ یٱکؽ",
-       "recentchangeslinked-feed": "آلشتیا تی یکی",
+       "recentchangeslinked-feed": "آلشتؽا تاٛ یٱک",
        "recentchangeslinked-toolbox": "آلشتؽا تاٛ یٱک",
        "recentchangeslinked-title": "آلشتؽا تاٛ یٱکؽ د $1",
        "recentchangeslinked-summary": "اؽ نوم بٱلگٱ تازٱ د بٱلگٱیایی کاْ ڤا بٱلگٱیا ڤیژٱ هوم پاٛڤٱن بینٱ آلشت بیٱ(یا سی ٱندومؽا دٱسٱ بٱنی بیٱ)\nبٱلگٱیایی کاْ هان د [[Special:Watchlist|your watchlist]]ۉ گٱپ بینٱ",
        "listfiles_search_for": "پی جوری سی نوم رسانه:",
        "listfiles-userdoesnotexist": "حساو کاریاری «$1» ثوت نام نبیه.",
        "imgfile": "جانؽا",
-       "listfiles": "نومگە جانیا",
+       "listfiles": "نومگٱ جانؽا",
        "listfiles_thumb": "بأن کئلئکی",
        "listfiles_date": "گات",
        "listfiles_name": "نوم",
        "filehist-help": "ری  ڤيرگارؽا بٱپۊرنؽت تا نۏسخٱ مٱربۊتاْ باٛینؽت.",
        "filehist-deleteall": "هأمە نئ پاکسا کو",
        "filehist-deleteone": "پاکسا کئردئن",
-       "filehist-revert": "لئرنیئن",
+       "filehist-revert": "لٛرنیئن",
        "filehist-current": "تازٱ با",
        "filehist-datetime": "ڤيرگار/ڤٱخت",
        "filehist-thumb": "عٱسک کوچک بیٱ",
        "filehist-thumbtext": "كوچک کردن سی نۏسخٱ چی $1",
-       "filehist-nothumb": "هیچ بن کلیکی نئ",
+       "filehist-nothumb": "بؽ بٱن کلٛکی",
        "filehist-user": "کاریار",
        "filehist-dimensions": "اۊیٱکؽا",
        "filehist-filesize": "انازه فایل",
        "linkstoimage-more": "بؽشتر د $1 بٱلگٱ د اؽ جانؽا هوم پاٛڤٱن {{PLURAL:$1|بٱ|بینٱ}}.\nنومگٱ هاری تٱنڳؽا{{PLURAL:$1|ٱڤلی هوم پاٛڤٱن|ٱڤلی $1 هوم پاٛڤٱن}} د ؽ بٱلگٱ ناْ نشوݩ مؽ یٱ.\n[[Special:WhatLinksHere/$2|نومگٱ کامل]] ٱم هؽسش.",
        "nolinkstoimage": "ایچاْ هیچ بٱلگاٛیی سی هوم پیاٛڤٱن بیین ڤا اؽ جانؽا نؽ",
        "morelinkstoimage": " [[ویجه:چه هوم پیوندی ها ایچه/$1|هوم پیوندیا هنی]]سی ای جانیا نه بونیت.",
-       "linkstoimage-redirect": "$1 (واگردونی جانیا) $2",
+       "linkstoimage-redirect": "$1 (ڤاگٱردونی جانؽا) $2",
        "duplicatesoffile": "{{PLURAL:$1|جانیا|جانیایا}} هاری نسقه تکراری ای جانیا {{PLURAL:$1|هئ|هئن}} ([[Special:FileDuplicateSearch/$2|دونسمنیا هنی]]):",
        "sharedupload": "ای جانیا که د $1 هئ شایت د پروجه یا هنی استفاده بیه.",
        "sharedupload-desc-there": "ای جانیا ها د $1و شایت د پروجه یا هنی وه کار گرته بوئه.\nسی دونسمنیا هنی لطفن [$2 بلگه توضیحیا جانیا] نه سیل بکیت.",
        "sharedupload-desc-here": "فایلٛؽ کاْ د $1 شایٱد د مؽن پرۉژٱیا هنی اْستفادٱ بیٱ.\nتۉزیی دبارٱ[$2 file description page] د هار نشوݩ داٛئٱ بیٱ",
        "sharedupload-desc-edit": "ای جانیا د $1 ئه و می تونه د پروجه یا هنی وه کار گرت بوئه.\nار حاستیت می تونیت توضیحیا حانیا نه د [$2 بلگه توضیحیا خوش] د اوچه ویرایشت بکیت.",
        "sharedupload-desc-create": "ای جانیا د $1 ئه و می تونه د پروجه یا هنی وه کار گرت بوئه.\nار حاستیت می تونیت توضیحیا حانیا نه د [$2 بلگه توضیحیا خوش] د اوچه ویرایشت بکیت.",
-       "filepage-nofile": "چنو فایلی وا ای نوم نئ.",
+       "filepage-nofile": "چنو فایلٛی ڤا اؽ نوم نؽ.",
        "filepage-nofile-link": "جانیایی د ای نوم نیئش، اما شما تونیت ونه د [$1 سوار بکیت].",
        "uploadnewversion-linktext": "یه گل نسقه تازه د ای جانیا سوار بکید",
        "shared-repo-from": "د $1",
        "randomincategory-submit": "رو",
        "randomredirect": "واگردونی بختکی",
        "randomredirect-nopages": "هیچ واگردونی د نومجا \"$1\" نئ.",
-       "statistics": "آماريا",
+       "statistics": "آمارؽا",
        "statistics-header-pages": "بلگه آماریا",
        "statistics-header-edits": "آماریا نه ویرایشت بکید",
        "statistics-header-users": "آماریا کاریار",
        "doubleredirectstext": "ای بلگه نومگه ای د بلگه واگردونی نه نشو می یه که وه یه گل بلگه واگردونی هنی هشاره می کن.\nهر خط مینونه دار هوم پیوندیا واگردونی اول و دویم و همچنو مقصد واگردونی دویمه، که معمولند بلگه مقصد راستکی یه و اولین واگردونی واس د وه هشاره بکه.\nچیا <del>خط حرده</del> دروس بینه.",
        "double-redirect-fixed-move": "[[$1]]جا وه جا بیه .\nوه خودکارونه وه روز بیه و ایسه وه د[[$2]] واگردونی بیه.",
        "double-redirect-fixed-maintenance": "برطرف بیین خودانجوم دوتای د [[$1]] وه [[$2]] د مسیر واداشت.",
-       "double-redirect-fixer": "تعمیر کننه واگردونی",
+       "double-redirect-fixer": "تٱمیر کننٱ ڤاگٱردونی",
        "brokenredirects": "واگردونیا بی سرانجوم",
        "brokenredirectstext": "واگردونیا نهاتر د بلگه یایی که وجود نارن هوم پیوند بینه.",
        "brokenredirects-edit": "ڤیرایئشت",
        "mostimages": "فایلیایی که بیشتر هوم پیوند بینه",
        "mostinterwikis": "بلگه یایی که بیشتری مینجا ویکی نه دارن",
        "mostrevisions": "بلگه یایی که بیشتری وانئری نه دارن",
-       "prefixindex": "Ù\87Ù\85Ù\87 Ø¨Ù\84Ú¯Ù\8aا Ù\88ا Ù¾Ù\8aØ´Ù\88ن",
+       "prefixindex": "Ù\87Ù\85Ù± Ø¨Ù±Ù\84Ú¯Ù±Û\8cا Ú¤Ø§ Ù¾Ù\8aØ´Ú¤Ù±ن",
        "prefixindex-namespace": "تموم بلگه یا وا دماون(نومجا $1)",
        "prefixindex-strip": "پاکسا کردن دماون د نومگه",
        "shortpages": "بلگه یا کؤچک",
        "protectedtitles": "سرونیا پر و پیم بیه",
        "protectedtitles-summary": "د ای بلگه نومگه بلگه یایی هیئن که د ایسنی پر و پیم بینه. سی نومگه سرونیا که نبوئه دروس بان، سیل[[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]  بکیت.",
        "protectedtitlesempty": "د ایسنی هیچ سرونی وا ای پارامتریا پر و پیم نبیه",
-       "listusers": "نومگە کاریار",
+       "listusers": "نومگٱ کاریار",
        "listusers-editsonly": "فأقأط کاریاریایی کئ ڤیرایئشت کاری می کأن دیار بان",
        "listusers-creationsort": "سرجاخودگری د اساس گات دروس بیین",
        "listusers-desc": "سرجاخودگری د اساس گپ د کؤچک",
        "newpages": "بٱلگٱیا نۊ",
        "newpages-username": "نوم کاریاری:",
        "ancientpages": "بلگه یا نهاتر",
-       "move": "جاوه جا بوئيت",
+       "move": "جا ڤ جا بۊئؽت",
        "movethispage": "ای بگله نه جا وه جا كو",
        "unusedimagestext": "جانیایا هاری هئشو اما د هیچ بلگه ای وه کار گرته نبینه.\nلطفن د ویرتو با که دیارگه یا هنی شایت وا یه گل تیرنشون اینترنتی مستقیم وه یه گل جانیا هوم پیوند بان و وا یه که د وه کار گرتن کنشتگر هیئن د ایچه نومگه بان.",
        "unusedcategoriestext": "ای دسه یا هیئشو ولی د ایسنی هیچ گوتار یا دسه ای ونونه وه کار نمی بنه.",
        "booksources-search": "پاٛ جۊری",
        "booksources-text": "د هار نومگه ای د هوم پیوندیا د دیارگه یا هنی اومائه که کتاویا نو و دس دوئم می فروشن، و همچنو شایت دونسمنیا بیشتری راجع وه کتاو حاستنی شما داشتوئن:",
        "booksources-invalid-isbn": "شازک که دئه بیه معتور نئ؛ وارسی خطایا د گات ؤرداشتن د سرچشمه اولی وه کار گرته بوئه.",
-       "specialloguserlabel": "انجومکار:",
-       "speciallogtitlelabel": "حاستئنی(داسوٙن یا نوم کاریاری سی کاریار):",
+       "specialloguserlabel": "ٱنجومکار:",
+       "speciallogtitlelabel": "هاستنی(داسون یا نوم کاریاری سی کاریار):",
        "log": "پهرستنومٱیا",
        "all-logs-page": "همٱ پهرستنومٱیا عومۊمی",
-       "alllogstext": "نماشت یه جا همه پهرستنومه یا که هان د{{SITENAME}}.\nمی تونید وا انتخاو نوع پهرستنومه، نوم کاریاری(حساس وه کؤچکی و گپی حرفیا) و بلگه یا آلشت کرده(حساس و گپی و کؤچکی حرنیا) نمایشت نه دیر د ویرتر بکیت.\n\n{{SITENAME}}.",
-       "logempty": "او چی ای که شما میهایت د پهرستنومه نیئش.",
+       "alllogstext": "نمایش یٱ جا همٱ پهرستنومٱیا کاْ هان د{{SITENAME}}.\nمؽ تونؽت ڤا اْنتخاو نۉع پهرستنومٱ، نوم کاریاری(هٱساس ڤ کوچکی ۉ گٱپی هرفؽا) ۉ بٱلگٱیا آلشت کردٱ(هٱساس ۉ گٱپی ۉ کوچکی هرنیا) نمایش ناْ دیر د ڤیرتر بٱکؽت.\n\n{{SITENAME}}.",
+       "logempty": "او چی کاْ شما مؽهایت د پهرستنومٱ نؽسش.",
        "log-title-wildcard": "بلگه یایی نه پی جوری کو که وا ای سرون شرو موئن",
        "showhideselectedlogentries": "آلشت دئن ورتیه گر پهرستنومه یا انتخاو بیه",
        "log-edit-tags": "ویرایشت سردیسیایی که پهرستنومه شو گل گر بیه",
        "allpagesprefix": "بلگه یایی که پس نوم دارن نشو بیه:",
        "allpagesbadtitle": "عنوان بلگه حاسته بیه معتور نی،یا  یه گل مئن زونی یا مئن ویکی عنوان غلطه.\nیه شایت شومل یکی با یا بیشتر کاراکتریا نبوئه که سی ای موضوعیا استفاده بوئن",
        "allpages-bad-ns": "{{نوم دیارگه}} د ای نوم جا نئ \"$1\".",
-       "allpages-hide-redirects": "واگردونیا قام بیه",
+       "allpages-hide-redirects": "ڤاگٱردونیا قایم بیٱ",
        "cachedspecial-viewing-cached-ttl": "شما د حال و بار دیئن یه گل نسقه ای د ای بلگه که ها د مینجاگیر هیئت که شایت سی $1 دماتر با.",
        "cachedspecial-viewing-cached-ts": "شما داریت یه گل نسقه د ای بلگه نه که ها د مینجاگر سیل می کیت، و ای نسقه شایت کاملند راستکی نبا.",
        "cachedspecial-refresh-now": "دیئن آخری.",
        "listgrouprights-group": "دسه",
        "listgrouprights-rights": "حقوقیا",
        "listgrouprights-helppage": "هومیاری:حقوق گرو",
-       "listgrouprights-members": "(نوم گه اندومیا)",
+       "listgrouprights-members": "(نومگٱ ٱندومؽا)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code dir=\"ltr\">($2)</code></span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
        "listgrouprights-addgroup": "{{PLURAL:$2|جأرغە|جأرغە یا}} نە ئضاف بأکیت: $1",
        "trackingcategories-disabled": "دسه ناکشتگر بیه",
        "mailnologin": "هیپچ نشونی یی کل نبیه",
        "mailnologintext": "سی کل کردن انجومانامه وه کاریاریا هنی واس [[Special:UserLogin|بیایت وامین سامونه]] و تیرنشون انجومانامه معتوری د [[Special:Preferences|ترجیحات]] خوتو داشتوئیت.",
-       "emailuser": "ئÛ\8c Ú©Ø§Ø±Û\8cار Ù\86Û\95 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 کاری کو",
+       "emailuser": "اؽ Ú©Ø§Ø±Û\8cار Ù\86اÙ\92 Ù±Ù\86جÙ\88Ù\85Ù\86اÙ\85Ù± کاری کو",
        "emailuser-title-target": "أنجومانامە سی ئی {{GENDER:$1|کاریار}}",
        "emailuser-title-notarget": "أنجومانامە کاریار",
        "emailpagetext": "شما می تونیت  نوم بلگه هار نه سی کل کردن یه گل انجومانامه وه ای  {{GENDER:$1|کاریار}} وه کار بئیرت.\nتیرنشون انجومانامه یی که د [[Special:Preferences|ترجیحات کاریارتو]] دئیه ته د تیرنشون کلکار انجومانامه میا، سی یه که گیرنه بتونه جواوش بیه.",
        "emailsenttext": "پیغوم ایمیلی تو کل بیه.",
        "emailuserfooter": "ئی أنجومانامە ڤا ڤئ کار گئرئتنئ د خوصوٙصیأت \"کئل کئردئن نومە د ئی کاریار\"{{SITENAME}} ڤئ دأس $1 د $2 کئل بی.",
        "usermessage-summary": "رئتن د سامونه پیغوم",
-       "usermessage-editor": "پیغوم فرسن سیستم",
+       "usermessage-editor": "پاٛغوم کلٛ کردن سیستم",
        "usermessage-template": "ویکی وارسگر:پیغوم کاریار",
-       "watchlist": "سئÛ\8cÙ\84 Ø¨رگ",
+       "watchlist": "ساÙ\9bÙ\84Ù\9b Ø¨Ù±رگ",
        "mywatchlist": "ساٛلٛ بٱرگ",
-       "watchlistfor2": "سي $1 $2",
+       "watchlistfor2": "سی $1 $2",
        "nowatchlist": "شما هیچی د سیل برگ خوتو ناریت",
        "watchlistanontext": "لطفن بیایت وامین و ویرایشتیا نه د سیل برگتو سیل بکیت.",
        "watchnologin": "ھأنی نیوٙماە ڤامین",
        "unwatchthispage": "نئھاگئری دیئن",
        "notanarticle": "ھیچ بألگە مینوٙنە داری نی",
        "notvisiblerev": "آخری وانئری که د دس یه کاریار هنی انجوم بیه پاکسا بیه.",
-       "watchlist-details": "{{PLURAL:$1|$1 بلگٱ|$1 بلگٱیا}} د ساٛیل برگتۊ هیچ بلگٱ قساٛ کردنی نی.",
+       "watchlist-details": "{{PLURAL:$1|$1 بلگٱ|$1 بلگٱیا}} د ساٛلٛ بٱرگتو هیچ بٱلگٱ قسٱ کردنی نؽ.",
        "wlheader-enotif": "ڤارئسیاری أنجومانامە کونئشتکار بییە.",
-       "wlheader-showupdated": "بÙ\84Ú¯Ù± Û\8cاÛ\8cÛ\8c Ú©Ø§Ù\9b Ø¯ Ø¢Ø®Ø±Û\8cÙ\86 Ø¨Ø§Ø±Û\8c Ú©Ø§Ù\9b Ú©Ù\87 Ø´Ù\85ا Ø³Ø§Ù\9bÛ\8cÙ\84Ø´Û\8a Ú©Ø±Ø¯Û\8cتٱ Ø¯ <strong>تÛ\8aÙ¾Ù\88ر</strong>Ù\86Ø´Û\8aÙ\86 Ø¯Ø¦Ù± Ø¨Û\8aاÙ\9bن",
-       "wlnote": "د هار {{PLURAL:$1|آلشت|<strong>$1</strong> آلشتی}} که د {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} دماتر انجوم بیه هیئش، ویرگار آخرین واجوری انجام شده موجود است، ویرگار آخری واجوری: $3، $4",
-       "wlshowlast": "آخرین$1 ساعتیا $2و روزیا  نشو بیئه",
+       "wlheader-showupdated": "بٱÙ\84Ú¯Ù±Û\8cاÛ\8cÛ\8c Ú©Ø§Ù\9b Ø¯ Ø¢Ø®Ø±Û\8c Ú¯Ù\84Ù\9bؽ Ú©Ø§Ù\92 Ú©Ø§Ù\92 Ø´Ù\85ا Ø³Ø§Ù\9bÛ\8cÙ\84Ù\9bØ´Ù\88 Ú©Ø±Ø¯Ø½ØªÙ± Ø¯ <strong>تÛ\8aÙ¾Ù\88ر</strong>Ù\86Ø´Ù\88Ý© Ø¯Ø§Ù\9bئٱ Ø¨Û\8aئٱن",
+       "wlnote": "د هار {{PLURAL:$1|آلشت|<strong>$1</strong> آلشتؽ}} کاْ د {{PLURAL:$2|ساعت|<strong>$2</strong> ساعٱت}} دماتر ٱنجوم بیٱ هؽسش، ڤیرگار آخری ڤاجۊری ٱنجوم بیٱ هؽسش، ڤیرگار آخری ڤاجۊری: $3، $4",
+       "wlshowlast": "آخری$1 ساعٱتؽا $2ۉ رۊزؽا نشوݩ باٛیٱ",
        "wlshowtime": "نئشوٙ دأئن د آخأر",
        "wlshowhideminor": "ڤیرایئشتیا فئرە کوچئک",
        "wlshowhidebots": "بوتیا",
        "wlshowhideanons": "کاریار نادیار",
        "wlshowhidepatr": "تیە پایی د ڤیرایئشتیا",
        "wlshowhidemine": "ڤیرایئشتیا مئ",
-       "watchlist-options": "چیا ساٛیل برگ",
+       "watchlist-options": "چیا ساٛلٛ بٱرگ",
        "watching": "د حال و بال دیئن...",
        "unwatching": "د حال ندیئن...",
        "watcherrortext": "یه گل اشگال د گات آلشت کردن میزونکاری نومگه سیل برگتو سی «$1» پیش اوما.",
-       "enotif_reset": "Ù\87Ù\85Ù\87 Ø¨Ù\84Ú¯Ù\87 Û\8cا Ø¯Û\8cئÙ\87 Ø¨Û\8cÙ\86Ù\87 Ù\86Ø´Ù\88دار Ø¨Ú©Û\8cد",
+       "enotif_reset": "Ù\87Ù\85Ù± Ø¨Ù±Ù\84Ú¯Ù±Û\8cا Ø¯Û\8cئٱ Ø¨Û\8cئٱ Ù\86اÙ\92 Ù\86Ø´Ù\88دار Ø¨Ù±Ú©Ø½Øª",
        "enotif_impersonal_salutation": "{{نوم سیلجا}} کارور",
        "enotif_subject_deleted": "{{SITENAME}} بلگه$1 وه دس{{gender:$2|$2}} پاکسا بیه.",
        "enotif_subject_created": "{{SITENAME}} بلگه$1 وه دس{{gender:$2|$2}} دروس بیه.",
        "protectlogpage": "پٱر ۉ پیم کاری پهرستنومٱ",
        "protectlogtext": "د ھار یئ گئل نومگە د آلئشتیا ریتئراز پأر و پیم کاری بألگە یا ئوٙماە.\n[[Special:ProtectedPages|نومگە بألگە یا پأر و پیم کاری بییە]] نە سی دیئن نومگە پأر و پیم کاری کارگئرا بألگە یا نە سئیل بأکیت.",
        "protectedarticle": "پأر و پیم کاری بییە [[$1]]",
-       "modifiedarticleprotection": "ریتراز حفاظت د \"[[$1]]\" آلشت بیه",
+       "modifiedarticleprotection": "ریتراز هفازٱت د \"[[$1]]\" آلشت بیٱ",
        "unprotectedarticle": "بلگه«[[$1]]» نه د پر و پیم دراورد",
        "movedarticleprotection": "میزونکاری پر و پیم بیین د «[[$2]]» وه «[[$1]]» جا وه جا بیه",
        "protect-title": "ریتراز حفاظت د \"$1\" آلشت بیه",
        "minimum-size": "انازه کمترونه",
        "maximum-size": "انازه بیشترونه",
        "pagesize": "(بایتیا)",
-       "restriction-edit": "ڤیرایشت",
-       "restriction-move": "جاوه جا بوئيت",
+       "restriction-edit": "ڤیرایش",
+       "restriction-move": "جا ڤ جا بۊئؽت",
        "restriction-create": "راس كردن",
        "restriction-upload": "سوار کرد",
        "restriction-level-sysop": "کلا پر و پیم بیه",
        "anoncontribs": "هومیاریا",
        "contribsub2": "سی {{جنسيٱت:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "کاریار \"$1\" ثوت نام نکرده.",
-       "nocontribs": "هیچ آلشتی وا ای مشقصات دیاری نکرد.",
+       "nocontribs": "هیچ آلشتؽ ڤا اؽ موشٱخٱسؽا دؽاری نٱکرد.",
        "uctop": "تازٱ بۊ",
        "month": "د ما(یا زیتر)",
        "year": "د سال",
        "whatlinkshere-hideredirs": "$1 ڤرگٱردونیا",
        "whatlinkshere-hidetrans": "$1 چٱن نتیجاٛیی",
        "whatlinkshere-hidelinks": "هوم پاٛڤٱنؽا $1",
-       "whatlinkshere-hideimages": "جانیا هوم پیۋندیا $1",
+       "whatlinkshere-hideimages": "جانؽا هوم پاٛڤٱنؽا $1",
        "whatlinkshere-filters": "فيلٛترؽا",
        "autoblockid": "خود نهاگری #$1",
        "block": "منع کارور",
        "ipblocklist-submit": "پی جوری",
        "ipblocklist-localblock": "نهاگری ولات نشینی",
        "ipblocklist-otherblocks": "هنی{{PLURAL:$1|نهاگرتن|نهاگرتنیا}}",
-       "infiniteblock": "بی زمون",
+       "infiniteblock": "بؽ زموݩ",
        "expiringblock": "د $1 ساعت $2 تموم موئه",
        "anononlyblock": "فقط کاریاریا نادیار",
        "noautoblockblock": "بستن خودانجوم ناکشتگر بیه",
        "blocklogtext": "ای پهرستنومه سی نهاگری یا واز کردن دسرسی کاریاریائه.\nتیرنشونیا آی پی که خود انجومن نهاگری بینه د ایسنی نومگه کاری نبینه.\nسی نومگه نهاگریا و بسه بینیا د ایسنی روئیت د [[Special:BlockList|نومگه نهاگری بیه یا]].",
        "unblocklogentry": "وا کردن قلف $1",
        "block-log-flags-anononly": "فقط کاریاریایی که نادیارن",
-       "block-log-flags-nocreate": "حساو راس کردن عاجز بیه.",
+       "block-log-flags-nocreate": "هساو دۏرس کردن عاجز بیٱ.",
        "block-log-flags-noautoblock": "بستن خودانجوم ناکشتگر بیه",
        "block-log-flags-noemail": "انجومانامه ناکشتگر بیه",
        "block-log-flags-nousertalk": "نبوئه بلگه چک چنه خوتونه ویرایشت بکید",
        "ipb_blocked_as_range": "خطا: تیرنشون آی‌ پی $1 سر راست نهاگری نبیه و نبوئه وازش بکیت.\nای تیرنشون واگرد پوشگر $ نهاگری بیه و بوئه وازش بکی.",
        "ip_range_invalid": "پوشگر نامعتور آی پی",
        "ip_range_toolarge": "نهاگری پوشینه یا گپتر $1/ مجاز نئ.",
-       "proxyblocker": "Ù\82Ù\84Ù\81 Ú©Ù\86Ù\86Ù\87 پروکسی",
+       "proxyblocker": "Ù\82Ù\84Ù\81 Ú©Ù\86Ù\86Ù± پروکسی",
        "proxyblockreason": "تیرنشون آی پی شما نهاگری بیه سی یه مال یه گل پروکسی آزاده.\nلطف بکیت وا انجومکار اینترنتی خوتو یا حامینکار کسمی خوتو پیوند بگریت و ونونه د مشگل امنتی گن خوتو وارسیار بکیت.",
        "sorbs": "دی ان اس بی ال",
        "sorbsreason": "تیرنشون آی پی شما وه دس DNSBL  وه کار گرته وه دس {{SITENAME}} چی یه گل پروکسی آزاد گزارشت بیه.",
        "import-options-wrong": "{{PLURAL:$2|جزئیات|جزئیات}} اشتوا: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "ریشه دئه بیه د بلگه یه گل سرون نامعتوره.",
        "import-rootpage-nosubpage": "نومجا \"$1\" بلگه پایه صلا زیر بلگه نه نمی یه.",
-       "importlogpage": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù\87 دئن",
+       "importlogpage": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù± دئن",
        "importlogpagetext": "وامین اوردن بلگه یا وا ویرگارچه ویرایشت ونو د ویکی یا هنی",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|وانئری|وانئریا}} وامین اومانه",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|وانئری|وانئریا}} د $2 وامین اومائنه",
        "tooltip-ca-addsection": "د یاٛ بهرجا هنی شرۊ بٱک",
        "tooltip-ca-viewsource": "اؽ بٱلگٱ پر ۉ پیم بیٱ.\nشما مؽ تونؽت سرچشمٱشاْ باٛینؽت",
        "tooltip-ca-history": "دوئرٱ دیئن اؽ بٱلگٱ",
-       "tooltip-ca-protect": "ای بلگه نه حفاظت بكيد",
+       "tooltip-ca-protect": "اؽ بٱلگٱ ناْ ڤیردار بٱکؽت",
        "tooltip-ca-unprotect": "پر و پیم گیری د ای بلگه نه آلشت بکیت",
        "tooltip-ca-delete": "ای بلگه نه پاکسا کو",
        "tooltip-ca-undelete": "د نو زنه کردن ویرایشتیا ری ای بلگه دما یه که پاکساگری بان",
        "tooltip-feed-rss": "هوال حون آر اس اس سی ای بلگه",
        "tooltip-feed-atom": "هڤال هۊن ٱتومی سی اؽ بٱلگٱ",
        "tooltip-t-contributions": "یاٛ سیائٱ هومیاری سی {{GENDER:$1|اؽ کاریار}}",
-       "tooltip-t-emailuser": "سی اؽ كاریار ايماٛیل کلٛ كو",
+       "tooltip-t-emailuser": "سی اؽ كاریار ايماٛیلٛ کلٛ كو",
        "tooltip-t-info": "دونسمنیا بیشتر دباره ای بلگه",
        "tooltip-t-upload": "سڤار کردن جانؽایا",
        "tooltip-t-specialpages": "مؽناْ هٱمٱ بٱلگٱیا ڤیژٱ",
-       "tooltip-t-print": "نۏسخٱ پاٛلا بی ینی سی اؽ بٱلگٱ",
+       "tooltip-t-print": "نۏسخٱ پاٛلا بیئی سی اؽ بٱلگٱ",
        "tooltip-t-permalink": "هوم پاٛڤٱن همیشاٛیی سی دوئارٱ دیئن اؽ بٱلگٱ",
        "tooltip-ca-nstab-main": "ديئن مؽنونٱ بٱلگٱ",
        "tooltip-ca-nstab-user": "دیئن بٱلگٱ کاریار",
        "tooltip-ca-nstab-special": "یٱ یاٛ بٱلگٱ ڤیژٱ آ؛ نمۊئٱ ڤیرایشش بٱکؽت",
        "tooltip-ca-nstab-project": "ديئن بٱلگٱ پرۉژٱ",
        "tooltip-ca-nstab-image": "دیئن بٱلگٱ جانؽا",
-       "tooltip-ca-nstab-mediawiki": "دÛ\8cاÙ\9bÙ\86 Ù¾Û\8cغÙ\88Ù\85 Ø³Ø§Ù\85Û\8aنٱ",
+       "tooltip-ca-nstab-mediawiki": "دÛ\8cئÙ\86 Ù¾Ø§Ù\9bغÙ\88Ù\85 Ø³Ø§Ù\85Ù\88نٱ",
        "tooltip-ca-nstab-template": "ديئن چۊٱ",
        "tooltip-ca-nstab-help": "ديئن بلگه هومیاری",
        "tooltip-ca-nstab-category": "دیئن بٱلگٱ دٱسٱ بٱنی",
-       "tooltip-minoredit": "Û\8cÙ\87 Ù\86Ù\87 Ø¯ Ø¹Ù\86Ù\88اÙ\86 Ø­Û\8cردÙ\87 Ù\88Û\8cراÛ\8cشت Ø«Ù\88ت کو",
+       "tooltip-minoredit": "Û\8cÙ± Ù\86اÙ\92 Ú¤ Ø¹Ù\88Ù\86ڤاÙ\86 Ù\87Û\8cردٱ Ú¤Û\8cراÛ\8cØ´ Ø³Ù±Ø¨ت کو",
        "tooltip-save": "آلشتؽا توناْ آمادٱ بٱکؽت",
        "tooltip-preview": "پیش ساٛلٛ آلشتؽاتو، لوتف بٱکؽت ڤنوناْ دما د آمایٱ کاریشو ڤ کار باٛیرؽت!",
        "tooltip-diff": "آلشتؽا ناْ کاْ شما د ای مٱتن دۏرس کردؽتٱ نشوݩ باٛیٱ",
        "simpleantispam-label": "ڤارسی ری ڤ ری کاری اْسپٱم.\nاؽ \"جاگٱ\" ناْ پور نٱکؽت!",
        "pageinfo-title": "دونسمنیا سی \"$1\"",
        "pageinfo-not-current": "د بدبختی،نبوئه که ای دونسمنیا نه سی وانئریا دماتری نهااماییه بکیت.",
-       "pageinfo-header-basic": "دÙ\88Ù\86سÙ\85Ù\86Û\8cا Ù¾Ø§Û\8cÙ\87",
-       "pageinfo-header-edits": "Ú¤Û\8cراÛ\8cئشت ڤیرگار",
-       "pageinfo-header-restrictions": "پر و پیم کردن بلگه",
-       "pageinfo-header-properties": "Ú\86Û\8cا Ø¨Ù\84Ú¯Ù\87",
-       "pageinfo-display-title": "نشو دئن سرون",
-       "pageinfo-default-sort": "کلیت سرجا یک کن پیش فرض",
-       "pageinfo-length": "انازه بلگه(وه بایت)",
-       "pageinfo-article-id": "نوم دیار کن بلگه",
-       "pageinfo-language": "بÙ\84Ú¯Ù\87 Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø²ون",
-       "pageinfo-content-model": "Ø´Ù\84Ú¯ Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¨Ù\84Ú¯Ù\87",
-       "pageinfo-robot-policy": "Ù\86Ù\88Ù\85Ú¯Ù\87 Ú©Ø§Ø±Û\8c Ù\88ا Ø±Ø¨Ø§ØªÛ\8cا",
-       "pageinfo-robot-index": "صلادار",
-       "pageinfo-robot-noindex": "بی صلا",
-       "pageinfo-watchers": "Ø´Ù\85ارÙ\87 Ø³Û\8cÙ\84 Ú©Ù\86Ù\86Ù\87 Ø¨Ù\84Ú¯Ù\87 یا",
-       "pageinfo-few-watchers": "Ú©Ù\85تر Ø¯ $1 {{PLURAL:$1|سÛ\8cÙ\84 Ú©Ù\86Ù\86Ù\87|سÛ\8cÙ\84 Ú©Ù\86Ù\86Ù\87 Û\8cا}}",
-       "pageinfo-redirects-name": "Ø´Ù\85ارÙ\87 Ù\88اگردÙ\88Ù\86Û\8cا Ø§Û\8c Ø¨Ù\84Ú¯Ù\87",
+       "pageinfo-header-basic": "دÙ\88Ù\86سÙ\85Ù\86Û\8cا Ù¾Ø§Û\8cÙ±",
+       "pageinfo-header-edits": "Ú¤Û\8cراÛ\8cØ´ ڤیرگار",
+       "pageinfo-header-restrictions": "پر ۉ پیم کردن بٱلگٱ",
+       "pageinfo-header-properties": "Ú\86Û\8cا Ø¨Ù±Ù\84Ú¯Ù±",
+       "pageinfo-display-title": "نشوݩ داٛئن سرڤٱن",
+       "pageinfo-default-sort": "کلٛیلٛ سٱرجا یٱک کن پیش فٱرز",
+       "pageinfo-length": "ٱندازٱ بٱلگٱ(ڤ بایت)",
+       "pageinfo-article-id": "نوم دؽار کن بٱلگٱ",
+       "pageinfo-language": "بÙ\84Ú¯Ù± Ù\85Û\8cÙ\86Ù\88Ù\86Ù± Ø²Ú¤ون",
+       "pageinfo-content-model": "Ø´Ù\84Ú© Ù\85Û\8cÙ\86Ù\88Ù\86Ù± Ø¨Ù±Ù\84Ú¯Ù±",
+       "pageinfo-robot-policy": "Ù\86Ù\88Ù\85Ú¯Ù± Ú©Ø§Ø±Û\8c Ú¤Ø§ Ø±Ù\88باتؽا",
+       "pageinfo-robot-index": "سلادار",
+       "pageinfo-robot-noindex": "بؽ سلا",
+       "pageinfo-watchers": "Ø´Ù\85ارٱ Ø³Ø§Ù\9bÙ\84Ù\9b Ú©Ù\86Ù\86Ù± Ø¨Ù±Ù\84Ú¯Ù±یا",
+       "pageinfo-few-watchers": "Ú©Ù±Ù\85تر Ø¯ $1 {{PLURAL:$1|ساÙ\9bÙ\84Ù\9b Ú©Ù\86|ساÙ\9bÙ\84Ù\9b Ú©Ù\86ؽا}}",
+       "pageinfo-redirects-name": "Ø´Ù\85ارٱ Ú¤Ø§Ú¯Ù±Ø±Ø¯Ù\88Ù\86Û\8cا Ø§Ø½ Ø¨Ù±Ù\84Ú¯Ù±",
        "pageinfo-redirects-value": "$1",
-       "pageinfo-subpages-name": "انازه زیربلگه یا ای بلگه",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|واگردونی|واگردونیا}}; $3 {{PLURAL:$3|بی واگردونی|بی واگردونیا}})",
-       "pageinfo-firstuser": "بÙ\84Ú¯Ù\87 Ø±Ø§س کن",
-       "pageinfo-firsttime": "گات دروس بیین بلگه",
-       "pageinfo-lastuser": "آخری ڤیرایشتکار",
-       "pageinfo-lasttime": "گات آخری ڤیرایشت",
-       "pageinfo-edits": "Ø´Ù\85ارÙ\87 Ù\87Ù\85Ù\87 Ù\88Û\8cراÛ\8cشتÛ\8cا",
-       "pageinfo-authors": "Ø´Ù\85ارÙ\87 Ú©Ù\84Û\8c Ù\86Ù\88Û\8cسÙ\86Ù\87 Û\8cا Û\8cÚ©Ù\88Ù\86Ù\87",
-       "pageinfo-recent-edits": "Ø´Ù\85ارÙ\87 Ù\88Û\8cراÛ\8cشتÛ\8cا ایسنی (د $1 دماتر)",
-       "pageinfo-recent-authors": "Ø´Ù\85ارÙ\87 Ú©Ù\84Û\8c Ù\86Ù\88Û\8cسÙ\86Ù\87 Û\8cا Û\8cÚ©Ù\88Ù\86Ù\87",
-       "pageinfo-magic-words": "جادویی{{PLURAL:$1|کلیمه|کلیمه یا}} ($1)",
-       "pageinfo-hidden-categories": "$1{{PLURAL:$1|دسه|دسه يا}} قام بیه",
+       "pageinfo-subpages-name": "ٱندازٱ زؽر بٱلگٱیا اؽ بٱلگٱ",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|ڤاگٱردونی|ڤاگٱردونیا}}; $3 {{PLURAL:$3|بؽ ڤاگٱردونی|بؽ ڤاگٱردونیا}})",
+       "pageinfo-firstuser": "بٱÙ\84Ú¯Ù± Ø¯Û\8fرس کن",
+       "pageinfo-firsttime": "گات دۏرس بیئن بٱلگٱ",
+       "pageinfo-lastuser": "آخری ڤیرایشکار",
+       "pageinfo-lasttime": "گات آخری ڤیرایش",
+       "pageinfo-edits": "Ø´Ù\85ارٱ Ù\87Ù\85Ù± Ú¤Û\8cراÛ\8cشؽا",
+       "pageinfo-authors": "Ø´Ù\85ارٱ Ú©Ù\88Ù\84Ù\9bÛ\8c Ù\86Ú¤Û\8cسٱÛ\8cا Û\8cÙ±Ú©Ù\88Ù\86Ù±",
+       "pageinfo-recent-edits": "Ø´Ù\85ارٱ Ú¤Û\8cراÛ\8cشؽا ایسنی (د $1 دماتر)",
+       "pageinfo-recent-authors": "Ø´Ù\85ارٱ Ú©Ù\88Ù\84Ù\9bÛ\8c Ù\86Ú¤Û\8cسٱÛ\8cا Û\8cÙ±Ú©Ù\88Ù\86Ù±",
+       "pageinfo-magic-words": "جادۊیی{{PLURAL:$1|کلٱمٱ|کلٱمٱیا}} ($1)",
+       "pageinfo-hidden-categories": "$1{{PLURAL:$1|دٱسٱ|دٱسٱيا}} قایم بیٱ",
        "pageinfo-templates": "{{PLURAL:$1|چۊٱ|چۊٱ یا}} ڤ کار گرتٱ بیٱ ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|بلگه|بلگه یا}} وه کار گرته بیه د ($1)",
        "pageinfo-toolboxlink": "دونسمٱنیٛا بٱلگٱ",
        "pageinfo-redirectsto": "واگردونی سی",
        "pageinfo-redirectsto-info": "دونسمنیا",
-       "pageinfo-contentpage": "اشÙ\85اردÙ\87 Ø¨Û\8cÙ\87 Ù\88Ù\87 Ø¹Ù\86Ù\88اÙ\86 Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¨Ù\84Ú¯Ù\87",
-       "pageinfo-contentpage-yes": "ٱ",
+       "pageinfo-contentpage": "Ø´Ù\85اردٱ Ø¨Û\8cÙ± Ú¤ Ø¹Ù\88Ù\86ڤاÙ\86 Ù\85ؽÙ\86Ù\88Ù\86Ù± Ø¨Ù±Ù\84Ú¯Ù±",
+       "pageinfo-contentpage-yes": "عٱ",
        "pageinfo-protect-cascading": "پر و پیم بیین تافنمایی د ایچه",
        "pageinfo-protect-cascading-yes": "هری",
        "pageinfo-protect-cascading-from": "پر و پیم بیین تافنمایی د",
        "markedaspatrollederror-noautopatrol": "شما صلا یه نه که آلشتیا خوتونه چی یه که سردیاری کرده بان ناریت.",
        "markedaspatrollednotify": "آلشتیایی که مال $1 چی یه گل چی سردیاری کرده نشودار بینه.",
        "markedaspatrollederrornotify": "نشودار کردن چی نشودار بیه شکست حرده",
-       "patrol-log-page": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù\87 Ú¯شتن",
+       "patrol-log-page": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù± Ú¯Ù±شتن",
        "patrol-log-header": "یه پهرستنومه وانئریا سردیاری کرده هئ.",
        "deletedrevision": "وانئری دماتری پاکسابیه د $1",
        "filedeleteerror-short": "خطا پاک نبیئن جانیا:$1",
        "imagemaxsize": "انازه عسگ:<br /><em>(سی شرح جانیا بلگه یا)</em>",
        "thumbsize": "انازه بن کلکی:",
        "widthheight": "$1 × $2",
-       "widthheightpage": "$1 Ã\97 $2, $3 {{PLURAL:$3|بÙ\84Ú¯Ù\87|بÙ\84Ú¯Ù\87 یا}}",
+       "widthheightpage": "$1 Ã\97 $2, $3 {{PLURAL:$3|بٱÙ\84Ú¯Ù±|بٱÙ\84Ú¯Ù±یا}}",
        "file-info": "انازه جانیا: $1, MIME type: $2",
        "file-info-size": "$1 × $2 پیکسل, ٱندازٱ فایل: $3, MIME نوع: $4",
-       "file-info-size-pages": "$1 × $2 pixels, انازه جانیا: $3, MIME type: $4, $5 {{PLURAL:$5|بلگه|بلگه یا}}",
+       "file-info-size-pages": "$1 × $2 pixels, ٱندازٱ جانؽا: $3, MIME type: $4, $5 {{PLURAL:$5|بٱلگٱ|بٱلگٱیا}}",
        "file-nohires": "عٱسک ڤٱن بالاترؽ دش نؽ",
        "svg-long-desc": "جانؽا اْس ڤی جی, نومی $1 × $2 پیکسل, ٱندازٱ جانؽا: $3",
        "svg-long-desc-animated": "جانیا جمشدار اس وی جی .نومنا $1 × $2 پيكسل،انازه جانیا:$3",
        "brackets": "[$1]",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "بلگه دمايی",
-       "imgmultipagenext": "بÙ\84Ú¯Ù\87 Ù\86Ù\87ایی",
-       "imgmultigo": "رؤ!",
-       "imgmultigoto": "رو د بلگه $1",
+       "imgmultipagenext": "بٱÙ\84Ú¯Ù± Ø¯Ù\85ایی",
+       "imgmultigo": "رۉ!",
+       "imgmultigoto": "رۉ ڤ بٱلگٱ $1",
        "img-lang-opt": "$2 ($1)",
        "img-lang-default": "(زون پیش زمینه)",
        "img-lang-info": "اوردن ای عسگ د $1 .  $2",
        "watchlistedit-clear-done": "سیل برگتون وه پاک بیه.",
        "watchlistedit-clear-removed": "$1 داسون پاکسا {{PLURAL:$1|بی|بیین}}:",
        "watchlistedit-too-many": "ایچه بلگه یا فره ای سی نشو دئن هئ.",
-       "watchlisttools-clear": "پاک کردن سیل برگ",
-       "watchlisttools-view": "آلشتیا مرتوط نه بوینیت",
-       "watchlisttools-edit": "سیل برگ بوینیتو و ویرایشت بکید",
-       "watchlisttools-raw": "سیل برگ نه ردیفی ویرایشت کو",
+       "watchlisttools-clear": "پاک کردن ساٛلٛ بٱرگ",
+       "watchlisttools-view": "آلشتؽا مٱربوت ناْ بونؽت",
+       "watchlisttools-edit": "ساٛلٛ بٱرگ بوینؽتو ۉ ڤیرایش بٱکؽت",
+       "watchlisttools-raw": "ساٛلٛ بٱرگ ناْ ردیفی ڤیرایش کو",
        "iranian-calendar-m1": "فروردین",
        "iranian-calendar-m2": "اردیبهشت",
        "iranian-calendar-m3": "خرداد",
        "version-libraries-version": "نسقه",
        "redirect": "ڤاگردونی ڤا جانؽا،بٱلگٱیا ڤانیری نوم دؽارکوݩ",
        "redirect-summary": "اؽ بٱلگٱ ڤیژٱ ڤا جانؽا (نوم جانؽا هؽسش)، بٱلگٱ (شمارٱ شناسیار بٱلگٱ یا شمارٱ نۏسخٱ دؽار بیٱ) یا بٱلگٱ کاریاری (شناسؽار عدٱدی کاریاری دؽار بیٱ) ڤاگٱردونی بۊئٱ. تٱرز ڤ کار گرتن: [[{{#Special:Redirect}}/file/Example.jpg]]، \n[[{{#Special:Redirect}}/page/64308]]، [[{{#Special:Redirect}}/revision/328429]] یا [[{{#Special:Redirect}}/user/101]].",
-       "redirect-submit": "رو",
-       "redirect-lookup": "پی جوری:",
-       "redirect-value": "ارزایشت:",
-       "redirect-user": "نوم دياركن کاریار:",
-       "redirect-page": "نوم دیار کن بلگه",
-       "redirect-revision": "وانئری بلگه",
-       "redirect-file": "نوم جانیا",
+       "redirect-submit": "رۉ",
+       "redirect-lookup": "پاٛ جۊرؽ:",
+       "redirect-value": "ٱرزایش:",
+       "redirect-user": "نوم دؽاركن کاریار:",
+       "redirect-page": "نوم دؽار کن بٱلگٱ",
+       "redirect-revision": "ڤانری بٱلگٱ",
+       "redirect-file": "نوم جانؽا",
        "redirect-not-exists": "انازه که پیدا نبی",
        "fileduplicatesearch": "پی جوری سی جانیایا دوکونه",
        "fileduplicatesearch-summary": "پی جوری سی جانیایا تکراری د پایه انازه د یک شیوسه ونو انجومگر بوئه.",
        "tags-active-header": "کنشتگره؟",
        "tags-hitcount-header": "آلشتیا سردیس دار",
        "tags-actions-header": "کنشتکاریا",
-       "tags-active-yes": "هری",
-       "tags-active-no": "Ù\86Ù\87",
+       "tags-active-yes": "عٱ",
+       "tags-active-no": "Ù\86Ù±",
        "tags-source-extension": "تعریف بیه د اساس دمادیس",
        "tags-source-manual": "وه کار گرته بیه وه شکل دسی وا کاریاریا یا بوتیا",
        "tags-source-none": "تر وه کار گرته نموئه",
        "tags-delete": "پاکسا کردن",
        "tags-activate": "کنشتیاری کردن",
        "tags-deactivate": "ناکنشتیاری کردن",
-       "tags-hitcount": "$1 {{PLURAL:$1|آلشت|آلشتیا}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|آلشت|آلشتؽا}}",
        "tags-manage-no-permission": "شما صلا یه نه که آلشت دئن سردیسیا نه دیوونداری بکیت ناریت.",
        "tags-create-heading": "راس کردن یه گل سردیس تازه",
        "tags-create-explanation": "د شکل پیش فرض، سردیسیا تازه ره وندیاری بیه سی وه کار گرتن کاریاریا و رباتیا هان د دسرس.",
        "htmlform-cloner-delete": "ؤرداشتن",
        "htmlform-cloner-required": "سی کمترونه یه گل ارزایشت لازمه",
        "logentry-delete-delete": "$1 بٱلگٱ {{GENDER:$2|پاکسا بیٱ}} $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|}} Ø¨Ù\84Ú¯Ù± $3 Ø¯ Ù\86Û\8f Ø²Ø§Ù\9bنٱ بیٱ",
+       "logentry-delete-restore": "$1 {{GENDER:$2|}} Ø¨Ù±Ù\84Ú¯Ù± $3 Ø¯ Ù\86Û\8a Ø²نٱ بیٱ",
        "logentry-delete-event": "$1 دیاری {{PLURAL:$5|یه گل رخ ون د پهرستنومه|$5 رخ ونیا د پهرستنومه}} نه $3 {{GENDER:$2|آلشتکاری کرد}}: $4",
-       "logentry-delete-revision": "$1 دیاری {{PLURAL:$5|یه گل وانئری|$5 وانئریا}} نه $3 {{GENDER:$2|آلشتکاری کرد}}: $4",
+       "logentry-delete-revision": "$1 دؽاری {{PLURAL:$5|یاٛ ڤانری|$5 ڤانرؽا}} ناْ $3 {{GENDER:$2|آلشتکاری کرد}}: $4",
        "logentry-delete-event-legacy": "$1 دیاری پهرستنومه رخ ونیا نه د $3 {{GENDER:$2|آلشت ده}}",
        "logentry-delete-revision-legacy": "$1 دیاری وانئریا نه د بلگه $3 {{GENDER:$2|آلشت ده}}",
        "logentry-suppress-delete": "$1 $3 نه {{GENDER:$2| پاکساکاری کرد}}",
        "logentry-suppress-revision": "{{GENDER:$2|$1 دیاری {{PLURAL:$5|یه گل وانئری|$5 وانئریا}} نه د $3 نهونی {{GENDER:$2|آلشتکاری کرد}}: $4}}",
        "logentry-suppress-event-legacy": "$1 دیاری پهرستنومه رخ ونیا نه د $3 نهونی {{GENDER:$2|آلشت ده}}",
        "logentry-suppress-revision-legacy": "$1 دیاری نسقه یا $3 نه نهونی {{GENDER:$2|آلشت ده}}",
-       "revdelete-content-hid": "Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ù\82اÙ\85 Ø¨Û\8cÙ\87",
+       "revdelete-content-hid": "Ù\85Û\8cÙ\86Ù\88Ù\86Ù± Ù\82اÛ\8cÙ\85 Ø¨Û\8cÙ±",
        "revdelete-summary-hid": "چکسته ویرایشت قام بیه",
        "revdelete-uname-hid": "نوم کاروری قام بیه",
        "revdelete-content-unhid": "مینونه قام نبیه",
        "logentry-merge-merge": "$1  $3  نه د $4 {{GENDER:$2| سریک سازی کرد}} (نسقه تا  $5)",
        "logentry-move-move": "$1 {{GENDER:$2|جا ڤ جا کردن}} بٱلگٱ $3 ناْ سی $4",
        "logentry-move-move-noredirect": "$1 بٱلگٱ $3 ناْ بؽ یٱ کاْ یاٛ ڤاگٱردونی داشتۊئۉ د $4 {{GENDER:$2|جا ڤ جا کاری کرد}}",
-       "logentry-move-move_redir": "$1 Ø¨Ù\84Ú¯Ù\87 $3 Ù\86Ù\87 Ø¯ $4 Ú©Ù\87 Ù\88اگردÙ\88Ù\86Û\8c Ø¨Û\8c {{GENDER:$2|جا Ù\88Ù\87 جاکاری کرد}}",
+       "logentry-move-move_redir": "$1 Ø¨Ù±Ù\84Ú¯Ù± $3 Ù\86اÙ\92 Ø¯ $4 Ø§Ù\92 Ú¤Ø§Ú¯Ù±Ø±Ø¯Ù\88Ù\86Û\8c Ø¨Û\8c {{GENDER:$2|جا Ú¤ جاکاری کرد}}",
        "logentry-move-move_redir-noredirect": "$1 بلگه $3 نه بی یه که یه گل واگردونی د $4 داشتوئه که یه خوش واگردونی بی {{GENDER:$2|جا وه جاکاری کرد}}",
        "logentry-patrol-patrol": "$1 نسقه $4 بلگه $3 نه چی یه گل چی تیه نئری بیه {{GENDER:$2|نشودار کرد}}",
        "logentry-patrol-patrol-auto": "$1 نۏسخٱ $4 بٱلگٱ $3 ناْ ڤ هال ۉ بار خودٱنجوم چی یاٛ بٱلگٱ تیٱ نیر بیٱ {{GENDER:$2|نشودار کرد}}",
        "logentry-newusers-create": "هساو کاربٱری $1 {{GENDER:$2|دۏرس بی}}",
        "logentry-newusers-create2": "حساو کاریاری $3،وه دس $1 {{GENDER:$2|دروس بی}}",
        "logentry-newusers-byemail": "حساو کاریاری $3 وه دس $1 {{GENDER:$2|ره وندیاری بی}} و رازینه گواردن وا انجومانام کل بی",
-       "logentry-newusers-autocreate": "حساو $1  خودانجومن {{GENDER:$2|دروس بی}}",
+       "logentry-newusers-autocreate": "هساو $1  خودٱنجومٱن {{GENDER:$2|دۏرس بی}}",
        "logentry-rights-rights": "$1 اندوم بیین $3 نه د گرو $4 د $5 {{GENDER:$2|آلشت ده}}",
        "logentry-rights-rights-legacy": "$1 اندوم بیین $3 د گرو نه {{GENDER:$2|آلشت ده}}",
        "logentry-rights-autopromote": "$1 وه شکل خودانجوم $4 نه د $5 {{GENDER:$2|برد واروتر}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|سڤار کردٱ}} $3",
-       "logentry-upload-overwrite": "$1 یه گل نسقه تازه د $3 نه {{GENDER:$2|سوار کرد}}",
+       "logentry-upload-overwrite": "$1 یاٛ نۏسخٱ تازٱ د $3 ناْ {{GENDER:$2|سڤار کرد}}",
        "logentry-upload-revert": "$1 $3 نه {{GENDER:$2|سوارکرد}}",
        "log-name-managetags": "سردیس دیوونداری کردن پهرستنومه",
        "log-description-managetags": "ای بلگه امور دیوونداری مربوط د [[Special:Tags|سردیسیا]] نه نومگه کاری می که. پهرستونمه فقط مینونه داری کنشتکاریاییه که وه دس یه گل دیوونداری و شکل دسی انجوم گرته بان؛شایت سردیسیا وه دس نرم افزار ویکی ره وندیاری بیه بان یا پاکسا بان بی یه که هیچ ورودی د ای پهرستنومه ثبت با.",
        "duration-seconds": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
        "duration-minutes": "$1 {{PLURAL:$1|دیقه|دیقه یا}}",
        "duration-hours": "$1 {{PLURAL:$1|ساعت |ساعتیا}}",
-       "duration-days": "$1{{PLURAL:$1|روز|روزیا}}",
+       "duration-days": "$1{{PLURAL:$1|رۊز|رۊزؽا}}",
        "duration-weeks": "$1 {{PLURAL:$1|هفته|هفته یا}}",
        "duration-years": "$1{{PLURAL:$1| سال|سالیا}}",
        "duration-decades": "$1 {{PLURAL:$1|دأھە|دأھە یا}}",
        "special-characters-title-endash": "خط فاصله",
        "special-characters-title-emdash": "خط فاصله",
        "special-characters-title-minus": "نشون کم کردن",
-       "mw-widgets-titleinput-description-new-page": "بلگه نیئش"
+       "mw-widgets-titleinput-description-new-page": "بلگه نیئش",
+       "randomrootpage": "بٱلگٱ بونچٱک تٱسادوفی"
 }
index 8f7c4a2..2fd6bda 100644 (file)
@@ -16,7 +16,8 @@
                        "Ardzun",
                        "Amjad Khan",
                        "Zakiy",
-                       "Vlad5250"
+                       "Vlad5250",
+                       "S Kartika"
                ]
        },
        "tog-underline": "Garih bawahi tautan:",
        "tog-watchlisthideminor": "Suruakan suntiangan ketek pado daftar pantau",
        "tog-watchlisthideliu": "Suruakan suntiangan pangguno masuak log pado daftar pantau",
        "tog-watchlistreloadautomatically": "Muek ulang daftar pantauan sacaro otomatih katiko sabuah sariangan baubah (paralu JavaScript)",
+       "tog-watchlistunwatchlinks": "Tambahkan panando pantau/indak pantau ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) untuak mamantau laman nan diubah (JavaScript diparaluan untuak manggunoan tombol ko)",
        "tog-watchlisthideanons": "Suruakan suntiangan pangguno anonim pado daftar pantau",
        "tog-watchlisthidepatrolled": "Suruakan suntiangan tapatroli pado daftar pantau",
+       "tog-watchlisthidecategorization": "Suruakan kategorisasi laman",
        "tog-ccmeonemails": "Kiriman Ambo salinan surel nan dikiriman ka urang lain",
        "tog-diffonly": "Jan tampilan isi laman di bawah pabedoan suntiangan",
        "tog-showhiddencats": "Tunjuakan kategori tasuruak",
        "tog-norollbackdiff": "Jan tampilan pabedoan sasudah malakukan pangambalian",
        "tog-useeditwarning": "Ingekan denai kok denai maninggakan laman suntiang sabalun manyimpan parubahan",
+       "tog-prefershttps": "Selalu gunokan koneksi aman katiko masuak log",
        "underline-always": "Taruih",
        "underline-never": "Indak pernah",
        "underline-default": "Kulik atau pangaturan paramban web",
        "newwindow": "(bukak di jendela baru)",
        "cancel": "Batalkan",
        "moredotdotdot": "Lainnyo...",
-       "morenotlisted": "Salabiahnyo...",
+       "morenotlisted": "Daftar ko mungkin indak langkok.",
        "mypage": "Laman",
        "mytalk": "Maota",
        "anontalk": "Rundiang IP ko",
        "searcharticle": "Tuju",
        "history": "Riwayaik laman",
        "history_short": "Riwayaik",
+       "history_small": "riwayaik",
        "updatedmarker": "diubah samanjak kunjuangan tarakhia ambo",
        "printableversion": "Versi cetak",
        "permalink": "Pautan parmanen",
        "view": "Baco",
        "view-foreign": "Caliak di $1",
        "edit": "Suntiang",
+       "edit-local": "Suntiang sumber deskripsi lokal",
        "create": "Buek",
        "create-local": "Tambah sumber deskripsi lokal",
        "delete": "Hapuih",
        "talk": "Rundiang",
        "views": "Caliak",
        "toolbox": "Pakakeh",
+       "tool-link-userrights": "Ubah kalompok {{GENDER:$1|user}}",
+       "tool-link-userrights-readonly": "Caliak kalompok {{GENDER:$1|user}}",
+       "tool-link-emailuser": "Kirim surel ka {{GENDER:$1|panggun}} ko",
        "imagepage": "Caliak laman berkas",
        "mediawikipage": "Caliak laman pasan",
        "templatepage": "Caliak laman templat",
        "jumptonavigation": "navigasi",
        "jumptosearch": "cari",
        "view-pool-error": "Maaf, server sadang kalabiahan baban.\nBanyak bana nan barusaho mancaliak laman ko.\nTunggu santa koq nio mancubo baliak ka laman ko.\n\n$1",
+       "generic-pool-error": "Maaf, server sadang kalabiahan baban.\nBanyak bana nan barusaho mancaliak laman ko.\nTunggu santa kok nio mancubo baliak ka laman ko.",
        "pool-timeout": "Abih wakatu",
        "pool-queuefull": "Antrian panuah",
        "pool-errorunknown": "Kasalahan indak jaleh",
+       "pool-servererror": "Layanan penghitung pool ini tidak tersedia ($1).",
+       "poolcounter-usage-error": "Galat penggunaan: $1",
        "aboutsite": "Tantang {{SITENAME}}",
        "aboutpage": "Project:Tantang_{{SITENAME}}",
        "copyright": "Isi tasadio dalam $1",
        "disclaimers": "Sanggahan umum",
        "disclaimerpage": "Project:Sanggahan umum",
        "edithelp": "Bantuan suntiangan",
+       "helppage-top-gethelp": "Bantuan",
        "mainpage": "Palanta",
        "mainpage-description": "Palanta",
        "policy-url": "Project:Kabijakan jo padoman",
        "hidetoc": "suruakan",
        "collapsible-collapse": "Ketekan",
        "collapsible-expand": "Kambangan",
+       "confirmable-confirm": "Lai yakin {{GENDER:$1|you}}?",
+       "confirmable-yes": "Yo",
+       "confirmable-no": "Indak",
        "thisisdeleted": "Caliak atau kambalian $1?",
        "viewdeleted": "Caliak $1?",
        "restorelink": "{{PLURAL:$1|$1 suntiangan}} lah dihapuih",
        "nospecialpagetext": "<strong>Sanak mamintak laman istimewa nan indak sah.</strong>\n\nDaftar laman istimewa nan sah dapek dicaliak di [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kasalahan",
        "databaseerror": "Kasalahan basis data",
+       "databaseerror-function": "Fungsi: $1",
        "databaseerror-error": "تېروتنه: $1",
+       "transaction-duration-limit-exceeded": "Untuak mancagah panundoan replikasi yang tinggi, pangiriman ko dibatalan karano lamo panulihan $1 malabiahi bateh $2.\nJiko sanak nio maubah banyak hal dalam sakali ubah, cubo lakuan dalam operasi yang labiah ketek.",
        "laggedslavemode": "Paringatan: Laman mungkin indak barisi parubahan tabaru.",
        "readonly": "Basis data dikunci",
        "enterlockreason": "Masuakkan alasan panguncian, tamasuak pakiraan bilo kunci akan dibuka",
        "missingarticle-rev": "(revisi#: $1)",
        "missingarticle-diff": "(Bedo: $1, $2)",
        "readonly_lag": "Basis data alah dikunci otomatis salagi basis data sakunder malakukan sinkronisasi jo basis data utamo",
+       "nonwrite-api-promise-error": "Kapalo HTTP 'Promise-Non-Write-API-Action' alah dikirim tapi permintaan dibuek untuak model panulihan API.",
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kasalahan internal: $1",
+       "internalerror-fatal-exception": "Pangacualian fatal dalam mangetik \"$1\"",
        "filecopyerror": "Indak dapek manyalin berkas \"$1\" ke \"$2\".",
        "filerenameerror": "Indak dapek maubah namo berkas \"$1\" manjadi \"$2\".",
        "filedeleteerror": "Indak dapek mahapuih berkas \"$1\".",
        "directorycreateerror": "Indak dapek mambuek direktori \"$1\".",
+       "directoryreadonlyerror": "Direktori \"$1\" hanyo-dibaco.",
+       "directorynotreadableerror": "Direktori \"$1\" indak bisa dibaco.",
        "filenotfound": "Indak dapek manamukan berkas \"$1\".",
        "unexpected": "Nilai di lua jangkauan: \"$1\"=\"$2\".",
        "formerror": "Kasalahan: Indak dapek mangiriman formulir",
        "badarticleerror": "Tindakan iko indak dapek dilaksanakan di laman iko.",
        "cannotdelete": "Laman atau berkas \"$1\" indak dapek dihapuih.\nMungkin alah dihapuih jo urang lain.",
        "cannotdelete-title": "Indak dapek mangapuih laman \"$1\"",
+       "delete-scheduled": "Laman \"$1\" dijadwalan untuak diapuih. Mohon basaba.",
        "delete-hook-aborted": "Pengapusan batal jo hook.\nIndak ado keterangan.",
        "badtitle": "Judul indak sah",
        "badtitletext": "Pamintaan judul laman indak sah, kosong, atau antarbaso atau antarwiki nan salah sambuang. Mungkin juo ado kandungan karakter nan indak buliah digunoan untuak judul.",
+       "title-invalid-empty": "Judul halaman yang dimintak kosong atau hanyo barisi namo sabuah ruang namo.",
+       "title-invalid-utf8": "Judul halaman yang dimintak barisi rangkaian UTF-8 yang indak sah.",
+       "title-invalid-interwiki": "Judul laman yang dimintak barisi pranala diantaro wiki yang indak bisa digunoan dalam judul.",
+       "title-invalid-talk-namespace": "Judul laman yang dimintak marujuak ka halaman pambicaroan yang indak dapek tasadio.",
+       "title-invalid-characters": "Judul laman yang dimintak barisi karakter yang indak sah:\"$1\".",
+       "title-invalid-relative": "Judul manganduang alaman relatif. Halaman relatif (./, ../) indak sah, karano dapek mangalami kagagalan katiko ditangani dek paramban pangguno.",
+       "title-invalid-magic-tilde": "Judul halaman manganduang rangkaian tilda yang indak sah (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Judul halaman panjang bana. Harusnyo indak buliah labiah dari $1 {{PLURAL:$1|byte|bytes}} di pangodean UTF-8.",
+       "title-invalid-leading-colon": "Judul laman yang dimintak dimulai dek tando titiak duo tu indak sah.",
        "perfcached": "Data barikuik ko diambiak dari singgahan dan mungkin indak data nan baru. Nan tabanyak dari {{PLURAL:$1|$1 hasilnyo}} ado di singgahan.",
        "perfcachedts": "Data barikuik ko singgahan, dan tarakhia dipabarui tanggal $1. Nan tabanyak dari tanggal {{PLURAL:$1|$1}}, hasilnyo ado di singgahan.",
        "querypage-no-updates": "Pamutakhiran dari laman ko sadang dimatian. Data nan ado di siko kini ko indak akan dimuaik ulang.",
        "viewyourtext": "Sanak dapek mancaliak jo mangkopi sumber untuak \"suntiangan sanak\" ka laman ko",
        "protectedinterface": "Laman ko baisi teks antarmuko untuak digunoan dek parangkaik lunak di wiki ko sajo, dan alah dikunci untuak maindaan kasalahan. \nUntuak manambah atau maubah tajamahan di kasado wiki, harap gunoan [https://translatewiki.net/ translatewiki.net], yaitu proyek palokalan MediaWiki.",
        "editinginterface": "'''Paringatan:''' Sanak manyuntiang laman nan digunoan untuak manyadiokan teks antarmuko untuak parangkaik lunak.\nParubahan teks ko akan mampangaruhi tampilan pado antarmuko pangguno untuak pangguno lain.\nUntuak tajamahan, harap gunoan [https://translatewiki.net/wiki/Main_Page?setlang=min translatewiki.net], proyek palokalan MediaWiki.",
+       "translateinterface": "Untuak manambah atau maubah sadolah wiki, mohon gunoan [https://translatewiki.net/ translatewiki.net], proyek palokalan MediaWiki.",
        "cascadeprotected": "Laman iko alah dilindungi dari panyuntiangan karano disartokan di {{PLURAL:$1|laman}} barikuik nan alah dilindungi jo opsi \"runtun\":\n$2",
        "namespaceprotected": "Sanak indak mampunyoi hak akses untuak manyuntiang laman di ruang namo '''$1'''.",
        "customcssprotected": "Sanak indak mampunyoi izin untuak maubah laman CSS iko, karano manganduang pangaturan pribadi pangguno lain.",
+       "customjsonprotected": "Sanak indak mampunyoi izin untuak maubah laman JSON ko karano barisi pangaturan pribadi pangguno lain.",
        "customjsprotected": "Sanak ndak mampunyo izin untuak maubah laman JavaScript iko, karano manganduang pangaturan pribadi pangguno lain.",
+       "sitecssprotected": "Sanak indak mampunyoi izin untuak maubah halaman CSS ko karano bisa mampangaruhi sadolah pangunjuang.",
+       "sitejsonprotected": "Sanak indak mampunyoi izin untuak maubah halaman JSON ko karano mampangaruhi sadolah pangunjuang.",
+       "sitejsprotected": "Sanak indak mampunyoi izin untuak maubah halaman JavaScript karano mampangaruhi sadolah pangunjuang.",
+       "mycustomcssprotected": "Sanak indak mampunyoi izin untuak maubah halaman CSS ko.",
+       "mycustomjsonprotected": "Sanak indak mampunyoi izin untuak manyuntiang halaman JSON ko.",
+       "mycustomjsprotected": "Sanak indak mampunyoi izin untuak manyuntiang halaman JavaScript ko.",
+       "myprivateinfoprotected": "Sanak indak mampunyoi izin untuak manyuntiang informasi pribadi Sanak.",
+       "mypreferencesprotected": "Sanak indak mampunyoi izin untuak manyuntiang preferensi Sanak.",
        "ns-specialprotected": "Laman istimewa indak dapek disuntiang.",
        "titleprotected": "Judul ko dilinduangi dari dibuek jo [[User:$1|$1]].\nAlasannyo adolah <em>$2</em>.",
-       "filereadonlyerror": "Indak bisa mangubah berkas \"$1\" karano repositori berkas \"$2\" dalam mode baco-sajo.\n\nPangurus nan manguncinyo manawarkan panjalehan: \"$3\"",
+       "filereadonlyerror": "Indak bisa mangubah berkas \"$1\" karano repositori berkas \"$2\" dalam mode baco-sajo.\n\nPanguruih nan manguncinyo manawarkan panjalehan: \"$3\"",
+       "invalidtitle": "Judul indak sah",
        "invalidtitle-knownnamespace": "↓Judul nan indak sah jo ruangnamo \"$2\" dan teks \"$3\"",
        "invalidtitle-unknownnamespace": "Judul nan tak sah jo nomor ruang namo indak diketahui $1 dan teks \"$2\"",
        "exception-nologin": "Indak masuak log",
        "exception-nologin-text": "Laman ko hanyo dapek disuntiang dek pangguno nan mandaftar.",
+       "exception-nologin-text-manual": "Silakan $1 untuak mangakses halaman atau tindakan ko.",
        "virus-badscanner": "Kasalahan konfigurasi: pamindai virus indak dikenal: ''$1''",
        "virus-scanfailed": "Pamindaian gagal (kode $1)",
        "virus-unknownscanner": "Antivirus indak dikenal:",
        "logouttext": "'''Sanak alah kalua log dari sistem.'''\n\nSanak dapek taruih manggunoan {{SITENAME}} sacaro anonim, atau Sanak dapek <span class='plainlinks'>[$1 masuak log liak]</span> sabagai pangguno nan samo atau pangguno nan lain.\nParhatian bahawa bara laman mungkin masih taruih manunjukkan bahawa Sanak masih masuak log sampai Sanak mambarasihan singgahan panjelajah web Sanak.",
+       "cannotlogoutnow-title": "Indak bisa kalua kini",
+       "cannotlogoutnow-text": "Indak bisa kalua katiko manggunoan $1.",
        "welcomeuser": "Salamaik datang, $1!",
        "welcomecreation-msg": "Akun Sanak alah dibuek. Jan lupo maubah [[Special:Preferences|pangaturan {{SITENAME}}]] Sanak.",
        "yourname": "Namo pangguno:",
        "userlogin-yourname": "Namo pangguno",
        "userlogin-yourname-ph": "Masuakan namo pangguno",
+       "createacct-another-username-ph": "Masuakan namo pangguno",
        "yourpassword": "Kato sandi:",
        "userlogin-yourpassword": "Kato sandi",
        "userlogin-yourpassword-ph": "Masuakan kato sandi",
        "createacct-yourpasswordagain-ph": "Masuakan lai kato sandi",
        "userlogin-remembermypassword": "Biakan ambo tetap masuak",
        "userlogin-signwithsecure": "Gunoan server aman",
+       "cannotlogin-title": "Indak bisa masuak",
+       "cannotlogin-text": "Indak mamungkinkan untuak masuak.",
+       "cannotloginnow-title": "Indak bisa masuak kini",
+       "cannotloginnow-text": "Indak bisa masuak katiko manggunoan $1.",
+       "cannotcreateaccount-title": "Indak bisa mambuek akun",
+       "cannotcreateaccount-text": "Mambuek akun sacaro langsuang indak diaktifan di wiki ko.",
        "yourdomainname": "Domain Sanak:",
        "password-change-forbidden": "Sanak indak dapek maubah kato sandi di wiki ko.",
        "externaldberror": "Alah tajadi kasalahan otentikasi basis data eksternal atau Sanak indak diizinan malakuan pabaruan tahadok akun eksternal Sanak.",
        "login": "Masuak log",
+       "login-security": "Buktian indentitas sanak",
        "nav-login-createaccount": "Masuak log / buek akun",
        "logout": "Kalua log",
        "userlogout": "Kalua log",
        "createaccount": "Buek akun",
        "userlogin-resetpassword-link": "Lupo kato sandi Sanak?",
        "userlogin-helplink2": "Bantuan masuak log",
+       "userlogin-loggedin": "Sanak alah masuak sabagai {{GENDER:$1|$1}}. Gunoan formulir di bawah untuak masuak sabagai pangguno lain.",
+       "userlogin-reauth": "Sanak harus masuak baliak untuk mambuktian Sanak adolah {{GENDER:$1|$1}}.",
+       "userlogin-createanother": "Buek akun yang lain",
        "createacct-emailrequired": "Alamaik surel",
        "createacct-emailoptional": "Alamaik surel (opsional)",
        "createacct-email-ph": "Masuakan alamaik surel Sanak",
+       "createacct-another-email-ph": "Masuakan alamaik surel",
        "createaccountmail": "Pakai kato sandi sumbarang samantaro, lalu kirim ka alamaik surel nan di bawah ko",
+       "createaccountmail-help": "Indak dapek digunoan untuak mambuek akun urang lain tanpa tau kato sandinyo.",
        "createacct-realname": "Namo asli (opsional)",
        "createacct-reason": "Alasan",
        "createacct-reason-ph": "Manga Sanak mambuek akun lain",
        "createacct-submit": "Buek akun Sanak",
        "createacct-another-submit": "ګڼون جوړول",
+       "createacct-continue-submit": "Lanjuikan mambuek akun",
+       "createacct-another-continue-submit": "Lanjuikan mambuek akun",
        "createacct-benefit-heading": "{{SITENAME}} dibuek dek urang-urang saroman Sanak.",
        "createacct-benefit-body1": "{{PLURAL:$1|suntiangan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|laman}}",
        "createacct-benefit-body3": "{{PLURAL:$1|panyuntiang}} tarakhia",
        "badretype": "Kato sandi nan Sanak masuakan salah.",
        "userexists": "Namo pangguno nan dipiliah alah tapakai.\nPiliah namo nan lain.",
+       "createacct-normalization": "Namo pangguno sanak akan disasuaian manjadi \"$2\" karano batasan teknis.",
        "loginerror": "Kasalahan masuak log",
        "createacct-error": "Pambuatan akun gagal",
        "createaccounterror": "Indak dapek mambuek akun: $1",
        "nocookiesnew": "Akun pangguno alah dibuek, tapi Sanak alun masuak log.\n{{SITENAME}} manggunokan cookies untuak log pangguno.\nPangaturan cookie Sanak nonaktif.\nAktifan dulu, sasudah tu baru masuak log jo namo pangguno dan kato sandi baru Sanak.",
        "nocookieslogin": "{{SITENAME}} manggunokan cookies untuak log pangguno.\nPangaturan cookie paramban Sanak nonaktif.\nAktifan dulu dan cubo baliak.",
        "nocookiesfornew": "Akun pangguno indak dibuek karano kami indak dapek mamastian sumbernyo.\nPastian Sanak alah mangaktifan cokies, lalu muek ulang laman ko dan cubo baliak.",
+       "createacct-loginerror": "Akun alah salasai dibuek tapi Sanak indak dapek langsuang masuak sacaro otomatis. Mohon taruihan ka [[Special:UserLogin|manual login]].",
        "noname": "Namo pangguno nan Sanak masuakan indak sah.",
        "loginsuccesstitle": "Bahasil masuak log",
        "loginsuccess": "'''Sanak kini lah masuak log di {{SITENAME}} sabagai \"$1\".'''",
        "wrongpassword": "Kato sandi nan Sanak masuakan salah. Cubolah baliak.",
        "wrongpasswordempty": "Sanak indak mamasuakan kato sandi. Cubolah baliak.",
        "passwordtooshort": "Kato sandi paliang indak harus tadiri dari {{PLURAL:$1|$1 karakter}}.",
+       "passwordtoolong": "Kato sandi indak buliah labiah dari {{PLURAL:$1|1 character|$1 characters}}.",
+       "passwordtoopopular": "Kato sandi yang umum indak dapek digunoan. Mohon piliah kato sandi yang labiah sulik untuak ditakok.",
+       "passwordinlargeblacklist": "Kato sandi yang dimasuakan adolah kato sandi yang umum. Mohon gunoan kato sandi yang labiah unik.",
        "password-name-match": "Kato sandi Sanak harus babedo dari namo pangguno Sanak.",
        "password-login-forbidden": "Panggunoan namo pangguno dan sandi ko alah dilarang.",
        "mailmypassword": "Kirim kato sandi baru",
        "createaccount-text": "Sasaurang alah mambuek sabuah akun untuak alamaik surel Sanak di {{SITENAME}} ($4) jo namo \"$2\" dan kato sandi \"$3\". Sanak dianjuakan untuak masuak log dan mangganti kato sandi Sanak kini.\n\nSanak dapek mangacuahkan pasan ko jikok akun ko dibuek dek ado kasalahan.",
        "login-throttled": "Sanak alah bakali-kali mancubo masuak log.\nTunggulah sabanta sabalun mancubo baliak.",
        "login-abort-generic": "Proses masuak Sanak indak barasil - Dibatalan",
+       "login-migrated-generic": "Akun sanak alah dipindahan, namo pangguno Sanak alah indak tadaftar ini wiki ko.",
        "loginlanguagelabel": "Baso: $1",
        "suspicious-userlogout": "Pamintaan Sanak untuak kalua log ditulak karano tampaknyo dikirim oleh paramban nan rusak atau proksi panyinggah.",
        "pt-login": "Masuak log",
        "pt-login-button": "Masuak log",
+       "pt-login-continue-button": "Lanjuikan masuak log",
        "pt-createaccount": "Buek akun",
        "pt-userlogout": "Kalua log",
        "php-mail-error-unknown": "Kasalahan nan indak jaleh dalam fungsi mail() PHP",
        "user-mail-no-addy": "Mancubo mangirim surel tanpa alamaik surel.",
        "user-mail-no-body": "Mancubo mangirim surel kosong atau pasan talalu pendek",
        "changepassword": "Tuka kato sandi",
-       "resetpass_announce": "Sanak alah masauk log jo kode samantaro nan dikirim malalui surel. Untuak malanjuikan, Sanak harus mamasuakan kato sandi baru di siko:",
+       "resetpass_announce": "Untuak manyalasaian masuak log, Sanak harus mamasuakan kato sandi baru.",
        "resetpass_header": "Tuka kato sandi akun",
        "oldpassword": "Kato sandi lamo:",
        "newpassword": "Kato sandi baharu:",
        "retypenew": "Ketik ulang kato sandi baharu:",
        "resetpass_submit": "Atua kato sandi dan masuak log",
-       "changepassword-success": "Kato sandi Sanak alah berhasil dituka!\nKini mamproses masuak log Sanak...",
+       "changepassword-success": "Kato sandi Sanak alah berhasil dituka!",
+       "changepassword-throttled": "Sanak alah acok bana mancubo masuak log. Mohon tunggu $1 sabalun mancubo baliak.",
+       "botpasswords": "Kato sandi bot",
+       "botpasswords-disabled": "Kato sandi bot indak diaktifan.",
+       "botpasswords-no-central-id": "Untuak manggunoan kato sandi bot, Sanak harus masuak log ka akun yang alah disentralisasi.",
+       "botpasswords-existing": "Kato sandi bot tasadio",
+       "botpasswords-createnew": "Buek kato sandi bot yang baru",
+       "botpasswords-editexisting": "Ubah kato sandi bot yang alah ado",
+       "botpasswords-label-needsreset": "(kato sandi paralu di atua ulang)",
+       "botpasswords-label-appid": "Namo bot:",
+       "botpasswords-label-create": "Buek",
+       "botpasswords-label-update": "Pabarui",
+       "botpasswords-label-cancel": "Batalan",
+       "botpasswords-label-delete": "Hapuih",
+       "botpasswords-label-resetpassword": "Setel ulang kato sandi",
+       "botpasswords-bad-appid": "Namo bot \"$1\" indak sah.",
+       "botpasswords-insert-failed": "Gagal manambah namo bot \"$1\". Alah ditambahan sabalun iko?",
+       "botpasswords-update-failed": "Gagal mampabarui namo bot \"$1\". Pernah dihapuih sabalunnyo?",
+       "botpasswords-created-title": "Kato sandi bot alah dibuek",
+       "botpasswords-created-body": "Kato sandi untuak bot \"$1\" dari {{GENDER:$2|user}} \"$2\" berhasil dibuek.",
+       "botpasswords-updated-title": "Kato sandi bot alah dipabarui",
+       "botpasswords-updated-body": "Kato sandi untuak bot \"$1\" dari {{GENDER:$2|user}} \"$2\" alah dipabarui.",
+       "botpasswords-deleted-title": "Kato sandi bot dihapuih",
+       "botpasswords-deleted-body": "Kato sandi untuak bot \"$1\" dari {{GENDER:$2|user}} \"$2\" berhasil dihapuih.",
+       "botpasswords-restriction-failed": "Bateh dalam kato sandi mangahalangi masuak log ko.",
+       "botpasswords-invalid-name": "Namo pangguno yang diaagiah indak manganduang pamisah kato sandi bot (\"$1\").",
+       "botpasswords-not-exist": "Pangguno \"$1\" indak mampunyoi kato sandi bot banamo \"$2\".",
+       "botpasswords-needs-reset": "Kato sandi untuak bot \"$2\" dari {{GENDER:$1|user}} \"$1\" harus di atur ulang.",
+       "botpasswords-locked": "Sanak indak dapek masuak log jo kato sando bot karano akun Sanak dikunci.",
        "resetpass_forbidden": "Kato sandi indak dapek dituka",
+       "resetpass_forbidden-reason": "Kato sandi indak dapek dituka:$1",
        "resetpass-no-info": "Sanak harus masuak log untuak mangakses laman iko sacara langsuang.",
        "resetpass-submit-loggedin": "Tuka kato sandi",
        "resetpass-submit-cancel": "Batalkan",
        "resetpass-wrong-oldpass": "Kato sandi indak sah.\nSanak mungkin alah berhasil mangganti kato sandi Sanak atau alah maminto kato sandi samantaro nan baharu.",
+       "resetpass-recycled": "Mohon ubah kato sandi Sanak jo nan lain dari kato sandi kini ko.",
        "resetpass-temp-password": "Kato sandi samantaro:",
        "resetpass-abort-generic": "Parubahan kato sandi alah dibatalan dek ekstensi.",
+       "resetpass-expired": "Kato sandi sanak alah kadaluarsa. Mohon atur ulang kato sandi baru untuak masuak log.",
        "passwordreset": "Setel ulang kato sandi",
        "passwordreset-text-one": "Lengkapkan formulir ko untuak manuka baliak kato sandi Sanak.",
        "passwordreset-text-many": "{{PLURAL:$1|Masuakan data di bawah ko untuak manuka baliak kato sandi Sanak.}}",
index ab650e2..9fc3e13 100644 (file)
        "badretype": "Внесените лозинки не се совпаѓаат.",
        "usernameinprogress": "Создавањето на сметката за овој корисник е веќе во тек.\nПочекајте.",
        "userexists": "Корисничкото име што го внесовте е зафатено.\nИзберете друго име.",
+       "createacct-normalization": "Вашето корисничко име ќе биде прилагодено во „$2“ поради техничките ограничувања.",
        "loginerror": "Грешка при најавувањето",
        "createacct-error": "Грешка во создавањето на сметката",
        "createaccounterror": "Не можам да ја создадам сметката: $1",
        "resetpass-no-info": "Мора да сте најавени ако сакате да имате директен пристап до оваа страница.",
        "resetpass-submit-loggedin": "Смени лозинка",
        "resetpass-submit-cancel": "Откажи",
-       "resetpass-wrong-oldpass": "Погрешна привремена или тековна лозинка.\nМожеби веќе ја имате успешно променето вашата лизинка или сте побарале нова привремена лозинка.",
+       "resetpass-wrong-oldpass": "Погрешна привремена или тековна лозинка.\nМожеби веќе ја имате променето вашата лозинка или сте побарале нова привремена лозинка.",
        "resetpass-recycled": "Задајте друга лозинка, поинаква од сегашната.",
        "resetpass-temp-emailed": "Се највивте со привремен код што ви го дадовме по е-пошта.\nЗа да ја довршите најавата, ќе мора тука да зададете нова лозинка:",
        "resetpass-temp-password": "Привремена лозинка:",
        "mergehistory-from": "Изворна страница:",
        "mergehistory-into": "Целна страница:",
        "mergehistory-list": "Спојлива историја на уредување",
-       "mergehistory-merge": "СледниÑ\82е Ð¿Ñ\80еÑ\80абоÑ\82ки Ð½Ð° [[:$1]] Ð¼Ð¾Ð¶Ð°Ñ\82 Ð´Ð° Ñ\81е Ñ\81поÑ\98аÑ\82 Ð²Ð¾ [[:$2]].\nÐ\98збеÑ\80еÑ\82е Ð³Ð¸ Ñ\81амо Ð¾Ð½Ð¸Ðµ Ð¿Ñ\80еÑ\80абоÑ\82ки ÐºÐ¾Ð¸ Ñ\81е Ñ\81оздадени Ð¿Ñ\80ед Ð½Ð°Ð·Ð½Ð°Ñ\87еноÑ\82о Ð²Ñ\80еме.\nÐ\9fÑ\80едÑ\83пÑ\80едÑ\83ваме Ð´ÐµÐºÐ° Ð°ÐºÐ¾ Ð³Ð¸ ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð½Ð°Ð²Ð¸Ð³Ð°Ñ\86ионите врски, изборот ќе се изгуби.",
+       "mergehistory-merge": "СледниÑ\82е Ð¿Ñ\80еÑ\80абоÑ\82ки Ð½Ð° [[:$1]] Ð¼Ð¾Ð¶Ð°Ñ\82 Ð´Ð° Ñ\81е Ñ\81поÑ\98аÑ\82 Ð²Ð¾ [[:$2]].\nÐ\98збеÑ\80еÑ\82е Ð³Ð¸ Ñ\81амо Ð¾Ð½Ð¸Ðµ Ð¿Ñ\80еÑ\80абоÑ\82ки ÐºÐ¾Ð¸ Ñ\81е Ñ\81оздадени Ð¿Ñ\80ед Ð½Ð°Ð·Ð½Ð°Ñ\87еноÑ\82о Ð²Ñ\80еме.\nÐ\9fÑ\80едÑ\83пÑ\80едÑ\83ваме Ð´ÐµÐºÐ° Ð°ÐºÐ¾ Ð³Ð¸ ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¿Ñ\80егелдниÑ\87ките врски, изборот ќе се изгуби.",
        "mergehistory-go": "Приказ на уредувања кои можат да се спојат",
        "mergehistory-submit": "Спојување на преработки",
        "mergehistory-empty": "Нема преработки кои можат да се спојат.",
        "grant-oversight": "Скривање на корисници и преработки",
        "grant-patrol": "Патрола на промени во страници",
        "grant-privateinfo": "Пристап до лични информации",
-       "grant-protect": "Заштита на незаштитени страници",
+       "grant-protect": "Заштитување и одзаштитување страници",
        "grant-rollback": "Отповикување на промени во страници",
        "grant-sendemail": "Испраќање на е-пошта до други корисници",
        "grant-uploadeditmovefile": "Подигање, замена и преместување на податотеки",
        "notvisiblerev": "Преработката била избришана",
        "watchlist-details": "Во вашите набљудувани имате {{PLURAL:$1|$1 страница|$1 страници}} (не броејќи ги разговорните страници).",
        "wlheader-enotif": "Известувањето по е-пошта е вклучено.",
-       "wlheader-showupdated": "Страниците што се изменети од вашата последна посета се прикажани со '''задебелени''' букви",
+       "wlheader-showupdated": "Страниците кои се променети од вашата последна посета се прикажани со <strong>задебелени</strong> букви.",
        "wlnote": "Подолу {{PLURAL:$1|е прикажана последната промена|се прикажани последните <strong>$1</strong> промени}} во {{PLURAL:$2|последниов час|последниве <strong>$2</strong> часа}}, заклучно со $3, $4 ч.",
        "wlshowlast": "Прикажи ги последните $1 часа, $2 дена,",
        "watchlist-hide": "Скриј",
index 895c600..944debb 100644 (file)
        "badretype": "Wprowadzone hasła różnią się między sobą.",
        "usernameinprogress": "Tworzenie konta dla tej nazwy użytkownika jest już w toku.\nProszę czekać.",
        "userexists": "Wybrana przez Ciebie nazwa użytkownika jest już zajęta.\nWybierz inną nazwę użytkownika.",
+       "createacct-normalization": "Twoja nazwa użytkownika zostanie zmieniona na „$2” ze względu na ograniczenia techniczne.",
        "loginerror": "Błąd logowania",
        "createacct-error": "Błąd tworzenia konta",
        "createaccounterror": "Nie można utworzyć konta: $1",
        "ipb-confirm": "Potwierdzam blokadę",
        "ipb-sitewide": "Całkowita",
        "ipb-partial": "Częściowa",
+       "ipb-sitewide-help": "Wszystkie strony na wiki i wszystkie akcje inne edycyjne.",
+       "ipb-partial-help": "Konkretne strony lub przestrzenie nazw.",
        "ipb-pages-label": "Strony",
        "ipb-namespaces-label": "Przestrzenie nazw",
        "badipaddress": "Niepoprawny adres IP",
        "logentry-rights-autopromote": "$1 automatycznie {{GENDER:$2|zmienił|zmieniła}} przynależność z $4 do $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|przesłał|przesłała}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|przesłał|przesłała}} nową wersję $3",
-       "logentry-upload-revert": "$1 {{GENDER:$2|przesłał|przesłała}} $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|przywrócił|przywróciła}} starszą wersję $3",
        "log-name-managetags": "Rejestr zarządzania znacznikami",
        "log-description-managetags": "Na tej stronie są wymienione zadania związane z zarządzaniem [[Special:Tags|znacznikami]]. Dziennik (log) zawiera tylko działania wykonane ręcznie przez administratora; znaczniki mogą być tworzone lub usuwane przez oprogramowanie wiki bez dodawania wpisów w dzienniku (logu).",
        "logentry-managetags-create": "$1 {{GENDER:$2|utworzył|utworzyła}} znacznik „$4”",
        "log-action-filter-suppress-reblock": "Ukrycie użytkownika poprzez ponowną blokadę",
        "log-action-filter-upload-upload": "Nowe przesłane",
        "log-action-filter-upload-overwrite": "Przesłane ponownie",
+       "log-action-filter-upload-revert": "Przywrócenie poprzedniej wersji",
        "authmanager-authn-not-in-progress": "Tworzenie konta nie jest wykonywane lub dane sesji zostały utracone. Zacznij od początku.",
        "authmanager-authn-no-primary": "Podane dane nie mogą być użyte do kontroli poświadczeń.",
        "authmanager-authn-no-local-user": "Żaden użytkownik nie korzysta z tych danych.",
        "passwordpolicies-policy-maximalpasswordlength": "Hasło musi mieć mniej niż $1 {{PLURAL:$1|znak|znaki|znaków}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Hasło nie może być {{PLURAL:$1|popularne|na liście $1 popularnych haseł}}",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Hasło nie może znajdować się na liście 100 000 najczęściej używanych haseł.",
+       "passwordpolicies-policyflag-forcechange": "musi zmienić po zalogowaniu",
        "easydeflate-invaliddeflate": "Dostarczona zawartość nie jest poprawnie skompresowana",
        "unprotected-js": "Ze względów bezpieczeństwa kod JavaScript nie może zostać załadowany z niezabezpieczonych stron. Prosimy dodawać JavaScript w przestrzeni MediaWiki lub jako podstronę strony użytkownika."
 }
index d48bd94..3245afe 100644 (file)
        "passwordpolicies-policy-passwordcannotbepopular": "Password policy that enforces that a password is not in a list of $1 number of \"popular\" passwords. $1 - number of popular passwords the password will be checked against",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Password policy that enforces that a password is not in a list of 100,000 number of \"popular\" passwords.",
        "passwordpolicies-policyflag-forcechange": "Password policy flag that enforces changing invalid passwords on login.",
+       "passwordpolicies-policyflag-suggestchangeonlogin": "Password policy flag that suggests changing invalid passwords on login.",
        "easydeflate-invaliddeflate": "Error message if the content passed to easydeflate was not deflated (compressed) properly",
        "unprotected-js": "Error message shown when trying to load javascript via action=raw that is not protected"
 }
index 6e5837c..3680088 100644 (file)
        "publishchanges": "Бигэргэт",
        "savearticle-start": "Сирэйи бигэргэт...",
        "savechanges-start": "Уларытыылары бигэргэтии...",
+       "publishpage-start": "Сирэйи бэчээттииргэ...",
+       "publishchanges-start": "Уларытыылары бэчээттииргэ...",
        "preview": "Холоон көрүү",
        "showpreview": "Уларытыах иннинэ көрүү",
        "showdiff": "Уларытыылар",
        "editpage-invalidcontentmodel-text": "«$1» иһинээҕитин мадьыала өйөммөт эбит.",
        "editpage-notsupportedcontentformat-title": "Иһинээҕитин формаата өйөммөт эбит",
        "editpage-notsupportedcontentformat-text": "$2 иһинээҕитин модела $1 иһинээҕитин формаатын өйөөбөт эбит.",
+       "slot-name-main": "Сүрүн",
        "content-model-wikitext": "биики-тиэкис",
        "content-model-text": "көннөрү тиэкис",
        "content-model-javascript": "JavaScript",
index 6487bed..7e0d5d3 100644 (file)
@@ -51,8 +51,8 @@
        "tog-fancysig": "Smatraj potpis kao wikitekst (bez automatskog linka)",
        "tog-uselivepreview": "Pretpregledi uživo bez preučitavanja stranice",
        "tog-forceeditsummary": "Opomeni me pri unosu praznog sažetka",
-       "tog-watchlisthideown": "Sakrij moje izmjene sa spiska praćenih članaka",
-       "tog-watchlisthidebots": "Sakrij izmjene botova sa spiska praćenih članaka",
+       "tog-watchlisthideown": "Sakrij moje izmjene s praćenih",
+       "tog-watchlisthidebots": "Sakrij izmjene botova s praćenih",
        "tog-watchlisthideminor": "Sakrij manje izmjene sa spiska praćenja",
        "tog-watchlisthideliu": "Sakrij izmjene prijavljenih korisnika sa liste praćenja",
        "tog-watchlistreloadautomatically": "Preučitavaj spisak praćenja kad god se izmijeni filter (potreban JavaScript)",
        "password-login-forbidden": "Korištenje ovog korisničkog imena i lozinke je zabranjeo.",
        "mailmypassword": "Resetiraj lozinku/zaporku",
        "passwordremindertitle": "Nova privremena lozinka za {{SITENAME}}",
-       "passwordremindertext": "Neko (vjerovatno Vi, sa IP adrese $1) je zahtjevao da vam pošaljemo novu šifru za {{SITENAME}}  ($4). Privremena šifra za korisnika \"$2\" je napravljena i glasi \"$3\". Ako ste to željeli, sad treba da se prijavite i promjenite šifru.\nVaša privremena šifra će isteči za {{PLURAL:$5|$5 dan|$5 dana}}.\n\nAko je neko drugi napravio ovaj zahtjev ili ako ste se sjetili vaše šifre i ne želite više da je promjenite, možete da ignorišete ovu poruku i da nastavite koristeći vašu staru šifru.",
+       "passwordremindertext": "Neko (sa IP adrese $1) je zatražio novu lozinku za {{SITENAME}}  ($4).\nStvorena je privremena lozinka \"$3\" za korisnički račun \"$2\".\nAko ste to željeli, sad treba da se prijavite i postavite novu lozinku.\nVaša privremena lozinka ističe za {{PLURAL:$5|jedan dan|$5 dana}}.\n\nAko je neko drugi napravio ovaj zahtjev ili ako ste se sjetili vaše lozinke i ne želite više da je promjenite, možete da zanemarite ovu poruku i da nastavite koristeći vašu staru lozinku.",
        "noemail": "Ne postoji adresa e-maila za korisnika \"$1\".",
        "noemailcreate": "Morate da navedete valjanu e-mail adresu",
        "passwordsent": "Nova šifra je poslata na e-mail adresu korisnika \"$1\".\nMolimo Vas da se prijavite pošto je primite.",
        "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
        "pt-login": "Prijava",
        "pt-login-button": "Prijavi me / Пријави ме",
+       "pt-login-continue-button": "Nastavi prijavu",
        "pt-createaccount": "Izradi račun",
        "pt-userlogout": "Odjava",
        "php-mail-error-unknown": "Nepoznata greška u PHP funkciji mail()",
        "resetpass-no-info": "Morate biti prijavljeni da bi ste pristupili ovoj stranici direktno.",
        "resetpass-submit-loggedin": "Promijeni lozinku",
        "resetpass-submit-cancel": "Otkaži",
-       "resetpass-wrong-oldpass": "Privremena ili trenutna lozinka nije valjana.\nMožda ste već uspješno promijenili Vašu lozinku ili ste tražili novu privremenu lozinku.",
-       "resetpass-recycled": "Molimo resetirajte vašu lozinku/zaporku u nešto drugo od vaše trenutne lozinke/zaporke.",
+       "resetpass-wrong-oldpass": "Pogrešna privremena ili trenutna lozinka.\nMožda ste već promijenili Vašu lozinku ili ste tražili novu privremenu lozinku.",
+       "resetpass-recycled": "Molimo zadajte drugu lozinku/zaporku, drugačiju od trenutačne.",
        "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz e-pošte.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovde:",
        "resetpass-temp-password": "Privremena lozinka:",
        "resetpass-abort-generic": "Promjenu lozinke/zaporke je prekinula ekstenzija.",
        "resetpass-expired": "Vaša lozinka je istekla. Postavite novu lozinku da biste se prijavili.",
-       "resetpass-expired-soft": "Vaša lozinka je istekla i morate postaviti novu. Postavite novu lozinku ili kliknite „{{int:authprovider-resetpass-skip-label}}“ da je postavite kasnije.",
-       "resetpass-validity-soft": "Vaša loznika nije valjana: $1\n\nMolimo da sada odaberete novu lozinku ili kliknete \"{{int:authprovider-resetpass-skip-label}}\" kako bi je resetirali kasnije.",
+       "resetpass-expired-soft": "Vaša lozinka je istekla i morate je smijeniti. Postavite je sada ili kliknite „{{int:authprovider-resetpass-skip-label}}“ da je smijenite kasnije.",
+       "resetpass-validity": "Vaša lozinka nije važeća: $1\n\nZadajte novu lozinku da biste se prijavili.",
+       "resetpass-validity-soft": "Vaša loznika nije važeća: $1\n\nIzaberite drugu sada ili kliknete \"{{int:authprovider-resetpass-skip-label}}\" kako bi je smijenili kasnije.",
        "passwordreset": "Ponovno postavi lozinku",
        "passwordreset-text-one": "Dovršite ovaj obrazac kako biste resetirali svoju lozinku/zaporku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako bi ste resetirali svoju lozinku/zaporku.}}",
        "passwordreset-emailtext-ip": "Netko (vjerovatno Vi, s IP adrese $1) je zatražio resetiranje vaše lozinke/zaporke {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše početne lozinke, a ne želite je promijeniti, \nmožete zanemariti ovu poruku i nastaviti koristiti staru lozinku.",
        "passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio resetiranje vaše lozinke/zaporke za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše originalne lozinke, a ne želite je više promijeniti, \nmožete zanemariti ovu poruku i nastaviti koristiti staru lozinku.",
        "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
-       "passwordreset-emailsentemail": "Ako je ovo adresa e-pošte s kojom ste registrirali ovaj račun, podsjetnik šifre/lozinke/zaporke će vam biti poslan na vašu adresu e-pošte.",
+       "passwordreset-emailsentemail": "Ako je ova adresa e-pošte povezana s Vašim računom, na nju će biti poslan podsjetnik zadavanja nove lozinke.",
+       "passwordreset-emailsentusername": "Ako postoji odgovarajuća registrirana adresa e-pošte povezana s ovim korisničkim imenom, bit će vam poslana poruka o promjeni zaporke.",
+       "passwordreset-nocaller": "Mora se navesti pozivalac",
+       "passwordreset-nosuchcaller": "Pozivalac ne postoji: $1",
+       "passwordreset-ignored": "Mijenjanje lozinke nije uspjelo. Možda nije postavljen poslužilac?",
+       "passwordreset-invalidemail": "Neispravna adresa e-pošte",
+       "passwordreset-nodata": "Niste naveli ni korisničko ime, a ni adresu e-pošte.",
        "changeemail": "Promeni ili ukloni e-adresu",
        "changeemail-header": "Ispunite sljedeći formular da biste promijenili adresu e-pošte. Ako želite ukloniti postojeću adresu e-pošte s vašeg korisničkog računa, pri ispunjavanju formulara, polje nove adrese e-pošte ostavite prazno.",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "rcfilters-filter-user-experience-level-unregistered-description": "Urednici koji nisu prijavljeni.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Novajlije",
        "rcfilters-filter-user-experience-level-newcomer-description": "Registrovani urednici koji imaju manje od 10 izmjena ili 4 dana aktivnosti.",
+       "rcfilters-filter-user-experience-level-learner-label": "Učenici",
+       "rcfilters-filter-user-experience-level-learner-description": "Registrirani urednici čije je iskustvo između \"novajlija\" i \"iskusnih suradnika\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Iskusni korisnici",
+       "rcfilters-filter-user-experience-level-experienced-description": "Registrirani urednici s više od 500 izmjena i 30 dana aktivnosti.",
+       "rcfilters-filtergroup-automated": "Automatizirani doprinosi",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Izmjene napravljene automatiziranim alatima.",
+       "rcfilters-filter-humans-label": "Čovjek (ne bot)",
+       "rcfilters-filter-humans-description": "Izmjene koje su napravili ljudi.",
+       "rcfilters-filtergroup-reviewstatus": "Pregledanost",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Izmjene koje nisu ručno ili automatski označene patroliranim.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepatrolirano",
+       "rcfilters-filter-reviewstatus-manual-description": "Izmjene koje su ručno označene patroliranim.",
+       "rcfilters-filter-reviewstatus-manual-label": "Ručno patrolirano",
+       "rcfilters-filter-reviewstatus-auto-description": "Izmene naprednih korisnika čiji je rad automatski označen patroliranim.",
+       "rcfilters-filter-reviewstatus-auto-label": "Autopatrolirani",
+       "rcfilters-filtergroup-significance": "Značaj",
+       "rcfilters-filter-minor-label": "Manje izmjene",
+       "rcfilters-filter-minor-description": "Izmjene koje je autor označio kao manje.",
+       "rcfilters-filter-major-label": "Nemanje izmjene",
+       "rcfilters-filter-major-description": "Izmjene koje nisu označene kao manje.",
+       "rcfilters-filtergroup-watchlist": "Praćene stranice",
+       "rcfilters-filter-watchlist-watched-label": "Na popisu praćenja",
+       "rcfilters-filter-watchlist-watched-description": "Izmjene na stranicama iz praćenih.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nove promjene na praćenih",
+       "rcfilters-filter-watchlist-watchednew-description": "Izmjene praćenih stranica koje niste posjetili od vremena učinjenih izmjena.",
+       "rcfilters-filter-watchlist-notwatched-label": "Izvan praćenih",
+       "rcfilters-filter-watchlist-notwatched-description": "Sve osim promjena na stranicama koje pratite.",
+       "rcfilters-filtergroup-watchlistactivity": "Aktivnost u praćenih",
+       "rcfilters-filter-watchlistactivity-unseen-label": "Neviđene promjene",
+       "rcfilters-filter-watchlistactivity-unseen-description": "Promjene na stranicama koje niste posjetili otkako su napravljene.",
+       "rcfilters-filter-watchlistactivity-seen-label": "Viđene izmjene",
+       "rcfilters-filter-watchlistactivity-seen-description": "Promjene na stranicama koje ste posjetili otkako su napravljene.",
+       "rcfilters-filtergroup-changetype": "Vrsta promjene",
+       "rcfilters-filter-pageedits-label": "Izmjene stranica",
+       "rcfilters-filter-pageedits-description": "Uređivanja wikisadržaja, rasprave, opisi kategorija...",
+       "rcfilters-filter-newpages-label": "Stvaranje stranica",
+       "rcfilters-filter-newpages-description": "Uređivanja kojima se stvaraju nove stranice.",
+       "rcfilters-filter-categorization-label": "Promjene kategorija",
+       "rcfilters-filter-categorization-description": "Zapisi iz stavljanja stranica u kategorije ili njihovo uklanjanje iz njih.",
+       "rcfilters-filter-logactions-label": "Zapisane radnje",
+       "rcfilters-filter-logactions-description": "Administrativni postupci, pravljenje računa, brisanje stranica, otpremanje...",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2",
        "rcshowhideminor": "$1 male izmjene / мале измене",
        "recentchangeslinked-feed": "Vezane izmjene",
        "recentchangeslinked-toolbox": "Vezane izmjene",
        "recentchangeslinked-title": "Izmjene vezane s \"$1\"",
-       "recentchangeslinked-summary": "Ova posebna stranica prikazuje promjene na povezanim stranicama.\nStranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
+       "recentchangeslinked-summary": "Unesite stranicu da biste vidjeli promjene na stranicama povezanim s ovom ili s nje. (Da biste vidjeli članove kategorije, unesite {{ns:category}}:Ime kategorije). Izmjene na stranicama na [[Special:Watchlist|praćenih]] su <strong>podebljane</strong>.",
        "recentchangeslinked-page": "Naslov stranice:",
        "recentchangeslinked-to": "Pokaži promjene stranica koji su povezane sa datom stranicom",
        "recentchanges-page-added-to-category": "[[:$1]] pridodano kategoriji",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] i [[Special:WhatLinksHere/$1|{{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|pridodana|pridodane}}]] kategoriji",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] stavljena u kategoriju, [[Special:WhatLinksHere/$1|ova stranica je uključena u druge stranice]]",
        "recentchanges-page-removed-from-category": "[[:$1]] uklonjeno iz kategorije",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] i {{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|uklonjena|uklonjenne}} iz kategorije",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] uklonjena iz kategorije, [[Special:WhatLinksHere/$1|ova stranica je uključena u druge stranice]]",
        "autochange-username": "MediaWiki automatska promjena",
        "upload": "Postavi datoteku",
        "uploadbtn": "Postavi datoteku",
        "reuploaddesc": "Vratite se na upitnik za slanje",
        "upload-tryagain": "Pošaljite izmijenjeni opis datoteke",
+       "upload-tryagain-nostash": "Pošalji preotpremljenu datoteku i izmenjen opis",
        "uploadnologin": "Niste prijavljeni / Нисте пријављени",
        "uploadnologintext": "Morate biti $1 da bi ste slali datoteke.",
        "upload_directory_missing": "Folder za postavljanje ($1) nedostaje i webserver ga ne može napraviti.",
        "file-thumbnail-no": "Naziv datoteke počinje sa <strong>$1</strong>.\nIzgleda da se radi o smanjenoj slici ''(\"thumbnail\")''.\nAko imate ovu sliku u punoj rezoluciji, postavite nju; ili promijenite naslov ove datoteke.",
        "fileexists-forbidden": "Datoteka sa ovim imenom već postoji i ne može biti presnimljena.\nAko i dalje želite da postavite ovu datoteku, molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Datoteka sa ovim imenom već postoji u zajedničkoj ostavi; molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Datoteka je duplikat trenutne verzije <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "Datoteka je duplikat {{PLURAL:$2|starije verzije|starijih verzija}} <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Ova datoteka je dvojnik {{PLURAL:$1|slijedećoj datoteci|slijedećim datotekama}}:",
        "file-deleted-duplicate": "Datoteka koje je identična ovoj datoteci ([[:$1]]) je ranije bila obrisana. Trebate provjeriti historiju brisanja te datoteke prije nego što nastavite sa njenim ponovnim postavljanjem.",
        "file-deleted-duplicate-notitle": "Datoteka identična ovoj datoteci je prethodno bila izbrisana, a naslov je bio sakriven.\nPrije nego što nastavite ponovno postavljanje trebali biste pitati nekoga sa mogućnošću pregleda sakrivenih podataka o datotekama.",
        "uploadwarning": "Upozorenje pri slanju",
        "uploadwarning-text": "Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.",
+       "uploadwarning-text-nostash": "Preotpremite datoteku, izmijenite opis ispod i pokušajte ponovo.",
        "savefile": "Snimi datoteku",
        "uploaddisabled": "Slanje fajlova je isključeno",
        "copyuploaddisabled": "Postavljanje putem URL nije omogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. \nMolimo provjerite postavku za postavljanje datoteka.",
        "uploadscripted": "Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.",
        "upload-scripted-pi-callback": "Datoteka koja sadrži instrukcije za obradu XML stilskog oblika se ne može postaviti.",
+       "upload-scripted-dtd": "Nije moguće otpremanje SVG datoteka koje sadrže nestandardnu DTD deklaraciju.",
        "uploaded-script-svg": "Pronađen skriptni element \"$1\" u postavljenoj SVG datoteci.",
        "uploaded-hostile-svg": "Pronađen nesiguran CSS u stilskom elementu postavljene SVG datoteke.",
        "uploaded-event-handler-on-svg": "Nije dozvoljeno postavljanje atributa koji kontroliraju događaje <code>$1=\"$2\"</code> u SVG datotekama.",
-       "uploaded-href-unsafe-target-svg": "Pronađen href sa nesigurnom metom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-href-attribute-svg": "<a> elementi se mogu povezati (href) samo s data: (umetnuta datoteka), http:// ili https://, ili pak odredištima koja su fragment (#, isti dokument). Za ostale elemente kao <image> dopušteni su samo data: i fragment. Umetnite slike prilikom izvoza SVG-a. Pronađeno je <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Našao sam href s nesigurnim podacima: URI-svrhu <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
        "uploaded-animate-svg": "Pronađena \"animate\" oznaka koja možda mijenja href koristeći se \"from\" atributom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
        "uploaded-setting-event-handler-svg": "Postavljanje kontrole događaja je blokirano, pronađeno <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
        "uploaded-setting-href-svg": "Blokirano je korištenje \"set\" oznake kako bi se dodao \"href\" atribut glavnom elementu.",
        "upload-too-many-redirects": "URL sadrži previše preusmjerenja",
        "upload-http-error": "Desila se HTTP greška: $1",
        "upload-copy-upload-invalid-domain": "Kopije postavljanja nisu dostupni na ovom domenu.",
+       "upload-foreign-cant-upload": "Ovaj wiki nije postavljen za otpermanje datoteka u traženi vanjski repozitorij.",
+       "upload-foreign-cant-load-config": "Nisam mogao učitati postavljenost otpremanja datoteka na vanjska spremišta.",
+       "upload-dialog-disabled": "Otpremanja datoteka korišćenjem ovog dijaloga su onemogućena na ovom wikiju.",
        "upload-dialog-title": "Postavi datoteku",
        "upload-dialog-button-cancel": "Otkaži",
+       "upload-dialog-button-back": "Nazad",
        "upload-dialog-button-done": "Urađeno",
        "upload-dialog-button-save": "Snimi",
        "upload-dialog-button-upload": "Postavi",
        "backend-fail-read": "Ne mogu da pročitam datoteku $1.",
        "backend-fail-create": "Ne mogu snimiti datoteku $1.",
        "backend-fail-maxsize": "Ne mogu snimiti datoteku $1 jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.",
-       "backend-fail-readonly": "Skladišna osnova „$1“ trenutno ne može da se zapisuje. Navedeni razlog glasi: „$2“",
+       "backend-fail-readonly": "Skladišna osnova „$1“ trenutno ne može da se zapisuje. Navedeni razlog glasi: <em>$2</em>",
        "backend-fail-synced": "Datoteka „$1“ je nedosledna između unutrašnjih skladišnih osnova",
        "backend-fail-connect": "Ne mogu da se povežem sa skladišnom osnovom „$1“.",
        "backend-fail-internal": "Došlo je do nepoznate greške u skladišnoj osnovi „$1“.",
        "lockmanager-fail-closelock": "Ne mogu da zatvorim katanac za „$1“.",
        "lockmanager-fail-deletelock": "Ne mogu da obrišem katanac za „$1“.",
        "lockmanager-fail-acquirelock": "Ne mogu da dobijem katanac za „$1“.",
-       "lockmanager-fail-openlock": "Ne mogu da otvorim katanac za „$1“.",
+       "lockmanager-fail-openlock": "Nisam mogao da otvorim katanac za „$1“. Provjerite je li direktorij za otpremanje ispravno postavljen i vaš svemrežni poslužitelj ima dozvolu za snimanje. Za više informacija posjetite https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory.",
        "lockmanager-fail-releaselock": "Ne mogu da oslobodim katanac za „$1“.",
        "lockmanager-fail-db-bucket": "Ne mogu da kontaktiram s dovoljno katanaca u kanti $1.",
        "lockmanager-fail-db-release": "Ne mogu da oslobodim katance u bazi $1.",
        "uploadstash-summary": "Ova stranica daje pristup datotekama koje su postavljene (ili su u postupku postavljanja) ali još nisu objavljene na wiki. Ove datoteke nisu vidljive nikom osim korisniku koji ih je postavio.",
        "uploadstash-clear": "Očisti niz datoteka",
        "uploadstash-nofiles": "Nemate neobjavljenih datoteka",
-       "uploadstash-badtoken": "Izvršavanje ove akcije je bilo neuspješno, možda zato što su vaša uređivačka odobrenja istekla. Pokušajte ponovo.",
-       "uploadstash-errclear": "Brisanje neobjavljenih datoteka nije uspjelo.",
+       "uploadstash-badtoken": "Nisam uspio izvršiti zatraženu akciju, možda zato što su vaša sigurnosna šifra istekla. Pokušajte ponovo.",
+       "uploadstash-errclear": "Brisanje datoteka nije uspjelo.",
        "uploadstash-refresh": "Osvježi spisak datoteka",
+       "uploadstash-thumbnail": "pogl. minijaturu",
+       "uploadstash-exception": "Nisam mogao spremiti datoteku u spremište ($1): \"$2\".",
+       "uploadstash-bad-path": "Putanja ne postoji.",
+       "uploadstash-bad-path-invalid": "Putanja nije ispravna.",
+       "uploadstash-bad-path-unknown-type": "Nepoznata vrsta \"$1\".",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Neprepoznato ime minijature.",
+       "uploadstash-bad-path-no-handler": "Nisam našao obrad MIME tipa $1 datoteke $2.",
+       "uploadstash-bad-path-bad-format": "Ključ \"$1\" nije u odgovarajućem formatu.",
+       "uploadstash-file-not-found": "Ključ \"$1\" nije pronađen u skladištu.",
+       "uploadstash-file-not-found-no-thumb": "Nisam mogao dobiti minijaturu.",
+       "uploadstash-file-not-found-no-local-path": "Nema mjesne putanje za umanjeni element.",
+       "uploadstash-file-not-found-no-object": "Ne mogu napraviti mjesni datotečni objekat za minijaturu.",
+       "uploadstash-file-not-found-no-remote-thumb": "Nije uspjelo dobavljanje minijature: $1\nurl = $2",
+       "uploadstash-file-not-found-missing-content-type": "Nedostaje zaglavlje za sadržajni tip.",
+       "uploadstash-file-not-found-not-exists": "Nisam mogao pronaći putanju ili prostu datoteku.",
+       "uploadstash-file-too-large": "Ne mogu poslužiti datoteku veću od $1 {{PLURAL:$1|bajta|bajtova}}.",
+       "uploadstash-not-logged-in": "Nije prijavljen korisnik. Datoteke moraju pripadati korisnicima.",
+       "uploadstash-wrong-owner": "Ova datoteka ($1) ne pripada trenutnom korisniku.",
+       "uploadstash-no-such-key": "Nema takvog ključa ($1). Ne mogu ukloniti.",
+       "uploadstash-no-extension": "Nastavka je prazna.",
+       "uploadstash-zero-length": "Datoteka ima nultu dužinu.",
        "invalid-chunk-offset": "Nevaljana točka nastavka snimanja",
        "img-auth-accessdenied": "Pristup onemogućen",
        "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije podešen da prosleđuje ovakve podatke.\nMožda je zasnovan na CGI-ju koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "http-timed-out": "Istekao HTTP zahtjev.",
        "http-curl-error": "Greška pri otvaranju URLa: $1",
        "http-bad-status": "Nastao je problem tokom HTTP zahtjeva: $1 $2",
+       "http-internal-error": "Interna greška s HTMLom.",
        "upload-curl-error6": "Ovaj URL nije bilo moguće otvoriti",
        "upload-curl-error6-text": "URL koji je naveden nije dostupan.\nMolimo ponovno provjerite da li je URL ispravan i da li stranica radi.",
        "upload-curl-error28": "Vrijeme postavljanja isteklo",
        "listfiles_size": "Veličina",
        "listfiles_description": "Opis",
        "listfiles_count": "Verzije",
-       "listfiles-show-all": "Uključi starije verzije slika",
+       "listfiles-show-all": "Davaj i starije verzije datoteka",
        "listfiles-latestversion": "Trenutna verzija",
        "listfiles-latestversion-yes": "Da",
        "listfiles-latestversion-no": "Ne",
        "filehist-filesize": "Veličina datoteke",
        "filehist-comment": "Komentar",
        "imagelinks": "Upotreba datoteke",
-       "linkstoimage": "{{PLURAL:$1|Sljedeća stranica koristi|Sljedećih $1 stranica koriste}} ovu sliku:",
+       "linkstoimage": "{{PLURAL:$1|Sljedeća stranica koristi|Sljedećih $1 stranica koriste}} ovu datoteku:",
        "linkstoimage-more": "Više od $1 {{PLURAL:$1|stranice povezuje|stranica povezuje}} na ovu datoteku.\nSlijedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vode na ovu datoteku.\n[[Special:WhatLinksHere/$2|Ovdje se nalazi]] potpuni popis.",
        "nolinkstoimage": "Nema stranica koje koriste ovu datoteku.",
        "morelinkstoimage": "Vidi [[Special:WhatLinksHere/$1|ostale linkove]] prema ovoj datoteci.",
        "filerevert-submit": "Vrati",
        "filerevert-success": "'''Datoteka [[Media:$1|$1]]''' je vraćena na [$4 verziju od $3, $2].",
        "filerevert-badversion": "Ne postoji ranija lokalna verzija ove datoteke sa navedenim vremenskim podacima.",
+       "filerevert-identical": "Trenutna verzija datoteke identična je izabranoj.",
        "filedelete": "Obriši $1",
        "filedelete-legend": "Obriši datoteku",
        "filedelete-intro": "Brišete datoteku '''[[Media:$1|$1]]''' zajedno sa svom njenom historijom.",
        "pageswithprop-legend": "Stranice sa svojstvom stranice",
        "pageswithprop-text": "Ova stranica navodi stranice sa specifičnim svojstvom stranice.",
        "pageswithprop-prop": "Naziv svojstva:",
+       "pageswithprop-reverse": "Poređaj u suprotnom redosledu",
+       "pageswithprop-sortbyvalue": "Sortiraj po vrijednosti svojstva",
        "pageswithprop-submit": "Idi",
        "pageswithprop-prophidden-long": "vrijednost svojstva dugog teksta sakrivena ($1)",
        "pageswithprop-prophidden-binary": "vrijednost binarnog svojstva sakrivena ($1)",
        "doubleredirects": "Dvostruka preusmjerenja",
        "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.\nSvaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, što obično daje \"pravi\" ciljni članak, na koji bi prvo preusmjerenje i trebalo da pokazuje.\n<del>Precrtane</del> stavke su riješene.",
        "double-redirect-fixed-move": "[[$1]] je bio premješten.\nAutomatski je ažuriran i sada preusmjeruje na [[$2]]",
-       "double-redirect-fixed-maintenance": "Automatski popravak dvostrukih datoteka od [[$1]] do [[$2]] u poslu održavanja.",
+       "double-redirect-fixed-maintenance": "Samopopravak dvostrukih preusmjerenja od [[$1]] do [[$2]] u poslu održavanja",
        "double-redirect-fixer": "Popravljač preusmjerenja",
        "brokenredirects": "Pokvarena preusmjerenja",
        "brokenredirectstext": "Slijedeća preusmjerenja vode na nepostojeće stranice:",
        "mostrevisions": "Stranice sa najviše izmjena",
        "prefixindex": "Sve stranice sa prefiksom",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
-       "prefixindex-strip": "Sakrij prefiks u spisku",
+       "prefixindex-submit": "Prikaži",
+       "prefixindex-strip": "Sakrij prefiks u ishodu",
        "shortpages": "Kratke stranice",
        "longpages": "Duge stranice / Дуге странице",
        "deadendpages": "Članci bez internih linkova / Чланци без интерних линкова",
        "deadendpagestext": "Slijedeće stranice nisu povezane s drugim stranicama na {{SITENAME}}.",
        "protectedpages": "Zaštićene stranice / Заштићене странице",
+       "protectedpages-filters": "Filteri:",
        "protectedpages-indef": "Samo neograničena zaštićenja",
        "protectedpages-summary": "Ovaj stranica navodi popis postojećih stranica koje su trenutno zaštićene. Za popis stranica zaštićenih od stvaranja, vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Samo prenosive zaštite",
        "protectedpages-performer": "Zaštitio/la",
        "protectedpages-params": "Nivo zaštite",
        "protectedpages-reason": "Razlog",
+       "protectedpages-submit": "Prikaži stranice",
        "protectedpages-unknown-timestamp": "Nepoznato",
        "protectedpages-unknown-performer": "Nepoznati korisnik",
        "protectedtitles": "Zaštićeni naslovi",
        "protectedtitles-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih naslova. Za spisak trenutno zaštićenih stranica vidi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Nema naslova zaštićenih članaka sa ovim parametrima.",
+       "protectedtitles-submit": "Prikaži naslove",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Pokaži samo korisnike koji su uređivali",
+       "listusers-temporarygroupsonly": "Prikaži samo korisnike u privremenim korisničkim grupama",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
        "listusers-desc": "Sortiraj u opadajućem redoslijedu",
        "usereditcount": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "usercreated": "{{GENDER:$3|je napravio|je napravila|je napravio}} dana $1 u $2",
        "newpages": "Nove stranice / Нове странице",
+       "newpages-submit": "Prikaži",
        "newpages-username": "Korisničko ime:",
        "ancientpages": "Najstarije stranice / Најстарије странице",
        "move": "Premjesti",
        "movethispage": "Premjesti ovu stranicu",
        "unusedimagestext": "Slijedeće datoteke postoje ali nisu uključene ni u jednu stranicu.\nMolimo obratite pažnju da druge web stranice mogu biti povezane s datotekom putem direktnog URLa, tako da i pored toga mogu biti prikazane ovdje pored aktivne upotrebe.",
+       "unusedimagestext-categorizedimgisused": "Sljedeće datoteke postoje, ali one nisu umetnute na nijednoj stranici. Kategorizirane slike smatraju se korištenim, iako nisu prisutne na bilo kojoj stranici.\nImajte na umu da druge web-lokacije mogu upućivati ​​na datoteku s neposrednim URL-om, pa se mogu navesti ovdje, iako se aktivno koriste.",
        "unusedcategoriestext": "Slijedeće stranice kategorija postoje iako ih ni jedan drugi članak ili kategorija ne koriste.",
        "notargettitle": "Nema cilja",
        "notargettext": "Niste naveli ciljnu stranicu ili korisnika\nna kome bi se izvela ova funkcija.",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
        "apihelp": "Pomoć s prilogom",
        "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
+       "apisandbox-intro": "Stranica služi za eksperimentiranje s <strong>API-jem MediaWiki</strong>.\n\nViše o korištenju ovog API-ja možete pronaći na [[mw:API:Main page|njegovoj dokumentaciji]]. Primjer: [https://www.mediawiki.org/wiki/API#A_simple_example preuzimanje sadržaja glavne stranice]. Odaberite radnju da biste vidjeli više primjera.\n\nImajte na umu da se ono što radite na ovoj stranici može odraziti na wikiju, iako je to pješčanik.",
+       "apisandbox-submit": "Napravi zahtjev",
+       "apisandbox-reset": "Očisti",
+       "apisandbox-retry": "Pokušaj ponovo",
        "booksources": "Književni izvori",
        "booksources-search-legend": "Traži književne izvore",
        "booksources-search": "Traži",
        "mywatchlist": "Lista praćenja",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
-       "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
+       "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoje praćene.",
        "watchnologin": "Niste logovani / Нисте логовани",
        "addwatch": "Dodaj u popis praćenja",
        "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na vaš [[Special:Watchlist|spisak praćenja]].",
index 287ce9e..efd39c6 100644 (file)
        "confirmdeletetext": "Iz zbirke podatkov boste izbrisali stran ali sliko skupaj z vso njeno zgodovino.\nProsimo, '''potrdite''', da to resnično želite, da razumete posledice dejanja in da se ravnate po [[{{MediaWiki:Policy-url}}|pravilih]].",
        "actioncomplete": "Poseg je končan",
        "actionfailed": "Dejanje spodletelo",
-       "deletedtext": "Stran »$1« je izbrisana.\nZa zapise nedavnih brisanj glej $2.",
+       "deletedtext": "Stran »$1« je izbrisana.\nZa zapise o pred kratkim opravljenih izbrisih glejte $2.",
        "dellogpage": "Dnevnik brisanja",
        "dellogpagetext": "Spodaj je prikazan seznam nedavnih brisanj.",
        "deletionlog": "dnevnik brisanja",
index f40567c..82a5cdd 100644 (file)
        "upload-form-label-own-work-message-generic-local": "ಯಾನ್ ಈ ಕಡತೊನು {{SITENAME}} ಸೇವೆದ  ಷರತ್ತುಲು ಬೊಕ ಪರವಾನಿ  ಕಾರ್ಯನೀತಿದ ಅನುಸಾರ ಮಿತೇರಾವೊಂದುಲ್ಲೆ  ಇಂದ್  ದೃಡ ಮಲ್ಪುವೆ",
        "license": "ಪರವಾನಗಿ:",
        "license-header": "ಪರವಾನಿಗೆ",
+       "nolicense": "ವೊವ್ವುಲ ಅತುಜಿ",
        "listfiles-delete": "ಮಾಜಾಲೆ",
        "imgfile": "ಫೈಲ್",
        "listfiles": "ಕಡತೊಲೆನ ಪಟ್ಟಿ",
        "filepage-nofile": "ಈ ಪುದರ್‌ಡ್ ಒವ್ಲಾ ಕಡತ ಇಜ್ಜಿ.",
        "shared-repo-from": "$1 ನೆತ್ತ್",
        "upload-disallowed-here": "ಈರ್ ಈ ಫೈಲ್‍ನ್ ಕುಡೊರೊ ಬರೆಯೆರೆ ಸಾದ್ಯೊ ಇಜ್ಜಿ.",
+       "filerevert": "ಪಿರಕೊನರುನಾ $1",
        "filerevert-comment": "ಕಾರಣ:",
        "filerevert-submit": "ದುಂಬುದ ಲೆಕ ಮಲ್ಪುಲೆ",
        "filedelete": "$1 ನ್ ಮಾಜಾಲೆ",
        "filedelete-comment": "ಕಾರಣ",
        "filedelete-submit": "ಮಾಜಾಲೆ",
        "filedelete-reason-otherlist": "ಬೇತೆ ಕಾರಣ",
+       "filedelete-edit-reasonlist": "ಮಾಜಾಯಿನ ಕಾರಣೊಲೆನ್ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
        "mimesearch": "MIME ನಾಡುನಿ",
+       "mimetype": "MIME type:",
        "download": "ಡೌನ್‍ಲೋಡ್",
+       "unwatchedpages": "ತೂವಂತಿನ ಪುಟೊಲು",
        "listredirects": "ರೀಡೈರೆಕ್ಟ್ ಪಟ್ಟಿ",
        "listduplicatedfiles": "ಡುಪ್ಲಿಕೇಟ್ ಕಡತೊಲೆನ ಪಟ್ಟಿ",
        "unusedtemplates": "ಗಲಸಂದಿನ ಟೆಂಪ್ಲೇಟ್ಲು",
        "randomredirect": "ಗೊತ್ತುದಾಂತಿ ರೀಡೈರೆಕ್ಟ್",
        "statistics": "ಅಂಕಿ ಅಂಶೊಲು",
        "statistics-header-pages": "ಪುಟೊತ ಅಂಕಿ ಅಂಶಲು",
+       "statistics-articles": "ವಿಸಯ ಪುಟೊಕುಲು",
        "statistics-pages": "ಪುಟಕುಲು",
+       "statistics-files": "ಅಪ್ಲೋಡ್ ಆತಿಪ್ಪುನ ಫೈಲುಲು",
        "statistics-users-active": "ಸಕ್ರಿಯ ಬಳಕೆದಾರೆರ್",
        "pageswithprop-submit": "ಪೋಲೆ",
        "doubleredirects": "ರಡ್ಡ್ ರಿಡೈರೆಕ್ಟ್‌ಲು",
index e544abe..b8bbad8 100644 (file)
        "index-category": "หน้าที่มีดัชนี",
        "noindex-category": "หน้าที่ไม่มีดัชนี",
        "broken-file-category": "หน้าที่มีลิงก์ไฟล์เสีย",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "เกี่ยวกับ",
        "article": "หน้าเนื้อหา",
        "newwindow": "(เปิดหน้าต่างใหม่)",
        "versionrequired": "ต้องการมีเดียวิกิรุ่น $1",
        "versionrequiredtext": "การใช้หน้านี้ต้องการมีเดียวิกิรุ่น $1  ดู[[Special:Version|หน้ารุ่น]]",
        "ok": "ตกลง",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "ดึงข้อมูลจาก \"$1\"",
        "youhavenewmessages": "คุณมี$1 ($2)",
        "youhavenewmessagesfromusers": "คุณมี $1จาก{{PLURAL:$3|ผู้ใช้คนอื่น|ผู้ใช้ $3 คน}} ($2)",
        "site-atom-feed": "ฟีดอะตอม $1",
        "page-rss-feed": "ฟีดอาร์เอสเอส \"$1\"",
        "page-atom-feed": "ฟีดอะตอม \"$1\"",
+       "feed-atom": "อะตอม",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (ไม่มีหน้า)",
        "sort-descending": "เรียงจากมากไปน้อย",
        "sort-ascending": "เรียงจากน้อยไปมาก",
        "badretype": "รหัสผ่านที่คุณกรอกไม่ตรง",
        "usernameinprogress": "การสร้างบัญชีสำหรับชื่อผู้ใช้นี้อยู่ระหว่างดำเนินการแล้ว\nโปรดรอสักครู่",
        "userexists": "ชื่อผู้ใช้ที่กรอกมีผู้ใช้แล้ว \nกรุณาเลือกชื่ออื่น",
+       "createacct-normalization": "ชื่อผู้ใช้ของคุณจะถูกปรับเป็น\"$2\"เนื่องจากข้อจำกัดทางเทคนิค",
        "loginerror": "ข้อผิดพลาดในการเข้าสู่ระบบ",
        "createacct-error": "การสร้างบัญชีผิดพลาด",
        "createaccounterror": "ไม่สามารถสร้างบัญชี: $1",
        "nocookiesnew": "สร้างบัญชีผู้ใช้แล้ว แต่ยังไม่ได้เข้าสู่ระบบ \n{{SITENAME}} ใช้คุกกี้เพื่อนำผู้ใช้เข้าสู่ระบบ\nคุณปิดใช้งานคุกกี้\nโปรดเปิดใช้งาน แล้วเข้าสู่ระบบพร้อมชื่อผู้ใช้และรหัสผ่านใหม่ของคุณ",
        "nocookieslogin": "{{SITENAME}} ใช้คุกกี้เพื่อล็อกอินผู้ใช้\nคุณปิดใช้งานคุกกี้\nกรุณาเปิดใช้งานและลองอีกครั้ง",
        "nocookiesfornew": "บัญชีผู้ใช้ไม่ถูกสร้าง เนื่องจากเราไม่สามารถยืนยันต้นทาง\nกรุณาทำให้แน่ใจว่าคุณได้เปิดใช้งานคุกกี้ โหลดหน้านี้ใหม่และลองอีกครั้ง",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "createacct-loginerror": "บัญชีผู้ใช้ถูกสร้างสำเร็จแล้ว แต่คุณไม่สามารถเข้าสู่ระบบได้โดยอัตโนมัติ โปรด[[Special:UserLogin|เข้าสู่ระบบด้วยตนเอง]]",
        "noname": "คุณไม่ได้ใส่ชื่อผู้ใช้ที่ถูกต้อง",
        "loginsuccesstitle": "เข้าสู่ระบบแล้ว",
        "template-semiprotected": "(ถูกกึ่งป้องกัน)",
        "hiddencategories": "หน้านี้มี {{PLURAL:$1|1 หมวดหมู่ซ่อน|$1 หมวดหมู่ซ่อน}}:",
        "edittools": "<!-- ข้อความนี้จะแสดงผลใต้ฟอร์มสำหรับการแก้ไขและอัปโหลด -->",
+       "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}} ได้จำกัดการสร้างหน้าใหม่\nคุณสามารถย้อนกลับไปแก้ไขหน้าที่มีอยู่เดิม หรือ[[Special:UserLogin|เข้าสู่ระบบหรือสร้างบัญชีผู้ใช้]]",
        "nocreate-loggedin": "คุณไม่มีสิทธิสร้างหน้าใหม่",
        "sectioneditnotsupported-title": "ไม่สนับสนุนการแก้ไขหัวข้อย่อย",
        "content-model-text": "ข้อความธรรมดา",
        "content-model-javascript": "จาวาสคริปต์",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "content-json-empty-object": "วัตถุเปล่า",
        "content-json-empty-array": "แถวเปล่า",
        "deprecated-self-close-category": "หน้าที่ใช้ป้าย HTML ที่ปิดเองที่ไม่ถูกต้อง",
        "mergehistory-comment": "ผสาน [[:$1]] เข้ากับ [[:$2]] แล้ว: $3",
        "mergehistory-same-destination": "หน้าต้นทางและปลายทางเป็นหน้าเดียวกันไม่ได้",
        "mergehistory-reason": "เหตุผล:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "ปูมการผสาน",
        "revertmerge": "เลิกผสาน",
        "mergelogpagetext": "ด้านล่างนี้เป็นรายการการผสานประวัติหน้าหนึ่งกับของอีกหน้าหนึ่งล่าสุด",
        "youremail": "อีเมล:",
        "username": "{{GENDER:$1|ชื่อผู้ใช้}}:",
        "prefs-memberingroups": "เป็น{{GENDER:$2|สมาชิก}}ใน{{PLURAL:$1|กลุ่ม|กลุ่ม}}:",
+       "prefs-memberingroups-type": "$1",
        "group-membership-link-with-expiry": "$1 (จนกระทั่ง $2)",
        "prefs-registration": "เวลาลงทะเบียน:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "ชื่อจริง:",
        "yourlanguage": "ภาษา:",
        "yourvariant": "อักษรต่างรูปของเนื้อหา:",
        "saveusergroups": "บันทึกกลุ่ม{{GENDER:$1|ผู้ใช้}}",
        "userrights-groupsmember": "สมาชิกของ:",
        "userrights-groupsmember-auto": "สมาชิกโดยปริยายของ:",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "คุณสามารถเปลี่ยนแปลงกลุ่มที่ผู้ใช้รายนี้อยู่:\n* กล่องที่มีเครื่องหมายถูก หมายความว่า ผู้ใช้อยู่ในกลุ่มนั้น\n* กล่องที่ไม่มีเครื่องหมายถูก หมายความว่า ผู้ใช้ไม่ได้อยู่ในกลุ่มนั้น\n* เครื่องหมาย * ชี้ว่าคุณไม่สามารถนำกลุ่มนั้นออกได้เมื่อคุณเพิ่มกลุ่มนั้นไปแล้ว หรือกลับกัน\n* เครื่องหมาย # บี้ว่าคุณสามารถแก้คืนเวลาหมดอายุของสมาชิกภาพกลุ่มนี้เท่านั้น คุณไม่สามารถร่นเวลาหมดอายุได้",
        "userrights-reason": "เหตุผล:",
        "userrights-no-interwiki": "คุณไม่มีสิทธิแก้ไขสิทธิผู้ใช้บนวิกิอื่น",
        "userrights-nodatabase": "ไม่มีฐานข้อมูล $1 หรือฐานข้อมูลอยู่บนเครื่องอื่น",
        "userrights-changeable-col": "กลุ่มที่คุณสามารถเปลี่ยนได้",
        "userrights-unchangeable-col": "กลุ่มที่คุณไม่สามารถเปลี่ยนได้",
+       "userrights-irreversible-marker": "$1*",
        "userrights-expiry-current": "หมดอายุ $1",
        "userrights-expiry-none": "ไม่มีวันหมดอายุ",
        "userrights-expiry": "หมดอายุ:",
        "recentchanges-label-plusminus": "ขนาดของหน้าเปลี่ยนไปจำนวนไบต์เท่านี้",
        "recentchanges-legend-heading": "<strong>คำอธิบายสัญลักษณ์:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ดูเพิ่มที่ [[Special:NewPages|รายชื่อหน้าใหม่]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "แสดง",
        "rcfilters-tag-remove": "ลบ '$1'",
        "rcfilters-legend-heading": "<strong>รายการอักษรย่อ:</strong>",
        "boteditletter": "บ",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 ผู้ใช้เฝ้าดู]",
+       "rc-change-size": "$1",
        "rc-change-size-new": "$1 ไบต์หลังเปลี่ยนแปลง",
        "newsectionsummary": "/* $1 */ ส่วนใหม่",
        "rc-enhanced-expand": "แสดงรายละเอียด",
        "upload-scripted-pi-callback": "ไม่สามารถอัปโหลดไฟล์ที่มีคำสั่งการประมวลผลสไตล์ชีต XML",
        "upload-scripted-dtd": "ไม่สามารถอัปโหลดไฟล์ SVG ที่มีการประกาศ DTD ที่ไม่ได้มาตรฐาน",
        "uploaded-script-svg": "พบองค์ประกอบที่สามารถใช้สคริปต์ \"$1\" ในไฟล์ SVG ที่อัปโหลด",
+       "uploaded-hostile-svg": "พบ CSS ที่ไม่ปลอดภัยในองค์ประกอบสไตล์ของไฟล์ SVG ที่คุณอัปโหลด",
+       "uploaded-event-handler-on-svg": "ไม่อนุญาตให้ตั้งค่าแอตทริบิวต์ตัวจัดการเหตุการณ์ <code>$1=\"$2\"</code> ในไฟล์ SVG",
+       "uploaded-href-unsafe-target-svg": "พบว่า href เป็นข้อมูลที่ไม่ปลอดภัย:URI เป้าหมาย <code>&lt;$1 $2=\"$3\"&gt;</code> ใน SVG ไฟล์ที่อัพโหลด",
        "uploadscriptednamespace": "ไฟล์ SVG นี้มีเนมสเปซไม่ถูกต้อง \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "ไม่สามารถตีความ XML ในไฟลืที่อัปโหลด",
        "uploadvirus": "ไฟล์นี้มีไวรัส! \nรายละเอียด: $1",
index 5786f67..9337236 100644 (file)
        "badretype": "Введені паролі не збігаються.",
        "usernameinprogress": "Створення облікового запису для цього імені користувача уже виконується.\nБудь ласка, зачекайте.",
        "userexists": "Введене ім'я користувача вже існує.\nБудь ласка оберіть інше ім'я.",
+       "createacct-normalization": "Ваше ім'я користувача буде скориговано на «$2» через технічні обмеження.",
        "loginerror": "Помилка при вході до системи",
        "createacct-error": "Помилка створення облікового запису",
        "createaccounterror": "Не в змозі створити обліковий запис: $1",
        "ipb-confirm": "Підтвердити блокування",
        "ipb-sitewide": "У всій вікі",
        "ipb-partial": "Частково",
+       "ipb-sitewide-help": "Кожна сторінка у вікі та всі інші дії щодо внеску.",
+       "ipb-partial-help": "Окремі сторінки чи простори назв.",
        "ipb-pages-label": "Сторінки",
        "ipb-namespaces-label": "Простори назв",
        "badipaddress": "IP-адреса записана в невірному форматі, або користувача з таким іменем не існує.",
index 8d4c7f4..6cd17f6 100644 (file)
        "sectioneditnotsupported-text": "呢版唔支援逐改段。",
        "permissionserrors": "權限出錯",
        "permissionserrorstext": "根據下面嘅{{PLURAL:$1|原因|原因}},你並無權限去做呢樣嘢:",
-       "permissionserrorstext-withaction": "根據下面嘅{{PLURAL:$1|原因|原因}},你並無權限去做$2:",
+       "permissionserrorstext-withaction": "根據下面嘅{{PLURAL:$1|原因}},你無權去$2:",
        "contentmodelediterror": "你唔改得呢版修訂,因為呢個修訂嘅內容模型係 <code>$1</code> ,同而家嘅內容模型 <code>$2</code> 有分別。",
        "recreate-moveddeleted-warn": "'''警告: 你而家重開一版係先前曾經刪除過嘅。'''\n\n你應該要考慮吓繼續編輯呢一版係唔係適合嘅。\n為咗方便起見,呢一版嘅刪除同搬版記錄已經響下面提供:",
        "moveddeleted-notice": "呢一版已經刪咗。\n呢版嘅刪除同搬版日誌響下面提供咗以便參考。",
index 1605a2f..bb144ad 100644 (file)
        "previewnote": "<strong>请记住这只是预览。</strong>您的更改尚未保存!",
        "continue-editing": "前往编辑区",
        "previewconflict": "该预览反映了上面文字编辑区中的文字在你保存后的显示状况。",
-       "session_fail_preview": "对不起!由于会话数据丢失,我们无法处理您的编辑。\n\n您可能已经退出登录。<strong>请核实您是否仍在登录状态,并重试操作。</strong>如果这仍然无效,请尝试[[Special:UserLogout|注销]]后重新登录,并检查您的浏览器是否允许来自本网站的cookie。",
+       "session_fail_preview": "对不起!由于会话数据丢失,我们无法处理您的编辑。\n\n您可能已经退出。<strong>请核实您是否仍在登录,并重试</strong>。如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "session_fail_preview_html": "对不起!由于会话数据丢失,我们无法处理您的编辑,\n\n<em>因为{{SITENAME}}已启用原始HTML,为了预防JavaScript攻击,预览被隐藏。</em>\n\n<strong>如果该编辑尝试合法,请重试。</strong>如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "token_suffix_mismatch": "<strong>由于您客户端中的编辑令牌毁损了一些标点符号字符,您的编辑已经被拒绝。</strong>\n此次编辑被拒绝以防止页面文本损坏。\n这种情况通常在您使用含有故障的网页式匿名代理服务的时候出现。",
        "edit_form_incomplete": "<strong>编辑表格的某些部分没有到达服务器,请检查您的编辑是否完整并重试。</strong>",
index 1676f53..489e160 100644 (file)
        "protectedpages": "受保護頁面",
        "protectedpages-filters": "篩選:",
        "protectedpages-indef": "只顯示無限期的保護頁面",
-       "protectedpages-summary": "此頁面列出目前受保護的頁面。 欲查詢受保護標題清單,請參考 [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]。",
+       "protectedpages-summary": "此頁面列出目前受保護的頁面。 欲查詢受保護標題清單,請參考[[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]。",
        "protectedpages-cascade": "只顯示連鎖的保護頁面",
        "protectedpages-noredirect": "隱藏重新導向頁面",
        "protectedpagesempty": "目前沒有使用這些參數的受保護頁面。",
        "protectedpages-unknown-timestamp": "不明",
        "protectedpages-unknown-performer": "不明的使用者",
        "protectedtitles": "受保護標題",
-       "protectedtitles-summary": "此頁面列出目前受保護的標題。 欲查詢受保護頁面清單,請參考 [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]。",
+       "protectedtitles-summary": "此頁面列出目前受保護的標題。 欲查詢受保護頁面清單,請參考[[{{#special:ProtectedPages}}|{{int:protectedpages}}]]。",
        "protectedtitlesempty": "目前沒有使用這些參數的受保護標題。",
        "protectedtitles-submit": "顯示標題",
        "listusers": "使用者清單",
index 3d34be1..160a20d 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -61,10 +63,10 @@ class FormatInstallDoc extends Maintenance {
                $outText = InstallDocFormatter::format( $inText );
 
                if ( $this->hasOption( 'html' ) ) {
-                       global $wgParser;
+                       $parser = MediaWikiServices::getInstance()->getParser();
                        $opt = new ParserOptions;
                        $title = Title::newFromText( 'Text file' );
-                       $out = $wgParser->parse( $outText, $title, $opt );
+                       $out = $parser->parse( $outText, $title, $opt );
                        $outText = "<html><body>\n" . $out->getText() . "\n</body></html>\n";
                }
 
index f8526d0..75904d0 100644 (file)
@@ -25,6 +25,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/dumpIterator.php';
 
 /**
@@ -40,9 +42,9 @@ class PreprocessDump extends DumpIterator {
        public $mPPNodeCount = 0;
 
        public function getStripList() {
-               global $wgParser;
+               $parser = MediaWikiServices::getInstance()->getParser();
 
-               return $wgParser->getStripList();
+               return $parser->getStripList();
        }
 
        public function __construct() {
index 804d0a1..df3f6e5 100644 (file)
@@ -38,12 +38,13 @@ require dirname( __DIR__ ) . '/includes/WebStart.php';
 wfInstallerMain();
 
 function wfInstallerMain() {
-       global $wgRequest, $wgLang, $wgMetaNamespace, $wgCanonicalNamespaceNames;
+       global $wgLang, $wgMetaNamespace, $wgCanonicalNamespaceNames;
+       $request = RequestContext::getMain()->getRequest();
 
-       $installer = InstallerOverrides::getWebInstaller( $wgRequest );
+       $installer = InstallerOverrides::getWebInstaller( $request );
 
        if ( !$installer->startSession() ) {
-               if ( $installer->request->getVal( "css" ) ) {
+               if ( $installer->request->getVal( 'css' ) ) {
                        // Do not display errors on css pages
                        $installer->outputCss();
                        exit;
@@ -62,8 +63,8 @@ function wfInstallerMain() {
                $session = array();
        }
 
-       if ( !is_null( $wgRequest->getVal( 'uselang' ) ) ) {
-               $langCode = $wgRequest->getVal( 'uselang' );
+       if ( $request->getVal( 'uselang' ) !== null ) {
+               $langCode = $request->getVal( 'uselang' );
        } elseif ( isset( $session['settings']['_UserLang'] ) ) {
                $langCode = $session['settings']['_UserLang'];
        } else {
index 51d4d2f..86bca6c 100644 (file)
@@ -1341,7 +1341,17 @@ return [
                'styles' => 'resources/src/mediawiki.checkboxtoggle.styles.css',
        ],
        'mediawiki.cookie' => [
-               'scripts' => 'resources/src/mediawiki.cookie.js',
+               'localBasePath' => "$IP/resources/src/mediawiki.cookie",
+               'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.cookie",
+               'packageFiles' => [
+                       'index.js',
+                       [ 'name' => 'config.json', 'config' => [
+                               'prefix' => 'CookiePrefix',
+                               'domain' => 'CookieDomain',
+                               'path' => 'CookiePath',
+                               'expires' => 'CookieExpiration'
+                       ] ],
+               ],
                'dependencies' => 'jquery.cookie',
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -2766,6 +2776,7 @@ return [
        'mediawiki.widgets.NamespacesMultiselectWidget' => [
                'scripts' => [
                        'resources/src/mediawiki.widgets/mw.widgets.NamespacesMultiselectWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.NamespacesMenuOptionWidget.js',
                ],
                'dependencies' => [
                        'oojs-ui-widgets',
diff --git a/resources/src/mediawiki.cookie.js b/resources/src/mediawiki.cookie.js
deleted file mode 100644 (file)
index 76038f6..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-( function () {
-       'use strict';
-
-       /**
-        * Provides an API for getting and setting cookies that is
-        * syntactically and functionally similar to the server-side cookie
-        * API (`WebRequest#getCookie` and `WebResponse#setcookie`).
-        *
-        * @author Sam Smith <samsmith@wikimedia.org>
-        * @author Matthew Flaschen <mflaschen@wikimedia.org>
-        * @author Timo Tijhof <krinklemail@gmail.com>
-        *
-        * @class mw.cookie
-        * @singleton
-        */
-       mw.cookie = {
-
-               /**
-                * Set or delete a cookie.
-                *
-                * While this is natural in JavaScript, contrary to `WebResponse#setcookie` in PHP, the
-                * default values for the `options` properties only apply if that property isn't set
-                * already in your options object (e.g. passing `{ secure: null }` or `{ secure: undefined }`
-                * overrides the default value for `options.secure`).
-                *
-                * @param {string} key
-                * @param {string|null} value Value of cookie. If `value` is `null` then this method will
-                *   instead remove a cookie by name of `key`.
-                * @param {Object|Date|number} [options] Options object, or expiry date
-                * @param {Date|number|null} [options.expires] The expiry date of the cookie, or lifetime in seconds.
-                *
-                *   If `options.expires` is null, then a session cookie is set.
-                *
-                *   By default cookie expiration is based on `wgCookieExpiration`. Similar to `WebResponse`
-                *   in PHP, we set a session cookie if `wgCookieExpiration` is 0. And for non-zero values
-                *   it is interpreted as lifetime in seconds.
-                *
-                * @param {string} [options.prefix=wgCookiePrefix] The prefix of the key
-                * @param {string} [options.domain=wgCookieDomain] The domain attribute of the cookie
-                * @param {string} [options.path=wgCookiePath] The path attribute of the cookie
-                * @param {boolean} [options.secure=false] Whether or not to include the secure attribute.
-                *   (Does **not** use the wgCookieSecure configuration variable)
-                */
-               set: function ( key, value, options ) {
-                       var config, defaultOptions, date;
-
-                       // wgCookieSecure is not used for now, since 'detect' could not work with
-                       // ResourceLoaderStartUpModule, as module cache is not fragmented by protocol.
-                       config = mw.config.get( [
-                               'wgCookiePrefix',
-                               'wgCookieDomain',
-                               'wgCookiePath',
-                               'wgCookieExpiration'
-                       ] );
-
-                       defaultOptions = {
-                               prefix: config.wgCookiePrefix,
-                               domain: config.wgCookieDomain,
-                               path: config.wgCookiePath,
-                               secure: false
-                       };
-
-                       // Options argument can also be a shortcut for the expiry
-                       // Expiry can be a Date, number or null
-                       if ( !options || options instanceof Date || typeof options === 'number' ) {
-                               // Also takes care of options = undefined, in which case we also don't need $.extend()
-                               defaultOptions.expires = options;
-                               options = defaultOptions;
-                       } else {
-                               options = $.extend( defaultOptions, options );
-                       }
-
-                       // Default to using wgCookieExpiration (lifetime in seconds).
-                       // If wgCookieExpiration is 0, that is considered a special value indicating
-                       // all cookies should be session cookies by default.
-                       if ( options.expires === undefined && config.wgCookieExpiration !== 0 ) {
-                               date = new Date();
-                               date.setTime( Number( date ) + ( config.wgCookieExpiration * 1000 ) );
-                               options.expires = date;
-                       } else if ( typeof options.expires === 'number' ) {
-                               // Lifetime in seconds
-                               date = new Date();
-                               date.setTime( Number( date ) + ( options.expires * 1000 ) );
-                               options.expires = date;
-                       } else if ( options.expires === null ) {
-                               // $.cookie makes a session cookie when options.expires is omitted
-                               delete options.expires;
-                       }
-
-                       // Process prefix
-                       key = options.prefix + key;
-                       delete options.prefix;
-
-                       // Process value
-                       if ( value !== null ) {
-                               value = String( value );
-                       }
-
-                       // Other options are handled by $.cookie
-                       $.cookie( key, value, options );
-               },
-
-               /**
-                * Get the value of a cookie.
-                *
-                * @param {string} key
-                * @param {string} [prefix=wgCookiePrefix] The prefix of the key. If `prefix` is
-                *   `undefined` or `null`, then `wgCookiePrefix` is used
-                * @param {Mixed} [defaultValue=null]
-                * @return {string|null|Mixed} If the cookie exists, then the value of the
-                *   cookie, otherwise `defaultValue`
-                */
-               get: function ( key, prefix, defaultValue ) {
-                       var result;
-
-                       if ( prefix === undefined || prefix === null ) {
-                               prefix = mw.config.get( 'wgCookiePrefix' );
-                       }
-
-                       // Was defaultValue omitted?
-                       if ( arguments.length < 3 ) {
-                               defaultValue = null;
-                       }
-
-                       result = $.cookie( prefix + key );
-
-                       return result !== null ? result : defaultValue;
-               }
-       };
-
-}() );
diff --git a/resources/src/mediawiki.cookie/index.js b/resources/src/mediawiki.cookie/index.js
new file mode 100644 (file)
index 0000000..61379ae
--- /dev/null
@@ -0,0 +1,115 @@
+( function () {
+       'use strict';
+
+       var config = require( './config.json' ),
+               defaults = {
+                       prefix: config.prefix,
+                       domain: config.domain,
+                       path: config.path,
+                       expires: config.expires,
+                       secure: false
+               };
+
+       /**
+        * Manage cookies in a way that is syntactically and functionally similar
+        * to the `WebRequest#getCookie` and `WebResponse#setcookie` methods in PHP.
+        *
+        * @author Sam Smith <samsmith@wikimedia.org>
+        * @author Matthew Flaschen <mflaschen@wikimedia.org>
+        *
+        * @class mw.cookie
+        * @singleton
+        */
+       mw.cookie = {
+
+               /**
+                * Set or delete a cookie.
+                *
+                * **Note:** If explicitly passing `null` or `undefined` for an options key,
+                * that will override the default. This is natural in JavaScript, but noted
+                * here because it is contrary to MediaWiki's `WebResponse#setcookie()` method
+                * in PHP.
+                *
+                * @param {string} key
+                * @param {string|null} value Value of cookie. If `value` is `null` then this method will
+                *   instead remove a cookie by name of `key`.
+                * @param {Object|Date|number} [options] Options object, or expiry date
+                * @param {Date|number|null} [options.expires=wgCookieExpiration] The expiry date of the cookie,
+                *  or lifetime in seconds. If `options.expires` is null or 0, then a session cookie is set.
+                * @param {string} [options.prefix=wgCookiePrefix] The prefix of the key
+                * @param {string} [options.domain=wgCookieDomain] The domain attribute of the cookie
+                * @param {string} [options.path=wgCookiePath] The path attribute of the cookie
+                * @param {boolean} [options.secure=false] Whether or not to include the secure attribute.
+                *   (Does **not** use the wgCookieSecure configuration variable)
+                */
+               set: function ( key, value, options ) {
+                       var date;
+
+                       // The 'options' parameter may be a shortcut for the expiry.
+                       if ( arguments.length > 2 && ( !options || options instanceof Date || typeof options === 'number' ) ) {
+                               options = { expires: options };
+                       }
+                       // Apply defaults
+                       options = $.extend( {}, defaults, options );
+
+                       // Handle prefix
+                       key = options.prefix + key;
+                       // Don't pass invalid option to $.cookie
+                       delete options.prefix;
+
+                       if ( !options.expires ) {
+                               // Session cookie (null or zero)
+                               // Normalize to absent (undefined) for $.cookie.
+                               delete options.expires;
+                       } else if ( typeof options.expires === 'number' ) {
+                               // Lifetime in seconds
+                               date = new Date();
+                               date.setTime( Number( date ) + ( options.expires * 1000 ) );
+                               options.expires = date;
+                       }
+
+                       if ( value !== null ) {
+                               value = String( value );
+                       }
+
+                       $.cookie( key, value, options );
+               },
+
+               /**
+                * Get the value of a cookie.
+                *
+                * @param {string} key
+                * @param {string} [prefix=wgCookiePrefix] The prefix of the key. If `prefix` is
+                *   `undefined` or `null`, then `wgCookiePrefix` is used
+                * @param {Mixed} [defaultValue=null]
+                * @return {string|null|Mixed} If the cookie exists, then the value of the
+                *   cookie, otherwise `defaultValue`
+                */
+               get: function ( key, prefix, defaultValue ) {
+                       var result;
+
+                       if ( prefix === undefined || prefix === null ) {
+                               prefix = defaults.prefix;
+                       }
+
+                       // Was defaultValue omitted?
+                       if ( arguments.length < 3 ) {
+                               defaultValue = null;
+                       }
+
+                       result = $.cookie( prefix + key );
+
+                       return result !== null ? result : defaultValue;
+               }
+       };
+
+       if ( window.QUnit ) {
+               module.exports = {
+                       setDefaults: function ( value ) {
+                               var prev = defaults;
+                               defaults = value;
+                               return prev;
+                       }
+               };
+       }
+}() );
index a8ab818..c7eae2c 100644 (file)
        }
 }
 
-.TablePager .TablePager_sort-ascending a {
-       padding-left: 15px;
-       background: none left center no-repeat;
-       .background-image-svg('images/arrow-sort-ascending.svg', 'images/arrow-sort-ascending.png');
-}
+.mw-datatable {
+       &-is-sorted a {
+               background-position: left center;
+               background-repeat: no-repeat;
+               padding-left: 15px;
+       }
 
-.TablePager .TablePager_sort-descending a {
-       padding-left: 15px;
-       background: none left center no-repeat;
-       .background-image-svg('images/arrow-sort-descending.svg', 'images/arrow-sort-descending.png');
+       &-is-ascending a {
+               .background-image-svg( 'images/arrow-sort-ascending.svg', 'images/arrow-sort-ascending.png' );
+       }
+
+       &-is-descending a {
+               .background-image-svg( 'images/arrow-sort-descending.svg', 'images/arrow-sort-descending.png' );
+       }
 }
 
 .TablePager_nav {
diff --git a/resources/src/mediawiki.widgets/mw.widgets.NamespacesMenuOptionWidget.js b/resources/src/mediawiki.widgets/mw.widgets.NamespacesMenuOptionWidget.js
new file mode 100644 (file)
index 0000000..24f52af
--- /dev/null
@@ -0,0 +1,37 @@
+/*!
+ * MediaWiki Widgets - NamespacesMenuOptionWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function () {
+
+       /**
+        * Creates an mw.widgets.NamespacesMenuOptionWidget object
+        *
+        * This MenuOptionWidget widget returns an item match text that includes
+        * both the label and the data, so the menu can filter on either.
+        *
+        * @class
+        * @extends OO.ui.MenuOptionWidget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        */
+       mw.widgets.NamespacesMenuOptionWidget = function MwWidgetsNamespacesMenuOptionWidget( config ) {
+               // Parent
+               mw.widgets.NamespacesMenuOptionWidget.parent.call( this, config );
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.NamespacesMenuOptionWidget, OO.ui.MenuOptionWidget );
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.NamespacesMenuOptionWidget.prototype.getMatchText = function () {
+               return this.getData() + ' ' + this.getLabel();
+       };
+
+}() );
index e5adc29..d4e9b1c 100644 (file)
                        {
                                clearInputOnChoose: true,
                                inputPosition: 'inline',
-                               allowEditTags: false
+                               allowEditTags: false,
+                               menu: {
+                                       filterMode: 'substring'
+                               }
                        },
                        config,
                        {
        OO.inheritClass( mw.widgets.NamespacesMultiselectWidget, OO.ui.MenuTagMultiselectWidget );
        OO.mixinClass( mw.widgets.NamespacesMultiselectWidget, OO.ui.mixin.PendingElement );
 
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.NamespacesMultiselectWidget.prototype.createMenuOptionWidget = function ( data, label, icon ) {
+               return new mw.widgets.NamespacesMenuOptionWidget( {
+                       data: data,
+                       label: label || data,
+                       icon: icon
+               } );
+       };
+
 }() );
index 153af50..680b8c3 100644 (file)
@@ -171,6 +171,7 @@ $wgAutoloadClasses += [
        'MediaWiki\Tests\Revision\RevisionRecordTests' => "$testDir/phpunit/includes/Revision/RevisionRecordTests.php",
        'MediaWiki\Tests\Revision\RevisionStoreDbTestBase' => "$testDir/phpunit/includes/Revision/RevisionStoreDbTestBase.php",
        'MediaWiki\Tests\Revision\PreMcrSchemaOverride' => "$testDir/phpunit/includes/Revision/PreMcrSchemaOverride.php",
+       'MediaWiki\Tests\Revision\RevisionStoreRecordTest' => "$testDir/phpunit/includes/Revision/RevisionStoreRecordTest.php",
 
        # tests/phpunit/languages
        'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php",
index 0e6a3ee..699de95 100644 (file)
@@ -282,7 +282,6 @@ class ParserTestRunner {
                $setup['wgHtml5'] = true;
                $setup['wgDisableLangConversion'] = false;
                $setup['wgDisableTitleConversion'] = false;
-               $setup['wgMediaInTargetLanguage'] = false;
 
                // "extra language links"
                // see https://gerrit.wikimedia.org/r/111390
@@ -1090,7 +1089,6 @@ class ParserTestRunner {
                                + [ 'ISBN' => true, 'PMID' => true, 'RFC' => true ],
                        // Test with legacy encoding by default until HTML5 is very stable and default
                        'wgFragmentMode' => [ 'legacy' ],
-                       'wgMediaInTargetLanguage' => self::getOptionValue( 'wgMediaInTargetLanguage', $opts, false ),
                ];
 
                $nonIncludable = self::getOptionValue( 'wgNonincludableNamespaces', $opts, false );
index a73d036..7ef057a 100644 (file)
@@ -37,7 +37,7 @@
 # You can also set the following parser properties via test options:
 #  wgEnableUploads, wgAllowExternalImages, wgMaxTocLevel,
 #  wgLinkHolderBatchSize, wgRawHtml, wgInterwikiMagic,
-#  wgEnableMagicLinks, wgMediaInTargetLanguage
+#  wgEnableMagicLinks
 #
 # For testing purposes, temporary articles can created:
 # !!article / NAMESPACE:TITLE / !!text / ARTICLE TEXT / !!endarticle
@@ -15955,7 +15955,6 @@ parsoid=wt2html,wt2wt,html2html
 SVG thumbnails in page language
 !! options
 language=ru
-wgMediaInTargetLanguage = true
 !! wikitext
 [[File:Foobar.svg]] [[File:Foobar.svg|lang=en]]
 !! html/php
@@ -15967,7 +15966,6 @@ wgMediaInTargetLanguage = true
 SVG thumbnails in page language not present in the file
 !! options
 language=de
-wgMediaInTargetLanguage = true
 !! wikitext
 [[File:Foobar.svg]] [[File:Foobar.svg|lang=ru]]
 !! html/php
index fa351ea..da5e4b3 100644 (file)
@@ -315,8 +315,6 @@ return [
                "PhanParamTooMany",
                // approximate error count: 3
                "PhanParamTooManyInternal",
-               // approximate error count: 1
-               "PhanRedefineFunctionInternal",
                // approximate error count: 2
                "PhanTraitParentReference",
                // approximate error count: 3
diff --git a/tests/phpunit/includes/Revision/RevisionStoreCacheRecordTest.php b/tests/phpunit/includes/Revision/RevisionStoreCacheRecordTest.php
new file mode 100644 (file)
index 0000000..8684cd3
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+namespace MediaWiki\Tests\Revision;
+
+use Title;
+use MediaWiki\User\UserIdentityValue;
+use TextContent;
+use CommentStoreComment;
+use MediaWiki\Revision\RevisionStoreCacheRecord;
+use MediaWiki\Revision\RevisionSlots;
+use MediaWiki\Revision\SlotRecord;
+use MediaWiki\Revision\RevisionRecord;
+use MediaWiki\Revision\RevisionStoreRecord;
+
+/**
+ * @covers \MediaWiki\Revision\RevisionStoreCacheRecord
+ * @covers \MediaWiki\Revision\RevisionStoreRecord
+ * @covers \MediaWiki\Revision\RevisionRecord
+ */
+class RevisionStoreCacheRecordTest extends RevisionStoreRecordTest {
+
+       /**
+        * @param array $rowOverrides
+        * @param bool|callable callback function to use, or false for a default no-op callback
+        *
+        * @return RevisionStoreRecord
+        */
+       protected function newRevision( array $rowOverrides = [], $callback = false ) {
+               $title = Title::newFromText( 'Dummy' );
+               $title->resetArticleID( 17 );
+
+               $user = new UserIdentityValue( 11, 'Tester', 0 );
+               $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
+
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
+               $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
+               $slots = new RevisionSlots( [ $main, $aux ] );
+
+               $row = [
+                       'rev_id' => '7',
+                       'rev_page' => strval( $title->getArticleID() ),
+                       'rev_timestamp' => '20200101000000',
+                       'rev_deleted' => 0,
+                       'rev_minor_edit' => 0,
+                       'rev_parent_id' => '5',
+                       'rev_len' => $slots->computeSize(),
+                       'rev_sha1' => $slots->computeSha1(),
+                       'rev_user' => '11',
+                       'page_latest' => '18',
+               ];
+
+               $row = array_merge( $row, $rowOverrides );
+
+               if ( !$callback ) {
+                       $callback = function ( $revId ) use ( $row ) {
+                               return (object)$row;
+                       };
+               }
+
+               return new RevisionStoreCacheRecord(
+                       $callback,
+                       $title,
+                       $user,
+                       $comment,
+                       (object)$row,
+                       $slots
+               );
+       }
+
+       public function testCallback() {
+               // Provide a callback that returns non-default values. Asserting the revision returns
+               // these values confirms callback execution and behavior. Also confirm the callback
+               // is only invoked once, even for multiple getter calls.
+               $rowOverrides = [
+                       'rev_deleted' => RevisionRecord::DELETED_TEXT,
+                       'rev_user' => 12,
+               ];
+               $callbackInvoked = 0;
+               $callback = function ( $revId ) use ( &$callbackInvoked, $rowOverrides ) {
+                       $callbackInvoked++;
+                       return (object)$rowOverrides;
+               };
+               $rev = $this->newRevision( [], $callback );
+
+               $this->assertSame( RevisionRecord::DELETED_TEXT, $rev->getVisibility() );
+               $this->assertSame( 12, $rev->getUser()->getId() );
+               $this->assertSame( 1, $callbackInvoked );
+       }
+
+}
index 018df48..51c483d 100644 (file)
@@ -14,6 +14,7 @@ use MediaWiki\Revision\IncompleteRevisionException;
 use MediaWiki\Revision\MutableRevisionRecord;
 use MediaWiki\Revision\RevisionArchiveRecord;
 use MediaWiki\Revision\RevisionRecord;
+use MediaWiki\Revision\RevisionStoreRecord;
 use MediaWiki\Revision\RevisionSlots;
 use MediaWiki\Revision\RevisionStore;
 use MediaWiki\Revision\SlotRecord;
@@ -1705,4 +1706,195 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->testNewMutableRevisionFromArray( $array );
        }
 
+       /**
+        * Creates a new revision for testing caching behavior
+        *
+        * @param WikiPage $page the page for the new revision
+        * @param RevisionStore $store store object to use for creating the revision
+        * @return bool|RevisionStoreRecord the revision created, or false if missing
+        */
+       private function createRevisionStoreCacheRecord( $page, $store ) {
+               $user = MediaWikiTestCase::getMutableTestUser()->getUser();
+               $updater = $page->newPageUpdater( $user );
+               $updater->setContent( SlotRecord::MAIN, new WikitextContent( __METHOD__ ) );
+               $summary = CommentStoreComment::newUnsavedComment( __METHOD__ );
+               $rev = $updater->saveRevision( $summary, EDIT_NEW );
+               return $store->getKnownCurrentRevision( $page->getTitle(), $rev->getId() );
+       }
+
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::getKnownCurrentRevision
+        */
+       public function testGetKnownCurrentRevision_userNameChange() {
+               global $wgActorTableSchemaMigrationStage;
+
+               $this->overrideMwServices();
+               $cache = new WANObjectCache( [ 'cache' => new HashBagOStuff() ] );
+               $this->setService( 'MainWANObjectCache', $cache );
+
+               $store = MediaWikiServices::getInstance()->getRevisionStore();
+               $page = $this->getNonexistingTestPage();
+               $rev = $this->createRevisionStoreCacheRecord( $page, $store );
+
+               // Grab the user name
+               $userNameBefore = $rev->getUser()->getName();
+
+               // Change the user name in the database, "behind the back" of the cache
+               $newUserName = "Renamed $userNameBefore";
+               $this->db->update( 'revision',
+                       [ 'rev_user_text' => $newUserName ],
+                       [ 'rev_id' => $rev->getId() ] );
+               $this->db->update( 'user',
+                       [ 'user_name' => $newUserName ],
+                       [ 'user_id' => $rev->getUser()->getId() ] );
+               if ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) {
+                       $this->db->update( 'actor',
+                               [ 'actor_name' => $newUserName ],
+                               [ 'actor_user' => $rev->getUser()->getId() ] );
+               }
+
+               // Reload the revision and regrab the user name.
+               $revAfter = $store->getKnownCurrentRevision( $page->getTitle(), $rev->getId() );
+               $userNameAfter = $revAfter->getUser()->getName();
+
+               // The two user names should be different.
+               // If they are the same, we are seeing a cached value, which is bad.
+               $this->assertNotSame( $userNameBefore, $userNameAfter );
+
+               // This is implied by the above assertion, but explicitly check it, for completeness
+               $this->assertSame( $newUserName, $userNameAfter );
+       }
+
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::getKnownCurrentRevision
+        */
+       public function testGetKnownCurrentRevision_revDelete() {
+               $this->overrideMwServices();
+               $cache = new WANObjectCache( [ 'cache' => new HashBagOStuff() ] );
+               $this->setService( 'MainWANObjectCache', $cache );
+
+               $store = MediaWikiServices::getInstance()->getRevisionStore();
+               $page = $this->getNonexistingTestPage();
+               $rev = $this->createRevisionStoreCacheRecord( $page, $store );
+
+               // Grab the deleted bitmask
+               $deletedBefore = $rev->getVisibility();
+
+               // Change the deleted bitmask in the database, "behind the back" of the cache
+               $this->db->update( 'revision',
+                       [ 'rev_deleted' => RevisionRecord::DELETED_TEXT ],
+                       [ 'rev_id' => $rev->getId() ] );
+
+               // Reload the revision and regrab the visibility flag.
+               $revAfter = $store->getKnownCurrentRevision( $page->getTitle(), $rev->getId() );
+               $deletedAfter = $revAfter->getVisibility();
+
+               // The two deleted flags should be different.
+               // If they are the same, we are seeing a cached value, which is bad.
+               $this->assertNotSame( $deletedBefore, $deletedAfter );
+
+               // This is implied by the above assertion, but explicitly check it, for completeness
+               $this->assertSame( RevisionRecord::DELETED_TEXT, $deletedAfter );
+       }
+
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::newRevisionFromRow
+        */
+       public function testNewRevisionFromRow_userNameChange() {
+               global $wgActorTableSchemaMigrationStage;
+
+               $page = $this->getTestPage();
+               $text = __METHOD__;
+               /** @var Revision $rev */
+               $rev = $page->doEditContent(
+                       new WikitextContent( $text ),
+                       __METHOD__
+               )->value['revision'];
+
+               $store = MediaWikiServices::getInstance()->getRevisionStore();
+               $record = $store->newRevisionFromRow(
+                       $this->revisionToRow( $rev ),
+                       [],
+                       $page->getTitle()
+               );
+
+               // Grab the user name
+               $userNameBefore = $record->getUser()->getName();
+
+               // Change the user name in the database
+               $newUserName = "Renamed $userNameBefore";
+               $this->db->update( 'revision',
+                       [ 'rev_user_text' => $newUserName ],
+                       [ 'rev_id' => $record->getId() ] );
+               $this->db->update( 'user',
+                       [ 'user_name' => $newUserName ],
+                       [ 'user_id' => $record->getUser()->getId() ] );
+               if ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) {
+                       $this->db->update( 'actor',
+                               [ 'actor_name' => $newUserName ],
+                               [ 'actor_user' => $record->getUser()->getId() ] );
+               }
+
+               // Reload the record, passing $fromCache as true to force fresh info from the db,
+               // and regrab the user name
+               $recordAfter = $store->newRevisionFromRow(
+                       $this->revisionToRow( $rev ),
+                       [],
+                       $page->getTitle(),
+                       true
+               );
+               $userNameAfter = $recordAfter->getUser()->getName();
+
+               // The two user names should be different.
+               // If they are the same, we are seeing a cached value, which is bad.
+               $this->assertNotSame( $userNameBefore, $userNameAfter );
+
+               // This is implied by the above assertion, but explicitly check it, for completeness
+               $this->assertSame( $newUserName, $userNameAfter );
+       }
+
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::newRevisionFromRow
+        */
+       public function testNewRevisionFromRow_revDelete() {
+               $page = $this->getTestPage();
+               $text = __METHOD__;
+               /** @var Revision $rev */
+               $rev = $page->doEditContent(
+                       new WikitextContent( $text ),
+                       __METHOD__
+               )->value['revision'];
+
+               $store = MediaWikiServices::getInstance()->getRevisionStore();
+               $record = $store->newRevisionFromRow(
+                       $this->revisionToRow( $rev ),
+                       [],
+                       $page->getTitle()
+               );
+
+               // Grab the deleted bitmask
+               $deletedBefore = $record->getVisibility();
+
+               // Change the deleted bitmask in the database
+               $this->db->update( 'revision',
+                       [ 'rev_deleted' => RevisionRecord::DELETED_TEXT ],
+                       [ 'rev_id' => $record->getId() ] );
+
+               // Reload the record, passing $fromCache as true to force fresh info from the db,
+               // and regrab the deleted bitmask
+               $recordAfter = $store->newRevisionFromRow(
+                       $this->revisionToRow( $rev ),
+                       [],
+                       $page->getTitle(),
+                       true
+               );
+               $deletedAfter = $recordAfter->getVisibility();
+
+               // The two deleted flags should be different, because we modified the database.
+               $this->assertNotSame( $deletedBefore, $deletedAfter );
+
+               // This is implied by the above assertion, but explicitly check it, for completeness
+               $this->assertSame( RevisionRecord::DELETED_TEXT, $deletedAfter );
+       }
+
 }
index c4b274d..1ddc254 100644 (file)
@@ -21,6 +21,9 @@ use Wikimedia\Rdbms\LoadBalancer;
 use Wikimedia\TestingAccessWrapper;
 use WikitextContent;
 
+/**
+ * Tests RevisionStore
+ */
 class RevisionStoreTest extends MediaWikiTestCase {
 
        private function useTextId() {
index e67d405..49601cb 100644 (file)
@@ -142,7 +142,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $this->assertNull( $manager->getAuthenticationSessionData( 'reset-pass' ) );
 
                $manager->removeAuthenticationSessionData( null );
-               $status = \Status::newGood();
+               $status = \Status::newGood( [ 'suggestChangeOnLogin' => true ] );
                $status->error( 'testing' );
                $providerPriv->setPasswordResetFlag( 'Foo', $status );
                $ret = $manager->getAuthenticationSessionData( 'reset-pass' );
index e1b25a1..6d831f6 100644 (file)
@@ -38,11 +38,11 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                        $this->manager = new AuthManager( new \FauxRequest(), $config );
                }
                $this->validity = \Status::newGood();
-
                $provider = $this->getMockBuilder( LocalPasswordPrimaryAuthenticationProvider::class )
                        ->setMethods( [ 'checkPasswordValidity' ] )
                        ->setConstructorArgs( [ [ 'loginOnly' => $loginOnly ] ] )
                        ->getMock();
+
                $provider->expects( $this->any() )->method( 'checkPasswordValidity' )
                        ->will( $this->returnCallback( function () {
                                return $this->validity;
@@ -167,7 +167,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                $this->manager->removeAuthenticationSessionData( null );
                $row->user_password_expires = null;
-               $status = \Status::newGood();
+               $status = \Status::newGood( [ 'suggestChangeOnLogin' => true ] );
                $status->error( 'testing' );
                $providerPriv->setPasswordResetFlag( $userName, $status, $row );
                $ret = $this->manager->getAuthenticationSessionData( 'reset-pass' );
@@ -184,6 +184,14 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $this->assertNotNull( $ret );
                $this->assertSame( 'resetpass-validity', $ret->msg->getKey() );
                $this->assertTrue( $ret->hard );
+
+               $this->manager->removeAuthenticationSessionData( null );
+               $row->user_password_expires = null;
+               $status = \Status::newGood( [ 'suggestChangeOnLogin' => false, ] );
+               $status->error( 'testing' );
+               $providerPriv->setPasswordResetFlag( $userName, $status, $row );
+               $ret = $this->manager->getAuthenticationSessionData( 'reset-pass' );
+               $this->assertNull( $ret );
        }
 
        public function testAuthentication() {
@@ -275,6 +283,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                // Successful auth with reset
                $this->manager->removeAuthenticationSessionData( null );
+               $this->validity = \Status::newGood( [ 'suggestChangeOnLogin' => true ] );
                $this->validity->error( 'arbitrary-warning' );
                $this->assertEquals(
                        AuthenticationResponse::newPass( $userName ),
@@ -664,5 +673,4 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $ret = $provider->beginPrimaryAuthentication( $reqs );
                $this->assertEquals( AuthenticationResponse::PASS, $ret->status, 'new password is set' );
        }
-
 }
index a8ea3f0..f42f8b4 100644 (file)
@@ -158,6 +158,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $handler = ContentHandler::getForTitle( $title );
                $lang = $handler->getPageLanguage( $title );
 
+               $this->assertInstanceOf( Language::class, $lang );
                $this->assertEquals( $expected->getCode(), $lang->getCode() );
        }
 
index 7aef246..6b94d0a 100644 (file)
@@ -18,11 +18,6 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
         */
        public function testGetXMLMetadata( $infile, $expected ) {
                $r = new XMLReader();
-               if ( !method_exists( $r, 'readInnerXML' ) ) {
-                       $this->markTestSkipped( 'XMLReader::readInnerXML() does not exist (libxml >2.6.20 needed).' );
-
-                       return;
-               }
                $this->assertMetadata( $infile, $expected );
        }
 
index 80881ad..ec7bafc 100644 (file)
@@ -35,10 +35,18 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
                        'PasswordCannotMatchUsername' => true,
                ],
                'sysop' => [
-                       'MinimalPasswordLength' => 8,
+                       'MinimalPasswordLength' => [ 'value' => 8, 'suggestChangeOnLogin' => true ],
                        'MinimumPasswordLengthToLogin' => 1,
                        'PasswordCannotMatchUsername' => true,
                ],
+               'bureaucrat' => [
+                       'MinimalPasswordLength' => [
+                               'value' => 6,
+                               'suggestChangeOnLogin' => false,
+                               'forceChange' => true,
+                       ],
+                       'PasswordCannotMatchUsername' => true,
+               ],
                'default' => [
                        'MinimalPasswordLength' => 4,
                        'MinimumPasswordLengthToLogin' => 1,
@@ -67,7 +75,7 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
                $user = $this->getTestUser( [ 'sysop' ] )->getUser();
                $this->assertArrayEquals(
                        [
-                               'MinimalPasswordLength' => 8,
+                               'MinimalPasswordLength' => [ 'value' => 8, 'suggestChangeOnLogin' => true ],
                                'MinimumPasswordLengthToLogin' => 1,
                                'PasswordCannotMatchUsername' => true,
                                'PasswordCannotMatchBlacklist' => true,
@@ -79,7 +87,11 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
                $user = $this->getTestUser( [ 'sysop', 'checkuser' ] )->getUser();
                $this->assertArrayEquals(
                        [
-                               'MinimalPasswordLength' => [ 'value' => 10, 'forceChange' => true ],
+                               'MinimalPasswordLength' => [
+                                       'value' => 10,
+                                       'forceChange' => true,
+                                       'suggestChangeOnLogin' => true
+                               ],
                                'MinimumPasswordLengthToLogin' => 6,
                                'PasswordCannotMatchUsername' => true,
                                'PasswordCannotMatchBlacklist' => true,
@@ -92,13 +104,17 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
        public function testGetPoliciesForGroups() {
                $effective = UserPasswordPolicy::getPoliciesForGroups(
                        $this->policies,
-                       [ 'user', 'checkuser' ],
+                       [ 'user', 'checkuser', 'sysop' ],
                        $this->policies['default']
                );
 
                $this->assertArrayEquals(
                        [
-                               'MinimalPasswordLength' => [ 'value' => 10, 'forceChange' => true ],
+                               'MinimalPasswordLength' => [
+                                       'value' => 10,
+                                       'forceChange' => true,
+                                       'suggestChangeOnLogin' => true
+                               ],
                                'MinimumPasswordLengthToLogin' => 6,
                                'PasswordCannotMatchUsername' => true,
                                'PasswordCannotMatchBlacklist' => true,
@@ -125,12 +141,16 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
                $success = Status::newGood( [] );
                $warning = Status::newGood( [] );
                $forceChange = Status::newGood( [ 'forceChange' => true ] );
+               $suggestChangeOnLogin = Status::newGood( [ 'suggestChangeOnLogin' => true ] );
                $fatal = Status::newGood( [] );
+
                // the message does not matter, we only test for state and value
                $warning->warning( 'invalid-password' );
                $forceChange->warning( 'invalid-password' );
+               $suggestChangeOnLogin->warning( 'invalid-password' );
                $warning->warning( 'invalid-password' );
                $fatal->fatal( 'invalid-password' );
+
                return [
                        'No groups, default policy, password too short to login' => [
                                [],
@@ -147,16 +167,21 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
                                'abcdabcdabcd',
                                $success,
                        ],
-                       'Sysop with short password' => [
+                       'Sysop with short password and suggestChangeOnLogin set to true' => [
                                [ 'sysop' ],
                                'abcd',
-                               $warning,
+                               $suggestChangeOnLogin,
                        ],
                        'Checkuser with short password' => [
-                               [ 'sysop', 'checkuser' ],
+                               [ 'checkuser' ],
                                'abcdabcd',
                                $forceChange,
                        ],
+                       'Bureaucrat bad password with forceChange true, suggestChangeOnLogin false' => [
+                               [ 'bureaucrat' ],
+                               'short',
+                               $forceChange,
+                       ],
                        'Checkuser with too short password to login' => [
                                [ 'sysop', 'checkuser' ],
                                'abcd',
@@ -281,6 +306,29 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
                                        ],
                                ], // max
                        ],
+                       'complex value in both p1 and p2 #2' => [
+                               [
+                                       'MinimalPasswordLength' => [
+                                               'value' => 8,
+                                               'foo' => 1,
+                                               'baz' => false,
+                                       ],
+                               ], // p1
+                               [
+                                       'MinimalPasswordLength' => [
+                                               'value' => 2,
+                                               'bar' => true
+                                       ],
+                               ], // p2
+                               [
+                                       'MinimalPasswordLength' => [
+                                               'value' => 8,
+                                               'foo' => 1,
+                                               'bar' => true,
+                                               'baz' => false,
+                                       ],
+                               ], // max
+                       ],
                ];
        }
 
index ef8fb4e..1d87c90 100644 (file)
@@ -85,11 +85,6 @@ class TestUtils {
         */
        public static function getDummySession( $backend = null, $index = -1, $logger = null ) {
                $rc = new \ReflectionClass( Session::class );
-               if ( !method_exists( $rc, 'newInstanceWithoutConstructor' ) ) {
-                       \PHPUnit_Framework_Assert::markTestSkipped(
-                               'ReflectionClass::newInstanceWithoutConstructor isn\'t available'
-                       );
-               }
 
                if ( $backend === null ) {
                        $backend = new DummySessionBackend;
index b263762..60ce575 100644 (file)
@@ -18,14 +18,17 @@ class PasswordPolicyStructureTest extends MediaWikiTestCase {
 
                // This won't actually find all flags, just the ones in use. Can't really be helped,
                // other than adding the core flags here.
-               $flags = [ 'forceChange' ];
+               $flags = [ 'forceChange', 'suggestChangeOnLogin' ];
                foreach ( $wgPasswordPolicy['policies'] as $group => $checks ) {
                        foreach ( $checks as $check => $settings ) {
                                if ( is_array( $settings ) ) {
-                                       $flags = array_merge( $flags, array_diff( $settings, [ 'value' ] ) );
+                                       $flags = array_unique(
+                                               array_merge( $flags, array_diff( array_keys( $settings ), [ 'value' ] ) )
+                                       );
                                }
                        }
                }
+
                foreach ( $flags as $flag ) {
                        yield [ $flag ];
                }
index 4606cbd..b3f04b7 100644 (file)
@@ -2,23 +2,31 @@
 
        var NOW = 9012, // miliseconds
                DEFAULT_DURATION = 5678, // seconds
+               jqcookie,
+               defaults = {
+                       prefix: 'mywiki',
+                       domain: 'example.org',
+                       path: '/path',
+                       expires: DEFAULT_DURATION,
+                       secure: false
+               },
+               setDefaults = require( 'mediawiki.cookie' ).setDefaults,
                expiryDate = new Date();
 
        expiryDate.setTime( NOW + ( DEFAULT_DURATION * 1000 ) );
 
-       QUnit.module( 'mediawiki.cookie', QUnit.newMwEnvironment( {
-               setup: function () {
-                       this.stub( $, 'cookie' ).returns( null );
-
-                       this.sandbox.useFakeTimers( NOW );
+       QUnit.module( 'mediawiki.cookie', {
+               beforeEach: function () {
+                       jqcookie = sinon.stub( $, 'cookie' ).returns( null );
+                       this.clock = sinon.useFakeTimers( NOW );
+                       this.savedDefaults = setDefaults( defaults );
                },
-               config: {
-                       wgCookiePrefix: 'mywiki',
-                       wgCookieDomain: 'example.org',
-                       wgCookiePath: '/path',
-                       wgCookieExpiration: DEFAULT_DURATION
+               afterEach: function () {
+                       jqcookie.restore();
+                       this.clock.restore();
+                       setDefaults( this.savedDefaults );
                }
-       } ) );
+       } );
 
        QUnit.test( 'set( key, value )', function ( assert ) {
                var call;
@@ -26,7 +34,7 @@
                // Simple case
                mw.cookie.set( 'foo', 'bar' );
 
-               call = $.cookie.lastCall.args;
+               call = jqcookie.lastCall.args;
                assert.strictEqual( call[ 0 ], 'mywikifoo' );
                assert.strictEqual( call[ 1 ], 'bar' );
                assert.deepEqual( call[ 2 ], {
                } );
 
                mw.cookie.set( 'foo', null );
-               call = $.cookie.lastCall.args;
+               call = jqcookie.lastCall.args;
                assert.strictEqual( call[ 1 ], null, 'null removes cookie' );
 
                mw.cookie.set( 'foo', undefined );
-               call = $.cookie.lastCall.args;
+               call = jqcookie.lastCall.args;
                assert.strictEqual( call[ 1 ], 'undefined', 'undefined is value' );
 
                mw.cookie.set( 'foo', false );
-               call = $.cookie.lastCall.args;
+               call = jqcookie.lastCall.args;
                assert.strictEqual( call[ 1 ], 'false', 'false is a value' );
 
                mw.cookie.set( 'foo', 0 );
-               call = $.cookie.lastCall.args;
+               call = jqcookie.lastCall.args;
                assert.strictEqual( call[ 1 ], '0', '0 is value' );
        } );
 
                date.setTime( 1234 );
 
                mw.cookie.set( 'foo', 'bar' );
-               options = $.cookie.lastCall.args[ 2 ];
+               options = jqcookie.lastCall.args[ 2 ];
                assert.deepEqual( options.expires, expiryDate, 'default expiration' );
 
                mw.cookie.set( 'foo', 'bar', date );
-               options = $.cookie.lastCall.args[ 2 ];
+               options = jqcookie.lastCall.args[ 2 ];
                assert.strictEqual( options.expires, date, 'custom expiration as Date' );
 
                date = new Date();
                date.setDate( date.getDate() + 1 );
 
                mw.cookie.set( 'foo', 'bar', 86400 );
-               options = $.cookie.lastCall.args[ 2 ];
+               options = jqcookie.lastCall.args[ 2 ];
                assert.deepEqual( options.expires, date, 'custom expiration as lifetime in seconds' );
 
                mw.cookie.set( 'foo', 'bar', null );
-               options = $.cookie.lastCall.args[ 2 ];
+               options = jqcookie.lastCall.args[ 2 ];
                assert.strictEqual( options.expires, undefined, 'null forces session cookie' );
 
-               // Per DefaultSettings.php, when wgCookieExpiration is 0, the default should
-               // be session cookies
-               mw.config.set( 'wgCookieExpiration', 0 );
+               // Per DefaultSettings.php, if wgCookieExpiration is 0,
+               // then the default should be session cookies
+               setDefaults( $.extend( {}, defaults, { expires: 0 } ) );
 
                mw.cookie.set( 'foo', 'bar' );
-               options = $.cookie.lastCall.args[ 2 ];
+               options = jqcookie.lastCall.args[ 2 ];
                assert.strictEqual( options.expires, undefined, 'wgCookieExpiration=0 results in session cookies by default' );
 
                mw.cookie.set( 'foo', 'bar', date );
-               options = $.cookie.lastCall.args[ 2 ];
+               options = jqcookie.lastCall.args[ 2 ];
                assert.strictEqual( options.expires, date, 'custom expiration (with wgCookieExpiration=0)' );
        } );
 
                        secure: true
                } );
 
-               call = $.cookie.lastCall.args;
+               call = jqcookie.lastCall.args;
                assert.strictEqual( call[ 0 ], 'myPrefixfoo' );
                assert.deepEqual( call[ 2 ], {
                        expires: expiryDate,
                        secure: true
                } );
 
-               call = $.cookie.lastCall.args;
+               call = jqcookie.lastCall.args;
                assert.strictEqual( call[ 0 ], 'myPrefixfoo' );
                assert.deepEqual( call[ 2 ], {
                        expires: date,
 
                mw.cookie.get( 'foo' );
 
-               key = $.cookie.lastCall.args[ 0 ];
+               key = jqcookie.lastCall.args[ 0 ];
                assert.strictEqual( key, 'mywikifoo', 'Default prefix' );
 
                mw.cookie.get( 'foo', undefined );
-               key = $.cookie.lastCall.args[ 0 ];
+               key = jqcookie.lastCall.args[ 0 ];
                assert.strictEqual( key, 'mywikifoo', 'Use default prefix for undefined' );
 
                mw.cookie.get( 'foo', null );
-               key = $.cookie.lastCall.args[ 0 ];
+               key = jqcookie.lastCall.args[ 0 ];
                assert.strictEqual( key, 'mywikifoo', 'Use default prefix for null' );
 
                mw.cookie.get( 'foo', '' );
-               key = $.cookie.lastCall.args[ 0 ];
+               key = jqcookie.lastCall.args[ 0 ];
                assert.strictEqual( key, 'foo', 'Don\'t use default prefix for empty string' );
 
                value = mw.cookie.get( 'foo' );
        QUnit.test( 'get( key ) - with value', function ( assert ) {
                var value;
 
-               $.cookie.returns( 'bar' );
+               jqcookie.returns( 'bar' );
 
                value = mw.cookie.get( 'foo' );
                assert.strictEqual( value, 'bar', 'Return value of cookie' );
 
                mw.cookie.get( 'foo', 'bar' );
 
-               key = $.cookie.lastCall.args[ 0 ];
+               key = jqcookie.lastCall.args[ 0 ];
                assert.strictEqual( key, 'barfoo' );
        } );