Merge "XmlSelect: Fix PHPDoc param comments for addOption() & formatOptions()"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sat, 22 Dec 2018 00:25:15 +0000 (00:25 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 22 Dec 2018 00:25:15 +0000 (00:25 +0000)
153 files changed:
.travis.yml
RELEASE-NOTES-1.32
RELEASE-NOTES-1.33
composer.json
docs/hooks.txt
includes/DefaultSettings.php
includes/DummyLinker.php
includes/Html.php
includes/Linker.php
includes/Message.php
includes/Revision.php
includes/Storage/DerivedPageDataUpdater.php
includes/Title.php
includes/actions/HistoryAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiComparePages.php
includes/api/ApiDelete.php
includes/api/ApiErrorFormatter.php
includes/api/ApiMain.php
includes/api/i18n/ar.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/mk.json
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/zh-hant.json
includes/auth/AuthManager.php
includes/cache/CacheHelper.php
includes/cache/localisation/LCStoreStaticArray.php
includes/changes/ChangesList.php
includes/changes/OldChangesList.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/br.json
includes/installer/i18n/cs.json
includes/installer/i18n/da.json
includes/installer/i18n/diq.json
includes/installer/i18n/ja.json
includes/installer/i18n/qqq.json
includes/installer/i18n/sr-ec.json
includes/libs/objectcache/WANObjectCache.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/field/SQLiteField.php
includes/logging/LogPager.php
includes/mail/EmailNotification.php
includes/media/MediaTransformOutput.php
includes/pager/IndexPager.php
includes/pager/TablePager.php
includes/password/PasswordPolicyChecks.php
includes/profiler/ProfilerExcimer.php
includes/shell/Command.php
includes/specials/SpecialBlock.php
includes/specials/SpecialUnblock.php
includes/specials/pagers/ActiveUsersPager.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/ImageListPager.php
includes/specials/pagers/MergeHistoryPager.php
includes/specials/pagers/NewFilesPager.php
includes/specials/pagers/NewPagesPager.php
includes/specials/pagers/ProtectedTitlesPager.php
includes/specials/pagers/UsersPager.php
includes/user/BotPassword.php
includes/user/User.php
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/br.json
languages/i18n/ca.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/io.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/myv.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/shn.json
languages/i18n/sr-ec.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tru.json
languages/i18n/ur.json
languages/i18n/yue.json
languages/i18n/zh-hant.json
maintenance/archives/patch-change_tag-indexes.sql
maintenance/archives/patch-tag_summary-ts_id.sql [deleted file]
maintenance/archives/patch-tag_summary-ts_log_id-unsigned.sql [deleted file]
maintenance/archives/patch-tag_summary-ts_rev_id-unsigned.sql [deleted file]
maintenance/archives/patch-tag_summary.sql [deleted file]
maintenance/archives/patch-valid_tag.sql [deleted file]
maintenance/mssql/archives/patch-tag_summary-ts_id.sql [deleted file]
maintenance/mssql/archives/patch-user_groups-ug_expiry.sql
maintenance/mssql/tables.sql
maintenance/oracle/archives/patch-tag_summary-ts_id.sql [deleted file]
maintenance/oracle/tables.sql
maintenance/populateChangeTagDef.php
maintenance/postgres/archives/patch-tag_summary.sql [deleted file]
maintenance/postgres/archives/patch-valid_tag.sql [deleted file]
maintenance/postgres/tables.sql
maintenance/sqlite/archives/patch-tag_summary-ts_id.sql [deleted file]
maintenance/tables.sql
resources/src/mediawiki.base/mediawiki.base.js
resources/src/mediawiki.htmlform.ooui.styles.less
resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js
resources/src/mediawiki.special/special.css
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.less
resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.definitions.less
tests/parser/parserTests.txt
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/MagicWordFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php
tests/phpunit/includes/Storage/PageUpdaterTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiComparePagesTest.php
tests/phpunit/includes/api/ApiDeleteTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/changetags/ChangeTagsTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/specials/ContribsPagerTest.php
tests/phpunit/includes/user/UserTest.php

index 4260c46..3be6531 100644 (file)
@@ -34,6 +34,8 @@ matrix:
   include:
     # On Trusty, mysql user 'travis' doesn't have create database rights
     # Postgres has no user called 'root'.
+    - env: dbtype=mysql dbuser=root
+      php: 7.3
     - env: dbtype=mysql dbuser=root
       php: 7.2
     - env: dbtype=mysql dbuser=root
@@ -50,6 +52,7 @@ matrix:
     - env: dbtype=mysql dbuser=root
       php: hhvm-3.18
   allow_failures:
+    - php: 7.3
     - php: hhvm-3.18
     - php: hhvm-3.21
     - php: hhvm-3.24
index 5f034b5..cac65ab 100644 (file)
@@ -133,6 +133,8 @@ production.
 * Added a new hook, 'UserGetRightsRemove', which can be used to remove rights
   from user. Unlike the 'UserGetRights' it will ensure that removed rights
   will not be reinserted.
+* (T197535) Extensions can now specify PHP versions and PHP extensions they
+  depend on.
 
 === External library changes in 1.32 ===
 
index 1ab9d4e..7566b63 100644 (file)
@@ -37,6 +37,8 @@ production.
 * (T96041) __EXPECTUNUSEDCATEGORY__ on a category page causes the category
   to be hidden on Special:UnusedCategories.
 * Add PasswordPolicy to check the password isn't in the large blacklist.
+* The AuthManagerLoginAuthenticateAudit hook has a new parameter for
+  additional information about the authentication event.
 * …
 
 === External library changes in 1.33 ===
@@ -53,6 +55,9 @@ production.
 ==== Changed external libraries ====
 * Updated wikimedia/xmp-reader from 0.6.0 to 0.6.1.
 * Updated wikimedia/scoped-callback from 2.0.0 to 3.0.0.
+* Updated wikimedia/ip-set from 1.2.0 to 2.0.0.
+  * The deprecated IPSet\IPSet alias was removed, Wikimedia\IPSet must be
+    used instead.
 * …
 
 ==== Removed external libraries ====
@@ -70,7 +75,9 @@ production.
     exceptions will now include the "Wikimedia\Rdbms\" prefix in the class name.
   * The code including an exception class name is deprecated. In the future,
     all internal errors will use code "internal_api_error".
-* …
+* (T212356) When using action=delete on pages with many revisions, the module
+  may return a boolean-true 'scheduled' and no 'logid'. This signifies that the
+  deletion will be processed via the job queue.
 
 === Action API internal changes in 1.33 ===
 * A number of deprecated methods for API documentation, intended for overriding
@@ -184,11 +191,17 @@ because of Phabricator reports.
   domain ID as a key component and use makeGlobalKey().
 * (T202094) Title::getUserCaseDBKey() is deprecated; instead, please use
   Title::getDBKey(), which doesn't vary case.
+* User::getPasswordValidity() is now deprecated. User::checkPasswordValidity()
+  returns the same information in a more useful format.
+* For Linker::generateTOC() and Linker::tocList(), passing strings or booleans
+  as the $lang parameter was deprecated. The same applies to DummyLinker.
 * …
 
 === Other changes in 1.33 ===
 * (T208871) The hard-coded Google search form on the database error page was
   removed.
+* (T201747) Html::openElement() warns if given an element name wiht a space
+  in it.
 * …
 
 == Compatibility ==
index 08b0e01..1157333 100644 (file)
@@ -44,7 +44,7 @@
                "wikimedia/cldr-plural-rule-parser": "1.0.0",
                "wikimedia/composer-merge-plugin": "1.4.1",
                "wikimedia/html-formatter": "1.0.2",
-               "wikimedia/ip-set": "1.2.0",
+               "wikimedia/ip-set": "2.0.0",
                "wikimedia/less.php": "1.8.0",
                "wikimedia/object-factory": "1.0.0",
                "wikimedia/password-blacklist": "0.1.4",
index a7ff453..28065fc 100644 (file)
@@ -786,7 +786,11 @@ $response: The MediaWiki\Auth\AuthenticationResponse in either a PASS or FAIL
 $user: The User object being authenticated against, or null if authentication
   failed before getting that far.
 $username: A guess at the user name being authenticated, or null if we can't
-  even determine that.
+  even determine that. When $user is not null, it can be in the form of
+  <username>@<more info> (e.g. for bot passwords).
+$extraData: An array (string => string) with extra information, intended to be
+  added to log contexts. Fields it might include:
+  - appId: the application ID, only if the login was with a bot password
 
 'AuthPluginAutoCreate': DEPRECATED since 1.27! Use the 'LocalUserCreated' hook
 instead. Called when creating a local account for an user logged in from an
index 2f1efbf..420da4f 100644 (file)
@@ -4451,29 +4451,49 @@ $wgCentralIdLookupProviders = [
 $wgCentralIdLookupProvider = 'local';
 
 /**
- * Password policy for local wiki users. A user's effective policy
- * is the superset of all policy statements from the policies for the
- * groups where the user is a member. If more than one group policy
- * include the same policy statement, the value is the max() of the
- * values. Note true > false. The 'default' policy group is required,
- * and serves as the minimum policy for all users. New statements can
- * be added by appending to $wgPasswordPolicy['checks'].
- * Statements:
- *     - MinimalPasswordLength - minimum length a user can set
- *     - MinimumPasswordLengthToLogin - passwords shorter than this will
+ * Password policy for the wiki.
+ * Structured as
+ * [
+ *     'policies' => [ <group> => [ <policy> => <value>, ... ], ... ],
+ *     'checks' => [ <policy> => <callback>, ... ],
+ * ]
+ * where <group> is a user group, <policy> is a password policy name
+ * (arbitrary string) defined in the 'checks' part, <callback> is the
+ * PHP callable implementing the policy check, <value> is a number,
+ * boolean or null that gets passed to the callback.
+ *
+ * A user's effective policy is the superset of all policy statements
+ * from the policies for the groups where the user is a member. If more
+ * than one group policy include the same policy statement, the value is
+ * the max() of the values. Note true > false. The 'default' policy group
+ * is required, and serves as the minimum policy for all users.
+ *
+ * Callbacks receive three arguments: the policy value, the User object
+ * and the password; and must return a StatusValue. A non-good status
+ * means the password will not be accepted for new accounts, and existing
+ * accounts will be prompted for password change or barred from logging in
+ * (depending on whether the status is a fatal or merely error/warning).
+ *
+ * The checks supported by core are:
+ *     - MinimalPasswordLength - Minimum length a user can set.
+ *     - MinimumPasswordLengthToLogin - Passwords shorter than this will
  *             not be allowed to login, regardless if it is correct.
  *     - MaximalPasswordLength - maximum length password a user is allowed
  *             to attempt. Prevents DoS attacks with pbkdf2.
- *     - PasswordCannotMatchUsername - Password cannot match username to
+ *     - PasswordCannotMatchUsername - Password cannot match the username.
  *     - PasswordCannotMatchBlacklist - Username/password combination cannot
- *             match a specific, hardcoded blacklist.
+ *             match a blacklist of default passwords used by MediaWiki in the past.
  *     - PasswordCannotBePopular - Blacklist passwords which are known to be
  *             commonly chosen. Set to integer n to ban the top n passwords.
  *             If you want to ban all common passwords on file, use the
  *             PHP_INT_MAX constant.
  *     - PasswordNotInLargeBlacklist - Password not in best practices list of
- *             100,000 commonly used passwords.
+ *             100,000 commonly used passwords. Due to the size of the list this
+ *      is a probabilistic test.
+ *
  * @since 1.26
+ * @see PasswordPolicyChecks
+ * @see User::checkPasswordValidity()
  */
 $wgPasswordPolicy = [
        'policies' => [
@@ -5820,6 +5840,7 @@ $wgGrantPermissions['editmycssjs']['editmyuserjson'] = true;
 $wgGrantPermissions['editmycssjs']['editmyuserjs'] = true;
 
 $wgGrantPermissions['editmyoptions']['editmyoptions'] = true;
+$wgGrantPermissions['editmyoptions']['editmyuserjson'] = true;
 
 $wgGrantPermissions['editinterface'] = $wgGrantPermissions['editpage'];
 $wgGrantPermissions['editinterface']['editinterface'] = true;
index 2f5455e..ba1233e 100644 (file)
@@ -345,11 +345,11 @@ class DummyLinker {
                return Linker::tocLineEnd();
        }
 
-       public function tocList( $toc, $lang = false ) {
+       public function tocList( $toc, $lang = null ) {
                return Linker::tocList( $toc, $lang );
        }
 
-       public function generateTOC( $tree, $lang = false ) {
+       public function generateTOC( $tree, $lang = null ) {
                return Linker::generateTOC( $tree, $lang );
        }
 
index d066eff..0aea7ea 100644 (file)
@@ -255,6 +255,12 @@ class Html {
                // consistency and better compression.
                $element = strtolower( $element );
 
+               // Some people were abusing this by passing things like
+               // 'h1 id="foo" to $element, which we don't want.
+               if ( strpos( $element, ' ' ) !== false ) {
+                       wfWarn( __METHOD__ . " given element name with space '$element'" );
+               }
+
                // Remove invalid input types
                if ( $element == 'input' ) {
                        $validTypes = [
index 731317e..b605acd 100644 (file)
@@ -1575,11 +1575,18 @@ class Linker {
         *
         * @since 1.16.3
         * @param string $toc Html of the Table Of Contents
-        * @param string|Language|bool $lang Language for the toc title, defaults to user language
+        * @param string|Language|bool|null $lang Language for the toc title, defaults to user language.
+        *  The types string and bool are deprecated.
         * @return string Full html of the TOC
         */
-       public static function tocList( $toc, $lang = false ) {
-               $lang = wfGetLangObj( $lang );
+       public static function tocList( $toc, $lang = null ) {
+               global $wgLang;
+               $lang = $lang ?? $wgLang;
+               if ( !is_object( $lang ) ) {
+                       wfDeprecated( __METHOD__ . ' with type other than Language for $lang', '1.33' );
+                       $lang = wfGetLangObj( $lang );
+               }
+
                $title = wfMessage( 'toc' )->inLanguage( $lang )->escaped();
 
                return '<div id="toc" class="toc">'
@@ -1611,10 +1618,11 @@ class Linker {
         *
         * @since 1.16.3. $lang added in 1.17
         * @param array $tree Return value of ParserOutput::getSections()
-        * @param string|Language|bool $lang Language for the toc title, defaults to user language
+        * @param string|Language|bool|null $lang Language for the toc title, defaults to user language.
+        *  The types string and bool are deprecated.
         * @return string HTML fragment
         */
-       public static function generateTOC( $tree, $lang = false ) {
+       public static function generateTOC( $tree, $lang = null ) {
                $toc = '';
                $lastLevel = 0;
                foreach ( $tree as $section ) {
index 15d9786..4049e11 100644 (file)
@@ -289,7 +289,6 @@ class Message implements MessageSpecifier, Serializable {
                        'parameters' => $this->parameters,
                        'format' => $this->format,
                        'useDatabase' => $this->useDatabase,
-                       'title' => $this->title,
                        'titlestr' => $this->title ? $this->title->getFullText() : null,
                ] );
        }
index 6d1812a..b0a3ba3 100644 (file)
@@ -29,6 +29,7 @@ use MediaWiki\Revision\RevisionStore;
 use MediaWiki\Revision\RevisionStoreRecord;
 use MediaWiki\Revision\SlotRecord;
 use MediaWiki\Storage\SqlBlobStore;
+use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
@@ -589,6 +590,8 @@ class Revision implements IDBAccessObject {
                                '$row must be a row object, an associative array, or a RevisionRecord'
                        );
                }
+
+               Assert::postcondition( $this->mRecord !== null, 'Failed to construct a RevisionRecord' );
        }
 
        /**
@@ -1180,9 +1183,7 @@ class Revision implements IDBAccessObject {
                $rec = self::getRevisionStore()->insertRevisionOn( $this->mRecord, $dbw );
 
                $this->mRecord = $rec;
-
-               // Avoid PHP 7.1 warning of passing $this by reference
-               $revision = $this;
+               Assert::postcondition( $this->mRecord !== null, 'Failed to acquire a RevisionRecord' );
 
                return $rec->getId();
        }
index c401d44..9ce12b4 100644 (file)
@@ -151,6 +151,9 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         */
        private $options = [
                'changed' => true,
+               // newrev is true if prepareUpdate is handling the creation of a new revision,
+               // as opposed to a null edit or a forced update.
+               'newrev' => false,
                'created' => false,
                'moved' => false,
                'restored' => false,
@@ -1110,12 +1113,14 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                // Override fields defined in $this->options with values from $options.
                $this->options = array_intersect_key( $options, $this->options ) + $this->options;
 
-               if ( isset( $this->pageState['oldId'] ) ) {
-                       $oldId = $this->pageState['oldId'];
+               if ( $this->revision ) {
+                       $oldId = $this->pageState['oldId'] ?? 0;
+                       $this->options['newrev'] = ( $revision->getId() !== $oldId );
                } elseif ( isset( $this->options['oldrevision'] ) ) {
                        /** @var Revision|RevisionRecord $oldRev */
                        $oldRev = $this->options['oldrevision'];
                        $oldId = $oldRev->getId();
+                       $this->options['newrev'] = ( $revision->getId() !== $oldId );
                } else {
                        $oldId = $revision->getParentId();
                }
@@ -1611,8 +1616,8 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                // Save it to the parser cache. Use the revision timestamp in the case of a
                // freshly saved edit, as that matches page_touched and a mismatch would trigger an
                // unnecessary reparse.
-               $timestamp = $this->options['changed'] ? $this->revision->getTimestamp()
-                       : $output->getTimestamp();
+               $timestamp = $this->options['newrev'] ? $this->revision->getTimestamp()
+                       : $output->getCacheTime();
                $this->parserCache->save(
                        $output, $wikiPage, $this->getCanonicalParserOptions(),
                        $timestamp, $this->revision->getId()
index 55c5cd9..909f528 100644 (file)
@@ -2861,10 +2861,12 @@ class Title implements LinkTarget {
                }
 
                $errors = [];
-               while ( count( $checks ) > 0 &&
-                               !( $short && count( $errors ) > 0 ) ) {
-                       $method = array_shift( $checks );
+               foreach ( $checks as $method ) {
                        $errors = $this->$method( $action, $user, $errors, $rigor, $short );
+
+                       if ( $short && $errors !== [] ) {
+                               break;
+                       }
                }
 
                return $errors;
@@ -3276,9 +3278,13 @@ class Title implements LinkTarget {
         * indicating who can move or edit the page from the page table, (pre 1.10) rows.
         * Edit and move sections are separated by a colon
         * Example: "edit=autoconfirmed,sysop:move=sysop"
+        * @param bool $readLatest When true, skip replicas and read from the master DB.
         */
-       public function loadRestrictionsFromRows( $rows, $oldFashionedRestrictions = null ) {
-               $dbr = wfGetDB( DB_REPLICA );
+       public function loadRestrictionsFromRows(
+               $rows, $oldFashionedRestrictions = null, $readLatest = false
+       ) {
+               $whichDb = $readLatest ? DB_MASTER : DB_REPLICA;
+               $dbr = wfGetDB( $whichDb );
 
                $restrictionTypes = $this->getRestrictionTypes();
 
@@ -3348,9 +3354,10 @@ class Title implements LinkTarget {
         * indicating who can move or edit the page from the page table, (pre 1.10) rows.
         * Edit and move sections are separated by a colon
         * Example: "edit=autoconfirmed,sysop:move=sysop"
+        * @param bool $readLatest When true, skip replicas and read from the master DB.
         */
-       public function loadRestrictions( $oldFashionedRestrictions = null ) {
-               if ( $this->mRestrictionsLoaded ) {
+       public function loadRestrictions( $oldFashionedRestrictions = null, $readLatest = false ) {
+               if ( $this->mRestrictionsLoaded && !$readLatest ) {
                        return;
                }
 
@@ -3360,10 +3367,11 @@ class Title implements LinkTarget {
                        $fname = __METHOD__;
                        $rows = $cache->getWithSetCallback(
                                // Page protections always leave a new null revision
-                               $cache->makeKey( 'page-restrictions', $id, $this->getLatestRevID() ),
+                               $cache->makeKey( 'page-restrictions', $id, $this->getLatestRevID(), $readLatest ),
                                $cache::TTL_DAY,
-                               function ( $curValue, &$ttl, array &$setOpts ) use ( $fname ) {
-                                       $dbr = wfGetDB( DB_REPLICA );
+                               function ( $curValue, &$ttl, array &$setOpts ) use ( $fname, $readLatest ) {
+                                       $whichDb = $readLatest ? DB_MASTER : DB_REPLICA;
+                                       $dbr = wfGetDB( $whichDb );
 
                                        $setOpts += Database::getCacheSetOptions( $dbr );
 
@@ -3378,7 +3386,7 @@ class Title implements LinkTarget {
                                }
                        );
 
-                       $this->loadRestrictionsFromRows( $rows, $oldFashionedRestrictions );
+                       $this->loadRestrictionsFromRows( $rows, $oldFashionedRestrictions, $readLatest );
                } else {
                        $title_protection = $this->getTitleProtectionInternal();
 
@@ -5221,10 +5229,9 @@ class Title implements LinkTarget {
 
                if ( MWNamespace::hasSubpages( $this->mNamespace ) ) {
                        // Optional notice for page itself and any parent page
-                       $parts = explode( '/', $this->mDbkeyform );
                        $editnotice_base = $editnotice_ns;
-                       while ( count( $parts ) > 0 ) {
-                               $editnotice_base .= '-' . array_shift( $parts );
+                       foreach ( explode( '/', $this->mDbkeyform ) as $part ) {
+                               $editnotice_base .= '-' . $part;
                                $msg = wfMessage( $editnotice_base );
                                if ( $msg->exists() ) {
                                        $html = $msg->parseAsBlock();
index 7d6b548..140ca2e 100644 (file)
@@ -492,7 +492,7 @@ class HistoryPager extends ReverseChronologicalPager {
                return $s;
        }
 
-       function doBatchLookups() {
+       protected function doBatchLookups() {
                if ( !Hooks::run( 'PageHistoryPager::doBatchLookups', [ $this, $this->mResult ] ) ) {
                        return;
                }
@@ -523,7 +523,7 @@ class HistoryPager extends ReverseChronologicalPager {
         *
         * @return string HTML output
         */
-       function getStartBody() {
+       protected function getStartBody() {
                $this->lastRow = false;
                $this->counter = 1;
                $this->oldIdChecked = 0;
@@ -585,7 +585,7 @@ class HistoryPager extends ReverseChronologicalPager {
                return $element;
        }
 
-       function getEndBody() {
+       protected function getEndBody() {
                if ( $this->lastRow ) {
                        $latest = $this->counter == 1 && $this->mIsFirst;
                        $firstInList = $this->counter == 1;
index d29131b..1efd747 100644 (file)
@@ -1949,9 +1949,14 @@ abstract class ApiBase extends ContextSource {
         * @since 1.29
         * @param StatusValue $status
         * @param string[] $types 'warning' and/or 'error'
+        * @param string[] $filter Message keys to filter out (since 1.33)
         */
-       public function addMessagesFromStatus( StatusValue $status, $types = [ 'warning', 'error' ] ) {
-               $this->getErrorFormatter()->addMessagesFromStatus( $this->getModulePath(), $status, $types );
+       public function addMessagesFromStatus(
+               StatusValue $status, $types = [ 'warning', 'error' ], array $filter = []
+       ) {
+               $this->getErrorFormatter()->addMessagesFromStatus(
+                       $this->getModulePath(), $status, $types, $filter
+               );
        }
 
        /**
index 3581ac8..ed3d01c 100644 (file)
@@ -57,25 +57,11 @@ class ApiBlock extends ApiBase {
                $editingRestriction = 'sitewide';
                $pageRestrictions = '';
                if ( $this->getConfig()->get( 'EnablePartialBlocks' ) ) {
-                       if ( $params['pagerestrictions'] ) {
-                               $count = count( $params['pagerestrictions'] );
-                               if ( $count > 10 ) {
-                                       $this->dieWithError(
-                                               $this->msg(
-                                                       'apierror-integeroutofrange-abovebotmax',
-                                                       'pagerestrictions',
-                                                       10,
-                                                       $count
-                                               )
-                                       );
-                               }
-                       }
-
                        if ( $params['partial'] ) {
                                $editingRestriction = 'partial';
                        }
 
-                       $pageRestrictions = implode( "\n", $params['pagerestrictions'] );
+                       $pageRestrictions = implode( "\n", (array)$params['pagerestrictions'] );
                }
 
                if ( $params['userid'] !== null ) {
@@ -207,6 +193,8 @@ class ApiBlock extends ApiBase {
                        $params['partial'] = false;
                        $params['pagerestrictions'] = [
                                ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_ISMULTI_LIMIT1 => 10,
+                               ApiBase::PARAM_ISMULTI_LIMIT2 => 10,
                        ];
                }
 
index f688346..4ba30ab 100644 (file)
@@ -74,16 +74,48 @@ class ApiComparePages extends ApiBase {
                        switch ( $params['torelative'] ) {
                                case 'prev':
                                        // Swap 'from' and 'to'
-                                       list( $toRev, $toRelRev2, $toValsRev ) = [ $fromRev, $fromRelRev, $fromValsRev ];
-                                       $fromRev = $this->revisionStore->getPreviousRevision( $fromRelRev );
+                                       list( $toRev, $toRelRev, $toValsRev ) = [ $fromRev, $fromRelRev, $fromValsRev ];
+                                       $fromRev = $this->revisionStore->getPreviousRevision( $toRelRev );
                                        $fromRelRev = $fromRev;
                                        $fromValsRev = $fromRev;
+                                       if ( !$fromRev ) {
+                                               $title = Title::newFromLinkTarget( $toRelRev->getPageAsLinkTarget() );
+                                               $this->addWarning( [
+                                                       'apiwarn-compare-no-prev',
+                                                       wfEscapeWikiText( $title->getPrefixedText() ),
+                                                       $toRelRev->getId()
+                                               ] );
+
+                                               // (T203433) Create an empty dummy revision as the "previous".
+                                               // The main slot has to exist, the rest will be handled by DifferenceEngine.
+                                               $fromRev = $this->revisionStore->newMutableRevisionFromArray( [
+                                                       'title' => $title ?: Title::makeTitle( NS_SPECIAL, 'Badtitle/' . __METHOD__ )
+                                               ] );
+                                               $fromRev->setContent(
+                                                       SlotRecord::MAIN,
+                                                       $toRelRev->getContent( SlotRecord::MAIN, RevisionRecord::RAW )
+                                                               ->getContentHandler()
+                                                               ->makeEmptyContent()
+                                               );
+                                       }
                                        break;
 
                                case 'next':
                                        $toRev = $this->revisionStore->getNextRevision( $fromRelRev );
                                        $toRelRev = $toRev;
                                        $toValsRev = $toRev;
+                                       if ( !$toRev ) {
+                                               $title = Title::newFromLinkTarget( $fromRelRev->getPageAsLinkTarget() );
+                                               $this->addWarning( [
+                                                       'apiwarn-compare-no-next',
+                                                       wfEscapeWikiText( $title->getPrefixedText() ),
+                                                       $fromRelRev->getId()
+                                               ] );
+
+                                               // (T203433) The web UI treats "next" as "cur" in this case.
+                                               // Avoid repeating metadata by making a MutableRevisionRecord with no changes.
+                                               $toRev = MutableRevisionRecord::newFromParentRevision( $fromRelRev );
+                                       }
                                        break;
 
                                case 'cur':
@@ -103,10 +135,12 @@ class ApiComparePages extends ApiBase {
                        list( $toRev, $toRelRev, $toValsRev ) = $this->getDiffRevision( 'to', $params );
                }
 
-               // Handle missing from or to revisions
+               // Handle missing from or to revisions (should never happen)
+               // @codeCoverageIgnoreStart
                if ( !$fromRev || !$toRev ) {
                        $this->dieWithError( 'apierror-baddiff' );
                }
+               // @codeCoverageIgnoreEnd
 
                // Handle revdel
                if ( !$fromRev->audienceCan(
index ec857b7..7e8041d 100644 (file)
@@ -75,9 +75,10 @@ class ApiDelete extends ApiBase {
                        $status = self::delete( $pageObj, $user, $reason, $params['tags'] );
                }
 
-               if ( !$status->isGood() ) {
+               if ( !$status->isOk() ) {
                        $this->dieStatus( $status );
                }
+               $this->addMessagesFromStatus( $status, [ 'warning' ], [ 'delete-scheduled' ] );
 
                // Deprecated parameters
                if ( $params['watch'] ) {
@@ -92,8 +93,14 @@ class ApiDelete extends ApiBase {
                $r = [
                        'title' => $titleObj->getPrefixedText(),
                        'reason' => $reason,
-                       'logid' => $status->value
                ];
+               if ( $status->hasMessage( 'delete-scheduled' ) ) {
+                       $r['scheduled'] = true;
+               }
+               if ( $status->value !== null ) {
+                       // Scheduled deletions don't currently have a log entry available at this point
+                       $r['logid'] = $status->value;
+               }
                $this->getResult()->addValue( null, $this->getModuleName(), $r );
        }
 
index a37ecc2..9669464 100644 (file)
@@ -153,9 +153,10 @@ class ApiErrorFormatter {
         * @param string|null $modulePath
         * @param StatusValue $status
         * @param string[]|string $types 'warning' and/or 'error'
+        * @param string[] $filter Messages to filter out (since 1.33)
         */
        public function addMessagesFromStatus(
-               $modulePath, StatusValue $status, $types = [ 'warning', 'error' ]
+               $modulePath, StatusValue $status, $types = [ 'warning', 'error' ], array $filter = []
        ) {
                if ( $status->isGood() || !$status->getErrors() ) {
                        return;
@@ -178,7 +179,9 @@ class ApiErrorFormatter {
                                ->inLanguage( $this->lang )
                                ->title( $this->getDummyTitle() )
                                ->useDatabase( $this->useDB );
-                       $this->addWarningOrError( $tag, $modulePath, $msg );
+                       if ( !in_array( $msg->getKey(), $filter, true ) ) {
+                               $this->addWarningOrError( $tag, $modulePath, $msg );
+                       }
                }
        }
 
index bc76f8f..3cc3407 100644 (file)
@@ -829,6 +829,7 @@ class ApiMain extends ApiBase {
                        'dnt',
                        'origin',
                        /* MediaWiki whitelist */
+                       'user-agent',
                        'api-user-agent',
                ] );
                foreach ( $requestedHeaders as $rHeader ) {
index 17c95be..518a4fa 100644 (file)
        "apiwarn-badurlparam": "تعذر تحليل <var>$1urlparam</var> لـ$2، باستخدام العرض والطول فقط.",
        "apiwarn-badutf8": "تحتوي القيمة التي تم تمريرها لـ<var>$1</var> على بيانات غير صالحة أو غير طبيعية، يجب أن تكون البيانات النصية صالحة، NFC-normalized Unicode بدون أحرف تحكم C0 غير HT (\\t) وLF (\\n) وCR (\\r).",
        "apiwarn-checktoken-percentencoding": "تحقق من أن الرموز مثل \"+\" في الرمز المميز يتم ترميزها بشكل صحيح في المسار.",
+       "apiwarn-compare-no-next": "المراجعة $2 هي أحدث مراجعة من $1، ولا توجد مراجعة لـ<kbd>torelative=next</kbd>  للمقارنة بها.",
+       "apiwarn-compare-no-prev": "المراجعة $2 هي أقدم مراجعة من $1، ولا توجد مراجعة لـ<kbd>torelative=next</kbd>  للمقارنة بها.",
        "apiwarn-compare-nocontentmodel": "لا يمكن تحديد نموذج محتوى، على افتراض $1.",
        "apiwarn-deprecation-deletedrevs": "تم إيقاف <kbd>list=deletedrevs</kbd>; الرجاء استخدام <kbd>prop=deletedrevisions</kbd> or <kbd>list=alldeletedrevisions</kbd> بدلا من ذلك.",
        "apiwarn-deprecation-httpsexpected": "HTTP المستخدمة عند توقع HTTPS.",
index 8643135..f626d2b 100644 (file)
        "apierror-unknownerror-nocode": "Unbekannter Fehler.",
        "apierror-unknownerror": "Unbekannter Fehler: „$1“.",
        "apierror-unknownformat": "Nicht erkanntes Format „$1“.",
+       "apiwarn-compare-no-next": "Die Version $2 ist die aktuelle Version von $1. Es gibt keine zu vergleichende Version für <kbd>torelative=next</kbd>.",
+       "apiwarn-compare-no-prev": "Die Version $2 ist die aktuelle Version von $1. Es gibt keine zu vergleichende Version für <kbd>torelative=prev</kbd>.",
        "apiwarn-deprecation-missingparam": "Da <var>$1</var> nicht angegeben wurde, wurde ein veraltetes Format für die Ausgabe verwendet. Dieses Format ist veraltet und in Zukunft wird immer das neue Format benutzt.",
        "apiwarn-ignoring-invalid-templated-value": "Ignorieren des Wertes <kbd>$2</kbd> in <var>$1</var> bei der Verarbeitung von Vorlagenparametern.",
        "apiwarn-invalidcategory": "„$1“ ist keine Kategorie.",
index 9b74c5e..8f5ba8d 100644 (file)
        "apiwarn-badurlparam": "Could not parse <var>$1urlparam</var> for $2. Using only width and height.",
        "apiwarn-badutf8": "The value passed for <var>$1</var> contains invalid or non-normalized data. Textual data should be valid, NFC-normalized Unicode without C0 control characters other than HT (\\t), LF (\\n), and CR (\\r).",
        "apiwarn-checktoken-percentencoding": "Check that symbols such as \"+\" in the token are properly percent-encoded in the URL.",
+       "apiwarn-compare-no-next": "Revision $2 is the latest revision of $1, there is no revision for <kbd>torelative=next</kbd> to compare to.",
+       "apiwarn-compare-no-prev": "Revision $2 is the earliest revision of $1, there is no revision for <kbd>torelative=prev</kbd> to compare to.",
        "apiwarn-compare-nocontentmodel": "No content model could be determined, assuming $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> has been deprecated. Please use <kbd>prop=deletedrevisions</kbd> or <kbd>list=alldeletedrevisions</kbd> instead.",
        "apiwarn-deprecation-httpsexpected": "HTTP used when HTTPS was expected.",
index 5d453b4..6801faa 100644 (file)
        "apiwarn-badurlparam": "Impossible d'analyser <var>$1urlparam</var> pour $2. En utilisant seulement la largeur et la hauteur.",
        "apiwarn-badutf8": "La valeur passée pour <var>$1</var> contient des données non valides ou non normalisées. Les données textuelles doivent être de l’Unicode valide normalisé en NFC sans caractères de contrôle c0 autres que HT (\\t), LF (\\n) et CR (\\r).",
        "apiwarn-checktoken-percentencoding": "Vérifier que les symboles tels que \"+\" dans le jeton sont correctement  codés avec des pourcents dans l'URL.",
+       "apiwarn-compare-no-next": "La version $2 est la dernière version de $1, il n'existe pas de version <kbd>torelative=next</kbd> à comparer.",
+       "apiwarn-compare-no-prev": "La version $2 est la plus ancienne de $1, il n'existe pas de version <kbd>torelative=prev</kbd> à comparer.",
        "apiwarn-compare-nocontentmodel": "Aucun modèle de contenu n’a pu être déterminé, $1 est supposé.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> est devenu désuet. Veuillez utiliser <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd> à la place.",
        "apiwarn-deprecation-httpsexpected": "HTTP est utilisé alors que HTTPS est attendu.",
index 3370d73..94ee481 100644 (file)
@@ -49,6 +49,8 @@
        "apihelp-block-param-reblock": "אם המשתמש כבר חסום, לדרוס את החסימה הנוכחית.",
        "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.",
        "apihelp-block-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.",
+       "apihelp-block-param-partial": "חסימת משתמש מעריכת דפים או מרחבי שם מסוימים ולא מכל האתר.",
+       "apihelp-block-param-pagerestrictions": "רשימת כותרות שהמשתמש ייחסם מלערוך. חל רק כאשר \"partial\" מוגדל ל־true.",
        "apihelp-block-example-ip-simple": "חסימת כתובת ה־IP‏ <kbd>192.0.2.5</kbd> לשלושה ימים עם הסיבה <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "חסימת המשתמש <kbd>Vandal</kbd> ללא הגבלת זמן עם הסיבה <kbd>Vandalism</kbd>, ומניעת יצירת חשבונות חדשים ושליחת דוא\"ל.",
        "apihelp-changeauthenticationdata-summary": "שינוי נתוני אימות עבור המשתמש הנוכחי.",
        "apihelp-compare-param-fromtitle": "כותרת ראשונה להשוואה.",
        "apihelp-compare-param-fromid": "מס׳ זיהוי של הדף הראשון להשוואה.",
        "apihelp-compare-param-fromrev": "גרסה ראשונה להשוואה.",
-       "apihelp-compare-param-frompst": "לעשות התמרה לפני שמירה ב־<var>fromtext</var>.",
-       "apihelp-compare-param-fromtext": "להשתמש בטקסט הזה במקום תוכן הגרסה שהוגדרה על־ידי <var dir=\"ltr\">fromtitle</var>, <var dir=\"ltr\">fromid</var> או <var dir=\"ltr\">fromrev</var>.",
-       "apihelp-compare-param-fromcontentmodel": "מודל התוכן של <var>fromtext</var>. אם זה לא סופק, ייעשה ניחוש על סמך פרמטרים אחרים.",
-       "apihelp-compare-param-fromcontentformat": "תסדיר הסדרת תוכן של <var>fromtext</var>.",
+       "apihelp-compare-param-frompst": "לעשות התמרה לפני שמירה ב־<var>romtext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-fromslots": "דריסת תוכן הגרסה שצוינה ב־<var>fromtitle</var>, ב־<var>fromid</var>, או ב־<var>fromrev</var>.\n\nהפרמטר הזה מציין את המשבצות שישונו. יש להשתמש ב־<var>fromtext-&#x7B;slot}</var>, ב־<var>fromcontentmodel-&#x7B;slot}</var>, וב־<var>fromcontentformat-&#x7B;slot}</var> לציון תוכן עבור כל משבצת.",
+       "apihelp-compare-param-fromtext-{slot}": "הטקסט של המשבצת שמצוינת. אם זה מושמט, המשבצת מוּסרת מהגרסה.",
+       "apihelp-compare-param-fromsection-{slot}": "כאשר <var>fromtext-&#x7B;slot}</var> הוא התוכן של פסקה אחת, זהו מספר הפסקה. הוא ימוזג לתוך הגרסה שמצוינת ב־<var>fromtitle</var>, ב־<var>fromid</var>, או ב־<var>fromrev</var> כמו בעריכת פסקה.",
+       "apihelp-compare-param-fromcontentmodel-{slot}": "מודל התוכן של <var>fromtext-&#x7B;slot}</var>. אם זה לא סופק, זה ינוחש לפי הפרמטרים האחרים.",
+       "apihelp-compare-param-fromcontentformat-{slot}": "תסדיר להסדרת תוכן של <var>fromtext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-fromtext": "יש לציין <kbd>fromslots=main</kbd> ולהשתמש ב־<var>fromtext-main</var> במקום זה.",
+       "apihelp-compare-param-fromcontentmodel": "יש לציין <kbd>fromslots=main</kbd> ולהשתמש ב־<var>fromcontentmodel-main</var> במקום זה.",
+       "apihelp-compare-param-fromcontentformat": "יש לציין <kbd>fromslots=main</kbd> ולהשתמש ב־<var>fromcontentformat-main</var> במקום זה.",
        "apihelp-compare-param-fromsection": "יש להשתמש רק בפסקה שצוינה בתוכן של הפרמטר 'from'.",
        "apihelp-compare-param-totitle": "כותרת שנייה להשוואה.",
        "apihelp-compare-param-toid": "מס׳ מזהה של הדף השני להשוואה.",
        "apihelp-compare-param-torev": "גרסה שנייה להשוואה.",
        "apihelp-compare-param-torelative": "להשתמש בגרסה יחסית לגרסה שהוסקה מ<var dir=\"ltr\">fromtitle</var>, <var dir=\"ltr\">fromid</var> או <var dir=\"ltr\">fromrev</var>. לכל אפשריות ה־\"to\" האחרות לא תהיה השפעה.",
        "apihelp-compare-param-topst": "לעשות התמרה לפני שמירה ב־<var>totext</var>.",
-       "apihelp-compare-param-totext": "להשתמש בטקסט הזה במקום התוכן של הגרסה שהוגדר ב־<var dir=\"ltr\">totitle</var>, <var dir=\"ltr\">toid</var> or <var dir=\"ltr\">torev</var>.",
-       "apihelp-compare-param-tocontentmodel": "מודל התוכן של <var>totext</var>. אם זה לא סופק, ייעשה ניחוש על סמך פרמטרים אחרים.",
-       "apihelp-compare-param-tocontentformat": "תסדיר הסדרת תוכן של <var>fromtext</var>.",
+       "apihelp-compare-param-toslots": "דריסת תוכן הגרסה שצוינה ב־<var>totitle</var>, ב־<var>toid</var>, או ב־<var>torev</var>.\n\nהפרמטר הזה מציין את המשבצות שישונו. יש להשתמש ב־<var>totext-&#x7B;slot}</var>, ב־<var>tocontentmodel-&#x7B;slot}</var>, וב־<var>tocontentformat-&#x7B;slot}</var> לציון תוכן עבור כל משבצת.",
+       "apihelp-compare-param-totext-{slot}": "הטקסט של המשבצת שמצוינת. אם זה מושמט, המשבצת מוּסרת מהגרסה.",
+       "apihelp-compare-param-tosection-{slot}": "כאשר <var>totext-&#x7B;slot}</var> הוא התוכן של פסקה אחת, זהו מספר הפסקה. הוא ימוזג לתוך הגרסה שמצוינת ב־<var>totitle</var>, ב־<var>toid</var>, או ב־<var>torev</var> כמו בעריכת פסקה.",
+       "apihelp-compare-param-tocontentmodel-{slot}": "מודל התוכן של <var>totext-&#x7B;slot}</var>. אם זה לא סופק, זה ינוחש לפי הפרמטרים האחרים.",
+       "apihelp-compare-param-tocontentformat-{slot}": "תסדיר להסדרת תוכן של <var>totext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-totext": "יש לציין <kbd>toslots=main</kbd> ולהשתמש ב־<var>totext-main</var> במקום זה.",
+       "apihelp-compare-param-tocontentmodel": "יש לציין <kbd>toslots=main</kbd> ולהשתמש ב־<var>tocontentmodel-main</var> במקום זה.",
+       "apihelp-compare-param-tocontentformat": "יש לציין <kbd>toslots=main</kbd> ולהשתמש ב־<var>tocontentformat-main</var> במקום זה.",
        "apihelp-compare-param-tosection": "יש להשתמש רק בפסקה שצוינה בתוכן של הפרמטר 'to'.",
        "apihelp-compare-param-prop": "אילו פריטי מידע לקבל.",
        "apihelp-compare-paramvalue-prop-diff": "ה־HTML של ההשוואה.",
        "apihelp-compare-paramvalue-prop-comment": "התקציר על גרסאות ה־\"from\" וה־\"to\".",
        "apihelp-compare-paramvalue-prop-parsedcomment": "התקציר המפוענח על גרסאות ה־\"from\" וה־\"to\".",
        "apihelp-compare-paramvalue-prop-size": "הגודל של גרסאות ה־\"from\" וה־\"to\".",
+       "apihelp-compare-param-slots": "החזרת השוואות פרטניו למשבצות האלה, ולא השוואה אחת משולבת לכל המשבצות.",
        "apihelp-compare-example-1": "יצירת תיעוד שינוי בין גרסה 1 ל־2.",
        "apihelp-createaccount-summary": "יצירת חשבון משתמש חדש.",
        "apihelp-createaccount-param-preservestate": "אם <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> החזיר true עבור <samp>hasprimarypreservedstate</samp>, בקשות שמסומנות בתור <samp>primary-required</samp> אמורות להיות מושמטות. אם מוחזר ערך לא ריק ל־<samp>preservedusername</samp>, שם המשתמש הזה ישמש לפרמטר <var>username</var>.",
        "apihelp-query+blocks-paramvalue-prop-reason": "הוספת הסיבה שניתנה לחסימה.",
        "apihelp-query+blocks-paramvalue-prop-range": "הוספת טווח כתובות ה־IP שהחסימה משפיעה עליהן.",
        "apihelp-query+blocks-paramvalue-prop-flags": "מתייג את ההחרמה (autoblock‏, anononly, וכו'.).",
+       "apihelp-query+blocks-paramvalue-prop-restrictions": "הוספת הגבלות החסימה החלקית אם החסימה אינה לכל האתר.",
        "apihelp-query+blocks-param-show": "להציג רק פריטים שמתאימים לאמות המידה האלו.\nלמשל, כדי לראות רק חסימות ללא לצמיתות על כתובות IP יש להגדיר <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "רשימת חסימות.",
        "apihelp-query+blocks-example-users": "רשימת חסימות של המשתמשים <kbd>Alice</kbd> ו־<kbd>Bob</kbd>.",
        "apihelp-query+info-paramvalue-prop-notificationtimestamp": "חותם־זמן של הודעת רשימת מעקב של כל דף.",
        "apihelp-query+info-paramvalue-prop-subjectid": "מזהה הדף של הדף העיקרי של כל דף שיחה.",
        "apihelp-query+info-paramvalue-prop-url": "נותן URL מלא, URL לעריכה ו־URL קנוני לכל דף.",
-       "apihelp-query+info-paramvalue-prop-readable": "×\94×\90×\9d ×\94×\9eשת×\9eש ×\99×\9b×\95×\9c ×\9c×\94צ×\99×\92 ×\93×£ זה.",
+       "apihelp-query+info-paramvalue-prop-readable": "×\94×\90×\9d ×\94×\9eשת×\9eש ×\99×\9b×\95×\9c ×\9cקר×\95×\90 ×\90ת ×\94×\93×£ ×\94×\96×\94. ×\99ש ×\9c×\94שת×\9eש ×\91Ö¾<kbd>intestactions=read</kbd> ×\91×\9eק×\95×\9d זה.",
        "apihelp-query+info-paramvalue-prop-preload": "נותן את הטקסט שמוחזר על־ידי EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "נותן את האופן שבה שם הדף באמת מוצג.",
        "apihelp-query+info-paramvalue-prop-varianttitles": "כותרת התצוגה בכל הגרסאות של שפת התוכן של האתר.",
        "apihelp-query+info-param-testactions": "בדיקה האם המשתמש הנוכחי יכול לבצע פעולות מסוימות על הדף.",
+       "apihelp-query+info-param-testactionsdetail": "רמת פירוט של <var>$1testactions</var>. יש להשתמש בפרמטרים <var>errorformat</var> ו־<var>errorlang</var> של [[Special:ApiHelp/main|המודול הראשי]] כדי לשלוט בתסדיר את ההודעות המוחזרות.",
+       "apihelp-query+info-paramvalue-testactionsdetail-boolean": "החזרת ערך בוליאני עבור כל פעולה.",
+       "apihelp-query+info-paramvalue-testactionsdetail-full": "החזרת הודעות שמתארות למה הפעולה אינה מותרת, או מערך ריק אם היא מותרת.",
+       "apihelp-query+info-paramvalue-testactionsdetail-quick": "כמו <kbd>full</kbd>, אבל בלי בדיקות יקרות.",
        "apihelp-query+info-param-token": "להשתמש ב־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] במקום.",
        "apihelp-query+info-example-simple": "קבלת מידע על הדף <kbd>Main Page</kbd>",
        "apihelp-query+info-example-protection": "קבלת מידע כללי ומידע על הגנה של הדף <kbd>Main Page</kbd>.",
        "apihelp-json-param-callback": "אם זה צוין, עוטף את הפלט לתוך קריאת פונקציה נתונה. למען הבטיחות, כל הנתונים הייחודיים למשתמש יוגבלו.",
        "apihelp-json-param-utf8": "אם זה צוין, רוב התווים שאינם ASCII (אבל לא כולם) יקודדו בתור UTF-8 במקום להתחלף בסדרות חילוף הקסדצימליות. זאת בררת המחדל אם הערך של <var>formatversion</var> הוא לא <kbd>1</kbd>.",
        "apihelp-json-param-ascii": "אם זה צוין, לקודד את כל מה שאינו ASCII בסדרות חילוף הקסדצימליות. זאת בררת המחדל כש־<var>formatversion</var> היא <kbd>1</kbd>.",
-       "apihelp-json-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
+       "apihelp-json-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני.\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
        "apihelp-jsonfm-summary": "לפלוט נתונים בתסדיר JSON (עם הדפסה יפה ב־HTML).",
        "apihelp-none-summary": "לא לפלוט שום דבר.",
        "apihelp-php-summary": "לפלוט נתונים בתסדיר PHP מוסדר.",
-       "apihelp-php-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
+       "apihelp-php-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני.\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
        "apihelp-phpfm-summary": "לפלוט נתונים בתסדיר PHP מוסדר (עם הדפסה יפה ב־HTML).",
        "apihelp-rawfm-summary": "לפלוט את הנתונים, כולל אלמנטים לניפוי שגיאות, בתסדיר JSON (עם הדפסה יפה ב־HTML).",
        "apihelp-xml-summary": "לפלוט נתונים בתסדיר XML.",
        "apierror-assertnameduserfailed": "הבדיקה שהמשתמש הוא \"$1\" נכשלה.",
        "apierror-assertuserfailed": "הבדיקה שהמשתמש נכנס לחשבון נכשלה.",
        "apierror-autoblocked": "כתובת ה־IP שלך נחסמה אוטומטית, כי היא שימשה משתמש חסום.",
+       "apierror-bad-badfilecontexttitle": "כותרת בלתי־תקינה בפרמטר <var>$1badfilecontexttitle</var>.",
        "apierror-badconfig-resulttoosmall": "הערך של <code dir=\"ltr\">$wgAPIMaxResultSize</code> בוויקי הזה קטן מלהחזיק מידע בסיסי על תוצאה.",
        "apierror-badcontinue": "פרמטר continue בלתי־תקין. יש להעביר את הערך המקורי שהחזירה השאילתה הקודמת.",
        "apierror-baddiff": "לא ניתן לאחזר את ההשוואה. גרסה אחת לא קיימת או ששתיהן לא קיימות, או שאין לך הרשאה להציג אותן.",
        "apierror-bad-watchlist-token": "סופק אסימון רשימת מעקב בלתי־תקין. נא להשתמש באסימון תקין ב־[[Special:Preferences]].",
        "apierror-blockedfrommail": "נחסמת משליחת דוא״ל.",
        "apierror-blocked": "נחסמת מעריכה.",
+       "apierror-blocked-partial": "נחסמת מעריכת הדף הזה.",
        "apierror-botsnotsupported": "הממשק הזה לא נתמך עבור בוטים.",
        "apierror-cannot-async-upload-file": "הפרמטרים  <var>async</var> ו־<var>file</var> אינם יכולים להיות משולבים. אם ברצונך לבצע עיבוד אסינכרוני של הקובץ המועלה שלך, יש להעלות אותו תחילה לסליק (באמצעות הפרמטר <var>stash</var>) ואז לפרסם את הקובץ המוסלק באופן אסינכרוני (באמצעות <var>filekey</var> ו־<var>async</var>).",
        "apierror-cannotreauthenticate": "הפעולה הזאת אינה זמינה, כי הזהות שלך לא יכולה להיות מאומתת.",
        "apierror-changeauth-norequest": "יצירת בקשת השינוי נכשלה.",
        "apierror-chunk-too-small": "גודל הפלח המזערי הוא {{PLURAL:$1|בית אחד|$1 בתים}} בשביל פלחים לא סופיים.",
        "apierror-cidrtoobroad": "טווחי CIDR של $1 שרחבים יותר מ־/$2 אינם קבילים.",
+       "apierror-compare-maintextrequired": "הפרמטר <var>$1text-main</var> נדרש כאשר <var>$1slots</var> מכיל <kbd>main</kbd> (לא ניתן למחוק את המשבצת הראשית).",
        "apierror-compare-no-title": "לא ניתן לעשות התמרה לפני שמירה ללא כותרת. נא לנסות לציין <var>fromtitle</var> או <var>totitle</var>.",
        "apierror-compare-nosuchfromsection": "הפסקה $1 אינה קיימת בתוכן של 'from'.",
        "apierror-compare-nosuchtosection": "הפסקה $1 אינה קיימת בתוכן של 'to'.",
+       "apierror-compare-nofromrevision": "אין גרסת \"from\". יש לציין <var>fromrev</var>‏, <var>fromtitle</var>, או <var>fromid</var>.",
+       "apierror-compare-notext": "הפרמטר <var>$1</var> אינו יכול לשמש ללא <var>$2</var>.",
+       "apierror-compare-notorevision": "אין גרסת \"to\". יש לציין <var>torev</var>‏, <var>totitle</var>, או <var>toid</var>.",
+       "apierror-compare-relative-to-deleted": "לא ניתן להשתמש ב־<kbd>torelative=$1</kbd> יחסית לגרסה מחוקה.",
        "apierror-compare-relative-to-nothing": "אין גרסת \"from\" עבור <var>torelative</var> שתהיה יחסית.",
        "apierror-contentserializationexception": "הסדרת התוכן נכשלה: $1",
        "apierror-contenttoobig": "התוכן שסיפקת חורג מגודל הערך המרבי של {{PLURAL:$1|קילובייט אחד|$1 קילובייטים}}.",
        "apierror-invalidexpiry": "זמן תפוגה בלתי־תקין \"$1\".",
        "apierror-invalid-file-key": "לא מפתח קובץ תקין.",
        "apierror-invalidlang": "קוד שפה בלתי־תקין לפרמטר <var>$1</var>.",
+       "apierror-invalidmethod": "שיטת HTTP בלתי־תקינה. נא לשקול להשתמש ב־GET או ב־POST.",
        "apierror-invalidoldimage": "הפרמטר <var>oldimage</var> נשלח בתסדיר בלתי־תקין.",
        "apierror-invalidparammix-cannotusewith": "הפרמטר <kbd>$1</kbd> אינו יכול לשמש עם <kbd>$2</kbd>.",
        "apierror-invalidparammix-mustusewith": "הפרמטר <kbd>$1</kbd> יכול לשמש רק עם <kbd>$2</kbd>.",
        "apierror-mimesearchdisabled": "חיפוש MIME כבוי במצב קמצן.",
        "apierror-missingcontent-pageid": "תוכן חסר עבור מזהה הדף $1.",
        "apierror-missingcontent-revid": "תוכן חסר עבור מזהה הגרסה $1.",
+       "apierror-missingcontent-revid-role": "תוכן חסר כבור מזהה גרסה $1 לתפקיד $2.",
        "apierror-missingparam-at-least-one-of": "דרוש {{PLURAL:$2|הפרמטר|לפחות אחד מהפרמטרים}} $1.",
        "apierror-missingparam-one-of": "דרוש {{PLURAL:$2|הפרמטר|אחד מהפרמטרים}} $1.",
        "apierror-missingparam": "הפרמטר <var>$1</var> צריך להיות מוגדר.",
        "apiwarn-badurlparam": "לא היה אפשר לפענח את <var>$1urlparam</var> עבור $2. משתמשים רק ב־width ו־height.",
        "apiwarn-badutf8": "הערך שהועבר ל־<var>$1</var> מכיל נתונים בלתי־תקינים או בלתי־מנורמלים. נתונים טקסט אמורים להיות תקינים, מנורמלי NFC וללא תווי בקרה C0 למעט <span dir=\"ltr\">HT (\\t)</span>&rlm;, <span dir=\"ltr\">LF (\\n)</span>&rlm; ו־<span dir=\"ltr\">CR (\\r)</span>.",
        "apiwarn-checktoken-percentencoding": "נא לבדוק שסימנים כמו \"+\" באסימון מקודדים עם אחוזים בצורה נכונה ב־URL.",
+       "apiwarn-compare-no-next": "הגרסה $2 היא הגרסה האחרונה של $1, אין גרסה עבור <kbd>torelative=next</kbd> להשוואה.",
+       "apiwarn-compare-no-prev": "הגרסה $2 היא הגרסה המוקדמת ביותר של $1, אין גרסה עבור <kbd>torelative=prev</kbd> להשוואה.",
        "apiwarn-compare-nocontentmodel": "לא היה אפשר לקבוע את מודל התוכן, נניח שזה $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> הוצהר בתור מיושן. נא להשתמש ב־ <kbd>prop=deletedrevisions</kbd> או ב־<kbd>list=alldeletedrevisions</kbd> במקום זה.",
        "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
index 1a2a744..56826b4 100644 (file)
@@ -81,7 +81,7 @@
        "apihelp-edit-param-tags": "Ознаки за измена што се однесуваат на преработката.",
        "apihelp-edit-param-minor": "Ситно уредување.",
        "apihelp-edit-param-notminor": "Неситно уредување.",
-       "apihelp-edit-param-bot": "Означи го уредувањево како ботовско.",
+       "apihelp-edit-param-bot": "Означи го уредувањето како ботовско.",
        "apihelp-edit-param-basetimestamp": "Датум и време на преработката на базата, кои се користат за утврдување на спротиставености во уредувањето. Може да се добие преку [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Датум и време кога сте почнало уредувањето, кои се користат за утврдување на спротиставености во уредувањата. Соодветната вредност се добива користејќи <var>[[Special:ApiHelp/main|curtimestamp]]</var> кога ќе почнете со уредување (на пр. кога ќе се вчита содржината што ќе ја уредувате).",
        "apihelp-edit-param-recreate": "Занемари ги грешките што се појавуваат во врска со страницата што е избришана во меѓувреме.",
index 53cc928..3740243 100644 (file)
        "apihelp-query+iwbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Dodaje prefiks interwiki.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Dodaje tytuł interwiki.",
-       "apihelp-query+iwlinks-summary": "Wyświetla wszystkie liki interwiki z danych stron.",
+       "apihelp-query+iwlinks-summary": "Wyświetla wszystkie linki interwiki z danych stron.",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
        "apihelp-query+iwlinks-param-limit": "Łączna liczba linków interwiki do zwrócenia.",
        "apihelp-query+langbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
index b3c26ce..1af3ce9 100644 (file)
        "apiwarn-badurlparam": "Não foi possível analisar <var>$1urlparam</var> por $2. Usando apenas largura e altura.",
        "apiwarn-badutf8": "O valor passado para <var>$1</var> contém dados inválidos ou não normalizados. Os dados textuais devem ser válidos, NFC-normalizado Unicode sem caracteres de controle C0 diferentes de HT (\\t), LF (\\n) e CR (\\r).",
        "apiwarn-checktoken-percentencoding": "Verificar se os símbolos, como \"+\" no token, estão codificados corretamente na URL.",
+       "apiwarn-compare-no-next": "A revisão $2 é a revisão mais recente de $1, não há nenhuma revisão seguinte para comparar com <kbd>torelative=next</kbd>.",
+       "apiwarn-compare-no-prev": "A revisão $2 é a revisão mais antiga de $1, não há nenhuma revisão anterior para comparar com <kbd>torelative=prev</kbd>.",
        "apiwarn-compare-nocontentmodel": "Nenhum modelo de conteúdo pode ser determinado, assumindo $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> foi depreciado. Por favor, use <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd> em vez.",
        "apiwarn-deprecation-httpsexpected": "HTTP usado quando o HTTPS era esperado.",
index a609992..0dbff88 100644 (file)
        "apiwarn-badurlparam": "Não foi possível analisar <var>$1urlparam</var> para $2. Serão utilizadas somente a largura e a altura.",
        "apiwarn-badutf8": "O valor passado para <var>$1</var> contém dados inválidos ou não normalizados. Os dados textuais devem estar em formato Unicode válido, normalizado em NFC, sem caracteres de controlo C0 exceto HT (\\t), LF (\\n) e CR (\\r).",
        "apiwarn-checktoken-percentencoding": "Verifique que símbolos como \"+\" na chave estão devidamente codificados com percentagem no URL.",
+       "apiwarn-compare-no-next": "A revisão $2 é a revisão mais recente de $1, não há nenhuma revisão seguinte para comparar com <kbd>torelative=next</kbd>.",
+       "apiwarn-compare-no-prev": "A revisão $2 é a revisão mais antiga de $1, não há nenhuma revisão anterior para comparar com <kbd>torelative=prev</kbd>.",
        "apiwarn-compare-nocontentmodel": "Não foi possível determinar nenhum modelo de conteúdo; será assumido $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> foi descontinuado. Em substituição, use <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd>, por favor.",
        "apiwarn-deprecation-httpsexpected": "Foi usado HTTP quando era esperado HTTPS.",
index b33f44a..6437adf 100644 (file)
        "apiwarn-badurlparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".\n* $2 - Image title.",
        "apiwarn-badutf8": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n{{doc-important|Do not translate \"\\t\", \"\\n\", and \"\\r\"}}",
        "apiwarn-checktoken-percentencoding": "{{doc-apierror}}",
+       "apiwarn-compare-no-next": "{{doc-apierror}}\n\nParameters:\n* $1 - Title of the page.\n* $2 - Revision ID.",
+       "apiwarn-compare-no-prev": "{{doc-apierror}}\n\nParameters:\n* $1 - Title of the page.\n* $2 - Revision ID.",
        "apiwarn-compare-nocontentmodel": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model being assumed.",
        "apiwarn-deprecation-deletedrevs": "{{doc-apierror}}",
        "apiwarn-deprecation-httpsexpected": "{{doc-apierror}}",
index 34ecc71..fe492c9 100644 (file)
        "apihelp-expandtemplates-param-includecomments": "輸出裡是否包含 HTML 註解。",
        "apihelp-expandtemplates-param-generatexml": "產生 XML 解析樹狀(以 $1prop=parsetree 取代)。",
        "apihelp-expandtemplates-example-simple": "展開 wiki 文字<kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>。",
-       "apihelp-feedcontributions-summary": "回傳使用者貢獻 Feed。",
-       "apihelp-feedcontributions-param-feedformat": "Feed 的格式。",
+       "apihelp-feedcontributions-summary": "回傳使用者貢獻摘要。",
+       "apihelp-feedcontributions-param-feedformat": "摘要的格式。",
        "apihelp-feedcontributions-param-user": "要取得哪些使用者的貢獻。",
        "apihelp-feedcontributions-param-year": "起始年份(更早之前)。",
        "apihelp-feedcontributions-param-month": "起始月份(更早之前)。",
        "apihelp-feedcontributions-param-hideminor": "隱藏小編輯。",
        "apihelp-feedcontributions-param-showsizediff": "顯示修訂版本之間的差異大小。",
        "apihelp-feedcontributions-example-simple": "返回使用者<kbd>Example</kbd>的貢獻。",
-       "apihelp-feedrecentchanges-summary": "返回最近變更摘要。",
+       "apihelp-feedrecentchanges-summary": "返回近期變更摘要。",
        "apihelp-feedrecentchanges-param-feedformat": "摘要格式。",
        "apihelp-feedrecentchanges-param-namespace": "用於限制結果的命名空間。",
        "apihelp-feedrecentchanges-param-invert": "除所選定者外的所有命名空間。",
        "apihelp-feedrecentchanges-param-target": "僅顯示從該頁面所連結頁面上的變更。",
        "apihelp-feedrecentchanges-example-simple": "顯示近期變更。",
        "apihelp-feedrecentchanges-example-30days": "顯示近期30天內的變動",
-       "apihelp-feedwatchlist-summary": "返回監視清單 feed。",
-       "apihelp-feedwatchlist-param-feedformat": "Feed 的格式。",
+       "apihelp-feedwatchlist-summary": "返回監視清單摘要。",
+       "apihelp-feedwatchlist-param-feedformat": "摘要的格式。",
        "apihelp-feedwatchlist-param-hours": "列出在幾小時內的頁面變動。",
        "apihelp-feedwatchlist-param-linktosections": "若可以的話,直接連結至更改過的段落。",
+       "apihelp-feedwatchlist-example-default": "顯示監視清單摘要。",
        "apihelp-feedwatchlist-example-all6hrs": "顯示過去 6 小時在監視頁面的所有更改。",
        "apihelp-filerevert-summary": "回退檔案至舊的版本。",
        "apihelp-filerevert-param-filename": "目標檔案名稱,不需包含「File:」這樣的前綴字元。",
        "apihelp-parse-param-disablepp": "請改用<var>$1disablelimitreport</var>。",
        "apihelp-parse-param-disableeditsection": "從解析輸出內容省略編輯段落連結。",
        "apihelp-parse-param-disabletidy": "不要在解析輸出裡執行 HTML 內容清理(例如使用 tidy 軟體工具)",
+       "apihelp-parse-param-disablestylededuplication": "不要在解析結果去除重複的行內樣式表。",
        "apihelp-parse-param-generatexml": "產生 XML 解析樹狀(需要被 <kbd>$2prop=parsetree</kbd> 給取代的 <code>$1</code> 內容模組)。",
        "apihelp-parse-param-preview": "在預覽模式下解析。",
+       "apihelp-parse-param-sectionpreview": "在段落預覽模式下解析(要同時啟用預覽模式)。",
        "apihelp-parse-param-disabletoc": "在輸出裡忽略目錄。",
        "apihelp-parse-param-useskin": "套用所選的外觀至解析輸出。可能會影響以下參數:<kbd>langlinks</kbd>、<kbd>headitems</kbd>、<kbd>modules</kbd>、<kbd>jsconfigvars</kbd>、<kbd>indicators</kbd>。",
        "apihelp-parse-example-page": "解析頁面。",
        "apihelp-patrol-param-rcid": "要巡查的最近變更 ID。",
        "apihelp-patrol-param-revid": "要巡查的修訂 ID。",
        "apihelp-patrol-param-tags": "在巡查日誌裡更改套用到項目的標籤。",
-       "apihelp-patrol-example-rcid": "巡查一次最近變更。",
+       "apihelp-patrol-example-rcid": "巡查一次近期變更。",
        "apihelp-patrol-example-revid": "巡查一個修訂。",
        "apihelp-protect-summary": "變更頁面的保護層級。",
        "apihelp-protect-param-title": "要(解除)保護頁面的標題。 不能與 $1pageid 一起使用。",
        "apihelp-query+allcategories-param-prop": "要取得的屬性。",
        "apihelp-query+allcategories-paramvalue-prop-size": "在分類裡添加頁面數。",
        "apihelp-query+allcategories-paramvalue-prop-hidden": "標記由 <code>_&#95;HIDDENCAT_&#95;</code> 隱藏的分類。",
+       "apihelp-query+allcategories-example-size": "列出分類以及各包含多少頁面的資訊。",
+       "apihelp-query+allcategories-example-generator": "替以 <kbd>List</kbd> 開頭的分類索取該分類頁面本身的資訊。",
        "apihelp-query+alldeletedrevisions-summary": "依使用者或所在命名空間來列出所有已刪除的修訂。",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "僅與 <var>$3user</var> 一同使用。",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能與 <var>$3user</var> 一同使用。",
        "apihelp-query+allusers-param-excludegroup": "排除指定群組中的使用者",
        "apihelp-query+allusers-param-prop": "要包含的資訊部份:",
        "apihelp-query+allusers-paramvalue-prop-blockinfo": "添加有關使用者目前封鎖的資訊。",
+       "apihelp-query+allusers-paramvalue-prop-groups": "列出使用者所在的群組。這會使用到較多伺服器資源,並且可能會回傳少於限制條件的結果。",
        "apihelp-query+allusers-paramvalue-prop-implicitgroups": "列出使用者自動列入的所有群組。",
        "apihelp-query+allusers-paramvalue-prop-rights": "列出使用者所擁有的權限。",
        "apihelp-query+allusers-paramvalue-prop-editcount": "添加使用者的編輯次數。",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "添加頁面 ID。",
        "apihelp-query+categorymembers-paramvalue-prop-title": "添加標題與頁面的命名空間 ID。",
        "apihelp-query+categorymembers-paramvalue-prop-sortkey": "添加使用來在分類裡排序的排序鍵(十六進位字串)。",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "添加頁面已被分類的類型(<samp>page</samp>、<samp>subcat</samp> 或 <samp>file</samp>)。",
        "apihelp-query+categorymembers-paramvalue-prop-timestamp": "添加在頁面有被包含時的時間戳記。",
+       "apihelp-query+categorymembers-param-namespace": "僅包含在這些命名空間的頁面。請注意可能會使用 <kbd>$1type=subcat</kbd> 或 <kbd>$1type=file</kbd>,而非 <kbd>$1namespace=14</kbd> 或 <kbd>6</kbd>。",
        "apihelp-query+categorymembers-param-type": "包含的分類成員類型。當有設定 <kbd>$1sort=timestamp</kbd> 時忽略。",
        "apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。",
        "apihelp-query+categorymembers-param-sort": "作為排序順序的屬性。",
        "apihelp-query+categorymembers-param-endsortkey": "請改用 $1endhexsortkey。",
        "apihelp-query+categorymembers-example-simple": "取得在 <kbd>Category:Physics</kbd> 裡前 10 項的頁面。",
        "apihelp-query+categorymembers-example-generator": "取得在 <kbd>Category:Physics</kbd> 裡前 10 個頁面的頁面資訊。",
+       "apihelp-query+contributors-summary": "取得頁面上登入貢獻者以及匿名貢獻者數量的清單。",
        "apihelp-query+contributors-param-limit": "要回傳的貢獻人員數量。",
        "apihelp-query+contributors-example-simple": "顯示頁面 <kbd>Main Page</kbd> 的貢獻者。",
        "apihelp-query+deletedrevisions-summary": "取得已刪除修訂的資訊。",
        "apihelp-query+deletedrevs-param-excludeuser": "不要列出由該使用者作出的修訂。",
        "apihelp-query+deletedrevs-param-namespace": "僅列出此命名空間的頁面。",
        "apihelp-query+deletedrevs-param-limit": "修訂能列出的最大數量。",
+       "apihelp-query+deletedrevs-example-mode1": "以帶有內容(模式 1)列出頁面 <kbd>Main Page</kbd> 與 <kbd>Talk:Main Page</kbd> 的最新刪除修訂。",
        "apihelp-query+deletedrevs-example-mode2": "列出最近前 50 個已刪除掉由 <kbd>Bob</kbd> 所做出的貢獻(模式 2)。",
        "apihelp-query+deletedrevs-example-mode3-main": "列出在主命名空間的前 50 個已刪除修訂(模式 3)。",
        "apihelp-query+deletedrevs-example-mode3-talk": "列出在{{ns:talk}}命名空間的前 50 個已刪除頁面(模式 3)。",
        "apihelp-query+extlinks-param-limit": "要回傳的連結數量。",
        "apihelp-query+extlinks-param-protocol": "URL 協定。若為空且有設定 <var>$1query</var>,會是 <kbd>http</kbd> 協定。將此與 <var>$1query</var> 一同留空會列出所有外部連結。",
        "apihelp-query+extlinks-param-query": "不以協議來搜尋字串,對於檢查某頁面是否包含某個外部 URL 時很有用。",
+       "apihelp-query+extlinks-param-expandurl": "以規範協議的擴充協議關聯 URL。",
        "apihelp-query+extlinks-example-simple": "取得 <kbd>Main Page</kbd> 的外部連結清單。",
        "apihelp-query+exturlusage-summary": "列舉包含指定 URL 的頁面。",
        "apihelp-query+exturlusage-param-prop": "要包含的資訊部份:",
        "apihelp-query+exturlusage-param-query": "不帶協定的搜尋字串。請查看 [[Special:LinkSearch]]。請留空以列出所有外部連結。",
        "apihelp-query+exturlusage-param-namespace": "要列舉的頁面命名空間。",
        "apihelp-query+exturlusage-param-limit": "要回傳的頁面數量。",
+       "apihelp-query+exturlusage-param-expandurl": "以規範協議的擴充協議關聯 URL。",
        "apihelp-query+exturlusage-example-simple": "顯示連結至 <kbd>https://www.mediawiki.org</kbd> 的頁面。",
        "apihelp-query+filearchive-summary": "依序列舉所有已刪除檔案。",
        "apihelp-query+filearchive-param-from": "起始列舉的圖片標題。",
        "apihelp-query+random-param-filterredir": "如何過濾重新導向。",
        "apihelp-query+random-example-simple": "從主命名空間回傳兩個隨機頁面。",
        "apihelp-query+random-example-generator": "從主命名空間回傳兩個隨機頁面的相關頁面資訊。",
-       "apihelp-query+recentchanges-summary": "列舉出最近變更。",
+       "apihelp-query+recentchanges-summary": "列舉出近期變更。",
        "apihelp-query+recentchanges-param-start": "起始列舉的時間戳記。",
        "apihelp-query+recentchanges-param-end": "結束列舉的時間戳記。",
        "apihelp-query+recentchanges-param-namespace": "篩選僅為這些命名空間的更改。",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "添加編輯的標籤。",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
        "apihelp-query+recentchanges-paramvalue-prop-title": "添加編輯的頁面標題。",
-       "apihelp-query+recentchanges-paramvalue-prop-ids": "添加頁面 ID、最近更改 ID 以及新舊修訂 ID。",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "添加頁面 ID、近期變更 ID 以及新舊修訂 ID。",
        "apihelp-query+recentchanges-paramvalue-prop-sizes": "添加新舊頁面長度(位元組)。",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "若頁面為重新導向則標記編輯。",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "標記可巡查編輯為已巡查或未巡查。",
        "apihelp-query+recentchanges-param-type": "要顯示的更改類型。",
        "apihelp-query+recentchanges-param-toponly": "僅列出最新修訂的更改。",
        "apihelp-query+recentchanges-param-title": "篩選與這些頁面關聯的項目。",
-       "apihelp-query+recentchanges-example-simple": "最近變更清單",
+       "apihelp-query+recentchanges-example-simple": "近期變更清單",
        "apihelp-query+recentchanges-example-generator": "取得有關近期尚未巡查更改的頁面資訊。",
        "apihelp-query+redirects-summary": "回傳連結至指定頁面的所有重新導向。",
        "apihelp-query+redirects-param-prop": "要取得的屬性。",
        "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "已註冊命名空間別名清單。",
        "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特殊頁面別名清單。",
        "apihelp-query+siteinfo-paramvalue-prop-magicwords": "魔術字及其別名清單。",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "回傳網站統計。",
        "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "回傳內部 wiki 對應(篩選可選用,也可透過 <var>$1inlanguagecode</var> 來選用本地化)。",
        "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "回傳有最高複製延遲的資料庫伺服器。",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "回傳使用者群組以及所分配權限。",
        "apihelp-query+watchlist-paramvalue-type-categorize": "分類成員更改。",
        "apihelp-query+watchlist-param-owner": "與 $1token 一起使用以存取不同使用者的監視清單。",
        "apihelp-query+watchlist-param-token": "允許存取其他使用者監視清單的安全權杖(可在使用者的[[Special:Preferences#mw-prefsection-watchlist|偏好設定]]找到)。",
+       "apihelp-query+watchlist-example-simple": "列出在目前使用者監視清單裡近期變更頁面的最新修訂。",
+       "apihelp-query+watchlist-example-props": "索取在目前使用者監視清單裡近期變更頁面的最新修訂額外資訊。",
+       "apihelp-query+watchlist-example-allrev": "索取在目前使用者監視清單裡所有近期變更頁面的資訊。",
        "apihelp-query+watchlist-example-generator": "索取在目前使用者監視清單裡近期變更頁面的頁面資訊。",
+       "apihelp-query+watchlist-example-generator-rev": "索取在目前使用者監視清單裡近期變更頁面的修訂資訊。",
        "apihelp-query+watchlistraw-summary": "列出在目前使用者的監視清單裡頭所有頁面。",
        "apihelp-query+watchlistraw-param-namespace": "僅列出在指定命名空間的頁面。",
        "apihelp-query+watchlistraw-param-limit": "每個請求要回傳的結果總數。",
        "apihelp-stashedit-param-baserevid": "基本修訂的修訂 ID。",
        "apihelp-stashedit-param-summary": "更改摘要。",
        "apihelp-tag-summary": "從各別修訂或日誌項目添加或移除變更標籤。",
+       "apihelp-tag-param-rcid": "要添加或移除標籤的一個或多個近期變更 ID。",
        "apihelp-tag-param-revid": "要添加或移除標籤的一個或多個修訂 ID。",
        "apihelp-tag-param-logid": "要添加或移除標籤的一個或多個日誌項目 ID。",
        "apihelp-tag-param-add": "要添加的標籤。僅有手動定義的標籤可被添加。",
        "apihelp-tag-param-reason": "變更的原因。",
+       "apihelp-tag-param-tags": "套用到日誌項目的標籤會被建立為此操作的結果。",
        "apihelp-tag-example-rev": "不指明原因將 ID 為 123 的修訂添加 <kbd>vandalism</kbd> 標籤",
        "apihelp-tag-example-log": "將 ID 為 123 的日誌項目移除 <kbd>spam</kbd> 標籤,原因:<kbd>Wrongly applied</kbd>",
        "apihelp-tokens-summary": "取得資料修改動作的權杖。",
        "apierror-cantundelete": "無法取消刪除:請求的修訂可能不存在,或是可能已被取消刪除。",
        "apierror-changeauth-norequest": "建立更改請求失敗。",
        "apierror-cidrtoobroad": "不能接受超出 /$2 的 $1 CIDR 範圍。",
+       "apierror-compare-maintextrequired": "當 <var>$1slots</var> 包含 <kbd>main</kbd> 時,需要參數 <var>$1text-main</var>(不能刪除主要部份)。",
        "apierror-compare-no-title": "無法在不帶標題之下預先儲存轉換。請嘗試指定 <var>fromtitle</var> 或 <var>totitle</var>。",
        "apierror-compare-nosuchfromsection": "在 'from' 內容裡沒有段落$1。",
        "apierror-compare-nosuchtosection": "在 'to' 內容裡沒有段落$1。",
+       "apierror-compare-nofromrevision": "沒有「from」修訂。請指定 <var>fromrev</var>、<var>fromtitle</var>、或 <var>fromid</var>。",
        "apierror-compare-notext": "參數 <var>$1</var> 不能在缺少 <var>$2</var> 的情況下使用。",
+       "apierror-compare-notorevision": "沒有「to」修訂。請指定 <var>torev</var>、<var>totitle</var>、或 <var>toid</var>。",
+       "apierror-compare-relative-to-deleted": "相關已刪除修訂時不能使用 <kbd>torelative=$1</kbd>。",
        "apierror-contentserializationexception": "內容序列化失敗:$1",
        "apierror-copyuploadbaddomain": "不允許從此網域來透過 URL 上傳。",
        "apierror-copyuploadbadurl": "不允許從此 URL 來上傳。",
        "apierror-revdel-needtarget": "此 RevDel 類型需要目標標題。",
        "apierror-revdel-paramneeded": "至少需要 <var>hide</var> 與/或 <var>show</var> 其中的值。",
        "apierror-revisions-badid": "查無參數 <var>$1</var> 的修訂。",
+       "apierror-revisions-norevids": "<var>revids</var> 參數不能與清單選項(<var>$1limit</var>、<var>$1startid</var>、<var>$1endid</var>、<kbd>$1dir=newer</kbd>、<var>$1user</var>、<var>$1excludeuser</var>、<var>$1start</var>、和 <var>$1end</var>)一起使用。",
        "apierror-revwrongpage": "r$1 不是$2的修訂。",
        "apierror-searchdisabled": "<var>$1</var>搜尋已停用。",
        "apierror-sectionreplacefailed": "無法合併更新的章節。",
index aae5a83..e82f2b8 100644 (file)
@@ -336,7 +336,7 @@ class AuthManager implements LoggerAwareInterface {
                        $this->setSessionDataForUser( $user );
                        $this->callMethodOnProviders( 7, 'postAuthentication', [ $user, $ret ] );
                        $session->remove( 'AuthManager::authnState' );
-                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName() ] );
+                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName(), [] ] );
                        return $ret;
                }
 
@@ -352,7 +352,7 @@ class AuthManager implements LoggerAwareInterface {
                                $this->callMethodOnProviders( 7, 'postAuthentication',
                                        [ User::newFromName( $guessUserName ) ?: null, $ret ]
                                );
-                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, null, $guessUserName ] );
+                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, null, $guessUserName, [] ] );
                                return $ret;
                        }
                }
@@ -468,7 +468,7 @@ class AuthManager implements LoggerAwareInterface {
                                                                [ User::newFromName( $guessUserName ) ?: null, $res ]
                                                        );
                                                        $session->remove( 'AuthManager::authnState' );
-                                                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, null, $guessUserName ] );
+                                                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, null, $guessUserName, [] ] );
                                                        return $res;
                                                case AuthenticationResponse::ABSTAIN;
                                                        // Continue loop
@@ -534,7 +534,7 @@ class AuthManager implements LoggerAwareInterface {
                                                        [ User::newFromName( $guessUserName ) ?: null, $res ]
                                                );
                                                $session->remove( 'AuthManager::authnState' );
-                                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, null, $guessUserName ] );
+                                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, null, $guessUserName, [] ] );
                                                return $res;
                                        case AuthenticationResponse::REDIRECT;
                                        case AuthenticationResponse::UI;
@@ -625,7 +625,7 @@ class AuthManager implements LoggerAwareInterface {
                                        );
                                        $this->callMethodOnProviders( 7, 'postAuthentication', [ $user, $ret ] );
                                        $session->remove( 'AuthManager::authnState' );
-                                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName() ] );
+                                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName(), [] ] );
                                        return $ret;
                                }
                        }
@@ -658,7 +658,7 @@ class AuthManager implements LoggerAwareInterface {
                                                $this->logger->debug( "Login failed in secondary authentication by $id" );
                                                $this->callMethodOnProviders( 7, 'postAuthentication', [ $user, $res ] );
                                                $session->remove( 'AuthManager::authnState' );
-                                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, $user, $user->getName() ] );
+                                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, $user, $user->getName(), [] ] );
                                                return $res;
                                        case AuthenticationResponse::REDIRECT;
                                        case AuthenticationResponse::UI;
@@ -694,7 +694,7 @@ class AuthManager implements LoggerAwareInterface {
                        $this->callMethodOnProviders( 7, 'postAuthentication', [ $user, $ret ] );
                        $session->remove( 'AuthManager::authnState' );
                        $this->removeAuthenticationSessionData( null );
-                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName() ] );
+                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName(), [] ] );
                        return $ret;
                } catch ( \Exception $ex ) {
                        $session->remove( 'AuthManager::authnState' );
index 6c6b184..93685e3 100644 (file)
@@ -270,8 +270,8 @@ class CacheHelper implements ICacheHelper {
                        $value = null;
 
                        if ( is_null( $key ) ) {
-                               $itemKey = array_keys( array_slice( $this->cachedChunks, 0, 1 ) );
-                               $itemKey = array_shift( $itemKey );
+                               reset( $this->cachedChunks );
+                               $itemKey = key( $this->cachedChunks );
 
                                if ( !is_int( $itemKey ) ) {
                                        wfWarn( "Attempted to get item with non-numeric key while " .
index c5a2512..75c8465 100644 (file)
@@ -68,21 +68,21 @@ class LCStoreStaticArray implements LCStore {
         * Encodes a value into an array format
         *
         * @param mixed $value
-        * @return array
+        * @return array|mixed
         * @throws RuntimeException
         */
        public static function encode( $value ) {
-               if ( is_scalar( $value ) || $value === null ) {
-                       // [V]alue
-                       return [ 'v', $value ];
+               if ( is_array( $value ) ) {
+                       // [a]rray
+                       return [ 'a', array_map( 'LCStoreStaticArray::encode', $value ) ];
                }
                if ( is_object( $value ) ) {
-                       // [S]erialized
+                       // [s]erialized
                        return [ 's', serialize( $value ) ];
                }
-               if ( is_array( $value ) ) {
-                       // [A]rray
-                       return [ 'a', array_map( 'LCStoreStaticArray::encode', $value ) ];
+               if ( is_scalar( $value ) || $value === null ) {
+                       // Scalar value, written directly without array
+                       return $value;
                }
 
                throw new RuntimeException( 'Cannot encode ' . var_export( $value, true ) );
@@ -91,21 +91,28 @@ class LCStoreStaticArray implements LCStore {
        /**
         * Decode something that was encoded with encode
         *
-        * @param array $encoded
+        * @param mixed $encoded
         * @return array|mixed
         * @throws RuntimeException
         */
-       public static function decode( array $encoded ) {
+       public static function decode( $encoded ) {
+               if ( !is_array( $encoded ) ) {
+                       // Scalar values are written directly without array
+                       return $encoded;
+               }
+
                $type = $encoded[0];
                $data = $encoded[1];
 
                switch ( $type ) {
-                       case 'v':
-                               return $data;
-                       case 's':
-                               return unserialize( $data );
                        case 'a':
                                return array_map( 'LCStoreStaticArray::decode', $data );
+                       case 's':
+                               return unserialize( $data );
+                       case 'v':
+                               // Support: MediaWiki 1.32 and earlier
+                               // Backward compatibility with older file format
+                               return $data;
                        default:
                                throw new RuntimeException(
                                        'Unable to decode ' . var_export( $encoded, true ) );
index b1dff14..a39568b 100644 (file)
@@ -454,11 +454,9 @@ class ChangesList extends ContextSource {
                        );
                }
                if ( $rc->mAttribs['rc_type'] == RC_CATEGORIZE ) {
-                       $diffhist = $diffLink . $this->message['pipe-separator'] . $this->message['hist'];
+                       $histLink = $this->message['hist'];
                } else {
-                       $diffhist = $diffLink . $this->message['pipe-separator'];
-                       # History link
-                       $diffhist .= $this->linkRenderer->makeKnownLink(
+                       $histLink = $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
                                new HtmlArmor( $this->message['hist'] ),
                                [ 'class' => 'mw-changeslist-history' ],
@@ -469,9 +467,11 @@ class ChangesList extends ContextSource {
                        );
                }
 
-               // @todo FIXME: Hard coded ". .". Is there a message for this? Should there be?
-               $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() .
-                       ' <span class="mw-changeslist-separator">. .</span> ';
+               $s .= Html::rawElement( 'div', [ 'class' => 'mw-changeslist-links' ],
+                               Html::rawElement( 'span', [], $diffLink ) .
+                               Html::rawElement( 'span', [], $histLink )
+                       ) .
+                       ' <span class="mw-changeslist-separator"></span> ';
        }
 
        /**
@@ -535,7 +535,7 @@ class ChangesList extends ContextSource {
                        htmlspecialchars( $this->getLanguage()->userTime(
                                $rc->mAttribs['rc_timestamp'],
                                $this->getUser()
-                       ) ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
+                       ) ) . '</span> <span class="mw-changeslist-separator"></span> ';
        }
 
        /**
index a26f5b6..c15701b 100644 (file)
@@ -121,7 +121,7 @@ class OldChangesList extends ChangesList {
                if ( $this->getConfig()->get( 'RCShowChangedSize' ) ) {
                        $cd = $this->formatCharacterDifference( $rc );
                        if ( $cd !== '' ) {
-                               $html .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
+                               $html .= $cd . '  <span class="mw-changeslist-separator"></span> ';
                        }
                }
 
index 117a8fb..1a7f850 100644 (file)
@@ -344,11 +344,7 @@ class HTMLForm extends ContextSource {
 
                        $setSection =& $loadedDescriptor;
                        if ( $section ) {
-                               $sectionParts = explode( '/', $section );
-
-                               while ( count( $sectionParts ) ) {
-                                       $newName = array_shift( $sectionParts );
-
+                               foreach ( explode( '/', $section ) as $newName ) {
                                        if ( !isset( $setSection[$newName] ) ) {
                                                $setSection[$newName] = [];
                                        }
index 5f99aa0..818474d 100644 (file)
@@ -137,8 +137,7 @@ abstract class HTMLFormField {
                for ( $i = count( $thisKeys ) - 1; $i >= 0; $i-- ) {
                        $keys = array_merge( array_slice( $thisKeys, 0, $i ), $nameKeys );
                        $data = $alldata;
-                       while ( $keys ) {
-                               $key = array_shift( $keys );
+                       foreach ( $keys as $key ) {
                                if ( !is_array( $data ) || !array_key_exists( $key, $data ) ) {
                                        continue 2;
                                }
index db4cbdf..2f1c0f3 100644 (file)
@@ -95,7 +95,6 @@ class MssqlUpdater extends DatabaseUpdater {
                        [ 'addIndex', 'recentchanges', 'rc_name_type_patrolled_timestamp',
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
-                       [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
@@ -155,6 +154,8 @@ class MssqlUpdater extends DatabaseUpdater {
 
                        // 1.33
                        [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+                       [ 'dropTable', 'valid_tag' ],
+                       [ 'dropTable', 'tag_summary' ],
                ];
        }
 
index 532ccb0..f7362cb 100644 (file)
@@ -158,8 +158,6 @@ class MysqlUpdater extends DatabaseUpdater {
 
                        // 1.15
                        [ 'addTable', 'change_tag', 'patch-change_tag.sql' ],
-                       [ 'addTable', 'tag_summary', 'patch-tag_summary.sql' ],
-                       [ 'addTable', 'valid_tag', 'patch-valid_tag.sql' ],
 
                        // 1.16
                        [ 'addTable', 'user_properties', 'patch-user_properties.sql' ],
@@ -169,7 +167,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'doLogUsertextPopulation' ],
                        [ 'doLogSearchPopulation' ],
                        [ 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ],
-                       [ 'addIndex', 'tag_summary', 'tag_summary_rc_id', 'patch-change_tag-indexes.sql' ],
+                       [ 'dropIndex', 'change_tag', 'ct_rc_id', 'patch-change_tag-indexes.sql' ],
                        [ 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ],
                        [ 'doUpdateMimeMinorField' ],
 
@@ -288,7 +286,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'doRevisionPageRevIndexNonUnique' ],
                        [ 'doNonUniquePlTlIl' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
-                       [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
                        [ 'modifyField', 'recentchanges', 'rc_ip', 'patch-rc_ip_modify.sql' ],
                        [ 'addIndex', 'archive', 'usertext_timestamp', 'patch-rename-ar_usertext_timestamp.sql' ],
 
@@ -375,6 +372,8 @@ class MysqlUpdater extends DatabaseUpdater {
 
                        // 1,33
                        [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+                       [ 'dropTable', 'valid_tag' ],
+                       [ 'dropTable', 'tag_summary' ],
                ];
        }
 
@@ -1179,8 +1178,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'table' => 'change_tag', 'field' => 'ct_log_id' ],
                        [ 'table' => 'change_tag', 'field' => 'ct_rev_id' ],
                        [ 'table' => 'page_restrictions', 'field' => 'pr_user' ],
-                       [ 'table' => 'tag_summary', 'field' => 'ts_log_id' ],
-                       [ 'table' => 'tag_summary', 'field' => 'ts_rev_id' ],
                        [ 'table' => 'user_newtalk', 'field' => 'user_id' ],
                        [ 'table' => 'user_properties', 'field' => 'up_user' ],
                ];
index 19c4cfe..e9be744 100644 (file)
@@ -117,7 +117,6 @@ class OracleUpdater extends DatabaseUpdater {
                        [ 'addIndex', 'recentchanges', 'rc_name_type_patrolled_timestamp',
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
-                       [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
@@ -166,6 +165,8 @@ class OracleUpdater extends DatabaseUpdater {
 
                        // 1.33
                        [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+                       [ 'dropTable', 'valid_tag' ],
+                       [ 'dropTable', 'tag_summary' ],
 
                        // KEEP THIS AT THE BOTTOM!!
                        [ 'doRebuildDuplicateFunction' ],
index 9ddc85a..7c0d3e3 100644 (file)
@@ -71,7 +71,6 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'addSequence', 'externallinks', false, 'externallinks_el_id_seq' ],
                        [ 'addSequence', 'watchlist', false, 'watchlist_wl_id_seq' ],
                        [ 'addSequence', 'change_tag', false, 'change_tag_ct_id_seq' ],
-                       [ 'addSequence', 'tag_summary', false, 'tag_summary_ts_id_seq' ],
 
                        # new tables
                        [ 'addTable', 'category', 'patch-category.sql' ],
@@ -84,8 +83,6 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'addTable', 'redirect', 'patch-redirect.sql' ],
                        [ 'addTable', 'updatelog', 'patch-updatelog.sql' ],
                        [ 'addTable', 'change_tag', 'patch-change_tag.sql' ],
-                       [ 'addTable', 'tag_summary', 'patch-tag_summary.sql' ],
-                       [ 'addTable', 'valid_tag', 'patch-valid_tag.sql' ],
                        [ 'addTable', 'user_properties', 'patch-user_properties.sql' ],
                        [ 'addTable', 'log_search', 'patch-log_search.sql' ],
                        [ 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ],
@@ -443,8 +440,6 @@ class PostgresUpdater extends DatabaseUpdater {
                                '( rc_namespace, rc_type, rc_patrolled, rc_timestamp )' ],
                        [ 'addPgField', 'change_tag', 'ct_id',
                                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('change_tag_ct_id_seq')" ],
-                       [ 'addPgField', 'tag_summary', 'ts_id',
-                               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('tag_summary_ts_id_seq')" ],
 
                        // 1.29
                        [ 'addPgField', 'externallinks', 'el_index_60', "BYTEA NOT NULL DEFAULT ''" ],
@@ -567,7 +562,6 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'setSequenceOwner', 'job', 'job_id', 'job_job_id_seq' ],
                        [ 'setSequenceOwner', 'category', 'cat_id', 'category_cat_id_seq' ],
                        [ 'setSequenceOwner', 'change_tag', 'ct_id', 'change_tag_ct_id_seq' ],
-                       [ 'setSequenceOwner', 'tag_summary', 'ts_id', 'tag_summary_ts_id_seq' ],
                        [ 'setSequenceOwner', 'sites', 'site_id', 'sites_site_id_seq' ],
 
                        // 1.32
@@ -604,6 +598,8 @@ class PostgresUpdater extends DatabaseUpdater {
 
                        // 1.33
                        [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+                       [ 'dropTable', 'valid_tag' ],
+                       [ 'dropTable', 'tag_summary' ],
                ];
        }
 
index 2f39912..1d99b87 100644 (file)
@@ -43,8 +43,6 @@ class SqliteUpdater extends DatabaseUpdater {
 
                        // 1.15
                        [ 'addTable', 'change_tag', 'patch-change_tag.sql' ],
-                       [ 'addTable', 'tag_summary', 'patch-tag_summary.sql' ],
-                       [ 'addTable', 'valid_tag', 'patch-valid_tag.sql' ],
 
                        // 1.16
                        [ 'addTable', 'user_properties', 'patch-user_properties.sql' ],
@@ -54,7 +52,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'doLogUsertextPopulation' ],
                        [ 'doLogSearchPopulation' ],
                        [ 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ],
-                       [ 'addIndex', 'tag_summary', 'tag_summary_rc_id', 'patch-change_tag-indexes.sql' ],
+                       [ 'dropIndex', 'change_tag', 'ct_rc_id', 'patch-change_tag-indexes.sql' ],
                        [ 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ],
                        [ 'sqliteSetupSearchindex' ],
 
@@ -157,7 +155,6 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'addIndex', 'recentchanges', 'rc_name_type_patrolled_timestamp',
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
-                       [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
@@ -242,6 +239,8 @@ class SqliteUpdater extends DatabaseUpdater {
 
                        // 1.33
                        [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+                       [ 'dropTable', 'valid_tag' ],
+                       [ 'dropTable', 'tag_summary' ],
                ];
        }
 
index b612a8b..876ed53 100644 (file)
        "config-skins-help": "Kavet eo bet ar gwiskadurioù renablet a-us en ho kavlec'h <code>./skins</code>. Ret eo deoc'h gweredekaat unan da nebeutañ, ha dibab an hini dre ziouer.",
        "config-skins-use-as-default": "Implijout ar gwiskadur-mañ dre ziouer",
        "config-skins-missing": "N'eus bet kavet gwiskadur ebet : ober a raio MediaWiki gant unan dre ziouer betek ma vo staliet reoù a zegouezh.",
-       "config-skins-must-enable-some": "Ret eo deoc'h dibab da nebautañ ur gwiskadur da weredekaat.",
+       "config-skins-must-enable-some": "Ret eo deoc'h dibab ur gwiskadur da weredekaat da nebeutañ.",
        "config-skins-must-enable-default": "Ar gwiskadur dre ziouer dibabet a rank bezañ gweredekaet.",
        "config-install-alreadydone": "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.\nKit d'ar bajenn war-lerc'h, mar plij.",
        "config-install-begin": "Pa vo bet pouezet ganeoc'h war \"{{int:config-continue}}\"  e krogo staliadur MediaWiki.\nPouezit war \"{{int:config-back}}\" mar fell deoc'h cheñch tra pe dra.",
index 74503b7..ca1c1c0 100644 (file)
        "config-sqlite-cant-create-db": "Nepodařilo se vytvořit databázový soubor <code>$1</code>.",
        "config-sqlite-fts3-downgrade": "PHP neobsahuje podporu FTS3, downgradují se tabulky",
        "config-can-upgrade": "V této databázi jsou tabulky MediaWiki.\nPokud je chcete aktualizovat na MediaWiki $1, klikněte na '''Pokračovat'''.",
+       "config-upgrade-error": "Při aktualizaci tabulek MediaWiki ve vaší databázi došlo k chybě.\n\nVíce informací najdete v protokolu výše, znovu to můžete zkusit kliknutím na <strong>Pokračovat</strong>.",
        "config-upgrade-done": "Aktualizace byla dokončena.\n\nSvou wiki teď můžete [$1 začít používat].\n\nPokud chcete přegenerovat soubor <code>LocalSettings.php</code>, klikněte na tlačítko níže.\nTo se ale '''nedoporučuje''', pokud s wiki nemáte problémy.",
        "config-upgrade-done-no-regenerate": "Aktualizace byla dokončena.\n\nSvou wiki teď můžete [$1 začít používat].",
        "config-regenerate": "Přegenerovat LocalSettings.php →",
index 3acdec0..92d508a 100644 (file)
@@ -45,6 +45,9 @@
        "config-help-restart": "Vil du rydde alle gemte data, du har indtastet og genstarte installationen?",
        "config-restart": "Ja, genstart den",
        "config-env-php": "PHP $1 er installeret.",
+       "config-env-hhvm": "HHVM $1 er installeret.",
+       "config-apc": "[https://secure.php.net/apc APC] er installeret",
+       "config-apcu": "[https://secure.php.net/apcu APCu] er installeret",
        "config-db-type": "Databasetype:",
        "config-db-host": "Databasevært:",
        "config-db-name": "Databasenavn (ingen bindestreg):",
        "config-ns-generic": "Projekt",
        "config-ns-site-name": "Samme som wikinavnet: $1",
        "config-ns-other": "Andet (angiv)",
+       "config-ns-other-default": "MyWiki",
        "config-admin-box": "Administratorkonto",
        "config-admin-name": "Dit brugernavn:",
        "config-admin-password": "Adgangskode:",
        "config-admin-password-confirm": "Tast adgangskoden igen:",
+       "config-admin-name-blank": "Indtast et administratorbrugernavn.",
        "config-admin-email": "E-postadresse:",
        "config-admin-error-bademail": "Du har indtastet en ugyldig e-mailadresse.",
        "config-optional-continue": "Stil mig flere spørgsmål.",
        "config-extensions": "Udvidelser",
        "config-install-step-done": "udført",
        "config-install-step-failed": "mislykkedes",
+       "config-install-extensions": "Inkluderer udvidelser",
        "config-install-database": "Opsætter database",
        "config-install-user-alreadyexists": "Brugeren \"$1\" findes allerede",
        "config-install-user-create-failed": "Oprettelse af brugeren \"$1\" mislykkedes: $2",
        "config-install-tables": "Opretter tabeller",
+       "config-install-keys": "Genererer hemmelige nøgler",
        "config-install-mainpage-exists": "Forsiden findes allerede, springer over",
        "config-install-mainpage-failed": "Kunne ikke indsætte forside: $1",
        "config-help": "hjælp",
index 159b66e..7d3077f 100644 (file)
@@ -83,7 +83,7 @@
        "config-logo": "URL'ey Logoy:",
        "config-extensions": "Olekeni",
        "config-skins": "Temey",
-       "config-install-step-done": "qeyd ke",
+       "config-install-step-done": "temam",
        "config-install-step-failed": "ebe ser nêkewt",
        "config-install-schema": "Şema dek",
        "config-install-pg-commit": "Vırnayışa cemaati",
index 955b4f4..1a64890 100644 (file)
@@ -24,7 +24,8 @@
                        "Suchichi02",
                        "Omotecho",
                        "Yusuke1109",
-                       "Aefgh39622"
+                       "Aefgh39622",
+                       "Tomri5"
                ]
        },
        "config-desc": "MediaWiki のインストーラー",
        "config-db-host-oracle": "データベース TNS:",
        "config-db-host-oracle-help": "有効な[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ローカル接続名]を入力してください。tnsnames.ora ファイルは、このインストール先から参照できる場所に置いてください。<br />ご使用中のクライアント ライブラリが 10g 以降の場合、[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] ネーミング メソッドを使用できます。",
        "config-db-wiki-settings": "このウィキの識別情報",
-       "config-db-name": "ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8d (ã\83\8fã\82¤ã\83\95ã\83³ã\81¯ä¸\8dè¦\81):",
+       "config-db-name": "ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8d (ã\83\8fã\82¤ã\83\95ã\83³ã\81¯ä½¿ç\94¨ä¸\8då\8f¯):",
        "config-db-name-help": "このウィキを識別する名前を入力してください。\n空白を含めることはできません。\n\n共有ウェブホストを利用している場合、ホスティングプロバイダーが特定の使用可能なデータベース名を提供するか、あるいは管理パネルからデータベースを作成できるようにしているでしょう。",
        "config-db-name-oracle": "データベースのスキーマ:",
        "config-db-account-oracle-warn": "バックエンドのデータベースとして Oracle をインストールする場合、3つのシナリオが考えられます。\n\nデータベース用のアカウントをインストールのプロセス途中で作成したい場合、インストールに使うデータベース用のアカウントしては SYSDBAロール付きのアカウントを指定し、ウェブアクセス用アカウントには必要なログイン情報を指定してください。あるいは、ウェブアクセス用のアカウントを手動で作成して、そのアカウント(スキーマオブジェクトの作成のパーミッションを要求する場合)だけを使うか、二つの異なるアカウントを用意して一つは特権を付与できるもの、もう一つをウェブアクセス用の制限アカウントとしてください。\n\n要求された特権でアカウントを作成するスクリプトは、このインストール環境では、\"maintenance/oracle/\" にあります。制限アカウントを使用することは、デフォルトアカウントでのすべてのメンテナンス特権を無効にすることにご注意ください。",
index 4ffe16d..bf19769 100644 (file)
        "config-sqlite-cant-create-db": "Used as SQLite error message. Parameters:\n* $1 - filename",
        "config-sqlite-fts3-downgrade": "Status message in the MediaWiki installer when SQLite is used without the FTS3 module. The FTS3 feature allows users to create special tables with a built-in full-text index.",
        "config-can-upgrade": "Parameters:\n* $1 - Version or Revision indicator.",
-       "config-upgrade-error": "Used as error message.",
+       "config-upgrade-error": "Used as error message. See also {{msg-mw|Config-continue}}",
        "config-upgrade-done": "Used as success message. Parameters:\n* $1 - full URL of index.php\nSee also:\n* {{msg-mw|config-upgrade-done-no-regenerate}}",
        "config-upgrade-done-no-regenerate": "Used as success message. Parameters:\n* $1 - full URL of index.php\nSee also:\n* {{msg-mw|config-upgrade-done}}",
        "config-regenerate": "This message appears in a button after LocalSettings.php is generated and downloaded at the end of the MediaWiki installation process.",
index 2fb5ba4..2fec602 100644 (file)
@@ -28,8 +28,8 @@
        "config-no-session": "Ваши подаци о сесији су изгубљени!\nПроверите датотеку php.ini и уверите се да је параметар <code>session.save_path</code> постављен на одговарајући директоријум.",
        "config-your-language": "Ваш језик:",
        "config-your-language-help": "Изаберите језик који желите да користите током процеса инсталације.",
-       "config-wiki-language": "Wiki језик:",
-       "config-wiki-language-help": "Изаберите језик на ком ће wiki бити претежно написан.",
+       "config-wiki-language": "Вики језик:",
+       "config-wiki-language-help": "Изаберите језик на ком ће вики бити претежно написан.",
        "config-back": "← Назад",
        "config-continue": "Настави →",
        "config-page-language": "Језик",
        "config-page-releasenotes": "Напомене о издању",
        "config-page-copying": "Копирање",
        "config-page-upgradedoc": "Надоградња",
-       "config-page-existingwiki": "Постојећи wiki",
+       "config-page-existingwiki": "Постојећи вики",
        "config-help-restart": "Желите ли да обришете све сачуване податке које сте унели и поново покренете процес инсталације?",
        "config-restart": "Да, покрени поново",
-       "config-welcome": "=== Провера окружења ===\nСада ће се извршити основна провера како би се утврдило да ли је ово окружење погодно за MediaWiki инсталацију.\nНе заборавите да укључите ове информације ако тражите подршку како завршити инсталацију.",
-       "config-sidebar": "* [https://www.mediawiki.org MediaWiki почетна]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Водич за кориснике]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Водич за администраторе]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧПП]\n----\n* <doclink href=Readme>Прочитај ме</doclink>\n* <doclink href=ReleaseNotes>Напомене о издању</doclink>\n* <doclink href=Copying>Копирање</doclink>\n* <doclink href=UpgradeDoc>Надоградња</doclink>",
+       "config-welcome": "=== Провера окружења ===\nСада ће се извршити основна провера како би се утврдило да ли је ово окружење погодно за инсталацију MediaWiki-ја.\nНе заборавите да укључите ове информације ако тражите подршку како завршити инсталацију.",
+       "config-sidebar": "* [https://www.mediawiki.org Почетна страна MediaWiki-ја]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Водич за кориснике]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Водич за администраторе]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧПП]\n----\n* <doclink href=Readme>Прочитај ме</doclink>\n* <doclink href=ReleaseNotes>Напомене о издању</doclink>\n* <doclink href=Copying>Копирање</doclink>\n* <doclink href=UpgradeDoc>Надоградња</doclink>",
        "config-env-good": "Окружење је проверено.\nМожете да инсталирате MediaWiki.",
        "config-env-bad": "Окружење је проверено.\nНе можете да инсталирате MediaWiki.",
        "config-env-php": "PHP $1 је инсталиран.",
@@ -82,9 +82,9 @@
        "config-db-type": "Тип базе података:",
        "config-db-host": "Хост базе података",
        "config-db-host-oracle": "TNS базе података:",
-       "config-db-wiki-settings": "Идентификуј овај wiki",
+       "config-db-wiki-settings": "Идентификуј овај вики",
        "config-db-name": "Име базе података (без цртица):",
-       "config-db-name-help": "Одаберите име које идентификује ваш wiki.\nОно не треба да садржи размаке.\n\nАко користите дељени веб-хостинг, ваш добављач услуге хостинга ће вам дати одређено име базе података за коришћење или ће вас пустити да правите базе података путем контролне табле.",
+       "config-db-name-help": "Одаберите име које идентификује ваш вики.\nОно не треба да садржи размаке.\n\nАко користите дељени веб-хостинг, ваш добављач услуге хостинга ће вам дати одређено име базе података за коришћење или ће вас пустити да правите базе података путем контролне табле.",
        "config-db-name-oracle": "Шема базе података:",
        "config-db-install-account": "Кориснички налог за инсталацију",
        "config-db-username": "Корисничко име базе података:",
        "config-db-sys-user-exists-oracle": "Кориснички налог „$1” већ постоји. SYSDBA се само може користити за отварање новог налога!",
        "config-postgres-old": "Неопходан је PostgreSQL $1 или новији. Ви имате $2.",
        "config-mssql-old": "Неопходан је Microsoft SQL Server $1 или новији. Ви имате $2.",
-       "config-sqlite-name-help": "Одаберите име које идентификује ваш wiki.\nНе користите размаке или цртице.\nОво ће се користити за име датотеке SQLite података.",
+       "config-sqlite-name-help": "Одаберите име које идентификује ваш вики.\nНе користите размаке или цртице.\nОво ће се користити за име датотеке SQLite података.",
        "config-sqlite-mkdir-error": "Грешка при прављењу директоријума са подацима „$1”.\nПроверите локацију, па покушајте поново.",
        "config-sqlite-dir-unwritable": "Није могуће уписати у директоријум „$1”.\nПромените му дозволе, тако да веб-сервер може да уписује у њему, па покушајте поново.",
        "config-sqlite-connection-error": "$1.\n\nПроверите директоријум са подацима и име базе података испод, па покушајте поново.",
        "config-sqlite-fts3-downgrade": "PHP-у недостаје FTS3 подршка, поништавање надоградње табела.",
        "config-can-upgrade": "Постоје MediaWiki табеле у овој бази података.\nДа бисте их надоградили на MediaWiki $1, кликните на <strong>Настави</strong>.",
        "config-upgrade-error": "Дошло је до грешке при надоградњи MediaWiki табела у бази података.\n\nЗа више информација, погледајте евиденцију изнад, да бисте покушали поново, кликните на <strong>Настави</strong>.",
-       "config-upgrade-done": "Надоградња је завршена.\n\nСада можете да [$1 почнете да користите свој wiki].\n\nАко желите да поново генеришете датотеку <code>LocalSettings.php</code>, кликните на дугме испод.\nОво се <strong>не препоручује</strong> осим ако имате проблеме са wiki-јем.",
-       "config-upgrade-done-no-regenerate": "Надоградња је завршена.\n\nСада можете да [$1 почнете да користите свој wiki].",
+       "config-upgrade-done": "Надоградња је завршена.\n\nСада можете да [$1 почнете да користите свој вики].\n\nАко желите да поново генеришете датотеку <code>LocalSettings.php</code>, кликните на дугме испод.\nОво се <strong>не препоручује</strong> осим ако имате проблеме са викијем.",
+       "config-upgrade-done-no-regenerate": "Надоградња је завршена.\n\nСада можете да [$1 почнете да користите свој вики].",
        "config-regenerate": "Регенериши LocalSettings.php →",
        "config-show-table-status": "Упит <code>SHOW TABLE STATUS</code> није успео!",
        "config-unknown-collation": "<strong>Упозорење:</strong> База података користи непрепозната правила поређења.",
        "config-db-web-account": "Налог базе података за веб-приступ",
-       "config-db-web-help": "Изаберите кориснички име и лозинку коју ће веб-сервер користити за повезивање са сервером базе података, током свакодневног рада на wiki-ју.",
+       "config-db-web-help": "Изаберите кориснички име и лозинку коју ће веб-сервер користити за повезивање са сервером базе података, током свакодневног рада на викију.",
        "config-db-web-account-same": "Користи исти налог као и за инсталацију",
        "config-db-web-create": "Отвори налог ако већ не постоји.",
        "config-db-web-no-create-privs": "Налог који сте навели за инсталацију нема довољне привилегије да отвори налог.\nНалог који овде наведете већ мора да постоји.",
        "config-mssql-auth": "Тип потврде идентитета:",
        "config-mssql-sqlauth": "SQL Server потврда идентитета",
        "config-mssql-windowsauth": "Windows потврда идентитета",
-       "config-site-name": "Име wiki-ја:",
+       "config-site-name": "Име викија:",
        "config-site-name-help": "Ово ће се појавити у насловној траци прегледача и на разним другим местима.",
-       "config-site-name-blank": "Унесите име сајта.",
+       "config-site-name-blank": "Унесите име локације.",
        "config-project-namespace": "Именски простор пројекта:",
        "config-ns-generic": "Пројекат",
-       "config-ns-site-name": "Исти као wiki име: $1",
+       "config-ns-site-name": "Исти као вики име: $1",
        "config-ns-other": "Друго (наведите)",
        "config-ns-other-default": "MyWiki",
        "config-ns-invalid": "Наведени именски простор „<nowiki>$1</nowiki>” није важећи.\nНаведите други именски простор пројекта.",
        "config-admin-name": "Ваше корисничко име:",
        "config-admin-password": "Лозинка:",
        "config-admin-password-confirm": "Поновите лозинку:",
-       "config-admin-help": "Овде унесите жељено корисничко име; на пример, „Александар Живковић”.\nОво име ћете користити за пријаву на wiki.",
+       "config-admin-help": "Овде унесите жељено корисничко име; на пример, „Александар Живковић”.\nОво име ћете користити за пријаву на вики.",
        "config-admin-name-blank": "Унесите корисничко име администратора.",
        "config-admin-name-invalid": "Наведено корисничко име „<nowiki>$1</nowiki>” није важеће.\nНаведите друго.",
        "config-admin-password-blank": "Унесите лозинку за налог администратора.",
        "config-subscribe": "Претплатите се на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements дописну листу].",
        "config-subscribe-noemail": "Покушали сте да се претплатите на дописну листу за објаве о новим издањима без пружања адресе е-поште.\nПружите адресу е-поште ако желите да се претплатите на њу.",
        "config-pingback": "Дели податке о овој инсталацији са MediaWiki програмерима.",
-       "config-almost-done": "Скоро сте готови!\nСада можете прескочити преосталу конфигурацију и одмах инсталирати wiki.",
+       "config-almost-done": "Скоро сте готови!\nСада можете прескочити преосталу конфигурацију и одмах инсталирати вики.",
        "config-optional-continue": "Постави ми још питања.",
-       "config-optional-skip": "Већ ми је досадно, само инсталирај wiki.",
+       "config-optional-skip": "Већ ми је досадно, само инсталирај вики.",
        "config-profile": "Профил корисничких група:",
-       "config-profile-wiki": "Отворен wiki",
+       "config-profile-wiki": "Отворен вики",
        "config-profile-no-anon": "Неопходно је отворити налог",
        "config-profile-fishbowl": "Само овлашћени уредници",
-       "config-profile-private": "Приватан wiki",
-       "config-profile-help": "Wiki-ји најбоље функционишу када дозвољавате што више корисника да уређују како је то могуће.\nУ MediaWiki-ју, лако је прегледати недавне промене и вратити сваку штету коју почине наивни или злонамерни корисници.\n\nМеђутим, многи су пронашли MediaWiki да је користан у широкој разноликости улога, а понекад није лако уверити се у све предности начина wiki-ја.\nТако да имате избор.\n\nМодел <strong>{{int:config-profile-wiki}}</strong> дозвољава свима да уређују, без пријављивања.\nWiki-ји са <strong>{{int:config-profile-no-anon}}</strong> пружају додатну одговорност, али може спречити случајне доприносе.\n\n<strong>{{int:config-profile-fishbowl}}</strong> сценарио дозвољава одобреним корисницима да уређују, али сви могу видети странице, укључујући историју.\n<strong>{{int:config-profile-private}}</strong> само дозвољава одобреним корисницима да виде странице, са истом групом дозвољеном да уређује.\n\nСложене конфигурације корисничких права су доступне након инсталације, погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights одговарајући ручни унос].",
+       "config-profile-private": "Приватан вики",
+       "config-profile-help": "Викији најбоље функционишу када дозвољавате што више корисника да уређују како је то могуће.\nУ MediaWiki-ју, лако је прегледати недавне промене и вратити сваку штету коју почине наивни или злонамерни корисници.\n\nМеђутим, многи су пронашли MediaWiki да је користан у широкој разноликости улога, а понекад није лако уверити се у све предности начина викија.\nТако да имате избор.\n\nМодел <strong>{{int:config-profile-wiki}}</strong> дозвољава свима да уређују, без пријављивања.\nВикији са <strong>{{int:config-profile-no-anon}}</strong> пружају додатну одговорност, али може спречити случајне доприносе.\n\n<strong>{{int:config-profile-fishbowl}}</strong> сценарио дозвољава одобреним корисницима да уређују, али сви могу видети странице, укључујући историју.\n<strong>{{int:config-profile-private}}</strong> само дозвољава одобреним корисницима да виде странице, са истом групом дозвољеном да уређује.\n\nСложене конфигурације корисничких права су доступне након инсталације, погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights одговарајући ручни унос].",
        "config-license": "Ауторска права и лиценца:",
        "config-license-none": "Без подножја за лиценцу",
        "config-license-cc-by-sa": "Creative Commons Ауторство-Делити под истим условима",
        "config-cc-not-chosen": "Одаберите коју Creative Commons лиценцу желите и кликните на „настави”.",
        "config-advanced-settings": "Напредна конфигурација",
        "config-cache-options": "Подешавања за кеширање објекта:",
-       "config-cache-none": "Нема кеширања (функционалност није уклоњена, али брзина може утицати на веће wiki сајтове)",
+       "config-cache-none": "Нема кеширања (функционалност није уклоњена, али брзина може утицати на веће вики локације)",
        "config-cache-accel": "Кеширање PHP објекта (APC, APCu or WinCache)",
        "config-cache-memcached": "Користи Memcached (захтева додатно подешавање и конфигурацију)",
        "config-memcached-servers": "Memcached сервери:",
        "config-install-mainpage-exists": "Главна страна већ постоји, прескакање",
        "config-install-extension-tables": "Прављење табела за омогућене додатке",
        "config-install-mainpage-failed": "Није могуће уметнути главну страну: $1",
-       "config-install-done": "<strong>Честитамо!</strong>\nИнсталирали сте MediaWiki.\n\nИнсталациони програм је генерисао датотеку <code>LocalSettings.php</code>.\nОна садржи сву вашу конфигурацију.\n\nМораћете да је преузмете и ставите у базу ваше wiki инсталације (исти директоријум као index.php). Преузимање би аутоматски требало почети.\n\nАко преузимање није понуђено, или ако га откажете, можете поново покренути преузимање тако што ћете кликнути на доленаведену везу:\n\n$3\n\n<strong>Напомена:</strong> Ако то одмах не урадите, ова генерисана конфигурациона датотека неће вам бити доступна касније ако изађете из инсталације без преузимања.\n\nКада је то учињено, можете да <strong>[$2 посетите свој wiki]</strong>.",
-       "config-install-done-path": "<strong>Честитамо!</strong>\nИнсталирали сте MediaWiki.\n\nИнсталациони програм је генерисао датотеку <code>LocalSettings.php</code>.\nОна садржи сву вашу конфигурацију.\n\nМораћете да је преузмете и ставите у <code>$4</code>. Преузимање би аутоматски требало почети.\n\nАко преузимање није понуђено, или ако га откажете, можете поново покренути преузимање тако што ћете кликнути на доленаведену везу:\n\n$3\n\n<strong>Напомена:</strong> Ако то одмах не урадите, ова генерисана конфигурациона датотека неће вам бити доступна касније ако изађете из инсталације без преузимања.\n\nКада је то учињено, можете да <strong>[$2 посетите свој wiki]</strong>.",
-       "config-install-success": "MediaWiki је успешно инсталиран. Сада можете посетити <$1$2> да бисте видели свој wiki.\nАко имате питања, погледајте нашу листу често постављаних питања: <https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ> или користите један од форума за подршку који су повезани на тој страници.",
+       "config-install-done": "<strong>Честитамо!</strong>\nИнсталирали сте MediaWiki.\n\nИнсталациони програм је генерисао датотеку <code>LocalSettings.php</code>.\nОна садржи сву вашу конфигурацију.\n\nМораћете да је преузмете и ставите у базу ваше вики инсталације (исти директоријум као index.php). Преузимање би аутоматски требало почети.\n\nАко преузимање није понуђено, или ако га откажете, можете поново покренути преузимање тако што ћете кликнути на доленаведену везу:\n\n$3\n\n<strong>Напомена:</strong> Ако то одмах не урадите, ова генерисана конфигурациона датотека неће вам бити доступна касније ако изађете из инсталације без преузимања.\n\nКада је то учињено, можете да <strong>[$2 посетите свој вики]</strong>.",
+       "config-install-done-path": "<strong>Честитамо!</strong>\nИнсталирали сте MediaWiki.\n\nИнсталациони програм је генерисао датотеку <code>LocalSettings.php</code>.\nОна садржи сву вашу конфигурацију.\n\nМораћете да је преузмете и ставите у <code>$4</code>. Преузимање би аутоматски требало почети.\n\nАко преузимање није понуђено, или ако га откажете, можете поново покренути преузимање тако што ћете кликнути на доленаведену везу:\n\n$3\n\n<strong>Напомена:</strong> Ако то одмах не урадите, ова генерисана конфигурациона датотека неће вам бити доступна касније ако изађете из инсталације без преузимања.\n\nКада је то учињено, можете да <strong>[$2 посетите свој вики]</strong>.",
+       "config-install-success": "MediaWiki је успешно инсталиран. Сада можете посетити <$1$2> да бисте видели свој вики.\nАко имате питања, погледајте нашу листу често постављаних питања: <https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ> или користите један од форума за подршку који су повезани на тој страници.",
        "config-download-localsettings": "Преузми датотеку <code>LocalSettings.php</code>",
        "config-help": "помоћ",
        "config-help-tooltip": "кликните да бисте проширили",
        "config-nofile": "Није могуће пронаћи датотеку „$1”. Није ли избрисана?",
-       "config-extension-link": "Јесте ли знали да ваш wiki подржава [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатке]?\n\nМожете их прегледати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категорији].",
+       "config-extension-link": "Јесте ли знали да ваш вики подржава [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатке]?\n\nМожете их прегледати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категорији].",
        "config-skins-screenshots": "„$1” (снимци екрана: $2)",
        "config-skins-screenshot": "$1 ($2)",
        "config-extensions-requires": "$1 (захтева $2)",
        "config-extension-not-found": "Није могуће пронаћи датотеку регистрације за додатак „$1”",
        "config-extension-dependency": "Дошло је до грешке зависности при инсталирању додатка „$1”: $2",
        "mainpagetext": "<strong>MediaWiki је инсталиран.</strong>",
-       "mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Водич за кориснике] за информације о томе како користити wiki софтвер.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Листа поставки конфигурације]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki ЧПП]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о MediaWiki издањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борите против непожељног садржаја на свом wiki-ју]"
+       "mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Водич за кориснике] за информације о томе како користити вики софтвер.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Листа поставки конфигурације]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki ЧПП]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о MediaWiki издањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борите против непожељног садржаја на свом викију]"
 }
index ed5c7f5..4bbebd6 100644 (file)
@@ -1082,9 +1082,19 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *      expired for this specified time. This is useful if adaptiveTTL() is used on the old
         *      value's as-of time when it is verified as still being correct.
         *      Default: WANObjectCache::STALE_TTL_NONE
+        *   - touchedCallback: A callback that takes the current value and returns a timestamp that
+        *      indicates the last time a dynamic dependency changed. Null can be returned if there
+        *      are no relevant dependency changes to check. This can be used to check against things
+        *      like last-modified times of files or DB timestamp fields. This should generally not be
+        *      used for small and easily queried values in a DB if the callback itself ends up doing
+        *      a similarly expensive DB query to check a timestamp. Usages of this option makes the
+        *      most sense for values that are moderately to highly expensive to regenerate and easy
+        *      to query for dependency timestamps. The use of "pcTTL" reduces timestamp queries.
+        *      Default: null.
         * @return mixed Value found or written to the key
         * @note Options added in 1.28: version, busyValue, hotTTR, ageNew, pcGroup, minAsOf
         * @note Options added in 1.31: staleTTL, graceTTL
+        * @note Options added in 1.33: touchedCallback
         * @note Callable type hints are not used to avoid class-autoloading
         */
        final public function getWithSetCallback( $key, $ttl, $callback, array $opts = [] ) {
@@ -1183,6 +1193,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $ageNew = $opts['ageNew'] ?? self::AGE_NEW;
                $minTime = $opts['minAsOf'] ?? self::MIN_TIMESTAMP_NONE;
                $versioned = isset( $opts['version'] );
+               $touchedCallback = $opts['touchedCallback'] ?? null;
 
                // Get a collection name to describe this class of key
                $kClass = $this->determineKeyClass( $key );
@@ -1192,6 +1203,9 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $cValue = $this->get( $key, $curTTL, $checkKeys, $asOf ); // current value
                $value = $cValue; // return value
 
+               // Apply additional dynamic expiration logic if supplied
+               $curTTL = $this->applyTouchedCallback( $value, $asOf, $curTTL, $touchedCallback );
+
                $preCallbackTime = $this->getCurrentTime();
                // Determine if a cached value regeneration is needed or desired
                if ( $value !== false
@@ -1310,6 +1324,32 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                return $value;
        }
 
+       /**
+        * @param mixed $value
+        * @param float $asOf
+        * @param float $curTTL
+        * @param callable|null $callback
+        * @return float
+        */
+       protected function applyTouchedCallback( $value, $asOf, $curTTL, $callback ) {
+               if ( $callback === null ) {
+                       return $curTTL;
+               }
+
+               if ( !is_callable( $callback ) ) {
+                       throw new InvalidArgumentException( "Invalid expiration callback provided." );
+               }
+
+               if ( $value !== false ) {
+                       $touched = $callback( $value );
+                       if ( $touched !== null && $touched >= $asOf ) {
+                               $curTTL = min( $curTTL, self::TINY_NEGATIVE, $asOf - $touched );
+                       }
+               }
+
+               return $curTTL;
+       }
+
        /**
         * @param string $key
         * @param bool $versioned
index eeedff7..3fcbcf9 100644 (file)
@@ -27,6 +27,7 @@ use DateTimeZone;
 use Wikimedia;
 use InvalidArgumentException;
 use Exception;
+use RuntimeException;
 use stdClass;
 
 /**
@@ -757,7 +758,11 @@ abstract class DatabaseMysqlBase extends Database {
                                // given that the isolation level will typically be REPEATABLE-READ
                                $this->queryLogger->warning(
                                        "Using cached lag value for {db_server} due to active transaction",
-                                       $this->getLogContext( [ 'method' => __METHOD__, 'age' => $staleness ] )
+                                       $this->getLogContext( [
+                                               'method' => __METHOD__,
+                                               'age' => $staleness,
+                                               'trace' => ( new RuntimeException() )->getTraceAsString()
+                                       ] )
                                );
                        }
 
index 39f8f01..fdf96fe 100644 (file)
@@ -21,8 +21,8 @@ class SQLiteField implements Field {
        function defaultValue() {
                if ( is_string( $this->info->dflt_value ) ) {
                        // Typically quoted
-                       if ( preg_match( '/^\'(.*)\'$', $this->info->dflt_value ) ) {
-                               return str_replace( "''", "'", $this->info->dflt_value );
+                       if ( preg_match( '/^\'(.*)\'$/', $this->info->dflt_value, $matches ) ) {
+                               return str_replace( "''", "'", $matches[1] );
                        }
                }
 
index e7096c4..b31f165 100644 (file)
@@ -365,7 +365,7 @@ class LogPager extends ReverseChronologicalPager {
                return 'log_timestamp';
        }
 
-       public function getStartBody() {
+       protected function getStartBody() {
                # Do a link batch query
                if ( $this->getNumRows() > 0 ) {
                        $lb = new LinkBatch;
index 739dbec..8a089f6 100644 (file)
@@ -75,6 +75,20 @@ class EmailNotification {
         */
        protected $editor;
 
+       /**
+        * Extensions that have hooks for
+        * UpdateUserMailerFormattedPageStatus (to provide additional
+        * pageStatus indicators) need a way to make sure that, when their
+        * hook is called in SendWatchlistemailNotification, they only
+        * handle notifications using their pageStatus indicator.
+        *
+        * @since 1.33
+        * @return string
+        */
+       public function getPageStatus() {
+               return $this->pageStatus;
+       }
+
        /**
         * @deprecated since 1.27 use WatchedItemStore::updateNotificationTimestamp directly
         *
index e3e7343..12048a9 100644 (file)
@@ -367,6 +367,7 @@ class ThumbnailImage extends MediaTransformOutput {
                $attribs = [
                        'alt' => $alt,
                        'src' => $this->url,
+                       'decoding' => 'async',
                ];
 
                if ( !empty( $options['custom-url-link'] ) ) {
index 05af4fd..e9cadf3 100644 (file)
@@ -694,7 +694,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * Needless to say, it's really not a good idea to use a non-unique index
         * for this!  That won't page right.
         *
-        * @return string|array
+        * @return string|string[]
         */
        abstract function getIndexField();
 
@@ -712,7 +712,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * page_len,page_id avoids temp tables (given a page_len index). This would
         * also work if page_id was non-unique but we had a page_len,page_id index.
         *
-        * @return array
+        * @return string[]|array[]
         */
        protected function getExtraSortFields() {
                return [];
index f38ed27..e99c33b 100644 (file)
@@ -110,7 +110,7 @@ abstract class TablePager extends IndexPager {
         * @protected
         * @return string
         */
-       function getStartBody() {
+       protected function getStartBody() {
                $sortClass = $this->getSortHeaderClass();
 
                $s = '';
@@ -162,7 +162,7 @@ abstract class TablePager extends IndexPager {
         * @protected
         * @return string
         */
-       function getEndBody() {
+       protected function getEndBody() {
                return "</tbody></table>\n";
        }
 
index 3c56535..81b8a0d 100644 (file)
@@ -25,13 +25,20 @@ use MediaWiki\MediaWikiServices;
 use Wikimedia\PasswordBlacklist;
 
 /**
- * Functions to check passwords against a policy requirement
+ * Functions to check passwords against a policy requirement.
+ *
+ * $policyVal is the value configured in $wgPasswordPolicy. If the return status is fatal,
+ * the user won't be allowed to login. If the status is not good but not fatal, the user
+ * will not be allowed to set the given password (on registration or password change),
+ * but can still log in after bypassing a warning.
+ *
  * @since 1.26
+ * @see $wgPasswordPolicy
  */
 class PasswordPolicyChecks {
 
        /**
-        * Check password is longer than minimum, not fatal
+        * Check password is longer than minimum, not fatal.
         * @param int $policyVal minimal length
         * @param User $user
         * @param string $password
@@ -46,7 +53,7 @@ class PasswordPolicyChecks {
        }
 
        /**
-        * Check password is longer than minimum, fatal
+        * Check password is longer than minimum, fatal.
         * @param int $policyVal minimal length
         * @param User $user
         * @param string $password
@@ -61,7 +68,8 @@ class PasswordPolicyChecks {
        }
 
        /**
-        * Check password is shorter than maximum, fatal
+        * Check password is shorter than maximum, fatal.
+        * Intended for preventing DoS attacks when using a more expensive password hash like PBKDF2.
         * @param int $policyVal maximum length
         * @param User $user
         * @param string $password
@@ -76,7 +84,7 @@ class PasswordPolicyChecks {
        }
 
        /**
-        * Check if username and password match
+        * Check if username and password are a (case-insensitive) match.
         * @param bool $policyVal true to force compliance.
         * @param User $user
         * @param string $password
@@ -95,7 +103,7 @@ class PasswordPolicyChecks {
        }
 
        /**
-        * Check if username and password are on a blacklist
+        * Check if username and password are on a blacklist of past MediaWiki default passwords.
         * @param bool $policyVal true to force compliance.
         * @param User $user
         * @param string $password
@@ -126,7 +134,8 @@ class PasswordPolicyChecks {
        }
 
        /**
-        * Ensure that password isn't in top X most popular passwords
+        * Ensure that password isn't in top X most popular passwords, as defined by
+        * $wgPopularPasswordFile.
         *
         * @param int $policyVal Cut off to use. Will automatically shrink to the max
         *   supported for error messages if set to more than max number of passwords on file,
@@ -135,6 +144,7 @@ class PasswordPolicyChecks {
         * @param string $password
         * @since 1.27
         * @return Status
+        * @see $wgPopularPasswordFile
         */
        public static function checkPopularPasswordBlacklist( $policyVal, User $user, $password ) {
                global $wgPopularPasswordFile, $wgSitename;
@@ -173,7 +183,9 @@ class PasswordPolicyChecks {
 
        /**
         * Ensure the password isn't in the list of passwords blacklisted by the
-        * wikimedia/password-blacklist library
+        * wikimedia/password-blacklist library, which contains (as of 0.1.4) the
+        * 100.000 top passwords from SecLists (as a Bloom filter, with an
+        * 0.000001 false positive ratio).
         *
         * @param bool $policyVal Whether to apply this policy
         * @param User $user
index 776136f..20f9a78 100644 (file)
@@ -5,24 +5,40 @@ class ProfilerExcimer extends Profiler {
        private $realProf;
        private $period;
 
+       /**
+        * @param array $params Associative array of parameters:
+        *    - period: The sampling period
+        *    - maxDepth: The maximum stack depth collected
+        *    - cpuProfiler: A pre-started ExcimerProfiler instance for CPU
+        *      profiling of the entire request including configuration.
+        *    - realProfiler: A pre-started ExcimerProfiler instance for wall
+        *      clock profiling of the entire request.
+        */
        public function __construct( array $params = [] ) {
                parent::__construct( $params );
 
                $this->period = $params['period'] ?? 0.01;
                $maxDepth = $params['maxDepth'] ?? 100;
 
-               $this->cpuProf = new ExcimerProfiler;
-               $this->cpuProf->setEventType( EXCIMER_CPU );
-               $this->cpuProf->setPeriod( $this->period );
-               $this->cpuProf->setMaxDepth( $maxDepth );
-
-               $this->realProf = new ExcimerProfiler;
-               $this->realProf->setEventType( EXCIMER_REAL );
-               $this->realProf->setPeriod( $this->period );
-               $this->realProf->setMaxDepth( $maxDepth );
+               if ( isset( $params['cpuProfiler'] ) ) {
+                       $this->cpuProf = $params['cpuProfiler'];
+               } else {
+                       $this->cpuProf = new ExcimerProfiler;
+                       $this->cpuProf->setEventType( EXCIMER_CPU );
+                       $this->cpuProf->setPeriod( $this->period );
+                       $this->cpuProf->setMaxDepth( $maxDepth );
+                       $this->cpuProf->start();
+               }
 
-               $this->cpuProf->start();
-               $this->realProf->start();
+               if ( isset( $params['realProfiler'] ) ) {
+                       $this->realProf = $params['realProfiler'];
+               } else {
+                       $this->realProf = new ExcimerProfiler;
+                       $this->realProf->setEventType( EXCIMER_REAL );
+                       $this->realProf->setPeriod( $this->period );
+                       $this->realProf->setMaxDepth( $maxDepth );
+                       $this->realProf->start();
+               }
        }
 
        public function scopedProfileIn( $section ) {
index 1154e05..2afc548 100644 (file)
@@ -433,8 +433,9 @@ class Command {
                        // TODO replace with clear_last_error when requirements are bumped to PHP7
                        set_error_handler( function () {
                        }, 0 );
-                       // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
-                       @trigger_error( '' );
+                       \MediaWiki\suppressWarnings();
+                       trigger_error( '' );
+                       \MediaWiki\restoreWarnings();
                        restore_error_handler();
 
                        $readPipes = array_filter( $pipes, function ( $fd ) use ( $desc ) {
index 67d1873..c9ce2b0 100644 (file)
@@ -882,6 +882,7 @@ class SpecialBlock extends FormSpecialPage {
                                }
 
                                $status = $currentBlock->update();
+                               // TODO handle failure
 
                                $logaction = 'reblock';
 
@@ -894,6 +895,8 @@ class SpecialBlock extends FormSpecialPage {
                                if ( (bool)$currentBlock->mHideName ) {
                                        $data['HideUser'] = true;
                                }
+
+                               $block = $currentBlock;
                        }
                } else {
                        $logaction = 'block';
@@ -938,9 +941,8 @@ class SpecialBlock extends FormSpecialPage {
                $logEntry->setComment( $data['Reason'][0] );
                $logEntry->setPerformer( $performer );
                $logEntry->setParameters( $logParams );
-               # Relate log ID to block IDs (T27763)
-               $blockIds = array_merge( [ $status['id'] ], $status['autoIds'] );
-               $logEntry->setRelations( [ 'ipb_id' => $blockIds ] );
+               # Relate log ID to block ID (T27763)
+               $logEntry->setRelations( [ 'ipb_id' => $block->getId() ] );
                $logId = $logEntry->insert();
 
                if ( !empty( $data['Tags'] ) ) {
index b2d5a16..632415c 100644 (file)
@@ -248,6 +248,7 @@ class SpecialUnblock extends SpecialPage {
                if ( isset( $data['Tags'] ) ) {
                        $logEntry->setTags( $data['Tags'] );
                }
+               $logEntry->setRelations( [ 'ipb_id' => $block->getId() ] );
                $logId = $logEntry->insert();
                $logEntry->publish( $logId );
 
index 506cd3c..50f1d6b 100644 (file)
@@ -136,7 +136,7 @@ class ActiveUsersPager extends UsersPager {
                ];
        }
 
-       function doBatchLookups() {
+       protected function doBatchLookups() {
                parent::doBatchLookups();
 
                $uids = [];
index 18c1d70..bde7559 100644 (file)
@@ -276,7 +276,7 @@ class AllMessagesTablePager extends TablePager {
                return $result;
        }
 
-       function getStartBody() {
+       protected function getStartBody() {
                $tableClass = $this->getTableClass();
                return Xml::openElement( 'table', [
                        'class' => "mw-datatable $tableClass",
@@ -295,7 +295,11 @@ class AllMessagesTablePager extends TablePager {
                                <th>" .
                $this->msg( 'allmessagescurrent' )->escaped() .
                "</th>
-                       </tr></thead><tbody>\n";
+                       </tr></thead>\n";
+       }
+
+       function getEndBody() {
+               return Html::closeElement( 'table' );
        }
 
        function formatValue( $field, $value ) {
@@ -352,18 +356,18 @@ class AllMessagesTablePager extends TablePager {
 
                // But if there's a customised message, add that too.
                if ( $row->am_customised ) {
-                       $s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
+                       $s .= Html::openElement( 'tr', $this->getRowAttrs( $row, true ) );
                        $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
 
                        if ( $formatted === '' ) {
                                $formatted = "\u{00A0}";
                        }
 
-                       $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
-                               . "</tr>\n";
+                       $s .= Html::element( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
+                               . Html::closeElement( 'tr' );
                }
 
-               return $s;
+               return Html::rawElement( 'tbody', [], $s );
        }
 
        function getRowAttrs( $row ) {
index 510bf92..ca13f3d 100644 (file)
@@ -30,27 +30,79 @@ use Wikimedia\Rdbms\IDatabase;
 
 class ContribsPager extends RangeChronologicalPager {
 
-       public $mDefaultDirection = IndexPager::DIR_DESCENDING;
-       public $messages;
-       public $target;
-       public $namespace = '';
-       public $mDb;
-       public $preventClickjacking = false;
+       /**
+        * @var string[] Local cache for escaped messages
+        */
+       private $messages;
+
+       /**
+        * @var string User name, or a string describing an IP address range
+        */
+       private $target;
+
+       /**
+        * @var string Set to "newbie" to list contributions from the most recent 1% registered users.
+        *  $this->target is ignored then. Defaults to "users".
+        */
+       private $contribs;
+
+       /**
+        * @var string|int A single namespace number, or an empty string for all namespaces
+        */
+       private $namespace = '';
+
+       /**
+        * @var string|false Name of tag to filter, or false to ignore tags
+        */
+       private $tagFilter;
+
+       /**
+        * @var bool Set to true to invert the namespace selection
+        */
+       private $nsInvert;
+
+       /**
+        * @var bool Set to true to show both the subject and talk namespace, no matter which got
+        *  selected
+        */
+       private $associated;
+
+       /**
+        * @var bool Set to true to show only deleted revisions
+        */
+       private $deletedOnly;
+
+       /**
+        * @var bool Set to true to show only latest (a.k.a. current) revisions
+        */
+       private $topOnly;
+
+       /**
+        * @var bool Set to true to show only new pages
+        */
+       private $newOnly;
+
+       /**
+        * @var bool Set to true to hide edits marked as minor by the user
+        */
+       private $hideMinor;
+
+       private $preventClickjacking = false;
 
        /** @var IDatabase */
-       public $mDbSecondary;
+       private $mDbSecondary;
 
        /**
         * @var array
         */
-       protected $mParentLens;
+       private $mParentLens;
 
        /**
         * @var TemplateParser
         */
-       protected $templateParser;
+       private $templateParser;
 
-       function __construct( IContextSource $context, array $options ) {
+       public function __construct( IContextSource $context, array $options ) {
                parent::__construct( $context );
 
                $msgs = [
@@ -87,10 +139,6 @@ class ContribsPager extends RangeChronologicalPager {
                }
                $this->getDateRangeCond( $startTimestamp, $endTimestamp );
 
-               // This property on IndexPager is set by $this->getIndexField() in parent::__construct().
-               // We need to reassign it here so that it is used when the actual query is ran.
-               $this->mIndexField = $this->getIndexField();
-
                // Most of this code will use the 'contributions' group DB, which can map to replica DBs
                // with extra user based indexes or partioning by user. The additional metadata
                // queries should use a regular replica DB since the lookup pattern is not all by user.
@@ -212,6 +260,22 @@ class ContribsPager extends RangeChronologicalPager {
                        $ipRangeConds = $user->isAnon() ? $this->getIpRangeConds( $this->mDb, $this->target ) : null;
                        if ( $ipRangeConds ) {
                                $queryInfo['tables'][] = 'ip_changes';
+                               /**
+                                * These aliases make `ORDER BY rev_timestamp, rev_id` from {@see getIndexField} and
+                                * {@see getExtraSortFields} use the replicated `ipc_rev_timestamp` and `ipc_rev_id`
+                                * columns from the `ip_changes` table, for more efficient queries.
+                                * @see https://phabricator.wikimedia.org/T200259#4832318
+                                */
+                               $queryInfo['fields'] = array_merge(
+                                       [
+                                               'rev_timestamp' => 'ipc_rev_timestamp',
+                                               'rev_id' => 'ipc_rev_id',
+                                       ],
+                                       array_diff( $queryInfo['fields'], [
+                                               'rev_timestamp',
+                                               'rev_id',
+                                       ] )
+                               );
                                $queryInfo['join_conds']['ip_changes'] = [
                                        'LEFT JOIN', [ 'ipc_rev_id = rev_id' ]
                                ];
@@ -350,20 +414,22 @@ class ContribsPager extends RangeChronologicalPager {
        }
 
        /**
-        * Override of getIndexField() in IndexPager.
-        * For IP ranges, it's faster to use the replicated ipc_rev_timestamp
-        * on the `ip_changes` table than the rev_timestamp on the `revision` table.
-        * @return string Name of field
+        * @return string
         */
        public function getIndexField() {
-               if ( $this->isQueryableRange( $this->target ) ) {
-                       return 'ipc_rev_timestamp';
-               } else {
-                       return 'rev_timestamp';
-               }
+               // Note this is run via parent::__construct() *before* $this->target is set!
+               return 'rev_timestamp';
+       }
+
+       /**
+        * @return string[]
+        */
+       protected function getExtraSortFields() {
+               // Note this is run via parent::__construct() *before* $this->target is set!
+               return [ 'rev_id' ];
        }
 
-       function doBatchLookups() {
+       protected function doBatchLookups() {
                # Do a link batch query
                $this->mResult->seek( 0 );
                $parentRevIds = [];
@@ -399,14 +465,14 @@ class ContribsPager extends RangeChronologicalPager {
        /**
         * @return string
         */
-       function getStartBody() {
+       protected function getStartBody() {
                return "<ul class=\"mw-contributions-list\">\n";
        }
 
        /**
         * @return string
         */
-       function getEndBody() {
+       protected function getEndBody() {
                return "</ul>\n";
        }
 
index ee7eb3e..c69a183 100644 (file)
@@ -139,11 +139,11 @@ class DeletedContribsPager extends IndexPager {
                return 'ar_timestamp';
        }
 
-       function getStartBody() {
+       protected function getStartBody() {
                return "<ul>\n";
        }
 
-       function getEndBody() {
+       protected function getEndBody() {
                return "</ul>\n";
        }
 
index ab38e1a..a10c32f 100644 (file)
@@ -422,7 +422,7 @@ class ImageListPager extends TablePager {
                }
        }
 
-       function doBatchLookups() {
+       protected function doBatchLookups() {
                $userIds = [];
                $this->mResult->seek( 0 );
                foreach ( $this->mResult as $row ) {
index 6a8f7da..3dbec6a 100644 (file)
@@ -48,7 +48,7 @@ class MergeHistoryPager extends ReverseChronologicalPager {
                parent::__construct( $form->getContext() );
        }
 
-       function getStartBody() {
+       protected function getStartBody() {
                # Do a link batch query
                $this->mResult->seek( 0 );
                $batch = new LinkBatch();
index 6b7e4b8..6e16e79 100644 (file)
@@ -168,7 +168,7 @@ class NewFilesPager extends RangeChronologicalPager {
                return 'img_timestamp';
        }
 
-       function getStartBody() {
+       protected function getStartBody() {
                if ( !$this->gallery ) {
                        // Note that null for mode is taken to mean use default.
                        $mode = $this->getRequest()->getVal( 'gallerymode', null );
@@ -183,7 +183,7 @@ class NewFilesPager extends RangeChronologicalPager {
                return '';
        }
 
-       function getEndBody() {
+       protected function getEndBody() {
                return $this->gallery->toHTML();
        }
 
index b85bc2f..0c95b7e 100644 (file)
@@ -132,7 +132,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                return $this->mForm->formatRow( $row );
        }
 
-       function getStartBody() {
+       protected function getStartBody() {
                # Do a batch existence check on pages
                $linkBatch = new LinkBatch();
                foreach ( $this->mResult as $row ) {
@@ -145,7 +145,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                return '<ul>';
        }
 
-       function getEndBody() {
+       protected function getEndBody() {
                return '</ul>';
        }
 }
index ed437be..d17e3c6 100644 (file)
@@ -37,7 +37,7 @@ class ProtectedTitlesPager extends AlphabeticPager {
                parent::__construct( $form->getContext() );
        }
 
-       function getStartBody() {
+       protected function getStartBody() {
                # Do a link batch query
                $this->mResult->seek( 0 );
                $lb = new LinkBatch;
index fbf179d..391c313 100644 (file)
@@ -225,7 +225,7 @@ class UsersPager extends AlphabeticPager {
                return Html::rawElement( 'li', [], "{$item}{$edits}{$created}{$blocked}" );
        }
 
-       function doBatchLookups() {
+       protected function doBatchLookups() {
                $batch = new LinkBatch();
                $userIds = [];
                # Give some pointers to make user links
index 187c0a9..b83c209 100644 (file)
@@ -459,14 +459,14 @@ class BotPassword implements IDBAccessObject {
                // Split name into name+appId
                $sep = self::getSeparator();
                if ( strpos( $username, $sep ) === false ) {
-                       return self::loginHook( $username, Status::newFatal( 'botpasswords-invalid-name', $sep ) );
+                       return self::loginHook( $username, null, Status::newFatal( 'botpasswords-invalid-name', $sep ) );
                }
                list( $name, $appId ) = explode( $sep, $username, 2 );
 
                // Find the named user
                $user = User::newFromName( $name );
                if ( !$user || $user->isAnon() ) {
-                       return self::loginHook( $user ?: $name, Status::newFatal( 'nosuchuser', $name ) );
+                       return self::loginHook( $user ?: $name, null, Status::newFatal( 'nosuchuser', $name ) );
                }
 
                if ( $user->isLocked() ) {
@@ -483,39 +483,39 @@ class BotPassword implements IDBAccessObject {
                        $result = $throttle->increase( $user->getName(), $request->getIP(), __METHOD__ );
                        if ( $result ) {
                                $msg = wfMessage( 'login-throttled' )->durationParams( $result['wait'] );
-                               return self::loginHook( $user, Status::newFatal( $msg ) );
+                               return self::loginHook( $user, null, Status::newFatal( $msg ) );
                        }
                }
 
                // Get the bot password
                $bp = self::newFromUser( $user, $appId );
                if ( !$bp ) {
-                       return self::loginHook( $user, Status::newFatal( 'botpasswords-not-exist', $name, $appId ) );
+                       return self::loginHook( $user, $bp,
+                               Status::newFatal( 'botpasswords-not-exist', $name, $appId ) );
                }
 
                // Check restrictions
                $status = $bp->getRestrictions()->check( $request );
                if ( !$status->isOK() ) {
-                       return self::loginHook( $user, Status::newFatal( 'botpasswords-restriction-failed' ) );
+                       return self::loginHook( $user, $bp, Status::newFatal( 'botpasswords-restriction-failed' ) );
                }
 
                // Check the password
                $passwordObj = $bp->getPassword();
                if ( $passwordObj instanceof InvalidPassword ) {
-                       return self::loginHook( $user, Status::newFatal( 'botpasswords-needs-reset', $name, $appId ) );
+                       return self::loginHook( $user, $bp,
+                               Status::newFatal( 'botpasswords-needs-reset', $name, $appId ) );
                }
                if ( !$passwordObj->equals( $password ) ) {
-                       return self::loginHook( $user, Status::newFatal( 'wrongpassword' ) );
+                       return self::loginHook( $user, $bp, Status::newFatal( 'wrongpassword' ) );
                }
 
                // Ok! Create the session.
                if ( $throttle ) {
                        $throttle->clear( $user->getName(), $request->getIP() );
                }
-               return self::loginHook(
-                       $user,
-                       Status::newGood( $provider->newSessionForRequest( $user, $bp, $request ) )
-               );
+               return self::loginHook( $user, $bp,
+                       Status::newGood( $provider->newSessionForRequest( $user, $bp, $request ) ) );
        }
 
        /**
@@ -525,12 +525,17 @@ class BotPassword implements IDBAccessObject {
         * AuthManager, call the AuthManagerLoginAuthenticateAudit hook.
         *
         * @param User|string $user User being logged in
+        * @param BotPassword|null $bp Bot sub-account, if it can be identified
         * @param Status $status Login status
         * @return Status The passed-in status
         */
-       private static function loginHook( $user, Status $status ) {
+       private static function loginHook( $user, $bp, Status $status ) {
+               $extraData = [];
                if ( $user instanceof User ) {
                        $name = $user->getName();
+                       if ( $bp ) {
+                               $extraData['appId'] = $name . self::getSeparator() . $bp->getAppId();
+                       }
                } else {
                        $name = $user;
                        $user = null;
@@ -541,7 +546,7 @@ class BotPassword implements IDBAccessObject {
                } else {
                        $response = AuthenticationResponse::newFail( $status->getMessage() );
                }
-               Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $response, $user, $name ] );
+               Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $response, $user, $name, $extraData ] );
 
                return $status;
        }
index 1412215..ec75f05 100644 (file)
@@ -1144,8 +1144,8 @@ class User implements IDBAccessObject, UserIdentity {
         * @return bool
         */
        public function isValidPassword( $password ) {
-               // simple boolean wrapper for getPasswordValidity
-               return $this->getPasswordValidity( $password ) === true;
+               // simple boolean wrapper for checkPasswordValidity
+               return $this->checkPasswordValidity( $password )->isGood();
        }
 
        /**
@@ -1153,8 +1153,11 @@ class User implements IDBAccessObject, UserIdentity {
         *
         * @param string $password Desired password
         * @return bool|string|array True on success, string or array of error message on failure
+        * @deprecated since 1.33, use checkPasswordValidity
         */
        public function getPasswordValidity( $password ) {
+               wfDeprecated( __METHOD__, '1.33' );
+
                $result = $this->checkPasswordValidity( $password );
                if ( $result->isGood() ) {
                        return true;
index 6aa80f5..3425ce1 100644 (file)
@@ -31,7 +31,8 @@
                        "Macofe",
                        "Archaeodontosaurus",
                        "Neriman2003",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Toghrul Rahimli"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "editingsection": "Redaktə $1 (bölmə)",
        "editingcomment": "Redaktə et $1 (yeni bölmə)",
        "editconflict": "Eyni vaxtda redaktə: $1",
+       "explainconflict": "Siz məqaləni redaktə etməyə başlamazdan əvvəl başqa bir istifadəçi onu redaktə etmişdir. Yuxarıdakı mətn bölməsində hazırda mövcud olan səhifə mətni göstərilmişdir. Sizin düzəlişləriniz aşağıdakı mətn bölməsində göstərilmişdir. Siz dəyişiklikləri mövcud mətn ilə birləşdirməli olacaqsınız. \"$1\" düyməsini sıxdıqda <strong>yalnız</strong> yuxarıdakı mətn yayımlanacaq.",
        "yourtext": "Mətniniz",
        "storedversion": "Qeyd edilmiş versiya",
        "editingold": "'''DİQQƏT! Siz bu səhifənin köhnə versiyasını redaktə edirsiniz. Məqaləni yaddaşda saxlayacağınız halda bu versiyadan sonra edilmiş hər bir dəyişiklik itiriləcək.'''",
        "prefs-personal": "İstifadəçi profili",
        "prefs-rc": "Son dəyişikliklər",
        "prefs-watchlist": "İzləmə siyahısı",
+       "prefs-editwatchlist": "İzləmə siyahısını redaktə et",
+       "prefs-editwatchlist-label": "İzləmə siyahısındakıları redaktə et",
+       "prefs-editwatchlist-edit": "İzləmə siyahısındakı başlıqlara bax və ləğv et",
+       "prefs-editwatchlist-raw": "Mətn kimi redaktə et",
+       "prefs-editwatchlist-clear": "İzləmə siyahısını təmizlə",
        "prefs-watchlist-days": "İzləmə siyahısında göstərilən maksimal günlərin sayı:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|gün|gün}}",
        "prefs-watchlist-edits": "İzləmə siyahısında göstərilən maksimal redaktələrin sayı:",
        "prefs-watchlist-edits-max": "Maksimum say: 1000",
        "prefs-watchlist-token": "İzləmə siyahısı nişanı:",
+       "prefs-watchlist-managetokens": "Tokenləri idarə et",
        "prefs-misc": "Digər seçimlər",
        "prefs-resetpass": "Parolu dəyiş",
        "prefs-changeemail": "E-poçtu dəyiş və ya sil",
        "prefs-advancedwatchlist": "Ətraflı variantlar",
        "prefs-displayrc": "Görüntü variantları",
        "prefs-displaywatchlist": "Görüntü variantları",
+       "prefs-changesrc": "Dəyişikliklərin göstərişi",
+       "prefs-pageswatchlist": "İzlənilmiş səhifələr",
        "prefs-diffs": "Fərqlər",
        "userrights": "İstifadəçi haqları",
        "userrights-lookup-user": "İstifadəçi seçimi",
        "sp-contributions-username": "IP-ünvanı və ya istifadəçi adı:",
        "sp-contributions-toponly": "Son redaktə olan dəyişiklikləri göstər",
        "sp-contributions-newonly": "Yalnız yeni səhifə yaradılan dəyişiklikləri göstər",
+       "sp-contributions-hideminor": "Kiçik redaktələri gizlət",
        "sp-contributions-submit": "Axtar",
        "whatlinkshere": "Bu səhifəyə bağlantılar",
        "whatlinkshere-title": "\"$1\" məqaləsinə keçid verən səhifələr",
        "special-characters-group-thai": "Tay",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
-       "mw-widgets-usersmultiselect-placeholder": "Əlavə et..."
+       "mw-widgets-dateinput-no-date": "Tarix seçilməyib",
+       "mw-widgets-usersmultiselect-placeholder": "Əlavə et...",
+       "date-range-from": "Tarixindən:",
+       "date-range-to": "Tarixədək:"
 }
index 3d21fcc..2e3e434 100644 (file)
        "rcfilters-group-results-by-page": "دییشیکلیکلری صفحه‌لرینه گؤره سیرالا",
        "rcfilters-activefilters": "چالیشقان فیلترلر",
        "rcfilters-activefilters-hide": "گیزلت",
+       "rcfilters-activefilters-hide-tooltip": "چالیشقان فیترلر بؤلومونو گیزلت",
        "rcfilters-advancedfilters": "گئنیش فیلترلر",
        "rcfilters-limit-title": "دَییشدیرمه سایی‌سی",
        "rcfilters-date-popup-title": "آختاریش چاغی",
        "rcfilters-filtergroup-userExpLevel": "ایشلدن آدیازدیرما و تجروبه‌سی",
        "rcfilters-filter-user-experience-level-registered-label": "آدیازدیریلمیش",
        "rcfilters-filter-user-experience-level-unregistered-label": "آدیازدیریلمامیش",
+       "rcfilters-filter-user-experience-level-newcomer-label": "یئنی گلنلر",
        "rcfilters-filter-user-experience-level-learner-label": "اؤیرننلر",
        "rcfilters-filter-user-experience-level-experienced-label": "تجروبه‌لی ایشلدنلر",
        "rcfilters-filtergroup-automated": "اوْتوماتیک دییشدیرمه‌لر",
        "rcfilters-filter-major-label": "کیچیک اوْلمایان دییشدیرمه‌لر",
        "rcfilters-filtergroup-watchlist": "ایزلنمیش صفحه‌لر",
        "rcfilters-filter-watchlist-watched-label": "ایزلنمیش",
+       "rcfilters-filter-watchlist-notwatched-label": "ایزلنمه‌میش",
        "rcfilters-filtergroup-changetype": "دَییشیکلیک نوعو",
        "rcfilters-filter-pageedits-label": "صفحه دییشدیرمه‌لری",
        "rcfilters-filter-newpages-label": "صفحه یاراتما",
index 646787e..b632df8 100644 (file)
        "filedelete-reason-otherlist": "Іншая прычына",
        "filedelete-reason-dropdown": "* Звычайныя прычыны выдаленьня\n** парушэньне аўтарскіх правоў\n** файл-дублікат",
        "filedelete-edit-reasonlist": "Рэдагаваць прычыны выдаленьня",
-       "filedelete-maintenance": "Выдаленьне і аднаўленьне файлаў часова забароненае па прычыне падтрымкі.",
+       "filedelete-maintenance": "Выдаленьне і аднаўленьне файлаў часова забароненае праз тэхнічныя працы.",
        "filedelete-maintenance-title": "Немагчыма выдаліць файл",
        "mimesearch": "Пошук па MIME",
        "mimesearch-summary": "Гэта старонка дазваляе адбор файлаў па іх MIME-тыпе.\nФармат уводу: тып_зьместу/падтып або тып_зьместу/*, напрыклад, <code>image/jpeg</code>.",
index 3bded91..c5fed42 100644 (file)
        "prefs-advancedwatchlist": "Разширени настройки",
        "prefs-displayrc": "Настройки за показване на списъка",
        "prefs-displaywatchlist": "Видими настройки",
+       "prefs-changesrc": "Показвани промени",
        "prefs-tokenwatchlist": "Маркер",
        "prefs-diffs": "Разлики",
        "prefs-help-prefershttps": "Това предпочитание ще бъде активирано при следващото влизане.",
index a0da5b4..7819758 100644 (file)
        "ns-specialprotected": "N'haller ket kemmañ ar pajennoù en esaouenn anv {{ns:special}}.",
        "titleprotected": "Gwarezet eo bet an titl-mañ p'eo bet krouet gant [[User:$1|$1]].\nSetu amañ perak <em>$2</em>.",
        "filereadonlyerror": "Dibosupl kemmañ ar restr \"$1\" abalamour m'emañ ar c'havlec'h restroù \"$2\" e mod lenn nemetken.\n\n\"$3\" eo an abeg roet gant merour ar reizhiad en deus prennet anezhi.",
+       "invalidtitle": "Titl direizh",
        "invalidtitle-knownnamespace": "Titl direizh gant an esaouenn anv \"$2\" hag an destenn \"$3\"",
        "invalidtitle-unknownnamespace": "Titl direizh gant an niverenn esaouenn anv $1 hag an destenn \"$2\" dianav",
        "exception-nologin": "N'oc'h ket kevreet",
        "subject-preview": "Rakwelet an danvez :",
        "previewerrortext": "C'hoarvezet ez eus ur fazi e-ser klask rakwelet ho kemmoù",
        "blockedtitle": "Implijer stanket",
-       "blockedtext": "'''Stanket eo bet ho kont implijer pe ho chomlec'h IP'''\n\nGant $1 eo bet graet.\nSetu an abeg evit se : ''$2''.\n\n* Stanket adalek : $8\n* Stanket betek : $6\n* Pad ar stankadenn : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar [[{{MediaWiki:Grouppage-sysop}}|verourien]] all evit eskemm ganto war se. N'hallit implijout an arc'hwel 'kas ur postel d'an implijer-mañ' nemet ma'z eus bet spisaet ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù kont]] ha ma n'eo ket bet stanket.\n$3 eo ho chomlec'h IP, ha #$5 eo niverenn an identelezh stanket.\nMerkit anezho en ho koulennoù bep tro.",
+       "blockedtext": "<strong>Stanket eo bet ho kont implijer pe ho chomlec'h IP</strong>\n\nGant $1 eo bet graet.\nSetu an abeg evit se : <em>$2</em>.\n\n* Stanket adalek : $8\n* Stanket betek : $6\n* Kont stanket : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar [[{{MediaWiki:Grouppage-sysop}}|verourien]] all evit eskemm ganto war se. N'hallit implijout an arc'hwel ''{{int:emailuser}} nemet ma'z eus bet spisaet ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù kont]] ha ma n'eo ket bet stanket.\n$3 eo ho chomlec'h IP, ha #$5 eo niverenn an identelezh stanket.\nMerkit anezho en ho koulennoù bep tro.",
        "autoblockedtext": "Stanket eo bet ho chomlec'h IP ent emgefreek rak implijet e veze gant un implijer all bet stanket gant $1.\nSetu aze an abeg :\n\n: ''$2''\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Kont stanket : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar\n[[{{MediaWiki:Grouppage-sysop}}|verourien]] all ma kavit abeg er stankadenn.\n\nNotennit mat ne c'hallot implijout an dibarzh \"kas ur postel d'an implijer\" nemet ma'z eus bet merket ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù implijer]] ha ma n'eo ket bet stanket ivez.\n\n$3 eo ho chomlec'h IP evit poent ha #$5 ho niverenn stankadenn.\nMerkit mat an titouroù-se war kement goulenn savet ganeoc'h.\n\n$5 eo ho niverenn stankadenn. Merkit mat an niverenn-se pa rit goulennoù.",
        "systemblockedtext": "Stanket eo bet hoc'h anv implijer pe ho chomlec'h IP ent emgefre gant MediaWiki.\nSetu perak :\n\n:<em>$2</em>\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Hinienn a sell ar stankadenn outi : $7\n\n$3 eo ho chomlec'h IP diouzhtu.\nMerkit mat ar munudoù skrivet a-us er c'hlemmoù a c'halljec'h ober.",
        "blockednoreason": "n'eus bet roet abeg ebet",
        "diff-paragraph-moved-toold": "Ar rannbennad azo bet fiñvet. Klikit evit mont davet al lec'hiadur gozh.",
        "difference-missing-revision": "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.\n\nC'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.\nGallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
        "searchresults": "Disoc'hoù enklask",
+       "search-filter-title-prefix-reset": "Klask an holl bajennoù",
        "searchresults-title": "Disoc'hoù klask evit \"$1\"",
        "titlematches": "Klotadurioù gant an titloù",
        "textmatches": "Klotadurioù en testennoù",
        "prefs-watchlist-edits": "Niver a gemmoù da ziskouez er roll evezhiañ astennet :",
        "prefs-watchlist-edits-max": "Niver brasañ : 1000",
        "prefs-watchlist-token": "Jedouer evit ar roll evezhiañ :",
+       "prefs-watchlist-managetokens": "Merañ ar jedoueroù",
        "prefs-misc": "Penndibaboù liesseurt",
        "prefs-resetpass": "Cheñch ar ger-tremen",
        "prefs-changeemail": "Cheñch ar chomlec'h postel pe dilemel anezhañ",
        "right-edituserjs": "Kemmañ restroù JS implijerien all",
        "right-editmyusercss": "Aozañ ho restroù implijer CSS deoc'h-c'hwi",
        "right-editmyuserjson": "Aozañ ho restroù implijer JSON deoc'h-c'hwi",
-       "right-editmyuserjs": "Aoazañ ho restroù JavaScript implijer deoc'h-c'hwi",
+       "right-editmyuserjs": "Aozañ ho restroù JavaScript implijer deoc'h-c'hwi",
        "right-viewmywatchlist": "Gwelet ho roll-evezhiañ deoc'h-c'hwi",
        "right-editmywatchlist": "Kemmañ ho roll evezhiañ deoc'h-c'hwi. Notit mat e vo c'hoazh ouzhpennet pajennoù hep ar gwir-mañ gant obererezhioù zo.",
        "right-viewmyprivateinfo": "Gwelet ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
        "recentchangeslinked-feed": "Heuliañ ar pajennoù liammet",
        "recentchangeslinked-toolbox": "Heuliañ ar pajennoù liammet",
        "recentchangeslinked-title": "Kemmoù a denn da \"$1\"",
-       "recentchangeslinked-summary": "Merkañ anv ur bajenn evit gwelet ar c'hemmoù war ar pajennoù liammet da pe adalek ar bajenn-se (evit gwelet izili ur rummad bennak, skrivañ Rummad:anv ar rummad).\nE <strong>tev</strong> emañ kemmoù ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
+       "recentchangeslinked-summary": "Merkañ anv ur bajenn evit gwelet ar c'hemmoù war ar pajennoù liammet da pe adalek ar bajenn-se (evit gwelet izili ur rummad bennak, skrivañ {{ns:category}}:Anv ar rummad).\nE <strong>tev</strong> emañ kemmoù ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
        "recentchangeslinked-page": "Anv ar bajenn :",
        "recentchangeslinked-to": "Diskouez ar c'hemmoù war-du ar pajennoù liammet kentoc'h eget re ar bajenn lakaet",
        "recentchanges-page-added-to-category": "[[:$1]] ouzhpennet d'ar rummad",
        "filehist-filesize": "Ment ar restr",
        "filehist-comment": "Notenn",
        "imagelinks": "Implij ar restr",
-       "linkstoimage": "Liammet eo {{PLURAL:$1|ar bajenn-mañ|an $1 pajenn-mañ}} ouzh ar restr-mañ :",
-       "linkstoimage-more": "Ouzhpenn $1 {{PLURAL:$1|bajenn zo liammet ouzh|pajenn zo liammet ouzh}} ar restr-mañ.\nNe laka ar roll-mañ war wel nemet {{PLURAL:$1|ar bajenn gentañ liammet ouzh|an $1 pajenn gentañ liammet ouzh}} ar rest-mañ.\nUr [[Special:WhatLinksHere/$2|roll klok]] a c'haller da gaout.",
-       "nolinkstoimage": "N'eus liamm ebet war-du ar skeudenn-mañ war pajenn ebet.",
+       "linkstoimage": "Implijout a ra {{PLURAL:$1|ar bajenn da heul|an $1 pajenn da heul}} ar restr-mañ :",
+       "linkstoimage-more": "Ouzhpenn $1 {{PLURAL:$1|bajenn zo liammet ouzh|pajenn zo liammet ouzh}} ar restr-mañ.\nNe ziskwel ar roll-mañ nemet {{PLURAL:$1|ar bajenn gentañ|an $1 pajenn gentañ}} a implij ar restr-mañ.\nUr [[Special:WhatLinksHere/$2|roll klok]] a c'haller da gaout.",
+       "nolinkstoimage": "Pajenn ebet ne implij ar restr-mañ.",
        "morelinkstoimage": "Gwelet [[Special:WhatLinksHere/$1|liammoù ouzhpenn]] war-du ar restr-mañ.",
        "linkstoimage-redirect": "$1 (adkas restr) $2",
        "duplicatesoffile": "Un eil eus ar restr-mañ eo {{PLURAL:$1|ar restr da-heul|ar restroù da-heul}}, ([[Special:FileDuplicateSearch/$2|evit gouzout hiroc'h]]) :",
        "deadendpages": "Pajennoù dall (hep liamm diabarzh)",
        "deadendpagestext": "Ar pajennoù da-heul n'int ket liammet ouzh pajenn ebet all eus {{SITENAME}}.",
        "protectedpages": "Pajennoù gwarezet",
+       "protectedpages-filters": "Siloù :",
        "protectedpages-indef": "Gwarezoù da badout hepken",
        "protectedpages-summary": "Rollañ a ra ar bajenn-mañ ar pajennoù zo gwarezet evit ar mare. Evit kaout roll ar pajennoù n'haller ket krouiñ, sellet ouzh [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Gwarez dre skalierad hepken",
        "ipb-disableusertalk": "Mirout ouzh an implijer-mañ da implijout e bajenn gaozeal dezhañ e-unan e-keit hag emañ stanket",
        "ipb-change-block": "Adstankañ an implijer-mañ gant an hevelep arventennoù",
        "ipb-confirm": "Kadarnaat ar stankadenn",
+       "ipb-type-label": "Seurt",
+       "ipb-pages-label": "Pajennoù",
        "badipaddress": "Kamm eo ar chomlec'h IP.",
        "blockipsuccesssub": "Stankadenn deuet da benn vat",
        "blockipsuccesstext": "Stanket eo bet [[Special:Contributions/$1|$1]].<br />\nSellit ouzh [[Special:BlockList|roll ar chomlec'hioù IP ha kontoù stanket]] evit gwiriañ ar stankadennoù.",
        "createaccountblock": "Harzet eo ar c'hrouiñ kontoù",
        "emailblock": "Postel stanket",
        "blocklist-nousertalk": "n'hall ket kemmañ e bajenn gaozeal dezhañ e-unan",
+       "blocklist-editing": "O kemmañ",
+       "blocklist-editing-sitewide": "o kemmañ (al lec'hienn a-bezh)",
        "ipblocklist-empty": "Goullo eo roll ar stankadennoù.",
        "ipblocklist-no-results": "An anv implijer pe ar chomlec'h IP goulennet n'eo ket stanket anezhañ.",
        "blocklink": "stankañ",
        "pageinfo-display-title": "Titl diskwelet",
        "pageinfo-default-sort": "Alc'hwez rummañ dre ziouer",
        "pageinfo-length": "Ment ar bajenn (en oktedoù)",
+       "pageinfo-namespace": "Esaouenn anv",
        "pageinfo-article-id": "Niverenn ar bajenn",
        "pageinfo-language": "Yezh ar bajenn",
        "pageinfo-language-change": "kemmañ",
        "confirm-unwatch-top": "Lemel ar bajenn-mañ a-ziwar ho roll evezhiañ",
        "confirm-rollback-button": "Mat eo",
        "confirm-rollback-top": "Disteurel ar c'hemmoù graet er bajenn-mañ ?",
+       "confirm-mcrundo-title": "Dizober ur c'hemm",
+       "mcrundofailed": "Dizober c'hwitet",
+       "mcrundo-missingparam": "Arventennoù rekis d'ar reked a vank.",
        "quotation-marks": "« $1 »",
        "imgmultipageprev": "← pajenn gent",
        "imgmultipagenext": "pajenn war-lerc'h →",
        "tag-mw-contentmodelchange": "cheñch ar patrom danvez",
        "tag-mw-contentmodelchange-description": "KEmmoù a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel cheñch patrom danvez] ur bajenn",
        "tag-mw-new-redirect": "Adkas nevez",
+       "tag-mw-removed-redirect": "Nullañ an adkas",
+       "tag-mw-blank": "Goullonderiñ",
+       "tag-mw-replace": "Erlerc'hiet",
+       "tag-mw-rollback": "Dizober",
        "tag-mw-undo": "Dizober",
        "tags-title": "Tikedennoù",
        "tags-intro": "Rollañ a ra ar bajenn-mañ an tikedennoù a c'hall ar meziant implijout da verkañ kemmoù hag o zalvoudegezh.",
        "mw-widgets-titleinput-description-redirect": "adkas war-zu $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Ouzhpennañ ur rummad...",
        "mw-widgets-usersmultiselect-placeholder": "Ouzhpennañ muioc'h...",
+       "mw-widgets-titlesmultiselect-placeholder": "Ouzhpennañ muioc'h...",
        "date-range-from": "Adalek deiziañ an :",
        "date-range-to": "Betek deiziad an :",
        "sessionmanager-tie": "N'hallet ket kevrediñ meur a seurt reked dilesañ : $1.",
index 07a93b2..28cec09 100644 (file)
        "accmailtext": "S'ha enviat una contrasenya aleatòria a $2 per a {{GENDER:$1|l'usuari|la usuària}} [[User talk:$1|$1]].\n\nLa contrasenya per aquest nou compte pot ser canviada a la pàgina de ''[[Special:ChangePassword|canvi de contrasenya]]'' un cop connectat.",
        "newarticle": "(Nou)",
        "newarticletext": "Heu seguit un enllaç a una pàgina que encara no existeix.\nPer a crear-la, comenceu a escriure en l'espai de sota\n(vegeu l'[$1 ajuda] per a més informació).\nSi sou ací per error, simplement cliqueu al botó «Enrere» del vostre navegador.",
-       "anontalkpagetext": "----\n<em>Aquesta és la pàgina de discussió d'un usuari anònim que encara no ha creat un compte o que no fa servir el seu nom registrat. Per tant, hem de fer servir la seua adreça IP numèrica per a identificar-lo. Una adreça IP pot ser compartida per diversos usuaris. Si sou un usuari anònim i trobeu que us han adreçat comentaris no apropiats, [[Special:CreateAccount|creeu un compte]] o [[Special:UserLogin|inicieu sessió]] per a evitar futures confusions amb altres usuaris anònims.",
+       "anontalkpagetext": "----\n<em>Aquesta és la pàgina de discussió d'un usuari anònim que encara no ha creat un compte o que no fa servir el seu nom registrat.</em>\nPer tant, hem de fer servir l'adreça IP numèrica per a identificar-lo. \nUna adreça IP pot ser compartida per diversos usuaris. \nSi sou un usuari anònim i trobeu que us han adreçat comentaris no apropiats, [[Special:CreateAccount|creeu un compte]] o [[Special:UserLogin|inicieu sessió]] per a evitar futures confusions amb altres usuaris anònims.",
        "noarticletext": "Actualment no hi ha text en aquesta pàgina.\nPodeu [[Special:Search/{{PAGENAME}}|cercar aquest títol]] en altres pàgines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar en els registres]\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear-la ara]</span>.",
        "noarticletext-nopermission": "Actualment no hi ha text en aquesta pàgina.\nPodeu [[Special:Search/{{PAGENAME}}|cercar aquest títol]] en altres pàgines o bé <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar en els registres relacionats]</span>, però no teniu permisos per crear la pàgina.",
        "missing-revision": "La revisió núm. $1 de la pàgina anomenada «{{FULLPAGENAME}}» no existeix.\n\nNormalment això ocorre quan seguiu un enllaç d’historial desactualitzat que apunta a una pàgina que s’ha suprimit.\nPodeu trobar detalls en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].",
        "uploadstash-zero-length": "El fitxer té mida zero.",
        "invalid-chunk-offset": "El desplaçament del fragment no és vàlid",
        "img-auth-accessdenied": "Accés denegat",
-       "img-auth-nopathinfo": "Hi manca PATH_INFO.\nEl servidor no està configurat per passar aquesta informació.\nPot estar basat en CGI i no ser compatible amb img_auth.\nConsulteu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "Hi manca la informació del camí.\nCal configurar el servidor per passar les variables REQUEST_URI i/o PATH_INFO.\nConsulteu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "No s'ha trobat la ruta sol·licitada al directori de càrrega configurat.",
        "img-auth-badtitle": "No s'ha pogut construir un títol vàlid a partir de \"$1\".",
        "img-auth-nologinnWL": "No has iniciat sessió i \"$1\" no està a la llista blanca.",
index eda44b8..eb3c68e 100644 (file)
        "recentchangescount": "ژمارەی گۆڕانکارییەکان کە نیشان ئەدرێن لە حاڵەتی دیفاڵت:",
        "prefs-help-recentchangescount": "زۆرترین ژمارە: ١٠٠٠",
        "prefs-help-watchlist-token2": "ئەمە کلیلێکی تایبەتیی پێڕستی چاودێرییەکەتە. ھەرکەسێک بیزانێت دەتوانێت پێڕستی چاودێرییەکەت ببینێت، بۆیە لای خۆت بیپارێزە.\nئەگەر پێویستی کرد، [[Special:ResetTokens|دەتوانیت بیگۆڕیت]].",
+       "prefs-help-tokenmanagement": "دەتوانیت کلیلی نهێنی هەژمارەکەت ببینیت و بگۆڕیت، کە پێڕستی چاودێریتی پێ دەبینرێت. هەرکەسێک ئەم کلیلە بزانێت دەتوانێت پێڕستی چاودێریت ببینێت، بۆیە مەیدە بە کەس.",
        "savedprefs": "ھەڵبژاردەکانت پاشەکەوت کران",
        "savedrights": "گرووپەکانی بەکارھێنەر بۆ $1 پاشەکەوت کران.",
        "timezonelegend": "ناوچەی کاتی:",
        "prefs-advancedwatchlist": "هەڵبژاردە پێشکەوتووەکان",
        "prefs-displayrc": "ھەڵبژاردەکانی نیشاندان",
        "prefs-displaywatchlist": "ھەڵبژاردەکانی نیشاندان",
+       "prefs-changesrc": "ئەو گۆڕانکارییانەی نیشان دەدرێن",
+       "prefs-changeswatchlist": "ئەو گۆڕانکارییانەی نیشان دەدرێن",
+       "prefs-pageswatchlist": "پەڕە چاودێریکراوەکان",
        "prefs-tokenwatchlist": "نیشانە",
        "prefs-diffs": "جیاوازییەکان",
        "prefs-help-prefershttps": "بەکارخستنی ئەم تایبەتمەندییە کاریگەری لەسەر چوونەژوورەوەی داھاتووت دروست دەکات",
        "changecontentmodel-reason-label": "هۆکار:",
        "changecontentmodel-submit": "گۆڕین",
        "log-name-contentmodel": "لۆگی گۆڕینی مۆدێلی ناوەڕۆک",
+       "logentry-contentmodel-new": "$1 پەڕەی $3ی بە مۆدێلی ناوەڕۆکی نابنچینەیی «$5» دروست کرد.",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|مۆدێلی}} ناوەڕۆکی پەڕەی $3ی لە «$4» گۆڕی بە «$5»",
        "logentry-contentmodel-change-revertlink": "گەڕاندنەوە",
        "logentry-contentmodel-change-revert": "گەڕاندنەوە",
index 9ac20eb..35f6600 100644 (file)
        "grant-delete": "Mazat stránky, revize a protokolovací záznamy",
        "grant-editinterface": "Editovat jmenný prostor MediaWiki a celoprojektový/uživatelský JSON",
        "grant-editmycssjs": "Editovat váš uživatelský CSS/JSON/JavaScript",
-       "grant-editmyoptions": "Změna vašich uživatelských nastavení",
+       "grant-editmyoptions": "Změna vašich uživatelských nastavení a konfigurace JSON",
        "grant-editmywatchlist": "Upravovat váš seznam sledovaných stránek",
        "grant-editsiteconfig": "Editovat celoprojektové a uživatelské CSS/JS",
        "grant-editpage": "Editovat existující stránky",
        "rcfilters-watchlist-edit-watchlist-button": "Editovat seznam sledovaných stránek",
        "rcfilters-watchlist-showupdated": "Změny stránek, které jste od provedení změn nenavštívili, jsou zobrazeny <strong>tučně</strong> s vyplněnou značkou.",
        "rcfilters-preference-label": "Používat rozhraní bez JavaScriptu",
-       "rcfilters-preference-help": "Načte poslední změny bez filtrů či zvýrazňování.",
+       "rcfilters-preference-help": "Načte poslední změny bez vyhledávání filtrů či zvýrazňování.",
        "rcfilters-watchlist-preference-label": "Používat rozhraní bez JavaScriptu",
-       "rcfilters-watchlist-preference-help": "Načte sledované stránky bez filtrů či zvýrazňování.",
+       "rcfilters-watchlist-preference-help": "Načte sledované stránky bez vyhledávání filtrů či zvýrazňování.",
        "rcfilters-filter-showlinkedfrom-label": "Zobrazit změny stránek, na které se odkazuje",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Stránky odkazované z</strong> vybrané stránky",
        "rcfilters-filter-showlinkedto-label": "Zobrazit změny stránek, které sem odkazují",
        "mcrundofailed": "Vrácení editace zpět se nezdařilo",
        "mcrundo-missingparam": "V požadavku chybí povinné parametry.",
        "mcrundo-changed": "Od chvíle, kdy jste si prohlédli rozdíl, se stránka změnila. Zkontrolujte prosím novou změnu.",
+       "mcrundo-parse-failed": "Nepodařilo se analyzovat novou revizi: $1",
        "ellipsis": "…",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
index 850987a..0596435 100644 (file)
@@ -70,7 +70,8 @@
                        "Saederup92",
                        "Fitoschido",
                        "Jorn Ari",
-                       "Fnielsen"
+                       "Fnielsen",
+                       "Weblars"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
        "prefs-editwatchlist-clear": "Ryd din overvågningsliste",
        "prefs-watchlist-days": "Antal dage der skal vises i overvågningslisten:",
        "prefs-watchlist-days-max": "Højst $1 {{PLURAL:$1|dag|dage}}",
-       "prefs-watchlist-edits": "Maksimalt antal redigeringer der vises i overvågningsliste:",
+       "prefs-watchlist-edits": "Maksimalt antal redigeringer der vises i overvågningslisten:",
        "prefs-watchlist-edits-max": "Maks. 1000",
-       "prefs-watchlist-token": "Overvågningslistenøgle:",
+       "prefs-watchlist-token": "Nøgle til overvågningsliste:",
+       "prefs-watchlist-managetokens": "Håndtér nøgler",
        "prefs-misc": "Forskelligt",
        "prefs-resetpass": "Skift adgangskode",
        "prefs-changeemail": "Skift eller fjern e-mailadresse",
        "stub-threshold-disabled": "Deaktiveret",
        "recentchangesdays": "Antal dage som skal vises i seneste ændringer:",
        "recentchangesdays-max": "(maks. $1 {{PLURAL:$1|dag|dage}})",
-       "recentchangescount": "Antal redigeringer som skal vises som standard i sidste ændringer, sidehistorikker og logger:",
+       "recentchangescount": "Antal redigeringer der som standard vises i seneste ændringer, sidehistorikker og logger:",
        "prefs-help-recentchangescount": "Maksimalt antal: 1000",
        "prefs-help-watchlist-token2": "Dette er den hemmelige nøgle til web-feed af din overvågningsliste.\nHvis andre kender den, vil man være i stand til at læse din overvågningsliste, så del den ikke.\n[[Special:ResetTokens|Klik her]] hvis du har brug at nulstille den.",
+       "prefs-help-tokenmanagement": "Du kan se og nulstille den hemmelige nøgle for din konto som kan få tilgang til din overvågningsliste via feeds. Alle som har nøglen vil kunne læse din overvågningsliste, så del den derfor ikke.",
        "savedprefs": "Dine indstillinger er blevet gemt.",
        "savedrights": "Brugergrupperne for {{GENDER:$1|$1}} er blevet gemt.",
        "timezonelegend": "Tidszone:",
        "prefs-changesrc": "Ændringer vist",
        "prefs-changeswatchlist": "Ændringer vist",
        "prefs-pageswatchlist": "Overvågede sider",
-       "prefs-tokenwatchlist": "Mærke",
+       "prefs-tokenwatchlist": "Nøgle",
        "prefs-diffs": "Forskelle",
        "prefs-help-prefershttps": "Denne indstilling træder i kraft næste gang du logger på.",
        "prefswarning-warning": "Du har foretaget ændringer af dine indstillinger, som ikke er gemt endnu.\nHvis du forlader denne side uden at klikke \"$1\", vil dine indstillinger ikke blive opdateret.",
        "rcfilters-watchlist-edit-watchlist-button": "Rediger din liste med overvågede sider",
        "rcfilters-watchlist-showupdated": "Ændringer til sider du ikke har besøgt siden ændringerne blev gjort vises med <strong>fed</strong>, med faste markører.",
        "rcfilters-preference-label": "Brug grænsefladesnittet uden JavaScript",
+       "rcfilters-watchlist-preference-label": "Brug grænsefladesnittet uden JavaScript",
+       "rcfilters-watchlist-preference-help": "Indlæser overvågningslisten uden mulighed for søgning med filter eller fremhævelse.",
        "rcfilters-filter-showlinkedto-label": "Vis ændringer på sider der linker til",
        "rcfilters-target-page-placeholder": "Indtast et sidenavn (eller en kategori)",
        "rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.",
        "tags-delete": "slet",
        "tags-activate": "aktiver",
        "tags-deactivate": "deaktiver",
-       "tags-hitcount": "{{PLURAL:$1|en ændring|$1 ændringer}}",
+       "tags-hitcount": "{{PLURAL:$1|1 ændring|$1 ændringer}}",
        "tags-create-heading": "Opret et nyt mærke",
        "tags-create-explanation": "Som standard vil nye mærker blive gjort tilgængelige for brugere og robotter.",
        "tags-create-tag-name": "Mærkenavn:",
        "date-range-to": "Til dato:",
        "sessionmanager-tie": "Kan ikke kombinere flere forespørgselgodkendelsetyper: $1.",
        "sessionprovider-generic": "$1 sessioner",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-baserede sessioner",
        "randomrootpage": "Tilfældig stamside",
        "log-action-filter-block": "Blokeringstype:",
        "log-action-filter-delete": "Sletningstype:",
        "authmanager-create-from-login": "For at oprette din konto, så udfyld venligst felterne.",
        "authmanager-authplugin-setpass-failed-title": "Ændring af adgangskode mislykkedes",
        "authmanager-authplugin-setpass-bad-domain": "Ugyldig domæne.",
+       "authmanager-autocreate-noperm": "Automatisk kontooprettelse er ikke tilladt.",
        "authmanager-userdoesnotexist": "Brugerkontoen \"$1\" er ikke registreret.",
        "authmanager-email-label": "E-post",
        "authmanager-email-help": "E-postadresse",
index e6e6269..e051439 100644 (file)
        "grant-delete": "Seiten, Versionen und Logbucheinträge löschen",
        "grant-editinterface": "Den MediaWiki-Namensraum und wikiweites/Benutzer-JSON bearbeiten",
        "grant-editmycssjs": "Dein Benutzer-CSS/JSON/JavaScript bearbeiten",
-       "grant-editmyoptions": "Deine Benutzereinstellungen bearbeiten",
+       "grant-editmyoptions": "Deine Benutzereinstellungen und JSON-Konfiguration bearbeiten",
        "grant-editmywatchlist": "Deine Beobachtungsliste bearbeiten",
        "grant-editsiteconfig": "Wikiweites und Benutzer-CSS/JS bearbeiten",
        "grant-editpage": "Vorhandene Seiten bearbeiten",
index 2e6eef9..9c7505d 100644 (file)
        "subject": "Mewzu:",
        "minoredit": "No yew vırnayışo werdiyo",
        "watchthis": "Şıma bewnê ena perre",
-       "savearticle": "Perre qeyd ke",
+       "savearticle": "Pele qeyd ke",
        "savechanges": "Vırnayışan qeyd kerê",
        "publishpage": "Riperri bare ke",
        "publishchanges": "Vırnayışan qeyd ke",
        "explainconflict": "Wexta ke şıma pel vurneyene yewna ten zi pel vurna.\nNuşteyo corin; halê pelo nıkayin mocneno.\nVurnayişê şıma cêr de mocya ( musya).\nVurnayişanê peyinan şıma gani qayd bıkeri.\nWexta ke şıma butonê \"$1\" tıkna '''teyna''' nuşteyo corin qayd beno.",
        "yourtext": "nuşteyê şıma",
        "storedversion": "Nuşteyo qaydbiyaye",
-       "editingold": "'''İqaz: Şıma ena perre sera yew çım ra viyarnayışê kıhani vırnenê.'''\nEger şıma ey qeyd kerê, pêro vırnayışê ke çım ra viyarnayış ra heta ewro biy, ê benê vıni.",
+       "editingold": "'''İqaz: Şıma ena pele sera yew çım ra viyarnayışê kıhani vurnenê.'''\nEger şıma ey qeyd kerê, pêro vurnayışê ke çımraviyarnayış ra heta ewro biy, ê benê vıni.",
        "yourdiff": "pêverronayiş",
        "copyrightwarning": "'''Recay iqazi:'''Sitey {{SITENAME}} ra iştıraki pêro umışiya $2 zerre deyo (teferuatan rê $1 bıvênê).\n\nİştırakê şıma, şıma qayıl niyê ke yewna merdımi kerpeyina bıvurnê ya zi yewna cayi ra vıla kerê ke, iştırakiştıraq = iştırak. mekewê.<br />\nFına zi qayılê ke iştıraq kewê, şıma qayılê ke şar vaco eno nuşte fılan kesi nusnayo ya zi meqemanê resmiyan ra zanayışê cı û malumatê cı esto / cayanê xoseran ra gırewtışi rê şıma garanti danê. '''Tiya de şıma werê telifi ra ke mısade nêgırewto, eserê cı tiya vıla mekerê! '''",
        "copyrightwarning2": "Ney bızanê ke nuşteyê ke şıma ruşnenê (şawenê) keyepela {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niyê kes bıvurno, nuşteyanê xo meerzê ita. <br />\nWexto ke şıma nuşteyi zi erzenê ita; şıma gani teahud bıdê koti ra ardo (qandê teferuati ra referans: $1).",
        "defaultmessagetext": "Metnê mesacê hesabiyayey",
        "content-failed-to-parse": "Qandê madela $3 zereyê $1, $2 sero nêagozyayo",
        "invalid-content-data": "Zerrey malumati nêravêrdeyo",
-       "content-not-allowed-here": "\"$1\" sero per da [[:$2]] rê mısade nêdeyêno",
+       "content-not-allowed-here": "Zerreki rê „$1“ punıkê „$3“ pela [[:$2]] de mısade nêdayo",
        "editwarning-warning": "Wexto ke şıma na pele ra veciyê, beno ke vurnayışê şıma vindi bê.\nEke şıma kewtê hesabê xo, şıma şenê nê balantışi qısmê \"{{int:prefs-editing}}\"i de tercihanê xo ra bıvındarnê.",
        "editpage-notsupportedcontentformat-title": "Formatê zerreki qebul nêbeno",
+       "slot-name-main": "Ser",
        "content-model-wikitext": "wikimetin",
        "content-model-text": "metno pan",
        "content-model-javascript": "JavaScript",
        "timezonelegend": "Warey saete:",
        "localtime": "saeta mehelliye:",
        "timezoneuseserverdefault": "Zey karkerdışê Wiki ($1)",
-       "timezoneuseoffset": "Zewbina (offseti beli bıke)",
+       "timezoneuseoffset": "Zewbina (ferqo cêrên areze ke)",
        "servertime": "Wextê serveri:",
        "guesstimezone": "Browser ra pırr ke",
        "timezoneregion-africa": "Afrika",
        "mimesearch": "MIME bigêre",
        "mimesearch-summary": "Na perre, dosyayanê MIME gorey tewran ra parzûn kena. Cıkewtış: tewrê zerreki/tewro bınên ya zi tewrê zerreki/*, nımune: <code>image/jpeg</code>.",
        "mimetype": "Babetê NIME",
-       "download": "Bıselagnê",
+       "download": "biya war",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "listredirects": "Lista serşıkıtışan",
        "listduplicatedfiles": "Lista dosyeyanê ke kopyaya cı vêniyena",
        "protectedtitles": "Sernameyê pawıteyi",
        "protectedtitlesempty": "pê ney parametreyan sernuşteyê pawite çinê",
        "protectedtitles-submit": "Sereki bımotne",
-       "listusers": "Listeyê Karberan",
+       "listusers": "Lista karberan",
        "listusers-editsonly": "Teyna karberanê vırnayış kerdoğan bımotne",
        "listusers-creationsort": "goreyê wextê vıraştışi rêz ker",
        "listusers-desc": "Kemeyen rézed ratn",
        "sp-contributions-uploads": "Barkerdışi",
        "sp-contributions-logs": "qeydi",
        "sp-contributions-talk": "werênayış",
-       "sp-contributions-userrights": "idareyê heqanê karberan",
+       "sp-contributions-userrights": "idareyê heqanê {{GENDER:$1|karberan}}",
        "sp-contributions-blocked-notice": "verniyê no/na karber/e geriyayo/a\nqê referansi qeydê vernigrewtışi cêr de eşkera biyo:",
        "sp-contributions-blocked-notice-anon": "Eno adresê IPi bloke biyo.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "sp-contributions-search": "Dekerdena cı geyrê",
        "ipblocklist-empty": "Listay kılit kerdışi venga.",
        "ipblocklist-no-results": "Adresa IPya waştiye ya zi nameyê karberi kılit nêbiyo.",
        "blocklink": "kılit ke",
-       "unblocklink": "blokey wedare",
-       "change-blocklink": "kılit kerdışi bıvurne",
+       "unblocklink": "kılitkerdışi wedare",
+       "change-blocklink": "kılitkerdışi bıvurne",
        "contribslink": "iştıraki",
        "emaillink": "e-poste bırışe",
        "autoblocker": "Şıma otomatikmen kılit biy, çıke adresa şımaya ''IP''y terefê \"[[User:$1|$1]]\" gureniyena.\nSebebê kılitbiyayışê $1'i \"$2\"o",
        "feedback-bugnew": "Mı kontrol kı. Xetay newi xeber kı.",
        "feedback-bugornote": "Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da \"[ $3  $2 ]\", namey karber dê xoya piya u wasteriya karfiye.",
        "feedback-cancel": "Peyd kı",
-       "feedback-close": "Biya star",
+       "feedback-close": "Temam",
        "feedback-error1": "Xeta: APIi ra peyniyê nêşınasiyay",
        "feedback-error2": "Xeta: Timar kerdış nebı",
        "feedback-error3": "Xeta: API ra cewab çıno",
index 7a1cd1a..62d7d7b 100644 (file)
        "grant-delete": "Delete pages, revisions, and log entries",
        "grant-editinterface": "Edit the MediaWiki namespace and sitewide/user JSON",
        "grant-editmycssjs": "Edit your user CSS/JSON/JavaScript",
-       "grant-editmyoptions": "Edit your user preferences",
+       "grant-editmyoptions": "Edit your user preferences and JSON configuration",
        "grant-editmywatchlist": "Edit your watchlist",
        "grant-editsiteconfig": "Edit sitewide and user CSS/JS",
        "grant-editpage": "Edit existing pages",
index f53b037..4a5ad37 100644 (file)
        "istemplate": "inkludo",
        "isimage": "ligilo al dosiero",
        "whatlinkshere-prev": "{{PLURAL:$1|antaŭan|antaŭajn $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|postan|postajn $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|sekvan|sekvajn $1}}",
        "whatlinkshere-links": "← ligiloj",
        "whatlinkshere-hideredirs": "$1 alidirektilojn",
        "whatlinkshere-hidetrans": "$1 inkludojn",
index f9d98e2..1fecbd9 100644 (file)
                        "ديفيد",
                        "LittlePuppers",
                        "Theklan",
-                       "Laura Ospina"
+                       "Laura Ospina",
+                       "Pipino-pumuki"
                ]
        },
-       "tog-underline": "Subrayar los enlaces:",
+       "tog-underline": "Enlaces a subrayar:",
        "tog-hideminor": "Ocultar las ediciones menores en cambios recientes",
        "tog-hidepatrolled": "Ocultar las ediciones verificadas de cambios recientes",
        "tog-newpageshidepatrolled": "Ocultar, de la lista de páginas nuevas, las páginas verificadas",
index c2e7359..a4c57fb 100644 (file)
        "grant-delete": "Supprimer les pages, les révisions et les entrées du journal",
        "grant-editinterface": "Modifier l’espace de noms MediaWiki et le JSON du site/utilisateur",
        "grant-editmycssjs": "Modifier votre CSS/JSON/JavaScript utilisateur",
-       "grant-editmyoptions": "Modifier vos préférences utilisateur",
+       "grant-editmyoptions": "Modifier vos préférences utilisateur et votre configuration JSON",
        "grant-editmywatchlist": "Modifier votre liste de suivi",
        "grant-editsiteconfig": "Modifier les CSS/JS du site et ceux de l'utilisateur",
        "grant-editpage": "Modifier des pages existantes",
index e55e3b3..9a8cb35 100644 (file)
        "pageinfo-category-files": "Taal faan datein",
        "markaspatrolleddiff": "Üs kontroliaret kääntiakne",
        "markaspatrolledtext": "Sidj üs kontroliaret kääntiakne",
+       "markaspatrolledtext-file": "Detdiar dateiwerjuun üs kontroliaret kääntiakne",
        "markedaspatrolled": "Üs kontroliaret kääntiakne",
        "markedaspatrolledtext": "Detdiar werjuun faan [[:$1]] as üs kontroliaret kääntiakent wurden.",
        "rcpatroldisabled": "A leetst feranrangen kön ei kontroliaret wurd.",
index 7e4076c..0db0b31 100644 (file)
        "grant-delete": "מחיקת דפים, גרסאות ורשומות יומן",
        "grant-editinterface": "עריכת מרחב השם מדיה ויקי וקובצי JSON של האתר כולו ושל משתמשים",
        "grant-editmycssjs": "עריכת CSS/JSON/JavaScript שלך",
-       "grant-editmyoptions": "עריכת העדפות המשתמש שלך",
+       "grant-editmyoptions": "ער×\99×\9bת ×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש ×\95תצ×\95רת ×\94Ö¾JSON ×©×\9c×\9a",
        "grant-editmywatchlist": "עריכת רשימת המעקב שלך",
        "grant-editsiteconfig": "עריכת קובצי CSS/JS של האתר כולו ושל משתמשים",
        "grant-editpage": "עריכת דפים קיימים",
index 98cbf28..c1ec9bd 100644 (file)
        "limitreport-postexpandincludesize": "Uključena veličina nakon proširenja",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
        "limitreport-templateargumentsize": "Veličina argumenta predloška",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
        "limitreport-expansiondepth": "Najveća dubina proširenja",
        "limitreport-expensivefunctioncount": "Broj složenih funkcija raščlanjivača",
        "limitreport-unstrip-depth": "Dubina rekurzije unstrip",
        "limitreport-unstrip-size": "Veličina nakon proširenja unstrip",
+       "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
        "expandtemplates": "Prikaz sadržaja predložaka",
        "expand_templates_intro": "Ova posebna stranica omogućuje unos wikiteksta i prikazuje njegov rezultat,\nuključujući i (rekurzivno, tj. potpuno) sve uključene predloške u wikitekstu.\nPrikazuje i rezultate funkcija kao <nowiki>{{</nowiki>#language:...}} i varijabli\nkao <nowiki>{{</nowiki>CURRENTDAY}}. Funkcionira pozivanjem parsera same MedijeWiki.",
        "expand_templates_title": "Kontekstni naslov stranice, za {{FULLPAGENAME}} i sl.:",
index 20f510f..7a32ea2 100644 (file)
        "userlogin-createanother": "Másik felhasználói fiók létrehozása",
        "createacct-emailrequired": "E-mail-cím",
        "createacct-emailoptional": "E-mail-cím (opcionális)",
-       "createacct-email-ph": "Add meg e-mail címed",
+       "createacct-email-ph": "Add meg e-mail-címed",
        "createacct-another-email-ph": "Add meg az e-mail-címet",
        "createaccountmail": "Átmeneti, véletlenszerű jelszó beállítása és kiküldése a megadott e-mail-címre",
        "createaccountmail-help": "A jelszó megismerése nélkül készíthető valaki másnak fiók.",
        "move": "Átnevezés",
        "movethispage": "Nevezd át ezt a lapot",
        "unusedimagestext": "Az alábbi fájlokat nem használjuk egyetlen oldalon sem.\nVedd figyelembe, hogy más weboldalak közvetlenül hivatkozhatnak egy fájl URL-jére, ezért szerepelhet itt annak ellenére, hogy aktívan használják.",
+       "unusedimagestext-categorizedimgisused": "Az alábbi fájlok léteznek, de egyetlen lapon sincsenek beillesztve. A kategorizált fájlok használtként jelennek meg, még ha nincsenek is beillesztve.\n\nVedd figyelembe, hogy más weboldalak közvetlenül hivatkozhatnak egy fájl URL-jére, ezért szerepelhet itt annak ellenére, hogy aktívan használják.",
        "unusedcategoriestext": "A következő kategóriákban egyetlen szócikk, illetve alkategória sem szerepel.",
        "notargettitle": "Nincs cél",
        "notargettext": "Nem adtad meg annak a lapnak vagy szerkesztőnek a nevét, amin a műveletet végre akartad hajtani.",
index f1338df..7618bb1 100644 (file)
        "sp-contributions-logs": "registrari",
        "sp-contributions-talk": "diskutez",
        "sp-contributions-userrights": "yuri dil {{GENDER:$1|uzero}} pri administrado",
+       "sp-contributions-blocked-notice": "Ca uzero nun esas blokusata.\nVu povas vidar la lasta etiketo pri blokuso adinfre:",
        "sp-contributions-blocked-notice-anon": "Ica IP-adreso esas nune blokusita.\nLa maxim recenta etiketo pri blokuso esas videbla adinfre, por refero:",
        "sp-contributions-search": "Serchar kontributadi",
        "sp-contributions-username": "IP-adreso od uzantonomo:",
index 2260132..7c2ad50 100644 (file)
        "cannotchangeemail": "На ова вики не може да се менува е-пошта на сметките.",
        "emaildisabled": "Ова мреж. место не може да праќа е-пошта.",
        "accountcreated": "Корисничката сметка е направена",
-       "accountcreatedtext": "Корисничкта сметка за [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|разговор]]) е направена.",
+       "accountcreatedtext": "Корисничката сметка за [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|разговор]]) е направена.",
        "createaccount-title": "Создавање на сметка за {{SITENAME}}",
        "createaccount-text": "Некој направил сметка со вашата е-поштенска адреса на {{SITENAME}} ($4) со име „$2“ и  лозинка „$3“.\nБи требало сега да се пријавите и да ја промените вашата лозинка.\n\nМожете да ја занемарите оваа порака ако сметката била направена по грешка.",
        "login-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
index e2f48aa..130888a 100644 (file)
        "returnto": "$1 എന്ന താളിലേക്ക് മടങ്ങുക.",
        "tagline": "{{SITENAME}} സംരംഭത്തിൽ നിന്ന്",
        "help": "സഹായം",
+       "help-mediawiki": "മീഡിയവിക്കി സംബന്ധിച്ച സഹായം",
        "search": "തിരയൂ",
        "search-ignored-headings": " #<!-- ഈ വരി ഇതേ പോലെ വിടുക --> <pre>\n# തിരച്ചിലിൽ അവഗണിക്കപ്പെടുന്ന തലക്കെട്ടുകൾ.\n# താളിന്റെ തലക്കെട്ടുകളുടെ സൂചികവത്കരണം നടന്നാലുടൻ ഇവിടെ വരുത്തുന്ന മാറ്റങ്ങൾ ഫലത്തിൽ വരുന്നതാണ്.\n# ശൂന്യമായ തിരുത്ത് ചെയ്ത് താൾ വീണ്ടും സൂചികാവത്കരിക്കാവുന്നതാണ്.\n# എഴുത്തുരീതി ഇനി കൊടുക്കുന്നു:\n#   * \"#\" അക്ഷരത്തിൽ തുടങ്ങി വരിയുടെ അവസാനം വരെയുള്ള എന്തും സൂചനാക്കുറിപ്പ് ആയിരിക്കും.\n#   * ശൂന്യമല്ലാത്ത ഓരോ വരിയും അക്ഷരവ്യത്യാസമില്ലാതെ അവഗണിക്കപ്പെടാനുള്ള തലക്കെട്ടായിരിക്കും\nഅവലംബം\nപുറത്തേക്കുള്ള കണ്ണികൾ\nഇതും കാണുക\n #</pre> <!-- ഈ വരി ഇതേ പോലെ വിടുക-->",
        "searchbutton": "തിരയൂ",
        "badarticleerror": "താങ്കൾ ചെയ്യാനുദ്ദേശിക്കുന്നത് ഈ താളിൽ സാദ്ധ്യമല്ല",
        "cannotdelete": "\"$1\" എന്ന താൾ അഥവാ പ്രമാണം നീക്കം ചെയ്യാൻ കഴിഞ്ഞില്ല.\nഅതു മിക്കവാറും മറ്റാരെങ്കിലും നീക്കം ചെയ്തിട്ടുണ്ടാവാം.",
        "cannotdelete-title": "\"$1\" എന്ന താൾ മായ്ക്കാൻ കഴിയില്ല",
+       "delete-scheduled": "\"$1\" താൾ മായ്ക്കാൻ നിശ്ചയിച്ചിരിക്കുന്നു.\nദയവായി കാത്തിരിക്കുക.",
        "delete-hook-aborted": "മായ്ക്കൽ കൊളുത്തിനാൽ റദ്ദാക്കിയിരിക്കുന്നു.\nവിശദീകരണമൊന്നും നൽകിയിട്ടില്ല.",
        "no-null-revision": "\"$1\" എന്ന താളിന് പുതിയ ശൂന്യമായ മാറ്റമുള്ള നാൾപ്പതിപ്പ് സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല",
        "badtitle": "അസാധുവായ തലക്കെട്ട്",
        "cascadeprotected": "\"നിർഝരിത\" (cascading) സൗകര്യം ഉപയോഗിച്ച് തിരുത്തൽ നടത്തുന്നതിനു സം‌രക്ഷണം ഏർപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|താഴെ കൊടുത്തിട്ടുള്ള താളിന്റെ|താഴെ കൊടുത്തിട്ടുള്ള താളുകളുടെ}} ഭാഗമാണ്‌ ഈ താൾ. അതിനാൽ ഈ താൾ തിരുത്താൻ സാധിക്കില്ല:\n$2",
        "namespaceprotected": "'''$1''' നാമമേഖലയിലുള്ള താളുകൾ തിരുത്താൻ താങ്കൾക്ക് അനുവാദമില്ല.",
        "customcssprotected": "ഈ സി.എസ്.എസ്. താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.",
+       "customjsonprotected": "ഈ ജെസൺ താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.",
        "customjsprotected": "ഈ ജാവാസ്ക്രിപ്റ്റ് താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.",
+       "sitecssprotected": "എല്ലാ സന്ദർശകരേയും ബാധിക്കാനിടയുള്ളതിനാൽ ഈ സി.എസ്.എസ്. താൾ തിരുത്താൻ താങ്കൾക്ക് അനുമതി ഇല്ല.",
+       "sitejsonprotected": "എല്ലാ സന്ദർശകരേയും ബാധിക്കാനിടയുള്ളതിനാൽ ഈ ജെസൺ താൾ തിരുത്താൻ താങ്കൾക്ക് അനുമതി ഇല്ല.",
+       "sitejsprotected": "എല്ലാ സന്ദർശകരേയും ബാധിക്കാനിടയുള്ളതിനാൽ ഈ ജാവാസ്ക്രിപ്റ്റ് താൾ തിരുത്താൻ താങ്കൾക്ക് അനുമതി ഇല്ല.",
        "mycustomcssprotected": "ഈ സി.എസ്.എസ്.  താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്കില്ല.",
+       "mycustomjsonprotected": "ഈ ജെസൺ താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്കില്ല.",
        "mycustomjsprotected": "ഈ ജാവാസ്ക്രിപ്റ്റ് താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്കില്ല.",
        "myprivateinfoprotected": "താങ്കൾക്ക് സ്വന്തം സ്വകാര്യവിവരങ്ങൾ തിരുത്താനുള്ള അനുമതിയില്ല.",
        "mypreferencesprotected": "താങ്കൾക്ക് സ്വന്തം ക്രമീകരണങ്ങൾ തിരുത്താനുള്ള അനുമതിയില്ല.",
        "passwordtooshort": "രഹസ്യവാക്കിൽ കുറഞ്ഞതു {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} ഉണ്ടായിരിക്കണം.",
        "passwordtoolong": "രഹസ്യവാക്കിൽ പരമാവധി {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} മാത്രമേ പാടുള്ളു.",
        "passwordtoopopular": "പരക്കെ ഉപയോഗിക്കുന്ന രഹസ്യവാക്കുകൾ ഉപയോഗിക്കരുത്. ദയവായി ഊഹിച്ചെടുക്കാൻ ബുദ്ധിമുട്ടുള്ള രഹസ്യവാക്ക് തിരഞ്ഞെടുക്കുക.",
+       "passwordinlargeblacklist": "വളരെ സാധാരണമായി ഉപയോഗിക്കപ്പെടുന്ന രഹസ്യവാക്കുകളുടെ പട്ടികയിൽ പെട്ട രഹസ്യവാക്കാണ് നൽകിയത്. ദയവായി ഒരു അനന്യമായ രഹസ്യവാക്ക് തിരഞ്ഞെടുക്കുക.",
        "password-name-match": "താങ്കളുടെ രഹസ്യവാക്ക് ഉപയോക്തൃനാമത്തിൽ നിന്നും വ്യത്യസ്തമായിരിക്കണം.",
        "password-login-forbidden": "ഈ ഉപയോക്തൃനാമത്തിന്റെയും രഹസ്യവാക്കിന്റെയും ഉപയോഗം നിരോധിച്ചിരിക്കുന്നു.",
        "mailmypassword": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക",
        "changepassword-throttled": "കുറഞ്ഞ സമയത്തിനുള്ളിൽ താങ്കൾ നിരവധി തവണ പ്രവേശിക്കാൻ ശ്രമിച്ചിരിക്കുന്നു.\nവീണ്ടും ശ്രമിക്കുന്നതിനു മുമ്പ് ദയവായി $1 കാത്തിരിക്കുക.",
        "botpasswords": "യന്ത്രത്തിനുള്ള രഹസ്യവാക്കുകൾ",
        "botpasswords-disabled": "യാന്ത്രിക രഹസ്യവാക്കുകൾ അനുവദനീയമല്ല.",
+       "botpasswords-label-needsreset": "(രഹസ്യവാക്ക് പുനഃസജ്ജീകരിക്കേണ്ടതുണ്ട്)",
        "botpasswords-label-appid": "യന്ത്രത്തിന്റെ പേര്:",
        "botpasswords-label-create": "സൃഷ്ടിക്കുക",
        "botpasswords-label-update": "പുതുക്കുക",
        "passwordreset-emailsentemail": "താങ്കളുടെ അംഗത്വത്തിന് നൽകിയിട്ടുള്ള ഇമെയിൽ വിലാസം ഇതാണെങ്കിൽ,  രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
        "passwordreset-emailsentusername": "ഈ ഉപയോക്തൃനാമത്തിന് ഒരു ഇമെയിൽ വിലാസം ചേർത്തിട്ടുണ്ടെങ്കിൽ,  രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
        "passwordreset-invalidemail": "അസാധുവായ ഇമെയിൽ വിലാസം",
+       "passwordreset-nodata": "ഉപയോക്തൃനാമമോ ഇമെയിൽ വിലാസമോ നൽകിയിട്ടില്ല",
        "changeemail": "ഇമെയിൽ വിലാസം മാറ്റുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
        "changeemail-header": "താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്താൻ ഈ ഫോം പൂരിപ്പിച്ചു നൽകുക.താങ്കളുടെ അംഗത്വവുമായി ഏതെങ്കിലുമൊരു ഇമെയിൽ വിലാസത്തിനുള്ള ബന്ധം ഒഴിവാക്കാൻ ഫോം പൂരിപ്പിക്കുമ്പോൾ പുതിയ ഇമെയിൽ വിലാസത്തിനുള്ള ഭാഗം ഒഴിച്ചിടുക.",
        "changeemail-no-info": "ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.",
        "subject-preview": "വിഷയം എങ്ങനെയുണ്ടെന്ന് കാണുക:",
        "previewerrortext": "താങ്കളുടെ മാറ്റങ്ങൾ എങ്ങനെയുണ്ടെന്ന് കാണാൻ ശ്രമിച്ചപ്പോൾ പിഴവുണ്ടായി.",
        "blockedtitle": "ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു",
+       "blocked-email-user": "<strong>ഇമെയിൽ അയക്കുന്നതിൽ നിന്നും താങ്കളുടെ ഉപയോക്തൃനാമത്തെ തടഞ്ഞിരിക്കുന്നു. ഈ വിക്കിയിലെ മറ്റ് താളുകൾ താങ്കൾക്ക് തിരുത്താവുന്നതാണ്.</strong> [[Special:MyContributions|അംഗത്വത്തിന്റെ സംഭാവനകളിൽ]] ഈ തടയലിന്റെ പൂർണ്ണവിവരങ്ങൾ താങ്കൾക്ക് കാണാവുന്നതാണ്.\n\nതടയൽ നടപ്പിലാക്കിയത് $1 ആണ്.\n\nനൽകിയിട്ടുള്ള കാരണം <em>$2</em> എന്നാണ്.\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ അവസാനിക്കുന്നത്: $6\n* തടയാൻ ഉദ്ദേശിച്ചത്: $7\n* തടയൽ ഐ.ഡി. #$5",
+       "blockedtext-partial": "<strong>താങ്കളുടെ ഉപയോക്തൃനാമത്തെ അല്ലെങ്കിൽ ഐ.പി. വിലാസത്തെ ഈ താളിൽ മാറ്റങ്ങൾ വരുത്തുന്നതിൽ നിന്നും തടഞ്ഞിരിക്കുന്നു. ഈ വിക്കിയിലെ മറ്റ് താളുകൾ താങ്കൾക്ക് തിരുത്താവുന്നതാണ്.</strong> [[Special:MyContributions|അംഗത്വത്തിന്റെ സംഭാവനകളിൽ]] ഈ തടയലിന്റെ പൂർണ്ണവിവരങ്ങൾ താങ്കൾക്ക് കാണാവുന്നതാണ്.\n\nതടയൽ നടപ്പിലാക്കിയത് $1 ആണ്.\n\nനൽകിയിട്ടുള്ള കാരണം <em>$2</em> എന്നാണ്.\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ അവസാനിക്കുന്നത്: $6\n* തടയാൻ ഉദ്ദേശിച്ചത്: $7\n* തടയൽ ഐ.ഡി. #$5",
        "blockedtext": "<strong>താങ്കളുടെ ഉപയോക്തൃനാമത്തേയോ താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തിട്ടുള്ള ഐ.പി. വിലാസത്തേയോ ഈ വിക്കി തിരുത്തുന്നതിൽ നിന്നു തടഞ്ഞിരിക്കുന്നു</strong>\n\n$1 ആണ് ഈ തടയൽ നടത്തിയത്. <em>$2</em> എന്നതാണു് അതിനു രേഖപ്പെടുത്തിയിട്ടുള്ള കാരണം.\n\n* തടയലിന്റെ തുടക്കം: $8\n* തടയലിന്റെ കാലാവധി: $6\n* തടയപ്പെട്ട ഉപയോക്താവ്: $7\n\nഈ തടയലിനെ പറ്റി ചർച്ച ചെയ്യാൻ താങ്കൾക്ക് $1 എന്ന ഉപയോക്താവിനേയോ മറ്റ് [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] സമീപിക്കാവുന്നതാണ്. [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] താങ്കൾ സാധുവായ ഇമെയിൽ വിലാസം കൊടുത്തിട്ടുണ്ടെങ്കിൽ, അതു അയക്കുന്നതിൽ നിന്നു താങ്കൾ തടയപ്പെട്ടിട്ടില്ലെങ്കിൽ, \"{{int:emailuser}}\" എന്ന സം‌വിധാനം ഉപയോഗിച്ച് താങ്കൾക്ക് മറ്റുപയോക്താക്കളുമായി ബന്ധപ്പെടാം. താങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ഉം, താങ്കളുടെ തടയൽ ഐ.ഡി. #$5 ഉം ആണ്. ഇവ രണ്ടും താങ്കൾ കാര്യനിർവാഹകനെ ബന്ധപ്പെടുമ്പോൾ ചേർക്കുക.",
        "autoblockedtext": "താങ്കളുടെ ഐ.പി. വിലാസം സ്വയം തടയപ്പെട്ടിരിക്കുന്നു, മറ്റൊരു ഉപയോക്താവ് ഉപയോഗിച്ച കാരണത്താൽ $1 എന്ന കാര്യനിർവാഹകനാണ് തടഞ്ഞുവെച്ചത്.\nഇതിനു കാരണമായി നൽകിയിട്ടുള്ളത്:\n\n:<em>$2</em>\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ അവസാനിക്കുന്നത്: $6\n* തടയാൻ ഉദ്ദേശിച്ചത്: $7\n\nഈ തടയലിനെ കുറിച്ച് ചർച്ച ചെയ്യാൻ താങ്കൾക്കു $1 എന്ന കാര്യനിവാഹകനേയോ മറ്റു [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] ബന്ധപ്പെടാവുന്നതാണ്.\n\nശ്രദ്ധിക്കുക [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] സാധുവായ ഇമെയിൽ വിലാസം രേഖപ്പെടുത്താതിരിക്കുകയോ, അത് ഉപയോഗിക്കുന്നതിൽ നിന്ന് താങ്കളെ തടയുകയോ ചെയ്തിട്ടുണ്ടെങ്കിൽ \"{{int:emailuser}}\" എന്ന സം‌വിധാനം പ്രവർത്തന രഹിതമായിരിക്കും.\n\nതാങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ആണ്, താങ്കളുടെ തടയലിന്റെ ഐ.ഡി. #$5 ആകുന്നു.\nദയവായി മുകളിൽ കൊടുത്തിരിക്കുന്ന വിവരങ്ങളെല്ലാം താങ്കൾ നടത്തുന്ന അന്വേഷണങ്ങളിൽ ഉൾപ്പെടുത്തുവാൻ ശ്രദ്ധിക്കുക.",
        "systemblockedtext": "താങ്കളുടെ ഉപയോക്തൃനാമം അല്ലെങ്കിൽ ഐ.പി. വിലാസം മീഡിയവിക്കി സ്വയം തടഞ്ഞിരിക്കുന്നു.\nതടയാനുള്ള കാരണം:\n\n:<em>$2</em>\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ കാലഹരണപ്പെടുന്നത്: $6\n* തടയാനുദ്ദേശിച്ചയാൾ: $7\n\nതാങ്കളുടെ നിലവിലെ ഐ.പി. വിലാസം $3 ആണ്.\nതാങ്കൾക്കെന്തെങ്കിലും ചോദ്യങ്ങളുണ്ടെങ്കിൽ മുകളിലെ എല്ലാ വിവരങ്ങളും ഉൾപ്പെടുത്തുക.",
        "editpage-invalidcontentmodel-title": "ഉള്ളടക്ക രീതി പിന്തുണയ്ക്കുന്നില്ല",
        "editpage-notsupportedcontentformat-title": "ഉള്ളടക്ക ഫോർമാറ്റ് പിന്തുണയ്ക്കുന്നില്ല",
        "editpage-notsupportedcontentformat-text": "ഉള്ളടക്കത്തിന്റെ ഫോർമാറ്റ് ആയ $1 ഉള്ളടക്ക രീതിയായ $2 പിന്തുണയ്ക്കുന്നില്ല.",
+       "slot-name-main": "മുഖ്യം",
        "content-model-wikitext": "വിക്കിഎഴുത്ത്",
        "content-model-text": "വെറും എഴുത്ത്",
        "content-model-javascript": "ജാവാസ്ക്രിപ്റ്റ്",
        "timezonelegend": "സമയ മേഖല:",
        "localtime": "പ്രാദേശിക സമയം:",
        "timezoneuseserverdefault": "വിക്കിയിൽ സ്വതേയുള്ളത് ഉപയോഗിക്കുക ($1)",
-       "timezoneuseoffset": "മറ്റുള്ളത് (എന്താണെന്നു നൽകുക)",
+       "timezoneuseoffset": "മറ്റുള്ളവ (എന്താണ് വ്യത്യാസമെന്ന് നൽകുക)",
+       "timezone-useoffset-placeholder": "ഉദാഹരണമായിട്ടുള്ള വിലകൾ: \"-07:00\" അല്ലെങ്കിൽ \"01:00\"",
        "servertime": "സെർവർ സമയം:",
        "guesstimezone": "സമയവ്യത്യാസം ബ്രൗസറിൽ നിന്നും ശേഖരിക്കൂ",
        "timezoneregion-africa": "ആഫ്രിക്ക",
        "grant-group-high-volume": "ഉയർന്ന തോതിലുള്ള പ്രവൃത്തികൾ നടത്തുക",
        "grant-group-customization": "ഇച്ഛാനുസരണമാക്കലുകളും ക്രമീകരണങ്ങളും",
        "grant-group-administration": "കാര്യനിർവ്വാഹക ജോലികൾ നടത്തുക",
+       "grant-group-private-information": "താങ്കളെക്കുറിച്ചുള്ള സ്വകാര്യവിവരങ്ങൾ എടുക്കുന്നു",
        "grant-group-other": "വിവിധ പ്രവൃത്തികൾ",
        "grant-blockusers": "ഉപയോക്താക്കളെ തടയുക, തടയൽ നീക്കുക",
        "grant-createaccount": "അംഗത്വങ്ങൾ സൃഷ്ടിക്കുക",
        "rcfilters-watchlist-edit-watchlist-button": "താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക തിരുത്തുക",
        "rcfilters-watchlist-showupdated": "മാറ്റങ്ങൾ ഉണ്ടായ ശേഷം താങ്കൾ സന്ദർശിക്കാത്ത താളുകളിലെ മാറ്റങ്ങൾ, തളിക അടയാളത്തോടൊപ്പം <strong>കടുപ്പിച്ച്</strong> കാണിച്ചിരിക്കുന്നു.",
        "rcfilters-preference-label": "ജാവാസ്ക്രിപ്റ്റ്-രഹിത സമ്പർക്കമുഖം ഉപയോഗിക്കുക",
-       "rcfilters-preference-help": "à´\85à´°à´¿à´ªàµ\8dà´ªà´\95à´³ും പ്രമുഖമാക്കിക്കാട്ടൽ സൗകര്യവും ഇല്ലാതെ സമീപകാലമാറ്റങ്ങൾ എടുക്കുക",
+       "rcfilters-preference-help": "à´\85à´°à´¿à´ªàµ\8dà´ªà´\95ൾ à´¤à´¿à´°à´¯à´²ും പ്രമുഖമാക്കിക്കാട്ടൽ സൗകര്യവും ഇല്ലാതെ സമീപകാലമാറ്റങ്ങൾ എടുക്കുക",
        "rcfilters-watchlist-preference-label": "ജാവാസ്ക്രിപ്റ്റ്-രഹിത സമ്പർക്കമുഖം ഉപയോഗിക്കുക",
-       "rcfilters-watchlist-preference-help": "à´\85à´°à´¿à´ªàµ\8dà´ªà´\95à´³ും പ്രമുഖമാക്കിക്കാട്ടൽ സൗകര്യവും ഇല്ലാതെ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക എടുക്കുക.",
+       "rcfilters-watchlist-preference-help": "à´\85à´°à´¿à´ªàµ\8dà´ªà´\95ൾ à´¤à´¿à´°à´¯à´²ും പ്രമുഖമാക്കിക്കാട്ടൽ സൗകര്യവും ഇല്ലാതെ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക എടുക്കുക.",
        "rcfilters-filter-showlinkedfrom-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
        "rcfilters-filter-showlinkedfrom-option-label": "തിരഞ്ഞെടുത്ത താളിൽ <strong>കണ്ണി ചേർക്കപ്പെട്ട താളുകൾ</strong>",
        "rcfilters-filter-showlinkedto-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
        "protectedtitles-submit": "തലക്കെട്ടുകൾ പ്രദർശിപ്പിക്കുക",
        "listusers": "ഉപയോക്താക്കളുടെ പട്ടിക",
        "listusers-editsonly": "തിരുത്തുകൾ ചെയ്തിട്ടുള്ള ഉപയോക്താക്കളെ മാത്രം കാണിക്കുക",
+       "listusers-temporarygroupsonly": "താത്കാലിക ഉപയോക്തൃസംഘങ്ങളിലുള്ള ഉപയോക്താക്കളെ മാത്രം പ്രദർശിപ്പിക്കുക",
        "listusers-creationsort": "സൃഷ്ടിക്കപ്പെട്ട തീയതി അനുസരിച്ച് ക്രമീകരിക്കുക",
        "listusers-desc": "അവരോഹണക്രമത്തിൽ ആക്കുക",
        "usereditcount": "{{PLURAL:$1|ഒരു തിരുത്തൽ|$1 തിരുത്തലുകൾ}}",
        "listgrouprights-namespaceprotection-namespace": "നാമമേഖല",
        "listgrouprights-namespaceprotection-restrictedto": "ഉപയോക്താവിന് ഉപയോഗിക്കാവുന്ന അവകാശം (അവകാശങ്ങൾ)",
        "listgrants": "അനുമതികൾ",
+       "listgrants-summary": "ഉപയോക്തൃ അവകാശങ്ങളുമായി ബന്ധപ്പെടുത്തിയുള്ള അനുമതികളുടെ പട്ടികയാണ് ഇനിക്കൊടുക്കുന്നത്. ഉപയോക്താക്കൾക്ക് ലഭ്യമായ അനുമതികൾ വീണ്ടും പരിമിതപ്പെടുത്തി, തങ്ങൾക്ക് വേണ്ടി ആപ്ലിക്കേഷനുകൾ പ്രവർത്തിപ്പിക്കാൻ ഉപയോക്താക്കൾക്ക് കഴിയുന്നതാണ്. ഒരു ഉപയോക്താവിന് വേണ്ടി പ്രവർത്തിക്കുന്ന ആപ്ലിക്കേഷന് ഉപയോക്താവിന് ലഭ്യമല്ലാത്ത ഒരു ഉപയോക്തൃ അവകാശം ഉപയോഗിക്കാൻ കഴിയുന്നതല്ല.\nവ്യക്തിഗത അവകാശങ്ങളെ കുറിച്ച് [[{{MediaWiki:Listgrouprights-helppage}}|അധിക വിവരങ്ങൾ]] ലഭ്യമായേക്കാവുന്നതാണ്.",
        "listgrants-grant": "അനുമതി",
        "listgrants-rights": "അവകാശങ്ങൾ",
        "trackingcategories": "പിന്തുടരൽ വർഗ്ഗങ്ങൾ",
        "pageinfo-display-title": "പ്രദർശിപ്പിക്കേണ്ട തലക്കെട്ട്",
        "pageinfo-default-sort": "സ്വതേയുള്ള ക്രമപ്പെടുത്തൽ ചാവി",
        "pageinfo-length": "താളിന്റെ നീളം (ബൈറ്റിൽ)",
+       "pageinfo-namespace": "നാമമേഖല",
        "pageinfo-article-id": "താളിന്റെ ഐ.ഡി.",
        "pageinfo-language": "താളിന്റെ ഉള്ളടക്കത്തിന്റെ ഭാഷ",
        "pageinfo-language-change": "മാറ്റുക",
        "version-specialpages": "പ്രത്യേക താളുകൾ",
        "version-parserhooks": "പാഴ്‌സർ കൊളുത്തുകൾ",
        "version-variables": "ചരങ്ങൾ",
+       "version-editors": "എഡിറ്റർമാർ",
        "version-antispam": "പാഴെഴുത്ത് തടയൽ",
        "version-other": "മറ്റുള്ളവ",
        "version-mediahandlers": "മീഡിയ കൈകാര്യോപകരണങ്ങൾ",
        "redirect-file": "പ്രമാണത്തിന്റെ പേര്",
        "redirect-logid": "രേഖയുടെ ഐ.ഡി.",
        "redirect-not-exists": "വില കണ്ടെത്താൻ കഴിഞ്ഞില്ല",
+       "redirect-not-numeric": "വില അക്കത്തിലല്ല",
        "fileduplicatesearch": "ഒരേ പ്രമാണത്തിന്റെ പലപകർപ്പുകളുണ്ടോയെന്നു തിരയുക",
        "fileduplicatesearch-summary": "ഒരേ പ്രമാണം തന്നെ വിവിധ പേരിലുണ്ടോയെന്നു ഹാഷ് വാല്യൂവധിഷ്ഠിതമായി തിരയുക.",
        "fileduplicatesearch-filename": "പ്രമാണത്തിന്റെ പേര്:",
        "log-action-filter-delete": "മായ്ക്കലിന്റെ തരം:",
        "log-action-filter-import": "ഇറക്കുമതിയുടെ തരം:",
        "log-action-filter-move": "മാറ്റലിന്റെ തരം:",
+       "log-action-filter-newusers": "അംഗത്വസൃഷ്ടിയുടെ തരം:",
+       "log-action-filter-patrol": "റോന്തുചുറ്റലിന്റെ തരം:",
+       "log-action-filter-protect": "സംരക്ഷണത്തിന്റെ തരം:",
+       "log-action-filter-rights": "അവകാശമാറ്റത്തിന്റെ തരം:",
+       "log-action-filter-suppress": "ഒതുക്കലിന്റെ തരം:",
+       "log-action-filter-upload": "അപ്‌ലോഡിന്റെ തരം:",
        "log-action-filter-all": "എല്ലാം",
        "log-action-filter-block-block": "തടയൽ",
        "log-action-filter-block-reblock": "തടയലിൽ വരുത്തുന്ന മാറ്റം",
        "log-action-filter-delete-revision": "നാൾപ്പതിപ്പ് മായ്ക്കൽ",
        "log-action-filter-import-interwiki": "ട്രാൻസ്‌‌വിക്കി ഇറക്കുമതി",
        "log-action-filter-import-upload": "എക്സ്.എം.എൽ. അപ്‌ലോഡ് വഴിയുള്ള ഇറക്കുമതി",
+       "log-action-filter-managetags-create": "ടാഗ് സൃഷ്ടി",
        "log-action-filter-protect-protect": "സംരക്ഷണം",
        "log-action-filter-protect-unprotect": "സംരക്ഷണമൊഴിവാക്കൽ",
        "log-action-filter-protect-move_prot": "സംരക്ഷണം മാറ്റി",
index b2c1a4e..a9fcce4 100644 (file)
        "login": "सनोंद-प्रवेश(लॉग-ईन)",
        "login-security": "तुमची ओळख पटवा",
        "nav-login-createaccount": "सनोंद-प्रवेश / सदस्यखाते उघडा",
-       "logout": "सनà¥\8bà¤\82द-निरà¥\8dà¤\97म",
-       "userlogout": "सनà¥\8bà¤\82द-निरà¥\8dà¤\97म",
+       "logout": "बाहà¥\87र à¤ªà¤¡à¤¾",
+       "userlogout": "बाहà¥\87र à¤ªà¤¡à¤¾",
        "notloggedin": "आपण सनोंद-प्रवेशित नाहीत",
        "userlogin-noaccount": "आपले खाते नाही?",
        "userlogin-joinproject": "{{SITENAME}}मध्ये सहभागी व्हा",
        "defaultmessagetext": "अविचल संदेश मजकूर",
        "content-failed-to-parse": "$2 चा आशय(कंटेंट) $1 साठी पार्स करण्यात असफलता - नमुना: $3",
        "invalid-content-data": "अवैध माहिती",
-       "content-not-allowed-here": "\"$1\" हा आशय [[:$2]] लेखावर टाकण्याची अनुमती नाही.",
+       "content-not-allowed-here": "\"$1\" हा आशय [[:$2]] लेखावर \"$3\" मध्ये  टाकण्याची अनुमती नाही.",
        "editwarning-warning": "या पानावरुन दुसर्‍या पानावर गेल्यास, तुम्ही येथे केलेले बदल जतन होणार नाहीत.\nजर आपण सनोंद-प्रवेशित असाल तर, ही सूचना घालवण्यासाठी ''{{int:prefs-editing}}'' मधील संपादनपसंतीत बदल करा.",
        "editpage-invalidcontentmodel-title": "आशय प्रारुप सहाय्यीकृत नाही",
        "editpage-invalidcontentmodel-text": "आशय प्रारुप \"$1\" हे सहाय्यीकृत नाही.",
        "pageinfo-display-title": "दृश्य शीर्षक",
        "pageinfo-default-sort": "डिफॉल्ट निवड-कळ (सॉर्ट कि)",
        "pageinfo-length": "पानाचा आकार (बाइट्समध्ये)",
+       "pageinfo-namespace": "नामविश्व",
        "pageinfo-article-id": "पृष्ठ-ओळखण",
        "pageinfo-language": "पान-आशय भाषा",
        "pageinfo-language-change": "बदल",
        "log-action-filter-suppress-revision": "आवृत्ती दडपणे",
        "log-action-filter-suppress-delete": "पान दडपणे",
        "log-action-filter-suppress-block": "रोधामार्फत सदस्य दाबणे",
+       "authmanager-provider-password": "परवलीच्या शब्दाधारीत (पासवर्ड) अधिप्रमाणन",
        "changecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) बदला",
        "changecredentials-submit": "अधिकारपत्रे (क्रेडेंटियल्स) बदला",
        "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा",
        "removecredentials-submit": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा",
+       "credentialsform-provider": "अधिकारपत्राचा प्रकार:",
+       "credentialsform-account": "खात्याचे नाव:",
        "edit-error-short": "त्रुटी: $1",
        "edit-error-long": "त्रुट्या:\n\n$1",
        "revid": "आवृत्ती $1",
+       "gotointerwiki-invalid": "नमूद केलेले शीर्षक अवैध आहे.",
        "passwordpolicies": "परवलीच्या शब्दांची नीती",
        "passwordpolicies-summary": "ही, या विकिवरील व्याख्यिकृत सदस्य गटांसाठी असलेली व सध्या प्रभावात असलेल्या परवलीच्या शब्दांच्या नीतींची यादी आहे.",
        "passwordpolicies-group": "गट",
        "passwordpolicies-policy-passwordcannotmatchusername": "परवलीचा शब्द हा सदस्यनाव असू शकत नाही",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "परवलीच्या शब्दाचे,विशिष्ट काळ्या यादीत टाकलेल्या परवलीच्या शब्दाशी अनुरूपन (मॅच) असू शकत नाही.",
        "passwordpolicies-policy-maximalpasswordlength": "परवलीचा शब्द हा $1 {{PLURAL:$1|अक्षरापेक्षा|अक्षरांपेक्षा}} कमी लांबीचा हवा",
-       "passwordpolicies-policy-passwordcannotbepopular": "परवलीचा शब्द हा {{PLURAL:$1|the popular password|$1 प्रसिद्ध शब्दांच्या यादीतील असू शकत नाही}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "परवलीचा शब्द हा {{PLURAL:$1|the popular password|$1 प्रसिद्ध शब्दांच्या यादीतील असू शकत नाही}}",
+       "passwordpolicies-policy-passwordnotinlargeblacklist": "परवलीचा शब्द हा १,००,००० सामान्यरित्या वापरण्यात येणाऱ्या परवलीच्या शब्दांच्या यादीत नको."
 }
index 2fdd407..4397bef 100644 (file)
        "nstab-project": "Проектэнь лопа",
        "nstab-image": "Файла",
        "nstab-mediawiki": "Сёрмине",
-       "nstab-template": "Лопа парцун",
+       "nstab-template": "Лопапарцун",
        "nstab-help": "Лезкс лопа",
        "nstab-category": "Категория",
        "mainpage-nstab": "Прявтлопа",
        "copyrightwarning": "Инескеть кирдть мельсэ {{SITENAME}}-сэ весе путовкстнэнь, лововить нолдазекс ало $2  конёвонть коряс (вант $1 педе пес). Арась мелеть витневтемс-петневтемс сёрмадовксот педе пес, иляк сестэ путо сонзэ тезэнь.<br />\nИстяжо тезэнь материалонь максомсот, кемекстат тон тонсь сёрмадык сонзэ, али саик сонзэ вейсэнь ёнксто али олячинь порталсто.\n'''ИЛЯ МАКСО ВАНСТОНЬ ВИДЕЧИСЭ ЛОМАНЕНЬ ВАЖОДЕМАНТЬ АПАК КЕВКСТНЕ!'''",
        "titleprotectedwarning": "'''ВАНОК:  Те лопась пекстазь, сонзэ шкамга-теемга эрявить [[Special:ListGroupRights|башка видечить]].'''\nЖурналонь меельце сёрмадовксось максозь ало, эрявиндеряй сонзэ ваномс.",
        "templatesused": "Те лопасонть тевс нолдазь {{PLURAL:$1|лопапарцун|лопапарцунт}}:",
-       "templatesusedpreview": "Те икелькс вановкссонть тевс нолдазь  {{PLURAL:$1|лопа парцун|лопа парцунт}}:",
+       "templatesusedpreview": "Те икелькс вановкссонть тевс нолдазь  {{PLURAL:$1|лопапарцун|лопапарцунт}}:",
        "templatesusedsection": "Те пелькссэнть тевс нолдазь {{PLURAL:$1|лопа парцунось|лопа парцунтнэ}}:",
        "template-protected": "(ванстозь)",
        "template-semiprotected": "(пельс ванстозь)",
        "action-sendemail": "кучомс е-сёрмат",
        "nchanges": "$1 {{PLURAL:$1|полавтнема|полавтнемат}}",
        "enhancedrc-history": "путовксонзо-юронзо",
-       "recentchanges": "Чияконь полавтнемат-лиякстомтомат",
+       "recentchanges": "Чиень полавтнемат-лиякстомтомат",
        "recentchanges-legend": "Улконь полавтнематнень аравтнемаст",
        "recentchanges-summary": "",
        "recentchanges-feed-description": "Мельга ваннынк кода ульнесть витьнемат-петнемат wiki-сэ те максовксонть.",
        "tooltip-n-randompage": "Макста ловномс кодамо понгсь лопа",
        "tooltip-n-help": "Превс путыть косо.",
        "tooltip-t-whatlinkshere": "Викинь весе лопатне, конат тезэнь сюлмазь",
-       "tooltip-t-recentchangeslinked": "Чияконь полавтнемат сеть лопатнесэ, конат сюлмазь те лопанть марто",
+       "tooltip-t-recentchangeslinked": "Чиень полавтнемат сеть лопатнесэ, конат сюлмазь те лопанть марто",
        "tooltip-feed-rss": "\"RSS\" чидикерькске те лопантень",
        "tooltip-feed-atom": "Атом лезкс те лопантень",
        "tooltip-t-contributions": "Невтть мезе {{GENDER:$1|те теицясь}} полавтсь",
        "tooltip-ca-nstab-special": "Те башка тевень лопась, те лопанть а витнесак-петнесак",
        "tooltip-ca-nstab-project": "Ваннынк проетной лопанть",
        "tooltip-ca-nstab-image": "Ванык файлань лопанть",
-       "tooltip-ca-nstab-mediawiki": "Ваномс системань пачтямнэнть",
-       "tooltip-ca-nstab-template": "Ванномс лопа парцунонть",
+       "tooltip-ca-nstab-mediawiki": "Ваномс системань пачтямненть",
+       "tooltip-ca-nstab-template": "Ванномс лопапарцунонть",
        "tooltip-ca-nstab-help": "Ванномс лездамонь лопанть",
        "tooltip-ca-nstab-category": "Варштынк категориянь лопатьнень",
        "tooltip-minoredit": "Тешкстынк тень, сон вишкинесте витнезь-петнезь",
        "spambot_username": "MediaWiki-нь шукшто ванькскавтома",
        "pageinfo-header-basic": "Васень информациязо",
        "pageinfo-header-edits": "Витнемс-петнемс юронзо-путовксонзо",
+       "pageinfo-header-restrictions": "Лопанть ванстоманзо",
        "pageinfo-header-properties": "Лопанть уликсчинзэ",
        "pageinfo-display-title": "Коняксонть таргамс лангс",
+       "pageinfo-article-id": "Лопа ID",
+       "pageinfo-robot-index": "Маштови",
+       "pageinfo-few-watchers": "$1 эли седе ламо {{PLURAL:$1|ваныцянзо}} арасть",
        "pageinfo-subpages-name": "Те лопанть явкслопанзо",
+       "pageinfo-firstuser": "Лопанть шкицязо",
+       "pageinfo-firsttime": "Лопась шказель",
+       "pageinfo-lastuser": "Меельцеде витнизе-петнизе",
+       "pageinfo-lasttime": "Меельцеде витнезель-петнезель",
        "pageinfo-edits": "Зяроксть витнезь-петнезь",
        "pageinfo-authors": "Весемезэ зяро авторонзо",
        "pageinfo-toolboxlink": "Лопадо иформация",
+       "pageinfo-contentpage": "Текст марто лопакс ловови",
+       "pageinfo-contentpage-yes": "Истя",
        "markaspatrolleddiff": "Тешкстамс ванстнемань ютазекс",
        "markaspatrolledtext": "Тешкстамс те лопанть ванстнемань ютазекс",
        "markedaspatrolled": "Тешкстазь ванстнемань ютазекс",
        "htmlform-reset": "Саемс мекев полавтоматнень",
        "htmlform-selectorother-other": "Лия",
        "logentry-delete-delete": "$1 {{GENDER:$2|нардызе}} $3 лопанть",
+       "revdelete-content-hid": "текстэнзэ-фотокувонзо кекшезь",
        "logentry-move-move": "$1 {{GENDER:$2|печтявтызе}} $3 лопанть $4 лопакс",
        "logentry-newusers-create": "Совамо тарка $1 {{GENDER:$2|шказь}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ёвкстызе}} $3 файланть",
index e1c7db0..fc66784 100644 (file)
        "loginlanguagelabel": "Gí-giân: $1",
        "pt-login": "Teng-ji̍p",
        "pt-login-button": "Teng-ji̍p",
+       "pt-login-continue-button": "Kè-sio̍k teng-ji̍p",
        "pt-createaccount": "Khui sin kháu-chō",
        "pt-userlogout": "Teng-chhut",
        "user-mail-no-addy": "Siūⁿ beh kià tiān-chú-phoe, m̄-koh bô siá tē-chí.",
index 3d3386b..c541d98 100644 (file)
@@ -52,7 +52,8 @@
                        "Telaneo",
                        "Jon Harald Søby",
                        "Fitoschido",
-                       "Orf3us"
+                       "Orf3us",
+                       "Pyscowicz"
                ]
        },
        "tog-underline": "Strek under lenker:",
index e7e428b..1ede3d0 100644 (file)
        "expansion-depth-exceeded-warning": "De pagina bevat te veel sjablonen",
        "parser-unstrip-loop-warning": "Er is een \"unstrip\"-lus gedetecteerd",
        "unstrip-depth-warning": "De recursielimiet ($1) voor \"unstrip\" is overschreden",
-       "unstrip-depth-category": "Pagina's waar de \"unstrip\" dieptelimiet is overschreden.",
+       "unstrip-depth-category": "Pagina's waar de \"unstrip\"-dieptelimiet is overschreden",
        "unstrip-size-warning": "De groottelimiet ($1) voor \"unstrip\" is overschreden",
-       "unstrip-size-category": "Pagina's waar de \"unstrip\" groottelimiet is overschreden",
+       "unstrip-size-category": "Pagina's waar de \"unstrip\"-groottelimiet is overschreden",
        "converter-manual-rule-error": "Er is een fout gedetecteerd in een handmatig toegevoegde taalconversieregel.",
        "undo-success": "Deze bewerking kan ongedaan gemaakt worden.\nHieronder staat de tekst waarin de wijziging ongedaan is gemaakt.\nControleer voor het opslaan of het resultaat gewenst is.",
        "undo-failure": "De wijziging kan niet ongedaan gemaakt worden vanwege andere strijdige wijzigingen.",
        "limitreport-templateargumentsize-value": "$1 / $2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Hoogste uitbreidingsdiepte",
        "limitreport-expensivefunctioncount": "Aantal kostbare parserfuncties",
-       "limitreport-unstrip-depth": "\"Unstrip\" recursiediepte",
-       "limitreport-unstrip-size": "\"Unstrip\" grootte na uitbreiden",
+       "limitreport-unstrip-depth": "\"Unstrip\"-recursiediepte",
+       "limitreport-unstrip-size": "\"Unstrip\"-grootte na uitbreiden",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "expandtemplates": "Sjablonen substitueren",
        "expand_templates_intro": "Deze speciale pagina leest de opgegeven wikitekst in en substitueert recursief alle sjablonen in de wikitekst.\nHet substitueert ook alle parserfuncties zoals\n<code><nowiki>{{</nowiki>#language:…}}</code> en\nvariabelen als <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nVrijwel alles tussen dubbele accolades wordt gesubstitueerd.",
index eb8cdfa..e0cc820 100644 (file)
        "userlogout": "Logg ut",
        "notloggedin": "Ikkje innlogga",
        "userlogin-noaccount": "Har du ingen konto?",
-       "userlogin-joinproject": "Vert med på {{SITENAME}}",
+       "userlogin-joinproject": "Ta del i {{SITENAME}}",
        "createaccount": "Opprett ny konto",
        "userlogin-resetpassword-link": "Gløymt passordet ditt?",
        "userlogin-helplink2": "Hjelp med innlogging",
        "sp-contributions-newbies-title": "Brukarbidrag av nye brukarar",
        "sp-contributions-blocklog": "blokkeringslogg",
        "sp-contributions-deleted": "sletta brukarbidrag",
-       "sp-contributions-uploads": "opplastingar",
+       "sp-contributions-uploads": "opplastingar",
        "sp-contributions-logs": "loggar",
        "sp-contributions-talk": "diskusjon",
        "sp-contributions-userrights": "administrering av brukartilgang",
index b6ad377..cca7a8d 100644 (file)
        "search-error": "د لټون په وخت کې یوه تېروتنه رامنځته شوه: $1",
        "search-warning": "د لټون کولو په وخت کې یو خبرداری راغلی دی:$1",
        "preferences": "غوره توبونه",
-       "mypreferences": "غÙ\88رÙ\87 ØªÙ\88بÙ\88Ù\86Ù\87",
+       "mypreferences": "تÙ\86ظÙ\8aÙ\85ات",
        "prefs-edits": "د سمونو شمېر:",
        "prefsnologintext2": "د غوره توبونو بدلولو لپاره مو غونډال ته ننوځئ.",
        "prefs-skin": "پوښۍ",
        "rcfilters-other-review-tools": "د بیاکتنې نور وسايل",
        "rcfilters-group-results-by-page": "د ګروپ پایلې د پاڼې لخوا",
        "rcfilters-activefilters": "فعال فيلټرونه",
+       "rcfilters-activefilters-hide": "پټول",
+       "rcfilters-activefilters-show": "ښکاره کول",
        "rcfilters-advancedfilters": "پرمختللي فلټرونه",
        "rcfilters-limit-title": "د ښودلو لپاره بدلونونه",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|بدلونونه|$1 بدلونونه}}، $2",
        "createaccountblock": "په گڼون جوړولو بنديز لگېدلی",
        "emailblock": "پر برېښليک بنديز ولگېد",
        "blocklist-nousertalk": "د خبرواترو خپل مخ نه شی سمولای",
+       "blocklist-editing": "سمېدنې کې دی",
        "ipblocklist-empty": "د بنديز لړليک تش دی",
        "ipblocklist-no-results": "پر غوښتل شوي آي پي پتې باندې بنديز نه دي لګول شوي.",
        "blocklink": "بنديز لگول",
        "confirm-unwatch-button": "ښه",
        "confirm-unwatch-top": "همدا مخ خپل کتنلړ څخه لرې کوې؟",
        "confirm-rollback-button": "هوکې",
+       "comma-separator": "،&#32;",
        "percent": "$1%",
        "parentheses": "($1)",
        "brackets": "[$1]",
index 0680b30..916aa1c 100644 (file)
        "hidden-category-category": "Categorias ocultas",
        "category-subcat-count": "{{PLURAL:$2|Esta categoria possui apenas a seguinte subcategoria.|Esta categoria possui {{PLURAL:$1|a seguinte subcategoria|as seguintes $1 subcategorias}}, de um total de $2.}}",
        "category-subcat-count-limited": "Esta categoria possui {{PLURAL:$1|a seguinte subcategoria|as $1 subcategorias a seguir}}.",
-       "category-article-count": "{{PLURAL:$2|Esta categoria contém apenas a seguinte página.|{{PLURA:$1|A seguinte página pertence|As seguintes $1 páginas pertencem}} a esta categoria, de um total de $2.}}",
+       "category-article-count": "{{PLURAL:$2|Esta categoria contém apenas a seguinte página.|{{PLURAL:$1|A seguinte página pertence|As seguintes $1 páginas pertencem}} a esta categoria, de um total de $2.}}",
        "category-article-count-limited": "Esta categoria possui {{PLURAL:$1|a seguinte página|as $1 páginas a seguir}}.",
        "category-file-count": "{{PLURAL:$2|Esta categoria possui apenas o seguinte arquivo.|Esta categoria possui {{PLURAL:$1|o seguinte arquivo|os $1 arquivos a seguir}}, de um total de $2.}}",
        "category-file-count-limited": "Esta categoria possui {{PLURAL:$1|um arquivo|$1 arquivos}}.",
index 8b75c88..cb67002 100644 (file)
        "changepassword-success": "'A password toje ha state cangiate!",
        "changepassword-throttled": "Tu è pruvate 'nu sacche de vote a trasè.\nPe piacere aspitte $1 apprime de pruvà arrete.",
        "botpasswords": "Password d'u bot",
+       "botpasswords-summary": "<em>Passuord bot</em> permette l'ause a 'nu cunde ausanne le API, senze ausà le credenziale de accesse prengepàle. Le deritte de l'utende disponibbele quanne se ave trasute cu 'na passuord bot ponne essere limitate.\n\nCe non ge canusce 'u mutive purcé puè fa sta cose, allore probbabbilmende non ge l'ha fà. Nisciune t'addà cercà de generà 'na passuord bot pe pò darle a otre crestiane.",
        "botpasswords-disabled": "Le passuord bot so disabbilitate.",
        "botpasswords-no-central-id": "Pe ausà 'na passuor bot, a trasè a 'nu utende cendralizzate.",
        "botpasswords-existing": "Passuord de le bot esistende",
        "usercssyoucanpreview": "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u CSS nuève apprime de reggistrà.",
        "userjsyoucanpreview": "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u JavaScript nuève apprime de reggistrà.",
        "usercsspreview": "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u CSS tue.'''\n'''Non g'à state angore reggistrete ninde!'''",
+       "userjsonpreview": "<strong>Arrecuerdete ca tu ste teste/'ndruche sulamende in andeprime 'a configurazione JSON tue.\nNon g'à state angore reggistrete ninde!</strong>",
        "userjspreview": "'''Arrecuerdete ca tu ste vide/teste sulamende in andeprime 'u JavaScript tue.'''\n'''Non g'à state angore reggistrete ninde!'''",
        "sitecsspreview": "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u CSS tune.'''\n'''Non g'à state angore reggistrate ninde!'''",
+       "sitejsonpreview": "<strong>Arrecuerdete ca tu ste 'ndruche sulamende in andeprime 'a configurazione JSON tue.\nNon g'à state angore reggistrete ninde!</strong>",
        "sitejspreview": "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u codece JavaScript tune.'''\n'''Non g'à state angore reggistrate ninde!'''",
        "userinvalidconfigtitle": "<strong>Attenziò:</strong> Non ge stè 'nu skin \"$1\".\nArrecuerdete ca jndr'à le file personalizzete .css, .json e .js s'ause scrivere le titele cu le lettere piccenne, pe esembie {{ns:user}}:Foo/vector.css è diverse da {{ns:user}}:Foo/Vector.css.",
        "updated": "(Cangiete)",
index 76cc91e..83a05eb 100644 (file)
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
-       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¿Ñ\80авки Ð¸Ð· Ð¿Ð¾Ñ\81ледниÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹",
+       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¸Ð· Ñ\81пиÑ\81ка Ñ\81вежиÑ\85 Ð¿Ñ\80авок",
        "tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
        "tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
        "tog-hidecategorization": "Скрывать категоризацию страниц",
        "tog-showhiddencats": "Показывать скрытые категории",
        "tog-norollbackdiff": "Не показывать разницу версий после выполнения отката",
        "tog-useeditwarning": "Предупреждать, когда я покидаю страницу с несохранёнными изменениями",
-       "tog-prefershttps": "\nВсегда используйте безопасное соединение при входе в систему",
+       "tog-prefershttps": "Всегда использовать защищённое соединение после представления системе",
        "underline-always": "Всегда",
        "underline-never": "Никогда",
        "underline-default": "Использовать настройки браузера",
        "helppage-top-gethelp": "Помощь",
        "mainpage": "Заглавная страница",
        "mainpage-description": "Заглавная страница",
-       "policy-url": "Project:Политика вики",
+       "policy-url": "Project:Правила",
        "portal": "Портал сообщества",
        "portal-url": "Project:Портал сообщества",
        "privacy": "Политика конфиденциальности",
        "pagetitle": "$1 — {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
-       "retrievedfrom": "Ð\9fолÑ\83Ñ\87ено Ð¾Ñ\82 \"$1\"",
+       "retrievedfrom": "Ð\98Ñ\81Ñ\82оÑ\87ник â\80\94 $1",
        "youhavenewmessages": "{{PLURAL:$3|Вы получили}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Вы получили}} $1 от {{PLURAL:$3|$3 участника|$3 участников|1=другого участника}} ($2).",
        "youhavenewmessagesmanyusers": "Вы получили $1 от множества пользователей ($2).",
        "collapsible-expand": "развернуть",
        "confirmable-confirm": "{{GENDER:$1|Вы}} уверены?",
        "confirmable-yes": "Да",
-       "confirmable-no": "нет",
+       "confirmable-no": "Ð\9dет",
        "thisisdeleted": "Просмотреть или восстановить $1?",
        "viewdeleted": "Просмотреть $1?",
        "restorelink": "{{PLURAL:$1|$1 удалённую правку|$1 удалённые правки|$1 удалённых правок|1=удалённую правку}}",
        "sort-descending": "Упорядочить по убыванию",
        "sort-ascending": "Упорядочить по возрастанию",
        "nstab-main": "Статья",
-       "nstab-user": "\nСтраница пользователя",
+       "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Участник|Участница}}",
        "nstab-media": "Мультимедиа",
        "nstab-special": "Служебная страница",
        "nstab-project": "О проекте",
        "accmailtext": "Сгенерированный случайным образом пароль для [[User talk:$1|$1]] выслан на адрес $2.\n\nПосле авторизации можно будет сменить пароль для этой учётной записи на ''[[Special:ChangePassword|специальной странице смены пароля]]''.",
        "newarticle": "(Новая)",
        "newarticletext": "Вы перешли по ссылке на страницу, которой пока не существует.\nЧтобы её создать, наберите текст в окне, расположенном ниже (подробнее см. [$1 справочную страницу]).\nЕсли вы оказались здесь по ошибке, просто нажмите кнопку '''назад''' своего браузера.",
-       "anontalkpagetext": "----\n<em>Эта страница обсуждения анонимного участника, который ещё не создал учётной записи или не использует её.</em>\nПоэтому мы вынуждены для его/её идентификации использовать цифровой IP-адрес.\nЭтот же адрес может использоваться нескольким другим участникам.\nЕсли вы анонимный участник и полагаете, что получили сообщения, адресованные не вам, пожалуйста, [[Special:CreateAccount|создайте учётную запись]] или [[Special:UserLogin|представьтесь системе]], чтобы впредь избежать возможной путаницы с другими анонимными участниками.",
+       "anontalkpagetext": "----\n<em>Эта страница обсуждения анонимного участника, который ещё не создал учётной записи или не использует её.</em>\nПоэтому мы вынуждены для его/её идентификации использовать цифровой IP-адрес.\nЭтот же адрес может использоваться несколькими участниками.\nЕсли вы анонимный участник и полагаете, что получили сообщения, адресованные не вам, пожалуйста, [[Special:CreateAccount|создайте учётную запись]] или [[Special:UserLogin|представьтесь системе]], чтобы впредь избежать возможной путаницы с другими анонимными участниками.",
        "noarticletext": "В настоящий момент текст на данной странице отсутствует.\nВы можете [[Special:Search/{{PAGENAME}}|найти упоминание данного названия]] на других страницах,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} найти соответствующие записи журналов]\nили '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} создать страницу с таким названием]'''</span>.",
        "noarticletext-nopermission": "В настоящее время на этой странице нет текста.\nВы можете [[Special:Search/{{PAGENAME}}|найти упоминание данного названия]] на других страницах,\nили <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} найти соответствующие записи журналов].</span> У вас нет разрешения создать данную страницу.",
        "missing-revision": "Версия $1 страницы «{{FULLPAGENAME}}» не существует.\n\nОбычно это бывает, если проследовать по устаревшей ссылке на удалённую страницу.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результата|<strong>$1</strong> результатов}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|1=Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1—$2</strong> из <strong>$3</strong>}}",
        "search-nonefound": "Соответствий запросу не найдено.",
-       "search-nonefound-thiswiki": "Нет результатов, соответствующих запросу на этом сайте.",
+       "search-nonefound-thiswiki": "Нет результатов, соответствующих запросу, на этом сайте.",
        "powersearch-legend": "Расширенный поиск",
        "powersearch-ns": "Поиск в пространствах имён:",
        "powersearch-togglelabel": "Отметить:",
index 1677159..6d0794e 100644 (file)
        "pool-servererror": "ဢၼ်ပဵၼ်ၼႃႈၵၢၼ် တူဝ်ဢၢၼ်ႇၼွင်ၼၼ်ႉ မၼ်းဢမ်ႇႁဵတ်းၵၢၼ် ($1).",
        "poolcounter-usage-error": "ၵၢၼ်ၸႂ်ႉၸိုဝ်း ၽိတ်းပိူင်ႈ: $1",
        "aboutsite": "လွင်ႈ​တၢင်း {{SITENAME}}",
-       "aboutpage": "Project: လွင်ႈဝႅပ်ႉသႆႉ",
+       "aboutpage": "Project:လွင်ႈဝႅပ်ႉသၢႆႉ",
        "copyright": "ၸိူဝ်းၶဝ်ႈပႃးဝႆႉၼႆႉ မၼ်းတေၸၢင်ႈၸႂ်ႉလႆႈ ၵႃႈတီႈ ဝႂ် $1",
        "copyrightpage": "{{ns:project}}:သုၼ်ႇထုတ်ႇ",
        "currentevents": "ၵၢၼ်ႁဵတ်းသၢင်ႈယၢမ်းလဵဝ်",
index f037a93..ff61f48 100644 (file)
        "tog-minordefault": "Подразумевано означавај све измене као мање",
        "tog-previewontop": "Прикажи претпреглед пре оквира за уређивање",
        "tog-previewonfirst": "Прикажи претпреглед при првој измени",
-       "tog-enotifwatchlistpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л када се промени страница или датотека са мог списка надгледања",
-       "tog-enotifusertalkpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л кад се промени моја корисничка страница за разговор",
-       "tog-enotifminoredits": "ТакоÑ\92е Ð¼Ð¸ Ð¿Ð¾Ñ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л код мањих измена страница и датотека",
-       "tog-enotifrevealaddr": "Ð\9eÑ\82кÑ\80иÑ\98 Ð¼Ð¾Ñ\98Ñ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83 Ñ\83 Ð¸Ð¼ÐµÑ\98ловима Ð¾Ð±Ð°Ð²ÐµÑ\88Ñ\82еÑ\9aа",
+       "tog-enotifwatchlistpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 када се промени страница или датотека са мог списка надгледања",
+       "tog-enotifusertalkpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 кад се промени моја корисничка страница за разговор",
+       "tog-enotifminoredits": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 Ð¸ код мањих измена страница и датотека",
+       "tog-enotifrevealaddr": "Ð\9eÑ\82кÑ\80иÑ\98 Ð¼Ð¾Ñ\98Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е Ñ\83 Ðµ-поÑ\80Ñ\83кама Ð·Ð° Ð¾Ð±Ð°Ð²ÐµÑ\88Ñ\82аваÑ\9aе",
        "tog-shownumberswatching": "Прикажи број корисника који надгледају",
        "tog-oldsig": "Ваш постојећи потпис:",
        "tog-fancysig": "Сматрај потпис као викитекст (без аутоматског повезивања)",
@@ -80,7 +80,7 @@
        "tog-watchlisthideanons": "Сакриј измене анонимних корисника са списка надгледања",
        "tog-watchlisthidepatrolled": "Сакриј патролиране измене са списка надгледања",
        "tog-watchlisthidecategorization": "Сакриј категоризацију страница",
-       "tog-ccmeonemails": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ ÐºÐ¾Ð¿Ð¸Ñ\98е Ð¸Ð¼ÐµÑ\98лова које пошаљем другим корисницима",
+       "tog-ccmeonemails": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ ÐºÐ¾Ð¿Ð¸Ñ\98е Ðµ-поÑ\80Ñ\83ка које пошаљем другим корисницима",
        "tog-diffonly": "Не приказуј садржај странице испод разлика",
        "tog-showhiddencats": "Прикажи скривене категорије",
        "tog-norollbackdiff": "Не приказуј разлику након извршеног враћања",
        "navigation-heading": "Мени за навигацију",
        "errorpagetitle": "Грешка",
        "returnto": "Назад на страницу „$1”.",
-       "tagline": "Из {{GRAMMAR:генитив|{{SITENAME}}}}",
+       "tagline": "Извор: {{SITENAME}}",
        "help": "Помоћ",
        "help-mediawiki": "Помоћ о MediaWiki-ју",
        "search": "Претрага",
        "toolbox": "Алатке",
        "tool-link-userrights": "Промена {{GENDER:$1|корисничких}} група",
        "tool-link-userrights-readonly": "Приказ {{GENDER:$1|корисничких}} група",
-       "tool-link-emailuser": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла {{GENDER:$1|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ници}}",
+       "tool-link-emailuser": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ке {{GENDER:$1|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и|коÑ\80иÑ\81никÑ\83/ци}}",
        "imagepage": "Прикажи страницу датотеке",
        "mediawikipage": "Прикажи страницу поруке",
        "templatepage": "Прикажи страницу шаблона",
        "pool-errorunknown": "Непозната грешка",
        "pool-servererror": "Услуга бројача редова није доступна ($1).",
        "poolcounter-usage-error": "Грешка при употреби: $1",
-       "aboutsite": "О {{GRAMMAR:датив|{{SITENAME}}}}",
-       "aboutpage": "Project:О_{{GRAMMAR:датив|{{SITENAME}}}}",
+       "aboutsite": "О пројекту {{SITENAME}}",
+       "aboutpage": "Project:О_пројекту_{{SITENAME}}",
        "copyright": "Садржај је доступан под лиценцом $1 осим ако је другачије наведено.",
        "copyrightpage": "{{ns:project}}:Ауторска права",
        "currentevents": "Актуелности",
        "protectedpagetext": "Ова страница је закључана за измене и друге радње.",
        "viewsourcetext": "Можете да видите и копирате извор ове странице.",
        "viewyourtext": "Можете да видите и копирате извор <strong>ваших измена</strong> на овој страници.",
-       "protectedinterface": "Ова страница садржи текст интерфејса за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или променили преводе било којег викија, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију Медијавикија.",
-       "editinginterface": "<strong>Упозорење:</strong> уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.",
+       "protectedinterface": "Ова страница обезбеђује текст интерфејса за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или променили преводе свих викија, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију MediaWiki-ја.",
+       "editinginterface": "<strong>Упозорење:</strong> Уређујете страницу која се користи за обезбеђивање текста интерфејса за софтвер.\nПромене на овој страници утицаће на изглед корисничког интерфејса других корисника овог викија.",
        "translateinterface": "Да бисте додали или променили преводе за све викије, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију Медијавикија.",
        "cascadeprotected": "Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:\n$2",
        "namespaceprotected": "Немате дозволу да уређујете странице у именском простору: <strong>$1</strong>.",
        "userlogout": "Одјава",
        "notloggedin": "Нисте пријављени",
        "userlogin-noaccount": "Немате налог?",
-       "userlogin-joinproject": "Придружите се {{GRAMMAR:датив|{{SITENAME}}}}",
+       "userlogin-joinproject": "Придружите се пројекту {{SITENAME}}",
        "createaccount": "Отварање налога",
        "userlogin-resetpassword-link": "Заборавили сте лозинку?",
        "userlogin-helplink2": "Помоћ при пријављивању",
        "userlogin-loggedin": "Већ сте пријављени као {{GENDER:$1|$1}}.\nКористите доњи образац да бисте се пријавили као други корисник.",
        "userlogin-reauth": "Морате да се поново пријавите да бисте верификовали да сте {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Отвори још један налог",
-       "createacct-emailrequired": "Ð\98меÑ\98л-адÑ\80еÑ\81а",
-       "createacct-emailoptional": "Ð\98меÑ\98л-адÑ\80еÑ\81а (опционално)",
-       "createacct-email-ph": "УнеÑ\81иÑ\82е Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83",
-       "createacct-another-email-ph": "УнеÑ\81иÑ\82е Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83",
-       "createaccountmail": "Ð\9aоÑ\80иÑ\81Ñ\82и Ð¿Ñ\80ивÑ\80еменÑ\83, Ð½Ð°Ñ\81Ñ\83миÑ\87нÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¸ Ð¿Ð¾Ñ\88аÑ\99и Ñ\98е Ð½Ð° Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83",
+       "createacct-emailrequired": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е",
+       "createacct-emailoptional": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е (опционално)",
+       "createacct-email-ph": "УнеÑ\81иÑ\82е Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е",
+       "createacct-another-email-ph": "УнеÑ\81иÑ\82е Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е",
+       "createaccountmail": "Ð\9aоÑ\80иÑ\81Ñ\82и Ð¿Ñ\80ивÑ\80еменÑ\83, Ð½Ð°Ñ\81Ñ\83миÑ\87нÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¸ Ð¿Ð¾Ñ\88аÑ\99и Ñ\98е Ð½Ð° Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е",
        "createaccountmail-help": "Може се користити да се некоме отвори налог без сазнања лозинке.",
        "createacct-realname": "Право име (опционално)",
        "createacct-reason": "Разлог",
        "password-name-match": "Лозинка се мора разликовати од корисничког имена.",
        "password-login-forbidden": "Коришћење овог корисничког имена и лозинке је забрањено.",
        "mailmypassword": "Ресетуј лозинку",
-       "passwordremindertitle": "Нова привремена лозинка за {{GRAMMAR:акузатив|{{SITENAME}}}}",
+       "passwordremindertitle": "{{SITENAME}} — привремена лозинка",
        "passwordremindertext": "Неко са IP адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСтворена је привремена лозинка за {{GENDER:$2|корисника|корисницу|корисника}} $2 која гласи $3.\nУколико је ово ваш захтев, сада се пријавите и поставите нову лозинку.\nПривремена лозинка истиче за {{PLURAL:$5|један дан|$5 дана}}.\n\nАко је неко други затражио промену лозинке, или сте се сетили ваше лозинке и не желите да је мењате, занемарите ову поруку.",
-       "noemail": "Не постоји имејл-адреса за {{GENDER:$1|корисника|корисницу}} $1.",
-       "noemailcreate": "Ð\9cоÑ\80аÑ\82е Ð´Ð° Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð²Ð°Ð¶ÐµÑ\9bÑ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83.",
-       "passwordsent": "Ð\9dова Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83 {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81нице}} $1.\nПоново се пријавите након што је примите.",
+       "noemail": "{{GENDER:$1|Корисник „$1” није навео|Корисница „$1” није навела|Корисник/ца „$1” није навео/ла}} адресу е-поште.",
+       "noemailcreate": "Ð\9cоÑ\80аÑ\82е Ð´Ð° Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð²Ð°Ð¶ÐµÑ\9bÑ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е.",
+       "passwordsent": "Ð\9dова Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86е|коÑ\80иÑ\81ника/це}} $1.\nПоново се пријавите након што је примите.",
        "blocked-mailpassword": "Уређивање са ваше IP адресе је блокирано. Ради спречавања злоупотребе, забрањена је и функција враћања лозинке са ње.",
-       "eauthentsent": "Ð\98меÑ\98л Ð¾ Ð¿Ð¾Ñ\82вÑ\80ди Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82 Ð½Ð° Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83.\nÐ\9fÑ\80е Ð±Ð¸Ð»Ð¾ ÐºÐ¾Ñ\98иÑ\85 Ð´Ñ\80Ñ\83гиÑ\85 Ñ\81лаÑ\9aа Ð¸Ð¼ÐµÑ\98лова Ð½Ð° Ð½Ð°Ð»Ð¾Ð³, Ð¼Ð¾Ñ\80аÑ\9bеÑ\82е Ð¿Ñ\80аÑ\82иÑ\82и Ñ\83пÑ\83Ñ\82Ñ\81Ñ\82ва Ñ\83 Ð¸Ð¼ÐµÑ\98лÑ\83 да бисте потврдили да је налог заиста ваш.",
+       "eauthentsent": "Ð\95-поÑ\80Ñ\83ка Ð¾ Ð¿Ð¾Ñ\82вÑ\80ди Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е.\nÐ\9fÑ\80е Ð±Ð¸Ð»Ð¾ ÐºÐ¾Ñ\98иÑ\85 Ð´Ñ\80Ñ\83гиÑ\85 Ñ\81лаÑ\9aа Ðµ-поÑ\80Ñ\83ка Ð½Ð° Ð½Ð°Ð»Ð¾Ð³, Ð¼Ð¾Ñ\80аÑ\9bеÑ\82е Ð¿Ñ\80аÑ\82иÑ\82и Ñ\83пÑ\83Ñ\82Ñ\81Ñ\82ва Ñ\83 Ðµ-поÑ\80Ñ\83Ñ\86и да бисте потврдили да је налог заиста ваш.",
        "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
        "mailerror": "Грешка при слању поруке: $1",
-       "acct_creation_throttle_hit": "Ð\9fоÑ\81еÑ\82иоÑ\86и Ð¾Ð²Ð¾Ð³ Ð²Ð¸ÐºÐ¸Ñ\98а ÐºÐ¾Ñ\98и ÐºÐ¾Ñ\80иÑ\81Ñ\82е Ð²Ð°Ñ\88Ñ\83 IP Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\81Ñ\83 Ð²ÐµÑ\9b Ð¾Ñ\82воÑ\80или {{PLURAL:$1|1=Ñ\98едан Ð½Ð°Ð»Ð¾Ð³|$1 Ð½Ð°Ð»Ð¾Ð³Ð°}} Ð¿Ñ\80еÑ\82Ñ\85одни $2, Ñ\88Ñ\82о Ñ\98е Ð½Ð°Ñ\98веÑ\9bи Ð´Ð¾Ð·Ð²Ð¾Ñ\99ени Ð±Ñ\80оÑ\98 Ñ\83 Ñ\82ом Ð²Ñ\80еменÑ\81ком Ð¿ÐµÑ\80иодÑ\83.\nÐ\97бог Ñ\82ога Ð¿Ð¾Ñ\81еÑ\82иоÑ\86и Ñ\81 Ð¾Ð²Ðµ IP Ð°Ð´Ñ\80еÑ\81е Ñ\82Ñ\80енÑ\83Ñ\82но Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð¾Ñ\82воÑ\80ити више налога.",
-       "emailauthenticated": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81а је потврђена на дан $2 у $3 ч.",
-       "emailnotauthenticated": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81а Ñ\98оÑ\88 Ð½Ð¸Ñ\98е Ð¿Ð¾Ñ\82вÑ\80Ñ\92ена.\nÐ\9dиÑ\98едан Ð¸Ð¼ÐµÑ\98л Ð½ÐµÑ\9bе Ð´Ð° Ð±Ñ\83де Ð¿Ð¾Ñ\81лаÑ\82 ни у једном од следећих случајева.",
-       "noemailprefs": "Ð\9dаведиÑ\82е Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83 у подешавањима за оспособљавање ових функција.",
-       "emailconfirmlink": "Потврдите своју имејл-адресу",
-       "invalidemailaddress": "Ð\98меÑ\98л-адÑ\80еÑ\81а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\83де Ð¿Ñ\80иÑ\85ваÑ\9bена Ñ\98еÑ\80 Ñ\98е Ñ\83 Ð½ÐµÐ²Ð°Ð¶ÐµÑ\9bем Ð¾Ð±Ð»Ð¸ÐºÑ\83.\nУнеÑ\81иÑ\82е Ð¸Ñ\81пÑ\80авну адресу или оставите празно поље.",
-       "cannotchangeemail": "Ð\9dа Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 Ð½Ð¸Ñ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80омениÑ\82и Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е Ð½Ð°Ð»Ð¾Ð³Ð°.",
-       "emaildisabled": "Овај сајт не може да шаље имејлове.",
+       "acct_creation_throttle_hit": "Ð\9fоÑ\81еÑ\82иоÑ\86и Ð¾Ð²Ð¾Ð³ Ð²Ð¸ÐºÐ¸Ñ\98а ÐºÐ¾Ñ\98и ÐºÐ¾Ñ\80иÑ\81Ñ\82е Ð²Ð°Ñ\88Ñ\83 IP Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\81Ñ\83 Ð¾Ñ\82воÑ\80или {{PLURAL:$1|1=Ñ\98едан Ð½Ð°Ð»Ð¾Ð³|$1 Ð½Ð°Ð»Ð¾Ð³Ð°}} Ñ\83 Ð¿Ñ\80еÑ\82Ñ\85одниÑ\85 $2, Ñ\88Ñ\82о Ñ\98е Ð½Ð°Ñ\98веÑ\9bа Ð´Ð¾Ð·Ð²Ð¾Ñ\99ена Ð²Ñ\80едноÑ\81Ñ\82 Ñ\83 Ð¾Ð²Ð¾Ð¼ Ð²Ñ\80еменÑ\81ком Ð¿ÐµÑ\80иодÑ\83.\nÐ\9aао Ñ\80езÑ\83лÑ\82аÑ\82 Ñ\82ога, Ñ\82и Ð¿Ð¾Ñ\81еÑ\82иоÑ\86и Ñ\82Ñ\80енÑ\83Ñ\82но Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð¾Ñ\82ваÑ\80ати више налога.",
+       "emailauthenticated": "Ð\92аÑ\88а Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е је потврђена на дан $2 у $3 ч.",
+       "emailnotauthenticated": "Ð\92аÑ\88а Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е Ñ\98оÑ\88 Ð½Ð¸Ñ\98е Ð¿Ð¾Ñ\82вÑ\80Ñ\92ена.\nÐ\9dиÑ\98една Ðµ-поÑ\80Ñ\83ка Ð½ÐµÑ\9bе Ð±Ð¸Ñ\82и Ð¿Ð¾Ñ\81лаÑ\82а ни у једном од следећих случајева.",
+       "noemailprefs": "Ð\9dаведиÑ\82е Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е у подешавањима за оспособљавање ових функција.",
+       "emailconfirmlink": "Потврдите адресу е-поште",
+       "invalidemailaddress": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80иÑ\85ваÑ\82иÑ\82и Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е Ñ\98еÑ\80 Ñ\98е Ñ\83 Ð½ÐµÐ²Ð°Ð¶ÐµÑ\9bем Ñ\84оÑ\80маÑ\82Ñ\83.\nУнеÑ\81иÑ\82е Ð´Ð¾Ð±Ñ\80о Ñ\84оÑ\80маÑ\82иÑ\80ану адресу или оставите празно поље.",
+       "cannotchangeemail": "Ð\90дÑ\80еÑ\81е Ðµ-поÑ\88Ñ\82е Ð½Ð°Ð»Ð¾Ð³Ð° Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ñ\81е Ð¿Ñ\80омениÑ\82и Ð½Ð° Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83.",
+       "emaildisabled": "Ова локација не може да шаље е-поруке.",
        "accountcreated": "Налог је отворен",
        "accountcreatedtext": "Кориснички налог [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) је отворен.",
        "createaccount-title": "Отварање корисничког налога за {{SITENAME}}",
-       "createaccount-text": "Ð\9dеко Ñ\98е Ð¾Ñ\82воÑ\80ио Ð½Ð°Ð»Ð¾Ð³ Ñ\81а Ð²Ð°Ñ\88ом Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81ом Ð½Ð° Ð¿Ñ\80оÑ\98екÑ\82Ñ\83 {{SITENAME}} ($4) Ð¿Ð¾Ð´ Ð¸Ð¼ÐµÐ½Ð¾Ð¼ â\80\9e$2â\80\9c Ð¸ Ñ\81а Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¾Ð¼ â\80\9e$3â\80\9c.\nОдмах требате да се пријавите и промените своју лозинку.\n\nМожете да занемарите ову поруку, ако је овај налог отворен грешком.",
+       "createaccount-text": "Ð\9dеко Ñ\98е Ð¾Ñ\82воÑ\80ио Ð½Ð°Ð»Ð¾Ð³ Ñ\81а Ð²Ð°Ñ\88ом Ð°Ð´Ñ\80еÑ\81ом Ðµ-поÑ\88Ñ\82е Ð½Ð° Ð¿Ñ\80оÑ\98екÑ\82Ñ\83 {{SITENAME}} ($4) Ð¿Ð¾Ð´ Ð¸Ð¼ÐµÐ½Ð¾Ð¼ â\80\9e$2â\80\9d Ð¸ Ñ\81а Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¾Ð¼ â\80\9e$3â\80\9d.\nОдмах требате да се пријавите и промените своју лозинку.\n\nМожете да занемарите ову поруку, ако је овај налог отворен грешком.",
        "login-throttled": "Превише пута сте покушали да се пријавите.\nСачекајте $1 пре него што покушате поново.",
        "login-abort-generic": "Неуспешна пријава – прекинуто",
-       "login-migrated-generic": "Ваш налог је мигриран и ваше корисничко више не постоји на овом викију.",
+       "login-migrated-generic": "Ваш налог је мигриран. Ваше корисничко више не постоји на овом викију.",
        "loginlanguagelabel": "Језик: $1",
        "suspicious-userlogout": "Ваш захтев за одјаву је одбијен јер изгледа да га је послао покварени прегледач или кеширани прокси.",
        "createacct-another-realname-tip": "Право име је опционално.\nАко одаберете да га наведете, биће коришћено за приписивање вашег рада.",
        "pt-createaccount": "Отварање налога",
        "pt-userlogout": "Одјави ме",
        "php-mail-error-unknown": "Непозната грешка у функцији PHP mail().",
-       "user-mail-no-addy": "Ð\9fокÑ\83Ñ\88али Ñ\81Ñ\82е Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ð¸Ð¼ÐµÑ\98л Ð±ÐµÐ· Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е.",
-       "user-mail-no-body": "Ð\9fокÑ\83Ñ\88ано Ñ\81лаÑ\9aе Ð¸Ð¼ÐµÑ\98ла Ñ\81 празним или неразумно кратким садржајем.",
+       "user-mail-no-addy": "Ð\9fокÑ\83Ñ\88али Ñ\81Ñ\82е Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ðµ-поÑ\80Ñ\83кÑ\83 Ð±ÐµÐ· Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е.",
+       "user-mail-no-body": "Ð\9fокÑ\83Ñ\88али Ñ\81Ñ\82е Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ðµ-поÑ\80Ñ\83кÑ\83 Ñ\81а празним или неразумно кратким садржајем.",
        "changepassword": "Промена лозинке",
        "resetpass_announce": "Да бисте завршили пријаву, подесите нову лозинку овде.",
        "resetpass_text": "<!-- Овде унесите текст -->",
        "resetpass-submit-cancel": "Откажи",
        "resetpass-wrong-oldpass": "Неважећа привремена или тренутна лозинка.\nМожда сте већ променили лозинку или сте захтевали нову привремену лозинку.",
        "resetpass-recycled": "Унели сте садашњу лозинку, да бисте променили лозинку морате унети нову.",
-       "resetpass-temp-emailed": "Ð\9fÑ\80иÑ\98авили Ñ\81Ñ\82е Ñ\81е Ñ\81а Ð¿Ñ\80ивÑ\80еменим ÐºÐ¾Ð´Ð¾Ð¼ Ð¸Ð· Ð¸Ð¼ÐµÑ\98ла.\nÐ\94а Ð±Ð¸Ñ\81Ñ\82е Ð·Ð°Ð²Ñ\80Ñ\88или Ð¿Ñ\80иÑ\98авÑ\99иваÑ\9aе морате поставити нову лозинку овде:",
+       "resetpass-temp-emailed": "Ð\9fÑ\80иÑ\98авили Ñ\81Ñ\82е Ñ\81е Ñ\81а Ð¿Ñ\80ивÑ\80еменим ÐºÐ¾Ð´Ð¾Ð¼ Ð¸Ð· Ðµ-поÑ\80Ñ\83ке.\nÐ\94а Ð±Ð¸Ñ\81Ñ\82е Ð·Ð°Ð²Ñ\80Ñ\88или Ð¿Ñ\80иÑ\98авÑ\99иваÑ\9aе, морате поставити нову лозинку овде:",
        "resetpass-temp-password": "Привремена лозинка:",
        "resetpass-abort-generic": "Промену лозинке је прекинуо додатак.",
        "resetpass-expired": "Ваша лозинка је истекла. Поставите нову лозинку да бисте се пријавили.",
        "resetpass-expired-soft": "Ваша лозинка је истекла и морате је променити. Поставите нову лозинку или кликните „{{int:authprovider-resetpass-skip-label}}“ да је промените касније.",
        "resetpass-validity-soft": "Ваша лозинка није важећа: $1\n\nИзаберите нову одмах или кликните на „{{int:authprovider-resetpass-skip-label}}“ да је промените касније.",
        "passwordreset": "Ресетовање лозинке",
-       "passwordreset-text-one": "Ð\9fопÑ\83ниÑ\82е Ð¾Ð²Ð°Ñ\98 Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð´Ð¾Ð±Ð¸Ð»Ð¸ Ð¿Ñ\80ивÑ\80еменÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð½Ð° Ð¸Ð¼ÐµÑ\98л.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ð\98Ñ\81пÑ\83ниÑ\82е Ñ\98едно Ð¾Ð´ Ð¿Ð¾Ñ\99а ÐºÐ°ÐºÐ¾ Ð±Ð¸Ñ\81Ñ\82е Ð´Ð¾Ð±Ð¸Ð»Ð¸ Ð¿Ñ\80ивÑ\80еменÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¿Ñ\83Ñ\82ем Ð¸Ð¼ÐµÑ\98ла.}}",
+       "passwordreset-text-one": "Ð\9fопÑ\83ниÑ\82е Ð¾Ð²Ð°Ñ\98 Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ñ\80имили Ð¿Ñ\80ивÑ\80еменÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¿Ñ\83Ñ\82ем Ðµ-поÑ\88Ñ\82е.",
+       "passwordreset-text-many": "{{PLURAL:$1|Ð\98Ñ\81пÑ\83ниÑ\82е Ñ\98едно Ð¾Ð´ Ð¿Ð¾Ñ\99а Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ñ\80имили Ð¿Ñ\80ивÑ\80еменÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¿Ñ\83Ñ\82ем Ðµ-поÑ\88Ñ\82е.}}",
        "passwordreset-disabled": "Ресетовање лозинке је онемогућено на овом викију.",
-       "passwordreset-emaildisabled": "Ð\98меÑ\98л Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bен на овом викију.",
+       "passwordreset-emaildisabled": "ФÑ\83нкÑ\86иÑ\98а Ðµ-поÑ\88Ñ\82е Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bена на овом викију.",
        "passwordreset-username": "Корисничко име:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-email": "Ð\98меÑ\98л-адÑ\80еÑ\81а:",
+       "passwordreset-email": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е:",
        "passwordreset-emailtitle": "Детаљи налога на викију {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Ð\9dеко (веÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а IP Ð°Ð´Ñ\80еÑ\81е $1) Ð·Ð°Ñ\82Ñ\80ажио Ñ\98е Ñ\80еÑ\81еÑ\82оваÑ\9aе Ð²Ð°Ñ\88е \nлозинке Ð·Ð° Ð¿Ñ\80оÑ\98екаÑ\82 {{SITENAME}} ($4). Ð¡Ð»ÐµÐ´ÐµÑ\9bи ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки {{PLURAL:$3|налог Ñ\98е Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½|налози Ñ\81Ñ\83 Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð¸}} \nÑ\81а Ð¾Ð²Ð¾Ð¼ Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81ом:\n\n$2\n\n{{PLURAL:$3|Ð\9eва Ð¿Ñ\80ивÑ\80емена Ð»Ð¾Ð·Ð¸Ð½ÐºÐ°|Ð\9eве Ð¿Ñ\80ивÑ\80емене Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ}} Ñ\9bе Ð¸Ñ\81Ñ\82еÑ\9bи Ð·Ð° {{PLURAL:$5|Ñ\98едан Ð´Ð°Ð½|$5 Ð´Ð°Ð½Ð°}}.\nÐ\9eдмаÑ\85 Ñ\82Ñ\80ебаÑ\82е Ð´Ð° Ñ\81е Ð¿Ñ\80иÑ\98авиÑ\82е Ð¸ Ð¾Ð´Ð°Ð±ÐµÑ\80иÑ\82е Ð½Ð¾Ð²Ñ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83. Ð\90ко Ñ\98е Ð½ÐµÐºÐ¾ Ð´Ñ\80Ñ\83ги Ð½Ð°Ð¿Ñ\80авио Ð¾Ð²Ð°Ñ\98 \nзаÑ\85Ñ\82ев Ð¸Ð»Ð¸ Ñ\81Ñ\82е Ñ\81е Ñ\81еÑ\82или Ñ\81воÑ\98е Ð¿Ñ\80вобиÑ\82не Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ, Ð° Ð½Ðµ \nжелиÑ\82е Ð´Ð° Ñ\98е Ð¿Ñ\80омениÑ\82е, Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð·Ð°Ð½ÐµÐ¼Ð°Ñ\80иÑ\82е Ð¾Ð²Ñ\83 Ð¿Ð¾Ñ\80Ñ\83кÑ\83 Ð¸ Ð½Ð°Ñ\81Ñ\82авиÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ñ\81воÑ\98Ñ\83 Ñ\81Ñ\82аÑ\80Ñ\83 \nлозинку.",
-       "passwordreset-emailtext-user": "{{GENDER:$1|Корисник је затражио|Корисница је затражила}} подсетник о подацима за пријаву на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} са овом имејл-адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.",
+       "passwordreset-emailtext-ip": "Ð\9dеко (веÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а IP Ð°Ð´Ñ\80еÑ\81е $1) Ð·Ð°Ñ\82Ñ\80ажио Ñ\98е Ñ\80еÑ\81еÑ\82оваÑ\9aе Ð²Ð°Ñ\88е \nлозинке Ð·Ð° Ð¿Ñ\80оÑ\98екаÑ\82 {{SITENAME}} ($4). Ð¡Ð»ÐµÐ´ÐµÑ\9bи ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки {{PLURAL:$3|налог Ñ\98е Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½|налози Ñ\81Ñ\83 Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð¸}} \nÑ\81а Ð¾Ð²Ð¾Ð¼ Ð°Ð´Ñ\80еÑ\81ом Ðµ-поÑ\88Ñ\82е:\n\n$2\n\n{{PLURAL:$3|Ð\9eва Ð¿Ñ\80ивÑ\80емена Ð»Ð¾Ð·Ð¸Ð½ÐºÐ°|Ð\9eве Ð¿Ñ\80ивÑ\80емене Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ}} Ð¸Ñ\81Ñ\82еÑ\9bи Ñ\9bе Ð·Ð° {{PLURAL:$5|Ñ\98едан Ð´Ð°Ð½|$5 Ð´Ð°Ð½Ð°}}.\nÐ\9eдмаÑ\85 Ñ\82Ñ\80ебаÑ\82е Ð´Ð° Ñ\81е Ð¿Ñ\80иÑ\98авиÑ\82е Ð¸ Ð¾Ð´Ð°Ð±ÐµÑ\80иÑ\82е Ð½Ð¾Ð²Ñ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83. \nÐ\90ко Ñ\98е Ð½ÐµÐºÐ¾ Ð´Ñ\80Ñ\83ги Ð½Ð°Ð¿Ñ\80авио Ð¾Ð²Ð°Ñ\98 Ð·Ð°Ñ\85Ñ\82ев Ð¸Ð»Ð¸ Ñ\81Ñ\82е Ñ\81е Ñ\81еÑ\82или \nоÑ\80игиналне Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ, Ð° Ð½Ðµ Ð¶ÐµÐ»Ð¸Ñ\82е Ð´Ð° Ñ\98е Ð¿Ñ\80омениÑ\82е, \nможеÑ\82е Ð´Ð° Ð·Ð°Ð½ÐµÐ¼Ð°Ñ\80иÑ\82е Ð¾Ð²Ñ\83 Ð¿Ð¾Ñ\80Ñ\83кÑ\83 Ð¸ Ð½Ð°Ñ\81Ñ\82авиÑ\82е Ð´Ð° \nкоÑ\80иÑ\81Ñ\82иÑ\82е Ñ\81воÑ\98Ñ\83 Ñ\81Ñ\82аÑ\80Ñ\83 лозинку.",
+       "passwordreset-emailtext-user": "Корисник/ца $1 затражио/ла је ресетовање ваше лозинке на пројекту {{SITENAME}} ($4).\nСледећи кориснички {{PLURAL:$3|налог је повезан|налози су повезани}} са овом адресом е-поште:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nОдмах требате да се пријавите и одаберите нову лозинку. \nАко је неко други направио овај захтев или сте се сетили \nоригиналне лозинке, а не желите да је промените, \nможете да занемарите ову поруку и наставите да \nкористите своју стару лозинку.",
        "passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
-       "passwordreset-emailsentemail": "Ð\90ко Ñ\98е Ð¾Ð²Ð° Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81а Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð° Ñ\81а Ð²Ð°Ñ\88им Ð½Ð°Ð»Ð¾Ð³Ð¾Ð¼, Ð¾Ð½Ð´Ð° Ñ\9bе Ð¸Ð¼ÐµÑ\98л Ð¾ Ñ\80еÑ\81еÑ\82оваÑ\9aÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ Ð±Ð¸Ñ\82и Ð¿Ð¾Ñ\81лаÑ\82.",
-       "passwordreset-emailsentusername": "Ð\90ко Ð¿Ð¾Ñ\81Ñ\82оÑ\98и Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81а Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð° Ñ\81а Ð¾Ð²Ð¸Ð¼ ÐºÐ¾Ñ\80иÑ\81ниÑ\87ким Ð¸Ð¼ÐµÐ½Ð¾Ð¼, Ð¾Ð½Ð´Ð° Ñ\9bе Ð¸Ð¼ÐµÑ\98л Ð¾ Ñ\80еÑ\81еÑ\82оваÑ\9aÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ Ð±Ð¸Ñ\82и Ð¿Ð¾Ñ\81лаÑ\82.",
+       "passwordreset-emailsentemail": "Ð\90ко Ñ\98е Ð¾Ð²Ð° Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð° Ñ\81а Ð²Ð°Ñ\88им Ð½Ð°Ð»Ð¾Ð³Ð¾Ð¼, Ð¾Ð½Ð´Ð° Ñ\9bе Ðµ-поÑ\80Ñ\83ка Ð¾ Ñ\80еÑ\81еÑ\82оваÑ\9aÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ Ð±Ð¸Ñ\82и Ð¿Ð¾Ñ\81лаÑ\82а.",
+       "passwordreset-emailsentusername": "Ð\90ко Ð¿Ð¾Ñ\81Ñ\82оÑ\98и Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð° Ñ\81а Ð¾Ð²Ð¸Ð¼ ÐºÐ¾Ñ\80иÑ\81ниÑ\87ким Ð¸Ð¼ÐµÐ½Ð¾Ð¼, Ð¾Ð½Ð´Ð° Ñ\9bе Ðµ-поÑ\80Ñ\83ка Ð¾ Ñ\80еÑ\81еÑ\82оваÑ\9aÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ Ð±Ð¸Ñ\82и Ð¿Ð¾Ñ\81лаÑ\82а.",
        "passwordreset-nocaller": "Позивалац се мора навести",
        "passwordreset-nosuchcaller": "Позивалац не постоји: $1",
        "passwordreset-ignored": "Ресетовање лозинке није успело. Можда послужилац није конфигурисан?",
-       "passwordreset-invalidemail": "Ð\9dеважеÑ\9bа Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81а",
+       "passwordreset-invalidemail": "Ð\9dеважеÑ\9bа Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е",
        "passwordreset-nodata": "Корисничко име и адреса е-поште нису наведени",
-       "changeemail": "Ð\9fÑ\80омена Ð¸Ð»Ð¸ Ñ\83клаÑ\9aаÑ\9aе Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е",
-       "changeemail-header": "Ð\9fопÑ\83ниÑ\82е Ð¾Ð²Ð°Ñ\98 Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð±Ð¸ Ñ\81Ñ\82е Ð¿Ñ\80оменили Ð²Ð°Ñ\88Ñ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83. Ð\90ко Ð±Ð¸Ñ\81Ñ\82е Ð¶ÐµÐ»ÐµÐ»Ð¸ Ð´Ð° Ñ\83клониÑ\82е Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð¾Ñ\81Ñ\82 Ð±Ð¸Ð»Ð¾ ÐºÐ¾Ñ\98е Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е Ñ\81а Ð²Ð°Ñ\88ег Ð½Ð°Ð»Ð¾Ð³Ð°, Ð¾Ñ\81Ñ\82авиÑ\82е Ð¿Ñ\80азно Ð¿Ð¾Ñ\99е Ð·Ð° Ð½Ð¾Ð²Ñ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83 када шаљете образац.",
+       "changeemail": "Ð\9fÑ\80омена Ð¸Ð»Ð¸ Ñ\83клаÑ\9aаÑ\9aе Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е",
+       "changeemail-header": "Ð\94овÑ\80Ñ\88иÑ\82е Ð¾Ð²Ð°Ñ\98 Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð±Ð¸ Ñ\81Ñ\82е Ð¿Ñ\80оменили Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е. Ð\90ко Ð±Ð¸Ñ\81Ñ\82е Ð¶ÐµÐ»ÐµÐ»Ð¸ Ð´Ð° Ñ\83клониÑ\82е Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð¾Ñ\81Ñ\82 Ð±Ð¸Ð»Ð¾ ÐºÐ¾Ñ\98е Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е Ñ\81а Ð²Ð°Ñ\88ег Ð½Ð°Ð»Ð¾Ð³Ð°, Ð¾Ñ\81Ñ\82авиÑ\82е Ð¿Ñ\80азно Ð¿Ð¾Ñ\99е Ð·Ð° Ð½Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е када шаљете образац.",
        "changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.",
-       "changeemail-oldemail": "Ð\90кÑ\82Ñ\83елна Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81а:",
-       "changeemail-newemail": "Ð\9dова Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81а:",
-       "changeemail-newemail-help": "Ово поље треба да оставите празно ако желите да уклоните своју имејл-адресу. Нећете бити у могућности да ресетујете заборављену лозинку и нећете примати имејлове са овог викија ако је имејл-адреса уклоњена.",
+       "changeemail-oldemail": "ТÑ\80енÑ\83Ñ\82на Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е:",
+       "changeemail-newemail": "Ð\9dова Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е:",
+       "changeemail-newemail-help": "Ово поље треба да оставите празно ако желите да уклоните адресу е-поште. Нећете бити у могућности да ресетујете заборављену лозинку и нећете примати е-поруке са овог викија ако је адреса е-поште уклоњена.",
        "changeemail-none": "(ништа)",
        "changeemail-password": "Ваша лозинка за пројекат {{SITENAME}}:",
-       "changeemail-submit": "Ð\9fÑ\80омени Ð¸Ð¼ÐµÑ\98л",
+       "changeemail-submit": "Ð\9fÑ\80омени Ðµ-поÑ\88Ñ\82Ñ\83",
        "changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
-       "changeemail-nochange": "УнеÑ\81иÑ\82е Ð´Ñ\80Ñ\83гÑ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83.",
+       "changeemail-nochange": "УнеÑ\81иÑ\82е Ð´Ñ\80Ñ\83гÑ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е.",
        "resettokens": "Ресетовање токена",
        "resettokens-text": "Овде можете да ресетујете токене који омогућавају приступ одређеним приватним подацима повезаним са вашим налогом.\n\nТребали бисте то урадити ако их случајно поделите са неким или ако је ваш налог угрожен.",
        "resettokens-no-tokens": "Нема жетона за ресетовање.",
        "headline_sample": "Текст наслова",
        "headline_tip": "Поднаслов (ниво 2)",
        "nowiki_sample": "Овде уметните необликован текст",
-       "nowiki_tip": "Занемари вики-обликовање",
+       "nowiki_tip": "Занемари вики обликовање",
        "image_sample": "Пример.jpg",
        "image_tip": "Уграђивање датотеке",
        "media_sample": "Пример.ogg",
        "subject-preview": "Преглед теме:",
        "previewerrortext": "Дошло је до грешке при покушају прегледа промена.",
        "blockedtitle": "Корисник је блокиран",
-       "blocked-email-user": "<strong>Ð\92аÑ\88ем ÐºÐ¾Ñ\80иÑ\81ниÑ\87ком Ð¸Ð¼ÐµÐ½Ñ\83 Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ано Ñ\81лаÑ\9aе Ð¸Ð¼ÐµÑ\98лова. Још увек можете да уређујете друге странице на овом викију.</strong> Можете да видите потпуне детаље блокаде на [[Special:MyContributions|доприносима налога]].\n\nБлокаду је извршио/ла $1.\n\nНаведен је следећи разлог: <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Намењена кориснику/ци или IP адреси: $7\n* ID блокаде #$5",
+       "blocked-email-user": "<strong>Ð\92аÑ\88ем ÐºÐ¾Ñ\80иÑ\81ниÑ\87ком Ð¸Ð¼ÐµÐ½Ñ\83 Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ано Ñ\81лаÑ\9aе Ðµ-поÑ\80Ñ\83ка. Још увек можете да уређујете друге странице на овом викију.</strong> Можете да видите потпуне детаље блокаде на [[Special:MyContributions|доприносима налога]].\n\nБлокаду је извршио/ла $1.\n\nНаведен је следећи разлог: <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Намењена кориснику/ци или IP адреси: $7\n* ID блокаде #$5",
        "blockedtext-partial": "<strong>Вашем корисничком имену или IP адреси је блокирано прављење промена на овој страници. Још увек можете да уређујете друге странице на овом викију.</strong> Можете да видите потпуне детаље блокаде на [[Special:MyContributions|доприносима налога]].\n\nБлокаду је извршио/ла $1.\n\nНаведен је следећи разлог: <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Намењена кориснику/ци или IP адреси: $7\n* ID блокаде #$5",
        "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Почетак блокирања: $8\n* Истек блокирања: $6\n* Блокирани: $7\n\nМожете да се обратите {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] ради дискусије о блокирању.\nНе можете да користите могућност „{{int:emailuser}}” осим ако сте унели валидну имејл адресу у својим [[Special:Preferences|подешавањима]] налога и нисте блокирани од коришћења исте.\nВаша тренутна IP адреса је $3, а ID блокирања #$5.\nНаведите све информације одозго при стварању било каквих упита.",
-       "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите функцију „{{int:emailuser}}“ осим ако сте навели важећу имејл-адресу у својим [[Special:Preferences|подешавањима]].\n\nВаша тренутна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.",
+       "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала|блокирао/ла}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу|корисника/цу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите функцију „{{int:emailuser}}“ осим ако сте навели важећу адресу е-поште у [[Special:Preferences|подешавањима]].\n\nВаша тренутна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "$1 да бисте уређивали странице.",
-       "confirmedittext": "Морате да потврдите своју имејл адресу пре уређивања страница.\nПоставите и потврдите имејл адресу преко [[Special:Preferences|подешавања]].",
+       "confirmedittext": "Морате да потврдите адресу е-поште пре уређивања страница.\nПоставите и проверите ваљаност адресе преко [[Special:Preferences|подешавања]].",
        "nosuchsectiontitle": "Није могуће пронаћи одељак",
        "nosuchsectiontext": "Покушали сте да уредите одељак који не постоји.\nМожда је премештен или избрисан док сте прегледали страницу.",
        "loginreqtitle": "Потребна је пријава",
        "prefs-watchlist-managetokens": "Управљање токенима",
        "prefs-misc": "Разно",
        "prefs-resetpass": "Промена лозинке",
-       "prefs-changeemail": "Ð\9fÑ\80омена Ð¸Ð»Ð¸ Ñ\83клаÑ\9aаÑ\9aе Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е",
-       "prefs-setemail": "Ð\9fоÑ\81Ñ\82авÑ\99аÑ\9aе Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е",
-       "prefs-email": "Ð\9eпÑ\86иÑ\98е Ð¸Ð¼ÐµÑ\98ла",
+       "prefs-changeemail": "Ð\9fÑ\80омена Ð¸Ð»Ð¸ Ñ\83клаÑ\9aаÑ\9aе Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е",
+       "prefs-setemail": "Ð\9fоÑ\81Ñ\82авÑ\99аÑ\9aе Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е",
+       "prefs-email": "Ð\9eпÑ\86иÑ\98е Ðµ-поÑ\88Ñ\82е",
        "prefs-rendering": "Изглед",
        "saveprefs": "Сачувај",
        "restoreprefs": "Врати сва подешавања на подразумеване вредности (у свим одељцима)",
        "timezoneregion-europe": "Европа",
        "timezoneregion-indian": "Индијски океан",
        "timezoneregion-pacific": "Тихи океан",
-       "allowemail": "Ð\94озволи Ð¿Ñ\80имаÑ\9aе Ð¸Ð¼ÐµÑ\98лова Ð¾Ð´ Ð´Ñ\80Ñ\83гиÑ\85 ÐºÐ¾Ñ\80иÑ\81ника",
-       "email-allow-new-users-label": "Ð\94озволи Ð¿Ñ\80имаÑ\9aе Ð¸Ð¼ÐµÑ\98лова од новајлија",
-       "email-blacklist-label": "Ð\97абÑ\80ани Ð¿Ñ\80имаÑ\9aе Ð¸Ð¼ÐµÑ\98лова Ð¾Ð´ Ñ\81ледеÑ\9bиÑ\85 ÐºÐ¾Ñ\80иÑ\81ника:",
+       "allowemail": "Ð\94озволи Ð´Ñ\80Ñ\83гим ÐºÐ¾Ñ\80иÑ\81ниÑ\86има Ð´Ð° Ð¼Ð¸ Ñ\88аÑ\99Ñ\83 Ðµ-поÑ\80Ñ\83ке",
+       "email-allow-new-users-label": "Ð\94озволи Ð¿Ñ\80имаÑ\9aе Ðµ-поÑ\80Ñ\83ка од новајлија",
+       "email-blacklist-label": "Ð\97абÑ\80ани Ð¾Ð²Ð¸Ð¼ ÐºÐ¾Ñ\80иÑ\81ниÑ\86има Ð´Ð° Ð¼Ð¸ Ñ\88аÑ\99Ñ\83 Ðµ-поÑ\80Ñ\83ке:",
        "prefs-searchoptions": "Претрага",
        "prefs-namespaces": "Именски простори",
        "default": "подразумевано",
        "prefs-custom-js": "прилагођени JavaScript",
        "prefs-common-config": "Дељени CSS/JSON/JavaScript за све теме:",
        "prefs-reset-intro": "Можете користити ову страницу да поново поставите своја подешавања на подразумеване вредности сајта.\nОво се не може опозвати.",
-       "prefs-emailconfirm-label": "Ð\9fоÑ\82вÑ\80да Ð¸Ð¼ÐµÑ\98ла:",
-       "youremail": "Ð\98меÑ\98л:",
+       "prefs-emailconfirm-label": "Ð\9fоÑ\82вÑ\80да Ðµ-поÑ\88Ñ\82е:",
+       "youremail": "Ð\95-поÑ\88Ñ\82а:",
        "username": "{{GENDER:$1|Корисничко име}}:",
        "prefs-memberingroups": "{{GENDER:$2|Члан|Чланица}} {{PLURAL:$1|групе|група}}:",
        "prefs-memberingroups-type": "$1",
        "gender-male": "Он уређује вики странице",
        "gender-female": "Она уређује вики странице",
        "prefs-help-gender": "Постављање овог подешавања је опционално.\nСофтвер користи дату вредност да би вам се обратио и споменуо вас другима користећи одговарајући граматички род.\nОва информација ће бити јавна.",
-       "email": "Ð\98меÑ\98л",
+       "email": "Ð\95-поÑ\88Ñ\82а",
        "prefs-help-realname": "Право име је опционално.\nАко је наведено, биће коришћено за приписивање вашег рада.",
-       "prefs-help-email": "Ð\98меÑ\98л Ð°Ð´Ñ\80еÑ\81а је опционална, али је потребна за ресетовање лозинке, ако је заборавите.",
-       "prefs-help-email-others": "ТакоÑ\92е Ð¼Ð¾Ð¶ÐµÑ\82е Ð¸Ð·Ð°Ð±Ñ\80аÑ\82и Ð´Ð° Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82иÑ\82е Ð´Ñ\80Ñ\83гима Ð´Ð° Ð²Ð°Ñ\81 ÐºÐ¾Ð½Ñ\82акÑ\82иÑ\80аÑ\98Ñ\83 Ð¿Ñ\80еко Ð¸Ð¼ÐµÑ\98ла Ð¿Ñ\83Ñ\82ем Ð²ÐµÐ·Ðµ Ð½Ð° Ð²Ð°Ñ\88оÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\87коÑ\98 Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸Ð»Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86и Ð·Ð° Ñ\80азговоÑ\80.\nÐ\92аÑ\88а Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81а неће бити приказана другим корисницима који вас контактирају.",
-       "prefs-help-email-required": "Ð\9fоÑ\82Ñ\80ебна Ñ\98е Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81а.",
+       "prefs-help-email": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е је опционална, али је потребна за ресетовање лозинке, ако је заборавите.",
+       "prefs-help-email-others": "ТакоÑ\92е Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð°Ð±Ñ\80аÑ\82и Ð´Ð° Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82иÑ\82е Ð´Ñ\80Ñ\83гима Ð´Ð° Ð²Ð°Ñ\81 ÐºÐ¾Ð½Ñ\82акÑ\82иÑ\80аÑ\98Ñ\83 Ð¿Ñ\80еко Ðµ-поÑ\88Ñ\82е Ð¿Ñ\83Ñ\82ем Ð²ÐµÐ·Ðµ Ð½Ð° Ð²Ð°Ñ\88оÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\87коÑ\98 Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸Ð»Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86и Ð·Ð° Ñ\80азговоÑ\80.\nÐ\92аÑ\88а Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е неће бити приказана другим корисницима који вас контактирају.",
+       "prefs-help-email-required": "Ð\9fоÑ\82Ñ\80ебна Ñ\98е Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е.",
        "prefs-info": "Основне информације",
        "prefs-i18n": "Интернационализација",
        "prefs-signature": "Потпис",
        "right-viewsuppressed": "прегледање измена скривених од свих корисника",
        "right-suppressionlog": "прегледање приватних дневника",
        "right-block": "блокирање даљих измена других корисника",
-       "right-blockemail": "блокирање корисника да шаљу имејл",
+       "right-blockemail": "блокирање функције слања е-порука кориснику",
        "right-hideuser": "блокирање корисничког имена и његово сакривање од јавности",
        "right-ipblock-exempt": "заобилажење IP блокада, аутоблокада и блокада опсега",
        "right-unblockself": "деблокирање самог себе",
        "right-editmyuserjs": "уређивање сопствених JavaScript датотека",
        "right-viewmywatchlist": "преглед сопственог списка надгледања",
        "right-editmywatchlist": "уређивање сопственог списка надгледања; неке предузете радње ће свеједно додати странице на списак и без овог права",
-       "right-viewmyprivateinfo": "пÑ\80еглед Ñ\81воÑ\98иÑ\85 Ð¿Ñ\80иваÑ\82ниÑ\85 Ð¿Ð¾Ð´Ð°Ñ\82ака (нпÑ\80. Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83, право име)",
-       "right-editmyprivateinfo": "Ñ\83Ñ\80еÑ\92иваÑ\9aе Ñ\81опÑ\81Ñ\82вениÑ\85 Ð¿Ñ\80иваÑ\82ниÑ\85 Ð¿Ð¾Ð´Ð°Ñ\82ака (нпÑ\80. Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е, правог имена)",
+       "right-viewmyprivateinfo": "пÑ\80еглед Ñ\81опÑ\81Ñ\82вениÑ\85 Ð¿Ñ\80иваÑ\82ниÑ\85 Ð¿Ð¾Ð´Ð°Ñ\82ака (нпÑ\80. Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е, право име)",
+       "right-editmyprivateinfo": "Ñ\83Ñ\80еÑ\92иваÑ\9aе Ñ\81опÑ\81Ñ\82вениÑ\85 Ð¿Ñ\80иваÑ\82ниÑ\85 Ð¿Ð¾Ð´Ð°Ñ\82ака (нпÑ\80. Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е, правог имена)",
        "right-editmyoptions": "уређивање сопствених подешавања",
        "right-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу",
        "right-markbotedits": "означавање враћених измена као измене бота",
        "right-userrights-interwiki": "уређивање корисничких права на другим викијима",
        "right-siteadmin": "закључавање и откључавање базе података",
        "right-override-export-depth": "извоз страница укључујући и повазене странице до дубине од пет веза",
-       "right-sendemail": "Ñ\81лаÑ\9aе Ð¸Ð¼ÐµÑ\98ла другим корисницима",
+       "right-sendemail": "Ñ\81лаÑ\9aе Ðµ-поÑ\80Ñ\83ка другим корисницима",
        "right-managechangetags": "прављење и (де)активирање [[Special:Tags|ознака]]",
        "right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије промене",
        "right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним изменама и уносима у дневницима",
        "grant-group-page-interaction": "Уређивање страница",
        "grant-group-file-interaction": "Интеракција са медијима",
        "grant-group-watchlist-interaction": "Уређивање вашег списка надгледања",
-       "grant-group-email": "Ð\9fоÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л",
+       "grant-group-email": "Ð\9fоÑ\88аÑ\99и Ðµ-поÑ\80Ñ\83кÑ\83",
        "grant-group-high-volume": "Извршавање великог броја радњи",
        "grant-group-customization": "Прилагођавање и подешавања",
        "grant-group-administration": "Извршавање административних радњи",
        "grant-privateinfo": "Приступи приватним информацијама",
        "grant-protect": "Закључавање и откључавање страница",
        "grant-rollback": "Враћање промена на страницама",
-       "grant-sendemail": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98лова другим корисницима",
+       "grant-sendemail": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ка другим корисницима",
        "grant-uploadeditmovefile": "Отпремање, замена и премештање датотека",
        "grant-uploadfile": "Отпремање нових датотека",
        "grant-basic": "Основна права",
        "action-userrights": "уређујете сва корисничка права",
        "action-userrights-interwiki": "уређујете корисничка права корисника на другим викијима",
        "action-siteadmin": "закључавате или откључавате базу података",
-       "action-sendemail": "Ñ\88аÑ\99еÑ\82е Ð¸Ð¼ÐµÑ\98лове",
+       "action-sendemail": "Ñ\88аÑ\99еÑ\82е Ðµ-поÑ\80Ñ\83ке",
        "action-editmyoptions": "уређујете сопствена подешавања",
        "action-editmywatchlist": "уређујете сопствени списак надгледања",
        "action-viewmywatchlist": "прегледате сопствени списак надгледања",
        "recentchanges-timeout": "Ова претрага је истекла. Можда желите да покушате другачије параметре претраге.",
        "recentchanges-network": "Због техничког проблема, није могуће учитати резултате. Покушајте да освежите страницу.",
        "recentchanges-notargetpage": "Унесите име странице изнад да бисте видели промене сродне с овом страницом",
-       "recentchanges-feed-description": "Ð\9fÑ\80аÑ\82иÑ\82е Ð½Ð°Ñ\98Ñ\81коÑ\80иÑ\98е промене на викију у овом фиду.",
+       "recentchanges-feed-description": "Ð\9fÑ\80аÑ\82иÑ\82е Ð½ÐµÐ´Ð°Ð²Ð½е промене на викију у овом фиду.",
        "recentchanges-label-newpage": "Нова страница",
        "recentchanges-label-minor": "Мања измена",
        "recentchanges-label-bot": "Ботовска измена",
        "upload-options": "Опције отпремања",
        "watchthisupload": "Надгледај ову датотеку",
        "filewasdeleted": "Датотека са овим именом је раније оптремљена и након тога избрисана.\nТребате да проверите $1 пре него што наставите са њеним поновним оптремањем.",
-       "filename-thumb-name": "Ово изгледа као назив сличице. Молимо вас да не отпремате сличице на исти вики. У супротном, молимо вас, поправите име датотеке тако да је корисније и нема префикс сличице.",
+       "filename-thumb-name": "Ово изгледа као наслов сличице. Не отпремајте сличице на исти вики. У супротном, поправите име датотеке тако да је корисније и нема префикс сличице.",
        "filename-bad-prefix": "Назив датотеке коју шаљете почиње са <strong>„$1“</strong>, а њега обично додељују дигитални фотоапарати.\nИзаберите назив датотеке који описује њен садржај.",
        "filename-prefix-blacklist": " #<!-- оставите овај ред онаквим какав јесте --> <pre>\n# Синтакса је следећа:\n#   * Све од тарабе па до краја реда је коментар\n#   * Сваки ред означава префикс типичних назива датотека које додељивају дигитални апарати\nCIMG # Касио\nDSC_ # Никон\nDSCF # Фуџи\nDSCN # Никон\nDUW # неки мобилни телефони\nIMG # опште\nJD # Џеноптик\nMGP # Пентакс\nPICT # разно\n #</pre> <!-- оставите овај ред онаквим какав јесте -->",
        "upload-proto-error": "Неважећи протокол",
        "upload-too-many-redirects": "Адреса садржи превише преусмерења",
        "upload-http-error": "Дошло је до HTTP грешке: $1",
        "upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.",
-       "upload-dialog-disabled": "Ð\9fоÑ\81Ñ\82авÑ\99аÑ\9aе Ð´Ð°Ñ\82оÑ\82ека Ð¿Ð¾Ð¼Ð¾Ñ\9bÑ\83 Ð¾Ð²Ð¾Ð³ Ð´Ð¸Ñ\98алога Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bено на овом викију.",
+       "upload-dialog-disabled": "Ð\9eÑ\82пÑ\80емаÑ\9aа Ð´Ð°Ñ\82оÑ\82ека ÐºÐ¾Ñ\80иÑ\88Ñ\9bеÑ\9aем Ð¾Ð²Ð¾Ð³ Ð´Ð¸Ñ\98алога Ñ\81Ñ\83 Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bена на овом викију.",
        "upload-dialog-title": "Отпремање датотеке",
        "upload-dialog-button-cancel": "Откажи",
        "upload-dialog-button-back": "Назад",
        "lockmanager-fail-closelock": "Није могуће затворити катанац за „$1”.",
        "lockmanager-fail-deletelock": "Није могуће избрисати катанац за „$1”.",
        "lockmanager-fail-acquirelock": "Није могуће стећи катанац за „$1”.",
-       "lockmanager-fail-openlock": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9c. Ð£Ð²ÐµÑ\80иÑ\82е Ñ\81е Ð´Ð° Ñ\98е Ð²Ð°Ñ\88 Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\98Ñ\83м Ð·Ð° Ð¾Ñ\82пÑ\80емаÑ\9aе Ð¸Ñ\81пÑ\80авно ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80иÑ\81ан Ð¸ Ð´Ð° Ð²Ð°Ñ\88 Ð²ÐµÐ±-Ñ\81еÑ\80веÑ\80 Ð¸Ð¼Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ð¿Ð¸Ñ\88е у том директоријуму. Погледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory за више информација.",
+       "lockmanager-fail-openlock": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82воÑ\80иÑ\82и ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9d. Ð£Ð²ÐµÑ\80иÑ\82е Ñ\81е Ð´Ð° Ñ\98е Ð²Ð°Ñ\88 Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\98Ñ\83м Ð·Ð° Ð¾Ñ\82пÑ\80емаÑ\9aе Ð¸Ñ\81пÑ\80авно ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80иÑ\81ан Ð¸ Ð´Ð° Ð²Ð°Ñ\88 Ð²ÐµÐ±-Ñ\81еÑ\80веÑ\80 Ð¸Ð¼Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ñ\83пиÑ\81Ñ\83Ñ\98е у том директоријуму. Погледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory за више информација.",
        "lockmanager-fail-releaselock": "Није могуће ослободити катанац за „$1”.",
        "lockmanager-fail-db-bucket": "Није могуће контактирати са довољно катанаца у канти $1.",
        "lockmanager-fail-db-release": "Није могуће ослободити катанце у бази података $1.",
        "zip-bad": "Датотека је оштећена или је нечитљива ZIP датотека.\nБезбедносна провера не може да се изврши како треба.",
        "zip-unsupported": "Датотека је формата ZIP који користи функције ZIP које Медијавики не подржава.\nНе може се правилно проверити у вези безбедности.",
        "uploadstash": "Отпремање низа датотека",
-       "uploadstash-summary": "Ова страница пружа приступ датотекама које су отпремљене или се отпремају, али још нису објављене. Ове датотеке нису видљиве никоме, осим кориснику који их је отпремио.",
+       "uploadstash-summary": "Ова страница пружа приступ датотекама које су отпремљене или су у процесу отпремања, али још нису објављене на вики. Ове датотеке нису видљиве никоме, осим кориснику који их је отпремио.",
        "uploadstash-clear": "Обриши низ датотека",
        "uploadstash-nofiles": "Немате сакривене датотеке.",
        "uploadstash-badtoken": "Извршавање ове радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.",
        "trackingcategories-nodesc": "Опис није доступан.",
        "trackingcategories-disabled": "Категорија је онемогућена",
        "mailnologin": "Нема адресе за слање",
-       "mailnologintext": "Ð\9cоÑ\80аÑ\82е Ð±Ð¸Ñ\82и [[Special:UserLogin|пÑ\80иÑ\98авÑ\99ени]] Ð¸ Ð¸Ð¼Ð°Ñ\82и Ð²Ð°Ñ\99анÑ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\83 [[Special:Preferences|подеÑ\88аваÑ\9aима]] Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\81лали Ð¸Ð¼ÐµÑ\98лове другим корисницима.",
-       "emailuser": "Ð\9fоÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л овом кориснику/ци",
-       "emailuser-title-target": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла {{GENDER:$1|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ници}}",
-       "emailuser-title-notarget": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла ÐºÐ¾Ñ\80иÑ\81никÑ\83",
+       "mailnologintext": "Ð\9cоÑ\80аÑ\82е Ð´Ð° Ñ\81е [[Special:UserLogin|пÑ\80иÑ\98авиÑ\82е]] Ð¸ Ð¸Ð¼Ð°Ñ\82е Ð²Ð°Ð¶ÐµÑ\9bи Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е Ñ\83 [[Special:Preferences|подеÑ\88аваÑ\9aима]] Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\81лали Ðµ-поÑ\80Ñ\83ке другим корисницима.",
+       "emailuser": "Ð\9fоÑ\88аÑ\99и Ðµ-поÑ\80Ñ\83кÑ\83 овом кориснику/ци",
+       "emailuser-title-target": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ке {{GENDER:$1|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и|коÑ\80иÑ\81никÑ\83/ци}}",
+       "emailuser-title-notarget": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ке ÐºÐ¾Ñ\80иÑ\81никÑ\83\86и",
        "emailpagetext": "Можете да користите доњи образац да пошаљете имејл {{GENDER:$1|овом кориснику|овој корисници}}.\nИмејл који сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
-       "defemailsubject": "{{SITENAME}} â\80\94 Ð\98меÑ\98л Ð¾Ð´ {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81нице}} „$1”",
-       "usermaildisabled": "Ð\9aоÑ\80иÑ\81ниÑ\87ки Ð¸Ð¼ÐµÑ\98л Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bен",
-       "usermaildisabledtext": "Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\88аÑ\99еÑ\82е Ð¸Ð¼ÐµÑ\98лове другим корисницима на овом викију",
-       "noemailtitle": "Ð\9dема Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е",
-       "noemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ð½Ð¸Ñ\98е Ð½Ð°Ð²ÐµÐ¾ Ð²Ð°Ð¶ÐµÑ\9bÑ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83.",
-       "nowikiemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ñ\98е Ð¾Ð´Ð»Ñ\83Ñ\87ио Ð´Ð° Ð½Ðµ Ð¿Ñ\80има Ð¸Ð¼ÐµÑ\98лове од других корисника.",
+       "defemailsubject": "{{SITENAME}} â\80\94 Ðµ-поÑ\80Ñ\83ка Ð¾Ð´ {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86е|коÑ\80иÑ\81ника/це}} „$1”",
+       "usermaildisabled": "Ð\9aоÑ\80иÑ\81ниÑ\87ка Ðµ-поÑ\88Ñ\82а Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bена",
+       "usermaildisabledtext": "Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\88аÑ\99еÑ\82е Ðµ-поÑ\80Ñ\83ке другим корисницима на овом викију",
+       "noemailtitle": "Ð\9dема Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е",
+       "noemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ð½Ð¸Ñ\98е Ð½Ð°Ð²ÐµÐ¾ Ð²Ð°Ð¶ÐµÑ\9bÑ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е.",
+       "nowikiemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ñ\98е Ð¾Ð´Ð°Ð±Ñ\80ао Ð´Ð° Ð½Ðµ Ð¿Ñ\80има Ðµ-поÑ\80Ñ\83ке од других корисника.",
        "emailnotarget": "Непостојеће или наважеће корисничко име примаоца.",
        "emailtarget": "Унос корисничког имена примаоца",
        "emailusername": "Корисничко име:",
        "emailusernamesubmit": "Пошаљи",
-       "email-legend": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла Ð´Ñ\80Ñ\83гом ÐºÐ¾Ñ\80иÑ\81никÑ\83 пројекта {{SITENAME}}",
+       "email-legend": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ке ÐºÐ¾Ñ\80иÑ\81никÑ\83\86и пројекта {{SITENAME}}",
        "emailfrom": "Од:",
        "emailto": "За:",
        "emailsubject": "Тема:",
        "emailmessage": "Порука:",
        "emailsend": "Пошаљи",
-       "emailccme": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ ÐºÐ¾Ð¿Ð¸Ñ\98Ñ\83 Ð¿Ð¾Ñ\80Ñ\83ке Ð½Ð° Ð¼Ð¾Ñ\98 Ð¸Ð¼ÐµÑ\98л.",
+       "emailccme": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 Ñ\81а ÐºÐ¾Ð¿Ð¸Ñ\98ом Ð¼Ð¾Ñ\98е Ð¿Ð¾Ñ\80Ñ\83ке.",
        "emailccsubject": "Копија поруке кориснику/ци $1: $2",
-       "emailsent": "Ð\98меÑ\98л Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82",
-       "emailsenttext": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л порука је послата.",
-       "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу опције „{{int:emailuser}}“ на викију {{SITENAME}}. Ако одговорите на овај имејл, {{GENDER:$2|Ваш}} имејл ће бити непосредно прослеђен ка {{GENDER:$1|првобитном пошиљаоцу}}, чиме ћете {{GENDER:$2|му|јој}} открити {{GENDER:$2|своју}} имејл адресу.",
+       "emailsent": "Ð\95-поÑ\80Ñ\83ка Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а",
+       "emailsenttext": "Ð\92аÑ\88а Ðµ-порука је послата.",
+       "emailuserfooter": "Ову е-поруку је {{GENDER:$1|послао|послала|послао/ла}} $1 {{GENDER:$2|кориснику|корисници|кориснику/ци}} $2 помоћу опције „{{int:emailuser}}” на пројекту {{SITENAME}}. Ако одговорите на ову е-поруку, {{GENDER:$2|ваша}} е-порука биће непосредно прослеђена ка {{GENDER:$1|оригиналном пошиљаоцу}}, чиме ћете {{GENDER:$2|му|јој}} открити {{GENDER:$2|адресу е-поште}}.",
        "usermessage-summary": "Слање системске поруке.",
        "usermessage-editor": "Уређивач системских порука",
        "usermessage-template": "MediaWiki:UserMessage",
        "notanarticle": "Није страница са садржајем",
        "notvisiblerev": "Последња измена другог корисника је избрисана.",
        "watchlist-details": "Имате {{PLURAL:$1|$1 страницу|$1 странице|$1 страница}} на свом списку надгледања (плус странице за разговор).",
-       "wlheader-enotif": "Ð\9eбавеÑ\88Ñ\82еÑ\9aе Ð¸Ð¼ÐµÑ\98лом је омогућено.",
+       "wlheader-enotif": "Ð\9eбавеÑ\88Ñ\82аваÑ\9aе Ðµ-поÑ\80Ñ\83ком је омогућено.",
        "wlheader-showupdated": "Странице које су промењене откад сте их последњи пут посетили су <strong>подебљане</strong>.",
        "wlnote": "Испод {{PLURAL:$1|је последња промена|су последње <strong>$1</strong> промене|је последњих <strong>$1</strong> промена}} у {{PLURAL:$2|претходном сату|претходна <strong>$2</strong> сата|претходних <strong>$2</strong> сати}}, закључно са $3, $4.",
        "wlshowlast": "Прикажи последњих $1 сати, $2 дана",
        "ipbreason-dropdown": "*Најчешћи разлози за блокирање\n** Уметање лажних информација\n** Уклањање садржаја са страница\n** Додавање непожељних веза до спољашњих сајтова\n** Уношење бесмислица/графита у странице\n** Непристојно понашање\n** Употреба више налога\n** Неприхватљиво корисничко име",
        "ipb-hardblock": "Спречи пријављене кориснике да уређују с ове IP адресе",
        "ipbcreateaccount": "Онемогући отварање налога",
-       "ipbemailban": "Спречи корисника да шаље имејлове",
+       "ipbemailban": "Спречи функцију слања е-поруке корисника",
        "ipbenableautoblock": "Аутоматски блокирај последњу IP адресу овог корисника и све даљње адресе с којих покуша да уређује",
        "ipbsubmit": "Блокирај овог корисника",
        "ipbother": "Друго време:",
        "anononlyblock": "само анонимни",
        "noautoblockblock": "аутоматско блокирање је онемогућено",
        "createaccountblock": "отварање налога је онемогућено",
-       "emailblock": "имеÑ\98л Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bен",
+       "emailblock": "е-поÑ\88Ñ\82а Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bена",
        "blocklist-nousertalk": "забрањено уређивање сопствене странице за разговор",
        "blocklist-editing": "уређивање",
        "blocklist-editing-sitewide": "уређивање (на целом сајту)",
        "unblocklink": "деблокирај",
        "change-blocklink": "промени блокаду",
        "contribslink": "доприноси",
-       "emaillink": "поÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л",
+       "emaillink": "поÑ\88аÑ\99и Ðµ-поÑ\80Ñ\83кÑ\83",
        "autoblocker": "Аутоматски сте блокирани јер делите IP адресу с корисником/цом [[User:$1|$1]].\nРазлог блокирања корисника/це $1 је „$2“",
        "blocklogpage": "Дневник блокирања",
        "blocklog-showlog": "{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана}}.\nДневник блокирања је наведен испод као референца:",
        "block-log-flags-anononly": "само анонимни корисници",
        "block-log-flags-nocreate": "онемогућено отварање налога",
        "block-log-flags-noautoblock": "аутоматско блокирање је онемогућено",
-       "block-log-flags-noemail": "имеÑ\98л Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bен",
+       "block-log-flags-noemail": "е-поÑ\88Ñ\82а Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bена",
        "block-log-flags-nousertalk": "забрањено уређивање сопствене странице за разговор",
        "block-log-flags-angry-autoblock": "проширено аутоматско блокирање је омогућено",
        "block-log-flags-hiddenname": "корисничко име је сакривено",
        "tooltip-ca-move": "Преместите ову страницу",
        "tooltip-ca-watch": "Додајте ову страницу на списак надгледања",
        "tooltip-ca-unwatch": "Уклоните ову страницу са списка надгледања",
-       "tooltip-search": "Претражите {{GRAMMAR:акузатив|{{SITENAME}}}}",
+       "tooltip-search": "Претражите пројекат {{SITENAME}}",
        "tooltip-search-go": "Идите на страницу са тачно овим именом ако постоји",
        "tooltip-search-fulltext": "Претражите странице са овим текстом",
        "tooltip-p-logo": "Посетите главну страну",
        "tooltip-feed-rss": "RSS фид за ову страницу",
        "tooltip-feed-atom": "Atom фид за ову страницу",
        "tooltip-t-contributions": "Списак доприноса {{GENDER:$1|овог корисника|ове кориснице|овог корисника}}",
-       "tooltip-t-emailuser": "Ð\9fоÑ\88аÑ\99иÑ\82е Ð¸Ð¼ÐµÑ\98л {{GENDER:$1|овом ÐºÐ¾Ñ\80иÑ\81никÑ\83|овоÑ\98 ÐºÐ¾Ñ\80иÑ\81ници}}",
+       "tooltip-t-emailuser": "Ð\9fоÑ\88аÑ\99иÑ\82е Ðµ-поÑ\80Ñ\83кÑ\83 {{GENDER:$1|овом ÐºÐ¾Ñ\80иÑ\81никÑ\83|овоÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\86и|коÑ\80иÑ\81никÑ\83/ци}}",
        "tooltip-t-info": "Више информација о овој страници",
        "tooltip-t-upload": "Отпремите датотеке",
        "tooltip-t-specialpages": "Списак свих посебних страница",
        "exif-urgency-other": "Прилагођени приоритет ($1)",
        "namespacesall": "сви",
        "monthsall": "све",
-       "confirmemail": "Ð\9fоÑ\82вÑ\80да Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е",
-       "confirmemail_noemail": "Ð\9dиÑ\81Ñ\82е Ð¿Ð¾Ñ\81Ñ\82авили Ð²Ð°Ð¶ÐµÑ\9bÑ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83 у [[Special:Preferences|корисничким подешавањима]].",
+       "confirmemail": "Ð\9fоÑ\82вÑ\80да Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е",
+       "confirmemail_noemail": "Ð\9dиÑ\81Ñ\82е Ð¿Ð¾Ñ\81Ñ\82авили Ð²Ð°Ð¶ÐµÑ\9bÑ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е у [[Special:Preferences|корисничким подешавањима]].",
        "confirmemail_text": "{{SITENAME}} захтева да проверите ваљаност имејл-адресе пре него што почнете да користите функцију имејла.\nАктивирајте дугме испод да бисте послали мејл за потврду на своју адресу.\nМејл ће укључивати везу са кодом;\nучитајте везу у свом прегледачу да бисте потврдили да је ваша имејл-адреса важећа.",
        "confirmemail_pending": "Код за потврду вам је већ послат имејлом.\nАко сте недавно отворили налог, можда треба да сачекате неколико минута да пристигне пре него што поново затражите нови код.",
        "confirmemail_send": "Пошаљи код за потврду",
        "confirmemail_sent": "Потврдна порука је послата.",
        "confirmemail_oncreate": "Кôд за потврду је послат на вашу имејл-адресу.\nОвај кôд није неопходан за пријављивање, али ћете морати да га наведете пре омогућавања било каквих функција заснованих на имејлу на викију.",
-       "confirmemail_sendfailed": "{{SITENAME}} Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99е Ð¸Ð¼ÐµÑ\98л Ð¿Ð¾Ñ\82вÑ\80дÑ\83.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\98е Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81а Ð¿Ñ\80авилно Ð½Ð°Ð¿Ð¸Ñ\81ана.\n\nÐ\93Ñ\80еÑ\88ка: $1",
+       "confirmemail_sendfailed": "{{SITENAME}} Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99е Ðµ-поÑ\80Ñ\83кÑ\83 Ð·Ð° Ð¿Ð¾Ñ\82вÑ\80дÑ\83.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\98е Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е Ñ\81адÑ\80жи Ð½ÐµÐ²Ð°Ð¶ÐµÑ\9bе Ð·Ð½Ð°ÐºÐµ.\n\nÐ\9fоÑ\88иÑ\99алаÑ\86 Ñ\98е Ð²Ñ\80аÑ\82ио Ð³Ñ\80еÑ\88кÑ\83: $1",
        "confirmemail_invalid": "Неважећи код за потврду.\nКод је можда истекао.",
-       "confirmemail_needlogin": "$1 да бисте потврдили своју имејл-адресу.",
-       "confirmemail_success": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81а је потврђена.\nСада можете да се [[Special:UserLogin|пријавите]] и уживате у викију.",
-       "confirmemail_loggedin": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81а је сада потврђена.",
-       "confirmemail_subject": "{{SITENAME}} â\80\93 Ð¿Ð¾Ñ\82вÑ\80да Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е",
+       "confirmemail_needlogin": "$1 да бисте потврдили адресу е-поште.",
+       "confirmemail_success": "Ð\92аÑ\88а Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е је потврђена.\nСада можете да се [[Special:UserLogin|пријавите]] и уживате у викију.",
+       "confirmemail_loggedin": "Ð\92аÑ\88а Ð°Ð´Ñ\80еÑ\81а Ðµ-поÑ\88Ñ\82е је сада потврђена.",
+       "confirmemail_subject": "{{SITENAME}} â\80\93 Ð¿Ð¾Ñ\82вÑ\80да Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е",
        "confirmemail_body": "Неко, вероватно Ви, са IP адресе $1,\nрегистровао је налог „$2“ са овом имејл адресом на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и активирали функцију имејла на пројекту {{SITENAME}}, отворите ова у прегледачу:\n\n$3\n\nАко ви *нисте* регистровали налог, пратите ову везу\nда бисте отказали потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче у $4.",
        "confirmemail_body_changed": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и поново активирали функцију имејла, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче $6 у $7",
        "confirmemail_body_set": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали\nфункцију имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче $4.",
-       "confirmemail_invalidated": "Ð\9fоÑ\82вÑ\80да Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81е је отказана",
-       "invalidateemail": "Ð\9eÑ\82казиваÑ\9aе Ð¿Ð¾Ñ\82вÑ\80де Ð¸Ð¼ÐµÑ\98ла",
+       "confirmemail_invalidated": "Ð\9fоÑ\82вÑ\80да Ð°Ð´Ñ\80еÑ\81е Ðµ-поÑ\88Ñ\82е је отказана",
+       "invalidateemail": "Ð\9eÑ\82казиваÑ\9aе Ð¿Ð¾Ñ\82вÑ\80де Ðµ-поÑ\88Ñ\82е",
        "notificationemail_subject_changed": "Регистрована имејл адреса на пројекту {{SITENAME}} је промењена",
        "notificationemail_subject_removed": "Регистрована имејл адреса на пројекту {{SITENAME}} је уклоњена",
        "notificationemail_body_changed": "Неко, вероватно Ви је променио имејл адресу налога из $2“ у „$3“ са IP адресе $1 на сајту {{SITENAME}}.\n\nАко ово нисте били Ви, одмах обавестите администраторе сајта.",
        "version-license-not-found": "За овај додатак није пронађена информација о лиценци.",
        "version-credits-title": "Заслуге за $1",
        "version-credits-not-found": "За овај додатак није пронађена информација о заслугама.",
-       "version-poweredby-credits": "Овај вики покреће '''[https://www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.",
+       "version-poweredby-credits": "Овај вики покреће <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, ауторска права © 2001-$1 $2.",
        "version-poweredby-others": "остали",
        "version-poweredby-translators": "translatewiki.net преводиоци",
        "version-credits-summary": "Желели бисмо да захвалимо следећим људима на њиховом доприносу [[Special:Version|Медијавикији]].",
        "log-action-filter-newusers-create": "отворио анониман корисник",
        "log-action-filter-newusers-create2": "отворио регистрован корисник",
        "log-action-filter-newusers-autocreate": "аутоматски отворен",
-       "log-action-filter-newusers-byemail": "оÑ\82ваÑ\80аÑ\9aе Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¾Ð¼ Ð¿Ð¾Ñ\81ланом Ð½Ð° Ð¸Ð¼ÐµÑ\98лÑ\83",
+       "log-action-filter-newusers-byemail": "оÑ\82ваÑ\80аÑ\9aе Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¾Ð¼ Ð¿Ð¾Ñ\81ланом Ðµ-поÑ\80Ñ\83ком",
        "log-action-filter-patrol-patrol": "ручно",
        "log-action-filter-patrol-autopatrol": "аутоматско",
        "log-action-filter-protect-protect": "закључавање",
        "authmanager-password-help": "Лозинка за потврду идентитета.",
        "authmanager-domain-help": "Домен за спољашњу потврду идентитета.",
        "authmanager-retype-help": "Поновите лозинку да би сте потврдили.",
-       "authmanager-email-label": "Ð\98меÑ\98л",
-       "authmanager-email-help": "Ð\98меÑ\98л-адÑ\80еÑ\81а",
+       "authmanager-email-label": "Ð\95-поÑ\88Ñ\82а",
+       "authmanager-email-help": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е:",
        "authmanager-realname-label": "Право име",
        "authmanager-realname-help": "Право име корисника",
        "authmanager-provider-password": "Потврда идентитета лозинком",
index 8217afb..29c7a57 100644 (file)
        "accmailtext": "Ett slumpgenererat lösenord för [[User talk:$1|$1]] har skickats till $2. Det kan ändras på sidan ''[[Special:ChangePassword|ändra lösenord]]'' när du loggar in.",
        "newarticle": "(Ny)",
        "newarticletext": "Du har klickat på en länk till en sida som inte finns ännu. För att skapa sidan, börja att skriva i fältet nedan (du kan läsa mer på [$1 hjälpsidan]). Om du kom hit av misstag kan du bara trycka på <strong>tillbaka</strong>-knappen i din webbläsare.",
-       "anontalkpagetext": "----<em>Detta är diskussionssidan för en anonym användare som inte ännu skapat ett konto, eller som inte använder det.</em>\nDärför måste vi använda den numeriska IP-adressen för att identifiera honom/henne.\nEn sådan IP-adress kan delas av flera användare.\nOm du är en anonym användare och känner att irrelevanta kommentarer har riktats mot dig, vänligen [[Special:CreateAccount|skapa ett konto]] eller [[Special:UserLogin|logga in]] för att undvika framtida förväxlingar med andra anonyma användare.",
+       "anontalkpagetext": "----<em>Detta är diskussionssidan för en anonym användare som inte ännu skapat ett konto, eller som inte använder det.</em>\nDärför måste vi använda den numeriska IP-adressen för att identifiera användaren.\nEn sådan IP-adress kan delas av flera användare.\nOm du är en anonym användare och känner att irrelevanta kommentarer har riktats mot dig, vänligen [[Special:CreateAccount|skapa ett konto]] eller [[Special:UserLogin|logga in]] för att undvika framtida förväxlingar med andra anonyma användare.",
        "noarticletext": "Det finns just nu ingen text på denna sida.\nDu kan [[Special:Search/{{PAGENAME}}|söka efter denna sidtitel]] på andra sidor, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar], eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} skapa denna sida]</span>.",
        "noarticletext-nopermission": "Det finns för tillfället ingen text på denna sida.\nDu kan [[Special:Search/{{PAGENAME}}|söka efter denna sidas titel]] på andra sidor,\neller <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar]</span> men du har inte behörighet att skapa sidan.",
        "missing-revision": "Version #$1 av sidan med namnet \"{{FULLPAGENAME}}\" finns inte.\n\nDetta orsakas vanligen genom att en gammal historiklänk följts till en sida som har raderats.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
        "grant-delete": "Radera sidor, revideringar och loggposter",
        "grant-editinterface": "Redigera JSON för MediaWiki-namnrymden och hela webbplatsen/användare",
        "grant-editmycssjs": "Redigera din egen CSS/JSON/JavaScript",
-       "grant-editmyoptions": "Redigera dina användarinställningar",
+       "grant-editmyoptions": "Redigera dina användarinställningar och JSON-konfiguration",
        "grant-editmywatchlist": "Redigera din bevakningslista",
        "grant-editsiteconfig": "Redigera CSS/JS för hela webbplatsen och användare",
        "grant-editpage": "Redigera befintliga sidor",
index 7520ac8..56c8692 100644 (file)
        "group-autoconfirmed.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทั่วไปเท่านั้น */",
        "group-bot.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่บอตเท่านั้น */",
        "group-sysop.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ดูแลเท่านั้น */",
-       "group-bureaucrat.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ดูแลสิทธิแต่งตั้งเท่านั้น */",
+       "group-bureaucrat.css": "/* à¸ªà¹\84à¸\95ลà¹\8cà¸\8aีà¸\95à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¸\88ะสà¹\88à¸\87à¸\9cลà¹\81à¸\81à¹\88à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aสิà¸\97à¸\98ิà¹\81à¸\95à¹\88à¸\87à¸\95ัà¹\89à¸\87à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99 */",
        "common.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทุกคนในทุกหน้า */",
        "group-autoconfirmed.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทั่วไปเท่านั้น */",
        "group-bot.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่บอตเท่านั้น */",
        "group-sysop.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ดูแลเท่านั้น */",
-       "group-bureaucrat.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ดูแลสิทธิแต่งตั้งเท่านั้น */",
+       "group-bureaucrat.js": "/* à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8cà¹\83à¸\94 à¹\86 à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¸\88ะà¸\96ูà¸\81à¹\82หลà¸\94à¹\83หà¹\89à¹\81à¸\81à¹\88à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aสิà¸\97à¸\98ิà¹\81à¸\95à¹\88à¸\87à¸\95ัà¹\89à¸\87à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99 */",
        "anonymous": "{{PLURAL:$1|ผู้ใช้|ผู้ใช้}}นิรนามของ{{SITENAME}}",
        "siteuser": "ผู้ใช้ $1 จาก {{SITENAME}}",
        "anonuser": "ผู้ใช้นิรนามจาก {{SITENAME}} $1",
        "pageinfo-magic-words": "{{PLURAL:$1|คำสั่งพิเศษ}} ($1)",
        "pageinfo-hidden-categories": "หมวดหมู่ที่ซ่อนอยู่ ($1)",
        "pageinfo-templates": "แม่แบบที่ใช้ ($1)",
-       "pageinfo-toolboxlink": "หà¸\99à¹\89าสารสà¸\99à¹\80à¸\97ศ",
+       "pageinfo-toolboxlink": "สารสà¸\99à¹\80à¸\97ศหà¸\99à¹\89า",
        "pageinfo-redirectsto": "เปลี่ยนทางไป",
        "pageinfo-redirectsto-info": "สนเทศ",
        "pageinfo-contentpage": "นับเป็นหน้าเนื้อหา",
index eec84ac..b56f9cc 100644 (file)
        "login-userblocked": "Hinarang ang tagagamit na ito.  Hindi pinahihintulutan ang paglalagda.",
        "wrongpassword": "Mali ang ipinasok na password o pangalan ng tagagamit.\nPakisubok muli.",
        "wrongpasswordempty": "Walang laman ang ipinasok na password.\nPakisubok muli.",
-       "passwordtooshort": "Ang mga password ay dapat mayroong {{PLURAL:$1|1 panitik|$1 panitik}} (karakter).",
+       "passwordtooshort": "Ang mga password ay kailangan di bababa sa $1 karakter.",
        "passwordtoolong": "Ang mga password ay hindi maaaring mas mahaba sa {{PLURAL:$1|1 panitik|$1 panitik}}.",
        "passwordtoopopular": "Hindi maaaring gamitin ang mga piniling pangkaraniwang password. Mangyaring pumili ng higit na natatanging password na mahirap hulaan.",
        "password-name-match": "Dapat magkaiba ang password mo sa bansag o username mo.",
index 61ecb45..5c856ee 100644 (file)
        "uploadstash-errclear": "Dosyaların silinmesi başarısız oldu.",
        "uploadstash-refresh": "Dosya listelerini yenile",
        "uploadstash-thumbnail": "küçük resmi görüntüle",
+       "uploadstash-bad-path": "Yol mevcut değil.",
+       "uploadstash-bad-path-invalid": "Yol geçerli değil.",
        "uploadstash-bad-path-unknown-type": "Bilinmeyen tür \"$1\".",
        "uploadstash-bad-path-unrecognized-thumb-name": "Tanınmayan başparmak adı.",
+       "uploadstash-file-not-found-no-thumb": "Küçük resim alınamadı.",
+       "uploadstash-file-not-found-no-local-path": "Ölçeklenmiş öge için yerel yol yok.",
+       "uploadstash-file-not-found-no-object": "Küçük resim için yerel dosya nesnesi oluşturulamadı.",
+       "uploadstash-file-not-found-no-remote-thumb": "Küçük resim alma başarısız oldu: $1\nURL = $2",
        "invalid-chunk-offset": "Geçersiz öbek ofset",
        "img-auth-accessdenied": "Erişim engellendi",
        "img-auth-nopathinfo": "Eksik path bilgilendirmesi.\nSunucunuz REQUEST_URI and/or PATH_INFO değişlenlerini geçirmek için ayarlanmış olmalıdır.\nEğer etkinse, $wgUsePathInfo'i etkinleştirmeyi deneyin.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization sayfasına bakın.",
        "pageinfo-display-title": "Görüntülenen başlık",
        "pageinfo-default-sort": "Varsayılan sıralama anahtarı",
        "pageinfo-length": "Sayfa uzunluğu (bayt cinsinden)",
+       "pageinfo-namespace": "Ad alanı",
        "pageinfo-article-id": "Sayfa ID",
        "pageinfo-language": "Sayfa içeriğinin dili",
+       "pageinfo-language-change": "değiştir",
        "pageinfo-content-model": "Sayfa içerik modeli",
        "pageinfo-content-model-change": "değiştir",
        "pageinfo-robot-policy": "Robotlar tarafından endeksleniyor",
        "pageinfo-watchers": "Sayfanın izleyici sayısı",
        "pageinfo-visiting-watchers": "Son değişiklikleri görüntüleyen izleyici sayısı",
        "pageinfo-few-watchers": "$1 {{PLURAL:$1|izleyiciden|izleyiciden}} az",
+       "pageinfo-few-visiting-watchers": "Son değişiklikleri izleyen bir kullanıcı olabilir veya olmayabilir",
        "pageinfo-redirects-name": "Bu sayfaya yönlendirme sayısı",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Bu sayfanın alt sayfaları",
        "tags-edit-reason": "Neden:",
        "tags-edit-revision-submit": "{{PLURAL:$1|Bu sürüme|$1 sürüme}} değişiklikleri uygula",
        "tags-edit-logentry-submit": "{{PLURAL:$1|Bu günlük kaydına|Bu $1 günlük kaydına}} değişiklikleri uygula",
-       "tags-edit-success": "Değişiklikler başarıyla uygulandı.",
+       "tags-edit-success": "Değişiklikler uygulandı.",
        "tags-edit-failure": "Değişiklikler uygulanamadı:\n$1",
        "tags-edit-nooldid-title": "Hedef sürüm geçersiz",
        "tags-edit-nooldid-text": "Bu işlemi gerçekleştirmek için herhangi bir hedef sürüm belirtmediniz, ya da belirtilen sürüm mevcut değil.",
        "htmlform-date-placeholder": "YYYY-AA-GG",
        "htmlform-time-placeholder": "SS:DD:SS",
        "htmlform-datetime-placeholder": "YYYY-AA-GG SS:DD:SS",
+       "htmlform-date-invalid": "Belirttiğiniz değer tanınan bir tarih değil. YYYY-AA-GG formatını kullanmayı deneyin.",
+       "htmlform-time-invalid": "Belirttiğiniz değer tanınan bir saat değil. SS:DD:SS formatını kullanmayı deneyin.",
        "htmlform-title-not-creatable": "\"$1\"oluşturulabilir bir sayfa ismi değil.",
        "htmlform-title-not-exists": "$1 mevcut değil.",
        "htmlform-user-not-exists": "<strong>$1</strong> mevcut değil.",
        "authform-notoken": "Eksik token",
        "authform-wrongtoken": "Yanlış token",
        "specialpage-securitylevel-not-allowed-title": "İzin verilmedi",
+       "authpage-cannot-login": "Giriş başlatılamıyor.",
        "credentialsform-account": "Hesap adı:",
        "edit-error-short": "Hata: $1",
        "edit-error-long": "Hatalar:\n\n$1",
index cdfc245..fc73611 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Ariyo",
                        "Arjunaraoc",
-                       "아라"
+                       "아라",
+                       "Mirzali"
                ]
        },
        "tog-oldsig": "Imḍa du3do:",
index 683fe07..b8dc840 100644 (file)
@@ -74,7 +74,7 @@
        "tog-watchlisthidebots": "زیرِنظر فہرست سے روبہ جاتی ترامیم چھپائیں",
        "tog-watchlisthideminor": "زیرِنظر فہرست سے معمولی ترامیم چھپائیں",
        "tog-watchlisthideliu": "زیرِنظر فہرست سے داخلِ نوشتہ شدہ صارفین کی ترامیم چھپائیں",
-       "tog-watchlistreloadautomatically": "کسÛ\8c Ù\85Ù\82طار Ù\85Û\8cÚº ØªØ¨Ø¯Û\8cÙ\84Û\8c Ú©Û\92 Ø¨Ø¹Ø¯ Ø²Û\8cر Ù\86ظر Ù\81Û\81رست Ú©Ù\88 Ø®Ù\88دکار Ø·Ù\88ر Ù¾Ø± ØªØ§Ø²Û\81 Ú©Ø±Û\8cÚº (جاÙ\88ا Ø§Ø³Ú©Ø±Ù¾Ù¹ Ø¯Ø±Ú©Ø§Ø±)",
+       "tog-watchlistreloadautomatically": "کسی مقطر میں تبدیلی کے بعد زیر نظر فہرست کو خودکار طور پر تازہ کریں (جاوا اسکرپٹ درکار)",
        "tog-watchlistunwatchlinks": "زیر نظر فہرست کے اندراجات میں زیر نظر کرنے اور ہٹانے کے براہ راست روابط شامل کریں (اس سہولت کے لیے جاوا اسکرپٹ درکار ہے)",
        "tog-watchlisthideanons": "زیرِنظر فہرست سے نامعلوم صارفین کی ترامیم چھپائیں",
        "tog-watchlisthidepatrolled": "زیرِنظر فہرست سے مراجع شدہ ترامیم چھپائیں",
        "suspicious-userlogout": "کھاتے سے خارج ہونے کی درخواست رد کر دی گئی ہے کیونکہ ایسا معلوم ہوتا ہے یہ درخواست کسی شکستہ براؤزر یا کیش (cache) کی حامل پراکسی سے بھیجی گئی تھی۔",
        "createacct-another-realname-tip": "حقیقی نام اختیاری ہے۔\nاگر آپ اسے فراہم کریں تو آپ کے کاموں کو اس نام سے منسوب کرنے کے لیے استعمال کیا جائے گا۔",
        "pt-login": "داخل ہوں",
-       "pt-login-button": "داخل ہو",
+       "pt-login-button": "داخل ہوں",
        "pt-login-continue-button": "داخل ہوں",
        "pt-createaccount": "کھاتا بنائیں",
        "pt-userlogout": "خارج ہوجائیں",
        "protectedtitles-submit": "دکھائیں",
        "listusers": "فہرست ارکان",
        "listusers-editsonly": "محض ترمیم کرنے والے صارفین دکھائیں",
+       "listusers-temporarygroupsonly": "محض عارضی حلقہ ہائے صارف میں شامل صارفین کو دکھائیں",
        "listusers-creationsort": "تاریخ تخلیق کے مطابق مرتب کریں",
        "listusers-desc": "نزولی ترتیب",
        "usereditcount": "$1 {{PLURAL:$1|ترمیم|ترامیم}}",
        "whatlinkshere-hidetrans": "استعمالات $1",
        "whatlinkshere-hidelinks": "روابط $1",
        "whatlinkshere-hideimages": "تصویر کے روابط $1",
-       "whatlinkshere-filters": "Ù\85Ù\82طارات",
+       "whatlinkshere-filters": "مقطرات",
        "whatlinkshere-submit": "ٹھیک",
        "autoblockid": "خودکار پابندی #$1",
        "block": "صارف مسدود کریں",
        "allmessagescurrent": "موجودہ متن",
        "allmessagestext": "ذیل میں میڈیاویکی نام فضا میں دستیاب نظامی پیغامات کی فہرست موجود ہے۔\nاگر آپ میڈیاویکی کا ترجمہ کرنا چاہتے ہیں تو [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation میڈیاویکی مقامیت کاری] اور [https://translatewiki.net translatewiki.net] ملاحظہ فرمائیں۔",
        "allmessagesnotsupportedDB": "اس صفحہ کو استعمال نہیں کیا جا سکتا کیونکہ <strong>$wgUseDatabaseMessages</strong> کو غیر فعال کر دیا گیا ہے۔",
-       "allmessages-filter-legend": "Ù\85Ù\82طار",
+       "allmessages-filter-legend": "مقطر",
        "allmessages-filter": "تلاش بلحاظ:",
        "allmessages-filter-unmodified": "غیر تبدیل شدہ",
        "allmessages-filter-all": "تمام",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|کا|کے}} گمنام {{PLURAL:$2|{{GENDER:$1|صارف}}|صارفین}} $1",
        "creditspage": "صفحہ کے انتسابات",
        "nocredits": "اس صفحہ کے انتسابات سے متعلق معلومات دستیاب نہیں ہیں۔",
-       "spamprotectiontitle": "Ù\85Ù\82طار Ù\81اضÙ\84 Ú©Ø§Ø±Û\8c",
-       "spamprotectiontext": "آپ جس عبارت کو محفوظ کرنا چاہتے ہیں اسے مقطار فاضل کاری نے ممنوع کر رکھا ہے۔\nعین ممکن ہے یہ فہرست سیاہ میں درج کسی بیرونی سائٹ کے ربط کی وجہ سے ہو رہا ہو۔",
-       "spamprotectionmatch": "Ø°Û\8cÙ\84 Ù\85Û\8cÚº Ù\85Ù\88جÙ\88د Ù\85تÙ\86 Ú©Ù\88 Ù\85Ù\82طار Ù\81اضÙ\84 Ú©Ø§Ø±Û\8c Ù\86Û\92 Ø±Ù\88Ú© Ø¯Û\8cا Û\81Û\92: $1",
+       "spamprotectiontitle": "مقطر فاضل کاری",
+       "spamprotectiontext": "آپ جس عبارت کو محفوظ کرنا چاہتے ہیں اس پر مقطر فاضل کاری نے پابندی عائد کر رکھی ہے۔\nعین ممکن ہے کہ فہرست سیاہ میں درج کسی بیرونی ویب سائٹ کے ربط کی وجہ سے ایسا ہو رہا ہو۔",
+       "spamprotectionmatch": "ذیل میں موجود متن کو مقطر فاضل کاری نے روک دیا ہے: $1",
        "spambot_username": "میڈیاویکی محافظ فاضل کاری",
        "spam_reverting": "اس آخری نسخہ کی جانب واپس پھیرا جا رہا ہے جس میں $1 کے روابط شامل نہیں",
        "spam_blanking": "$1 کے روابط پر مشتمل تمام نسخے، صفائی جاری ہے",
        "newimages": "نئی فائلوں کی گیلری",
        "imagelisttext": "ذیل میں $2 <strong>$1</strong> {{PLURAL:$1|فائل|فائلوں}} کی فہرست موجود ہے۔",
        "newimages-summary": "اس خصوصی صفحہ میں تازہ ترین اپلوڈ شدہ فائلوں کی فہرست موجود ہے۔",
-       "newimages-legend": "Ù\85Ù\82طار",
+       "newimages-legend": "مقطر",
        "newimages-label": "فائل کا نام (یا اس کا جزو):",
        "newimages-user": "آئی پی پتہ یا صارف نام",
        "newimages-newbies": "محض نئے کھاتوں کی شراکتیں دکھائیں",
        "intentionallyblankpage": "اس صفحہ کو دانستہ خالی چھوڑا گیا ہے۔",
        "external_image_whitelist": "#اس سطر کو ہو بہو ایسا ہی رہنے دیں<pre>\n#ذیل میں ریجیکس کی عبارتیں درج کریں (محض // کے درمیان)\n#ان عبارتوں کی بیرونی تصویروں کے روابط سے مطابقت کی جائے گی\n#جو مطابق ہو جائیں وہ تصویر کے طور پر نظر آئیں گے ورنہ محض تصویر کا ربط ظاہر ہوگا\n# علامت # سے شرع ہونے والی سطروں کو تبصرہ سمجھا جائے گا\n#چھوٹے بڑے حروف کو نظر انداز کیا جائے گا\n\nریجیکس کی تمام عبارتوں کو اس سطر کے اوپر رکھیں۔ اس سطر کو ہو بہو ایسا ہی رہنے دیں</pre>",
        "tags": "درست تبدیلی کے ٹیگ",
-       "tag-filter": "Ù\85Ù\82طار [[Special:Tags|Ù¹Û\8cÚ¯]]:",
-       "tag-filter-submit": "Ù\85Ù\82طار",
+       "tag-filter": "مقطر [[Special:Tags|ٹیگ]]:",
+       "tag-filter-submit": "مقطر",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|ٹیگ}}]]: $2",
        "tag-mw-contentmodelchange": "مواد کے ماڈل میں تبدیلی",
        "tag-mw-contentmodelchange-description": "ترامیم جو صفحہ کے [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel مواد کے ماڈل کو تبدیل کرتی ہیں]",
index 1e66cb3..f7fe6ca 100644 (file)
        "tags": "有效更改過嘅標籤",
        "tag-filter": "[[Special:Tags|標籤]]過濾器:",
        "tag-filter-submit": "過濾器",
-       "tag-list-wrapper": "[[Special:Tags|$1個標籤]]:$2",
+       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|標籤|標籤}}]]:$2",
        "tag-mw-new-redirect": "新跳轉",
        "tag-mw-removed-redirect": "剷走跳轉",
        "tag-mw-blank": "清空",
index 8a36055..e05f1b4 100644 (file)
        "prefs-email": "電子郵件選項",
        "prefs-rendering": "外觀",
        "saveprefs": "儲存",
-       "restoreprefs": "還原所有預設設定 (所有項目)",
+       "restoreprefs": "還原所有預設設定(所有項目)",
        "prefs-editing": "編輯",
        "searchresultshead": "搜尋",
        "stub-threshold": "短頁面連結格式門檻值 ($1):",
        "rollback-missingparam": "請求缺少必要參數。",
        "rollback-missingrevision": "無法載入修訂資料。",
        "cantrollback": "無法還原編輯;\n此頁面的最後貢獻者是唯一的作者。",
-       "alreadyrolled": "無法還原由 [[User:$2|$2]] ([[User talk:$2|對話]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]] 所作的最後一次編輯 [[:$1]],已有其他人編輯或還原了該頁面。\n\n最後一次編輯該頁面的使用者是 [[User:$3|$3]] ([[User talk:$3|對話]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
+       "alreadyrolled": "無法還原由[[User:$2|$2]]([[User talk:$2|對話]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])所作的最後一次編輯[[:$1]],已有其他人編輯或還原了該頁面。\n\n最後一次編輯該頁面的使用者是[[User:$3|$3]]([[User talk:$3|對話]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
        "editcomment": "編輯摘要為:<em>$1</em>。",
        "revertpage": "已還原[[Special:Contributions/$2|$2]]([[User talk:$2|對話]])的編輯為最後由[[User:$1|$1]]所修訂的版本",
        "revertpage-nouser": "已還原隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
        "blocklog-showsuppresslog": "此使用者先前被封鎖並且隱藏過。\n以下為禁止顯示紀錄以供參考:",
        "blocklogentry": "已封鎖 [[$1]] 的期限至 $2 $3",
        "reblock-logentry": "變更 [[$1]] 的封鎖設定,到期時間為 $2 $3",
-       "blocklogtext": "此為使用者的封鎖及取消封鎖動作的記錄。未列出自動封鎖的IP位址。請參考[[Special:BlockList|封鎖清單]]中的目前正在作業的阻止與封鎖。",
+       "blocklogtext": "此為使用者的封鎖及取消封鎖動作的記錄。未列出自動封鎖的IP位址。請參考[[Special:BlockList|封鎖清單]]中的目前正在運作的阻止與封鎖。",
        "unblocklogentry": "已解除封鎖 $1",
        "block-log-flags-anononly": "僅限匿名使用者",
        "block-log-flags-nocreate": "停用帳號建立",
index 9f8d8f8..9c7bc00 100644 (file)
@@ -7,15 +7,7 @@ DROP INDEX ct_log_id ON /*_*/change_tag;
 DROP INDEX ct_rev_id ON /*_*/change_tag;
 DROP INDEX ct_tag ON /*_*/change_tag;
 
-DROP INDEX ts_rc_id ON /*_*/tag_summary;
-DROP INDEX ts_log_id ON /*_*/tag_summary;
-DROP INDEX ts_rev_id ON /*_*/tag_summary;
-
 CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag);
 CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag);
 CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
 CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
diff --git a/maintenance/archives/patch-tag_summary-ts_id.sql b/maintenance/archives/patch-tag_summary-ts_id.sql
deleted file mode 100644 (file)
index 66fa72e..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
--- Primary key in tag_summary table
-
-ALTER TABLE /*$wgDBprefix*/tag_summary
-       ADD COLUMN ts_id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-       ADD PRIMARY KEY (ts_id);
diff --git a/maintenance/archives/patch-tag_summary-ts_log_id-unsigned.sql b/maintenance/archives/patch-tag_summary-ts_log_id-unsigned.sql
deleted file mode 100644 (file)
index 617073d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/tag_summary MODIFY ts_log_id int unsigned NULL;
\ No newline at end of file
diff --git a/maintenance/archives/patch-tag_summary-ts_rev_id-unsigned.sql b/maintenance/archives/patch-tag_summary-ts_rev_id-unsigned.sql
deleted file mode 100644 (file)
index e6a5bcd..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/tag_summary MODIFY ts_rev_id int unsigned NULL;
\ No newline at end of file
diff --git a/maintenance/archives/patch-tag_summary.sql b/maintenance/archives/patch-tag_summary.sql
deleted file mode 100644 (file)
index a81b368..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
--- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT that only works on MySQL 4.1+
--- Andrew Garrett, 2009-01
-CREATE TABLE /*_*/tag_summary (
-       ts_rc_id int NULL,
-       ts_log_id int NULL,
-       ts_rev_id int NULL,
-       ts_tags BLOB NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
diff --git a/maintenance/archives/patch-valid_tag.sql b/maintenance/archives/patch-valid_tag.sql
deleted file mode 100644 (file)
index 994a5d5..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
--- Andrew Garrett, 2009-01
-CREATE TABLE /*_*/valid_tag (
-       vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
diff --git a/maintenance/mssql/archives/patch-tag_summary-ts_id.sql b/maintenance/mssql/archives/patch-tag_summary-ts_id.sql
deleted file mode 100644 (file)
index d62bd35..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
--- Primary key in tag_summary table
-
-ALTER TABLE /*_*/tag_summary ADD ts_id INT IDENTITY;
-ALTER TABLE /*_*/tag_summary ADD CONSTRAINT pk_tag_summary PRIMARY KEY(ts_id)
index 371d80b..4bafc8b 100644 (file)
@@ -1,6 +1,6 @@
 -- Primary key and expiry column in user_groups table
 
 DROP INDEX IF EXISTS /*i*/ug_user_group ON /*_*/user_groups;
-ALTER TABLE /*_*/tag_summary ADD CONSTRAINT pk_user_groups PRIMARY KEY(ug_user, ug_group);
-ALTER TABLE /*_*/tag_summary ADD ug_expiry varchar(14) DEFAULT NULL;
+ALTER TABLE /*_*/user_groups ADD CONSTRAINT pk_user_groups PRIMARY KEY(ug_user, ug_group);
+ALTER TABLE /*_*/user_groups ADD ug_expiry varchar(14) DEFAULT NULL;
 CREATE INDEX /*i*/ug_expiry ON /*_*/user_groups(ug_expiry);
index fd2fae7..4ecc6db 100644 (file)
@@ -1411,29 +1411,6 @@ CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_
 -- Covering index, so we can pull all the info only out of the index.
 CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
--- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT
--- that only works on MySQL 4.1+
-CREATE TABLE /*_*/tag_summary (
-  ts_id int NOT NULL PRIMARY KEY IDENTITY,
-  -- RCID for the change
-  ts_rc_id int NULL REFERENCES /*_*/recentchanges(rc_id),
-  -- LOGID for the change
-  ts_log_id int NULL REFERENCES /*_*/logging(log_id),
-  -- REVID for the change
-  ts_rev_id int NULL REFERENCES /*_*/revision(rev_id),
-  -- Comma-separated list of tags
-  ts_tags nvarchar(max) NOT NULL
-);
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-
-
-CREATE TABLE /*_*/valid_tag (
-  vt_tag nvarchar(255) NOT NULL PRIMARY KEY
-);
-
 -- Table for storing localisation data
 CREATE TABLE /*_*/l10n_cache (
   -- Language code
diff --git a/maintenance/oracle/archives/patch-tag_summary-ts_id.sql b/maintenance/oracle/archives/patch-tag_summary-ts_id.sql
deleted file mode 100644 (file)
index 91c3338..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.tag_summary ADD (
-ts_id NUMBER NOT NULL,
-);
-ALTER TABLE &mw_prefix.tag_summary ADD CONSTRAINT &mw_prefix.tag_summary_pk PRIMARY KEY (ts_id);
index 4c36fe1..2c20fff 100644 (file)
@@ -946,23 +946,6 @@ CREATE UNIQUE INDEX &mw_prefix.change_tag_u06 ON &mw_prefix.change_tag (ct_rev_i
 
 CREATE INDEX &mw_prefix.change_tag_i02 ON &mw_prefix.change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
-CREATE TABLE &mw_prefix.tag_summary (
-  ts_id NUMBER NOT NULL,
-  ts_rc_id NUMBER NULL,
-  ts_log_id NUMBER NULL,
-  ts_rev_id NUMBER NULL,
-  ts_tags BLOB NOT NULL
-);
-ALTER TABLE &mw_prefix.tag_summary ADD CONSTRAINT &mw_prefix.tag_summary_pk PRIMARY KEY (ts_id);
-CREATE UNIQUE INDEX &mw_prefix.tag_summary_u01 ON &mw_prefix.tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX &mw_prefix.tag_summary_u02 ON &mw_prefix.tag_summary (ts_log_id);
-CREATE UNIQUE INDEX &mw_prefix.tag_summary_u03 ON &mw_prefix.tag_summary (ts_rev_id);
-
-CREATE TABLE &mw_prefix.valid_tag (
-  vt_tag VARCHAR2(255) NOT NULL
-);
-ALTER TABLE &mw_prefix.valid_tag ADD CONSTRAINT &mw_prefix.valid_tag_pk PRIMARY KEY (vt_tag);
-
 -- This table is not used unless profiling is turned on
 --CREATE TABLE &mw_prefix.profiling (
 --  pf_count   NUMBER          DEFAULT 0 NOT NULL,
index 9594137..6c46597 100644 (file)
@@ -34,7 +34,7 @@ class PopulateChangeTagDef extends LoggedUpdateMaintenance {
                $this->setBatchSize( 1000 );
                $this->addOption(
                        'sleep',
-                       'Sleep time (in seconds) between every batch',
+                       'Sleep time (in seconds) between every batch, defaults to zero',
                        false,
                        true
                );
@@ -197,7 +197,7 @@ class PopulateChangeTagDef extends LoggedUpdateMaintenance {
        private function backpopulateChangeTagPerTag( $tagName, $tagId ) {
                $dbr = $this->lbFactory->getMainLB()->getConnection( DB_REPLICA );
                $dbw = $this->lbFactory->getMainLB()->getConnection( DB_MASTER );
-               $sleep = (int)$this->getOption( 'sleep', 10 );
+               $sleep = (int)$this->getOption( 'sleep', 0 );
                $lastId = 0;
                $this->output( "Starting to add ct_tag_id = {$tagId} for ct_tag = {$tagName}\n" );
                while ( true ) {
diff --git a/maintenance/postgres/archives/patch-tag_summary.sql b/maintenance/postgres/archives/patch-tag_summary.sql
deleted file mode 100644 (file)
index 49e05e7..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-CREATE TABLE tag_summary (
-  ts_rc_id   INTEGER      NULL,
-  ts_log_id  INTEGER      NULL,
-  ts_rev_id  INTEGER      NULL,
-  ts_tags    TEXT     NOT NULL
-);
-CREATE UNIQUE INDEX tag_summary_rc_id ON tag_summary(ts_rc_id);
-CREATE UNIQUE INDEX tag_summary_log_id ON tag_summary(ts_log_id);
-CREATE UNIQUE INDEX tag_summary_rev_id ON tag_summary(ts_rev_id);
diff --git a/maintenance/postgres/archives/patch-valid_tag.sql b/maintenance/postgres/archives/patch-valid_tag.sql
deleted file mode 100644 (file)
index 98575c6..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-CREATE TABLE valid_tag (
-  vt_tag TEXT NOT NULL PRIMARY KEY
-);
index 02d018c..b6858c5 100644 (file)
@@ -28,7 +28,6 @@ DROP SEQUENCE IF EXISTS archive_ar_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS externallinks_el_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS sites_site_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS change_tag_ct_id_seq CASCADE;
-DROP SEQUENCE IF EXISTS tag_summary_ts_id_seq CASCADE;
 DROP FUNCTION IF EXISTS page_deleted() CASCADE;
 DROP FUNCTION IF EXISTS ts2_page_title() CASCADE;
 DROP FUNCTION IF EXISTS ts2_page_text() CASCADE;
@@ -812,23 +811,6 @@ CREATE UNIQUE INDEX change_tag_rev_tag_id ON change_tag(ct_rev_id,ct_tag_id);
 
 CREATE INDEX change_tag_tag_id_id ON change_tag(ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
-CREATE SEQUENCE tag_summary_ts_id_seq;
-CREATE TABLE tag_summary (
-  ts_id      INTEGER  NOT NULL  PRIMARY KEY DEFAULT nextval('tag_summary_ts_id_seq'),
-  ts_rc_id   INTEGER      NULL,
-  ts_log_id  INTEGER      NULL,
-  ts_rev_id  INTEGER      NULL,
-  ts_tags    TEXT     NOT NULL
-);
-ALTER SEQUENCE tag_summary_ts_id_seq OWNED BY tag_summary.ts_id;
-CREATE UNIQUE INDEX tag_summary_rc_id ON tag_summary(ts_rc_id);
-CREATE UNIQUE INDEX tag_summary_log_id ON tag_summary(ts_log_id);
-CREATE UNIQUE INDEX tag_summary_rev_id ON tag_summary(ts_rev_id);
-
-CREATE TABLE valid_tag (
-  vt_tag TEXT NOT NULL PRIMARY KEY
-);
-
 CREATE TABLE user_properties (
   up_user     INTEGER      NULL  REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
   up_property TEXT     NOT NULL,
diff --git a/maintenance/sqlite/archives/patch-tag_summary-ts_id.sql b/maintenance/sqlite/archives/patch-tag_summary-ts_id.sql
deleted file mode 100644 (file)
index b6a1202..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-DROP TABLE IF EXISTS /*_*/tag_summary_tmp;
-
-CREATE TABLE /*$wgDBprefix*/tag_summary_tmp (
-  ts_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  ts_rc_id int NULL,
-  ts_log_id int NULL,
-  ts_rev_id int NULL,
-  ts_tags blob NOT NULL
-);
-
-INSERT OR IGNORE INTO /*_*/tag_summary_tmp (
-    ts_rc_id, ts_log_id, ts_rev_id, ts_tags )
-    SELECT
-    ts_rc_id, ts_log_id, ts_rev_id, ts_tags
-    FROM /*_*/tag_summary;
-
-DROP TABLE /*_*/tag_summary;
-
-ALTER TABLE /*_*/tag_summary_tmp RENAME TO /*_*/tag_summary;
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
index 72db8c3..83ba4e2 100644 (file)
@@ -1859,28 +1859,6 @@ CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_
 -- Covering index, so we can pull all the info only out of the index.
 CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
--- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT
--- that only works on MySQL 4.1+
-CREATE TABLE /*_*/tag_summary (
-  ts_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  -- RCID for the change
-  ts_rc_id int NULL,
-  -- LOGID for the change
-  ts_log_id int unsigned NULL,
-  -- REVID for the change
-  ts_rev_id int unsigned NULL,
-  -- Comma-separated list of tags
-  ts_tags blob NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-
-
-CREATE TABLE /*_*/valid_tag (
-  vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
 
 -- Table for storing localisation data
 CREATE TABLE /*_*/l10n_cache (
index 04ed5d6..107ab33 100644 (file)
        /**
         * Replace $* with a list of parameters for &uselang=qqx.
         *
+        * @private
         * @since 1.33
         * @param {string} formatString Format string
         * @param {Array} parameters Values for $N replacements
         * @return {string} Transformed format string
         */
-       mw.transformFormatForQqx = function ( formatString, parameters ) {
+       mw.internalDoTransformFormatForQqx = function ( formatString, parameters ) {
                var parametersString;
                if ( formatString.indexOf( '$*' ) !== -1 ) {
                        parametersString = '';
         */
        mw.format = function ( formatString ) {
                var parameters = slice.call( arguments, 1 );
-               formatString = mw.transformFormatForQqx( formatString, parameters );
+               formatString = mw.internalDoTransformFormatForQqx( formatString, parameters );
                return formatString.replace( /\$(\d+)/g, function ( str, match ) {
                        var index = parseInt( match, 10 ) - 1;
                        return parameters[ index ] !== undefined ? parameters[ index ] : '$' + match;
index 8f1d563..18fb4a2 100644 (file)
@@ -87,6 +87,8 @@
        margin-right: @ooui-spacing-medium;
 }
 
+// First selector is flatlist specific
+.mw-htmlform-field-HTMLMultiSelectField.oo-ui-fieldLayout,
 .mw-htmlform-ooui .htmlform-tip,
 .mw-htmlform-ooui .mw-htmlform-submit-buttons {
        margin-top: @ooui-spacing-medium;
index 3dc09b7..540de23 100644 (file)
                                                wikiText = '⧼' + key + '⧽';
                                        }
                                }
-                               wikiText = mw.transformFormatForQqx( wikiText, replacements );
+                               wikiText = mw.internalDoTransformFormatForQqx( wikiText, replacements );
                                this.astCache[ key ] = this.wikiTextToAst( wikiText );
                        }
                        return this.astCache[ key ];
index cb05793..cb996f3 100644 (file)
@@ -1,9 +1,16 @@
 /* Special:AllMessages */
+#mw-allmessagestable tbody:hover td {
+       /* Duplicate of `.mw-datatable tr:hover td` from shared.css,
+        * so that it also applies when hovering a lower cell
+        * within the same rowspan */
+       background-color: #eaf3ff;
+}
+
 #mw-allmessagestable .am_default {
        background-color: #fcffc4;
 }
 
-#mw-allmessagestable tr:hover .am_default {
+#mw-allmessagestable tbody:hover .am_default {
        background-color: #faff90;
 }
 
@@ -11,7 +18,7 @@
        background-color: #e2ffe2;
 }
 
-#mw-allmessagestable tr:hover + tr .am_actual {
+#mw-allmessagestable tbody:hover .am_actual {
        background-color: #b1ffb1;
 }
 
index 2b61b65..a6b6de4 100644 (file)
                }
        }
 
-       &-empty &-handle {
-               color: @color-base--subtle;
-       }
-
        &.oo-ui-iconElement .mw-widgets-datetime-dateTimeInputWidget-handle {
                padding-left: @padding-start-input-text-icon-label;
        }
@@ -77,8 +73,7 @@
                .oo-ui-box-sizing( border-box );
                border: 0;
                border-radius: @border-radius-base;
-               // Provide more top padding due to border not being part of the calculation
-               padding-top: 10 / @ooui-font-size-browser / @ooui-font-size-base;
+               padding-top: @padding-top-base;
                padding-bottom: @padding-bottom-base;
                box-shadow: none;
                font-size: inherit;
                line-height: @line-height-widget-singleline;
                text-align: center;
                vertical-align: top;
+
+               // Day field, f.e. “Sat”
+               &:first-child {
+                       cursor: pointer;
+               }
+
+               // Day field & time zome field, f.e. “Sat” & “Z”
+               &[ tabindex='-1' ] {
+                       // Support: Firefox, Chrome
+                       outline: 0;
+               }
        }
 
        &-editField {
        }
 
        &-clearButton {
+               // Override `&-field` from above
                padding-top: 0;
+               padding-bottom: 0;
+               padding-left: @padding-start-button-clear;
+
+               // `&.oo-ui-iconElement` needed for specificity
+               &.oo-ui-iconElement > .oo-ui-buttonElement-button {
+                       padding-top: @padding-top-button-clear;
+               }
 
                .oo-ui-iconElement-icon {
                        background-size: @size-indicator @size-indicator;
                }
        }
 
+       &-empty {
+               .mw-widgets-datetime-dateTimeInputWidget-handle {
+                       color: @color-base--subtle;
+               }
+
+               .mw-widgets-datetime-dateTimeInputWidget-clearButton {
+                       display: none;
+               }
+       }
+
        &.oo-ui-widget-enabled {
                .mw-widgets-datetime-dateTimeInputWidget-handle {
                        .oo-ui-transition( border-color @transition-ease-medium );
index 58a5bc3..a0d6f4a 100644 (file)
 @padding-horizontal-base: 12 / @ooui-font-size-browser / @ooui-font-size-base;
 @padding-horizontal-input-text: 8 / @ooui-font-size-browser / @ooui-font-size-base;
 @padding-top-base: 8 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-top-button-clear: 28 / @ooui-font-size-browser / @ooui-font-size-base; // As it's inside an input, we need to reduce from borders surrounding
 @padding-bottom-base: 7 / @ooui-font-size-browser / @ooui-font-size-base;
 @padding-start-input-text-icon: 6 / @ooui-font-size-browser / @ooui-font-size-base;
 @padding-start-input-text-icon-label: 32 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-start-button-clear: 4 / @ooui-font-size-browser / @ooui-font-size-base;
 
 @border-base: 1px solid #a2a9b1;
 @border-color-base--disabled: #c8ccd1;
index 3fd6158..a7ae000 100644 (file)
@@ -14595,7 +14595,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[Image:foobar.jpg]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -14616,7 +14616,7 @@ Simple image (using File: namespace, now canonical)
 !! wikitext
 [[File:Foobar.jpg]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -14627,7 +14627,7 @@ Right-aligned image
 !! wikitext
 [[File:Foobar.jpg|right]]
 !! html/php
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure>
@@ -14638,7 +14638,7 @@ Image with caption
 !! wikitext
 [[File:Foobar.jpg|right|Caption text]]
 !! html/php
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>Caption text</figcaption></figure>
@@ -14649,7 +14649,7 @@ Image with caption, T55312 #1
 !! wikitext
 [[File:Foobar.jpg|right|Caption page stuff]]
 !! html/php
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page stuff"><img alt="Caption page stuff" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page stuff"><img alt="Caption page stuff" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>Caption page stuff</figcaption></figure>
@@ -14660,7 +14660,7 @@ Image with caption, T55312 #2
 !! wikitext
 [[File:Foobar.jpg|right|Caption page=]]
 !! html/php
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page="><img alt="Caption page=" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page="><img alt="Caption page=" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>Caption page=</figcaption></figure>
@@ -14671,7 +14671,7 @@ Image with caption, T55312 #3
 !! wikitext
 [[File:Foobar.jpg|right|Caption page=stuff]]
 !! html/php
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page=stuff"><img alt="Caption page=stuff" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page=stuff"><img alt="Caption page=stuff" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>Caption page=stuff</figcaption></figure>
@@ -14683,8 +14683,8 @@ Image caption with pipe entity
 [[File:Foobar.jpg|thumb|one &#x7C; two]]
 [[File:Foobar.jpg|thumb|one ''two'' &#x7C; three]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>one &#x7c; two</div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>one <i>two</i> &#x7c; three</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>one &#x7c; two</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>one <i>two</i> &#x7c; three</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>one <span typeof="mw:Entity">|</span> two</figcaption></figure>
@@ -14701,7 +14701,7 @@ thumbsize=220
 [[Link2]]
 ]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Caption <a href="/index.php?title=Link1&amp;action=edit&amp;redlink=1" class="new" title="Link1 (page does not exist)">Link1</a> [[]] <a href="/index.php?title=Link2&amp;action=edit&amp;redlink=1" class="new" title="Link2 (page does not exist)">Link2</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Caption <a href="/index.php?title=Link1&amp;action=edit&amp;redlink=1" class="new" title="Link1 (page does not exist)">Link1</a> [[]] <a href="/index.php?title=Link2&amp;action=edit&amp;redlink=1" class="new" title="Link2 (page does not exist)">Link2</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"Caption [[Link1]]\n[[]]\n[[Link2]]\n"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>Caption <a rel="mw:WikiLink" href="./Link1" title="Link1" data-parsoid='{"stx":"simple","a":{"href":"./Link1"},"sa":{"href":"Link1"}}'>Link1</a>
@@ -14715,7 +14715,7 @@ Titles in unlinked images (T23454)
 !! wikitext
 [[File:Foobar.jpg|link=|stuff]]
 !! html/php
-<p><img alt="stuff" src="http://example.com/images/3/3a/Foobar.jpg" title="stuff" width="1941" height="220" />
+<p><img alt="stuff" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" title="stuff" width="1941" height="220" />
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"stuff"}'><span><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></span></figure-inline></p>
@@ -14735,7 +14735,7 @@ Image with link trail
 !! wikitext
 Linktrails should not work for images: [[File:Foobar.jpg]]s
 !! html/php
-<p>Linktrails should not work for images: <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>s
+<p>Linktrails should not work for images: <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>s
 </p>
 !! html/parsoid
 <p>Linktrails should not work for images: <figure-inline class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline>s</p>
@@ -14748,7 +14748,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|right||Caption text]]
 !! html/php
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>Caption text</figcaption></figure>
@@ -14759,7 +14759,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|{{echo|137px}}|This is a caption]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" decoding="async" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption</div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt2" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"width","ak":"{{echo|137px}}"},{"ck":"caption","ak":"This is a caption"}]}' data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[24,38,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"137px\"}},\"i\":0}}]}&#39;>137px&lt;/span>"}]]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="16" width="137" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"16","width":"137"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>This is a caption</figcaption></figure>
@@ -14770,7 +14770,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|{{echo|thumb}}|{{echo|137px}}|This is a caption]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" decoding="async" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption</div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt3" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"{{echo|thumb}}"},{"ck":"width","ak":"{{echo|137px}}"},{"ck":"caption","ak":"This is a caption"}]}' data-mw='{"attribs":[["thumbnail",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[18,32,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"thumb\"}},\"i\":0}}]}&#39;>thumb&lt;/span>"}],["width",{"html":"&lt;span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[33,47,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"137px\"}},\"i\":0}}]}&#39;>137px&lt;/span>"}]]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="16" width="137" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"16","width":"137"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>This is a caption</figcaption></figure>
@@ -14781,7 +14781,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|{{echo|50px}}]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" decoding="async" width="50" height="6" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image mw:ExpandedAttrs" about="#mwt2" data-parsoid='{"optList":[{"ck":"width","ak":"{{echo|50px}}"}]}' data-mw='{"attribs":[["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[18,31,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"50px\"}},\"i\":0}}]}&#39;>50px&lt;/span>"}]]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -14794,7 +14794,7 @@ Image with multiple attributes from the same template
 !! wikitext
 [[File:Foobar.jpg|{{image_attribs}}]]
 !! html/php
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-right" typeof="mw:Image mw:Placeholder"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>Caption text</figcaption></figure>
@@ -14809,16 +14809,16 @@ thumbsize=220
 123[[File:Foobar.jpg|right]]456
 123[[File:Foobar.jpg|thumb]]456
 !! html/php
-<p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456
+<p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>456
 </p>
-123<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>456
-123<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div>456
+123<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>456
+123<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div>456
 
 !! html/php+tidy
-<p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456
+<p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>456
 </p><p>
-123</p><div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div><p>456
-123</p><div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div><p>456
+123</p><div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div><p>456
+123</p><div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div><p>456
 </p>
 !! html/parsoid
 <p>123<figure-inline class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline>456</p>
@@ -14831,7 +14831,7 @@ Image with multiple captions -- only last one is accepted
 !! wikitext
 [[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
 !! html/php
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption3 - accepted"><img alt="Caption3 - accepted" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption3 - accepted"><img alt="Caption3 - accepted" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>Caption3 - accepted</figcaption></figure>
@@ -14842,7 +14842,7 @@ Image with multiple widths -- use last
 !! wikitext
 [[File:Foobar.jpg|200px|300px|caption]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" width="300" height="34" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" decoding="async" width="300" height="34" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure-inline></p>
@@ -14857,8 +14857,8 @@ thumbsize=220
 
 [[File:Foobar.jpg|middle|text-top|caption]]
 !! html/php
-<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" style="vertical-align: middle" /></a>
+<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" style="vertical-align: middle" /></a>
 </p>
 !! html/parsoid
 <figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -14872,9 +14872,9 @@ Image with width attribute at different positions
 [[File:Foobar.jpg|right|200px|Caption]]
 [[File:Foobar.jpg|right|Caption|200px]]
 !! html/php
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" decoding="async" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" decoding="async" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" decoding="async" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
 
 !! html/parsoid
 <figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>Caption</figcaption></figure>
@@ -14891,8 +14891,8 @@ parsoid=wt2html,wt2wt,html2html
 [[File:Foobar.jpg|20pxpx]]
 [[File:Foobar.jpg|200x20pxpx]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
-<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/177px-Foobar.jpg" width="177" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/265px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/353px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" decoding="async" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
+<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/177px-Foobar.jpg" decoding="async" width="177" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/265px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/353px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="2" width="20"/></a></figure-inline> <figure-inline typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/177px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="20" width="177"/></a></figure-inline></p>
@@ -14903,7 +14903,7 @@ Image with link parameter, wiki target
 !! wikitext
 [[File:Foobar.jpg|link=Main Page]]
 !! html/php
-<p><a href="/wiki/Main_Page" title="Main Page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Main_Page" title="Main Page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image"><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -14915,7 +14915,7 @@ Image with link parameter, URL target
 !! wikitext
 [[File:Foobar.jpg|link=http://example.com/]]
 !! html/php
-<p><a href="http://example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -14927,7 +14927,7 @@ Image with link parameter, protocol-less URL target
 !! wikitext
 [[File:Foobar.jpg|link=//example.com/]]
 !! html/php
-<p><a href="//example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="//example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image"><a href="//example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -14956,7 +14956,7 @@ Image with link parameter, wgExternalLinkTarget
 !! config
 wgExternalLinkTarget='foobar'
 !! html/php
-<p><a href="http://example.com/" target="foobar" rel="nofollow noreferrer noopener"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/" target="foobar" rel="nofollow noreferrer noopener"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! end
 
@@ -14967,7 +14967,7 @@ Image with link parameter, wgNoFollowLinks set to false
 !! config
 wgNoFollowLinks=false
 !! html/php
-<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! end
 
@@ -14978,7 +14978,7 @@ Image with link parameter, wgNoFollowDomainExceptions
 !! config
 wgNoFollowDomainExceptions='example.com'
 !! html/php
-<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! end
 
@@ -14990,7 +14990,7 @@ Image with link parameter, wgExternalLinkTarget, unnamed parameter
 !! config
 wgExternalLinkTarget='foobar'
 !! html/php
-<p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow noreferrer noopener"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow noreferrer noopener"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! end
 
@@ -14999,7 +14999,7 @@ Image with empty link parameter
 !! wikitext
 [[File:Foobar.jpg|link=]]
 !! html/php
-<p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" />
+<p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" />
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image"><span><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></span></figure-inline></p>
@@ -15010,7 +15010,7 @@ Image with link parameter (wiki target) and unnamed parameter
 !! wikitext
 [[File:Foobar.jpg|link=Main_Page|Title]]
 !! html/php
-<p><a href="/wiki/Main_Page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Main_Page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -15021,7 +15021,7 @@ Image with link parameter (URL target) and unnamed parameter
 !! wikitext
 [[File:Foobar.jpg|link=http://example.com/|Title]]
 !! html/php
-<p><a href="http://example.com/" title="Title" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/" title="Title" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -15035,7 +15035,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|link=http://example.com/|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>Title</figcaption></figure>
@@ -15048,7 +15048,7 @@ thumbsize=220
 !! wikitext
 [[File:Foobar.jpg|thumbnail=Thumb.png|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" decoding="async" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
@@ -15062,7 +15062,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb=Thumb.png|link=Main_Page|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" decoding="async" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
@@ -15076,7 +15076,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb=Thumb.png|link=http://example.com|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" decoding="async" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="http://example.com"><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
@@ -15090,7 +15090,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb=Thumb.png|link=|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" />  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" decoding="async" width="135" height="135" class="thumbimage" />  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><span><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></span><figcaption>Title</figcaption></figure>
@@ -15104,7 +15104,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb=Thumb.png|link=Main_Page|alt=alttext|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" decoding="async" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="./Main_Page"><img alt="alttext" resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
@@ -15117,7 +15117,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
 !! html/php
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></figcaption></figure>
@@ -15130,7 +15130,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
 !! html/php
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img alt="Altitude" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></figcaption></figure>
@@ -15143,8 +15143,8 @@ Image with wiki markup in implicit alt
 
 [[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"testing &#39;&#39;&#39;bold&#39;&#39;&#39; in alt"}]}' data-mw='{"caption":"testing &lt;b data-parsoid=&#39;{\"dsr\":[27,37,3,3]}&#39;>bold&lt;/b> in alt"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -15157,7 +15157,7 @@ Alt image option should handle most kinds of wikitext without barfing
 !! wikitext
 [[Image:Foobar.jpg|thumb|This is the image caption|alt=This is a [[link]] and a {{echo|''bold template''}}.]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a link and a bold template." src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is the image caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a link and a bold template." src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is the image caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt2" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"This is the image caption"},{"ck":"alt","ak":"alt=This is a [[link]] and a {{echo|&apos;&apos;bold template&apos;&apos;}}."}]}' data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["alt",{"html":"alt=This is a &lt;a rel=\"mw:WikiLink\" href=\"./Link\" title=\"Link\" data-parsoid=&apos;{\"stx\":\"simple\",\"a\":{\"href\":\"./Link\"},\"sa\":{\"href\":\"link\"},\"dsr\":[65,73,2,2]}&apos;>link&lt;/a> and a &lt;i about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&apos;{\"dsr\":[80,106,null,null],\"pi\":[[{\"k\":\"1\"}]]}&apos; data-mw=&apos;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&amp;apos;&amp;apos;bold template&amp;apos;&amp;apos;\"}},\"i\":0}}]}&#39;>bold template&lt;/i>."}]]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img alt="This is a link and a bold template." resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"alt":"This is a link and a bold template.","resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"alt":"alt=This is a [[link]] and a {{echo|&#39;&#39;bold template&#39;&#39;}}.","resource":"Image:Foobar.jpg"}}'/></a><figcaption>This is the image caption</figcaption></figure>
@@ -15177,11 +15177,11 @@ parsoid = {
 File:Foobar.jpg|alt=&amp;amp;
 </gallery>
 !! html/php+tidy
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="&amp;amp;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="&amp;amp;" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="&amp;amp;" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="&amp;amp;" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -15208,11 +15208,11 @@ Italics markup in alt attribute (T206940)
 File:Foobar.jpg|alt=''x''|caption
 </gallery>
 !! html/php+tidy
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="x" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="x" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="x" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="x" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>caption
 </p>
@@ -15241,11 +15241,11 @@ Nowiki markup in alt attribute (T206940)
 File:Foobar.jpg|alt=<nowiki>''</nowiki>x<nowiki>''</nowiki>|caption
 </gallery>
 !! html/php+tidy
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="&#39;&#39;x&#39;&#39;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="&#39;&#39;x&#39;&#39;" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="&#39;&#39;x&#39;&#39;" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="&#39;&#39;x&#39;&#39;" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>caption
 </p>
@@ -15278,11 +15278,11 @@ parsoid = {
 File:Foobar.jpg|alt=<nowiki>''x''</nowiki>|caption
 </gallery>
 !! html/php+tidy
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="&#39;&#39;x&#39;&#39;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="&#39;&#39;x&#39;&#39;" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="&#39;&#39;x&#39;&#39;" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="&#39;&#39;x&#39;&#39;" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>caption
 </p>
@@ -15311,11 +15311,11 @@ Ampersand in link attribute (T206940)
 File:Foobar.jpg|link=Foo &amp; bar
 </gallery>
 !! html/php+tidy
-<p><a href="/wiki/Foo_%26_bar" title="Foo &amp; bar"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Foo_%26_bar" title="Foo &amp; bar"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Foo_%26_bar"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Foo_%26_bar"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -15346,11 +15346,11 @@ parsoid = {
 File:Foobar.jpg|link=Foo_&_bar
 </gallery>
 !! html/php+tidy
-<p><a href="/wiki/Foo_%26_bar" title="Foo &amp; bar"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Foo_%26_bar" title="Foo &amp; bar"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Foo_%26_bar"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Foo_%26_bar"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -15384,19 +15384,19 @@ File:Foobar.jpg|link=''Main Page''|caption2
 </gallery>
 !! html/php+tidy
 <p><a href="/wiki/Foo%27%27s_bar%27%27s" title="Foo&#39;&#39;s bar&#39;&#39;s">Foo''s bar''s</a>
-</p><p><a href="/wiki/Foos_bars" title="caption1"><img alt="caption1" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p><p><a href="/wiki/Main_Page" title="caption2"><img alt="caption2" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p><p><a href="/wiki/Foos_bars" title="caption1"><img alt="caption1" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
+</p><p><a href="/wiki/Main_Page" title="caption2"><img alt="caption2" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Foos_bars"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Foos_bars"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>caption1
 </p>
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>caption2
 </p>
@@ -15434,11 +15434,11 @@ Nowiki markup in link attribute (T206940)
 File:Foobar.jpg|link=Foo<nowiki>''</nowiki>s_bar<nowiki>''</nowiki>s|caption
 </gallery>
 !! html/php+tidy
-<p><a href="/wiki/Foo%27%27s_bar%27%27s" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Foo%27%27s_bar%27%27s" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Foo%27%27s_bar%27%27s"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Foo%27%27s_bar%27%27s"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>caption
 </p>
@@ -15471,11 +15471,11 @@ parsoid = {
 File:Foobar.jpg|link=Foo<nowiki>''s_bar''</nowiki>s|caption
 </gallery>
 !! html/php+tidy
-<p><a href="/wiki/Foo%27%27s_bar%27%27s" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Foo%27%27s_bar%27%27s" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Foo%27%27s_bar%27%27s"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Foo%27%27s_bar%27%27s"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>caption
 </p>
@@ -15504,11 +15504,11 @@ HTML entity prefix in link markup (T209236)
 File:Foobar.jpg|link=https://example.com?foo&params=bar
 </gallery>
 !! html/php+tidy
-<p><a href="https://example.com?foo&amp;params=bar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="https://example.com?foo&amp;params=bar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="https://example.com?foo&amp;params=bar"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="https://example.com?foo&amp;params=bar"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -15592,7 +15592,7 @@ Image with heading and horizontal rule in caption
 --------------
 ]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><h3><span class="mw-headline" id="Testing">Testing</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Testing">edit</a><span class="mw-editsection-bracket">]</span></span></h3> 123 <hr /></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><h3><span class="mw-headline" id="Testing">Testing</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Testing">edit</a><span class="mw-editsection-bracket">]</span></span></h3> 123 <hr /></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"\n=== Testing ===\n123\n--------------\n"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{"href":"File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>
@@ -15618,9 +15618,9 @@ parsoid=wt2html,wt2wt,html2html
 
 [[File:Foobar.jpg|frameless|thumb|caption]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
-</p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
-</p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></figure-inline></p>
@@ -15637,9 +15637,9 @@ parsoid=wt2html,wt2wt,html2html
 [[File:Foobar.jpg|frame|frameless|caption]]
 [[File:Foobar.jpg|frame|thumb|caption]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>caption</figcaption></figure>
@@ -15656,9 +15656,9 @@ parsoid=wt2html,wt2wt,html2html
 [[File:Foobar.jpg|thumb|frameless|caption]]
 [[File:Foobar.jpg|thumb|frame|caption]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -15686,8 +15686,8 @@ parsoid=wt2html,wt2wt,html2html
 
 [[File:Foobar.jpg|border|2000px]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="2000" height="227" /></a>
-</p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="2000" height="227" class="thumbborder" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="2000" height="227" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="2000" height="227" class="thumbborder" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="227" width="2000"/></a></figure-inline></p>
@@ -15703,8 +15703,8 @@ parsoid=wt2html,wt2wt,html2html
 
 [[File:Foobar.jpg|border|1000px]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg" width="1000" height="113" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/1500px-Foobar.jpg 1.5x, http://example.com/images/3/3a/Foobar.jpg 2x" /></a>
-</p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg" width="1000" height="113" class="thumbborder" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/1500px-Foobar.jpg 1.5x, http://example.com/images/3/3a/Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg" decoding="async" width="1000" height="113" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/1500px-Foobar.jpg 1.5x, http://example.com/images/3/3a/Foobar.jpg 2x" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg" decoding="async" width="1000" height="113" class="thumbborder" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/1500px-Foobar.jpg 1.5x, http://example.com/images/3/3a/Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="113" width="1000"/></a></figure-inline></p>
@@ -15718,7 +15718,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|50px]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:52px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:52px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" decoding="async" width="50" height="6" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></figure>
@@ -15733,8 +15733,8 @@ parsoid=wt2html,wt2wt,html2html
 
 [[File:Foobar.svg|thumb|2000px]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:2002px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png" width="2000" height="1500" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:2002px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png" decoding="async" width="2000" height="1500" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div></div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure>
@@ -15748,7 +15748,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|frameless|50px]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" decoding="async" width="50" height="6" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image/Frameless"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></figure-inline></p>
@@ -15763,8 +15763,8 @@ parsoid=wt2html,wt2wt,html2html
 
 [[File:Foobar.svg|frameless|2000px]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p><p><a href="/wiki/File:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png" width="2000" height="1500" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
+</p><p><a href="/wiki/File:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png" decoding="async" width="2000" height="1500" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image/Frameless"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -15784,10 +15784,10 @@ parsoid=wt2html,wt2wt,html2html
 
 [[File:Foobar.jpg|frame|2000px]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure>
@@ -15823,7 +15823,7 @@ Frameless image caption with a free URL
 !! wikitext
 [[File:Foobar.jpg|http://example.com]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="http://example.com"><img alt="http://example.com" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="http://example.com"><img alt="http://example.com" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"http://example.com"}]}' data-mw='{"caption":"&lt;a rel=\"mw:ExtLink\" href=\"http://example.com\" data-parsoid=&#39;{\"stx\":\"url\",\"dsr\":[18,36,0,0]}&#39;>http://example.com&lt;/a>"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -15836,7 +15836,7 @@ thumbsize=220
 !! wikitext
 [[File:Foobar.jpg|thumb|http://example.com]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" class="external free" href="http://example.com">http://example.com</a></figcaption></figure>
@@ -15850,7 +15850,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|http://example.com|alt=Alteration]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img alt="Alteration" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" class="external free" href="http://example.com">http://example.com</a></figcaption></figure>
@@ -15862,7 +15862,7 @@ SVG thumbnails with no language set
 !! wikitext
 [[File:Foobar.svg|thumb|caption]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" decoding="async" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/thumb/f/ff/Foobar.svg/220px-Foobar.svg.png" data-file-width="240" data-file-height="180" data-file-type="drawing" height="165" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -15875,7 +15875,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.svg|thumb|caption|lang=de]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" decoding="async" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/thumb/f/ff/Foobar.svg/220px-Foobar.svg.png" lang="de" data-file-width="240" data-file-height="180" data-file-type="drawing" height="165" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -15888,7 +15888,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.svg|thumb|caption|lang=invalid:language:code]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>lang=invalid:language:code</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" decoding="async" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>lang=invalid:language:code</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/thumb/f/ff/Foobar.svg/220px-Foobar.svg.png" data-file-width="240" data-file-height="180" data-file-type="drawing" height="165" width="220"/></a><figcaption>lang=invalid:language:code</figcaption></figure>
@@ -15902,7 +15902,7 @@ wgMediaInTargetLanguage = true
 !! wikitext
 [[File:Foobar.svg]] [[File:Foobar.svg|lang=en]]
 !! html/php
-<p><a href="/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/langru-240px-Foobar.svg.png" width="240" height="180" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langru-360px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langru-480px-Foobar.svg.png 2x" /></a> <a href="/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Foobar.svg&amp;lang=en" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/240px-Foobar.svg.png" width="240" height="180" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/480px-Foobar.svg.png 2x" /></a>
+<p><a href="/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/langru-240px-Foobar.svg.png" decoding="async" width="240" height="180" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langru-360px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langru-480px-Foobar.svg.png 2x" /></a> <a href="/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Foobar.svg&amp;lang=en" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/240px-Foobar.svg.png" decoding="async" width="240" height="180" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/480px-Foobar.svg.png 2x" /></a>
 </p>
 !! end
 
@@ -15914,7 +15914,7 @@ wgMediaInTargetLanguage = true
 !! wikitext
 [[File:Foobar.svg]] [[File:Foobar.svg|lang=ru]]
 !! html/php
-<p><a href="/wiki/Datei:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/240px-Foobar.svg.png" width="240" height="180" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/480px-Foobar.svg.png 2x" /></a> <a href="/index.php?title=Datei:Foobar.svg&amp;lang=ru" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/langru-240px-Foobar.svg.png" width="240" height="180" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langru-360px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langru-480px-Foobar.svg.png 2x" /></a>
+<p><a href="/wiki/Datei:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/240px-Foobar.svg.png" decoding="async" width="240" height="180" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/480px-Foobar.svg.png 2x" /></a> <a href="/index.php?title=Datei:Foobar.svg&amp;lang=ru" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/langru-240px-Foobar.svg.png" decoding="async" width="240" height="180" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langru-360px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langru-480px-Foobar.svg.png 2x" /></a>
 </p>
 !! end
 
@@ -15923,7 +15923,7 @@ T3887: A ISBN with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|ISBN 1235467890]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a href="./Special:BookSources/1235467890" rel="mw:WikiLink">ISBN 1235467890</a></figcaption></figure>
@@ -15934,7 +15934,7 @@ T3887: A RFC with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|This is RFC 12354]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>This is <a href="https://tools.ietf.org/html/rfc12354" rel="mw:ExtLink" class="external mw-magiclink">RFC 12354</a></figcaption></figure>
@@ -15945,7 +15945,7 @@ T3887: A mailto link with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|Please mailto:nobody@example.com]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>Please <a rel="mw:ExtLink" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></figcaption></figure>
@@ -15957,7 +15957,7 @@ T2648: Frameless image caption with a link
 !! wikitext
 [[File:Foobar.jpg|text with a [[link]] in it]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"text with a [[link]] in it"}]}' data-mw='{"caption":"text with a &lt;a rel=\"mw:WikiLink\" href=\"./Link\" title=\"Link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Link\"},\"sa\":{\"href\":\"link\"},\"dsr\":[30,38,2,2]}&#39;>link&lt;/a> in it"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -15968,7 +15968,7 @@ T2648: Frameless image caption with a link (suffix)
 !! wikitext
 [[File:Foobar.jpg|text with a [[link]]foo in it]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"text with a [[link]]foo in it"}]}' data-mw='{"caption":"text with a &lt;a rel=\"mw:WikiLink\" href=\"./Link\" title=\"Link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Link\"},\"sa\":{\"href\":\"link\"},\"dsr\":[30,41,2,5],\"tail\":\"foo\"}&#39;>linkfoo&lt;/a> in it"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -15979,7 +15979,7 @@ T2648: Frameless image caption with an interwiki link
 !! wikitext
 [[File:Foobar.jpg|text with a [[MeatBall:Link]] in it]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"text with a [[MeatBall:Link]] in it"}]}' data-mw='{"caption":"text with a &lt;a rel=\"mw:WikiLink/Interwiki\" href=\"http://www.usemod.com/cgi-bin/mb.pl?Link\" title=\"meatball:Link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"http://www.usemod.com/cgi-bin/mb.pl?Link\"},\"sa\":{\"href\":\"MeatBall:Link\"},\"isIW\":true,\"dsr\":[30,47,2,2]}&#39;>MeatBall:Link&lt;/a> in it"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -15990,7 +15990,7 @@ T2648: Frameless image caption with a piped interwiki link
 !! wikitext
 [[File:Foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"text with a [[MeatBall:Link|link]] in it"}]}' data-mw='{"caption":"text with a &lt;a rel=\"mw:WikiLink/Interwiki\" href=\"http://www.usemod.com/cgi-bin/mb.pl?Link\" title=\"meatball:Link\" data-parsoid=&#39;{\"stx\":\"piped\",\"a\":{\"href\":\"http://www.usemod.com/cgi-bin/mb.pl?Link\"},\"sa\":{\"href\":\"MeatBall:Link\"},\"isIW\":true,\"dsr\":[30,52,16,2]}&#39;>link&lt;/a> in it"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -16009,7 +16009,7 @@ Escape HTML special chars in image alt text
 !! wikitext
 [[File:Foobar.jpg|& < > "]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&amp; &lt; > \""}]}' data-mw='{"caption":"&amp;amp; &amp;lt; > \""}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -16022,7 +16022,7 @@ language=zh
 !! wikitext
 [[File:Foobar.jpg|& < > "]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&amp; &lt; > \""}]}' data-mw='{"caption":"&amp;amp; &amp;lt; > \""}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -16044,7 +16044,7 @@ T2499: Alt text should have &#1234;, not &amp;1234;
 !! wikitext
 [[File:Foobar.jpg|&#9792;]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&amp;#9792;"}]}' data-mw='{"caption":"&lt;span typeof=\"mw:Entity\" data-parsoid=&#39;{\"src\":\"&amp;amp;#9792;\",\"srcContent\":\"♀\",\"dsr\":[18,25,null,null]}&#39;>♀&lt;/span>"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -16068,7 +16068,7 @@ Image caption containing another image
 !! wikitext
 [[File:Foobar.jpg|thumb|This is a caption with another [[File:Thumb.png|image]] inside it!]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption with another <a href="/wiki/File:Thumb.png" class="image" title="image"><img alt="image" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" /></a> inside it!</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption with another <a href="/wiki/File:Thumb.png" class="image" title="image"><img alt="image" src="http://example.com/images/e/ea/Thumb.png" decoding="async" width="135" height="135" /></a> inside it!</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>This is a caption with another <figure-inline class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"image"}'><a href="./File:Thumb.png"><img resource="./File:Thumb.png" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a></figure-inline> inside it!</figcaption></figure>
@@ -16080,7 +16080,7 @@ Image: caption containing a newline
 [[File:Foobar.jpg|This
 *is some text]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="This *is some text"><img alt="This *is some text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="This *is some text"><img alt="This *is some text" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"This\n*is some text"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -16092,7 +16092,7 @@ Image: caption containing leading space
 !! wikitext
 [[File:Foobar.jpg|thumb| bar]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>bar</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>bar</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption> bar</figcaption></figure>
@@ -16115,7 +16115,7 @@ parsoid=wt2html,wt2wt,html2html
 |}
 and some more text.]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is an example image thumbnail caption with a table <table> <tr> <th>Foo</th> <th>Bar </th></tr> <tr> <td>Foo1</td> <td>Bar1 </td></tr></table> and some more text.</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" decoding="async" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is an example image thumbnail caption with a table <table> <tr> <th>Foo</th> <th>Bar </th></tr> <tr> <td>Foo1</td> <td>Bar1 </td></tr></table> and some more text.</div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>This is an example image thumbnail caption with a table
@@ -16132,7 +16132,7 @@ T5090: External links other than http: in image captions
 !! wikitext
 [[File:Foobar.jpg|thumb|200x200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" decoding="async" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>This caption has <a rel="mw:ExtLink" class="external text" href="irc://example.net">irc</a> and <a rel="mw:ExtLink" class="external text" href="https://example.com">Secure</a> ext links in it.</figcaption></figure>
@@ -16145,7 +16145,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[Image:foobar.jpg|a|class=b]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="a"><img alt="a" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="b" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="a"><img alt="a" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" class="b" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size b" typeof="mw:Image" data-mw='{"caption":"a"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -16159,7 +16159,7 @@ language=es
 !! wikitext
 [[Archivo:Foobar.jpg|izquierda|enlace=foo|caption]]
 !! html/php
-<div class="floatleft"><a href="/wiki/Foo" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatleft"><a href="/wiki/Foo" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-left" typeof="mw:Image"><a href="./Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>caption</figcaption></figure>
@@ -16174,7 +16174,7 @@ language=es
 !! wikitext
 [[Archivo:Foobar.jpg|miniatura|izquierda|enlace=foo|caption]]
 !! html/php
-<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/Foo" title="Foo"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/Archivo:Foobar.jpg" class="internal" title="Aumentar"></a></div>caption</div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/Foo" title="Foo"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/Archivo:Foobar.jpg" class="internal" title="Aumentar"></a></div>caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -16199,7 +16199,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|frameless|border|class=extra|caption]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="extra thumbborder" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="extra thumbborder" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size mw-image-border extra" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></figure-inline></p>
@@ -16218,9 +16218,9 @@ parsoid=wt2html,wt2wt,html2html
 
 [[File:Foobar.jpg|bogus1|thumb|bogus2|left|bogus3|caption]]
 !! html/php
-<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
-<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" decoding="async" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -17647,7 +17647,7 @@ T3219 URL next to image (good)
 !! wikitext
 http://example.com [[File:Foobar.jpg]]
 !! html/php
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><a rel="mw:ExtLink" class="external free" href="http://example.com">http://example.com</a> <figure-inline class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -17953,7 +17953,7 @@ T3219 URL next to image (broken)
 !! wikitext
 http://example.com[[File:Foobar.jpg]]
 !! html/php
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><a rel="mw:ExtLink" class="external free" href="http://example.com">http://example.com</a><figure-inline class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline></p>
@@ -19567,7 +19567,7 @@ language=sr variant=sr-el
 [[File:Foobar.jpg|alt=-{}-foAjrjvi-{}-]]
 !! html/php
 <p>
-</p><p><a href="/wiki/%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Foobar.jpg" class="image"><img alt="&quot; onload=&quot;alert(1)&quot; data-foo=&quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p><p><a href="/wiki/%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Foobar.jpg" class="image"><img alt="&quot; onload=&quot;alert(1)&quot; data-foo=&quot;" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><meta typeof="mw:LanguageVariant" data-mw-variant='{"add":true,"oneway":[{"f":"foAjrjvi","l":"sr-el","t":"\" onload=\"alert(1)\" data-foo=\""}]}'/></p>
@@ -21398,19 +21398,19 @@ image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" decoding="async" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 </p>
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" decoding="async" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a foo-bar." src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a foo-bar." src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" decoding="async" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>blabla.
 </p>
@@ -21459,19 +21459,19 @@ image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" decoding="async" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 </p>
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" decoding="async" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a foo-bar." src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a foo-bar." src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" decoding="async" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>blabla.
 </p>
@@ -21499,7 +21499,7 @@ File:Foobar.jpg
 !! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" decoding="async" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -21520,7 +21520,7 @@ File:Foobar.jpg
 !! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -21548,17 +21548,17 @@ image:foobar.jpg|link=Main Page#section|caption
 !! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page#section"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page#section"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page#section"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page#section"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>caption
 </p>
@@ -21588,7 +21588,7 @@ File:Foobar.jpg|{{echo|ho}}
 <ul class="gallery mw-gallery-traditional">
        <li class='gallerycaption'>hi</li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>ho
 </p>
@@ -21615,9 +21615,9 @@ File:Foobar.jpg|Image caption
 </gallery>
 !! html/php
 <ul class="gallery mw-gallery-traditional">
-       <li class='gallerycaption'># List item Text <b>bold</b> <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">link</a> Special <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>File in gallery caption</div></div></div></li>
+       <li class='gallerycaption'># List item Text <b>bold</b> <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">link</a> Special <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>File in gallery caption</div></div></div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>Image caption
 </p>
@@ -21641,14 +21641,14 @@ File:Foobar.jpg|alt=galleryalt|{{Test|unamedParam|alt=param}}
 !! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="desc"><img alt="inneralt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="desc"><img alt="inneralt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" decoding="async" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
 </p>
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>This is a test template
 </p>
@@ -21694,7 +21694,7 @@ caption
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p><a href="/wiki/File:Foobar.jpg" class="galleryfilename galleryfilename-truncate" title="File:Foobar.jpg">Foobar.jpg</a>
 some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
@@ -21702,7 +21702,7 @@ some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p><a href="/wiki/File:Foobar.jpg" class="galleryfilename galleryfilename-truncate" title="File:Foobar.jpg">Foobar.jpg</a>
 </p>
@@ -21747,12 +21747,12 @@ foobar.jpg
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -21780,7 +21780,7 @@ File:Foobar.jpg|alt=galleryalt|link=Wikilink
 !! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Wikilink"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Wikilink"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -21805,7 +21805,7 @@ File:Foobar.jpg|alt=galleryalt|link=http://www.example.org
 !! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -21828,7 +21828,7 @@ File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
 !! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>caption
 </p>
@@ -21856,7 +21856,7 @@ File:Foobar.jpg|alt=galleryalt|link=" onclick="alert('malicious javascript code!
 !! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -21883,7 +21883,7 @@ File:Foobar.jpg|link=<
 !! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -21926,7 +21926,7 @@ File:Foobar.jpg
 !! html/php
 <ul class="gallery mw-gallery-traditional center" style="text-align: center;">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -21951,7 +21951,7 @@ File:Foobar.jpg
 !! html/php
 <ul class="gallery mw-gallery-slideshow" data-showthumbnails="1">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
                        </div>
                </div></li>
@@ -22175,7 +22175,7 @@ Centre-aligned image
 !! wikitext
 [[Image:foobar.jpg|centre]]
 !! html/php
-<div class="center"><div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div></div>
+<div class="center"><div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-center" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"center","ak":"centre"}]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure>
@@ -22186,7 +22186,7 @@ None-aligned image
 !! wikitext
 [[Image:foobar.jpg|none]]
 !! html/php
-<div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-none" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure>
@@ -22197,7 +22197,7 @@ Width + Height sized image (using px) (height is ignored)
 !! wikitext
 [[Image:foobar.jpg|640x480px]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" decoding="async" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"640x480px"}]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="73" width="640" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"73","width":"640"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure-inline></p>
@@ -22208,7 +22208,7 @@ Width-sized image (using px, no following whitespace)
 !! wikitext
 [[Image:foobar.jpg|640px]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" decoding="async" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"640px"}]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="73" width="640" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"73","width":"640"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure-inline></p>
@@ -22219,7 +22219,7 @@ Width-sized image (using px, with following whitespace - test regression from r3
 !! wikitext
 [[Image:foobar.jpg|640px ]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" decoding="async" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"640px "}]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="73" width="640" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"73","width":"640"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure-inline></p>
@@ -22230,7 +22230,7 @@ Width-sized image (using px, with preceding whitespace - test regression from r3
 !! wikitext
 [[Image:foobar.jpg| 640px]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" decoding="async" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":" 640px"}]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="73" width="640" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"73","width":"640"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure-inline></p>
@@ -22243,7 +22243,7 @@ djvu
 !! wikitext
 [[File:LoremIpsum.djvu|page=2]]
 !! html/php
-<p><a href="/index.php?title=File:LoremIpsum.djvu&amp;page=2" class="image"><img alt="LoremIpsum.djvu" src="http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg" width="2480" height="3508" srcset="http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg 1.5x, http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg 2x" /></a>
+<p><a href="/index.php?title=File:LoremIpsum.djvu&amp;page=2" class="image"><img alt="LoremIpsum.djvu" src="http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg" decoding="async" width="2480" height="3508" srcset="http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg 1.5x, http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg 2x" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"page","ak":"page=2"}]}' data-mw='{"page":"2"}'><a href="./File:LoremIpsum.djvu" data-parsoid='{"a":{"href":"./File:LoremIpsum.djvu"},"sa":{"href":"File:LoremIpsum.djvu"}}'><img resource="./File:LoremIpsum.djvu" src="//example.com/images/5/5f/LoremIpsum.djvu" data-file-width="2480" data-file-height="3508" data-file-type="bitmap" height="3508" width="2480" data-parsoid='{"a":{"resource":"./File:LoremIpsum.djvu","height":"3508","width":"2480"},"sa":{"resource":"File:LoremIpsum.djvu"}}'/></a></figure-inline></p>
@@ -22277,7 +22277,7 @@ Images with the "|" character in the comment
 !! wikitext
 [[File:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>An <a rel="mw:ExtLink" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx" data-parsoid='{"a":{"href":"http://test/?param1=%7Cleft%7C&amp;param2=%7Cx"},"sa":{"href":"http://test/?param1=|left|&amp;param2=|x"}}'>external</a> URL</figcaption></figure>
@@ -23766,7 +23766,7 @@ language=sr
 !! wikitext
 [[Датотека:Foobar.jpg|thumb|-{R|caption:}-]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Foobar.jpg" class="internal" title="Повећајте"></a></div>caption:</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Foobar.jpg" class="internal" title="Повећајте"></a></div>caption:</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"}]}'><a href="./Датотека:Foobar.jpg"><img resource="./Датотека:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><span typeof="mw:LanguageVariant" data-mw-variant='{"disabled":{"t":"caption:"}}' data-parsoid='{"fl":["R"]}'></span></figcaption></figure>
@@ -23779,7 +23779,7 @@ language=zh variant=zh-cn
 !! wikitext
 [[File:Foobar.jpg|thumb|-{|zh-cn:blog (hk: -{zh-hans|WEBJOURNAL}-, tw: -{zh-hans|WEBLOG}-)}-]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="放大"></a></div>blog (hk: WEBJOURNAL, tw: WEBLOG)</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="放大"></a></div>blog (hk: WEBJOURNAL, tw: WEBLOG)</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"}]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><span typeof="mw:LanguageVariant" data-mw-variant='{"twoway":[{"l":"zh-cn","t":"blog (hk: &lt;span typeof=\"mw:LanguageVariant\" data-mw-variant=&#39;{\"filter\":{\"l\":[\"zh-hans\"],\"t\":\"WEBJOURNAL\"}}&#39; data-parsoid=&#39;{\"fl\":[\"zh-hans\"],\"dsr\":[43,65,null,2]}&#39;>&lt;/span>, tw: &lt;span typeof=\"mw:LanguageVariant\" data-mw-variant=&#39;{\"filter\":{\"l\":[\"zh-hans\"],\"t\":\"WEBLOG\"}}&#39; data-parsoid=&#39;{\"fl\":[\"zh-hans\"],\"dsr\":[71,89,null,2]}&#39;>&lt;/span>)"}]}'></span></figcaption></figure>
@@ -23798,14 +23798,14 @@ File:foobar.jpg|{{Test|unamedParam|alt=-{R|param}-}}|alt=galleryalt
 !! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="bat" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="bat" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="bar"><img alt="foo" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="bar"><img alt="foo" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" decoding="async" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
 </p>
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" decoding="async" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>This is a test template
 </p>
@@ -24389,7 +24389,7 @@ Free external link invading image caption
 !! wikitext
 [[Image:Foobar.jpg|thumb|http://x|hello]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>hello</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>hello</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"bogus","ak":"http://x"},{"ck":"caption","ak":"hello"}]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a><figcaption>hello</figcaption></figure>
@@ -24890,8 +24890,8 @@ paragraphs</indicator>
 !! html/php
 01=hello world
 02=<a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-03=<img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/25px-Foobar.jpg" width="25" height="3" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/38px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg 2x" />
-04=<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/25px-Foobar.jpg" width="25" height="3" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/38px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg 2x" /></a>
+03=<img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/25px-Foobar.jpg" decoding="async" width="25" height="3" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/38px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg 2x" />
+04=<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/25px-Foobar.jpg" decoding="async" width="25" height="3" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/38px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg 2x" /></a>
 05=<ul><li>foo</li>
 <li>bar</li></ul>
 
@@ -25251,7 +25251,7 @@ __TOC__
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="Image">Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Image">Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! html/parsoid
 <meta property="mw:PageProp/toc" data-parsoid='{}'/>
@@ -25866,7 +25866,7 @@ parsoid=wt2html,wt2wt
 <td>
 <p><small>
 </small></p><small>
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Test"><img alt="Test" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Test"><img alt="Test" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a></div>
 </small><p><small></small>
 </p>
 </td></tr></tbody></table>
@@ -25888,8 +25888,8 @@ parsoid=wt2html,wt2wt
 
 <small>[[Image:Foobar.jpg|right|300px]]</small>
 !! html/php+tidy
-<p><b>foo</b></p><b><div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div></b><p><b>bar</b>
-</p><small><div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" width="300" height="34" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg 2x" /></a></div></small>
+<p><b>foo</b></p><b><div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div></b><p><b>bar</b>
+</p><small><div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" decoding="async" width="300" height="34" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg 2x" /></a></div></small>
 !! html/parsoid
 <p><b>foo</b></p><b><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure></b><p><b>bar</b></p>
 
@@ -25903,7 +25903,7 @@ parsoid=wt2html,wt2wt
 !! wikitext
 <small>'''foo[[File:Foobar.jpg|thumb|caption]]bar'''</small>
 !! html/php+tidy
-<p><small><b>foo</b></small></p><small><b><div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div></b></small><p><small><b>bar</b></small>
+<p><small><b>foo</b></small></p><small><b><div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div></b></small><p><small><b>bar</b></small>
 </p>
 !! html/parsoid
 <p><small><b>foo</b></small></p><small><b><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure></b></small><p><small><b>bar</b></small></p>
@@ -25916,7 +25916,7 @@ parsoid=wt2html,wt2wt
 !! wikitext
 '''<small>[[Image:Foobar.jpg|right|300px]]</small>'''
 !! html/php+tidy
-<b><small><div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" width="300" height="34" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg 2x" /></a></div></small></b>
+<b><small><div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" decoding="async" width="300" height="34" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg 2x" /></a></div></small></b>
 !! html/parsoid
 <b><small><figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure></small></b>
 !! end
@@ -28897,7 +28897,7 @@ Image: empty alt attribute (T50924)
 !! wikitext
 [[File:Foobar.jpg|thumb|alt=|bar]]
 !! html/php+tidy
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>bar</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>bar</div></div></div>
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"alt","ak":"alt="},{"ck":"caption","ak":"bar"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img alt="" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"alt":"","resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"alt":"alt=","resource":"File:Foobar.jpg"}}'/></a><figcaption>bar</figcaption></figure>
 !! end
@@ -29013,7 +29013,7 @@ Image: Invalid title as link
 !! wikitext
 [[File:Foobar.jpg|link=<]]
 !! html/php
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="link=&lt;"><img alt="link=&lt;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="link=&lt;"><img alt="link=&lt;" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"link","ak":"link=&lt;"}]}' data-mw='{"caption":"link=&amp;lt;"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -29028,9 +29028,9 @@ Various link types in alt and link options
 
 [[File:Foobar.jpg|link=[[wikipedia:Foo]]|alt=[[wikipedia:Foo]]|caption]]
 !! html/php+tidy
-<p><a href="/wiki/Main_Page" title="caption"><img alt="Main Page" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p><p><a href="/wiki/Media:Thumb.png" title="caption"><img alt="Media:Thumb.png" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p><p><a href="http://en.wikipedia.org/wiki/Foo" title="caption"><img alt="wikipedia:Foo" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Main_Page" title="caption"><img alt="Main Page" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
+</p><p><a href="/wiki/Media:Thumb.png" title="caption"><img alt="Media:Thumb.png" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
+</p><p><a href="http://en.wikipedia.org/wiki/Foo" title="caption"><img alt="wikipedia:Foo" src="http://example.com/images/3/3a/Foobar.jpg" decoding="async" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
 <p><figure-inline class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="./Main_Page" data-parsoid='{"a":{"href":"./Main_Page"},"sa":{"href":"link=[[Main Page]]"}}'><img alt="Main Page" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"alt":"Main Page","resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"alt":"alt=[[Main Page]]","resource":"File:Foobar.jpg"}}'/></a></figure-inline></p>
@@ -29874,10 +29874,10 @@ Magic links inside image captions (autolinked)
 [[File:Foobar.jpg|thumb|PMID 1234]]
 [[File:Foobar.jpg|thumb|ISBN 123456789x]]
 !! html+tidy
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc1234">RFC 1234</a></div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a></div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a href="/wiki/Special:BookSources/123456789X" class="internal mw-magiclink-isbn">ISBN 123456789x</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc1234">RFC 1234</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" decoding="async" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a href="/wiki/Special:BookSources/123456789X" class="internal mw-magiclink-isbn">ISBN 123456789x</a></div></div></div>
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" class="external free" href="http://example.com">http://example.com</a></figcaption></figure>
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a href="https://tools.ietf.org/html/rfc1234" rel="mw:ExtLink" class="external mw-magiclink">RFC 1234</a></figcaption></figure>
@@ -31506,7 +31506,7 @@ Thumbnail output
 !! wikitext
 [[File:Thumb.png|thumb]]
 !! html/php+tidy
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Thumb.png" class="image"><img alt="Thumb.png" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Thumb.png" class="internal" title="Enlarge"></a></div></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Thumb.png" class="image"><img alt="Thumb.png" src="http://example.com/images/e/ea/Thumb.png" decoding="async" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Thumb.png" class="internal" title="Enlarge"></a></div></div></div></div>
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Thumb.png"><img resource="./File:Thumb.png" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a></figure>
 !! end
index 5410644..1d687e5 100644 (file)
@@ -76,6 +76,15 @@ class HtmlTest extends MediaWikiTestCase {
                parent::tearDown();
        }
 
+       /**
+        * @expectedException PHPUnit_Framework_Error_Notice
+        * @expectedExceptionMessage given element name with space
+        * @covers Html::openElement
+        */
+       public function testOpenElement() {
+               Html::openElement( 'span id="x"' );
+       }
+
        /**
         * @covers Html::element
         * @covers Html::rawElement
diff --git a/tests/phpunit/includes/MagicWordFactoryTest.php b/tests/phpunit/includes/MagicWordFactoryTest.php
new file mode 100644 (file)
index 0000000..63ca139
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @covers \MagicWordFactory
+ *
+ * @author Derick N. Alangi
+ */
+class MagicWordFactoryTest extends MediaWikiTestCase {
+       private function makeMagicWordFactory( Language $contLang = null ) {
+               if ( $contLang === null ) {
+                       return new MagicWordFactory( Language::factory( 'en' ) );
+               }
+               return new MagicWordFactory( $contLang );
+       }
+
+       public function testGetContentLanguage() {
+               $contLang = Language::factory( 'en' );
+
+               $magicWordFactory = $this->makeMagicWordFactory( $contLang );
+               $magicWordContLang = $magicWordFactory->getContentLanguage();
+
+               $this->assertSame( $contLang, $magicWordContLang );
+       }
+
+       public function testGetMagicWord() {
+               $magicWordIdValid = 'pageid';
+               $magicWordFactory = $this->makeMagicWordFactory();
+               $mwActual = $magicWordFactory->get( $magicWordIdValid );
+               $contLang = $magicWordFactory->getContentLanguage();
+               $expected = new MagicWord( $magicWordIdValid, [ 'PAGEID' ], false, $contLang );
+
+               $this->assertEquals( $expected, $mwActual );
+       }
+
+       public function testGetInvalidMagicWord() {
+               $magicWordFactory = $this->makeMagicWordFactory();
+
+               $this->setExpectedException( MWException::class );
+               \Wikimedia\suppressWarnings();
+               try {
+                       $magicWordFactory->get( 'invalid magic word' );
+               } finally {
+                       \Wikimedia\restoreWarnings();
+               }
+       }
+
+       public function testGetVariableIDs() {
+               $magicWordFactory = $this->makeMagicWordFactory();
+               $varIds = $magicWordFactory->getVariableIDs();
+
+               $this->assertInternalType( 'array', $varIds );
+               $this->assertNotEmpty( $varIds );
+               $this->assertContainsOnly( 'string', $varIds );
+       }
+
+       public function testGetSubstIDs() {
+               $magicWordFactory = $this->makeMagicWordFactory();
+               $substIds = $magicWordFactory->getSubstIDs();
+
+               $this->assertInternalType( 'array', $substIds );
+               $this->assertNotEmpty( $substIds );
+               $this->assertContainsOnly( 'string', $substIds );
+       }
+
+       /**
+        * Test both valid and invalid caching hints paths
+        */
+       public function testGetCacheTTL() {
+               $magicWordFactory = $this->makeMagicWordFactory();
+               $actual = $magicWordFactory->getCacheTTL( 'localday' );
+
+               $this->assertSame( 3600, $actual );
+
+               $actual = $magicWordFactory->getCacheTTL( 'currentmonth' );
+               $this->assertSame( 86400, $actual );
+
+               $actual = $magicWordFactory->getCacheTTL( 'invalid' );
+               $this->assertSame( -1, $actual );
+       }
+
+       public function testGetDoubleUnderscoreArray() {
+               $magicWordFactory = $this->makeMagicWordFactory();
+               $actual = $magicWordFactory->getDoubleUnderscoreArray();
+
+               $this->assertInstanceOf( MagicWordArray::class, $actual );
+       }
+}
index 5f3cba3..3339749 100644 (file)
@@ -656,7 +656,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                RevisionSlotsUpdate $update,
                User $user,
                $comment,
-               $id,
+               $id = 0,
                $parentId = 0
        ) {
                $rev = new MutableRevisionRecord( $title );
@@ -664,10 +664,13 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $rev->applyUpdate( $update );
                $rev->setUser( $user );
                $rev->setComment( CommentStoreComment::newUnsavedComment( $comment ) );
-               $rev->setId( $id );
                $rev->setPageId( $title->getArticleID() );
                $rev->setParentId( $parentId );
 
+               if ( $id ) {
+                       $rev->setId( $id );
+               }
+
                return $rev;
        }
 
@@ -942,6 +945,79 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                // TODO: test category membership update (with setRcWatchCategoryMembership())
        }
 
+       /**
+        * @covers \MediaWiki\Storage\DerivedPageDataUpdater::doParserCacheUpdate()
+        */
+       public function testDoParserCacheUpdate() {
+               if ( $this->hasMultiSlotSupport() ) {
+                       MediaWikiServices::getInstance()->getSlotRoleRegistry()->defineRoleWithModel(
+                               'aux',
+                               CONTENT_MODEL_WIKITEXT
+                       );
+               }
+
+               $page = $this->getPage( __METHOD__ );
+               $this->createRevision( $page, 'Dummy' );
+
+               $user = $this->getTestUser()->getUser();
+
+               $update = new RevisionSlotsUpdate();
+               $update->modifyContent( 'main', new WikitextContent( 'first [[Main]]' ) );
+
+               if ( $this->hasMultiSlotSupport() ) {
+                       $update->modifyContent( 'aux', new WikitextContent( 'Aux [[Nix]]' ) );
+               }
+
+               // Emulate update after edit ----------
+               $pcache = MediaWikiServices::getInstance()->getParserCache();
+               $pcache->deleteOptionsKey( $page );
+
+               $rev = $this->makeRevision( $page->getTitle(), $update, $user, 'rev', null );
+               $rev->setTimestamp( '20100101000000' );
+               $rev->setParentId( $page->getLatest() );
+
+               $updater = $this->getDerivedPageDataUpdater( $page );
+               $updater->prepareContent( $user, $update, false );
+
+               $rev->setId( 11 );
+               $updater->prepareUpdate( $rev );
+
+               // Force the page timestamp, so we notice whether ParserOutput::getTimestamp
+               // or ParserOutput::getCacheTime are used.
+               $page->setTimestamp( $rev->getTimestamp() );
+               $updater->doParserCacheUpdate();
+
+               // The cached ParserOutput should not use the revision timestamp
+               $cached = $pcache->get( $page, $updater->getCanonicalParserOptions(), true );
+               $this->assertInternalType( 'object', $cached );
+               $this->assertSame( $updater->getCanonicalParserOutput(), $cached );
+
+               $this->assertSame( $rev->getTimestamp(), $cached->getCacheTime() );
+               $this->assertSame( $rev->getId(), $cached->getCacheRevisionId() );
+
+               // Emulate forced update of an old revision ----------
+               $pcache->deleteOptionsKey( $page );
+
+               $updater = $this->getDerivedPageDataUpdater( $page );
+               $updater->prepareUpdate( $rev );
+
+               // Force the page timestamp, so we notice whether ParserOutput::getTimestamp
+               // or ParserOutput::getCacheTime are used.
+               $page->setTimestamp( $rev->getTimestamp() );
+               $updater->doParserCacheUpdate();
+
+               // The cached ParserOutput should not use the revision timestamp
+               $cached = $pcache->get( $page, $updater->getCanonicalParserOptions(), true );
+               $this->assertInternalType( 'object', $cached );
+               $this->assertSame( $updater->getCanonicalParserOutput(), $cached );
+
+               $this->assertGreaterThan( $rev->getTimestamp(), $cached->getCacheTime() );
+               $this->assertSame( $rev->getId(), $cached->getCacheRevisionId() );
+       }
+
+       /**
+        * @return bool
+        */
        private function hasMultiSlotSupport() {
                global $wgMultiContentRevisionSchemaMigrationStage;
 
index 4e09077..89e1d4e 100644 (file)
@@ -29,6 +29,9 @@ class PageUpdaterTest extends MediaWikiTestCase {
                        'aux',
                        CONTENT_MODEL_WIKITEXT
                );
+
+               $this->tablesUsed[] = 'logging';
+               $this->tablesUsed[] = 'recentchanges';
        }
 
        private function getDummyTitle( $method ) {
index 9898e53..feafdef 100644 (file)
@@ -215,6 +215,19 @@ class ApiBlockTest extends ApiTestCase {
                $this->doBlock( [ 'expiry' => '' ] );
        }
 
+       public function testBlockWithoutRestrictions() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => true,
+               ] );
+
+               $this->doBlock();
+
+               $block = Block::newFromTarget( $this->mUser->getName() );
+
+               $this->assertTrue( $block->isSitewide() );
+               $this->assertCount( 0, $block->getRestrictions() );
+       }
+
        public function testBlockWithRestrictions() {
                $this->setMwGlobals( [
                        'wgEnablePartialBlocks' => true,
@@ -274,7 +287,8 @@ class ApiBlockTest extends ApiTestCase {
 
        /**
         * @expectedException ApiUsageException
-        * @expectedExceptionMessage "pagerestrictions" may not be over 10 (set to 11) for bots or sysops.
+        * @expectedExceptionMessage Too many values supplied for parameter "pagerestrictions". The
+        * limit is 10.
         */
        public function testBlockingToManyRestrictions() {
                $this->setMwGlobals( [
index e8cd342..7bab542 100644 (file)
@@ -553,6 +553,62 @@ class ApiComparePagesTest extends ApiTestCase {
                                        ]
                                ],
                        ],
+                       'Relative diff, no prev' => [
+                               [
+                                       'fromrev' => '{{REPL:revA1}}',
+                                       'torelative' => 'prev',
+                                       'prop' => 'ids|rel|diff|title|user|comment',
+                               ],
+                               [
+                                       'warnings' => [
+                                               [
+                                                       'code' => 'compare-no-prev',
+                                                       'module' => 'compare',
+                                               ],
+                                       ],
+                                       'compare' => [
+                                               'toid' => '{{REPL:pageA}}',
+                                               'torevid' => '{{REPL:revA1}}',
+                                               'tons' => 0,
+                                               'totitle' => 'ApiComparePagesTest A',
+                                               'touser' => '{{REPL:creator}}',
+                                               'touserid' => '{{REPL:creatorid}}',
+                                               'tocomment' => 'Test for ApiComparePagesTest: A 1',
+                                               'toparsedcomment' => 'Test for ApiComparePagesTest: A 1',
+                                               'next' => '{{REPL:revA2}}',
+                                               'body' => '<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1" >Line 1:</td>' . "\n"
+                                                       . '<td colspan="2" class="diff-lineno">Line 1:</td></tr>' . "\n"
+                                                       . '<tr><td class=\'diff-marker\'>−</td><td class=\'diff-deletedline\'><div> </div></td><td class=\'diff-marker\'>+</td><td class=\'diff-addedline\'><div><ins class="diffchange diffchange-inline">A 1</ins></div></td></tr>' . "\n",
+                                       ],
+                               ],
+                       ],
+                       'Relative diff, no next' => [
+                               [
+                                       'fromrev' => '{{REPL:revA4}}',
+                                       'torelative' => 'next',
+                                       'prop' => 'ids|rel|diff|title|user|comment',
+                               ],
+                               [
+                                       'warnings' => [
+                                               [
+                                                       'code' => 'compare-no-next',
+                                                       'module' => 'compare',
+                                               ],
+                                       ],
+                                       'compare' => [
+                                               'fromid' => '{{REPL:pageA}}',
+                                               'fromrevid' => '{{REPL:revA4}}',
+                                               'fromns' => 0,
+                                               'fromtitle' => 'ApiComparePagesTest A',
+                                               'fromuser' => '{{REPL:creator}}',
+                                               'fromuserid' => '{{REPL:creatorid}}',
+                                               'fromcomment' => 'Test for ApiComparePagesTest: A 4',
+                                               'fromparsedcomment' => 'Test for ApiComparePagesTest: A 4',
+                                               'prev' => '{{REPL:revA3}}',
+                                               'body' => '',
+                                       ],
+                               ],
+                       ],
                        'Diff for specific slots' => [
                                // @todo Use a page with multiple slots here
                                [
@@ -898,24 +954,6 @@ class ApiComparePagesTest extends ApiTestCase {
                                [],
                                'missingcontent'
                        ],
-                       'Error, Relative diff, no prev' => [
-                               [
-                                       'fromrev' => '{{REPL:revA1}}',
-                                       'torelative' => 'prev',
-                                       'prop' => 'ids',
-                               ],
-                               [],
-                               'baddiff'
-                       ],
-                       'Error, Relative diff, no next' => [
-                               [
-                                       'fromrev' => '{{REPL:revA4}}',
-                                       'torelative' => 'next',
-                                       'prop' => 'ids',
-                               ],
-                               [],
-                               'baddiff'
-                       ],
                        'Error, section diff with no revision' => [
                                [
                                        'fromtitle' => 'ApiComparePagesTest F',
index fc546ff..803eefb 100644 (file)
@@ -41,6 +41,35 @@ class ApiDeleteTest extends ApiTestCase {
                $this->assertFalse( Title::newFromText( $name )->exists() );
        }
 
+       public function testBatchedDelete() {
+               $this->setMwGlobals( 'wgDeleteRevisionsBatchSize', 1 );
+
+               $name = 'Help:' . ucfirst( __FUNCTION__ );
+               for ( $i = 1; $i <= 3; $i++ ) {
+                       $this->editPage( $name, "Revision $i" );
+               }
+
+               $apiResult = $this->doApiRequestWithToken( [
+                       'action' => 'delete',
+                       'title' => $name,
+               ] )[0];
+
+               $this->assertArrayHasKey( 'delete', $apiResult );
+               $this->assertArrayHasKey( 'title', $apiResult['delete'] );
+               $this->assertSame( $name, $apiResult['delete']['title'] );
+               $this->assertArrayHasKey( 'scheduled', $apiResult['delete'] );
+               $this->assertTrue( $apiResult['delete']['scheduled'] );
+               $this->assertArrayNotHasKey( 'logid', $apiResult['delete'] );
+
+               // Run the jobs
+               JobQueueGroup::destroySingletons();
+               $jobs = new RunJobs;
+               $jobs->loadParamsAndArgs( null, [ 'quiet' => true ], null );
+               $jobs->execute();
+
+               $this->assertFalse( Title::newFromText( $name )->exists( Title::GAID_FOR_UPDATE ) );
+       }
+
        public function testDeleteNonexistent() {
                $this->setExpectedException( ApiUsageException::class,
                        "The page you specified doesn't exist." );
index 312ef55..d7628e0 100644 (file)
@@ -634,6 +634,40 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                ];
        }
 
+       public function testAddMessagesFromStatus_filter() {
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter( $result, Language::factory( 'qqx' ), 'plaintext', false );
+
+               $status = Status::newGood();
+               $status->warning( 'mainpage' );
+               $status->warning( 'parentheses', 'foobar' );
+               $status->warning( wfMessage( 'mainpage' ) );
+               $status->error( 'mainpage' );
+               $status->error( 'parentheses', 'foobaz' );
+               $formatter->addMessagesFromStatus( 'status', $status, [ 'warning', 'error' ], [ 'mainpage' ] );
+               $this->assertSame( [
+                       'errors' => [
+                               [
+                                       'code' => 'parentheses',
+                                       'text' => '(parentheses: foobaz)',
+                                       'module' => 'status',
+                                       ApiResult::META_CONTENT => 'text',
+                               ],
+                               ApiResult::META_INDEXED_TAG_NAME => 'error',
+                       ],
+                       'warnings' => [
+                               [
+                                       'code' => 'parentheses',
+                                       'text' => '(parentheses: foobar)',
+                                       'module' => 'status',
+                                       ApiResult::META_CONTENT => 'text',
+                               ],
+                               ApiResult::META_INDEXED_TAG_NAME => 'warning',
+                       ],
+                       ApiResult::META_TYPE => 'assoc',
+               ], $result->getResultData() );
+       }
+
        /**
         * @dataProvider provideIsValidApiCode
         * @covers ApiErrorFormatter::isValidApiCode
index f1e82ff..f1ee99f 100644 (file)
@@ -13,8 +13,6 @@ class ChangeTagsTest extends MediaWikiTestCase {
 
                $this->tablesUsed[] = 'change_tag';
                $this->tablesUsed[] = 'change_tag_def';
-               $this->tablesUsed[] = 'tag_summary';
-               $this->tablesUsed[] = 'valid_tag';
 
                // Truncate these to avoid the supposed-to-be-unused IDs in tests here turning
                // out to be used, leading ChangeTags::updateTags() to pick up bogus rc_id,
@@ -569,7 +567,6 @@ class ChangeTagsTest extends MediaWikiTestCase {
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete( 'change_tag', '*' );
                $dbw->delete( 'change_tag_def', '*' );
-               $dbw->delete( 'valid_tag', '*' );
 
                $rcId = 123;
                ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
@@ -590,7 +587,5 @@ class ChangeTagsTest extends MediaWikiTestCase {
                ];
                $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
                $this->assertEquals( $expected, iterator_to_array( $res, false ) );
-
-               $this->assertEquals( [], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
        }
 }
index 22aa667..3e52115 100644 (file)
@@ -197,8 +197,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $priorAsOf = null;
                $wasSet = 0;
                $func = function ( $old, &$ttl, &$opts, $asOf )
-               use ( &$wasSet, &$priorValue, &$priorAsOf, $value )
-               {
+               use ( &$wasSet, &$priorValue, &$priorAsOf, $value ) {
                        ++$wasSet;
                        $priorValue = $old;
                        $priorAsOf = $asOf;
@@ -351,7 +350,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( 'xxx1', $v, "Value still returned after expired (in grace)" );
                $this->assertEquals( 1, $wasSet, "Value still returned after expired (in grace)" );
 
-               // Change of refresh increase to unity as staleness approaches graceTTL
+               // Chance of refresh increase to unity as staleness approaches graceTTL
                $mockWallClock += $cache::TTL_WEEK; // 8 days of being stale
                $v = $cache->getWithSetCallback(
                        $key,
@@ -365,6 +364,65 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertNotEquals( null, $oldAsOfReceived, "Callback got post-grace stale value" );
        }
 
+       /**
+        * @dataProvider getWithSetCallback_provider
+        * @covers WANObjectCache::getWithSetCallback()
+        * @covers WANObjectCache::doGetWithSetCallback()
+        * @param array $extOpts
+        * @param bool $versioned
+        */
+       function testGetWithSetcallback_touched( array $extOpts, $versioned ) {
+               $cache = $this->cache;
+
+               $mockWallClock = microtime( true );
+               $cache->setMockTime( $mockWallClock );
+
+               $checkFunc = function ( $oldVal, &$ttl, array $setOpts, $oldAsOf )
+               use ( &$wasSet ) {
+                       ++$wasSet;
+
+                       return 'xxx' . $wasSet;
+               };
+
+               $key = wfRandomString();
+               $wasSet = 0;
+               $touched = null;
+               $touchedCallback = function () use ( &$touched ) {
+                       return $touched;
+               };
+               $v = $cache->getWithSetCallback(
+                       $key,
+                       $cache::TTL_INDEFINITE,
+                       $checkFunc,
+                       [ 'touchedCallback' => $touchedCallback ] + $extOpts
+               );
+               $mockWallClock += 60;
+               $v = $cache->getWithSetCallback(
+                       $key,
+                       $cache::TTL_INDEFINITE,
+                       $checkFunc,
+                       [ 'touchedCallback' => $touchedCallback ] + $extOpts
+               );
+               $this->assertEquals( 'xxx1', $v, "Value was computed once" );
+               $this->assertEquals( 1, $wasSet, "Value was computed once" );
+
+               $touched = $mockWallClock - 10;
+               $v = $cache->getWithSetCallback(
+                       $key,
+                       $cache::TTL_INDEFINITE,
+                       $checkFunc,
+                       [ 'touchedCallback' => $touchedCallback ] + $extOpts
+               );
+               $v = $cache->getWithSetCallback(
+                       $key,
+                       $cache::TTL_INDEFINITE,
+                       $checkFunc,
+                       [ 'touchedCallback' => $touchedCallback ] + $extOpts
+               );
+               $this->assertEquals( 'xxx2', $v, "Value was recomputed once" );
+               $this->assertEquals( 2, $wasSet, "Value was recomputed once" );
+       }
+
        public static function getWithSetCallback_provider() {
                return [
                        [ [], false ],
index 1147805..dc02922 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group Database
  */
@@ -23,7 +25,7 @@ class ContribsPagerTest extends MediaWikiTestCase {
         * @param array $inputOpts Input options
         * @param array $expectedOpts Expected options
         */
-       public function testDateFilterOptionProcessing( $inputOpts, $expectedOpts ) {
+       public function testDateFilterOptionProcessing( array $inputOpts, array $expectedOpts ) {
                $this->assertArraySubset( $expectedOpts, ContribsPager::processDateFilter( $inputOpts ) );
        }
 
@@ -115,4 +117,50 @@ class ContribsPagerTest extends MediaWikiTestCase {
                        [ '2001:db8::/9999' ],
                ];
        }
+
+       /**
+        * @covers \ContribsPager::getExtraSortFields
+        * @covers \ContribsPager::getIndexField
+        * @covers \ContribsPager::getQueryInfo
+        */
+       public function testUniqueSortOrderWithoutIpChanges() {
+               $pager = new ContribsPager( new RequestContext(), [
+                       'start' => '',
+                       'end' => '',
+               ] );
+
+               /** @var ContribsPager $pager */
+               $pager = TestingAccessWrapper::newFromObject( $pager );
+               $queryInfo = $pager->buildQueryInfo( '', 1, false );
+
+               $this->assertNotContains( 'ip_changes', $queryInfo[0] );
+               $this->assertArrayNotHasKey( 'ip_changes', $queryInfo[5] );
+               $this->assertContains( 'rev_timestamp', $queryInfo[1] );
+               $this->assertContains( 'rev_id', $queryInfo[1] );
+               $this->assertSame( [ 'rev_timestamp DESC', 'rev_id DESC' ], $queryInfo[4]['ORDER BY'] );
+       }
+
+       /**
+        * @covers \ContribsPager::getExtraSortFields
+        * @covers \ContribsPager::getIndexField
+        * @covers \ContribsPager::getQueryInfo
+        */
+       public function testUniqueSortOrderOnIpChanges() {
+               $pager = new ContribsPager( new RequestContext(), [
+                       'target' => '116.17.184.5/32',
+                       'start' => '',
+                       'end' => '',
+               ] );
+
+               /** @var ContribsPager $pager */
+               $pager = TestingAccessWrapper::newFromObject( $pager );
+               $queryInfo = $pager->buildQueryInfo( '', 1, false );
+
+               $this->assertContains( 'ip_changes', $queryInfo[0] );
+               $this->assertArrayHasKey( 'ip_changes', $queryInfo[5] );
+               $this->assertSame( 'ipc_rev_timestamp', $queryInfo[1]['rev_timestamp'] );
+               $this->assertSame( 'ipc_rev_id', $queryInfo[1]['rev_id'] );
+               $this->assertSame( [ 'rev_timestamp DESC', 'rev_id DESC' ], $queryInfo[4]['ORDER BY'] );
+       }
+
 }
index 4f8a7da..50a9e50 100644 (file)
@@ -392,6 +392,7 @@ class UserTest extends MediaWikiTestCase {
                                ],
                        ],
                ] );
+               $this->hideDeprecated( 'User::getPasswordValidity' );
 
                $user = static::getTestUser()->getUser();