Merge "Update psysh to 0.8.5"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 24 May 2017 10:04:19 +0000 (10:04 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 24 May 2017 10:04:19 +0000 (10:04 +0000)
64 files changed:
includes/OutputPage.php
includes/actions/InfoAction.php
includes/api/ApiParse.php
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/hu.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/auth/AuthManager.php
includes/auth/Throttler.php
includes/cache/FileCacheBase.php
includes/changetags/ChangeTags.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/media/DjVu.php
includes/media/Exif.php
includes/media/ExifBitmap.php
includes/media/FormatMetadata.php
includes/media/GIFMetadataExtractor.php
includes/media/MediaHandler.php
includes/media/PNGMetadataExtractor.php
includes/media/XCF.php
includes/parser/Parser.php
includes/registration/ExtensionRegistry.php
includes/session/SessionBackend.php
includes/session/SessionManager.php
includes/skins/Skin.php
languages/i18n/af.json
languages/i18n/atj.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bho.json
languages/i18n/bs.json
languages/i18n/fr.json
languages/i18n/fy.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hu.json
languages/i18n/jv.json
languages/i18n/pam.json
languages/i18n/sah.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/udm.json
languages/i18n/uk.json
maintenance/importImages.php
maintenance/refreshFileHeaders.php
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki/page/startup.js
resources/src/mediawiki/page/watch.js
tests/parser/parserTests.txt
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/media/ExifTest.php
tests/phpunit/includes/media/GIFMetadataExtractorTest.php
tests/phpunit/includes/media/GIFTest.php
tests/phpunit/includes/media/JpegTest.php
tests/phpunit/includes/media/PNGTest.php
tests/phpunit/includes/media/TiffTest.php
tests/phpunit/includes/media/XCFTest.php
tests/phpunit/includes/search/SearchEnginePrefixTest.php
tests/phpunit/includes/session/SessionBackendTest.php
tests/phpunit/includes/session/TestBagOStuff.php

index c2ab19a..c739b30 100644 (file)
@@ -285,9 +285,9 @@ class OutputPage extends ContextSource {
        private $mTarget = null;
 
        /**
-        * @var bool Whether parser output should contain table of contents
+        * @var bool Whether parser output contains a table of contents
         */
-       private $mEnableTOC = true;
+       private $mEnableTOC = false;
 
        /**
         * @var bool Whether parser output should contain section edit links
@@ -1839,6 +1839,14 @@ class OutputPage extends ContextSource {
                $outputPage = $this;
                Hooks::run( 'LanguageLinks', [ $this->getTitle(), &$this->mLanguageLinks, &$linkFlags ] );
                Hooks::run( 'OutputPageParserOutput', [ &$outputPage, $parserOutput ] );
+
+               // This check must be after 'OutputPageParserOutput' runs in addParserOutputMetadata
+               // so that extensions may modify ParserOutput to toggle TOC.
+               // This cannot be moved to addParserOutputText because that is not
+               // called by EditPage for Preview.
+               if ( $parserOutput->getTOCEnabled() && $parserOutput->getTOCHTML() ) {
+                       $this->mEnableTOC = true;
+               }
        }
 
        /**
@@ -1879,7 +1887,6 @@ class OutputPage extends ContextSource {
         */
        function addParserOutput( $parserOutput ) {
                $this->addParserOutputMetadata( $parserOutput );
-               $parserOutput->setTOCEnabled( $this->mEnableTOC );
 
                // Touch section edit links only if not previously disabled
                if ( $parserOutput->getEditSectionTokens() ) {
@@ -2405,26 +2412,10 @@ class OutputPage extends ContextSource {
                        }
 
                        $sk = $this->getSkin();
-                       // add skin specific modules
-                       $modules = $sk->getDefaultModules();
-
-                       // Enforce various default modules for all pages and all skins
-                       $coreModules = [
-                               // Keep this list as small as possible
-                               'site',
-                               'mediawiki.page.startup',
-                               'mediawiki.user',
-                       ];
-
-                       // Support for high-density display images if enabled
-                       if ( $config->get( 'ResponsiveImages' ) ) {
-                               $coreModules[] = 'mediawiki.hidpi';
-                       }
-
-                       $this->addModules( $coreModules );
-                       foreach ( $modules as $group ) {
+                       foreach ( $sk->getDefaultModules() as $group ) {
                                $this->addModules( $group );
                        }
+
                        MWDebug::addModules( $this );
 
                        // Avoid PHP 7.1 warning of passing $this by reference
@@ -3918,15 +3909,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Enables/disables TOC, doesn't override __NOTOC__
-        * @param bool $flag
-        * @since 1.22
-        */
-       public function enableTOC( $flag = true ) {
-               $this->mEnableTOC = $flag;
-       }
-
-       /**
+        * Whether the output has a table of contents
         * @return bool
         * @since 1.22
         */
index df7afca..0f13b17 100644 (file)
@@ -73,8 +73,9 @@ class InfoAction extends FormlessAction {
                        $revid = $revision ? $revision->getId() : null;
                }
                if ( $revid !== null ) {
-                       $key = self::getCacheKey( $title, $revid );
-                       ObjectCache::getMainWANInstance()->delete( $key );
+                       $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+                       $key = self::getCacheKey( $cache, $title, $revid );
+                       $cache->delete( $key );
                }
        }
 
@@ -690,9 +691,10 @@ class InfoAction extends FormlessAction {
        protected function pageCounts( Page $page ) {
                $fname = __METHOD__;
                $config = $this->context->getConfig();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       self::getCacheKey( $page->getTitle(), $page->getLatest() ),
+               return $cache->getWithSetCallback(
+                       self::getCacheKey( $cache, $page->getTitle(), $page->getLatest() ),
                        WANObjectCache::TTL_WEEK,
                        function ( $oldValue, &$ttl, &$setOpts ) use ( $page, $config, $fname ) {
                                $title = $page->getTitle();
@@ -903,11 +905,12 @@ class InfoAction extends FormlessAction {
        }
 
        /**
+        * @param WANObjectCache $cache
         * @param Title $title
         * @param int $revId
         * @return string
         */
-       protected static function getCacheKey( Title $title, $revId ) {
-               return wfMemcKey( 'infoaction', md5( $title->getPrefixedText() ), $revId, self::VERSION );
+       protected static function getCacheKey( WANObjectCache $cache, Title $title, $revId ) {
+               return $cache->makeKey( 'infoaction', md5( $title->getPrefixedText() ), $revId, self::VERSION );
        }
 }
index 7d22d9c..d09978e 100644 (file)
@@ -22,6 +22,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @ingroup API
  */
@@ -278,6 +280,47 @@ class ApiParse extends ApiBase {
                $result_array['title'] = $titleObj->getPrefixedText();
                $result_array['pageid'] = $pageid ?: $pageObj->getId();
 
+               if ( $params['disabletoc'] ) {
+                       $p_result->setTOCEnabled( false );
+               }
+
+               if ( isset( $params['useskin'] ) ) {
+                       $factory = MediaWikiServices::getInstance()->getSkinFactory();
+                       $skin = $factory->makeSkin( Skin::normalizeKey( $params['useskin'] ) );
+               } else {
+                       $skin = null;
+               }
+
+               $outputPage = null;
+               if ( $skin || isset( $prop['headhtml'] ) ) {
+                       // Enabling the skin via 'useskin' or 'headhtml' gets OutputPage and
+                       // Skin involved, which (among others) applies these hooks:
+                       // - ParserOutputHooks
+                       // - Hook: LanguageLinks
+                       // - Hook: OutputPageParserOutput
+                       $context = new DerivativeContext( $this->getContext() );
+                       $context->setTitle( $titleObj );
+                       $context->setWikiPage( $pageObj );
+
+                       if ( $skin ) {
+                               // Use the skin specified by 'useskin'
+                               $context->setSkin( $skin );
+                               // Context clones the skin, refetch to stay in sync. (T166022)
+                               $skin = $context->getSkin();
+                       }
+
+                       $outputPage = new OutputPage( $context );
+                       $outputPage->addParserOutputMetadata( $p_result );
+                       $context->setOutput( $outputPage );
+
+                       if ( $skin ) {
+                               // Based on OutputPage::output()
+                               foreach ( $skin->getDefaultModules() as $group ) {
+                                       $outputPage->addModules( $group );
+                               }
+                       }
+               }
+
                if ( !is_null( $oldid ) ) {
                        $result_array['revid'] = intval( $oldid );
                }
@@ -286,10 +329,6 @@ class ApiParse extends ApiBase {
                        $result_array['redirects'] = $redirValues;
                }
 
-               if ( $params['disabletoc'] ) {
-                       $p_result->setTOCEnabled( false );
-               }
-
                if ( isset( $prop['text'] ) ) {
                        $result_array['text'] = $p_result->getText();
                        $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'text';
@@ -303,19 +342,19 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['langlinks'] ) ) {
-                       $langlinks = $p_result->getLanguageLinks();
-
-                       if ( $params['effectivelanglinks'] ) {
-                               // Link flags are ignored for now, but may in the future be
-                               // included in the result.
-                               $linkFlags = [];
-                               Hooks::run( 'LanguageLinks', [ $titleObj, &$langlinks, &$linkFlags ] );
+                       if ( $skin ) {
+                               $langlinks = $outputPage->getLanguageLinks();
+                       } else {
+                               $langlinks = $p_result->getLanguageLinks();
+                               // The deprecated 'effectivelanglinks' option depredates OutputPage
+                               // support via 'useskin'. If not already applied, then run just this
+                               // one hook of OutputPage::addParserOutputMetadata here.
+                               if ( $params['effectivelanglinks'] ) {
+                                       $linkFlags = [];
+                                       Hooks::run( 'LanguageLinks', [ $titleObj, &$langlinks, &$linkFlags ] );
+                               }
                        }
-               } else {
-                       $langlinks = false;
-               }
 
-               if ( isset( $prop['langlinks'] ) ) {
                        $result_array['langlinks'] = $this->formatLangLinks( $langlinks );
                }
                if ( isset( $prop['categories'] ) ) {
@@ -350,38 +389,42 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['headitems'] ) ) {
-                       $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() );
+                       if ( $skin ) {
+                               $result_array['headitems'] = $this->formatHeadItems( $outputPage->getHeadItemsArray() );
+                       } else {
+                               $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() );
+                       }
                        $this->addDeprecation( 'apiwarn-deprecation-parse-headitems', 'action=parse&prop=headitems' );
                }
 
                if ( isset( $prop['headhtml'] ) ) {
-                       $context = new DerivativeContext( $this->getContext() );
-                       $context->setTitle( $titleObj );
-                       $context->setWikiPage( $pageObj );
-
-                       // We need an OutputPage tied to $context, not to the
-                       // RequestContext at the root of the stack.
-                       $output = new OutputPage( $context );
-                       $output->addParserOutputMetadata( $p_result );
-
-                       $result_array['headhtml'] = $output->headElement( $context->getSkin() );
+                       $result_array['headhtml'] = $outputPage->headElement( $context->getSkin() );
                        $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'headhtml';
                }
 
                if ( isset( $prop['modules'] ) ) {
-                       $result_array['modules'] = array_values( array_unique( $p_result->getModules() ) );
-                       $result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) );
-                       $result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) );
+                       if ( $skin ) {
+                               $result_array['modules'] = $outputPage->getModules();
+                               $result_array['modulescripts'] = $outputPage->getModuleScripts();
+                               $result_array['modulestyles'] = $outputPage->getModuleStyles();
+                       } else {
+                               $result_array['modules'] = array_values( array_unique( $p_result->getModules() ) );
+                               $result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) );
+                               $result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) );
+                       }
                }
 
                if ( isset( $prop['jsconfigvars'] ) ) {
-                       $result_array['jsconfigvars'] =
-                               ApiResult::addMetadataToResultVars( $p_result->getJsConfigVars() );
+                       $jsconfigvars = $skin ? $outputPage->getJsConfigVars() : $p_result->getJsConfigVars();
+                       $result_array['jsconfigvars'] = ApiResult::addMetadataToResultVars( $jsconfigvars );
                }
 
                if ( isset( $prop['encodedjsconfigvars'] ) ) {
+                       $jsconfigvars = $skin ? $outputPage->getJsConfigVars() : $p_result->getJsConfigVars();
                        $result_array['encodedjsconfigvars'] = FormatJson::encode(
-                               $p_result->getJsConfigVars(), false, FormatJson::ALL_OK
+                               $jsconfigvars,
+                               false,
+                               FormatJson::ALL_OK
                        );
                        $result_array[ApiResult::META_SUBELEMENTS][] = 'encodedjsconfigvars';
                }
@@ -392,7 +435,11 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['indicators'] ) ) {
-                       $result_array['indicators'] = (array)$p_result->getIndicators();
+                       if ( $skin ) {
+                               $result_array['indicators'] = (array)$outputPage->getIndicators();
+                       } else {
+                               $result_array['indicators'] = (array)$p_result->getIndicators();
+                       }
                        ApiResult::setArrayType( $result_array['indicators'], 'BCkvp', 'name' );
                }
 
@@ -794,7 +841,10 @@ class ApiParse extends ApiBase {
                        'wrapoutputclass' => 'mw-parser-output',
                        'pst' => false,
                        'onlypst' => false,
-                       'effectivelanglinks' => false,
+                       'effectivelanglinks' => [
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ],
                        'section' => null,
                        'sectiontitle' => [
                                ApiBase::PARAM_TYPE => 'string',
@@ -816,6 +866,9 @@ class ApiParse extends ApiBase {
                        'preview' => false,
                        'sectionpreview' => false,
                        'disabletoc' => false,
+                       'useskin' => [
+                               ApiBase::PARAM_TYPE => array_keys( Skin::getAllowedSkins() ),
+                       ],
                        'contentformat' => [
                                ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
                        ],
index 3e0f270..e1588e7 100644 (file)
        "apihelp-parse-param-preview": "Im Vorschaumodus parsen.",
        "apihelp-parse-param-sectionpreview": "Im Abschnitt Vorschau-Modus parsen (aktiviert ebenfalls den Vorschau-Modus)",
        "apihelp-parse-param-disabletoc": "Inhaltsverzeichnis in der Ausgabe weglassen.",
+       "apihelp-parse-param-useskin": "Wendet die ausgewählte Benutzeroberfläche auf die Parserausgabe an. Kann Auswirkungen auf die folgenden Eigenschaften haben: <kbd>langlinks</kbd>, <kbd>headitems</kbd>, <kbd>modules</kbd>, <kbd>jsconfigvars</kbd>, <kbd>indicators</kbd>.",
        "apihelp-parse-param-contentmodel": "Inhaltsmodell des eingegebenen Textes. Fall ausgelassen, muss $1title angegeben werden und Standardwert wird das Modell des angegebenen Titels. Ist nur gültig im Zusammenhang mit $1text.",
        "apihelp-parse-example-page": "Eine Seite parsen.",
        "apihelp-parse-example-text": "Wikitext parsen.",
index db31552..9670260 100644 (file)
        "apihelp-parse-param-preview": "Parse in preview mode.",
        "apihelp-parse-param-sectionpreview": "Parse in section preview mode (enables preview mode too).",
        "apihelp-parse-param-disabletoc": "Omit table of contents in output.",
+       "apihelp-parse-param-useskin": "Apply the selected skin to the parser output. May affect the following properties: <kbd>langlinks</kbd>, <kbd>headitems</kbd>, <kbd>modules</kbd>, <kbd>jsconfigvars</kbd>, <kbd>indicators</kbd>.",
        "apihelp-parse-param-contentformat": "Content serialization format used for the input text. Only valid when used with $1text.",
        "apihelp-parse-param-contentmodel": "Content model of the input text. If omitted, $1title must be specified, and default will be the model of the specified title. Only valid when used with $1text.",
        "apihelp-parse-example-page": "Parse a page.",
index 36a557a..bc9beb2 100644 (file)
        "apihelp-query+alltransclusions-example-unique": "Különböző beillesztett címek listázása.",
        "apihelp-query+alltransclusions-example-unique-generator": "Az összes beillesztett lap lekérése, hiányzók megjelölése.",
        "apihelp-query+alltransclusions-example-generator": "A beillesztéseket tartalmazó lapok lekérése.",
+       "apihelp-query+allusers-description": "Az összes regisztrált felhasználó visszaadása.",
+       "apihelp-query+allusers-param-from": "A felhasználók listázása ettől a névtől.",
+       "apihelp-query+allusers-param-to": "A felhasználók listázása eddig a névig.",
+       "apihelp-query+allusers-param-prefix": "Ezzel kezdődő nevű felhasználók keresése.",
+       "apihelp-query+allusers-param-dir": "A rendezés iránya.",
+       "apihelp-query+allusers-param-group": "Csak megadott csoportokba tartozó felhasználók visszaadása.",
+       "apihelp-query+allusers-param-excludegroup": "Csak a megadott csoportokba <em>nem</em> tartozó felhasználók visszaadása.",
+       "apihelp-query+allusers-param-rights": "Csak a megadott jogosultságokkal rendelkező felhasználók visszaadása. Ez nem tartalmazza azokat a jogosultságokat, amiket implicit vagy automatikusan hozzáadott csoportok adnak meg, mint a *, a user vagy az autoconfirmed.",
+       "apihelp-query+allusers-param-prop": "Visszaadandó információk:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Információk a felhasználó jelenleg érvényes blokkjáról.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "A felhasználó csoportjai. Ez több szervererőforrást használ, és lehet, hogy a limitnél kevesebb eredményt ad vissza.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "A felhasználó automatikus csoportjai.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "A felhasználó jogosultságai.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "A felhasználó szerkesztésszáma.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "A felhasználó regisztrációjának időbélyege, ha elérhető (lehet üres).",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "A felhasználó központi azonosítói és az összekapcsolási státusza.",
+       "apihelp-query+allusers-param-limit": "A visszaadandó felhasználónevek maximális száma.",
+       "apihelp-query+allusers-param-witheditsonly": "Csak szerkesztéssel rendelkező felhasználók listázása.",
+       "apihelp-query+allusers-param-activeusers": "Csak az elmúlt $1 napban aktív felhasználók listázása.",
+       "apihelp-query+allusers-param-attachedwiki": "Az <kbd>$1prop=centralids</kbd> paraméter mellett annak jelzése, hogy a felhasználó össze van-e kapcsolva a megadott wikivel.",
+       "apihelp-query+allusers-example-Y": "A felhasználók listázása <kbd>Y</kbd>-tól kezdve.",
+       "apihelp-query+authmanagerinfo-description": "Információk lekérése az aktuális azonosítási státuszról.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Annak ellenőrzése, hogy a felhasználó jelenlegi azonosítási státusza megfelelő-e a megadott biztonságkritikus művelethez.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Információk lekérése a megadott azonosítási művelethez szükséges azonosítási kérésekről.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mód|Módok}}: $2",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "SHA-1 hash hozzáadása a fájlhoz.",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "MIME-típus hozzáadása a fájlhoz.",
index 672b7f0..adea9ab 100644 (file)
        "apihelp-parse-param-preview": "{{doc-apihelp-param|parse|preview}}",
        "apihelp-parse-param-sectionpreview": "{{doc-apihelp-param|parse|sectionpreview}}",
        "apihelp-parse-param-disabletoc": "{{doc-apihelp-param|parse|disabletoc}}",
+       "apihelp-parse-param-useskin": "{{doc-apihelp-param|parse|useskin}}",
        "apihelp-parse-param-contentformat": "{{doc-apihelp-param|parse|contentformat}}",
        "apihelp-parse-param-contentmodel": "{{doc-apihelp-param|parse|contentmodel}}",
        "apihelp-parse-example-page": "{{doc-apihelp-example|parse}}",
index d86c395..5992b40 100644 (file)
        "apihelp-paraminfo-param-formatmodules": "Список названий форматных модулей (значения параметра <var>format</var>). Вместо этого используйте <var>$1modules</var>.",
        "apihelp-paraminfo-example-1": "Показать информацию для <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, и <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
        "apihelp-paraminfo-example-2": "Показать информацию для всех подмодулей <kbd>[[Special:ApiHelp/query|action=query]]</kbd>.",
-       "apihelp-parse-description": "Ð\90нализиÑ\80Ñ\83еÑ\82 Ñ\81одеÑ\80жимое Ð¸ Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аеÑ\82 Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82 Ð°Ð½Ð°Ð»Ð¸Ð·Ð°.\n\nСм. Ñ\80азлиÑ\87нÑ\8bе prop-модÑ\83ли <kbd>[[Special:ApiHelp/query|action=query]]</kbd> Ð´Ð»Ñ\8f Ð¿Ð¾Ð»Ñ\83Ñ\87ениÑ\8f Ð¸Ð½Ñ\84оÑ\80маÑ\86ии Ð¾ Ñ\82екÑ\83Ñ\89ей Ð²ÐµÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.\n\nÐ\95Ñ\81Ñ\82Ñ\8c Ð½ÐµÑ\81колÑ\8cко Ñ\81поÑ\81обов Ñ\83казаÑ\82Ñ\8c Ñ\82екÑ\81Ñ\82 Ð´Ð»Ñ\8f Ð°Ð½Ð°Ð»Ð¸Ð·а:\n# Указать страницы или версию, используя <var>$1page</var>, <var>$1pageid</var> или <var>$1oldid</var>.\n# Явно указать содержимое, используя <var>$1text</var>, <var>$1title</var> и <var>$1contentmodel</var>.\n# Указать описание правки. Параметру <var>$1prop</var> должно быть присвоено пустое значение.",
+       "apihelp-parse-description": "Ð\9fаÑ\80Ñ\81иÑ\82 Ñ\81одеÑ\80жимое Ð¸ Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аеÑ\82 Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82 Ð¿Ð°Ñ\80Ñ\81инга.\n\nСм. Ñ\80азлиÑ\87нÑ\8bе prop-модÑ\83ли <kbd>[[Special:ApiHelp/query|action=query]]</kbd> Ð´Ð»Ñ\8f Ð¿Ð¾Ð»Ñ\83Ñ\87ениÑ\8f Ð¸Ð½Ñ\84оÑ\80маÑ\86ии Ð¾ Ñ\82екÑ\83Ñ\89ей Ð²ÐµÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.\n\nÐ\95Ñ\81Ñ\82Ñ\8c Ð½ÐµÑ\81колÑ\8cко Ñ\81поÑ\81обов Ñ\83казаÑ\82Ñ\8c Ñ\82екÑ\81Ñ\82 Ð´Ð»Ñ\8f Ð¿Ð°Ñ\80Ñ\81инга:\n# Указать страницы или версию, используя <var>$1page</var>, <var>$1pageid</var> или <var>$1oldid</var>.\n# Явно указать содержимое, используя <var>$1text</var>, <var>$1title</var> и <var>$1contentmodel</var>.\n# Указать описание правки. Параметру <var>$1prop</var> должно быть присвоено пустое значение.",
        "apihelp-parse-param-title": "Название страницы, которой принадлежит текст. Если опущено, должен быть указан параметр <var>$1contentmodel</var>, и в качестве заголовка будет использовано [[API]].",
-       "apihelp-parse-param-text": "Ð\90нализиÑ\80Ñ\83емый текст. Используйте <var>$1title</var> или <var>$1contentmodel</var> для управления моделью содержимого.",
+       "apihelp-parse-param-text": "РаÑ\81паÑ\80Ñ\81иваемый текст. Используйте <var>$1title</var> или <var>$1contentmodel</var> для управления моделью содержимого.",
        "apihelp-parse-param-summary": "Анализируемое описание правки.",
-       "apihelp-parse-param-page": "Ð\90нализиÑ\80овать содержимое этой страницы. Не может быть использовано совместно с <var>$1text</var> и <var>$1title</var>.",
+       "apihelp-parse-param-page": "РаÑ\81паÑ\80Ñ\81ить содержимое этой страницы. Не может быть использовано совместно с <var>$1text</var> и <var>$1title</var>.",
        "apihelp-parse-param-pageid": "Анализировать содержимое этой страницы. Переопределяет <var>$1page</var>.",
        "apihelp-parse-param-redirects": "Если значением <var>$1page</var> или <var>$1pageid</var> указано перенаправление, разрешить его.",
-       "apihelp-parse-param-oldid": "Ð\90нализиÑ\80овать содержимое этой версии. Переопределяет <var>$1page</var> и <var>$1pageid</var>.",
+       "apihelp-parse-param-oldid": "РаÑ\81паÑ\80Ñ\81ить содержимое этой версии. Переопределяет <var>$1page</var> и <var>$1pageid</var>.",
        "apihelp-parse-param-prop": "Какую информацию включить:",
-       "apihelp-parse-paramvalue-prop-text": "Возвращает текст проанализированного вики-текста.",
-       "apihelp-parse-paramvalue-prop-langlinks": "Возвращает языковые ссылки из проанализированного вики-текста.",
+       "apihelp-parse-paramvalue-prop-text": "Возвращает текст распарсенного вики-текста.",
+       "apihelp-parse-paramvalue-prop-langlinks": "Возвращает языковые ссылки из распарсенного вики-текста.",
        "apihelp-parse-paramvalue-prop-categories": "Возвращает категории из проанализированного вики-текста.",
        "apihelp-parse-paramvalue-prop-categorieshtml": "Возвращает HTML-версию категорий.",
-       "apihelp-parse-paramvalue-prop-links": "Возвращает внутренние ссылки из проанализированного вики-текста.",
+       "apihelp-parse-paramvalue-prop-links": "Возвращает внутренние ссылки из распарсенного вики-текста.",
        "apihelp-parse-paramvalue-prop-templates": "Возвращает шаблоны из проанализированного вики-текста.",
-       "apihelp-parse-paramvalue-prop-images": "Возвращает изображения из проанализированного вики-текста.",
-       "apihelp-parse-paramvalue-prop-externallinks": "Возвращает внешние ссылки из проанализированного вики-текста.",
+       "apihelp-parse-paramvalue-prop-images": "Возвращает изображения из распарсенного вики-текста.",
+       "apihelp-parse-paramvalue-prop-externallinks": "Возвращает внешние ссылки из распарсенного вики-текста.",
        "apihelp-parse-paramvalue-prop-sections": "Возвращает разделы из проанализированного вики-текста.",
-       "apihelp-parse-paramvalue-prop-revid": "Добавляет идентификатор версии проанализированной страницы.",
+       "apihelp-parse-paramvalue-prop-revid": "Добавляет идентификатор версии распарсенной страницы.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Добавляет название проанализированного вики-текста.",
        "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Не поддерживается.</span> Возвращает элементы, которые следует поместить в <code>&lt;head&gt;</code> страницы.",
-       "apihelp-parse-paramvalue-prop-headhtml": "Возвращает проанализированный <code>&lt;head&gt;</code> страницы.",
+       "apihelp-parse-paramvalue-prop-headhtml": "Возвращает распарсенный <code>&lt;head&gt;</code> страницы.",
        "apihelp-parse-paramvalue-prop-modules": "Возвращает использованные на странице модули ResourceLoader. Для загрузки, используйте <code>mw.loader.using()</code>. Одновременно с <kbd>modules</kbd> должно быть запрошено либо <kbd>jsconfigvars</kbd>, либо <kbd>encodedjsconfigvars</kbd>.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Возвращает переменные JavaScript с данными настроек для этой страницы. Для их применения используйте <code>mw.condig.set()</code>.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Возвращает переменные JavaScript с данными настроек для этой страницы в виде JSON-строки.",
        "apihelp-parse-paramvalue-prop-indicators": "Возвращает HTML-код индикаторов, использованных на данной странице.",
-       "apihelp-parse-paramvalue-prop-iwlinks": "Возвращает интервики-ссылки из проанализированного вики-текста.",
-       "apihelp-parse-paramvalue-prop-wikitext": "Возвращает исходный анализируемый вики-текст.",
+       "apihelp-parse-paramvalue-prop-iwlinks": "Возвращает интервики-ссылки из распарсенного вики-текста.",
+       "apihelp-parse-paramvalue-prop-wikitext": "Возвращает исходный распарсиваемый вики-текст.",
        "apihelp-parse-paramvalue-prop-properties": "Возвращает различные свойства, объявленные в проанализированном вики-тексте.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Возвращает структурированный отчёт о лимите. Не возвращает данных, если задан <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Возвращает HTML-версию отчёта о лимите. Не возвращает данных, если задан <var>$1disablelimitreport</var>.",
-       "apihelp-parse-paramvalue-prop-parsetree": "XML-дерево анализа содержимого версии (требуется модель содержимого <code>$1</code>).",
+       "apihelp-parse-paramvalue-prop-parsetree": "Дерево парсинга XML содержимого версии (требуется модель содержимого <code>$1</code>).",
        "apihelp-parse-paramvalue-prop-parsewarnings": "Возвращает предупреждения, возникшие во время анализа.",
-       "apihelp-parse-param-wrapoutputclass": "CSS-клаÑ\81Ñ\81, Ð¸Ñ\81полÑ\8cзÑ\83емÑ\8bй Ð´Ð»Ñ\8f Ð¾Ð±Ð¾Ñ\80аÑ\87иваниÑ\8f Ð²Ñ\8bвода Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ\82ора.",
+       "apihelp-parse-param-wrapoutputclass": "CSS-клаÑ\81Ñ\81, Ð¸Ñ\81полÑ\8cзÑ\83емÑ\8bй Ð´Ð»Ñ\8f Ð¾Ð±Ð¾Ñ\80аÑ\87иваниÑ\8f Ð²Ñ\8bвода Ð¿Ð°Ñ\80Ñ\81ера.",
        "apihelp-parse-param-pst": "Выполнить преобразование перед записью правки (PST) до того, как начать анализировать текст. Доступно только когда используется с текстом.",
-       "apihelp-parse-param-onlypst": "Ð\92Ñ\8bполниÑ\82Ñ\8c Ð¿Ñ\80еобÑ\80азование Ð¿ÐµÑ\80ед Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\8e Ð¿Ñ\80авки (PST) Ð²Ñ\85однÑ\8bÑ\85 Ð´Ð°Ð½Ð½Ñ\8bÑ\85, Ð½Ð¾ Ð½Ðµ Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ\80овать их. Возвращает тот же вики-текст после применения PST. Доступно только при применении с <var>$1text</var>.",
+       "apihelp-parse-param-onlypst": "Ð\92Ñ\8bполниÑ\82Ñ\8c Ð¿Ñ\80еобÑ\80азование Ð¿ÐµÑ\80ед Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\8e Ð¿Ñ\80авки (PST) Ð²Ñ\85однÑ\8bÑ\85 Ð´Ð°Ð½Ð½Ñ\8bÑ\85, Ð½Ð¾ Ð½Ðµ Ð¿Ð°Ñ\80Ñ\81ить их. Возвращает тот же вики-текст после применения PST. Доступно только при применении с <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Включает языковые ссылки, обеспечиваемые расширениями (для использования с <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "Ð\9fÑ\80оанализиÑ\80оваÑ\82Ñ\8c Ñ\81одеÑ\80жимое Ñ\82олÑ\8cко Ñ\81екÑ\86ии Ñ\81 Ð·Ð°Ð´Ð°Ð½Ð½Ñ\8bм Ð½Ð¾Ð¼ÐµÑ\80ом.\n\nÐ\95Ñ\81ли Ð·Ð°Ð´Ð°Ð½ <kbd>new</kbd>, Ð¿Ñ\80оанализиÑ\80овать <var>$1text</var> и <var>$1sectiontitle</var> так, как будто добавлена новая секция на страницу.\n\n<kbd>new</kbd> доступен только при заданном <var>text</var>.",
+       "apihelp-parse-param-section": "РаÑ\81паÑ\80Ñ\81иÑ\82Ñ\8c Ñ\81одеÑ\80жимое Ñ\82олÑ\8cко Ñ\81екÑ\86ии Ñ\81 Ð·Ð°Ð´Ð°Ð½Ð½Ñ\8bм Ð½Ð¾Ð¼ÐµÑ\80ом.\n\nÐ\95Ñ\81ли Ð·Ð°Ð´Ð°Ð½ <kbd>new</kbd>, Ñ\80аÑ\81паÑ\80Ñ\81ить <var>$1text</var> и <var>$1sectiontitle</var> так, как будто добавлена новая секция на страницу.\n\n<kbd>new</kbd> доступен только при заданном <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Название новой секции, когда <var>section</var> имеет значение <kbd>new</kbd>.\n\nВ отличие от редактирования страницы, оно не примет значение параметра <var>summary</var>, если опустить его или оставить пустым.",
-       "apihelp-parse-param-disablelimitreport": "Ð\9eпÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ð¾Ñ\82Ñ\87Ñ\91Ñ\82 Ð¾ Ð»Ð¸Ð¼Ð¸Ñ\82е («NewPP limit report») Ð¸Ð· Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82а Ð°Ð½Ð°Ð»Ð¸Ð·а.",
+       "apihelp-parse-param-disablelimitreport": "Ð\9eпÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ð¾Ñ\82Ñ\87Ñ\91Ñ\82 Ð¾ Ð»Ð¸Ð¼Ð¸Ñ\82е («NewPP limit report») Ð¸Ð· Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82а Ð¿Ð°Ñ\80Ñ\81инга.",
        "apihelp-parse-param-disablepp": "Вместо этого используйте <var>$1disablelimitreport</var>.",
-       "apihelp-parse-param-disableeditsection": "Ð\9eпÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\81Ñ\81Ñ\8bлки Ð½Ð° Ñ\80едакÑ\82иÑ\80ование Ñ\80азделов Ð¸Ð· Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82а Ð°Ð½Ð°Ð»Ð¸Ð·а.",
-       "apihelp-parse-param-disabletidy": "Ð\9dе Ð¿Ñ\80оводиÑ\82Ñ\8c Ð¾Ñ\87иÑ\81Ñ\82кÑ\83 HTML (напÑ\80имеÑ\80, Ñ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e tidy) Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82ов Ð°Ð½Ð°Ð»Ð¸Ð·а.",
-       "apihelp-parse-param-generatexml": "Сгенерировать XML-дерево анализа (требуется модель содержимого <code>$1</code>, замещено <kbd>$2prop=parsetree</kbd>).",
+       "apihelp-parse-param-disableeditsection": "Ð\9eпÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\81Ñ\81Ñ\8bлки Ð½Ð° Ñ\80едакÑ\82иÑ\80ование Ñ\80азделов Ð¸Ð· Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82а Ð¿Ð°Ñ\80Ñ\81инга.",
+       "apihelp-parse-param-disabletidy": "Ð\9dе Ð¿Ñ\80оводиÑ\82Ñ\8c Ð¾Ñ\87иÑ\81Ñ\82кÑ\83 HTML (напÑ\80имеÑ\80, Ñ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e tidy) Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82ов Ð¿Ð°Ñ\80Ñ\81инга.",
+       "apihelp-parse-param-generatexml": "Сгенерировать дерево парсинга XML (требуется модель содержимого <code>$1</code>, замещено <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Проанализировать в режиме препросмотра.",
-       "apihelp-parse-param-sectionpreview": "Ð\9fÑ\80оанализиÑ\80овать в режиме предпросмотра раздела (также активирует режим предпросмотра).",
+       "apihelp-parse-param-sectionpreview": "РаÑ\81паÑ\80Ñ\81ить в режиме предпросмотра раздела (также активирует режим предпросмотра).",
        "apihelp-parse-param-disabletoc": "Не включать в вывод содержание.",
        "apihelp-parse-param-contentformat": "Формат сериализации содержимого, использующийся во входном тексте. Доступен только при использовании с $1text.",
        "apihelp-parse-param-contentmodel": "Модель содержимого входного текста. Если пропущена, должен быть задан $1title, и значение по умолчанию будет взято в зависимости от указанного названия. Доступно только при использовании с $1text.",
-       "apihelp-parse-example-page": "Ð\90нализ страницы.",
+       "apihelp-parse-example-page": "Ð\9fаÑ\80Ñ\81инг страницы.",
        "apihelp-parse-example-text": "Анализ вики-текста.",
-       "apihelp-parse-example-texttitle": "Ð\90нализ вики-текста с заданным заголовком страницы.",
+       "apihelp-parse-example-texttitle": "Ð\9fаÑ\80Ñ\81инг вики-текста с заданным заголовком страницы.",
        "apihelp-parse-example-summary": "Анализ описания правки.",
        "apihelp-patrol-description": "Патрулирование страницы или версии.",
        "apihelp-patrol-param-rcid": "Идентификатор патрулируемой последней правки.",
        "apihelp-query+allmessages-description": "Возвращает сообщения с этого сайта.",
        "apihelp-query+allmessages-param-messages": "Какие сообщения выводить. <kbd>*</kbd> (по умолчанию) означает «все сообщения».",
        "apihelp-query+allmessages-param-prop": "Какие свойства получить:",
-       "apihelp-query+allmessages-param-enableparser": "УÑ\81Ñ\82ановиÑ\82е, Ñ\87Ñ\82обÑ\8b Ð°ÐºÑ\82ивиÑ\80оваÑ\82Ñ\8c Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ\82ор, который будет обрабатывать вики-текст сообщений (подставлять магические слова, обрабатывать шаблоны, и так далее).",
+       "apihelp-query+allmessages-param-enableparser": "УÑ\81Ñ\82ановиÑ\82е, Ñ\87Ñ\82обÑ\8b Ð°ÐºÑ\82ивиÑ\80оваÑ\82Ñ\8c Ð¿Ð°Ñ\80Ñ\81ер, который будет обрабатывать вики-текст сообщений (подставлять магические слова, обрабатывать шаблоны, и так далее).",
        "apihelp-query+allmessages-param-nocontent": "Если установлен, ничего не делать с содержимым сообщений перед выводом.",
        "apihelp-query+allmessages-param-includelocal": "Также включить локальные сообщения, то есть, сообщения, не существующие в программе, но существующие в пространстве имён {{ns:MediaWiki}}. Это перечислит все страницы из пространства {{ns:MediaWiki}}, поэтому в результат также могут попасть страницы, не являющимися сообщениями — например, [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Аргументы, подставляемые в сообщение.",
index e9a6edc..c3f798f 100644 (file)
@@ -1660,7 +1660,7 @@ class AuthManager implements LoggerAwareInterface {
                        }
                }
 
-               $backoffKey = wfMemcKey( 'AuthManager', 'autocreate-failed', md5( $username ) );
+               $backoffKey = $cache->makeKey( 'AuthManager', 'autocreate-failed', md5( $username ) );
                if ( $cache->get( $backoffKey ) ) {
                        $this->logger->debug( __METHOD__ . ': {username} denied by prior creation attempt failures', [
                                'username' => $username,
index 8a10ecb..3125bd3 100644 (file)
@@ -127,7 +127,7 @@ class Throttler implements LoggerAwareInterface {
                                continue;
                        }
 
-                       $throttleKey = wfGlobalCacheKey( 'throttler', $this->type, $index, $ipKey, $userKey );
+                       $throttleKey = $this->cache->makeGlobalKey( 'throttler', $this->type, $index, $ipKey, $userKey );
                        $throttleCount = $this->cache->get( $throttleKey );
 
                        if ( !$throttleCount ) { // counter not started yet
@@ -170,7 +170,7 @@ class Throttler implements LoggerAwareInterface {
                $userKey = $username ? md5( $username ) : null;
                foreach ( $this->conditions as $index => $specificThrottle ) {
                        $ipKey = isset( $specificThrottle['allIPs'] ) ? null : $ip;
-                       $throttleKey = wfGlobalCacheKey( 'throttler', $this->type, $index, $ipKey, $userKey );
+                       $throttleKey = $this->cache->makeGlobalKey( 'throttler', $this->type, $index, $ipKey, $userKey );
                        $this->cache->delete( $throttleKey );
                }
        }
index 0a302b6..f2da08a 100644 (file)
@@ -242,14 +242,14 @@ abstract class FileCacheBase {
                                : IP::sanitizeRange( "$ip/16" );
 
                        # Bail out if a request already came from this range...
-                       $key = wfMemcKey( static::class, 'attempt', $this->mType, $this->mKey, $ip );
+                       $key = $cache->makeKey( static::class, 'attempt', $this->mType, $this->mKey, $ip );
                        if ( $cache->get( $key ) ) {
                                return; // possibly the same user
                        }
                        $cache->set( $key, 1, self::MISS_TTL_SEC );
 
                        # Increment the number of cache misses...
-                       $key = $this->cacheMissKey();
+                       $key = $this->cacheMissKey( $cache );
                        if ( $cache->get( $key ) === false ) {
                                $cache->set( $key, 1, self::MISS_TTL_SEC );
                        } else {
@@ -265,13 +265,14 @@ abstract class FileCacheBase {
        public function getMissesRecent() {
                $cache = ObjectCache::getLocalClusterInstance();
 
-               return self::MISS_FACTOR * $cache->get( $this->cacheMissKey() );
+               return self::MISS_FACTOR * $cache->get( $this->cacheMissKey( $cache ) );
        }
 
        /**
+        * @param BagOStuff $cache Instance that the key will be used with
         * @return string
         */
-       protected function cacheMissKey() {
-               return wfMemcKey( static::class, 'misses', $this->mType, $this->mKey );
+       protected function cacheMissKey( BagOStuff $cache ) {
+               return $cache->makeKey( static::class, 'misses', $this->mType, $this->mKey );
        }
 }
index 146d9c6..ff6a873 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Change tagging
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\Database;
 
 class ChangeTags {
@@ -1177,8 +1178,9 @@ class ChangeTags {
                if ( !Hooks::isRegistered( 'ChangeTagsListActive' ) ) {
                        return $tags;
                }
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       wfMemcKey( 'active-tags' ),
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'active-tags' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $tags ) {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) );
@@ -1188,7 +1190,7 @@ class ChangeTags {
                                return $tags;
                        },
                        [
-                               'checkKeys' => [ wfMemcKey( 'active-tags' ) ],
+                               'checkKeys' => [ $cache->makeKey( 'active-tags' ) ],
                                'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
                                'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
@@ -1231,8 +1233,9 @@ class ChangeTags {
        public static function listExplicitlyDefinedTags() {
                $fname = __METHOD__;
 
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       wfMemcKey( 'valid-tags-db' ),
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'valid-tags-db' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_REPLICA );
@@ -1244,7 +1247,7 @@ class ChangeTags {
                                return array_filter( array_unique( $tags ) );
                        },
                        [
-                               'checkKeys' => [ wfMemcKey( 'valid-tags-db' ) ],
+                               'checkKeys' => [ $cache->makeKey( 'valid-tags-db' ) ],
                                'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
                                'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
@@ -1266,8 +1269,9 @@ class ChangeTags {
                if ( !Hooks::isRegistered( 'ListDefinedTags' ) ) {
                        return $tags;
                }
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       wfMemcKey( 'valid-tags-hook' ),
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'valid-tags-hook' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $tags ) {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) );
@@ -1276,7 +1280,7 @@ class ChangeTags {
                                return array_filter( array_unique( $tags ) );
                        },
                        [
-                               'checkKeys' => [ wfMemcKey( 'valid-tags-hook' ) ],
+                               'checkKeys' => [ $cache->makeKey( 'valid-tags-hook' ) ],
                                'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
                                'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
@@ -1300,11 +1304,11 @@ class ChangeTags {
         * @since 1.25
         */
        public static function purgeTagCacheAll() {
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 
-               $cache->touchCheckKey( wfMemcKey( 'active-tags' ) );
-               $cache->touchCheckKey( wfMemcKey( 'valid-tags-db' ) );
-               $cache->touchCheckKey( wfMemcKey( 'valid-tags-hook' ) );
+               $cache->touchCheckKey( $cache->makeKey( 'active-tags' ) );
+               $cache->touchCheckKey( $cache->makeKey( 'valid-tags-db' ) );
+               $cache->touchCheckKey( $cache->makeKey( 'valid-tags-hook' ) );
 
                self::purgeTagUsageCache();
        }
@@ -1314,9 +1318,9 @@ class ChangeTags {
         * @since 1.25
         */
        public static function purgeTagUsageCache() {
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 
-               $cache->touchCheckKey( wfMemcKey( 'change-tag-statistics' ) );
+               $cache->touchCheckKey( $cache->makeKey( 'change-tag-statistics' ) );
        }
 
        /**
@@ -1331,8 +1335,9 @@ class ChangeTags {
         */
        public static function tagUsageStatistics() {
                $fname = __METHOD__;
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       wfMemcKey( 'change-tag-statistics' ),
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'change-tag-statistics' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_REPLICA, 'vslow' );
@@ -1355,7 +1360,7 @@ class ChangeTags {
                                return $out;
                        },
                        [
-                               'checkKeys' => [ wfMemcKey( 'change-tag-statistics' ) ],
+                               'checkKeys' => [ $cache->makeKey( 'change-tag-statistics' ) ],
                                'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
                                'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
index 7116c22..0ad0527 100644 (file)
@@ -2170,7 +2170,7 @@ abstract class File implements IDBAccessObject {
                                        $metadata = MediaWiki\quietCall( 'unserialize', $metadata );
                                }
 
-                               return $handler->getContentHeaders( $metadata );
+                               return $handler->getContentHeaders( $metadata, $this->getWidth(), $this->getHeight() );
                        }
                }
 
index 194c0ed..8514cc8 100644 (file)
@@ -1202,7 +1202,9 @@ class LocalFile extends File {
                if ( $handler ) {
                        $metadata = MediaWiki\quietCall( 'unserialize', $props['metadata'] );
 
-                       $options['headers'] = $handler->getContentHeaders( $metadata );
+                       $options['headers'] = $handler->getContentHeaders(
+                               $metadata, $props['width'], $props['height']
+                       );
                } else {
                        $options['headers'] = [];
                }
index 374e166..dcd276c 100644 (file)
@@ -465,9 +465,12 @@ class DjVuHandler extends ImageHandler {
        /**
        * Get useful response headers for GET/HEAD requests for a file with the given metadata
        * @param $metadata Array Contains this handler's unserialized getMetadata() for a file
-       * @return array
+       * @param $fallbackWidth int|null Width to fall back to if metadata doesn't have any
+       * @param $fallbackHeight int|null Height to fall back to if metadata doesn't have any
+       * @return Array
+       * @since 1.30
        */
-       public function getContentHeaders( $metadata ) {
+       public function getContentHeaders( $metadata, $fallbackWidth = null, $fallbackHeight = null ) {
                if ( !is_array( $metadata ) || !isset( $metadata['xml'] ) ) {
                        return [];
                }
index 621a4aa..95fa859 100644 (file)
@@ -117,11 +117,6 @@ class Exif {
                 * @link http://exif.org/Exif2-2.PDF The Exif 2.2 specification
                 */
                $this->mExifTags = [
-                       'COMPUTED' => [
-                               'Width' => Exif::SHORT_OR_LONG, # Image width
-                               'Height' => Exif::SHORT_OR_LONG, # Image height
-                       ],
-
                        # TIFF Rev. 6.0 Attribute Information (p22)
                        'IFD0' => [
                                # Tags relating to image structure
index cf4b12e..0e10abb 100644 (file)
@@ -242,36 +242,4 @@ class ExifBitmapHandler extends BitmapHandler {
 
                return 0;
        }
-
-       /**
-       * Get useful response headers for GET/HEAD requests for a file with the given metadata
-       * @param $metadata Array Contains this handler's unserialized getMetadata() for a file
-       * @return Array
-       */
-       public function getContentHeaders( $metadata ) {
-               if ( !isset( $metadata['Width'] ) || !isset( $metadata['Height'] ) ) {
-                       return [];
-               }
-
-               $dimensionsMetadata = [];
-
-               if ( $this->autoRotateEnabled() && isset( $metadata['Orientation'] ) ) {
-                       switch ( $metadata['Orientation'] ) {
-                               case 5: // CCW flipped
-                               case 6: // CCW
-                               case 7: // CW flipped
-                               case 8: // CW
-                                       $dimensionsMetadata['width'] = $metadata['Height'];
-                                       $dimensionsMetadata['height'] = $metadata['Width'];
-                                       break;
-                       }
-               }
-
-               if ( !isset( $dimensionsMetadata['width'] ) ) {
-                       $dimensionsMetadata['width'] = $metadata['Width'];
-                       $dimensionsMetadata['height'] = $metadata['Height'];
-               }
-
-               return parent::getContentHeaders( $dimensionsMetadata );
-       }
 }
index 2c541e0..69982c2 100644 (file)
@@ -24,6 +24,7 @@
  * @see http://exif.org/Exif2-2.PDF The Exif 2.2 specification
  * @file
  */
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Timestamp\TimestampException;
 
 /**
@@ -101,9 +102,6 @@ class FormatMetadata extends ContextSource {
        public function makeFormattedData( $tags ) {
                $resolutionunit = !isset( $tags['ResolutionUnit'] ) || $tags['ResolutionUnit'] == 2 ? 2 : 3;
                unset( $tags['ResolutionUnit'] );
-               // Width and height are for internal use and already available & displayed outside of metadata
-               unset( $tags['Width'] );
-               unset( $tags['Height'] );
 
                foreach ( $tags as $tag => &$vals ) {
                        // This seems ugly to wrap non-array's in an array just to unwrap again,
@@ -1584,14 +1582,14 @@ class FormatMetadata extends ContextSource {
         * @since 1.23
         */
        public function fetchExtendedMetadata( File $file ) {
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 
                // If revision deleted, exit immediately
                if ( $file->isDeleted( File::DELETED_FILE ) ) {
                        return [];
                }
 
-               $cacheKey = wfMemcKey(
+               $cacheKey = $cache->makeKey(
                        'getExtendedMetadata',
                        $this->getLanguage()->getCode(),
                        (int)$this->singleLang,
index b4c3d6e..ac5fc81 100644 (file)
@@ -254,8 +254,6 @@ class GIFMetadataExtractor {
                        'duration' => $duration,
                        'xmp' => $xmp,
                        'comment' => $comment,
-                       'width' => $width,
-                       'height' => $height,
                ];
        }
 
index a8744a1..ec4d372 100644 (file)
@@ -916,12 +916,26 @@ abstract class MediaHandler {
        /**
        * Get useful response headers for GET/HEAD requests for a file with the given metadata
        * @param $metadata Array Contains this handler's unserialized getMetadata() for a file
+       * @param $fallbackWidth int|null Width to fall back to if metadata doesn't have any
+       * @param $fallbackHeight int|null Height to fall back to if metadata doesn't have any
        * @return Array
        * @since 1.30
        */
-       public function getContentHeaders( $metadata ) {
-               if ( !isset( $metadata['width'] ) || !isset( $metadata['height'] ) ) {
-                       return [];
+       public function getContentHeaders( $metadata, $fallbackWidth = null, $fallbackHeight = null ) {
+               if ( !isset( $metadata['width'] ) ) {
+                       if ( is_null( $fallbackWidth ) ) {
+                               return [];
+                       }
+
+                       $metadata['width'] = $fallbackWidth;
+               }
+
+               if ( !isset( $metadata['height'] ) ) {
+                       if ( is_null( $fallbackHeight ) ) {
+                               return [];
+                       }
+
+                       $metadata['height'] = $fallbackHeight;
                }
 
                $dimensionString = $metadata['width'] . 'x' . $metadata['height'];
index 1cb2ec0..c12ca0b 100644 (file)
@@ -406,8 +406,6 @@ class PNGMetadataExtractor {
                        'text' => $text,
                        'bitDepth' => $bitDepth,
                        'colorType' => $colorType,
-                       'width' => $width,
-                       'height' => $height,
                ];
        }
 
index bc1e2fb..c419524 100644 (file)
@@ -175,9 +175,6 @@ class XCFHandler extends BitmapHandler {
                                $metadata['colorType'] = 'unknown';
 
                        }
-
-                       $metadata['width'] = $header['width'];
-                       $metadata['height'] = $header['height'];
                } else {
                        // Marker to prevent repeated attempted extraction
                        $metadata['error'] = true;
index ecee0e2..b3e37a4 100644 (file)
@@ -4400,7 +4400,6 @@ class Parser {
                        $toc = Linker::tocList( $toc, $this->mOptions->getUserLangObj() );
                        $this->mOutput->setTOCHTML( $toc );
                        $toc = self::TOC_START . $toc . self::TOC_END;
-                       $this->mOutput->addModules( 'mediawiki.toc' );
                }
 
                if ( $isMain ) {
index 0423f71..0c5a67e 100644 (file)
@@ -137,7 +137,7 @@ class ExtensionRegistry {
                        $cache = new EmptyBagOStuff();
                }
                // See if this queue is in APC
-               $key = wfMemcKey(
+               $key = $cache->makeKey(
                        'registration',
                        md5( json_encode( $this->queued + $versions ) )
                );
index 8633715..d37b73b 100644 (file)
@@ -132,7 +132,7 @@ final class SessionBackend {
                $this->forceHTTPS = $info->forceHTTPS();
                $this->providerMetadata = $info->getProviderMetadata();
 
-               $blob = $store->get( wfMemcKey( 'MWSession', (string)$this->id ) );
+               $blob = $store->get( $store->makeKey( 'MWSession', (string)$this->id ) );
                if ( !is_array( $blob ) ||
                        !isset( $blob['metadata'] ) || !is_array( $blob['metadata'] ) ||
                        !isset( $blob['data'] ) || !is_array( $blob['data'] )
@@ -249,7 +249,7 @@ final class SessionBackend {
                        $this->autosave();
 
                        // Delete the data for the old session ID now
-                       $this->store->delete( wfMemcKey( 'MWSession', $oldId ) );
+                       $this->store->delete( $this->store->makeKey( 'MWSession', $oldId ) );
                }
        }
 
@@ -317,7 +317,7 @@ final class SessionBackend {
 
                        // Delete the session data, so the local cache-only write in
                        // self::save() doesn't get things out of sync with the backend.
-                       $this->store->delete( wfMemcKey( 'MWSession', (string)$this->id ) );
+                       $this->store->delete( $this->store->makeKey( 'MWSession', (string)$this->id ) );
 
                        $this->autosave();
                }
@@ -729,7 +729,7 @@ final class SessionBackend {
                $flags = $this->persist ? 0 : CachedBagOStuff::WRITE_CACHE_ONLY;
                $flags |= CachedBagOStuff::WRITE_SYNC; // write to all datacenters
                $this->store->set(
-                       wfMemcKey( 'MWSession', (string)$this->id ),
+                       $this->store->makeKey( 'MWSession', (string)$this->id ),
                        [
                                'data' => $this->data,
                                'metadata' => $metadata,
index 7cc8509..40a568f 100644 (file)
@@ -214,7 +214,7 @@ final class SessionManager implements SessionManagerInterface {
                }
 
                // Test if the session is in storage, and if so try to load it.
-               $key = wfMemcKey( 'MWSession', $id );
+               $key = $this->store->makeKey( 'MWSession', $id );
                if ( is_array( $this->store->get( $key ) ) ) {
                        $create = false; // If loading fails, don't bother creating because it probably will fail too.
                        if ( $this->loadSessionInfoFromStore( $info, $request ) ) {
@@ -255,7 +255,7 @@ final class SessionManager implements SessionManagerInterface {
                                throw new \InvalidArgumentException( 'Invalid session ID' );
                        }
 
-                       $key = wfMemcKey( 'MWSession', $id );
+                       $key = $this->store->makeKey( 'MWSession', $id );
                        if ( is_array( $this->store->get( $key ) ) ) {
                                throw new \InvalidArgumentException( 'Session ID already exists' );
                        }
@@ -545,7 +545,7 @@ final class SessionManager implements SessionManagerInterface {
         * @return bool Whether the session info matches the stored data (if any)
         */
        private function loadSessionInfoFromStore( SessionInfo &$info, WebRequest $request ) {
-               $key = wfMemcKey( 'MWSession', $info->getId() );
+               $key = $this->store->makeKey( 'MWSession', $info->getId() );
                $blob = $this->store->get( $key );
 
                // If we got data from the store and the SessionInfo says to force use,
@@ -934,7 +934,7 @@ final class SessionManager implements SessionManagerInterface {
        public function generateSessionId() {
                do {
                        $id = \Wikimedia\base_convert( \MWCryptRand::generateHex( 40 ), 16, 32, 32 );
-                       $key = wfMemcKey( 'MWSession', $id );
+                       $key = $this->store->makeKey( 'MWSession', $id );
                } while ( isset( $this->allSessionIds[$id] ) || is_array( $this->store->get( $key ) ) );
                return $id;
        }
index 7f00767..ccb202e 100644 (file)
@@ -158,8 +158,17 @@ abstract class Skin extends ContextSource {
                global $wgUseAjax, $wgEnableAPI, $wgEnableWriteAPI;
 
                $out = $this->getOutput();
+               $config = $this->getConfig();
                $user = $out->getUser();
                $modules = [
+                       // modules not specific to any specific skin or page
+                       'core' => [
+                               // Enforce various default modules for all pages and all skins
+                               // Keep this list as small as possible
+                               'site',
+                               'mediawiki.page.startup',
+                               'mediawiki.user',
+                       ],
                        // modules that enhance the page content in some way
                        'content' => [
                                'mediawiki.page.ready',
@@ -172,6 +181,11 @@ abstract class Skin extends ContextSource {
                        'user' => [],
                ];
 
+               // Support for high-density display images if enabled
+               if ( $config->get( 'ResponsiveImages' ) ) {
+                       $modules['core'][] = 'mediawiki.hidpi';
+               }
+
                // Preload jquery.tablesorter for mediawiki.page.ready
                if ( strpos( $out->getHTML(), 'sortable' ) !== false ) {
                        $modules['content'][] = 'jquery.tablesorter';
@@ -182,6 +196,10 @@ abstract class Skin extends ContextSource {
                        $modules['content'][] = 'jquery.makeCollapsible';
                }
 
+               if ( $out->isTOCEnabled() ) {
+                       $modules['content'][] = 'mediawiki.toc';
+               }
+
                // Add various resources if required
                if ( $wgUseAjax && $wgEnableAPI ) {
                        if ( $wgEnableWriteAPI && $user->isLoggedIn()
@@ -1489,7 +1507,7 @@ abstract class Skin extends ContextSource {
                }
 
                // Use the extra hash appender to let eg SSL variants separately cache.
-               $key = wfMemcKey( $name . $wgRenderHashAppend );
+               $key = $parserMemc->makeKey( $name . $wgRenderHashAppend );
                $cachedNotice = $parserMemc->get( $key );
                if ( is_array( $cachedNotice ) ) {
                        if ( md5( $notice ) == $cachedNotice['hash'] ) {
index 99b135d..38a665d 100644 (file)
        "showhideselectedversions": "Wys/versteek gekose weergawes",
        "editundo": "maak ongedaan",
        "diff-empty": "(Geen verskil)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur dieselfde gebruiker nie gewys nie)",
-       "diff-multi-manyusers": "({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur meer as $2 {{PLURAL:$2|gebruiker|gebruikers}} nie gewys nie)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Een wysiging tussenin|$1 wysigings tussenin}} deur dieselfde gebruiker nie gewys nie)",
+       "diff-multi-manyusers": "({{PLURAL:$1|Een wysiging tussenin|$1 wysigings tussenin}} deur meer as $2 {{PLURAL:$2|gebruiker|gebruikers}} nie gewys nie)",
        "difference-missing-revision": "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.\n\nDit word meestal veroorsaak deur die volg van 'n verouderde verwysing na 'n bladsy wat verwyder is.\nDetails kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
        "searchresults": "Soekresultate",
        "searchresults-title": "Soekresultate vir \"$1\"",
index 9e3825a..cdc89b5 100644 (file)
        "historyaction-submit": "Wapata",
        "dellogpage": " Nesitc ka wepinikatek kanaweritcikan",
        "rollbacklink": "e maninakatek",
-       "rollbacklinkcount": " nesitc wepina$1 {{PLURAL:$1|kweskisinikan|kweskisinihikana}}",
+       "rollbacklinkcount": " nesitc wepina $1 {{PLURAL:$1|kweskisinikan|kweskisinihikana}}",
        "protectlogpage": "Nanakatisiwina wapatcikan",
        "restriction-edit": "Meckotcita",
        "undeleteviewlink": "tapwatcike",
index 3c60ae8..d072f37 100644 (file)
        "rcfilters-filter-watchlist-watchednew-label": "Новыя зьмены ў сьпісе назіраньня",
        "rcfilters-filter-watchlist-watchednew-description": "Зьмены старонак у вашым сьпісе назіраньня, якія вы не наведвалі з моманту гэтых зьменаў.",
        "rcfilters-filter-watchlist-notwatched-label": "Ня ў сьпісе назіраньня",
+       "rcfilters-filter-watchlist-notwatched-description": "Усё, за выключэньнем зьменаў старонак з вашага сьпісу назіраньня.",
        "rcfilters-filtergroup-changetype": "Тып зьмены",
        "rcfilters-filter-pageedits-label": "Рэдагаваньні старонкі",
        "rcfilters-filter-pageedits-description": "Рэдагаваньні вікізьместу, абмеркаваньняў, апісаньняў катэгорыяў…",
index 411d5c9..840d333 100644 (file)
        "rcfilters-savedqueries-defaultlabel": "Съхранени филтри",
        "rcfilters-savedqueries-rename": "Преименуване",
        "rcfilters-savedqueries-setdefault": "Съхраняване по подразбиране",
-       "rcfilters-savedqueries-unsetdefault": "Ð\9eÑ\82мÑ\8fна Ð½Ð° Ñ\81Ñ\8aÑ\85Ñ\80анÑ\8fванеÑ\82о по подразбиране",
+       "rcfilters-savedqueries-unsetdefault": "Ð\9fÑ\80емаÑ\85ване по подразбиране",
        "rcfilters-savedqueries-remove": "Премахване",
        "rcfilters-savedqueries-new-name-label": "Име",
+       "rcfilters-savedqueries-apply-label": "Създаване на бърза връзка",
        "rcfilters-savedqueries-cancel-label": "Отказ",
-       "rcfilters-restore-default-filters": "Възстановяване на филтри по подразбиране",
+       "rcfilters-savedqueries-add-new-title": "Съхраняване на филтрите като бърза връзка",
+       "rcfilters-restore-default-filters": "Възстановяване на филтрите по подразбиране",
        "rcfilters-clear-all-filters": "Изчистване на всички филтри",
        "rcfilters-search-placeholder": "Филтриране на последните промени (изберете или започнете да въвеждате)",
+       "rcfilters-invalid-filter": "Невалиден филтър",
        "rcfilters-empty-filter": "Няма активни филтри. Показани са всички редакции.",
        "rcfilters-filterlist-title": "Филтри",
        "rcfilters-filterlist-whatsthis": "Какво е това?",
+       "rcfilters-filterlist-feedbacklink": "Оставете коментар за новите (бета) филтри",
        "rcfilters-highlightbutton-title": "Отбелязване на резултатите",
        "rcfilters-highlightmenu-title": "Изберете цвят",
        "rcfilters-highlightmenu-help": "Изберете цвят за отбелязване на свойството",
        "rcfilters-filter-registered-description": "Влезли в системата редактори.",
        "rcfilters-filter-unregistered-label": "Нерегистрирани",
        "rcfilters-filter-unregistered-description": "Редактори, които не са влезли в системата.",
+       "rcfilters-filtergroup-authorship": "Авторство на редакциите",
        "rcfilters-filter-editsbyself-label": "Ваши редакции",
        "rcfilters-filter-editsbyself-description": "Ваши редакции.",
        "rcfilters-filter-editsbyother-label": "Чужди редакции",
        "rcfilters-filter-editsbyother-description": "Всички редакции с изключение на вашите собствени.",
+       "rcfilters-filtergroup-userExpLevel": "Ниво на опита (само за регистрирани потребители)",
        "rcfilters-filter-user-experience-level-newcomer-label": "Новодошли",
        "rcfilters-filter-user-experience-level-newcomer-description": "По-малко от 10 редакции и 5 дни активност.",
        "rcfilters-filter-user-experience-level-learner-label": "Учещи се",
        "rcfilters-filter-minor-label": "Малки промени",
        "rcfilters-filter-minor-description": "Редакции, които не са отбелязани като малки промени.",
        "rcfilters-filter-major-label": "Обикновени редакции",
+       "rcfilters-filter-major-description": "Редакции, които не са отбелязани като малки промени.",
+       "rcfilters-filtergroup-watchlist": "Страници от списъка за наблюдение",
+       "rcfilters-filter-watchlist-watched-label": "В списъка за наблюдение",
+       "rcfilters-filter-watchlist-watched-description": "Промени в страници от списъка за наблюдение.",
+       "rcfilters-filter-watchlist-watchednew-label": "Нови промени в списъка за наблюдение",
+       "rcfilters-filter-watchlist-watchednew-description": "Промени в страниците от списъка за наблюдение, които не сте посетили от извършването им.",
+       "rcfilters-filter-watchlist-notwatched-label": "Извън списъка за наблюдение",
+       "rcfilters-filter-watchlist-notwatched-description": "Всички, освен промените в страници от списъка за наблюдение.",
        "rcfilters-filtergroup-changetype": "Вид на промяната",
        "rcfilters-filter-pageedits-label": "Редакции на страници",
-       "rcfilters-filter-pageedits-description": "РедакÑ\86ии Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о, Ð´Ð¸Ñ\81кÑ\83Ñ\81ии, описания на категории...",
+       "rcfilters-filter-pageedits-description": "РедакÑ\86ии Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о, Ð±ÐµÑ\81еди, описания на категории...",
        "rcfilters-filter-newpages-label": "Създавания на страници",
        "rcfilters-filter-newpages-description": "Редакции, чрез които се създават нови страници.",
        "rcfilters-filter-categorization-label": "Промяна на категории",
+       "rcfilters-filter-categorization-description": "Записи от добавяне или премахване на страници от категории.",
+       "rcfilters-filter-logactions-label": "Записани в дневника действия.",
        "rcfilters-filter-logactions-description": "Административни действия, създавания на сметки, изтривания на страници, качвания...",
        "rcfilters-filtergroup-lastRevision": "Текуща версия",
+       "rcfilters-filter-lastrevision-label": "Текуща версия",
        "rcfilters-filter-lastrevision-description": "Последната промяна на страница.",
        "rcfilters-filter-previousrevision-label": "По-ранни версии",
        "rcfilters-filter-previousrevision-description": "Всички редакции, които не са последните на страница.",
        "movepage-moved-noredirect": "Създаването на пренасочване беше спряно.",
        "articleexists": "Вече съществува страница с това име или името, което сте избрали, е невалидно. Изберете друго име.",
        "cantmove-titleprotected": "Страницата не може да бъде преместена под новото заглавие, тъй като то е защитено от създаване",
-       "movetalk": "Ð\9fÑ\80емеÑ\81Ñ\82ване Ð¸ Ð½Ð° Ð´Ð¸Ñ\81кÑ\83Ñ\81ионнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а, Ð°ÐºÐ¾ Ðµ Ð¿Ñ\80иложимо.",
+       "movetalk": "Ð\9fÑ\80емеÑ\81Ñ\82ване Ð¸ Ð½Ð° Ð±ÐµÑ\81едаÑ\82а, Ð°ÐºÐ¾ Ðµ Ð¿Ñ\80иложимо",
        "move-subpages": "Преместване на всички подстраници (до $1)",
        "move-talk-subpages": "Преместване на всички подстраници на беседата (до $1)",
        "movepage-page-exists": "Страницата $1 вече съществува и няма да бъде автоматично презаписана.",
        "authmanager-realname-help": "Истинско име на потребителя",
        "authmanager-provider-temporarypassword": "Временна парола",
        "authprovider-resetpass-skip-label": "Пропусни",
+       "authform-notoken": "Липсва маркер",
        "specialpage-securitylevel-not-allowed-title": "Не е позволено",
        "cannotauth-not-allowed-title": "Достъпът е отказан",
        "cannotauth-not-allowed": "Не ви е позволено да използвате тази страница",
index ebeb2e8..d94a7da 100644 (file)
        "right-undelete": "हटावल पन्ना वापस ले आईं",
        "right-protect": "सुरक्षा स्तर बदलीं आ कास्केड-सुरक्षित पन्ना के सम्पादन करीं",
        "right-unwatchedpages": "ध्यानसूची में जवन पन्ना नइखे ओकर सूची देखीं",
+       "grant-blockusers": "प्रयोगकर्ता लोग पर रोक लगाईं आ रोक हटाईं",
+       "grant-createaccount": "खाता बनाईं",
+       "grant-createeditmovepage": "पन्ना बनाईं, संपादित करीं आ स्थानांतरण करीं",
+       "grant-editmyoptions": "आपन पसंदीदा सेटिंग संपादित करीं",
+       "grant-editmywatchlist": "आपन धियानसूची संपादित करीं",
+       "grant-editpage": "पहिले से मौजूद पन्ना संपादित करीं",
+       "grant-editprotected": "सुरक्षित पन्ना संपादित करीं",
+       "grant-highvolume": "भारी-मात्रा में संपादन",
+       "grant-oversight": "प्रयोगकर्ता छिपाईं आ रिवीजन दबा देईं",
+       "grant-patrol": "पन्ना पर बदलाव सभ के गश्त करीं",
+       "grant-privateinfo": "निजी जानकारी तक पहुँचीं",
+       "grant-protect": "पन्ना सुरक्षित आ बिनासुरक्षित करीं",
+       "grant-rollback": "पन्ना पर बदलाव सभ के रोलबैक करीं",
        "newuserlogpage": "खाता बनवले के लॉग",
        "newuserlogpagetext": "ई खाता निर्माण के लॉग बा",
        "rightslog": "सदस्य अधिकार लॉग",
index cb2f23d..d56a376 100644 (file)
        "permalink": "Trajni link",
        "print": "Štampaj",
        "view": "Pogled",
-       "view-foreign": "Vidi na $1",
+       "view-foreign": "Vidi na {{GRAMMAR:dativ|$1}}",
        "edit": "Uredi",
        "edit-local": "Uredi lokalni opis",
        "create": "Napravi",
        "rawhtml-notallowed": "&lt;html&gt; oznake ne mogu se koristiti van normalnih stranica.",
        "gotointerwiki": "Napuštate {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "gotointerwiki-invalid": "Navedeni naslov nije ispravan.",
-       "gotointerwiki-external": "Napuštate {{GRAMMAR:akuzativ|{{SITENAME}}}} da biste posjetili zasebni veb-sajt [[$2]].\n\n[$1 Kliknite ovdje da biste otišli na $1].",
+       "gotointerwiki-external": "Napuštate {{GRAMMAR:akuzativ|{{SITENAME}}}} da biste posjetili zasebni veb-sajt [[$2]].\n\n<strong>[$1 Idi na $1]</strong>",
        "undelete-cantedit": "Ne možete vratiti ovu stranicu jer Vam nije dozvoljeno da je uređujete."
 }
index 56ca690..f06dc25 100644 (file)
        "unlinkaccounts": "Dissocier les comptes",
        "unlinkaccounts-success": "Le compte a été dissocié.",
        "authenticationdatachange-ignored": "Les modifications de données d’authentification n’ont pas été gérées. Peut-être aucun fournisseur n’a-t-il été configuré ?",
-       "userjsispublic": "Veuillez noter: les sous-pages JavaScript ne doivent pas contenir de données confidentielles parce qu'elles sont visibles des autres utilisateurs.",
+       "userjsispublic": "Veuillez noter : les sous-pages JavaScript ne doivent pas contenir de données confidentielles parce qu’elles sont visibles des autres utilisateurs.",
        "usercssispublic": "Veuillez noter: les sous-pages CSS ne doivent pas contenir de données confidentielles parce qu'elles sont visibles des autres utilisateurs.",
        "restrictionsfield-badip": "Adresse IP ou plage non valide : $1",
        "restrictionsfield-label": "Plages IP autorisées :",
index 5c19a9f..f854b68 100644 (file)
@@ -17,7 +17,8 @@
                        "Xð",
                        "Robin van der Vliet",
                        "PiefPafPier",
-                       "Catrope"
+                       "Catrope",
+                       "Sjoerddebruin"
                ]
        },
        "tog-underline": "Keppelings ûnderstreekje:",
        "watching": "Dwaande mei op'e folchlist te setten ...",
        "unwatching": "Dwaande mei fan'e folchlist ôf te heljen ...",
        "enotif_impersonal_salutation": "meidogger fan {{SITENAME}}",
-       "enotif_body": "Bêste $WATCHINGUSERNAME,\n\nDe {{SITENAME}}side '$PAGETITLE' is op $PAGEEDITDATE $CHANGEDORCREATED troch meidogger $PAGEEDITOR;\nsjoch $PAGETITLE_URL foar de aktuele ferzje.\n\n$NEWPAGE\n\nGearfetting: $PAGESUMMARY $PAGEMINOREDIT\n\nFoar oerlis mei meidogger $PAGEEDITOR:\n- netpost: $PAGEEDITOR_EMAIL\n- wiki: $PAGEEDITOR_WIKI\n\nFierdere meldings wurde jo net tastjoerd, oant jo de side lêzen hawwe. Op jo folchlist kinne jo op 'e nij meldings foar al jo folge siden freegje.\n\n                 Jo freonlike {{SITENAME}}-meldingssysteem.\n\n--\nGean nei {{canonicalurl:{{#special:EditWatchlist}}}}\nom jo folchlistynstellings te feroarjen.\n\nReaksjes en fierdere help:\n$HELPPAGE",
+       "enotif_body": "Bêste $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nGearfetting: $PAGESUMMARY $PAGEMINOREDIT\n\nFoar oerlis mei meidogger:\nnetpost: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nFierdere meldings wurde jo net tastjoerd, oant jo de side lêzen hawwe. Op jo folchlist kinne jo op 'e nij meldings foar al jo folge siden freegje.\n\nJo freonlike {{SITENAME}}-meldingssysteem.\n\n--\nGean nei {{canonicalurl:{{#special:Preferences}}}}\nom jo netpostynstellings te feroarjen.\n\nGean nei {{canonicalurl:{{#special:EditWatchlist}}}}\nom jo folchlistynstellings te feroarjen.\n\nOm de side fan jo folchlist te ferwiderjen, gean nei\n$UNWATCHURL\n\nReaksjes en fierdere help:\n$HELPPAGE",
        "created": "oanmakke",
        "changed": "feroare",
        "deletepage": "Wisk side",
index 2b6cb06..2f45098 100644 (file)
        "pageid": "identificador de páxina $1",
        "rawhtml-notallowed": "As marcas &lt;html&gt; non poden usarse fóra das páxinas normais.",
        "gotointerwiki": "Deixando {{SITENAME}}",
-       "gotointerwiki-invalid": "O título especificado non era válido.",
-       "gotointerwiki-external": "Vai sair de {{SITENAME}} para visitar [[$2]], que é un sitio web externo.\n\n[$1 Prema aquí para continuar a $1]",
+       "gotointerwiki-invalid": "O título especificado non é válido.",
+       "gotointerwiki-external": "Vai sair de {{SITENAME}} para visitar [[$2]], que é un sitio web externo.\n\n'''[$1 Continuar en $1]'''",
        "undelete-cantedit": "Non pode anular o borrado desta páxina porque non ten permisos para editar esta páxina.",
        "undelete-cantcreate": "Non pode anular o borrado desta páxina xa que non hai ningunha páxina con ese nome e non ten permisos para creala."
 }
index 1f6a162..995e539 100644 (file)
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|מחק|מחקה}} את ההפניה $3 באמצעות דריסה",
        "logentry-delete-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3 ($4)",
        "logentry-delete-restore-nocount": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3",
-       "restore-count-revisions": "עם {{PLURAL:$1|גרסה אחת|$1 גרסאות}}",
-       "restore-count-files": "עם {{PLURAL:$1|קובץ אחד|$1 קבצים}}",
+       "restore-count-revisions": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}}",
+       "restore-count-files": "{{PLURAL:$1|קובץ אחד|$1 קבצים}}",
        "logentry-delete-event": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של פעולות יומן של $3",
index 06cfce3..fad3bcb 100644 (file)
        "nchanges": "$1 változtatás",
        "enhancedrc-since-last-visit": "$1 az utolsó látogatás óta",
        "enhancedrc-history": "történet",
-       "recentchanges": "Legutóbbi változtatások",
+       "recentchanges": "Friss változtatások",
        "recentchanges-legend": "A friss változtatások beállításai",
        "recentchanges-summary": "Ezen a lapon a wikiben történt legutóbbi fejleményeket lehet nyomon követni.",
        "recentchanges-noresult": "A megadott időszakban nincs a feltételeknek megfelelő szerkesztés.",
index 70186e3..a5ca4a6 100644 (file)
@@ -70,7 +70,7 @@
        "editfont-monospace": "Fon monospasi",
        "editfont-sansserif": "Fon tansèrif",
        "editfont-serif": "Fon sèrif",
-       "sunday": "Minggu",
+       "sunday": "Ngahad",
        "monday": "Senèn",
        "tuesday": "Selasa",
        "wednesday": "Rebo",
        "december-date": "$1 Dhésèmber",
        "period-am": "Isuk-Awan",
        "period-pm": "Soré-Wengi",
-       "pagecategories": "{{PLURAL:$1|Kategori|Kategori}}",
+       "pagecategories": "{{PLURAL:$1|Kategori}}",
        "category_header": "Kaca sajeroning kategori \"$1\"",
        "subcategories": "Anak kategori",
        "category-media-header": "Médhia sajeroning kategori \"$1\"",
        "viewhelppage": "Deleng kaca pitulung",
        "categorypage": "Deleng kaca kategori",
        "viewtalkpage": "Deleng parembugan",
-       "otherlanguages": "Ing basa liya",
+       "otherlanguages": "Ing basa liya",
        "redirectedfrom": "(Dilih saka $1)",
        "redirectpagesub": "Alih kaca",
        "redirectto": "Ngalih menyang:",
-       "lastmodifiedat": "Kaca iki dibesut pungkasan nalika $1, tabuh $2.",
+       "lastmodifiedat": "Kaca iki dibesut pungkasan nalika $1, pukul $2.",
        "viewcount": "Kaca iki wis diaksès ping {{PLURAL:$1|siji|$1}}.",
        "protectedpage": "Kaca kareksa",
        "jumpto": "Jujug:",
        "aboutpage": "Project:Ngenani",
        "copyright": "Kabèh isi kasedyakaké miturut $1.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
-       "currentevents": "Kadadian saiki",
-       "currentevents-url": "Project:Kadadian saiki",
+       "currentevents": "Kadadéan saiki",
+       "currentevents-url": "Project:Kadadéan saiki",
        "disclaimers": "Sélakan",
        "disclaimerpage": "Project:Sélakan umum",
        "edithelp": "Pitulung besut",
        "portal": "Gapura paguyuban",
        "portal-url": "Project:Garupa paguyuban",
        "privacy": "Paugeran privasi",
-       "privacypage": "Project:Niti priangga",
+       "privacypage": "Project:Paugeran privasi",
        "badaccess": "Aksès ora olèh",
        "badaccess-group0": "Panjenengan ora pareng nglakokaké tindhakan sing panjenengan gayuh.",
        "badaccess-groups": "Pratingkah panjenengan diwatesi tumrap panganggo ing {{PLURAL:$2|klompoké|klompoké}}: $1.",
        "feed-invalid": "Tipe permintaan asupan ora bener.",
        "feed-unavailable": "Umpan sindikasi (''syndication feeds'') ora kasedyakaké",
        "site-rss-feed": "$1 ''RSS Feed''",
-       "site-atom-feed": "Umpan atom $1",
+       "site-atom-feed": "Lebon atom $1",
        "page-rss-feed": "\"$1\" ''RSS Feed''",
        "page-atom-feed": "\"$1\" ''Atom Feed''",
        "red-link-title": "$1 (kaca durung ana)",
        "resetpass_forbidden": "Tembung wadi ora bisa diganti",
        "resetpass-no-info": "Panjenengan kudu mlebu log kanggo ngaksès kaca iki sacara langsung.",
        "resetpass-submit-loggedin": "Ganti tembung wadi",
-       "resetpass-submit-cancel": "Batal",
+       "resetpass-submit-cancel": "Wurung",
        "resetpass-wrong-oldpass": "Tembung wadi saiki utawa sauntara ora trep.\nPanjengen bokmanawa wis ngganti tembung wadiné panjenengan utawa nyuwun tembung wadi sauntara sing anyar.",
        "resetpass-temp-password": "Tembung wadi sauntara:",
        "resetpass-abort-generic": "Ngowah tembung sandhi diwurungaké déning èkstènsi.",
        "undo-failure": "Suntingan iki ora bisa dibatalakén amerga ana konflik panyuntingan antara.",
        "undo-norev": "Besutan iki ora bisa diwurungaké amarga wis ora ana utawa wis dibusak.",
        "undo-summary": "Mbalèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
-       "undo-summary-username-hidden": "Batalna revisi $1 saking panganggo kang didhelikake",
+       "undo-summary-username-hidden": "Balèkaké owahan $1 déning panganggo sing didhelikaké",
        "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa rékening. Sing mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
        "cantcreateaccount-range-text": "Nggawe akun saking alamat IP \"$1\", sing termasuk IP sampeyan (<strong>$4</strong>), sampun diblokir kaliyan [[User:$3|$3]].\n\nAlesan pamblokiran yaiku \"$2\"",
        "viewpagelogs": "Deleng cathetaning kaca iki",
        "mergehistory-same-destination": "Jeneng kaca sumber lan tujuan ora kena padha",
        "mergehistory-reason": "Alesan:",
        "mergelog": "Gabung log",
-       "revertmerge": "Batalna panggabungan",
+       "revertmerge": "Wurung gabung",
        "mergelogpagetext": "Ing ngisor iki kapacak daftar panggabungan sajarah kaca ing kaca liyané.",
        "history-title": "Sujarah owahaning \"$1\"",
        "difference-title": "Prabéda antara owahan \"$1\"",
        "datedefault": "Ora ana pilihan",
        "prefs-labs": "Piranti lab",
        "prefs-user-pages": "Kacaning sing nganggo",
-       "prefs-personal": "Panjèrènging sing nganggo",
+       "prefs-personal": "Profil panganggo",
        "prefs-rc": "Owah-owahan pungkasan",
        "prefs-watchlist": "Pawawangan",
        "prefs-editwatchlist": "Besut pawawangan",
        "right-delete": "Busak kaca-kaca",
        "right-bigdelete": "Busak kaca-kaca mawa sajarah panyuntingan sing gedhé",
        "right-deletelogentry": "Busak lan wurung busak èntri log tartamtu",
-       "right-deleterevision": "Busak lan batal busak révisi tartamtu kaca-kaca",
+       "right-deleterevision": "Busak lan wurung busak owahan tinamtuné kaca",
        "right-deletedhistory": "Ndeleng sajarah èntri-èntri kabusak, tanpa bisa ndeleng apa sing dibusak",
        "right-deletedtext": "Delok tèks kabusak lan panggantèn antara rèpisi kabusak",
        "right-browsearchive": "Golèk kaca-kaca sing wis dibusak",
        "action-import": "impor kaca iki saka wiki liya",
        "action-importupload": "impor kaca iki saka pamunggahan berkas",
        "action-patrol": "nandhani besutan wong liya yèn wis kapriksa",
-       "action-autopatrol": "nandhani besutan panjenengan dhéwé yèn wis kapriksa",
+       "action-autopatrol": "nandhani besutané panjenengan dhéwé yèn wis kapriksa",
        "action-unwatchedpages": "deleng pratélan kaca sing ingawasan",
        "action-mergehistory": "nggabungaké sajarah kaca iki",
        "action-userrights": "ngowahi kabèh hak panganggo",
        "rcshowhidecategorization": "$1 kategorisasi kaca",
        "rcshowhidecategorization-show": "Tuduhaké",
        "rcshowhidecategorization-hide": "Dhelikaké",
-       "rclinks": "Tuduhaké $1 owahan kawit $2 dina kapungkur.",
+       "rclinks": "Tuduhaké $1 owahan pungkasan kawit $2 dina kapungkur.",
        "diff": "béd",
        "hist": "saj",
        "hide": "Dhelikaké",
        "protectedpagesempty": "Saat ini tidak ada halaman yang sedang dilindungi.",
        "protectedpages-page": "Kaca",
        "protectedpages-expiry": "Kadaluwarsa",
+       "protectedpages-performer": "Ngreksa panganggo",
+       "protectedpages-params": "Paramèter rereksan",
        "protectedpages-reason": "Alesan",
+       "protectedpages-submit": "Tuduhaké kaca",
+       "protectedpages-unknown-timestamp": "Ora dingertèni",
+       "protectedpages-unknown-performer": "Panganggo ora dingertèni",
        "protectedtitles": "Sesirah direksa",
        "protectedtitlesempty": "Ora ana sesirah sing saiki kareksa mawa paramèter iki.",
+       "protectedtitles-submit": "Tuduhaké sesirah",
        "listusers": "Daftar panganggo",
        "listusers-editsonly": "Tampilaké mung panganggo sing nduwèni kontribusi",
        "listusers-creationsort": "Urut miturut tanggal digawé",
        "usereditcount": "$1 {{PLURAL:$1|besutan|besutan}}",
        "usercreated": "{{GENDER:$3|Digawé}} $1 wanci $2",
        "newpages": "Kaca anyar",
+       "newpages-submit": "Tuduhaké",
        "newpages-username": "Asma panganggo:",
        "ancientpages": "Kaca paling lawas",
        "move": "Pindhahen",
        "pager-older-n": "{{PLURAL:$1|1 luwih lawas|$1 luwih lawas}}",
        "suppress": "Dhelikaké",
        "querypage-disabled": "Kaca kusus iki dipatèni kanggo alesan kinerja.",
+       "apihelp": "Pitulung API",
+       "apihelp-no-such-module": "Modhul \"$1\" ora katemu.",
        "apisandbox": "Kothak wedhi API",
+       "apisandbox-jsonly": "JavaScript dibutuhaké saperlu nganggo bak wedhi API.",
        "apisandbox-api-disabled": "API dipatèni nèng situs iki.",
        "apisandbox-intro": "Anggo kaca iki kanggo njajal-njajal '''API layanan wèb MediaWiki'''.\nRujuk [https://www.mediawiki.org/wiki/API:Main_page the dhokumèntasi API] kanggo panganggoan API luwih rinci. Conto: [https://www.mediawiki.org/wiki/API#A_simple_example ngéntukaké kontèn Kaca Utama]. Pilih laku kanggo ndelok conto luwih akèh.",
+       "apisandbox-fullscreen": "Jembaraké panèl",
+       "apisandbox-fullscreen-tooltip": "Jembaraké panèl bak wedhi kanggo ngisi jendhéla pangluru.",
+       "apisandbox-unfullscreen": "Tuduhaké kaca",
+       "apisandbox-unfullscreen-tooltip": "Ciyutaké panèl bak wedhi supaya pranala navigasi MediaWiki dadi ana.",
        "apisandbox-submit": "Gawé panjalukan",
        "apisandbox-reset": "Resiki",
+       "apisandbox-retry": "Jajal manèh",
+       "apisandbox-loading": "Ngamot katerangan kanggo modhul API \"$1\"...",
+       "apisandbox-load-error": "Ana masalah nalika ngamot katerangan modhul API \"$1\": $2",
+       "apisandbox-no-parameters": "Modhul API iki ora ana paramèteré.",
+       "apisandbox-helpurls": "Pranala pitulung",
        "apisandbox-examples": "Conto",
        "apisandbox-dynamic-parameters": "Paramèter tambahan",
        "apisandbox-dynamic-parameters-add-label": "Tambah paramèter:",
        "apisandbox-results-error": "Ana masalah nalika ngamot wangsulan kanggo panyuwuné API: $1.",
        "apisandbox-request-selectformat-label": "Tuduhaké dhata suwunan minangka:",
        "apisandbox-request-url-label": "URL dikarepaké:",
-       "apisandbox-request-time": "Suwéné panjalukan: $1",
+       "apisandbox-request-json-label": "Nyuwun JSON:",
+       "apisandbox-request-time": "Suwéné panyuwunan: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Dandanana tokené lan balènana numpuk",
+       "apisandbox-results-fixtoken-fail": "Wurung njupuk token \"$1\".",
+       "apisandbox-alert-page": "Babagan ing kaca iki ora trep.",
+       "apisandbox-alert-field": "Ajiné babagan iki ora trep.",
+       "apisandbox-continue": "Banjuraké",
+       "apisandbox-continue-clear": "Resiki",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} bakal [https://www.mediawiki.org/wiki/API:Query#Continuing_queries mbanjuraké] panyuwunané sing pungkasan; {{int:apisandbox-continue-clear}} bakal ngresiki paramèter sing gegayutan karo tumindak panglanjutané.",
+       "apisandbox-param-limit": "Isènana <kbd>max</kbd> saperlu nganggo watesan maksimum.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Kabèh mandala aran)",
+       "apisandbox-multivalue-all-values": "$1 (Kabèh aji)",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Golèk sumber buku",
        "booksources-search": "Golèk",
        "booksources-text": "Ing ngisor iki kapacak daftar pranala menyang situs liyané sing ngadol buku anyar lan bekas, lan mbok-menawa uga ndarbèni informasi sabanjuré ngenani buku-buku sing lagi panjenengan golèki:",
        "booksources-invalid-isbn": "ISBN sing diwènèhaké katonané ora valid; priksa kasalahan penyalinan saka sumber asli.",
+       "magiclink-tracking-rfc": "Kaca sing nganggo pranala ajaib RFC",
+       "magiclink-tracking-rfc-desc": "Kaca iki nganggo pranala ajaib RFC. Delengen [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] ngenani carané boyongan.",
+       "magiclink-tracking-pmid": "Kaca nganggo pranala ajaib PMID",
        "specialloguserlabel": "Panampil:",
        "speciallogtitlelabel": "Patujon (judhul utawa panganggo) :",
        "log": "Log",
+       "logeventslist-submit": "Tuduhaké",
        "all-logs-page": "Kabèh log publik",
        "alllogstext": "Gabungan tampilam kabèh log sing ana ing {{SITENAME}}.\nPanjenengan bisa mbatesi tampilan kanthi milih jinis log, jeneng panganggo (sènsitif aksara gedhé/cilik), utawa kaca sing magepokan (uga sènsitif aksara gedhé/cilik).",
        "logempty": "Ora ditemokaké èntri log sing pas.",
        "log-title-wildcard": "Golèk sesirah sing diwiwiti tulisan iki",
        "showhideselectedlogentries": "Tuduhalé/dhelikaké èntri log kapilih",
+       "log-edit-tags": "Besut tag saka isian log sing dipilih",
+       "checkbox-select": "Pilih: $1",
        "checkbox-all": "Kabèh",
        "checkbox-none": "Ora ana",
        "checkbox-invert": "Balèkaké",
        "activeusers-count": "$1 {{PLURAL:$1|suntingan|suntingan}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan",
        "activeusers-from": "Tampilna panganggo wiwit saka:",
        "activeusers-groups": "Tuduhaké panganggo sing mlebu golongan:",
+       "activeusers-excludegroups": "Aja lebokaké panganggo sing kalebu golongan:",
        "activeusers-noresult": "Panganggo ora ana.",
        "activeusers-submit": "Tuduhaké panganggo aktif",
        "listgrouprights": "Hak-hak grup panganggo",
        "listgrouprights-removegroup-self": "Mbusak {{PLURAL:$2|klompok|klompok}} saka akuné dhéwé: $1",
        "listgrouprights-addgroup-self-all": "Nambahaké kabèh grup menyang akuné dhéwé",
        "listgrouprights-removegroup-self-all": "Mbusak kabèh klompok saka akuné dhéwé",
+       "listgrouprights-namespaceprotection-header": "Watesan mandala aran",
+       "listgrouprights-namespaceprotection-namespace": "Mandala aran",
+       "listgrouprights-namespaceprotection-restrictedto": "Hak sing ngidinaké panganggo mbesut",
+       "listgrants": "Idin",
+       "listgrants-grant": "Idin",
+       "listgrants-rights": "Hak",
+       "trackingcategories": "Kategori panglacak",
+       "trackingcategories-msg": "Kategori panglacak",
+       "trackingcategories-name": "Jeneng layang",
        "mailnologin": "Ora ana alamat layang e-mail",
        "mailnologintext": "Panjenengan kudu [[Special:UserLogin|mlebu log]] lan duwé alamat layang-èl sing trep ing [[Special:Preferences|pilalané]] panjenengan kanggo nglayangi panganggo liyané.",
        "emailuser": "Kirim e-mail panganggo iki",
        "watch": "Awasi",
        "watchthispage": "Periksa kaca iki",
        "unwatch": "Ora usah ngawasaké manèh",
-       "unwatchthispage": "Batalna olèhé ngawasi kaca iki",
+       "unwatchthispage": "Mandheg ngawasi",
        "notanarticle": "Dudu kaca artikel",
        "notvisiblerev": "Révisi wis dibusak",
        "watchlist-details": "Ngawasaké {{PLURAL:$1|$1 kaca|$1 kaca}}, ora kalebu kaca-kaca dhiskusi.",
        "export-download": "Simpen minangka berkas",
        "export-templates": "Kalebu cithakan-cithakan",
        "export-pagelinks": "Lebokaké kaca sing kagayut nyang jeroning:",
+       "export-manual": "Tambah kaca kanthi manual:",
        "allmessages": "Kabèh laporan sistém",
        "allmessagesname": "Asma (jeneng)",
        "allmessagesdefault": "Tèks baku",
        "allmessages-prefix": "Saring nganggo ater-ater:",
        "allmessages-language": "Basa:",
        "allmessages-filter-submit": "Tumuju menyang",
+       "allmessages-filter-translate": "Pertal",
        "thumbnail-more": "Gedhèkaké",
        "filemissing": "Barkas ilang",
        "thumbnail_error": "Kaluputan nalika nggawé gambar cilik (''thumbnail''): $1",
        "thumbnail-temp-create": "Ora bisa nggawé berkas gambar mini sawetara",
        "thumbnail-dest-create": "Ora bisa nyimpen bambar mini nèng papan patujon",
        "thumbnail_invalid_params": "Paramèter gambar cilik (''thumbnail'') ora absah",
+       "thumbnail_toobigimagearea": "Barkas kanthi alang-ujur luwih gedhé saka $1",
        "thumbnail_dest_directory": "Ora bisa nggawé dirèktori tujuan",
        "thumbnail_image-type": "Tipe gambar ora didhukung",
        "thumbnail_gd-library": "Konfigurasi pustaka GD ora pepak: fungsi $1 ilang",
        "import": "Impor kaca",
        "importinterwiki": "Impor saka wiki liya",
        "import-interwiki-text": "Pilih sawijining wiki lan irah-irahan kaca sing arep diimpor.\nTanggal révisi lan jeneng panyunting bakal dilestarèkaké.\nKabèh aktivitas impor transwiki bakal dilog ing [[Special:Log/import|log impor]].",
+       "import-interwiki-sourcewiki": "Wiki sumber:",
+       "import-interwiki-sourcepage": "Kaca sumber:",
        "import-interwiki-history": "Tuladen kabèh vèrsi lawas saka kaca iki",
        "import-interwiki-templates": "Katutna kabèh cithakan",
        "import-interwiki-submit": "Impor",
+       "import-mapping-default": "Impor nyang pernah gawan",
+       "import-mapping-namespace": "Impor nyang mandala aran:",
+       "import-mapping-subpage": "Impor minangka anak kaca iki:",
        "import-upload-filename": "Jeneng barkas:",
        "import-comment": "Komentar:",
        "importtext": "Mangga èkspor berkas saka wiki sumber nganggo [[Special:Export|prangkat èkspor]].\nSimpen nèng komputer Sampéyan lan unggaha nèng kéné.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|révisi|révisi}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|révisi}} saka $2",
        "javascripttest": "Panjajalan JavaScript",
+       "javascripttest-pagetext-unknownaction": "Tumindak ora dingertèni: $1",
        "javascripttest-qunit-intro": "Delok [dhokumèntasi panjajalan $1] nèng mediawiki.org.",
        "tooltip-pt-userpage": "Kaca {{GENDER:|panganggoning sampéyan}}",
        "tooltip-pt-anonuserpage": "Kaca panganggo IP panjenengan",
        "tooltip-pt-preferences": "Pilih-pilihaning {{GENDER:|sampéyan}}",
        "tooltip-pt-watchlist": "Pratélaning kaca sing sampéyan awasi owah-owahané",
        "tooltip-pt-mycontris": "Pratélaning sumbanganing {{GENDER:|sampéyan}}",
-       "tooltip-pt-login": "Sampéyan prayogané mlebu masiya ora kudu",
+       "tooltip-pt-anoncontribs": "Pratélan besutané alamat IP iki",
+       "tooltip-pt-login": "Panjenengan prayogané mlebu log, sanadyan ora kudu",
+       "tooltip-pt-login-private": "Panjenengan kudu mlebu log supaya bisa nganggo wiki iki",
        "tooltip-pt-logout": "Metu",
-       "tooltip-pt-createaccount": "Sampéyan prayogané gawé akun lan mlebu masiya ora kudu",
-       "tooltip-ca-talk": "Pirembug ngenani kaca isi",
+       "tooltip-pt-createaccount": "Panjenengan prayogané nggawé akun lan mlebu log, sanadyan ora kudu",
+       "tooltip-ca-talk": "Rembugan ngenani kaca isi",
        "tooltip-ca-edit": "Besut kaca iki",
        "tooltip-ca-addsection": "Miwiti pérangan anyar",
        "tooltip-ca-viewsource": "Kaca iki direksa. \nSampéyan bisa ndeleng sumberé",
-       "tooltip-ca-history": "Owahaning kaca iki sadurungé",
+       "tooltip-ca-history": "Owahan sadurungé saka kaca iki",
        "tooltip-ca-protect": "Reksa kaca iki",
        "tooltip-ca-unprotect": "Ganti panjagan kaca iki",
        "tooltip-ca-delete": "Busak kaca iki",
        "tooltip-p-logo": "Menyang tepas",
        "tooltip-n-mainpage": "Menyang tepas",
        "tooltip-n-mainpage-description": "Menyang tepas",
-       "tooltip-n-portal": "Bab proyèk, apa sing bisa sampéyan garap, ana ing endi saprelu golèk apa-apa",
-       "tooltip-n-currentevents": "Temokaké katerangan latar wuri saka kadadéan saiki",
+       "tooltip-n-portal": "Ngenani proyèk, apa sing bisa panjenengan garap, lang ing endi saprelu golèk apa-apa",
+       "tooltip-n-currentevents": "Golèk katerangan latar wuri saka kadadéan saiki",
        "tooltip-n-recentchanges": "Pratélaning owah-owahan pungkasan sajeroning wiki.",
-       "tooltip-n-randompage": "Mot waton kaca",
+       "tooltip-n-randompage": "Mot sembarang kaca",
        "tooltip-n-help": "Papan kanggo golèk weruh",
-       "tooltip-t-whatlinkshere": "Pratélaning kabèh kaca wiki sing nggayut mréné",
+       "tooltip-t-whatlinkshere": "Pratélané kabèh kaca wiki sing nggayut mréné",
        "tooltip-t-recentchangeslinked": "Owah-owahan anyar saka kaca-kaca sing nggayut kaca iki",
        "tooltip-feed-rss": "''RSS feed'' kanggo kaca iki",
        "tooltip-feed-atom": "''Atom feed'' kanggo kaca iki",
        "tooltip-t-contributions": "Pratélaning sumbangan {{GENDER:$1|panganggo iki}}",
-       "tooltip-t-emailuser": "Kirimna e-mail menyang panganggo iki",
+       "tooltip-t-emailuser": "Kirimi layang-èl nyang {{GENDER:$1|panganggo iki}}",
+       "tooltip-t-info": "Katerangan liyané ngenani kaca iki",
        "tooltip-t-upload": "Unggah barkas",
        "tooltip-t-specialpages": "Pratélaning kabèh kaca mirunggan",
        "tooltip-t-print": "Vèrsi cithak kaca iki",
        "tooltip-ca-nstab-category": "Deleng kaca kategori",
        "tooltip-minoredit": "Tandhani iki yèn besutan cilik",
        "tooltip-save": "Simpen owah-owahaning sampéyan",
+       "tooltip-publish": "Babar owahané panjenengan",
        "tooltip-preview": "Pratuduhing owah-owahaning sampéyan. Anggoa cara iki sadurungé nyimpen.",
        "tooltip-diff": "Tuduhaké owah-owahan endi sing sampéyan gawé tumrap tulisan iki",
        "tooltip-compareselectedversions": "Delengen prabédan antara rong vèrsi kaca iki sing dipilih.",
        "anonymous": "{{PLURAL:$1|Panganggo|panganggo}} anon ing {{SITENAME}}.",
        "siteuser": "Panganggo {{SITENAME}} $1",
        "anonuser": "Panganggo anonim {{SITENAME}} $1",
-       "lastmodifiedatby": "Kaca iki pungkasan diowahi  $2, $1 déning $3.",
+       "lastmodifiedatby": "Kaca iki pungkasan diowahi pukul $2, $1 déning $3.",
        "othercontribs": "Adhedhasar karyané $1.",
        "others": "liya-liyané",
-       "siteusers": "{{PLURAL:$2|Panganggo|Panganggo-panganggo}} {{SITENAME}} $1",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|Panganggo}}|Panganggo}} {{SITENAME}} $1",
        "anonusers": "{{PLURAL:$2|Panganggo|Panganggo}} anonim {{SITENAME}} $1",
        "creditspage": "Informasi para panulis kaca",
        "nocredits": "Ora ana informasi ngenani para panulis ing kaca iki.",
        "pageinfo-length": "Panjang halaman (dalam bita)",
        "pageinfo-article-id": "ID kaca",
        "pageinfo-language": "Basaning isining kaca",
+       "pageinfo-language-change": "owah",
        "pageinfo-content-model": "Model isi kaca",
+       "pageinfo-content-model-change": "owah",
        "pageinfo-robot-policy": "Diindeks karo robot",
        "pageinfo-robot-index": "Entuk",
        "pageinfo-robot-noindex": "Ora entuk",
        "pageinfo-watchers": "Cacahé pangawas kaca",
+       "pageinfo-visiting-watchers": "Cacahé pandeleng kaca sing nekani besutan anyar",
        "pageinfo-few-watchers": "Kurang seka $1 {{PLURAL:$1|wong tilik|wong tilik}}",
        "pageinfo-redirects-name": "Jumlah pangalihan menyang kaca iki",
        "pageinfo-subpages-name": "Subhalaman halaman ini",
        "markedaspatrollederror": "Ora bisa awèh tandha wis dipatroli",
        "markedaspatrollederrortext": "Panjenengan kudu nentokaké sawijining révisi kanggo ditandhani minangka sing dipatroli.",
        "markedaspatrollederror-noautopatrol": "Panjenengan ora pareng nandhani suntingan panjenengan dhéwé minangka dipatroli.",
-       "markedaspatrollednotify": "Perubahan $1 telah dipatroli.",
+       "markedaspatrollednotify": "Owahan $1 wis dipatroli.",
        "markedaspatrollederrornotify": "Penanda patroli gagal dibuat.",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Iki log revisi sing wis dipatroli.",
        "exif-attributionurl": "Nalika nganggo manèh karya iki, mangga ubungaké nèng",
        "exif-preferredattributionname": "Nalika nganggo manèh karya iki, mangga awèhi krèdit",
        "exif-pngfilecomment": "Tanggepan berkas PNG",
-       "exif-disclaimer": "Pamaidonan",
+       "exif-disclaimer": "Sélakan",
        "exif-contentwarning": "Pèngetan kontèn",
        "exif-giffilecomment": "Tanggepan berkas GIF",
        "exif-intellectualgenre": "Jinis barang",
        "confirmemail_body": "Sawijining wong, mbokmenawa panjenengan dhéwé, saka alamat IP $1, wis ndaftaraké akun \"$2\" mawa alamat e-mail iki ing {{SITENAME}}. Bukaka pranala iki ing panjlajah wèb panjenengan.\n\n$3\n\nYèn panjenengan *ora tau* ndaftar akun iki, tutna pranala ing ngisor iki kanggo mbatalaké konfirmasi alamat e-mail:\n\n$5\n\nKonfirmasi iki bakal kadaluwarsa ing $4.",
        "confirmemail_body_changed": "Sawijining wong, mbokmenawa panjenengan dhéwé, saka alamat IP $1, wis ndaftaraké akun \"$2\" mawa alamat e-mail iki ing {{SITENAME}}. Bukaka pranala iki ing panjlajah wèb panjenengan.\n\n$3\n\nYèn panjenengan *ora tau* ndaftar akun iki, tutna pranala ing ngisor iki kanggo mbatalaké konfirmasi alamat e-mail:\n\n$5\n\nKonfirmasi iki bakal kadaluwarsa ing $4.",
        "confirmemail_body_set": "Sawijining wong, mbokmenawa panjenengan dhéwé, saka alamat IP $1, wis ndaftaraké akun \"$2\" mawa alamat e-mail iki ing {{SITENAME}}. Bukaka pranala iki ing panjlajah wèb panjenengan.\n\n$3\n\nYèn panjenengan *ora tau* ndaftar akun iki, tutna pranala ing ngisor iki kanggo mbatalaké konfirmasi alamat e-mail:\n\n$5\n\nKonfirmasi iki bakal kadaluwarsa ing $4.",
-       "confirmemail_invalidated": "Pandhedhesan (konfirmasi) alamat e-mail batal",
-       "invalidateemail": "Batalna pandhedhesan (konfirmasi) e-mail",
+       "confirmemail_invalidated": "Konfirmasi alamat layang-èl wurung",
+       "invalidateemail": "Wurung konfirmasi layang-èl",
        "scarytranscludedisabled": "[Transklusi cithakan interwiki dipatèni]",
        "scarytranscludefailed": "[Olèhé njupuk cithakan $1 gagal]",
        "scarytranscludefailed-httpstatus": "[Pengambilan templat $1 gagal: HTTP $2]",
        "htmlform-int-toohigh": "Aji sing panjenengan lebokaké kegedhèn ngluwihi aji maksimum $1",
        "htmlform-required": "Nilé iki dibutuhaké",
        "htmlform-submit": "Kirim",
-       "htmlform-reset": "Batalna pangowahan",
+       "htmlform-reset": "Balèkaké owahan",
        "htmlform-selectorother-other": "Liya",
        "htmlform-no": "Ora",
        "htmlform-yes": "Iya",
        "feedback-bugcheck": "Apik! Pesthèké kuwi dudu sawijining [$1 bug sing dingertèni].",
        "feedback-bugnew": "Aku wis mriksa. Kandakaké bug anyar",
        "feedback-bugornote": "Yèn Sampéyan siap njelasaké masalah tèhnis kanthi rinci mangga [$1 laporaké bug].\nUtawa, Sampéyan bisa nganggo pormulir gampang ngisor. Tanggepan Sampéyan bakal ditambahaké nèng kaca \"[$3 $2]\", bebarengan karo jeneng panganggo Sampéyan lan pramban sing Sampéyan anggo.",
-       "feedback-cancel": "Batal",
+       "feedback-cancel": "Wurung",
        "feedback-close": "Rampung",
        "feedback-error1": "Kasalahan: Asil ora dikenal saka API",
        "feedback-error2": "Cacad: Gagal mbesut",
index 2b5e4d8..78185ea 100644 (file)
        "permalink": "Suglung a permanenti",
        "print": "I-print",
        "view": "Lawen",
+       "view-foreign": "Lawen king $1",
        "edit": "Alilan",
        "create": "Maglalang",
        "editthispage": "I-edit ya ing bulung a ini",
        "nstab-template": "Ulma (template)",
        "nstab-help": "Saup bulung",
        "nstab-category": "Kategoriya",
+       "mainpage-nstab": "Pun Bulung",
        "nosuchaction": "Alang makanyan a gawa",
        "nosuchactiontext": "E ne kikilalanan ning wiki ing dapat/utus a babanggitan ning URL",
        "nosuchspecialpage": "Alang bulung a makabukud/espesial a anti kanian",
        "logouttext": "'''Maka logout na ka.'''\n\nMalyari mung isundu ing pamangamit mu king {{SITENAME}} a e ka papakilala, o malyari kang mag login pasibayu anting pareu o aliwang talagamit.\nApansingan mung mapalyaring makalto la pa murin deng aliwang bulung a bala mu maka login ka pa murin, anggang e me lilinisan (clear) ing kekang browser cache.",
        "yourname": "Lagyung talagamit (Username):",
        "yourpassword": "Kekang password:",
+       "userlogin-yourpassword": "Udyat (Password)",
        "yourpasswordagain": "Pakisulat meng pasibayu ing password:",
        "yourdomainname": "Ing kekang karinan (domain):",
        "externaldberror": "Mapalyaring mika pamagkamali king external authentication (pamagpatutung panlual) ning database, o ala kang paintulut a i-update ya ing kekang account a panlual (external account).",
        "createaccount-title": "Pamaglalang account para king {{SITENAME}}",
        "createaccount-text": "Ating miglalang account para king kekang e-mail address king {{SITENAME}} ($4) a maki lagyung \"$2\", ampong password a \"$3\".\nKailangan mung mag-login ngeni ba meng ayalilan ing kekang password.\n\nMalyari meng e pansinan ining mensahi, nung pamagkamali ing pamaglalang na niting account.",
        "loginlanguagelabel": "Amanu: $1",
+       "pt-login-button": "Maglagda (log in)",
        "changepassword": "Alilan ya ing password",
        "resetpass_announce": "Gagamit kang pansamantalang code a me e-mail keka aniang mig-login ka.\nBang mayari ing kekang pamag-login, kailangan mung mangibiling bayung password keni:",
        "resetpass_header": "Alilan ya ing password",
        "resetpass_submit": "Mangibili kang password at maglogin ka",
        "changepassword-success": "Melaus ing pamanalili mung password! Ngeni mila-login naka...",
        "resetpass_forbidden": "E la malyaring alilan deng password keng wiking ini",
+       "passwordreset": "Alilan udyat (reset password)",
        "bold_sample": "Makapasalang kulitan",
        "bold_tip": "Makapal pangasulat",
        "italic_sample": "Makakiling pangasulat",
        "action-edit": "i-edit/alilan ya ing bulung a ini",
        "action-managechangetags": "maglalang at magbura tags ibat database",
        "nchanges": "$1 {{PLURAL:$1|miyalilan|miyalilan}}",
+       "enhancedrc-history": "amlat/kasaleselan",
        "recentchanges": "Bayung mengayalili",
        "recentchanges-legend": "Pipamilinan kareng bayung mengayalili",
        "recentchanges-summary": "Talukyan mo reng tawling diling mengayalilan king bulung a ini.",
        "recentchanges-feed-description": "Talukian mo reng bayung diling mengayalili king wiki king feed a ini.",
+       "rcfilters-savedqueries-new-name-label": "Lagyu",
+       "rcfilters-savedqueries-cancel-label": "E taglus",
+       "rcfilters-filtergroup-watchlist": "Deng bulung a yati lu king babanten",
+       "rcfilters-filter-watchlist-watched-label": "Deng atiu babanten",
+       "rcfilters-filter-watchlist-notwatched-label": "Ala lu king babanten",
+       "rcfilters-filtergroup-lastRevision": "Kasalungsungan a pangayalili",
+       "rcfilters-filter-lastrevision-label": "Kasalungsungan a pangayalili",
        "rcnotefrom": "Atilu king lalam deng miyalilan manibat anyang <b>$2</b> (angga king <b>$1</b> makalto).",
        "rclistfrom": "Pakit la reng bayung miyalilan manibat anyang $3 $2",
        "rcshowhideminor": "$1 malating edit",
+       "rcshowhideminor-show": "Pakit",
+       "rcshowhideminor-hide": "Isalikut",
        "rcshowhidebots": "$1 la reng bot",
+       "rcshowhidebots-show": "Pakit",
+       "rcshowhidebots-hide": "Isalikut",
        "rcshowhideliu": "$1 talagamit a maka-log in",
+       "rcshowhideliu-hide": "Isalikut",
        "rcshowhideanons": "$1 talagamit a e migpakilala",
+       "rcshowhideanons-show": "Pakit",
+       "rcshowhideanons-hide": "Isalikut",
        "rcshowhidepatr": "$1 edit a babanten (patrolled edits)",
        "rcshowhidemine": "$1 deng elilan ku",
+       "rcshowhidemine-show": "Pakit",
+       "rcshowhidemine-hide": "Isalikut",
        "rcshowhidecategorization-show": "Pakit",
        "rclinks": "Pakit la reng tauling $1 miyalilan anyang tauling $2 aldo",
        "diff": "aliwa",
        "suppress": "Alakton (oversight)",
        "booksources": "Aklat a pikuanan",
        "booksources-search-legend": "Panintunan la reng aklat penibatan",
+       "booksources-search": "Manintun/Manuliksa",
        "booksources-text": "Makabili la king lalam deng suglung kareng aliwang karinan o site a mamisaling librung bayu at megamit na, at mapalyaring atin la muring aliwang informaciun kareng librung paintunan mu.",
        "specialloguserlabel": "Talagamit:",
        "speciallogtitlelabel": "Bansag:",
        "namespace": "Pirinan lagyu (Namespace):",
        "invert": "Ibaligtad la pamitukituki",
        "blanknamespace": "(Pun)",
-       "contributions": "Ambag da reng gagamit",
+       "contributions": "{{GENDER:$1|User}} deng ambag",
        "contributions-title": "Deng ambag da reng talagamit para king $1",
        "mycontris": "Deng kakung ambag",
        "anoncontribs": "Deng ambag",
        "whatlinkshere-prev": "{{PLURAL:$1|minunang|minunang $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|next|tutuking $1}}",
        "whatlinkshere-links": "← suglung",
-       "whatlinkshere-hideredirs": "$1 pamanalis direksiun (redirects)",
+       "whatlinkshere-hideredirs": "$1 pamanalis direksyun (redirects)",
        "whatlinkshere-hidetrans": "$1 langkap (transclusions)",
        "whatlinkshere-hidelinks": "$1 suglung",
        "whatlinkshere-filters": "Panialak (filters)",
        "file-info-size": "$1 × $2 pixel, sukad ning simpan: $3, MIME type: $4",
        "file-nohires": "Ala nang mas malino pa.",
        "svg-long-desc": "SVG file, masasabing $1 × $2 pixels, dagul ning simpan: $3",
-       "show-big-image": "Pekamalino",
+       "show-big-image": "Ing minunang simpan (file)",
        "newimages": "Pirinan kareng bayung simpan (new files)",
        "imagelisttext": "Ing makatuki tala yang '''$1''' {{PLURAL:$1|simpan|simpan}} a misamasan $2.",
        "newimages-summary": "Ining bulung a makabukud papakit no reng simpan (file) a tauling milulan.",
        "watchlisttools-view": "Lon la reng miyalilan a makaugne kaniti",
        "watchlisttools-edit": "Lon ya ampong i-edit ing tala ding babanten (watchlist)",
        "watchlisttools-raw": "I-edit ya ing e pa metagin a tala ding babanten (raw watchlist)",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pamisabi-sabi]])",
        "version": "Bersion",
        "version-specialpages": "Bulung a makabukud",
        "version-other": "Aliwa",
index 20f2c62..e99dfd2 100644 (file)
        "readonlywarning": "<strong>Сэрэтии: Сиэрбэргэ техническай үлэ бара турар, онон киллэрбит уларытыыларыҥ тута бигэргэнэр кыахтара суох.</strong>\nОнон уларытыыгын тиэкистээх билэҕэ уган хаалларан баран, манна кэлин угуоххун сөп.\n\nХааччаҕы туруорбут дьаһабыл маннык быһаарыыны хаалларбыт: $1",
        "protectedpagewarning": "'''Сэрэтии:  Бу сирэй хатанан турар, администратор бырааптаах эрэ кыттааччылар уларытар кыахтаахтар.'''\nАллара сурунаал бүтэһик суруга көрдөрүлүннэ:",
        "semiprotectedpagewarning": "'''Биллэрии:''' Бу сирэй хатанан турар; ааттарын билиһиннэрбит эрэ кыттааччылар уларытар кыахтаахтар.\nАллара сурунаал бүтэһик суруга көрдөрүлүннэ:",
-       "cascadeprotectedwarning": "<strong>Сэрэтии:</strong> Бу сирэйи дьаһабыллар эрэ уларытар кыахтаахтар, тоҕо диэтэххэ сирэй каскаднай көмүскэллээх {{PLURAL:$1|сирэй бөлөҕөр|сирэйдэр бөлөхтөрүгэр}} киирэр:",
+       "cascadeprotectedwarning": "<strong>Сэрэтии:</strong> Бу сирэйи [[Special:ListGroupRights|анал бырааптаах дьон]] эрэ уларытар кыахтаахтар, тоҕо диэтэххэ сирэй каскаднай көмүскэллээх {{PLURAL:$1|сирэй бөлөҕөр|сирэйдэр бөлөхтөрүгэр}} киирэр:",
        "titleprotectedwarning": "'''Сэрэтии:  Маннык ааттаах сирэйи уларытар бобуллубут, [[Special:ListGroupRights|анал бырааптаах эрэ дьон]] уларытыахтарын сөп .'''\nАллара сурунаал бүтэһик суруга көрдөрүлүннэ:",
        "templatesused": "Манна туттуллубут {{PLURAL:$1|халыып|халыыптар}} :",
        "templatesusedpreview": "Манна туттуллубут {{PLURAL:$1|халыып|халыыптар}} бигэргэтиэх иннинэ көстүүлэрэ:",
        "saveusergroups": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн бигэргэт",
        "userrights-groupsmember": "Бу бөлөхтөргө киирэр:",
        "userrights-groupsmember-auto": "Көстүбэт чилиэн:",
-       "userrights-groups-help": "Ð\91Ñ\83 ÐºÐ¸Ò»Ð¸ ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80 Ð±Ó©Ð»Ó©Ñ\85Ñ\82Ó©Ñ\80үн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\85Ñ\8bн Ñ\81өп:\n* Ð\91өлөÑ\85 Ð°Ð°Ñ\82Ñ\8bн Ñ\82аһÑ\8bгаÑ\80 Ð±Ñ\8dлиÑ\8d Ñ\82Ñ\83Ñ\80аÑ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна Ð±Ñ\83 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ñ\83 Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80.\n* Ð\91Ñ\8dлиÑ\8d Ñ\81Ñ\83оÑ\85 Ð±Ñ\83оллаÒ\95Ñ\8bна - ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80бÑ\8dÑ\82\n* Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8d * ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80ин/кииÑ\80бÑ\8dÑ\82ин Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 ÐºÑ\8bаÒ\95Ñ\8bÒ¥ Ñ\81Ñ\83оÒ\95Ñ\83н ÐºÓ©Ñ\80дөÑ\80Ó©Ñ\80.",
+       "userrights-groups-help": "Ð\91Ñ\83 ÐºÐ¸Ò»Ð¸ ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80 Ð±Ó©Ð»Ó©Ñ\85Ñ\82Ó©Ñ\80үн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\85Ñ\8bн Ñ\81өп:\n* Ð\91өлөÑ\85 Ð°Ð°Ñ\82Ñ\8bн Ñ\82аһÑ\8bгаÑ\80 Ð±Ñ\8dлиÑ\8d Ñ\82Ñ\83Ñ\80аÑ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна Ð±Ñ\83 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð¾Ð» Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80.\n* Ð\91Ñ\8dлиÑ\8d Ñ\81Ñ\83оÑ\85 Ð±Ñ\83оллаÒ\95Ñ\8bна - ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð¾Ð» Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80бÑ\8dÑ\82\n* Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8d * ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80ин/кииÑ\80бÑ\8dÑ\82ин Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 ÐºÑ\8bаÒ\95Ñ\8bÒ¥ Ñ\81Ñ\83оÒ\95Ñ\83н ÐºÓ©Ñ\80дөÑ\80Ó©Ñ\80.\n* Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8d # ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80 Ð±Ð¾Ð»Ð´Ñ\8cоÒ\95Ñ\83н Ñ\85ойÑ\83Ñ\82аÑ\82аÑ\80 Ð±Ñ\8bÑ\80аапÑ\82ааÑ\85Ñ\85Ñ\8bн ÐºÓ©Ñ\80дөÑ\80Ó©Ñ\80, Ð¾Ð» Ñ\8dÑ\80Ñ\8dÑ\8dÑ\80и Ñ\8dÑ\80дÑ\8dлÑ\8dÑ\82Ñ\8dÑ\80 ÐºÑ\8bаÒ\95Ñ\8bÒ¥ Ñ\81Ñ\83оÑ\85.",
        "userrights-reason": "Төрүөтэ:",
        "userrights-no-interwiki": "Атын биикилэргэ кыттааччылар бырааптарын уларытар быраабыҥ суох.",
        "userrights-nodatabase": "$1 билэ тиһигэ (олоҕо, база данных) суох эбэтэр локальнай буолбатах.",
        "userrights-changeable-col": "Эн уларытар кыахтаах бөлөхтөрүҥ",
        "userrights-unchangeable-col": "Бу бөлөхтөрү уларытар кыаҕыҥ суох",
+       "userrights-expiry-current": "Болдьоҕо баччаҕа бүтэр: $1",
+       "userrights-expiry-none": "Хаһан да",
+       "userrights-expiry": "Болдьоҕо баччаҕа бүтэр:",
+       "userrights-expiry-existing": "Билиҥҥи болдьоҕо: $3, $2",
+       "userrights-expiry-othertime": "Атын болдьох:",
+       "userrights-expiry-options": "1 күн:1 күн,1 нэдиэлэ:1 нэдиэлэ,1 ый:1 ый,3 ый:3 ый,6 ый:6 ый,1 сыл:1 сыл",
+       "userrights-invalid-expiry": "«$1» бөлөх болдьоҕо алҕастаах ыйыллыбыт.",
+       "userrights-expiry-in-past": "«$1» бөлөх болдьоҕо ааспыт кэмҥэ ыйыллыбыт.",
        "userrights-conflict": "Кыттааччы быраабын быһаарарга алҕас таҕыста! Хатылаан көр.",
        "group": "Бөлөх:",
        "group-user": "Кыттааччылар",
index 776f634..aed37e7 100644 (file)
        "recentchanges-summary": "Пратите скорашње измене на овој страници.",
        "recentchanges-noresult": "Нема промена у задатом времену за задате критеријуме.",
        "recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.",
-       "recentchanges-label-newpage": "Ð\9dова страница",
+       "recentchanges-label-newpage": "Ð\9eвом Ð¸Ð·Ð¼ÐµÐ½Ð¾Ð¼ Ð½Ð°Ð¿Ñ\80авÑ\99ена Ñ\98е Ð½ова страница",
        "recentchanges-label-minor": "Ово је мања измена",
        "recentchanges-label-bot": "Ову измену је направио бот",
        "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
        "rawhtml-notallowed": "&lt;html&gt; тагови не могу да се користе ван нормалних страница.",
        "gotointerwiki": "Напуштам пројекат {{SITENAME}}",
        "gotointerwiki-invalid": "Одабрани наслов је невалидан.",
-       "gotointerwiki-external": "Управо ћете да напустите сајт {{SITENAME}} да бисте посетили пројекат [[$2]], који је засебан веб-сајт.\n\n'''[$1 Продужи на $1]'''",
+       "gotointerwiki-external": "Управо ћете да напустите пројекат {{SITENAME}} да бисте на засебном веб-сајту посетили [[$2]].\n\n'''[$1 Продужи на $1]'''",
        "undelete-cantedit": "Не можете повратити ову страницу јер немате дозволу да је уређујете.",
        "undelete-cantcreate": "Не можете повратити ову страницу јер нема постојеће странице са овим именом и немате дозволу да направите ову страницу."
 }
index 260130c..6e0f085 100644 (file)
        "recentchanges-summary": "Pratite skorašnje izmene na ovoj stranici.",
        "recentchanges-noresult": "Nema promena u zadatom vremenu za zadate kriterijume.",
        "recentchanges-feed-description": "Pratite skorašnje izmene uz pomoć ovog dovoda.",
-       "recentchanges-label-newpage": "Nova stranica",
+       "recentchanges-label-newpage": "Ovom izmenom napravljena je nova izmena",
        "recentchanges-label-minor": "Ovo je manja izmena",
        "recentchanges-label-bot": "Ovu izmenu je napravio bot",
        "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
        "authmanager-email-label": "Imejl",
        "authmanager-email-help": "Imejl adresa",
        "changecredentials": "Promjena akreditiva",
-       "removecredentials": "Uklanjanje akreditiva"
+       "removecredentials": "Uklanjanje akreditiva",
+       "gotointerwiki-external": "Upravo ćete da napustite projekat {{SITENAME}} da biste na zasebnom veb-sajtu posetili [[$2]].\n\n'''[$1 Produži na $1]'''"
 }
index 3bbf76d..9f9a8aa 100644 (file)
        "datedefault": "ไม่ตั้งค่า",
        "prefs-labs": "คุณสมบัติทดลอง",
        "prefs-user-pages": "หน้าผู้ใช้",
-       "prefs-personal": "à¹\82à¸\9eรà¹\84à¸\9fลà¹\8cผู้ใช้",
+       "prefs-personal": "à¸\82à¹\89อมูลผู้ใช้",
        "prefs-rc": "ปรับปรุงล่าสุด",
        "prefs-watchlist": "รายการเฝ้าดู",
        "prefs-editwatchlist": "แก้ไขรายการเฝ้าดู",
index c026bda..2ea966a 100644 (file)
        "recentchanges-label-plusminus": "Nagbago ang laki ng pahina sa ganitong bilang ng mga byte",
        "recentchanges-legend-heading": "<strong>Gabay:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (tingnan din [[Special:NewPages|ang talaan ng mga bagong pahina]])",
+       "rcfilters-quickfilters": "Mga mabilisang kawing",
+       "rcfilters-savedqueries-rename": "Pangalanang muli",
+       "rcfilters-savedqueries-remove": "Alisin",
+       "rcfilters-savedqueries-new-name-label": "Pangalan",
+       "rcfilters-savedqueries-cancel-label": "Balewalain",
        "rcfilters-restore-default-filters": "Ibalik ang mga napagkaukulang 'filters'",
        "rcfilters-clear-all-filters": "Burahin lahat ng mga 'filters'",
        "rcfilters-empty-filter": "Walang aktibong panangga. Lahat ay ipinamalas.",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
-       "randomrootpage": "Alin mang pinag-ugatang/pinagmulang pahina"
+       "date-range-from": "Mula sa petsang:",
+       "randomrootpage": "Alin mang pinag-ugatang/pinagmulang pahina",
+       "gotointerwiki-invalid": "Di-wasto ang tinukoy na pamagat."
 }
index 33020c4..7694902 100644 (file)
        "currentrevisionlink": "Алиез версия",
        "cur": "али",
        "last": "азьв.",
-       "history-fieldset-title": "Ð\98Ñ\81Ñ\82оÑ\80иез Ð²Ð¾Ñ\88Ñ\82Ó¥Ñ\81Ñ\8cкон Ð¿Ð¾Ð½Ð½Ð°",
-       "history-show-deleted": "Ӵотаны ӵушылэмъёссэ гинэ",
+       "history-fieldset-title": "ТÑ\83паÑ\82онÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ñ\83Ñ\82Ñ\87анÑ\8b",
+       "history-show-deleted": "Ӵушылэм тупатонъёссэ гинэ",
        "rev-delundel": "возьматыны/ватыны",
        "rev-showdeleted": "возьматоно",
        "revdelete-show-file-submit": "Бен",
        "prefs-editing": "Тупатон",
        "yourlanguage": "Интерфейслэн кылыз:",
        "prefs-preview": "Бамез эскерон",
-       "userrights": "Ð\9fÑ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cлÑ\8dн Ð¿Ñ\80авооÑ\81Ñ\8bныз",
+       "userrights": "Ð\92икиавÑ\82оÑ\80лÑ\8dн Ð¿Ñ\80авооÑ\81ыз",
        "editusergroup": "Викиавторлэсь группаоссэ возьматыны",
        "group-autoconfirmed": "Авто-юнматэм викиавторъёс",
        "group-bot": "Ботъёс",
index 0010504..8acea02 100644 (file)
@@ -68,7 +68,8 @@
                        "Visem",
                        "MMH",
                        "Олександр",
-                       "Similartothissimilartothat"
+                       "Similartothissimilartothat",
+                       "Bunyk"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "pageid": "ID сторінки $1",
        "rawhtml-notallowed": "Теги &lt;html&gt; не можна використовувати за межами звичайних сторінок.",
        "gotointerwiki": "Ви покидаєте сайт {{SITENAME}}",
-       "gotointerwiki-invalid": "Ð\92казана Ð½Ð°Ð·Ð²Ð° Ð±Ñ\83ла Ð½ÐµÐ¿Ñ\80ипÑ\83Ñ\81Ñ\82имоÑ\8e.",
+       "gotointerwiki-invalid": "Ð\92казана Ð½Ð°Ð·Ð²Ð° Ð½ÐµÐ¿Ñ\80ипÑ\83Ñ\81Ñ\82има.",
        "gotointerwiki-external": "Ви збираєтесь покинути сайт {{SITENAME}}, щоб відвідати проект [[$2]], який є окремим веб-сайтом.\n\n[$1 Клацніть тут, щоб продовжити, перейшовши до $1].",
        "undelete-cantedit": "Ви не можете відновити цю сторінку, оскільки Ви не маєте прав на редагування цієї сторінки.",
        "undelete-cantcreate": "Ви не можете відновити цю сторінку, оскільки сторінка з такою назвою не існує, і Ви не маєте прав на створення цієї сторінки."
index b3866c1..d396703 100644 (file)
@@ -309,7 +309,9 @@ class ImportImages extends Maintenance {
                                        if ( $handler ) {
                                                $metadata = MediaWiki\quietCall( 'unserialize', $props['metadata'] );
 
-                                               $publishOptions['headers'] = $handler->getContentHeaders( $metadata );
+                                               $publishOptions['headers'] = $handler->getContentHeaders(
+                                                       $metadata, $props['width'], $props['height']
+                                               );
                                        } else {
                                                $publishOptions['headers'] = [];
                                        }
index b9b418c..e252256 100644 (file)
@@ -48,11 +48,14 @@ class RefreshFileHeaders extends Maintenance {
 
                $count = 0;
                $dbr = $this->getDB( DB_REPLICA );
+
                do {
                        $conds = [ "img_name > {$dbr->addQuotes( $start )}" ];
+
                        if ( strlen( $end ) ) {
                                $conds[] = "img_name <= {$dbr->addQuotes( $end )}";
                        }
+
                        $res = $dbr->select( 'image', '*', $conds,
                                __METHOD__, [ 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'img_name ASC' ] );
 
@@ -62,34 +65,48 @@ class RefreshFileHeaders extends Maintenance {
                                $res->rewind();
                        }
 
+                       $backendOperations = [];
+
                        foreach ( $res as $row ) {
                                $file = $repo->newFileFromRow( $row );
                                $headers = $file->getContentHeaders();
+
                                if ( count( $headers ) ) {
-                                       $this->updateFileHeaders( $file, $headers );
+                                       $backendOperations[] = [
+                                               'op' => 'describe', 'src' => $file->getPath(), 'headers' => $headers
+                                       ];
                                }
+
                                // Do all of the older file versions...
                                foreach ( $file->getHistory() as $oldFile ) {
                                        $headers = $oldFile->getContentHeaders();
                                        if ( count( $headers ) ) {
-                                               $this->updateFileHeaders( $oldFile, $headers );
+                                               $backendOperations[] = [
+                                                       'op' => 'describe', 'src' => $oldFile->getPath(), 'headers' => $headers
+                                               ];
                                        }
                                }
+
                                if ( $this->hasOption( 'verbose' ) ) {
-                                       $this->output( "Updated headers for file '{$row->img_name}'.\n" );
+                                       $this->output( "Queued headers update for file '{$row->img_name}'.\n" );
                                }
-                               ++$count;
+
                                $start = $row->img_name; // advance
                        }
+
+                       $backendOperationsCount = count( $backendOperations );
+                       $count += $backendOperationsCount;
+
+                       $this->output( "Updating headers for {$backendOperationsCount} file(s).\n" );
+                       $this->updateFileHeaders( $repo, $backendOperations );
                } while ( $res->numRows() === $this->mBatchSize );
 
                $this->output( "Done. Updated headers for $count file(s).\n" );
        }
 
-       protected function updateFileHeaders( File $file, array $headers ) {
-               $status = $file->getRepo()->getBackend()->describe( [
-                       'src' => $file->getPath(), 'headers' => $headers
-               ] );
+       protected function updateFileHeaders( $repo, $backendOperations ) {
+               $status = $repo->getBackend()->doQuickOperations( $backendOperations );
+
                if ( !$status->isGood() ) {
                        $this->error( "Encountered error: " . print_r( $status, true ) );
                }
index 143e46c..53c1fbb 100644 (file)
                                preview: true,
                                sectionpreview: section !== '',
                                disableeditsection: true,
+                               useskin: mw.config.get( 'skin' ),
                                uselang: mw.config.get( 'wgUserLanguage' )
                        } );
                        if ( section === 'new' ) {
index 9655fa4..49cfd8a 100644 (file)
@@ -1,7 +1,5 @@
 ( function ( mw, $ ) {
 
-       mw.page = {};
-
        $( function () {
                var $diff;
 
index 7d35cb7..6f52cbf 100644 (file)
        }
 
        // Expose public methods
-       mw.page.watch = {
-               updateWatchLink: updateWatchLink
+       mw.page = {
+               watch: {
+                       updateWatchLink: updateWatchLink
+               }
        };
 
        $( function () {
index 54a8c61..69fee30 100644 (file)
@@ -2311,7 +2311,7 @@ Entities inside <pre>
 <pre>Foo &#8594;bar</pre>
 
 !! html/parsoid
-<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:pre","function":"#tag"},"params":{"1":{"wt":"Foo &lt;nowiki>&amp;rarr;bar&lt;/nowiki>"}},"i":0}}]}'>Foo <span typeof="mw:Entity">→</span>bar</pre>
+<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:pre","function":"tag"},"params":{"1":{"wt":"Foo &lt;nowiki>&amp;rarr;bar&lt;/nowiki>"}},"i":0}}]}'>Foo <span typeof="mw:Entity">→</span>bar</pre>
 !! end
 
 ## Don't expect this to rt, Parsoid drops the unmatched closing pre tags that
@@ -5331,6 +5331,21 @@ parsoid=wt2html
 <p>{{echo|[[Foo}}</p>
 !! end
 
+!! test
+Wikilinks with embedded newlines are not broken
+!! wikitext
+{{echo|[[ Foo
+B
+C]]}}
+!! html/php
+<p>[[ Foo
+B
+C]]
+</p>
+!! html/parsoid
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[ Foo\nB\nC]]"}},"i":0}}]}'>[[ Foo B C]]</p>
+!! end
+
 !! test
 Broken templates
 !! options
@@ -11218,7 +11233,7 @@ Don't abort table cell attribute parsing if wikilink is found in template arg
 |}
 !! html/parsoid
 <table>
-<tbody><tr><td> Test <ref about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:ref","function":"#tag"},"params":{"1":{"wt":"One two \"[[three]]\" four"}},"i":0}}]}'>One two "<a rel="mw:WikiLink" href="./Three" title="Three">three</a>" four</ref></td></tr>
+<tbody><tr><td> Test <ref about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:ref","function":"tag"},"params":{"1":{"wt":"One two \"[[three]]\" four"}},"i":0}}]}'>One two "<a rel="mw:WikiLink" href="./Three" title="Three">three</a>" four</ref></td></tr>
 </tbody></table>
 !! end
 
@@ -19529,9 +19544,8 @@ Special:Search page linking.
 | is not a magic word here but | is still a magic word here
 </p>
 !! html/parsoid
-<p><span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is a magic word there and <span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is still a magic word here
-| is not a magic word here but <span about="#mwt3" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is still a magic word here</p>
-
+<p><span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","function":"!"},"params":{},"i":0}}]}'>|</span> is a magic word there and <span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","function":"!"},"params":{},"i":0}}]}'>|</span> is still a magic word here
+| is not a magic word here but <span about="#mwt3" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","function":"!"},"params":{},"i":0}}]}'>|</span> is still a magic word here</p>
 !! end
 
 !! test
@@ -25802,7 +25816,7 @@ Properly encapsulate empty-content transclusions in fosterable positions
 }}
 </table>
 !! html/parsoid
-<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["&lt;table>\n",{"template":{"target":{"wt":"#if:","function":"#if"},"params":{"1":{"wt":"\n&lt;td>foo&lt;/td>\n"}},"i":0}},"\n&lt;/table>"]}' data-parsoid='{"stx":"html","pi":[[{"k":"1"}]]}'>
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["&lt;table>\n",{"template":{"target":{"wt":"#if:","function":"if"},"params":{"1":{"wt":"\n&lt;td>foo&lt;/td>\n"}},"i":0}},"\n&lt;/table>"]}' data-parsoid='{"stx":"html","pi":[[{"k":"1"}]]}'>
 
 </table>
 !! end
index f826235..a70c005 100644 (file)
@@ -142,8 +142,6 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                                'SerialNumber' => '123456789',
                                '_MW_PNG_VERSION' => 1,
                        ],
-                       'width' => 50,
-                       'height' => 50,
                ];
                $this->assertEquals( $expected, $result );
        }
index 28fe604..876e461 100644 (file)
@@ -29,8 +29,6 @@ class ExifTest extends MediaWikiTestCase {
                        'GPSAltitude' => -3.141592653,
                        'GPSDOP' => '5/1',
                        'GPSVersionID' => '2.2.0.0',
-                       'Height' => 10,
-                       'Width' => 40,
                ];
                $this->assertEquals( $expected, $data, '', 0.0000000001 );
        }
@@ -43,8 +41,6 @@ class ExifTest extends MediaWikiTestCase {
 
                $expected = [
                        'UserComment' => 'test⁔comment',
-                       'Height' => 10,
-                       'Width' => 40,
                ];
                $this->assertEquals( $expected, $data );
        }
index d3174fe..1044e52 100644 (file)
@@ -83,8 +83,6 @@ EOF;
                                        'frameCount' => 1,
                                        'looped' => false,
                                        'xmp' => '',
-                                       'width' => 45,
-                                       'height' => 30,
                                ]
                        ],
                        [
@@ -95,8 +93,6 @@ EOF;
                                        'frameCount' => 4,
                                        'looped' => true,
                                        'xmp' => '',
-                                       'width' => 45,
-                                       'height' => 30,
                                ]
                        ],
 
@@ -108,8 +104,6 @@ EOF;
                                        'frameCount' => 4,
                                        'looped' => true,
                                        'comment' => [ 'GIƒ·test·file' ],
-                                       'width' => 45,
-                                       'height' => 30,
                                ]
                        ],
                ];
index 00edfd0..aaa3ac4 100644 (file)
@@ -79,7 +79,7 @@ class GIFHandlerTest extends MediaWikiMediaTestCase {
                        [ 'Something invalid!', GIFHandler::METADATA_BAD ],
                        // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        [
-                               'a:6:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}s:5:"width";i:45;s:6:"height";i:30;}',
+                               'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}',
                                GIFHandler::METADATA_GOOD
                        ],
                        // @codingStandardsIgnoreEnd
@@ -103,11 +103,11 @@ class GIFHandlerTest extends MediaWikiMediaTestCase {
                        // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        [
                                'nonanimated.gif',
-                               'a:6:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}s:5:"width";i:45;s:6:"height";i:30;}'
+                               'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}'
                        ],
                        [
                                'animated-xmp.gif',
-                               'a:6:{s:10:"frameCount";i:4;s:6:"looped";b:1;s:8:"duration";d:2.399999999999999911182158029987476766109466552734375;s:8:"metadata";a:5:{s:6:"Artist";s:7:"Bawolff";s:16:"ImageDescription";a:2:{s:9:"x-default";s:18:"A file to test GIF";s:5:"_type";s:4:"lang";}s:15:"SublocationDest";s:13:"The interwebs";s:14:"GIFFileComment";a:1:{i:0;s:16:"GIƒ·test·file";}s:15:"_MW_GIF_VERSION";i:1;}s:5:"width";i:45;s:6:"height";i:30;}'
+                               'a:4:{s:10:"frameCount";i:4;s:6:"looped";b:1;s:8:"duration";d:2.399999999999999911182158029987476766109466552734375;s:8:"metadata";a:5:{s:6:"Artist";s:7:"Bawolff";s:16:"ImageDescription";a:2:{s:9:"x-default";s:18:"A file to test GIF";s:5:"_type";s:4:"lang";}s:15:"SublocationDest";s:13:"The interwebs";s:14:"GIFFileComment";a:1:{i:0;s:16:"GIƒ·test·file";}s:15:"_MW_GIF_VERSION";i:1;}}'
                        ],
                        // @codingStandardsIgnoreEnd
                ];
index 35d6072..abe0280 100644 (file)
@@ -25,7 +25,7 @@ class JpegTest extends MediaWikiMediaTestCase {
                $file = $this->dataFile( 'test.jpg', 'image/jpeg' );
                $res = $this->handler->getMetadata( $file, $this->filePath . 'test.jpg' );
                // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
-               $expected = 'a:9:{s:16:"ImageDescription";s:9:"Test file";s:11:"XResolution";s:4:"72/1";s:11:"YResolution";s:4:"72/1";s:14:"ResolutionUnit";i:2;s:16:"YCbCrPositioning";i:1;s:15:"JPEGFileComment";a:1:{i:0;s:17:"Created with GIMP";}s:22:"MEDIAWIKI_EXIF_VERSION";i:2;s:5:"Width";i:20;s:6:"Height";i:20;}';
+               $expected = 'a:7:{s:16:"ImageDescription";s:9:"Test file";s:11:"XResolution";s:4:"72/1";s:11:"YResolution";s:4:"72/1";s:14:"ResolutionUnit";i:2;s:16:"YCbCrPositioning";i:1;s:15:"JPEGFileComment";a:1:{i:0;s:17:"Created with GIMP";}s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
                // @codingStandardsIgnoreEnd
 
                // Unserialize in case serialization format ever changes.
@@ -39,8 +39,6 @@ class JpegTest extends MediaWikiMediaTestCase {
                $file = $this->dataFile( 'test.jpg', 'image/jpeg' );
                $res = $this->handler->getCommonMetaArray( $file );
                $expected = [
-                       'Height' => 20,
-                       'Width' => 20,
                        'ImageDescription' => 'Test file',
                        'XResolution' => '72/1',
                        'YResolution' => '72/1',
index 0541b47..32d54df 100644 (file)
@@ -80,7 +80,7 @@ class PNGHandlerTest extends MediaWikiMediaTestCase {
                        [ 'Something invalid!', PNGHandler::METADATA_BAD ],
                        // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        [
-                               'a:8:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:5:"width";i:50;s:6:"height";i:50;s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}',
+                               'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}',
                                PNGHandler::METADATA_GOOD
                        ],
                        // @codingStandardsIgnoreEnd
@@ -105,11 +105,11 @@ class PNGHandlerTest extends MediaWikiMediaTestCase {
                        // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        [
                                'rgb-na-png.png',
-                               'a:8:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:5:"width";i:50;s:6:"height";i:50;s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}'
+                               'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}'
                        ],
                        [
                                'xmp.png',
-                               'a:8:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:1;s:9:"colorType";s:14:"index-coloured";s:5:"width";i:50;s:6:"height";i:50;s:8:"metadata";a:2:{s:12:"SerialNumber";s:9:"123456789";s:15:"_MW_PNG_VERSION";i:1;}}'
+                               'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:1;s:9:"colorType";s:14:"index-coloured";s:8:"metadata";a:2:{s:12:"SerialNumber";s:9:"123456789";s:15:"_MW_PNG_VERSION";i:1;}}'
                        ],
                        // @codingStandardsIgnoreEnd
                ];
index 32af131..d114820 100644 (file)
@@ -35,7 +35,7 @@ class TiffTest extends MediaWikiTestCase {
                $res = $this->handler->getMetadata( null, $this->filePath . 'test.tiff' );
 
                // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
-               $expected = 'a:18:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;s:5:"Width";i:20;s:6:"Height";i:20;}';
+               $expected = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
                // @codingStandardsIgnoreEnd
 
                // Re-unserialize in case there are subtle differences between how versions
index 081ca90..b75335d 100644 (file)
@@ -70,13 +70,13 @@ class XCFHandlerTest extends MediaWikiMediaTestCase {
        public static function provideGetMetadata() {
                return [
                        [ '80x60-2layers.xcf',
-                               'a:3:{s:9:"colorType";s:16:"truecolour-alpha";s:5:"width";i:80;s:6:"height";i:60;}'
+                               'a:1:{s:9:"colorType";s:16:"truecolour-alpha";}'
                        ],
                        [ '80x60-RGB.xcf',
-                               'a:3:{s:9:"colorType";s:16:"truecolour-alpha";s:5:"width";i:80;s:6:"height";i:60;}'
+                               'a:1:{s:9:"colorType";s:16:"truecolour-alpha";}'
                        ],
                        [ '80x60-Greyscale.xcf',
-                               'a:3:{s:9:"colorType";s:15:"greyscale-alpha";s:5:"width";i:80;s:6:"height";i:60;}'
+                               'a:1:{s:9:"colorType";s:15:"greyscale-alpha";}'
                        ],
                ];
        }
index 63ed93e..fbbcee5 100644 (file)
@@ -28,6 +28,11 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                $this->insertPage( 'Example Foo' );
                $this->insertPage( 'Example Foo/Bar' );
                $this->insertPage( 'Example/Baz' );
+               $this->insertPage( 'Sample' );
+               $this->insertPage( 'Sample Ban' );
+               $this->insertPage( 'Sample Eat' );
+               $this->insertPage( 'Sample Who' );
+               $this->insertPage( 'Sample Zoo' );
                $this->insertPage( 'Redirect test', '#REDIRECT [[Redirect Test]]' );
                $this->insertPage( 'Redirect Test' );
                $this->insertPage( 'Redirect Test Worse Result' );
@@ -96,15 +101,15 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                        ] ],
                        [ [
                                'Main namespace with title prefix',
-                               'query' => 'Ex',
+                               'query' => 'Sa',
                                'results' => [
-                                       'Example',
-                                       'Example/Baz',
-                                       'Example Bar',
+                                       'Sample',
+                                       'Sample Ban',
+                                       'Sample Eat',
                                ],
                                // Third result when testing offset
                                'offsetresult' => [
-                                       'Example Foo',
+                                       'Sample Who',
                                ],
                        ] ],
                        [ [
@@ -183,6 +188,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                $results = array_map( function( Title $t ) {
                        return $t->getPrefixedText();
                }, $results );
+
                $this->assertEquals(
                        $case['results'],
                        $results,
index 0d345db..e0d1c30 100644 (file)
@@ -330,7 +330,9 @@ class SessionBackendTest extends MediaWikiTestCase {
                $backend->unpersist();
                $this->assertFalse( $backend->isPersistent() );
                $this->assertFalse( $this->store->getSession( self::SESSIONID ) );
-               $this->assertNotFalse( $wrap->store->get( wfMemcKey( 'MWSession', self::SESSIONID ) ) );
+               $this->assertNotFalse(
+                       $wrap->store->get( $wrap->store->makeKey( 'MWSession', self::SESSIONID ) )
+               );
        }
 
        public function testRememberUser() {
index 759eca6..fd02a2e 100644 (file)
@@ -61,7 +61,7 @@ class TestBagOStuff extends \CachedBagOStuff {
                        $expiry = \RequestContext::getMain()->getConfig()->get( 'ObjectCacheSessionExpiry' );
                }
 
-               $this->set( wfMemcKey( 'MWSession', $id ), $blob, $expiry );
+               $this->set( $this->makeKey( 'MWSession', $id ), $blob, $expiry );
        }
 
        /**
@@ -69,7 +69,7 @@ class TestBagOStuff extends \CachedBagOStuff {
         * @return mixed
         */
        public function getSession( $id ) {
-               return $this->get( wfMemcKey( 'MWSession', $id ) );
+               return $this->get( $this->makeKey( 'MWSession', $id ) );
        }
 
        /**
@@ -77,14 +77,14 @@ class TestBagOStuff extends \CachedBagOStuff {
         * @return mixed
         */
        public function getSessionFromBackend( $id ) {
-               return $this->backend->get( wfMemcKey( 'MWSession', $id ) );
+               return $this->backend->get( $this->makeKey( 'MWSession', $id ) );
        }
 
        /**
         * @param string $id Session ID
         */
        public function deleteSession( $id ) {
-               $this->delete( wfMemcKey( 'MWSession', $id ) );
+               $this->delete( $this->makeKey( 'MWSession', $id ) );
        }
 
 }